From 0918fa1685ee803e18a2c342888f8c1b9ce2a04d Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 10 Jul 2025 12:44:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E6=89=80=E6=9C=89=20VDialog=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=9B=BF=E6=8D=A2=E4=B8=BA=20DialogWrapper?= =?UTF-8?q?=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components.d.ts | 1 + src/@core/components/ConfirmDialog.vue | 4 +- src/@core/components/DialogWrapper.vue | 70 +++++ .../_default-layout-w-vertical-nav.scss | 3 +- src/@layouts/components/VerticalNavLayout.vue | 5 +- src/components/PWAInstallPrompt.vue | 4 +- src/components/cards/CustomRuleCard.vue | 4 +- src/components/cards/DownloaderCard.vue | 4 +- src/components/cards/FilterRuleGroupCard.vue | 4 +- src/components/cards/MediaServerCard.vue | 4 +- .../cards/NotificationChannelCard.vue | 4 +- src/components/cards/PluginAppCard.vue | 8 +- src/components/cards/PluginCard.vue | 12 +- src/components/cards/PluginFolderCard.vue | 8 +- src/components/cards/StorageCard.vue | 4 +- src/components/cards/TorrentCard.vue | 4 +- src/components/dialog/AddDownloadDialog.vue | 4 +- src/components/dialog/AlistConfigDialog.vue | 4 +- src/components/dialog/AliyunAuthDialog.vue | 4 +- src/components/dialog/ForkSubscribeDialog.vue | 4 +- src/components/dialog/ForkWorkflowDialog.vue | 4 +- src/components/dialog/ImportCodeDialog.vue | 4 +- src/components/dialog/MediaInfoDialog.vue | 4 +- src/components/dialog/PluginConfigDialog.vue | 4 +- src/components/dialog/PluginDataDialog.vue | 4 +- .../dialog/PluginMarketSettingDialog.vue | 4 +- src/components/dialog/ProgressDialog.vue | 4 +- src/components/dialog/RcloneConfigDialog.vue | 4 +- src/components/dialog/ReorganizeDialog.vue | 8 +- src/components/dialog/SearchBarDialog.vue | 4 +- src/components/dialog/SearchSiteDialog.vue | 4 +- src/components/dialog/SiteAddEditDialog.vue | 4 +- .../dialog/SiteCookieUpdateDialog.vue | 4 +- src/components/dialog/SiteResourceDialog.vue | 4 +- src/components/dialog/SiteUserDataDialog.vue | 4 +- src/components/dialog/SmbConfigDialog.vue | 4 +- src/components/dialog/SubscribeEditDialog.vue | 4 +- .../dialog/SubscribeFilesDialog.vue | 4 +- .../dialog/SubscribeHistoryDialog.vue | 4 +- .../dialog/SubscribeShareDialog.vue | 4 +- src/components/dialog/TransferQueueDialog.vue | 4 +- src/components/dialog/U115AuthDialog.vue | 4 +- src/components/dialog/UserAddEditDialog.vue | 4 +- src/components/dialog/UserAuthDialog.vue | 4 +- .../dialog/WorkflowActionsDialog.vue | 4 +- .../dialog/WorkflowAddEditDialog.vue | 4 +- src/components/dialog/WorkflowShareDialog.vue | 4 +- src/components/filebrowser/FileList.vue | 4 +- src/components/filebrowser/FileToolbar.vue | 4 +- src/composables/useDialogScrollLock.ts | 242 ++++++++++++++++++ src/layouts/components/ShortcutBar.vue | 24 +- src/layouts/components/UserProfile.vue | 4 +- src/pages/dashboard.vue | 4 +- src/pages/discover.vue | 4 +- src/pages/recommend.vue | 4 +- src/views/plugin/PluginCardListView.vue | 12 +- src/views/setting/AccountSettingAbout.vue | 4 +- src/views/setting/AccountSettingCache.vue | 4 +- .../setting/AccountSettingNotification.vue | 4 +- src/views/setting/AccountSettingSystem.vue | 4 +- src/views/torrent/TorrentCardListView.vue | 8 +- src/views/torrent/TorrentRowListView.vue | 8 +- src/views/user/UserProfileView.vue | 4 +- 63 files changed, 463 insertions(+), 146 deletions(-) create mode 100644 src/@core/components/DialogWrapper.vue create mode 100644 src/composables/useDialogScrollLock.ts diff --git a/components.d.ts b/components.d.ts index 43ffe278..8e599c1e 100644 --- a/components.d.ts +++ b/components.d.ts @@ -10,6 +10,7 @@ declare module 'vue' { export interface GlobalComponents { ConfirmDialog: typeof import('./src/@core/components/ConfirmDialog.vue')['default'] DialogCloseBtn: typeof import('./src/@core/components/DialogCloseBtn.vue')['default'] + DialogWrapper: typeof import('./src/@core/components/DialogWrapper.vue')['default'] ErrorHeader: typeof import('./src/@core/components/ErrorHeader.vue')['default'] ExistIcon: typeof import('./src/@core/components/ExistIcon.vue')['default'] LoadingBanner: typeof import('./src/@core/components/LoadingBanner.vue')['default'] diff --git a/src/@core/components/ConfirmDialog.vue b/src/@core/components/ConfirmDialog.vue index fdb6af90..c33299d3 100644 --- a/src/@core/components/ConfirmDialog.vue +++ b/src/@core/components/ConfirmDialog.vue @@ -59,7 +59,7 @@ function handleCancel() { diff --git a/src/@core/components/DialogWrapper.vue b/src/@core/components/DialogWrapper.vue new file mode 100644 index 00000000..5c70c83d --- /dev/null +++ b/src/@core/components/DialogWrapper.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/@core/scss/template/_default-layout-w-vertical-nav.scss b/src/@core/scss/template/_default-layout-w-vertical-nav.scss index 92ba9ed9..cc5bf2ab 100644 --- a/src/@core/scss/template/_default-layout-w-vertical-nav.scss +++ b/src/@core/scss/template/_default-layout-w-vertical-nav.scss @@ -46,7 +46,8 @@ $header: ".layout-navbar"; /* ℹ️ Ensure header styles are preserved when dialog is opened, regardless of scroll state */ - html.v-overlay-scroll-blocked &.window-scrolled.layout-navbar-fixed { + html.v-overlay-scroll-blocked &.window-scrolled.layout-navbar-fixed, + html.dialog-scroll-locked &.layout-navbar-fixed { #{$header} { @extend %default-layout-vertical-nav-scrolled-sticky-elevated-nav; diff --git a/src/@layouts/components/VerticalNavLayout.vue b/src/@layouts/components/VerticalNavLayout.vue index a4f552fd..5bc9baa1 100644 --- a/src/@layouts/components/VerticalNavLayout.vue +++ b/src/@layouts/components/VerticalNavLayout.vue @@ -88,6 +88,9 @@ export default defineComponent({ }, }) + // 检查是否有弹窗打开(通过CSS类名判断) + const isDialogOpen = document.documentElement.classList.contains('dialog-scroll-locked') + return h( 'div', { @@ -96,7 +99,7 @@ export default defineComponent({ 'layout-navbar-fixed', mdAndDown.value && 'layout-overlay-nav', route.meta.layoutWrapperClasses, - scrollDistance.value && 'window-scrolled', + (scrollDistance.value || isDialogOpen) && 'window-scrolled', ], }, [verticalNav, h('div', { class: 'layout-content-wrapper' }, [navbar, main, footer]), layoutOverlay], diff --git a/src/components/PWAInstallPrompt.vue b/src/components/PWAInstallPrompt.vue index c8baa163..2d6db2e8 100644 --- a/src/components/PWAInstallPrompt.vue +++ b/src/components/PWAInstallPrompt.vue @@ -133,7 +133,7 @@ const instructions = computed(() => { - + @@ -170,7 +170,7 @@ const instructions = computed(() => { - +