From a2f3947bfc771d189c1a57fcd7f15673acbe0cf0 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Sat, 3 May 2025 12:36:34 +0900
Subject: [PATCH] tweak navbar
---
packages/frontend/src/ui/_common_/common.vue | 10 +-
.../src/ui/_common_/navbar-for-mobile.vue | 387 ------------------
packages/frontend/src/ui/_common_/navbar.vue | 166 +++++---
3 files changed, 117 insertions(+), 446 deletions(-)
delete mode 100644 packages/frontend/src/ui/_common_/navbar-for-mobile.vue
diff --git a/packages/frontend/src/ui/_common_/common.vue b/packages/frontend/src/ui/_common_/common.vue
index 373af28747..fcf9fb234d 100644
--- a/packages/frontend/src/ui/_common_/common.vue
+++ b/packages/frontend/src/ui/_common_/common.vue
@@ -26,7 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only
:leaveToClass="prefer.s.animation ? $style.transition_menuDrawer_leaveTo : ''"
>
-
+
@@ -113,7 +113,7 @@ import { i18n } from '@/i18n.js';
import { prefer } from '@/preferences.js';
import { globalEvents } from '@/events.js';
import { store } from '@/store.js';
-import XDrawerMenu from '@/ui/_common_/navbar-for-mobile.vue';
+import XNavbar from '@/ui/_common_/navbar.vue';
const XStreamIndicator = defineAsyncComponent(() => import('./stream-indicator.vue'));
const XUpload = defineAsyncComponent(() => import('./upload.vue'));
@@ -230,12 +230,6 @@ if ($i) {
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 {
diff --git a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue b/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
deleted file mode 100644
index 480db8741b..0000000000
--- a/packages/frontend/src/ui/_common_/navbar-for-mobile.vue
+++ /dev/null
@@ -1,387 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n.ts.timeline }}
-
-
-
-
- {{ navbarItemDef[item].title }}
-
- {{ navbarItemDef[item].indicateValue }}
-
-
-
-
-
-
- {{ i18n.ts.controlPanel }}
-
-
-
- {{ i18n.ts.settings }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/frontend/src/ui/_common_/navbar.vue b/packages/frontend/src/ui/_common_/navbar.vue
index f757d6a7fc..d8a444db8a 100644
--- a/packages/frontend/src/ui/_common_/navbar.vue
+++ b/packages/frontend/src/ui/_common_/navbar.vue
@@ -10,6 +10,9 @@ SPDX-License-Identifier: AGPL-3.0-only
+
@@ -50,7 +53,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
-
-
-
+
+
+
+
+
@@ -111,15 +116,16 @@ const router = useRouter();
const props = defineProps<{
showWidgetButton?: boolean;
+ asDrawer?: boolean;
}>();
const emit = defineEmits<{
(ev: 'widgetButtonClick'): void;
}>();
-const forceIconOnly = ref(window.innerWidth <= 1279);
+const forceIconOnly = ref(!props.asDrawer && window.innerWidth <= 1279);
const iconOnly = computed(() => {
- return forceIconOnly.value || (store.r.menuDisplay.value === 'sideIcon');
+ return !props.asDrawer && (forceIconOnly.value || (store.r.menuDisplay.value === 'sideIcon'));
});
const otherMenuItemIndicated = computed(() => {
@@ -208,13 +214,51 @@ function menuEdit() {
overscroll-behavior: contain;
background: var(--MI_THEME-navBg);
contain: strict;
- display: flex;
- flex-direction: column;
direction: rtl; // スクロールバーを左に表示したいため
}
.top {
direction: ltr;
+
+ /* 疑似progressive blur */
+ &::before {
+ position: absolute;
+ z-index: -1;
+ inset: 0;
+ content: "";
+ backdrop-filter: blur(8px);
+ mask-image: linear-gradient(
+ to top,
+ rgb(0 0 0 / 0%) 0%,
+ rgb(0 0 0 / 4.9%) 7.75%,
+ rgb(0 0 0 / 10.4%) 11.25%,
+ rgb(0 0 0 / 45%) 23.55%,
+ rgb(0 0 0 / 55%) 26.45%,
+ rgb(0 0 0 / 89.6%) 38.75%,
+ rgb(0 0 0 / 95.1%) 42.25%,
+ rgb(0 0 0 / 100%) 50%
+ );
+ }
+
+ &::after {
+ position: absolute;
+ z-index: -1;
+ inset: 0;
+ bottom: 25%;
+ content: "";
+ backdrop-filter: blur(16px);
+ mask-image: linear-gradient(
+ to top,
+ rgb(0 0 0 / 0%) 0%,
+ rgb(0 0 0 / 4.9%) 15.5%,
+ rgb(0 0 0 / 10.4%) 22.5%,
+ rgb(0 0 0 / 45%) 47.1%,
+ rgb(0 0 0 / 55%) 52.9%,
+ rgb(0 0 0 / 89.6%) 77.5%,
+ rgb(0 0 0 / 95.1%) 91.9%,
+ rgb(0 0 0 / 100%) 100%
+ );
+ }
}
.middle {
@@ -223,6 +267,47 @@ function menuEdit() {
.bottom {
direction: ltr;
+
+ /* 疑似progressive blur */
+ &::before {
+ position: absolute;
+ z-index: -1;
+ inset: -30px 0 0 0;
+ content: "";
+ backdrop-filter: blur(8px);
+ mask-image: linear-gradient(
+ to bottom,
+ rgb(0 0 0 / 0%) 0%,
+ rgb(0 0 0 / 4.9%) 7.75%,
+ rgb(0 0 0 / 10.4%) 11.25%,
+ rgb(0 0 0 / 45%) 23.55%,
+ rgb(0 0 0 / 55%) 26.45%,
+ rgb(0 0 0 / 89.6%) 38.75%,
+ rgb(0 0 0 / 95.1%) 42.25%,
+ rgb(0 0 0 / 100%) 50%
+ );
+ pointer-events: none;
+ }
+
+ &::after {
+ position: absolute;
+ z-index: -1;
+ inset: 0;
+ top: 25%;
+ content: "";
+ backdrop-filter: blur(16px);
+ mask-image: linear-gradient(
+ to bottom,
+ rgb(0 0 0 / 0%) 0%,
+ rgb(0 0 0 / 4.9%) 15.5%,
+ rgb(0 0 0 / 10.4%) 22.5%,
+ rgb(0 0 0 / 45%) 47.1%,
+ rgb(0 0 0 / 55%) 52.9%,
+ rgb(0 0 0 / 89.6%) 77.5%,
+ rgb(0 0 0 / 95.1%) 91.9%,
+ rgb(0 0 0 / 100%) 100%
+ );
+ }
}
.subButtons {
@@ -307,29 +392,18 @@ function menuEdit() {
}
.top {
+ --top-height: 80px;
+
position: sticky;
top: 0;
z-index: 1;
- padding: 20px 0;
- background: var(--nav-bg-transparent);
- -webkit-backdrop-filter: var(--MI-blur, blur(8px));
- backdrop-filter: var(--MI-blur, blur(8px));
+ display: flex;
+ height: var(--top-height);
}
.instance {
position: relative;
- display: block;
- text-align: center;
- width: 100%;
-
- &:focus-visible {
- outline: none;
-
- > .instanceIcon {
- outline: 2px solid var(--MI_THEME-focus);
- outline-offset: 2px;
- }
- }
+ width: var(--top-height);
}
.instanceIcon {
@@ -339,26 +413,22 @@ function menuEdit() {
border-radius: 8px;
}
- .bottom {
- position: sticky;
- bottom: 0;
- background: var(--nav-bg-transparent);
- -webkit-backdrop-filter: var(--MI-blur, blur(8px));
- backdrop-filter: var(--MI-blur, blur(8px));
- }
-
.realtimeMode {
- display: block;
- position: relative;
- width: 100%;
- height: 52px;
- text-align: center;
+ display: inline-block;
+ width: var(--top-height);
+ margin-left: auto;
&.on {
color: var(--MI_THEME-accent);
}
}
+ .bottom {
+ position: sticky;
+ bottom: 0;
+ padding-top: 20px;
+ }
+
.post {
position: relative;
display: block;
@@ -548,9 +618,6 @@ function menuEdit() {
top: 0;
z-index: 1;
padding: 20px 0;
- background: var(--nav-bg-transparent);
- -webkit-backdrop-filter: var(--MI-blur, blur(8px));
- backdrop-filter: var(--MI-blur, blur(8px));
}
.instance {
@@ -579,9 +646,6 @@ function menuEdit() {
position: sticky;
bottom: 0;
padding-top: 20px;
- background: var(--nav-bg-transparent);
- -webkit-backdrop-filter: var(--MI-blur, blur(8px));
- backdrop-filter: var(--MI-blur, blur(8px));
}
.widget {
@@ -690,7 +754,7 @@ function menuEdit() {
.item {
display: block;
position: relative;
- padding: 18px 0;
+ padding: 16px 0;
width: 100%;
text-align: center;