summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2024-01-21 20:26:52 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2024-01-21 20:26:52 +0900
commit3ff229af6f843aaddb253fe0bd3152044f65b0d8 (patch)
treec6baa2597cf446bf1f7105908525f537b5022aa8 /packages
parentenhance(frontend): 季節に応じた画面の演出を南半球に対応さ... (diff)
downloadsharkey-3ff229af6f843aaddb253fe0bd3152044f65b0d8.tar.gz
sharkey-3ff229af6f843aaddb253fe0bd3152044f65b0d8.tar.bz2
sharkey-3ff229af6f843aaddb253fe0bd3152044f65b0d8.zip
enhance(frontend): リファクタリングなど
Diffstat (limited to 'packages')
-rw-r--r--packages/frontend/src/components/MkLaunchPad.vue2
-rw-r--r--packages/frontend/src/components/MkMenu.vue2
-rw-r--r--packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts6
-rw-r--r--packages/frontend/src/pages/reversi/game.board.vue2
-rw-r--r--packages/frontend/src/pages/reversi/index.vue41
-rw-r--r--packages/frontend/src/style.scss8
-rw-r--r--packages/frontend/src/ui/_common_/navbar-for-mobile.vue2
-rw-r--r--packages/frontend/src/ui/_common_/navbar.vue4
-rw-r--r--packages/frontend/src/ui/classic.header.vue2
-rw-r--r--packages/frontend/src/ui/classic.sidebar.vue2
-rw-r--r--packages/frontend/src/ui/deck.vue2
-rw-r--r--packages/frontend/src/ui/universal.vue2
12 files changed, 52 insertions, 23 deletions
diff --git a/packages/frontend/src/components/MkLaunchPad.vue b/packages/frontend/src/components/MkLaunchPad.vue
index 120ed7a86c..6980192d01 100644
--- a/packages/frontend/src/components/MkLaunchPad.vue
+++ b/packages/frontend/src/components/MkLaunchPad.vue
@@ -138,7 +138,7 @@ function close() {
left: 32px;
color: var(--indicator);
font-size: 8px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
@media (max-width: 500px) {
top: 16px;
diff --git a/packages/frontend/src/components/MkMenu.vue b/packages/frontend/src/components/MkMenu.vue
index 3026d4f015..17ace227ff 100644
--- a/packages/frontend/src/components/MkMenu.vue
+++ b/packages/frontend/src/components/MkMenu.vue
@@ -450,7 +450,7 @@ onBeforeUnmount(() => {
align-items: center;
color: var(--indicator);
font-size: 12px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
}
.divider {
diff --git a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
index 9eab855004..b234144c13 100644
--- a/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
+++ b/packages/frontend/src/components/global/MkMisskeyFlavoredMarkdown.ts
@@ -62,12 +62,12 @@ export default function(props: MfmProps, context: SetupContext<MfmEvents>) {
if (t == null) return null;
return t.match(/^[0-9.]+s$/) ? t : null;
};
-
+
const validColor = (c: string | null | undefined): string | null => {
if (c == null) return null;
return c.match(/^[0-9a-f]{3,6}$/i) ? c : null;
};
-
+
const useAnim = defaultStore.state.advancedMfm && defaultStore.state.animatedMfm;
/**
@@ -118,7 +118,7 @@ export default function(props: MfmProps, context: SetupContext<MfmEvents>) {
case 'tada': {
const speed = validTime(token.props.args.speed) ?? '1s';
const delay = validTime(token.props.args.delay) ?? '0s';
- style = 'font-size: 150%;' + (useAnim ? `animation: tada ${speed} linear infinite both; animation-delay: ${delay};` : '');
+ style = 'font-size: 150%;' + (useAnim ? `animation: global-tada ${speed} linear infinite both; animation-delay: ${delay};` : '');
break;
}
case 'jelly': {
diff --git a/packages/frontend/src/pages/reversi/game.board.vue b/packages/frontend/src/pages/reversi/game.board.vue
index 6ad779c605..4d4450ed7d 100644
--- a/packages/frontend/src/pages/reversi/game.board.vue
+++ b/packages/frontend/src/pages/reversi/game.board.vue
@@ -23,7 +23,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<Mfm :key="'past-turn-of:' + turnUser.id" :text="i18n.tsx._reversi.pastTurnOf({ name: turnUser.name ?? turnUser.username })" :plain="true" :customEmojis="turnUser.emojis"/>
</div>
<div v-if="iAmPlayer && !game.isEnded && !isMyTurn">{{ i18n.ts._reversi.opponentTurn }}<MkEllipsis/><span style="margin-left: 1em; opacity: 0.7;">({{ i18n.tsx.remainingN({ n: opTurnTimerRmain }) }})</span></div>
- <div v-if="iAmPlayer && !game.isEnded && isMyTurn"><span style="display: inline-block; font-weight: bold; animation: tada 1s linear infinite both;">{{ i18n.ts._reversi.myTurn }}</span><span style="margin-left: 1em; opacity: 0.7;">({{ i18n.tsx.remainingN({ n: myTurnTimerRmain }) }})</span></div>
+ <div v-if="iAmPlayer && !game.isEnded && isMyTurn"><span style="display: inline-block; font-weight: bold; animation: global-tada 1s linear infinite both;">{{ i18n.ts._reversi.myTurn }}</span><span style="margin-left: 1em; opacity: 0.7;">({{ i18n.tsx.remainingN({ n: myTurnTimerRmain }) }})</span></div>
<div v-if="game.isEnded && logPos == game.logs.length">
<template v-if="game.winner">
<Mfm :key="'won'" :text="i18n.tsx._reversi.won({ name: game.winner.name ?? game.winner.username })" :plain="true" :customEmojis="game.winner.emojis"/>
diff --git a/packages/frontend/src/pages/reversi/index.vue b/packages/frontend/src/pages/reversi/index.vue
index 796e732208..523418c99b 100644
--- a/packages/frontend/src/pages/reversi/index.vue
+++ b/packages/frontend/src/pages/reversi/index.vue
@@ -34,12 +34,19 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkPagination :pagination="myGamesPagination" :disableAutoLoad="true">
<template #default="{ items }">
<div :class="$style.gamePreviews">
- <MkA v-for="g in items" :key="g.id" v-panel :class="$style.gamePreview" tabindex="-1" :to="`/reversi/g/${g.id}`">
+ <MkA v-for="g in items" :key="g.id" v-panel :class="[$style.gamePreview, !g.isEnded && $style.gamePreviewActive]" tabindex="-1" :to="`/reversi/g/${g.id}`">
<div :class="$style.gamePreviewPlayers">
- <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user1"/> vs <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user2"/>
+ <span v-if="g.winnerId === g.user1Id" style="margin-right: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
+ <span v-if="g.winnerId === g.user2Id" style="margin-right: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
+ <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user1"/>
+ <span style="margin: 0 1em;">vs</span>
+ <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user2"/>
+ <span v-if="g.winnerId === g.user1Id" style="margin-left: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
+ <span v-if="g.winnerId === g.user2Id" style="margin-left: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
</div>
<div :class="$style.gamePreviewFooter">
- <span :style="!g.isEnded ? 'color: var(--accent);' : ''">{{ g.isEnded ? i18n.ts._reversi.ended : i18n.ts._reversi.playing }}</span>
+ <span v-if="!g.isEnded" :class="$style.gamePreviewStatusActive">{{ i18n.ts._reversi.playing }}</span>
+ <span v-else>{{ i18n.ts._reversi.ended }}</span>
<MkTime style="margin-left: auto; opacity: 0.7;" :time="g.createdAt"/>
</div>
</MkA>
@@ -53,12 +60,19 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkPagination :pagination="gamesPagination" :disableAutoLoad="true">
<template #default="{ items }">
<div :class="$style.gamePreviews">
- <MkA v-for="g in items" :key="g.id" v-panel :class="$style.gamePreview" tabindex="-1" :to="`/reversi/g/${g.id}`">
+ <MkA v-for="g in items" :key="g.id" v-panel :class="[$style.gamePreview, !g.isEnded && $style.gamePreviewActive]" tabindex="-1" :to="`/reversi/g/${g.id}`">
<div :class="$style.gamePreviewPlayers">
- <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user1"/> vs <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user2"/>
+ <span v-if="g.winnerId === g.user1Id" style="margin-right: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
+ <span v-if="g.winnerId === g.user2Id" style="margin-right: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
+ <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user1"/>
+ <span style="margin: 0 1em;">vs</span>
+ <MkAvatar :class="$style.gamePreviewPlayersAvatar" :user="g.user2"/>
+ <span v-if="g.winnerId === g.user1Id" style="margin-left: 0.75em; visibility: hidden;"><i class="ti ti-x"></i></span>
+ <span v-if="g.winnerId === g.user2Id" style="margin-left: 0.75em; color: var(--accent); font-weight: bold;"><i class="ti ti-trophy"></i></span>
</div>
<div :class="$style.gamePreviewFooter">
- <span :style="!g.isEnded ? 'color: var(--accent);' : ''">{{ g.isEnded ? i18n.ts._reversi.ended : i18n.ts._reversi.playing }}</span>
+ <span v-if="!g.isEnded" :class="$style.gamePreviewStatusActive">{{ i18n.ts._reversi.playing }}</span>
+ <span v-else>{{ i18n.ts._reversi.ended }}</span>
<MkTime style="margin-left: auto; opacity: 0.7;" :time="g.createdAt"/>
</div>
</MkA>
@@ -229,6 +243,11 @@ definePageMetadata(computed(() => ({
</script>
<style lang="scss" module>
+@keyframes blink {
+ 0% { opacity: 1; }
+ 50% { opacity: 0.2; }
+}
+
.invitation {
display: flex;
box-sizing: border-box;
@@ -250,6 +269,10 @@ definePageMetadata(computed(() => ({
overflow: clip;
}
+.gamePreviewActive {
+ box-shadow: inset 0 0 8px 0px var(--accent);
+}
+
.gamePreviewPlayers {
text-align: center;
padding: 16px;
@@ -277,6 +300,12 @@ definePageMetadata(computed(() => ({
font-size: 0.9em;
}
+.gamePreviewStatusActive {
+ color: var(--accent);
+ font-weight: bold;
+ animation: blink 2s infinite;
+}
+
.waitingScreen {
text-align: center;
}
diff --git a/packages/frontend/src/style.scss b/packages/frontend/src/style.scss
index 274808b13f..d6ed239b17 100644
--- a/packages/frontend/src/style.scss
+++ b/packages/frontend/src/style.scss
@@ -425,13 +425,13 @@ rt {
transform: scale(0.9);
}
-@keyframes blink {
+@keyframes global-blink {
0% { opacity: 1; transform: scale(1); }
30% { opacity: 1; transform: scale(1); }
90% { opacity: 0; transform: scale(0.5); }
}
-@keyframes tada {
+@keyframes global-tada {
from {
transform: scale3d(1, 1, 1);
}
@@ -461,7 +461,7 @@ rt {
._anime_bounce {
will-change: transform;
- animation: bounce ease 0.7s;
+ animation: global-bounce ease 0.7s;
animation-iteration-count: 1;
transform-origin: 50% 50%;
}
@@ -473,7 +473,7 @@ rt {
transition: transform 0.1s ease;
}
-@keyframes bounce {
+@keyframes global-bounce {
0% {
transform: scaleX(0.90) scaleY(0.90) ;
}
diff --git a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
index 7aee7bbc32..92480fa404 100644
--- a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
+++ b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
@@ -254,7 +254,7 @@ function more() {
left: 20px;
color: var(--navIndicator);
font-size: 8px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
&:has(.itemIndicateValueIcon) {
animation: none;
diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue
index 93d09e95b5..a2683b4fb1 100644
--- a/packages/frontend/src/ui/_common_/navbar.vue
+++ b/packages/frontend/src/ui/_common_/navbar.vue
@@ -313,7 +313,7 @@ function more(ev: MouseEvent) {
left: 20px;
color: var(--navIndicator);
font-size: 8px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
&:has(.itemIndicateValueIcon) {
animation: none;
@@ -483,7 +483,7 @@ function more(ev: MouseEvent) {
left: 24px;
color: var(--navIndicator);
font-size: 8px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
&:has(.itemIndicateValueIcon) {
animation: none;
diff --git a/packages/frontend/src/ui/classic.header.vue b/packages/frontend/src/ui/classic.header.vue
index 2060838f5d..d4a30520eb 100644
--- a/packages/frontend/src/ui/classic.header.vue
+++ b/packages/frontend/src/ui/classic.header.vue
@@ -141,7 +141,7 @@ onMounted(() => {
left: 0;
color: var(--navIndicator);
font-size: 8px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
}
&:hover {
diff --git a/packages/frontend/src/ui/classic.sidebar.vue b/packages/frontend/src/ui/classic.sidebar.vue
index bc1527813c..d4e8d7cff9 100644
--- a/packages/frontend/src/ui/classic.sidebar.vue
+++ b/packages/frontend/src/ui/classic.sidebar.vue
@@ -220,7 +220,7 @@ watch(defaultStore.reactiveState.menuDisplay, () => {
left: 0;
color: var(--navIndicator);
font-size: 8px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
&:has(.itemIndicateValueIcon) {
animation: none;
diff --git a/packages/frontend/src/ui/deck.vue b/packages/frontend/src/ui/deck.vue
index f58756b284..089a01f19a 100644
--- a/packages/frontend/src/ui/deck.vue
+++ b/packages/frontend/src/ui/deck.vue
@@ -488,7 +488,7 @@ body {
left: 0;
color: var(--indicator);
font-size: 16px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
&:has(.itemIndicateValueIcon) {
animation: none;
diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue
index 6f13f3fe87..35e218c0b4 100644
--- a/packages/frontend/src/ui/universal.vue
+++ b/packages/frontend/src/ui/universal.vue
@@ -448,7 +448,7 @@ $widgets-hide-threshold: 1090px;
left: 0;
color: var(--indicator);
font-size: 16px;
- animation: blink 1s infinite;
+ animation: global-blink 1s infinite;
&:has(.itemIndicateValueIcon) {
animation: none;