summaryrefslogtreecommitdiff
path: root/packages/frontend
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-04-08 08:18:48 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-04-08 08:18:48 +0900
commitf765b374c7b2681ba198f609401dbd9c44bb738c (patch)
treed7892e8ec4bdc37d561da66fa48d302171e0b738 /packages/frontend
parentMerge branch 'develop' of https://github.com/misskey-dev/misskey into develop (diff)
downloadmisskey-f765b374c7b2681ba198f609401dbd9c44bb738c.tar.gz
misskey-f765b374c7b2681ba198f609401dbd9c44bb738c.tar.bz2
misskey-f765b374c7b2681ba198f609401dbd9c44bb738c.zip
refactor
Diffstat (limited to 'packages/frontend')
-rw-r--r--packages/frontend/src/ui/_common_/common.vue150
-rw-r--r--packages/frontend/src/ui/deck.vue152
-rw-r--r--packages/frontend/src/ui/universal.vue148
3 files changed, 155 insertions, 295 deletions
diff --git a/packages/frontend/src/ui/_common_/common.vue b/packages/frontend/src/ui/_common_/common.vue
index 9ee3e3af37..d7d89d3f5c 100644
--- a/packages/frontend/src/ui/_common_/common.vue
+++ b/packages/frontend/src/ui/_common_/common.vue
@@ -4,6 +4,59 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
+<Transition
+ :enterActiveClass="prefer.s.animation ? $style.transition_menuDrawerBg_enterActive : ''"
+ :leaveActiveClass="prefer.s.animation ? $style.transition_menuDrawerBg_leaveActive : ''"
+ :enterFromClass="prefer.s.animation ? $style.transition_menuDrawerBg_enterFrom : ''"
+ :leaveToClass="prefer.s.animation ? $style.transition_menuDrawerBg_leaveTo : ''"
+>
+ <div
+ v-if="drawerMenuShowing"
+ :class="$style.menuDrawerBg"
+ class="_modalBg"
+ @click="drawerMenuShowing = false"
+ @touchstart.passive="drawerMenuShowing = false"
+ ></div>
+</Transition>
+
+<Transition
+ :enterActiveClass="prefer.s.animation ? $style.transition_menuDrawer_enterActive : ''"
+ :leaveActiveClass="prefer.s.animation ? $style.transition_menuDrawer_leaveActive : ''"
+ :enterFromClass="prefer.s.animation ? $style.transition_menuDrawer_enterFrom : ''"
+ :leaveToClass="prefer.s.animation ? $style.transition_menuDrawer_leaveTo : ''"
+>
+ <div v-if="drawerMenuShowing" :class="$style.menuDrawer">
+ <XDrawerMenu/>
+ </div>
+</Transition>
+
+<Transition
+ :enterActiveClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_enterActive : ''"
+ :leaveActiveClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_leaveActive : ''"
+ :enterFromClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_enterFrom : ''"
+ :leaveToClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_leaveTo : ''"
+>
+ <div
+ v-if="widgetsShowing"
+ :class="$style.widgetsDrawerBg"
+ class="_modalBg"
+ @click="widgetsShowing = false"
+ @touchstart.passive="widgetsShowing = false"
+ ></div>
+</Transition>
+
+<Transition
+ :enterActiveClass="prefer.s.animation ? $style.transition_widgetsDrawer_enterActive : ''"
+ :leaveActiveClass="prefer.s.animation ? $style.transition_widgetsDrawer_leaveActive : ''"
+ :enterFromClass="prefer.s.animation ? $style.transition_widgetsDrawer_enterFrom : ''"
+ :leaveToClass="prefer.s.animation ? $style.transition_widgetsDrawer_leaveTo : ''"
+>
+ <div v-if="widgetsShowing" :class="$style.widgetsDrawer">
+ <button class="_button" :class="$style.widgetsCloseButton" @click="widgetsShowing = false"><i class="ti ti-x"></i></button>
+ <XWidgets/>
+ </div>
+</Transition>
+
<component
:is="popup.component"
v-for="popup in popups"
@@ -59,9 +112,14 @@ import { useStream } from '@/stream.js';
import { i18n } from '@/i18n.js';
import { prefer } from '@/preferences.js';
import { globalEvents } from '@/events.js';
+import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue';
const XStreamIndicator = defineAsyncComponent(() => import('./stream-indicator.vue'));
const XUpload = defineAsyncComponent(() => import('./upload.vue'));
+const XWidgets = defineAsyncComponent(() => import('./widgets.vue'));
+
+const drawerMenuShowing = defineModel<boolean>('drawerMenuShowing');
+const widgetsShowing = defineModel<boolean>('widgetsShowing');
const dev = _DEV_;
@@ -100,6 +158,50 @@ if ($i) {
</script>
<style lang="scss" module>
+.transition_menuDrawerBg_enterActive,
+.transition_menuDrawerBg_leaveActive {
+ opacity: 1;
+ transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
+}
+.transition_menuDrawerBg_enterFrom,
+.transition_menuDrawerBg_leaveTo {
+ opacity: 0;
+}
+
+.transition_menuDrawer_enterActive,
+.transition_menuDrawer_leaveActive {
+ opacity: 1;
+ transform: translateX(0);
+ transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
+}
+.transition_menuDrawer_enterFrom,
+.transition_menuDrawer_leaveTo {
+ opacity: 0;
+ transform: translateX(-240px);
+}
+
+.transition_widgetsDrawerBg_enterActive,
+.transition_widgetsDrawerBg_leaveActive {
+ opacity: 1;
+ transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
+}
+.transition_widgetsDrawerBg_enterFrom,
+.transition_widgetsDrawerBg_leaveTo {
+ opacity: 0;
+}
+
+.transition_widgetsDrawer_enterActive,
+.transition_widgetsDrawer_leaveActive {
+ opacity: 1;
+ transform: translateX(0);
+ transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
+}
+.transition_widgetsDrawer_enterFrom,
+.transition_widgetsDrawer_leaveTo {
+ opacity: 0;
+ transform: translateX(-240px);
+}
+
.transition_notification_move,
.transition_notification_enterActive,
.transition_notification_leaveActive {
@@ -114,6 +216,54 @@ if ($i) {
transform: translateX(-250px);
}
+.menuDrawerBg {
+ z-index: 1001;
+}
+
+.menuDrawer {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1001;
+ height: 100dvh;
+ width: 240px;
+ box-sizing: border-box;
+ contain: strict;
+ overflow: auto;
+ overscroll-behavior: contain;
+ background: var(--MI_THEME-navBg);
+}
+
+.widgetsDrawerBg {
+ z-index: 1001;
+}
+
+.widgetsDrawer {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 1001;
+ width: 310px;
+ height: 100dvh;
+ padding: var(--MI-margin) var(--MI-margin) calc(var(--MI-margin) + env(safe-area-inset-bottom, 0px)) !important;
+ box-sizing: border-box;
+ overflow: auto;
+ overscroll-behavior: contain;
+ background: var(--MI_THEME-bg);
+}
+
+.widgetsCloseButton {
+ padding: 8px;
+ display: block;
+ margin: 0 auto;
+}
+
+@media (min-width: 370px) {
+ .widgetsCloseButton {
+ display: none;
+ }
+}
+
.notifications {
position: fixed;
z-index: 3900000;
diff --git a/packages/frontend/src/ui/deck.vue b/packages/frontend/src/ui/deck.vue
index 91da178a44..96961d951f 100644
--- a/packages/frontend/src/ui/deck.vue
+++ b/packages/frontend/src/ui/deck.vue
@@ -71,60 +71,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<XMobileFooterMenu v-if="isMobile" v-model:drawerMenuShowing="drawerMenuShowing" v-model:widgetsShowing="widgetsShowing"/>
</div>
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_menuDrawerBg_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_menuDrawerBg_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_menuDrawerBg_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_menuDrawerBg_leaveTo : ''"
- >
- <div
- v-if="drawerMenuShowing"
- :class="$style.menuBg"
- class="_modalBg"
- @click="drawerMenuShowing = false"
- @touchstart.passive="drawerMenuShowing = false"
- ></div>
- </Transition>
-
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_menuDrawer_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_menuDrawer_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_menuDrawer_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_menuDrawer_leaveTo : ''"
- >
- <div v-if="drawerMenuShowing" :class="$style.menu">
- <XDrawerMenu/>
- </div>
- </Transition>
-
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_leaveTo : ''"
- >
- <div
- v-if="widgetsShowing"
- :class="$style.widgetsDrawerBg"
- class="_modalBg"
- @click="widgetsShowing = false"
- @touchstart.passive="widgetsShowing = false"
- ></div>
- </Transition>
-
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_widgetsDrawer_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_widgetsDrawer_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_widgetsDrawer_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_widgetsDrawer_leaveTo : ''"
- >
- <div v-if="widgetsShowing" :class="$style.widgetsDrawer">
- <button class="_button" :class="$style.widgetsCloseButton" @click="widgetsShowing = false"><i class="ti ti-x"></i></button>
- <XWidgets/>
- </div>
- </Transition>
-
- <XCommon/>
+ <XCommon v-model:drawerMenuShowing="drawerMenuShowing" v-model:widgetsShowing="widgetsShowing"/>
</div>
</template>
@@ -134,7 +81,6 @@ import { v4 as uuid } from 'uuid';
import XCommon from './_common_/common.vue';
import XSidebar from '@/ui/_common_/navbar.vue';
import XNavbarH from '@/ui/_common_/navbar-h.vue';
-import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue';
import XMobileFooterMenu from '@/ui/_common_/mobile-footer-menu.vue';
import * as os from '@/os.js';
import { $i } from '@/i.js';
@@ -156,7 +102,6 @@ import { columns, layout, columnTypes, switchProfileMenu, addColumn as addColumn
const XStatusBars = defineAsyncComponent(() => import('@/ui/_common_/statusbars.vue'));
const XAnnouncements = defineAsyncComponent(() => import('@/ui/_common_/announcements.vue'));
-const XWidgets = defineAsyncComponent(() => import('./_common_/widgets.vue'));
const columnComponents = {
main: XMainColumn,
@@ -269,50 +214,6 @@ if (prefer.s['deck.wallpaper'] != null) {
</script>
<style lang="scss" module>
-.transition_menuDrawerBg_enterActive,
-.transition_menuDrawerBg_leaveActive {
- opacity: 1;
- transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_menuDrawerBg_enterFrom,
-.transition_menuDrawerBg_leaveTo {
- opacity: 0;
-}
-
-.transition_menuDrawer_enterActive,
-.transition_menuDrawer_leaveActive {
- opacity: 1;
- transform: translateX(0);
- transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_menuDrawer_enterFrom,
-.transition_menuDrawer_leaveTo {
- opacity: 0;
- transform: translateX(-240px);
-}
-
-.transition_widgetsDrawerBg_enterActive,
-.transition_widgetsDrawerBg_leaveActive {
- opacity: 1;
- transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_widgetsDrawerBg_enterFrom,
-.transition_widgetsDrawerBg_leaveTo {
- opacity: 0;
-}
-
-.transition_widgetsDrawer_enterActive,
-.transition_widgetsDrawer_leaveActive {
- opacity: 1;
- transform: translateX(0);
- transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_widgetsDrawer_enterFrom,
-.transition_widgetsDrawer_leaveTo {
- opacity: 0;
- transform: translateX(-240px);
-}
-
.root {
$nav-hide-threshold: 650px; // TODO: どこかに集約したい
@@ -344,6 +245,9 @@ if (prefer.s['deck.wallpaper'] != null) {
flex: 1;
display: flex;
flex-direction: row;
+
+ // これがないと狭い画面でマージンが広いデッキを表示したときにナビゲーションフッターが画面の外に追いやられて操作不能になる場合がある
+ min-height: 0;
}
.columns {
@@ -441,52 +345,4 @@ if (prefer.s['deck.wallpaper'] != null) {
.bottomMenuRight {
margin-left: auto;
}
-
-.menuBg {
- z-index: 1001;
-}
-
-.menu {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1001;
- height: 100dvh;
- width: 240px;
- box-sizing: border-box;
- contain: strict;
- overflow: auto;
- overscroll-behavior: contain;
- background: var(--MI_THEME-navBg);
-}
-
-.widgetsDrawerBg {
- z-index: 1001;
-}
-
-.widgetsDrawer {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1001;
- width: 310px;
- height: 100dvh;
- padding: var(--MI-margin) var(--MI-margin) calc(var(--MI-margin) + env(safe-area-inset-bottom, 0px)) !important;
- box-sizing: border-box;
- overflow: auto;
- overscroll-behavior: contain;
- background: var(--MI_THEME-bg);
-}
-
-.widgetsCloseButton {
- padding: 8px;
- display: block;
- margin: 0 auto;
-}
-
-@media (min-width: 370px) {
- .widgetsCloseButton {
- display: none;
- }
-}
</style>
diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue
index 0b4cddf938..940cf72e28 100644
--- a/packages/frontend/src/ui/universal.vue
+++ b/packages/frontend/src/ui/universal.vue
@@ -22,60 +22,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<XWidgets/>
</div>
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_menuDrawerBg_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_menuDrawerBg_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_menuDrawerBg_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_menuDrawerBg_leaveTo : ''"
- >
- <div
- v-if="drawerMenuShowing"
- :class="$style.menuDrawerBg"
- class="_modalBg"
- @click="drawerMenuShowing = false"
- @touchstart.passive="drawerMenuShowing = false"
- ></div>
- </Transition>
-
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_menuDrawer_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_menuDrawer_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_menuDrawer_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_menuDrawer_leaveTo : ''"
- >
- <div v-if="drawerMenuShowing" :class="$style.menuDrawer">
- <XDrawerMenu/>
- </div>
- </Transition>
-
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_widgetsDrawerBg_leaveTo : ''"
- >
- <div
- v-if="widgetsShowing"
- :class="$style.widgetsDrawerBg"
- class="_modalBg"
- @click="widgetsShowing = false"
- @touchstart.passive="widgetsShowing = false"
- ></div>
- </Transition>
-
- <Transition
- :enterActiveClass="prefer.s.animation ? $style.transition_widgetsDrawer_enterActive : ''"
- :leaveActiveClass="prefer.s.animation ? $style.transition_widgetsDrawer_leaveActive : ''"
- :enterFromClass="prefer.s.animation ? $style.transition_widgetsDrawer_enterFrom : ''"
- :leaveToClass="prefer.s.animation ? $style.transition_widgetsDrawer_leaveTo : ''"
- >
- <div v-if="widgetsShowing" :class="$style.widgetsDrawer">
- <button class="_button" :class="$style.widgetsCloseButton" @click="widgetsShowing = false"><i class="ti ti-x"></i></button>
- <XWidgets/>
- </div>
- </Transition>
-
- <XCommon/>
+ <XCommon v-model:drawerMenuShowing="drawerMenuShowing" v-model:widgetsShowing="widgetsShowing"/>
</div>
</template>
@@ -85,7 +32,6 @@ import { instanceName } from '@@/js/config.js';
import { isLink } from '@@/js/is-link.js';
import XCommon from './_common_/common.vue';
import type { PageMetadata } from '@/page.js';
-import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue';
import XMobileFooterMenu from '@/ui/_common_/mobile-footer-menu.vue';
import XPreferenceRestore from '@/ui/_common_/PreferenceRestore.vue';
import * as os from '@/os.js';
@@ -178,50 +124,6 @@ const onContextmenu = (ev) => {
$ui-font-size: 1em; // TODO: どこかに集約したい
$widgets-hide-threshold: 1090px;
-.transition_menuDrawerBg_enterActive,
-.transition_menuDrawerBg_leaveActive {
- opacity: 1;
- transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_menuDrawerBg_enterFrom,
-.transition_menuDrawerBg_leaveTo {
- opacity: 0;
-}
-
-.transition_menuDrawer_enterActive,
-.transition_menuDrawer_leaveActive {
- opacity: 1;
- transform: translateX(0);
- transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_menuDrawer_enterFrom,
-.transition_menuDrawer_leaveTo {
- opacity: 0;
- transform: translateX(-240px);
-}
-
-.transition_widgetsDrawerBg_enterActive,
-.transition_widgetsDrawerBg_leaveActive {
- opacity: 1;
- transition: opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_widgetsDrawerBg_enterFrom,
-.transition_widgetsDrawerBg_leaveTo {
- opacity: 0;
-}
-
-.transition_widgetsDrawer_enterActive,
-.transition_widgetsDrawer_leaveActive {
- opacity: 1;
- transform: translateX(0);
- transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1);
-}
-.transition_widgetsDrawer_enterFrom,
-.transition_widgetsDrawer_leaveTo {
- opacity: 0;
- transform: translateX(-240px);
-}
-
.root {
height: 100dvh;
overflow: clip;
@@ -248,24 +150,6 @@ $widgets-hide-threshold: 1090px;
min-height: 0;
}
-.menuDrawerBg {
- z-index: 1001;
-}
-
-.menuDrawer {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1001;
- height: 100dvh;
- width: 240px;
- box-sizing: border-box;
- contain: strict;
- overflow: auto;
- overscroll-behavior: contain;
- background: var(--MI_THEME-navBg);
-}
-
.statusbars {
position: sticky;
top: 0;
@@ -285,34 +169,4 @@ $widgets-hide-threshold: 1090px;
display: none;
}
}
-
-.widgetsDrawerBg {
- z-index: 1001;
-}
-
-.widgetsDrawer {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1001;
- width: 310px;
- height: 100dvh;
- padding: var(--MI-margin) var(--MI-margin) calc(var(--MI-margin) + env(safe-area-inset-bottom, 0px)) !important;
- box-sizing: border-box;
- overflow: auto;
- overscroll-behavior: contain;
- background: var(--MI_THEME-bg);
-}
-
-.widgetsCloseButton {
- padding: 8px;
- display: block;
- margin: 0 auto;
-}
-
-@media (min-width: 370px) {
- .widgetsCloseButton {
- display: none;
- }
-}
</style>