smart-admin-web 10.15.0 → 10.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/api/index.d.ts +4 -2
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +39 -5
- package/dist/assets/icons/ph-subset.json.js +5 -5
- package/dist/components/AppIcon.vue.js +9 -9
- package/dist/components/AppIcon.vue.js.map +1 -1
- package/dist/components/AppWatermark.vue.d.ts +14 -0
- package/dist/components/AppWatermark.vue.js +38 -0
- package/dist/components/AppWatermark.vue.js.map +1 -0
- package/dist/components/AppWatermark2.vue.js +5 -0
- package/dist/components/AppWatermark2.vue.js.map +1 -0
- package/dist/components/Chart/PieChart.vue.d.ts +1 -1
- package/dist/components/Chart/echarts.js +15 -20
- package/dist/components/Chart/echarts.js.map +1 -1
- package/dist/components/CronEditor/index.vue.js +1 -1
- package/dist/components/CronEditor/index2.vue.js +2 -1
- package/dist/components/CronEditor/index2.vue.js.map +1 -1
- package/dist/components/DetailPage/index.vue.js +2 -2
- package/dist/components/DetailPage/index2.vue.js.map +1 -1
- package/dist/components/DictTag/index.vue.js.map +1 -1
- package/dist/components/ErrorBoundary/index.vue.js +2 -2
- package/dist/components/ErrorBoundary/index2.vue.js +1 -1
- package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
- package/dist/components/FormContainer/index.vue.js +91 -56
- package/dist/components/FormContainer/index.vue.js.map +1 -1
- package/dist/components/ImportWizard/index.vue.js +1 -1
- package/dist/components/ImportWizard/index2.vue.js +44 -41
- package/dist/components/ImportWizard/index2.vue.js.map +1 -1
- package/dist/components/MenuSearch.vue.js +2 -2
- package/dist/components/MenuSearch2.vue.js +19 -18
- package/dist/components/MenuSearch2.vue.js.map +1 -1
- package/dist/components/PasswordStrength/index.vue.js +2 -2
- package/dist/components/PasswordStrength/index2.vue.js +20 -18
- package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
- package/dist/components/TableTotal/index.vue.d.ts +6 -0
- package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
- package/dist/components/TableTotal/index2.vue.js +16 -0
- package/dist/components/TableTotal/index2.vue.js.map +1 -0
- package/dist/components/TableZoomButton/index.vue.js.map +1 -1
- package/dist/components/UserPicker/index.vue.js +2 -2
- package/dist/components/UserPicker/index2.vue.js +176 -117
- package/dist/components/UserPicker/index2.vue.js.map +1 -1
- package/dist/composables/useBatchDelete.js.map +1 -1
- package/dist/composables/useLayoutMenu.js +17 -16
- package/dist/composables/useLayoutMenu.js.map +1 -1
- package/dist/composables/useModule.js +39 -29
- package/dist/composables/useModule.js.map +1 -1
- package/dist/composables/useShellBreakpoint.d.ts +19 -0
- package/dist/composables/useShellBreakpoint.js +37 -0
- package/dist/composables/useShellBreakpoint.js.map +1 -0
- package/dist/composables/useSite.d.ts +15 -0
- package/dist/composables/useSite.js +16 -14
- package/dist/composables/useSite.js.map +1 -1
- package/dist/composables/useTabTitle.js.map +1 -1
- package/dist/composables/useTableTitle.d.ts +6 -0
- package/dist/composables/useTableTitle.js +11 -0
- package/dist/composables/useTableTitle.js.map +1 -0
- package/dist/composables/useTableZoom.d.ts +5 -0
- package/dist/composables/useTableZoom.js.map +1 -1
- package/dist/composables/useTheme.d.ts +2 -2
- package/dist/composables/useTheme.js +23 -20
- package/dist/composables/useTheme.js.map +1 -1
- package/dist/createSmartAdmin.d.ts +12 -2
- package/dist/createSmartAdmin.js +72 -60
- package/dist/createSmartAdmin.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.js +219 -205
- package/dist/index.js.map +1 -1
- package/dist/layouts/AccentPicker.vue.js +8 -0
- package/dist/layouts/AccentPicker.vue.js.map +1 -0
- package/dist/layouts/AccentPicker2.vue.js +131 -0
- package/dist/layouts/AccentPicker2.vue.js.map +1 -0
- package/dist/layouts/AppHeader.vue.d.ts +8 -1
- package/dist/layouts/AppHeader.vue.js +2 -2
- package/dist/layouts/AppHeader2.vue.js +317 -235
- package/dist/layouts/AppHeader2.vue.js.map +1 -1
- package/dist/layouts/NoticeBell.vue.js +2 -2
- package/dist/layouts/NoticeBell2.vue.js +1 -1
- package/dist/layouts/NoticeBell2.vue.js.map +1 -1
- package/dist/layouts/PersonalLayout.vue.js +2 -2
- package/dist/layouts/PersonalLayout2.vue.js +69 -47
- package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
- package/dist/layouts/SettingsDrawer.vue.js +3 -3
- package/dist/layouts/SettingsDrawer2.vue.js +261 -325
- package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
- package/dist/layouts/TabsBar.vue.js +2 -2
- package/dist/layouts/TabsBar2.vue.js +97 -69
- package/dist/layouts/TabsBar2.vue.js.map +1 -1
- package/dist/layouts/components/SideNav.vue.d.ts +3 -0
- package/dist/layouts/components/SideNav.vue.js +1 -1
- package/dist/layouts/components/SideNav2.vue.js +54 -26
- package/dist/layouts/components/SideNav2.vue.js.map +1 -1
- package/dist/layouts/default.vue.js +1 -1
- package/dist/layouts/default2.vue.js +170 -140
- package/dist/layouts/default2.vue.js.map +1 -1
- package/dist/lib/loginHero.d.ts +2 -2
- package/dist/lib/loginHero.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/watermark.d.ts +110 -0
- package/dist/lib/watermark.js +151 -0
- package/dist/lib/watermark.js.map +1 -0
- package/dist/locales/en-US.d.ts +221 -15
- package/dist/locales/en-US.js +230 -21
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/kernelMenuTitles.d.ts +1 -0
- package/dist/locales/kernelMenuTitles.js +128 -0
- package/dist/locales/kernelMenuTitles.js.map +1 -0
- package/dist/locales/menuTitle.d.ts +3 -0
- package/dist/locales/menuTitle.js +14 -12
- package/dist/locales/menuTitle.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +221 -15
- package/dist/locales/zh-CN.js +238 -28
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/index.js +41 -32
- package/dist/router/index.js.map +1 -1
- package/dist/router/namedPage.d.ts +4 -0
- package/dist/router/namedPage.js +7 -7
- package/dist/router/namedPage.js.map +1 -1
- package/dist/router/viewRegistry.js +8 -8
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/stores/app.d.ts +0 -12
- package/dist/stores/app.js +11 -12
- package/dist/stores/app.js.map +1 -1
- package/dist/stores/tabs.js.map +1 -1
- package/dist/stores/user.d.ts +10 -0
- package/dist/stores/user.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/accentTokens.d.ts +27 -0
- package/dist/theme/accentTokens.js +54 -0
- package/dist/theme/accentTokens.js.map +1 -0
- package/dist/theme/accents.d.ts +21 -1
- package/dist/theme/accents.js +11 -2
- package/dist/theme/accents.js.map +1 -1
- package/dist/theme/mix.d.ts +58 -7
- package/dist/theme/mix.js +115 -30
- package/dist/theme/mix.js.map +1 -1
- package/dist/theme/naive-theme.d.ts +5 -2
- package/dist/theme/naive-theme.js +405 -75
- package/dist/theme/naive-theme.js.map +1 -1
- package/dist/utils/jwt.d.ts +8 -0
- package/dist/utils/jwt.js +14 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/menuIcon.d.ts +2 -0
- package/dist/utils/menuIcon.js +8 -0
- package/dist/utils/menuIcon.js.map +1 -0
- package/dist/utils/oauthBrand.js.map +1 -1
- package/dist/utils/tableFilter.d.ts +88 -0
- package/dist/utils/tableFilter.js +116 -0
- package/dist/utils/tableFilter.js.map +1 -0
- package/dist/utils/tableToolbar.d.ts +18 -0
- package/dist/utils/tableToolbar.js +11 -0
- package/dist/utils/tableToolbar.js.map +1 -0
- package/dist/utils/treeFilter.d.ts +20 -0
- package/dist/utils/treeFilter.js +24 -0
- package/dist/utils/treeFilter.js.map +1 -0
- package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
- package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
- package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
- package/dist/views/dashboard/biz.vue.js +1 -1
- package/dist/views/dashboard/biz2.vue.js +310 -257
- package/dist/views/dashboard/biz2.vue.js.map +1 -1
- package/dist/views/dashboard/workbench.vue.js +2 -2
- package/dist/views/dashboard/workbench2.vue.js +141 -155
- package/dist/views/dashboard/workbench2.vue.js.map +1 -1
- package/dist/views/embed/iframe.vue.js +2 -2
- package/dist/views/embed/iframe2.vue.js +22 -15
- package/dist/views/embed/iframe2.vue.js.map +1 -1
- package/dist/views/error/404.vue.js +2 -2
- package/dist/views/error/4042.vue.js +33 -24
- package/dist/views/error/4042.vue.js.map +1 -1
- package/dist/views/error/BootError.vue.js +1 -1
- package/dist/views/error/BootError2.vue.js +59 -48
- package/dist/views/error/BootError2.vue.js.map +1 -1
- package/dist/views/error/MissingRoute.vue.js +2 -2
- package/dist/views/error/MissingRoute2.vue.js +34 -15
- package/dist/views/error/MissingRoute2.vue.js.map +1 -1
- package/dist/views/login/LoginForm.vue.d.ts +7 -1
- package/dist/views/login/LoginForm.vue.js +2 -2
- package/dist/views/login/LoginForm2.vue.js +580 -488
- package/dist/views/login/LoginForm2.vue.js.map +1 -1
- package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
- package/dist/views/login/components/LoginDesk.vue.js +9 -0
- package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
- package/dist/views/login/components/LoginDesk2.vue.js +100 -0
- package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js +3 -3
- package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
- package/dist/views/login/index.vue.js +1 -1
- package/dist/views/login/index2.vue.js +141 -71
- package/dist/views/login/index2.vue.js.map +1 -1
- package/dist/views/login/layout.d.ts +11 -0
- package/dist/views/login/layout.js +27 -0
- package/dist/views/login/layout.js.map +1 -0
- package/dist/views/mfa/index.vue.js +2 -2
- package/dist/views/mfa/index2.vue.js +367 -321
- package/dist/views/mfa/index2.vue.js.map +1 -1
- package/dist/views/module/index.vue.js +2 -2
- package/dist/views/module/index2.vue.js +132 -99
- package/dist/views/module/index2.vue.js.map +1 -1
- package/dist/views/oauth/callback.vue.js +2 -2
- package/dist/views/oauth/callback2.vue.js +65 -51
- package/dist/views/oauth/callback2.vue.js.map +1 -1
- package/dist/views/personal/bindings.vue.js +2 -2
- package/dist/views/personal/bindings2.vue.js +98 -94
- package/dist/views/personal/bindings2.vue.js.map +1 -1
- package/dist/views/personal/notice2.vue.js +103 -76
- package/dist/views/personal/notice2.vue.js.map +1 -1
- package/dist/views/personal/password2.vue.js +47 -40
- package/dist/views/personal/password2.vue.js.map +1 -1
- package/dist/views/personal/profile.vue.js +3 -3
- package/dist/views/personal/profile2.vue.js +24 -18
- package/dist/views/personal/profile2.vue.js.map +1 -1
- package/dist/views/personal/security.vue.js +2 -2
- package/dist/views/personal/security2.vue.js +65 -53
- package/dist/views/personal/security2.vue.js.map +1 -1
- package/dist/views/personal/sessions.vue.js +2 -2
- package/dist/views/personal/sessions2.vue.js +67 -62
- package/dist/views/personal/sessions2.vue.js.map +1 -1
- package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
- package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
- package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
- package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
- package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
- package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
- package/dist/views/system/ai-model/index.vue.js +2 -2
- package/dist/views/system/ai-model/index2.vue.js +99 -99
- package/dist/views/system/ai-model/index2.vue.js.map +1 -1
- package/dist/views/system/ai-model/presets.d.ts +1 -1
- package/dist/views/system/ai-model/presets.js +18 -18
- package/dist/views/system/ai-model/presets.js.map +1 -1
- package/dist/views/system/ai-usage/index.vue.js +2 -2
- package/dist/views/system/ai-usage/index2.vue.js +356 -258
- package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
- package/dist/views/system/api-docs/index.vue.js +5 -2
- package/dist/views/system/api-docs/index.vue.js.map +1 -1
- package/dist/views/system/api-docs/index2.vue.js +92 -42
- package/dist/views/system/api-docs/index2.vue.js.map +1 -1
- package/dist/views/system/cache/index.vue.js +2 -2
- package/dist/views/system/cache/index2.vue.js +74 -80
- package/dist/views/system/cache/index2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdminMock.vue.js +2 -2
- package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
- package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
- package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/BrandSection.vue.js +2 -2
- package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
- package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
- package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgRow.vue.js +1 -1
- package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
- package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
- package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
- package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
- package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
- package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
- package/dist/views/system/config/components/JobSection.vue.js +2 -2
- package/dist/views/system/config/components/JobSection2.vue.js +46 -44
- package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/LoginMock.vue.js +3 -3
- package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
- package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
- package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
- package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
- package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
- package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
- package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
- package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
- package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
- package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
- package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
- package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
- package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
- package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
- package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
- package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
- package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
- package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
- package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/UploadSection.vue.js +2 -2
- package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
- package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
- package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
- package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
- package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
- package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
- package/dist/views/system/config/draft.d.ts +2 -2
- package/dist/views/system/config/draft.js.map +1 -1
- package/dist/views/system/config/groups.d.ts +4 -1
- package/dist/views/system/config/groups.js +54 -49
- package/dist/views/system/config/groups.js.map +1 -1
- package/dist/views/system/config/index.vue.js +3 -2
- package/dist/views/system/config/index.vue.js.map +1 -1
- package/dist/views/system/config/index2.vue.js +173 -148
- package/dist/views/system/config/index2.vue.js.map +1 -1
- package/dist/views/system/config/layoutMode.d.ts +23 -0
- package/dist/views/system/config/layoutMode.js +28 -0
- package/dist/views/system/config/layoutMode.js.map +1 -0
- package/dist/views/system/dict/index.vue.js +2 -2
- package/dist/views/system/dict/index2.vue.js +471 -366
- package/dist/views/system/dict/index2.vue.js.map +1 -1
- package/dist/views/system/file/index2.vue.js +91 -76
- package/dist/views/system/file/index2.vue.js.map +1 -1
- package/dist/views/system/job/index.vue.js +3 -3
- package/dist/views/system/job/index2.vue.js +897 -828
- package/dist/views/system/job/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
- package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
- package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
- package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
- package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
- package/dist/views/system/job-log/index.vue.js +2 -2
- package/dist/views/system/job-log/index2.vue.js +193 -207
- package/dist/views/system/job-log/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/runStatus.d.ts +13 -0
- package/dist/views/system/job-log/runStatus.js +26 -0
- package/dist/views/system/job-log/runStatus.js.map +1 -0
- package/dist/views/system/job-monitor/index.vue.js +2 -2
- package/dist/views/system/job-monitor/index2.vue.js +172 -180
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
- package/dist/views/system/log/exception/index.vue.js +2 -2
- package/dist/views/system/log/exception/index2.vue.js +135 -96
- package/dist/views/system/log/exception/index2.vue.js.map +1 -1
- package/dist/views/system/log/login/index2.vue.js +62 -41
- package/dist/views/system/log/login/index2.vue.js.map +1 -1
- package/dist/views/system/log/op/index.vue.js +2 -2
- package/dist/views/system/log/op/index2.vue.js +200 -162
- package/dist/views/system/log/op/index2.vue.js.map +1 -1
- package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
- package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
- package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
- package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
- package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
- package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
- package/dist/views/system/menu/index.vue.js +1 -1
- package/dist/views/system/menu/index2.vue.js +216 -183
- package/dist/views/system/menu/index2.vue.js.map +1 -1
- package/dist/views/system/module/index.vue.js +1 -1
- package/dist/views/system/module/index2.vue.js +177 -144
- package/dist/views/system/module/index2.vue.js.map +1 -1
- package/dist/views/system/monitor/index.vue.js +2 -2
- package/dist/views/system/monitor/index2.vue.js +134 -149
- package/dist/views/system/monitor/index2.vue.js.map +1 -1
- package/dist/views/system/notice/index.vue.js +1 -1
- package/dist/views/system/notice/index2.vue.js +209 -181
- package/dist/views/system/notice/index2.vue.js.map +1 -1
- package/dist/views/system/org/index.vue.js +1 -1
- package/dist/views/system/org/index2.vue.js +278 -248
- package/dist/views/system/org/index2.vue.js.map +1 -1
- package/dist/views/system/position/index.vue.js +5 -2
- package/dist/views/system/position/index.vue.js.map +1 -1
- package/dist/views/system/position/index2.vue.js +128 -92
- package/dist/views/system/position/index2.vue.js.map +1 -1
- package/dist/views/system/recycle/index.vue.js +2 -2
- package/dist/views/system/recycle/index2.vue.js +90 -67
- package/dist/views/system/recycle/index2.vue.js.map +1 -1
- package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
- package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
- package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
- package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
- package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
- package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
- package/dist/views/system/role/components/MatchText.vue.js +8 -0
- package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
- package/dist/views/system/role/components/MatchText2.vue.js +29 -0
- package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
- package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
- package/dist/views/system/role/components/grantMenuGroups.js +110 -48
- package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
- package/dist/views/system/role/index.vue.js +5 -2
- package/dist/views/system/role/index.vue.js.map +1 -1
- package/dist/views/system/role/index2.vue.js +181 -165
- package/dist/views/system/role/index2.vue.js.map +1 -1
- package/dist/views/system/session/index2.vue.js +75 -49
- package/dist/views/system/session/index2.vue.js.map +1 -1
- package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
- package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
- package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
- package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
- package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
- package/dist/views/system/user/index.vue.js +2 -2
- package/dist/views/system/user/index2.vue.js +362 -275
- package/dist/views/system/user/index2.vue.js.map +1 -1
- package/package.json +3 -5
- package/dist/components/SelectTable/index.vue.d.ts +0 -76
- package/dist/components/SelectTable/index2.vue.js +0 -256
- package/dist/components/SelectTable/index2.vue.js.map +0 -1
- package/dist/composables/useTableRowSort.d.ts +0 -20
- package/dist/composables/useTableRowSort.js +0 -59
- package/dist/composables/useTableRowSort.js.map +0 -1
- package/dist/layouts/LayoutModeCards.vue.js +0 -8
- package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
- package/dist/layouts/LayoutModeCards2.vue.js +0 -67
- package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
- package/dist/layouts/SettingRow.vue.d.ts +0 -16
- package/dist/layouts/SettingRow.vue.js +0 -8
- package/dist/layouts/SettingRow.vue.js.map +0 -1
- package/dist/layouts/SettingRow2.vue.js +0 -23
- package/dist/layouts/SettingRow2.vue.js.map +0 -1
- package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
- package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
- package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
- package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
- package/dist/views/login/skins/SplitPanel.vue.d.ts +0 -3
- package/dist/views/login/skins/SplitPanel.vue.js +0 -8
- package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
- package/dist/views/login/skins/SplitPanel2.vue.js +0 -65
- package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
- package/dist/views/login/skins/Spotlight.vue.js +0 -8
- package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
- package/dist/views/login/skins/Spotlight2.vue.js +0 -36
- package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
- package/dist/views/login/skins.d.ts +0 -8
- package/dist/views/login/skins.js +0 -13
- package/dist/views/login/skins.js.map +0 -1
- /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
- /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/WatermarkSection.vue.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsDrawer2.vue.js","sources":["../../src/layouts/SettingsDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n NDrawer,\n NDrawerContent,\n NTabs,\n NTabPane,\n NDivider,\n NRadioGroup,\n NRadioButton,\n NColorPicker,\n NSwitch,\n NSelect,\n NInput,\n NPopconfirm,\n NButton,\n} from 'naive-ui'\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useMessage } from 'naive-ui'\nimport { useWindowSize, useClipboard } from '@vueuse/core'\nimport { useAppStore } from '#/stores/app'\nimport { ACCENTS } from '#/theme/accents'\nimport { runtime } from '#/lib/runtime'\nimport SettingRow from './SettingRow.vue'\nimport LayoutModeCards from './LayoutModeCards.vue'\n\nconst show = defineModel<boolean>('show', { default: false })\nconst app = useAppStore()\nconst { t } = useI18n()\nconst message = useMessage()\nconst { copy, isSupported } = useClipboard()\n// 「复制配置」是给内核开发者改 stores/app.ts 的 DEFAULTS 用的开发期动作,不该出现在终端管理员的设置里——仅开发态显示。\nconst showCopyConfig = isSupported && runtime.dev\n\n// 复制当前外观配置(内核开发者粘回 stores/app.ts 的 DEFAULTS 即为新默认)。\nasync function copyConfig() {\n await copy(JSON.stringify(app.exportSettings(), null, 2))\n message.success(t('settings.configCopied'))\n}\n\n// 窄屏不溢出:抽屉宽度取 min(400, 90vw)。加宽给布局卡片两列留出余量。\nconst { width } = useWindowSize()\nconst drawerWidth = computed(() => Math.min(400, Math.round(width.value * 0.9)))\n\n// computed:t() 一次求值不随语言切换更新,故包 computed 让下拉标签跟随 locale。\nconst transitionOptions = computed(() => [\n { label: t('settings.transitionNone'), value: 'none' },\n { label: t('settings.transitionFade'), value: 'fade' },\n { label: t('settings.transitionFadeSlide'), value: 'fade-slide' },\n])\n</script>\n\n<template>\n <n-drawer v-model:show=\"show\" :width=\"drawerWidth\" placement=\"right\">\n <n-drawer-content :title=\"t('settings.title')\" closable :native-scrollbar=\"false\">\n <n-tabs type=\"segment\" size=\"small\" animated class=\"tabs\">\n <!-- 外观 -->\n <n-tab-pane name=\"appearance\" :tab=\"t('settings.tabAppearance')\">\n <n-divider title-placement=\"left\">{{ t('settings.themeMode') }}</n-divider>\n <n-radio-group v-model:value=\"app.themeScheme\" size=\"small\" class=\"seg\">\n <n-radio-button value=\"light\">\n <Icon icon=\"ph:sun\" class=\"ri\" />\n {{ t('app.light') }}\n </n-radio-button>\n <n-radio-button value=\"dark\">\n <Icon icon=\"ph:moon-stars\" class=\"ri\" />\n {{ t('app.dark') }}\n </n-radio-button>\n <n-radio-button value=\"auto\">\n <Icon icon=\"ph:circle-half\" class=\"ri\" />\n {{ t('settings.auto') }}\n </n-radio-button>\n </n-radio-group>\n\n <n-divider title-placement=\"left\">{{ t('settings.themeColor') }}</n-divider>\n <div class=\"accents\">\n <button\n v-for=\"c in ACCENTS\"\n :key=\"c\"\n type=\"button\"\n class=\"dot\"\n :class=\"{ on: app.accent === c }\"\n :style=\"{ background: c }\"\n :aria-label=\"`${t('settings.themeColor')} ${c}`\"\n :aria-pressed=\"app.accent === c\"\n @click=\"app.setAccent(c)\"\n >\n <Icon v-if=\"app.accent === c\" icon=\"ph:check-bold\" class=\"tick\" />\n </button>\n </div>\n <n-color-picker\n :value=\"app.accent\"\n :modes=\"['hex']\"\n :show-alpha=\"false\"\n :swatches=\"[...ACCENTS]\"\n @update:value=\"app.setAccent\"\n />\n\n <n-divider title-placement=\"left\">{{ t('app.density') }}</n-divider>\n <n-radio-group v-model:value=\"app.density\" size=\"small\" class=\"seg\">\n <n-radio-button value=\"comfortable\">{{ t('app.comfortable') }}</n-radio-button>\n <n-radio-button value=\"compact\">{{ t('app.compact') }}</n-radio-button>\n </n-radio-group>\n </n-tab-pane>\n\n <!-- 布局 -->\n <n-tab-pane name=\"layout\" :tab=\"t('settings.tabLayout')\">\n <n-divider title-placement=\"left\">{{ t('settings.layout') }}</n-divider>\n <LayoutModeCards />\n\n <n-divider title-placement=\"left\">{{ t('settings.interface') }}</n-divider>\n <SettingRow :label=\"t('settings.showBreadcrumb')\">\n <n-switch v-model:value=\"app.showBreadcrumb\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('settings.showTabs')\">\n <n-switch v-model:value=\"app.showTabs\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('settings.fixedHeader')\">\n <n-switch v-model:value=\"app.fixedHeader\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('settings.pageTransition')\">\n <n-select\n v-model:value=\"app.pageTransition\"\n :options=\"transitionOptions\"\n size=\"small\"\n style=\"width: 120px\"\n />\n </SettingRow>\n <SettingRow :label=\"t('settings.grayscale')\">\n <n-switch v-model:value=\"app.grayscale\" size=\"small\" />\n </SettingRow>\n <SettingRow :label=\"t('app.collapse')\">\n <n-switch v-model:value=\"app.collapsed\" size=\"small\" />\n </SettingRow>\n </n-tab-pane>\n\n <!-- 通用 -->\n <n-tab-pane name=\"general\" :tab=\"t('settings.tabGeneral')\">\n <n-divider title-placement=\"left\">{{ t('settings.watermark') }}</n-divider>\n <SettingRow :label=\"t('settings.watermark')\">\n <n-switch v-model:value=\"app.watermark\" size=\"small\" />\n </SettingRow>\n <SettingRow v-if=\"app.watermark\" :label=\"t('settings.watermarkText')\">\n <n-input\n v-model:value=\"app.watermarkText\"\n size=\"small\"\n :placeholder=\"t('settings.watermarkPlaceholder')\"\n style=\"width: 140px\"\n />\n </SettingRow>\n\n <n-divider title-placement=\"left\">{{ t('settings.formStyle') }}</n-divider>\n <!-- FormContainer 全局形态:所有 CRUD 表单弹层一键在弹窗/抽屉间切换 -->\n <n-radio-group v-model:value=\"app.formStyle\" size=\"small\" class=\"seg\">\n <n-radio-button value=\"modal\">{{ t('settings.formStyleModal') }}</n-radio-button>\n <n-radio-button value=\"drawer\">{{ t('settings.formStyleDrawer') }}</n-radio-button>\n </n-radio-group>\n </n-tab-pane>\n </n-tabs>\n\n <template #footer>\n <div class=\"footer-actions\">\n <n-button v-if=\"showCopyConfig\" block tertiary @click=\"copyConfig\">\n <Icon icon=\"ph:clipboard-text\" class=\"ri\" />\n {{ t('settings.copyConfig') }}\n </n-button>\n <n-popconfirm @positive-click=\"app.resetSettings()\">\n <template #trigger>\n <n-button block secondary>\n <Icon icon=\"ph:arrow-counter-clockwise\" class=\"ri\" />\n {{ t('common.reset') }}\n </n-button>\n </template>\n {{ t('settings.resetConfirm') }}\n </n-popconfirm>\n </div>\n </template>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.tabs {\n height: 100%;\n}\n.footer-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n}\n.ri {\n margin-right: 5px;\n font-size: 15px;\n}\n\n/* 满宽三等分分段控件(主题模式 / 密度) */\n.seg {\n display: flex;\n width: 100%;\n}\n.seg :deep(.n-radio-button) {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* 精致色板 */\n.accents {\n display: grid;\n grid-template-columns: repeat(6, 1fr);\n gap: 10px;\n margin-bottom: 12px;\n}\n.dot {\n position: relative;\n width: 100%;\n max-width: 30px;\n margin: 0 auto;\n aspect-ratio: 1;\n padding: 0;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.08);\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n transform 0.15s ease,\n box-shadow 0.15s ease;\n}\n.dot:hover {\n transform: scale(1.12);\n}\n.dot.on {\n transform: scale(1.1);\n box-shadow:\n 0 0 0 2px var(--color-bg-container),\n 0 0 0 4px var(--color-primary);\n}\n.tick {\n color: #fff;\n font-size: 14px;\n filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.35));\n}\n</style>\n"],"names":["show","_useModel","__props","app","useAppStore","t","useI18n","message","useMessage","copy","isSupported","useClipboard","showCopyConfig","runtime","copyConfig","width","useWindowSize","drawerWidth","computed","transitionOptions","_createBlock","_unref","NDrawer","$event","_createVNode","NDrawerContent","_createElementVNode","_hoisted_3","NButton","Icon","_createTextVNode","NPopconfirm","_cache","NTabs","NTabPane","NDivider","NRadioGroup","NRadioButton","_hoisted_1","_createElementBlock","_Fragment","_renderList","ACCENTS","c","NColorPicker","LayoutModeCards","SettingRow","NSwitch","NSelect","NInput"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsDrawer2.vue.js","sources":["../../src/layouts/SettingsDrawer.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 外观抽屉:外观模式 / 强调色 / 密度 / 布局(下拉) / 界面,一页滚完,不分页签——\n// 页签里套分段控件(外观模式本身就是分段控件)是两层同形的东西叠在一起。\n// 模式 / 页内切换用 NTabs type=\"segment\"(轨道 + 滑块,和 macOS 的外观切换同一种控件),\n// 不用 NRadioGroup + NRadioButton(那是描边按钮组,只用在筛选类取值上)。\nimport {\n NDrawer,\n NDrawerContent,\n NTabs,\n NTab,\n NList,\n NListItem,\n NSwitch,\n NSelect,\n NPopconfirm,\n NButton,\n} from 'naive-ui'\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport { useMessage } from 'naive-ui'\nimport { useClipboard } from '@vueuse/core'\nimport { useAppStore, LAYOUT_MODES, type LayoutMode } from '#/stores/app'\nimport { runtime } from '#/lib/runtime'\nimport AccentPicker from './AccentPicker.vue'\n\nconst show = defineModel<boolean>('show', { default: false })\nconst app = useAppStore()\nconst { t } = useI18n()\nconst message = useMessage()\nconst { copy, isSupported } = useClipboard()\n// 「复制配置」是给内核开发者改 stores/app.ts 的 DEFAULTS 用的开发期动作,不该出现在终端管理员的设置里——仅开发态显示。\nconst showCopyConfig = isSupported && runtime.dev\n\n// 复制当前外观配置(内核开发者粘回 stores/app.ts 的 DEFAULTS 即为新默认)。\nasync function copyConfig() {\n await copy(JSON.stringify(app.exportSettings(), null, 2))\n message.success(t('settings.configCopied'))\n}\n\n// 布局:下拉选六种 layoutMode,六种变体一个都不能少。\n// 标签键由模式名派生:vertical-mix → settings.layoutVerticalMix。\nconst layoutOptions = computed(() =>\n LAYOUT_MODES.map(m => ({\n label: t(\n 'settings.layout' +\n m\n .split('-')\n .map(w => w[0]!.toUpperCase() + w.slice(1))\n .join(''),\n ),\n value: m,\n })),\n)\n\n// computed:t() 一次求值不随语言切换更新,故包 computed 让下拉标签跟随 locale。\nconst transitionOptions = computed(() => [\n { label: t('settings.transitionNone'), value: 'none' },\n { label: t('settings.transitionFade'), value: 'fade' },\n { label: t('settings.transitionFadeSlide'), value: 'fade-slide' },\n])\n</script>\n\n<template>\n <n-drawer v-model:show=\"show\" width=\"min(360px, 100vw)\" placement=\"right\">\n <n-drawer-content :title=\"t('app.appearance')\" closable :native-scrollbar=\"false\">\n <div class=\"section-title first\">{{ t('settings.themeMode') }}</div>\n <n-tabs v-model:value=\"app.themeScheme\" type=\"segment\">\n <n-tab name=\"light\">{{ t('app.light') }}</n-tab>\n <n-tab name=\"dark\">{{ t('app.dark') }}</n-tab>\n <n-tab name=\"auto\">{{ t('settings.auto') }}</n-tab>\n </n-tabs>\n\n <div class=\"section-title\">{{ t('settings.themeColor') }}</div>\n <AccentPicker />\n\n <div class=\"section-title\">{{ t('app.density') }}</div>\n <n-tabs v-model:value=\"app.density\" type=\"segment\">\n <n-tab name=\"comfortable\">{{ t('app.comfortable') }}</n-tab>\n <n-tab name=\"compact\">{{ t('app.compact') }}</n-tab>\n </n-tabs>\n\n <div class=\"section-title\">{{ t('settings.layout') }}</div>\n <n-select\n :value=\"app.layoutMode\"\n :options=\"layoutOptions\"\n @update:value=\"(v: LayoutMode) => app.setLayoutMode(v)\"\n />\n\n <div class=\"section-title\">{{ t('settings.formStyle') }}</div>\n <!-- FormContainer 全局形态:所有 CRUD 表单一键在弹窗 / 抽屉间切换(个别页面按实例写死的除外) -->\n <n-tabs v-model:value=\"app.formStyle\" type=\"segment\">\n <n-tab name=\"modal\">{{ t('settings.formStyleModal') }}</n-tab>\n <n-tab name=\"drawer\">{{ t('settings.formStyleDrawer') }}</n-tab>\n </n-tabs>\n\n <div class=\"section-title\">{{ t('settings.interface') }}</div>\n <n-list class=\"set-group\" hoverable :bordered=\"false\" :show-divider=\"false\">\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:caret-double-right\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.showBreadcrumb') }}</b>\n <span>{{ t('settings.descBreadcrumb') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.showBreadcrumb\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:browsers\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.showTabs') }}</b>\n <span>{{ t('settings.descTabs') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.showTabs\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:push-pin\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.fixedHeader') }}</b>\n <span>{{ t('settings.descFixedHeader') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.fixedHeader\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:sidebar-simple\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('app.collapse') }}</b>\n <span>{{ t('settings.descCollapse') }}</span>\n </div>\n <template #suffix><n-switch v-model:value=\"app.collapsed\" size=\"small\" /></template>\n </n-list-item>\n <n-list-item>\n <template #prefix>\n <div class=\"sym\"><Icon icon=\"ph:sparkle\" :width=\"15\" /></div>\n </template>\n <div class=\"txt\">\n <b>{{ t('settings.pageTransition') }}</b>\n <span>{{ t('settings.descPageTransition') }}</span>\n </div>\n <template #suffix>\n <n-select\n v-model:value=\"app.pageTransition\"\n :options=\"transitionOptions\"\n size=\"small\"\n class=\"sel\"\n />\n </template>\n </n-list-item>\n </n-list>\n\n <template #footer>\n <div class=\"footer-actions\">\n <n-button v-if=\"showCopyConfig\" block secondary @click=\"copyConfig\">\n <template #icon><Icon icon=\"ph:clipboard-text\" :width=\"16\" /></template>\n {{ t('settings.copyConfig') }}\n </n-button>\n <n-popconfirm @positive-click=\"app.resetSettings()\">\n <template #trigger>\n <n-button block secondary>\n <template #icon><Icon icon=\"ph:arrow-counter-clockwise\" :width=\"16\" /></template>\n {{ t('common.reset') }}\n </n-button>\n </template>\n {{ t('settings.resetConfirm') }}\n </n-popconfirm>\n </div>\n </template>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<style scoped>\n.footer-actions {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n}\n\n/* 分节标题走正文字体、正常字距:等宽 + 大写 + 宽字距是只对拉丁字母成立的手法,落在汉字上会把「界面」撑成「界 面」 */\n.section-title {\n margin: 22px 0 8px 4px;\n font-size: var(--font-size-base);\n font-weight: 500;\n letter-spacing: -0.01em;\n color: var(--text-3);\n}\n.section-title.first {\n margin-top: 0;\n}\n\n/* 设置组:不用 NCard embedded(那块平灰底和整站玻璃语言无关,四行加粗标签配四个同权开关像一张通用设置表)。\n 玻璃底 + 行首单色图标 + 标题下一行说明把权重压开。分隔线关掉 NList 自带的通栏 show-divider,\n 自己从文字起始处起、右边留白地画,悬停时淡出——macOS 系统设置的做法。 */\n.set-group.n-list {\n border-radius: 14px;\n background: var(--glass);\n box-shadow:\n inset 0 0 0 1px var(--hairline),\n inset 0 1px 0 var(--edge-light);\n}\n.set-group :deep(.n-list-item) {\n position: relative;\n padding: 10px 12px !important;\n border-radius: var(--radius-lg);\n}\n.set-group :deep(.n-list-item + .n-list-item::before) {\n content: '';\n position: absolute;\n left: 52px;\n right: 12px;\n top: 0;\n height: 1px;\n background: var(--separator);\n transition: opacity var(--transition-fast);\n}\n.set-group :deep(.n-list-item:hover::before),\n.set-group :deep(.n-list-item:hover + .n-list-item::before) {\n opacity: 0;\n}\n.sym {\n display: grid;\n place-items: center;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n border-radius: var(--radius-sm);\n background: var(--glass-strong);\n color: var(--text-1);\n box-shadow:\n inset 0 0 0 1px var(--hairline),\n inset 0 1px 0 var(--edge-light);\n}\n.txt b {\n display: block;\n font-size: var(--font-size-md);\n font-weight: 500;\n line-height: 1.3;\n}\n.txt span {\n display: block;\n margin-top: 2px;\n font-size: var(--font-size-sm);\n line-height: 1.4;\n color: var(--text-3);\n}\n.sel {\n width: 112px;\n}\n</style>\n"],"names":["show","_useModel","__props","app","useAppStore","t","useI18n","message","useMessage","copy","isSupported","useClipboard","showCopyConfig","runtime","copyConfig","layoutOptions","computed","LAYOUT_MODES","w","transitionOptions","_createBlock","_unref","NDrawer","$event","_createVNode","NDrawerContent","_createElementVNode","_hoisted_17","NButton","Icon","_createTextVNode","NPopconfirm","_cache","_hoisted_1","_toDisplayString","NTabs","NTab","_hoisted_2","AccentPicker","_hoisted_3","_hoisted_4","NSelect","v","_hoisted_5","_hoisted_6","NList","NListItem","_hoisted_7","NSwitch","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./TabsBar2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import a from "../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const
|
|
4
|
+
const f = /* @__PURE__ */ a(o, [["__scopeId", "data-v-06aee79f"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
f as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=TabsBar.vue.js.map
|
|
@@ -1,40 +1,41 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { useRoute as
|
|
3
|
-
import {
|
|
4
|
-
import { Icon as
|
|
5
|
-
import
|
|
6
|
-
import { useI18n as
|
|
7
|
-
import { useTabsStore as
|
|
8
|
-
import { translateMenuTitle as
|
|
9
|
-
|
|
1
|
+
import { defineComponent as D, computed as B, ref as c, watch as N, nextTick as S, onMounted as V, onBeforeUnmount as Y, openBlock as h, createElementBlock as x, createElementVNode as M, normalizeClass as L, createVNode as z, TransitionGroup as X, withCtx as F, Fragment as q, renderList as G, unref as a, withModifiers as u, withKeys as v, createBlock as w, createCommentVNode as E, toDisplayString as U, h as j } from "vue";
|
|
2
|
+
import { useRoute as H, useRouter as J } from "vue-router";
|
|
3
|
+
import { NDropdown as Q } from "naive-ui";
|
|
4
|
+
import { Icon as k } from "@iconify/vue";
|
|
5
|
+
import Z from "../components/AppIcon.vue.js";
|
|
6
|
+
import { useI18n as ee } from "vue-i18n";
|
|
7
|
+
import { useTabsStore as te } from "../stores/tabs.js";
|
|
8
|
+
import { translateMenuTitle as ne } from "../locales/menuTitle.js";
|
|
9
|
+
import { lineIcon as oe } from "../utils/menuIcon.js";
|
|
10
|
+
const le = { class: "tabsbar" }, ae = ["title", "onClick", "onKeydown", "onContextmenu", "onAuxclick"], se = { class: "chip-label" }, me = /* @__PURE__ */ D({
|
|
10
11
|
__name: "TabsBar",
|
|
11
|
-
setup(
|
|
12
|
-
const
|
|
13
|
-
function
|
|
14
|
-
return
|
|
12
|
+
setup(ie) {
|
|
13
|
+
const o = te(), y = H(), I = J(), { t: s } = ee(), C = B(() => y.path), i = c();
|
|
14
|
+
function g(e) {
|
|
15
|
+
return ne(e.title, e.path);
|
|
15
16
|
}
|
|
16
17
|
function b(e) {
|
|
17
|
-
e.path !==
|
|
18
|
+
e.path !== y.path && I.push(e.fullPath);
|
|
18
19
|
}
|
|
19
20
|
function r(e) {
|
|
20
|
-
return () =>
|
|
21
|
+
return () => j(k, { icon: e, width: 16 });
|
|
21
22
|
}
|
|
22
|
-
const
|
|
23
|
-
var e, t,
|
|
23
|
+
const d = c(!1), T = c(0), _ = c(0), p = c(), K = B(() => {
|
|
24
|
+
var e, t, n, l;
|
|
24
25
|
return [
|
|
25
26
|
{ label: s("tabs.refresh"), key: "refresh", icon: r("ph:arrow-clockwise") },
|
|
26
27
|
// 应用首页(affix)恒固定,不提供固定/取消项;其余标签可用户手动固定。
|
|
27
28
|
{
|
|
28
|
-
label: (e =
|
|
29
|
+
label: (e = p.value) != null && e.pinned ? s("tabs.unpin") : s("tabs.pin"),
|
|
29
30
|
key: "pin",
|
|
30
31
|
icon: r("ph:push-pin"),
|
|
31
|
-
disabled: (t =
|
|
32
|
+
disabled: (t = p.value) == null ? void 0 : t.affix
|
|
32
33
|
},
|
|
33
34
|
{
|
|
34
35
|
label: s("tabs.close"),
|
|
35
36
|
key: "close",
|
|
36
37
|
icon: r("ph:x"),
|
|
37
|
-
disabled: ((
|
|
38
|
+
disabled: ((n = p.value) == null ? void 0 : n.affix) || ((l = p.value) == null ? void 0 : l.pinned)
|
|
38
39
|
},
|
|
39
40
|
{ label: s("tabs.closeOthers"), key: "others", icon: r("ph:arrows-in-line-horizontal") },
|
|
40
41
|
{ label: s("tabs.closeLeft"), key: "left", icon: r("ph:arrow-line-left") },
|
|
@@ -42,59 +43,84 @@ const J = { class: "tabsbar" }, Q = ["onClick", "onKeydown", "onContextmenu", "o
|
|
|
42
43
|
{ label: s("tabs.closeAll"), key: "all", icon: r("ph:list-dashes") }
|
|
43
44
|
];
|
|
44
45
|
});
|
|
45
|
-
function
|
|
46
|
-
e.preventDefault(),
|
|
47
|
-
|
|
46
|
+
function O(e, t) {
|
|
47
|
+
e.preventDefault(), p.value = t, d.value = !1, S(() => {
|
|
48
|
+
T.value = e.clientX, _.value = e.clientY, d.value = !0;
|
|
48
49
|
});
|
|
49
50
|
}
|
|
50
|
-
function
|
|
51
|
-
|
|
52
|
-
const t =
|
|
53
|
-
t && (e === "refresh" ?
|
|
51
|
+
function P(e) {
|
|
52
|
+
d.value = !1;
|
|
53
|
+
const t = p.value;
|
|
54
|
+
t && (e === "refresh" ? o.refreshTab(t.name) : e === "pin" ? o.togglePin(t.path) : e === "close" ? o.removeTab(t.path) : e === "others" ? o.closeOthers(t.path) : e === "left" ? o.closeLeft(t.path) : e === "right" ? o.closeRight(t.path) : e === "all" && o.closeAll());
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
N(C, () => {
|
|
57
|
+
S(
|
|
57
58
|
() => {
|
|
58
59
|
var e, t;
|
|
59
|
-
return (t = (e =
|
|
60
|
+
return (t = (e = i.value) == null ? void 0 : e.querySelector(".chip.active")) == null ? void 0 : t.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
60
61
|
}
|
|
61
62
|
);
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
63
|
+
});
|
|
64
|
+
const $ = c(!1), R = c(!1);
|
|
65
|
+
function m() {
|
|
66
|
+
const e = i.value;
|
|
67
|
+
e && ($.value = e.scrollLeft > 1, R.value = e.scrollLeft + e.clientWidth < e.scrollWidth - 1);
|
|
68
|
+
}
|
|
69
|
+
function W(e) {
|
|
70
|
+
const t = i.value;
|
|
71
|
+
!t || t.scrollWidth <= t.clientWidth || Math.abs(e.deltaY) <= Math.abs(e.deltaX) || (e.preventDefault(), t.scrollBy({ left: e.deltaY, behavior: "instant" }));
|
|
72
|
+
}
|
|
73
|
+
function A(e) {
|
|
74
|
+
e.style.setProperty("--chip-w", `${e.getBoundingClientRect().width}px`);
|
|
75
|
+
}
|
|
76
|
+
let f;
|
|
77
|
+
return V(() => {
|
|
78
|
+
var e;
|
|
79
|
+
m(), !(typeof ResizeObserver > "u") && (f = new ResizeObserver(m), i.value && f.observe(i.value), (e = i.value) != null && e.firstElementChild && f.observe(i.value.firstElementChild));
|
|
80
|
+
}), Y(() => f == null ? void 0 : f.disconnect()), (e, t) => (h(), x("div", le, [
|
|
81
|
+
M("div", {
|
|
82
|
+
ref_key: "scrollerRef",
|
|
83
|
+
ref: i,
|
|
84
|
+
class: L(["scroller", { "fade-start": $.value, "fade-end": R.value }]),
|
|
85
|
+
onScrollPassive: m,
|
|
86
|
+
onWheel: W
|
|
87
|
+
}, [
|
|
88
|
+
z(X, {
|
|
89
|
+
tag: "div",
|
|
90
|
+
name: "chip",
|
|
91
|
+
class: "strip",
|
|
92
|
+
onBeforeLeave: A
|
|
93
|
+
}, {
|
|
94
|
+
default: F(() => [
|
|
95
|
+
(h(!0), x(q, null, G(a(o).tabs, (n) => (h(), x("div", {
|
|
96
|
+
key: n.path,
|
|
97
|
+
class: L(["chip", { active: n.path === C.value, "chip--fixed": n.affix || n.pinned }]),
|
|
98
|
+
title: g(n),
|
|
73
99
|
role: "button",
|
|
74
100
|
tabindex: "0",
|
|
75
|
-
onClick: (l) => b(
|
|
101
|
+
onClick: (l) => b(n),
|
|
76
102
|
onKeydown: [
|
|
77
|
-
|
|
78
|
-
|
|
103
|
+
v((l) => b(n), ["enter"]),
|
|
104
|
+
v(u((l) => b(n), ["prevent"]), ["space"])
|
|
79
105
|
],
|
|
80
|
-
onContextmenu: (l) =>
|
|
81
|
-
onMousedown: t[
|
|
106
|
+
onContextmenu: (l) => O(l, n),
|
|
107
|
+
onMousedown: t[1] || (t[1] = u(() => {
|
|
82
108
|
}, ["middle", "prevent"])),
|
|
83
|
-
onAuxclick:
|
|
109
|
+
onAuxclick: u((l) => a(o).removeTab(n.path), ["middle", "prevent"])
|
|
84
110
|
}, [
|
|
85
|
-
|
|
111
|
+
n.icon ? (h(), w(Z, {
|
|
86
112
|
key: 0,
|
|
87
|
-
icon:
|
|
113
|
+
icon: a(oe)(n.icon),
|
|
88
114
|
size: 15,
|
|
89
115
|
class: "chip-icon"
|
|
90
|
-
}, null, 8, ["icon"])) :
|
|
91
|
-
|
|
92
|
-
|
|
116
|
+
}, null, 8, ["icon"])) : E("", !0),
|
|
117
|
+
M("span", se, U(g(n)), 1),
|
|
118
|
+
n.pinned ? (h(), w(a(k), {
|
|
93
119
|
key: 1,
|
|
94
120
|
icon: "ph:push-pin-fill",
|
|
95
121
|
width: 12,
|
|
96
122
|
class: "chip-pin"
|
|
97
|
-
})) :
|
|
123
|
+
})) : n.affix ? E("", !0) : (h(), w(a(k), {
|
|
98
124
|
key: 2,
|
|
99
125
|
icon: "ph:x",
|
|
100
126
|
width: 13,
|
|
@@ -102,31 +128,33 @@ const J = { class: "tabsbar" }, Q = ["onClick", "onKeydown", "onContextmenu", "o
|
|
|
102
128
|
role: "button",
|
|
103
129
|
tabindex: "0",
|
|
104
130
|
"aria-label": a(s)("tabs.close"),
|
|
105
|
-
|
|
131
|
+
onMousedown: t[0] || (t[0] = u(() => {
|
|
132
|
+
}, ["prevent"])),
|
|
133
|
+
onClick: u((l) => a(o).removeTab(n.path), ["stop"]),
|
|
106
134
|
onKeydown: [
|
|
107
|
-
|
|
108
|
-
|
|
135
|
+
v(u((l) => a(o).removeTab(n.path), ["stop"]), ["enter"]),
|
|
136
|
+
v(u((l) => a(o).removeTab(n.path), ["stop", "prevent"]), ["space"])
|
|
109
137
|
]
|
|
110
138
|
}, null, 8, ["aria-label", "onClick", "onKeydown"]))
|
|
111
|
-
], 42,
|
|
112
|
-
],
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
139
|
+
], 42, ae))), 128))
|
|
140
|
+
]),
|
|
141
|
+
_: 1
|
|
142
|
+
})
|
|
143
|
+
], 34),
|
|
144
|
+
z(a(Q), {
|
|
117
145
|
trigger: "manual",
|
|
118
146
|
placement: "bottom-start",
|
|
119
|
-
show:
|
|
120
|
-
x:
|
|
121
|
-
y:
|
|
122
|
-
options:
|
|
123
|
-
onSelect:
|
|
124
|
-
onClickoutside: t[
|
|
147
|
+
show: d.value,
|
|
148
|
+
x: T.value,
|
|
149
|
+
y: _.value,
|
|
150
|
+
options: K.value,
|
|
151
|
+
onSelect: P,
|
|
152
|
+
onClickoutside: t[2] || (t[2] = (n) => d.value = !1)
|
|
125
153
|
}, null, 8, ["show", "x", "y", "options"])
|
|
126
154
|
]));
|
|
127
155
|
}
|
|
128
156
|
});
|
|
129
157
|
export {
|
|
130
|
-
|
|
158
|
+
me as default
|
|
131
159
|
};
|
|
132
160
|
//# sourceMappingURL=TabsBar2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsBar2.vue.js","sources":["../../src/layouts/TabsBar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { NDropdown, NScrollbar, type DropdownOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useTabsStore, type TabItem } from '#/stores/tabs'\nimport { translateMenuTitle } from '#/locales/menuTitle'\n\nconst tabs = useTabsStore()\nconst route = useRoute()\nconst router = useRouter()\nconst { t } = useI18n()\n\nconst activePath = computed(() => route.path)\nconst stripRef = ref<HTMLElement>()\n\nfunction tabTitle(item: TabItem) {\n return translateMenuTitle(item.title, item.path)\n}\nfunction onClick(item: TabItem) {\n if (item.path !== route.path) router.push(item.fullPath)\n}\n\nfunction renderIcon(name: string) {\n return () => h(Icon, { icon: name, width: 16 })\n}\n\nconst ctxShow = ref(false)\nconst ctxX = ref(0)\nconst ctxY = ref(0)\nconst ctxTab = ref<TabItem>()\nconst ctxOptions = computed<DropdownOption[]>(() => [\n { label: t('tabs.refresh'), key: 'refresh', icon: renderIcon('ph:arrow-clockwise') },\n // 应用首页(affix)恒固定,不提供固定/取消项;其余标签可用户手动固定。\n {\n label: ctxTab.value?.pinned ? t('tabs.unpin') : t('tabs.pin'),\n key: 'pin',\n icon: renderIcon('ph:push-pin'),\n disabled: ctxTab.value?.affix,\n },\n {\n label: t('tabs.close'),\n key: 'close',\n icon: renderIcon('ph:x'),\n disabled: ctxTab.value?.affix || ctxTab.value?.pinned,\n },\n { label: t('tabs.closeOthers'), key: 'others', icon: renderIcon('ph:arrows-in-line-horizontal') },\n { label: t('tabs.closeLeft'), key: 'left', icon: renderIcon('ph:arrow-line-left') },\n { label: t('tabs.closeRight'), key: 'right', icon: renderIcon('ph:arrow-line-right') },\n { label: t('tabs.closeAll'), key: 'all', icon: renderIcon('ph:list-dashes') },\n])\n\nfunction onContext(e: MouseEvent, item: TabItem) {\n e.preventDefault()\n ctxTab.value = item\n // 先关再于 nextTick 重开:菜单已展开时右键切到别的标签,只改坐标 NDropdown 不会重定位。\n ctxShow.value = false\n nextTick(() => {\n ctxX.value = e.clientX\n ctxY.value = e.clientY\n ctxShow.value = true\n })\n}\nfunction onCtxSelect(key: string) {\n ctxShow.value = false\n const tab = ctxTab.value\n if (!tab) return\n if (key === 'refresh') tabs.refreshTab(tab.name)\n else if (key === 'pin') tabs.togglePin(tab.path)\n else if (key === 'close') tabs.removeTab(tab.path)\n else if (key === 'others') tabs.closeOthers(tab.path)\n else if (key === 'left') tabs.closeLeft(tab.path)\n else if (key === 'right') tabs.closeRight(tab.path)\n else if (key === 'all') tabs.closeAll()\n}\n\n// 激活标签滚入视野\nwatch(activePath, () => {\n nextTick(() =>\n stripRef.value\n ?.querySelector('.chip.active')\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' }),\n )\n})\n</script>\n\n<template>\n <div class=\"tabsbar\">\n <n-scrollbar x-scrollable>\n <div ref=\"stripRef\" class=\"strip\">\n <!-- chip 与关闭 X 均为可点非按钮元素:补 role/tabindex/键盘激活,键盘用户也能切换/关闭标签(右键菜单是鼠标专属) -->\n <div\n v-for=\"item in tabs.tabs\"\n :key=\"item.path\"\n class=\"chip\"\n :class=\"{ active: item.path === activePath }\"\n role=\"button\"\n tabindex=\"0\"\n @click=\"onClick(item)\"\n @keydown.enter=\"onClick(item)\"\n @keydown.space.prevent=\"onClick(item)\"\n @contextmenu=\"onContext($event, item)\"\n @mousedown.middle.prevent\n @auxclick.middle.prevent=\"tabs.removeTab(item.path)\"\n >\n <!-- 标签图标沿用菜单元数据,可能不在离线子集内 → 走 AppIcon 的懒加载兜底 -->\n <AppIcon v-if=\"item.icon\" :icon=\"item.icon\" :size=\"15\" class=\"chip-icon\" />\n <span class=\"chip-label\">{{ tabTitle(item) }}</span>\n <!-- 固定标签(用户 pin)显示图钉、不显示关闭 X;应用首页 affix 两者都不显示 -->\n <Icon v-if=\"item.pinned\" icon=\"ph:push-pin-fill\" :width=\"12\" class=\"chip-pin\" />\n <Icon\n v-else-if=\"!item.affix\"\n icon=\"ph:x\"\n :width=\"13\"\n class=\"chip-close\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('tabs.close')\"\n @click.stop=\"tabs.removeTab(item.path)\"\n @keydown.enter.stop=\"tabs.removeTab(item.path)\"\n @keydown.space.stop.prevent=\"tabs.removeTab(item.path)\"\n />\n </div>\n </div>\n </n-scrollbar>\n <n-dropdown\n trigger=\"manual\"\n placement=\"bottom-start\"\n :show=\"ctxShow\"\n :x=\"ctxX\"\n :y=\"ctxY\"\n :options=\"ctxOptions\"\n @select=\"onCtxSelect\"\n @clickoutside=\"ctxShow = false\"\n />\n </div>\n</template>\n\n<style scoped>\n.tabsbar {\n height: 42px;\n display: flex;\n align-items: center;\n padding: 0 8px;\n background: var(--color-bg-container);\n border-bottom: 1px solid var(--color-border);\n}\n.strip {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 5px 0;\n}\n.chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 30px;\n padding: 0 10px;\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-fill);\n color: var(--color-text-secondary);\n font-size: var(--font-size-sm);\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n color 0.15s,\n background 0.15s,\n border-color 0.15s;\n}\n.chip:hover {\n color: var(--color-text-primary);\n}\n.chip.active {\n background: var(--color-primary-light);\n border-color: var(--color-primary);\n color: var(--color-primary);\n}\n.chip:focus-visible,\n.chip-close:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 1px;\n}\n.chip-pin {\n opacity: 0.7;\n}\n.chip-close {\n border-radius: 50%;\n opacity: 0.6;\n}\n.chip-close:hover {\n opacity: 1;\n background: var(--color-fill);\n}\n</style>\n"],"names":["tabs","useTabsStore","route","useRoute","router","useRouter","t","useI18n","activePath","computed","stripRef","ref","tabTitle","item","translateMenuTitle","onClick","renderIcon","name","h","Icon","ctxShow","ctxX","ctxY","ctxTab","ctxOptions","_a","_b","_c","_d","onContext","nextTick","onCtxSelect","key","tab","watch","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NScrollbar","_createElementVNode","_Fragment","_renderList","$event","_withKeys","_withModifiers","_createBlock","AppIcon","_hoisted_3","_toDisplayString","NDropdown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TabsBar2.vue.js","sources":["../../src/layouts/TabsBar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport { NDropdown, type DropdownOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport AppIcon from '#/components/AppIcon.vue'\nimport { useI18n } from 'vue-i18n'\nimport { useTabsStore, type TabItem } from '#/stores/tabs'\nimport { translateMenuTitle } from '#/locales/menuTitle'\nimport { lineIcon } from '#/utils/menuIcon'\n\nconst tabs = useTabsStore()\nconst route = useRoute()\nconst router = useRouter()\nconst { t } = useI18n()\n\nconst activePath = computed(() => route.path)\nconst scrollerRef = ref<HTMLElement>()\n\nfunction tabTitle(item: TabItem) {\n return translateMenuTitle(item.title, item.path)\n}\nfunction onClick(item: TabItem) {\n if (item.path !== route.path) router.push(item.fullPath)\n}\n\nfunction renderIcon(name: string) {\n return () => h(Icon, { icon: name, width: 16 })\n}\n\nconst ctxShow = ref(false)\nconst ctxX = ref(0)\nconst ctxY = ref(0)\nconst ctxTab = ref<TabItem>()\nconst ctxOptions = computed<DropdownOption[]>(() => [\n { label: t('tabs.refresh'), key: 'refresh', icon: renderIcon('ph:arrow-clockwise') },\n // 应用首页(affix)恒固定,不提供固定/取消项;其余标签可用户手动固定。\n {\n label: ctxTab.value?.pinned ? t('tabs.unpin') : t('tabs.pin'),\n key: 'pin',\n icon: renderIcon('ph:push-pin'),\n disabled: ctxTab.value?.affix,\n },\n {\n label: t('tabs.close'),\n key: 'close',\n icon: renderIcon('ph:x'),\n disabled: ctxTab.value?.affix || ctxTab.value?.pinned,\n },\n { label: t('tabs.closeOthers'), key: 'others', icon: renderIcon('ph:arrows-in-line-horizontal') },\n { label: t('tabs.closeLeft'), key: 'left', icon: renderIcon('ph:arrow-line-left') },\n { label: t('tabs.closeRight'), key: 'right', icon: renderIcon('ph:arrow-line-right') },\n { label: t('tabs.closeAll'), key: 'all', icon: renderIcon('ph:list-dashes') },\n])\n\nfunction onContext(e: MouseEvent, item: TabItem) {\n e.preventDefault()\n ctxTab.value = item\n // 先关再于 nextTick 重开:菜单已展开时右键切到别的标签,只改坐标 NDropdown 不会重定位。\n ctxShow.value = false\n nextTick(() => {\n ctxX.value = e.clientX\n ctxY.value = e.clientY\n ctxShow.value = true\n })\n}\nfunction onCtxSelect(key: string) {\n ctxShow.value = false\n const tab = ctxTab.value\n if (!tab) return\n if (key === 'refresh') tabs.refreshTab(tab.name)\n else if (key === 'pin') tabs.togglePin(tab.path)\n else if (key === 'close') tabs.removeTab(tab.path)\n else if (key === 'others') tabs.closeOthers(tab.path)\n else if (key === 'left') tabs.closeLeft(tab.path)\n else if (key === 'right') tabs.closeRight(tab.path)\n else if (key === 'all') tabs.closeAll()\n}\n\n// 激活标签滚入视野\nwatch(activePath, () => {\n nextTick(() =>\n scrollerRef.value\n ?.querySelector('.chip.active')\n ?.scrollIntoView({ block: 'nearest', inline: 'nearest' }),\n )\n})\n\n// 页签溢出时两端各 18px 柔和渐隐(没有硬边):量滚动容器,哪一端还有内容就渐隐哪一端。\n// 滚动容器就是 scrollerRef 本身(原生滚动、滚动条隐藏:macOS 的滚动条是 overlay,静止时不可见)。\nconst fadeStart = ref(false)\nconst fadeEnd = ref(false)\nfunction measureFade() {\n const c = scrollerRef.value\n if (!c) return\n fadeStart.value = c.scrollLeft > 1\n fadeEnd.value = c.scrollLeft + c.clientWidth < c.scrollWidth - 1\n}\n// 没有滚动条可拖,鼠标滚轮的竖向滚动转成横向(触控板的横向手势 deltaX 浏览器自己处理)。\n// 没有溢出时不接管,免得吞掉本该给页面的滚轮。\nfunction onWheel(e: WheelEvent) {\n const c = scrollerRef.value\n if (!c || c.scrollWidth <= c.clientWidth || Math.abs(e.deltaY) <= Math.abs(e.deltaX)) return\n e.preventDefault()\n c.scrollBy({ left: e.deltaY, behavior: 'instant' })\n}\n\n// 关页签:宽度收拢 + 淡出,右边的页签随之滑过来(Safari 关标签的做法)。\n// 收拢要从「当前宽度」起步,而页签宽度是 flex 算出来的,CSS 里没有现成值 → 离场前量一下,交给 CSS 变量。\nfunction onBeforeLeave(el: Element) {\n ;(el as HTMLElement).style.setProperty('--chip-w', `${el.getBoundingClientRect().width}px`)\n}\n\nlet ro: ResizeObserver | undefined\nonMounted(() => {\n measureFade()\n if (typeof ResizeObserver === 'undefined') return\n ro = new ResizeObserver(measureFade)\n if (scrollerRef.value) ro.observe(scrollerRef.value)\n // 页签条本身(scroller 的唯一子元素):页签增删、收缩时它的宽度变,渐隐要跟着重量\n if (scrollerRef.value?.firstElementChild) ro.observe(scrollerRef.value.firstElementChild)\n})\nonBeforeUnmount(() => ro?.disconnect())\n</script>\n\n<template>\n <div class=\"tabsbar\">\n <div\n ref=\"scrollerRef\"\n class=\"scroller\"\n :class=\"{ 'fade-start': fadeStart, 'fade-end': fadeEnd }\"\n @scroll.passive=\"measureFade\"\n @wheel=\"onWheel\"\n >\n <transition-group tag=\"div\" name=\"chip\" class=\"strip\" @before-leave=\"onBeforeLeave\">\n <!-- chip 与关闭 X 均为可点非按钮元素:补 role/tabindex/键盘激活,键盘用户也能切换/关闭标签(右键菜单是鼠标专属) -->\n <div\n v-for=\"item in tabs.tabs\"\n :key=\"item.path\"\n class=\"chip\"\n :class=\"{ active: item.path === activePath, 'chip--fixed': item.affix || item.pinned }\"\n :title=\"tabTitle(item)\"\n role=\"button\"\n tabindex=\"0\"\n @click=\"onClick(item)\"\n @keydown.enter=\"onClick(item)\"\n @keydown.space.prevent=\"onClick(item)\"\n @contextmenu=\"onContext($event, item)\"\n @mousedown.middle.prevent\n @auxclick.middle.prevent=\"tabs.removeTab(item.path)\"\n >\n <!-- 标签图标沿用菜单元数据,可能不在离线子集内 → 走 AppIcon 的懒加载兜底;统一线条款 -->\n <AppIcon v-if=\"item.icon\" :icon=\"lineIcon(item.icon)\" :size=\"15\" class=\"chip-icon\" />\n <span class=\"chip-label\">{{ tabTitle(item) }}</span>\n <!-- 固定标签(用户 pin)显示图钉、不显示关闭 X;应用首页 affix 两者都不显示 -->\n <Icon v-if=\"item.pinned\" icon=\"ph:push-pin-fill\" :width=\"12\" class=\"chip-pin\" />\n <Icon\n v-else-if=\"!item.affix\"\n icon=\"ph:x\"\n :width=\"13\"\n class=\"chip-close\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('tabs.close')\"\n @mousedown.prevent\n @click.stop=\"tabs.removeTab(item.path)\"\n @keydown.enter.stop=\"tabs.removeTab(item.path)\"\n @keydown.space.stop.prevent=\"tabs.removeTab(item.path)\"\n />\n </div>\n </transition-group>\n </div>\n <n-dropdown\n trigger=\"manual\"\n placement=\"bottom-start\"\n :show=\"ctxShow\"\n :x=\"ctxX\"\n :y=\"ctxY\"\n :options=\"ctxOptions\"\n @select=\"onCtxSelect\"\n @clickoutside=\"ctxShow = false\"\n />\n </div>\n</template>\n\n<style scoped>\n/* 页签条在顶栏玻璃面板里(default.vue 的 .shell-head),自己不画底、不画上下边线以外的东西;\n 右端不放刷新 / 页签操作按钮:那些操作都在右键菜单里。 */\n.tabsbar {\n height: 40px;\n display: flex;\n align-items: center;\n padding: 0 10px 0 12px;\n background: transparent;\n box-shadow: inset 0 1px 0 var(--hairline);\n}\n/* 原生滚动 + 隐藏滚动条:页签先收缩,收到最小宽度才溢出,溢出时靠两端渐隐暗示、滚轮 / 触控板横划。\n scroll-behavior: smooth 让激活页签滚入视野是一段缓动而不是跳变(系统开了减少动态效果时由全局规则压成瞬时)。 */\n.scroller {\n flex: 1;\n min-width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n overscroll-behavior-x: contain;\n scroll-behavior: smooth;\n scrollbar-width: none;\n}\n.scroller::-webkit-scrollbar {\n display: none;\n}\n.fade-start:not(.fade-end) {\n -webkit-mask-image: linear-gradient(to right, transparent 0, #000 18px);\n mask-image: linear-gradient(to right, transparent 0, #000 18px);\n}\n.fade-end:not(.fade-start) {\n -webkit-mask-image: linear-gradient(to left, transparent 0, #000 18px);\n mask-image: linear-gradient(to left, transparent 0, #000 18px);\n}\n.fade-start.fade-end {\n -webkit-mask-image: linear-gradient(\n to right,\n transparent 0,\n #000 18px,\n #000 calc(100% - 18px),\n transparent 100%\n );\n mask-image: linear-gradient(\n to right,\n transparent 0,\n #000 18px,\n #000 calc(100% - 18px),\n transparent 100%\n );\n}\n.strip {\n display: flex;\n align-items: center;\n width: 100%; /* 撑满容器才会触发页签收缩;页签少时靠左,各自保持自然宽度 */\n padding: 5px 0;\n}\n/* 未选中:带一点淡底(--fill),否则看起来像一排纯文字;选中:强调色淡底 + 强调色文字加粗,\n 无下划线、无描边、无发光。 */\n.chip {\n position: relative;\n display: inline-flex;\n margin-right: 4px; /* 不用 gap:关闭时间距要和页签一起收拢 */\n align-items: center;\n gap: 7px;\n flex: 0 1 auto; /* 可收缩:标题放不下就截断,收到 min-width 才轮到滚动 */\n min-width: 104px;\n max-width: 180px;\n height: 30px;\n padding: 0 11px;\n border: none;\n border-radius: var(--radius-md);\n background: var(--fill);\n color: var(--text-3);\n font-size: 14px;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n transition:\n color var(--transition-fast),\n background-color var(--transition-fast);\n}\n.chip:hover {\n color: var(--text-1);\n background: var(--hover);\n}\n.chip.active {\n background: var(--tab-on-bg);\n color: var(--tab-on-fg);\n font-weight: 600;\n}\n.chip :deep(svg) {\n flex-shrink: 0;\n}\n.chip-label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* 首页(affix)与用户固定的页签保持自然宽度,不参与收缩 */\n.chip--fixed {\n flex: none;\n min-width: 0;\n max-width: none;\n}\n/* 鼠标点击不画聚焦环:× 是带 border-radius:50% 的 svg,浏览器默认聚焦环会被圆角化成一个黑圈(关闭瞬间闪现);\n 键盘聚焦(:focus-visible)仍然画。点击 × 时另由 mousedown.prevent 阻止它抢焦点。 */\n.chip:focus:not(:focus-visible),\n.chip-close:focus:not(:focus-visible) {\n outline: none;\n}\n.chip:focus-visible,\n.chip-close:focus-visible {\n outline: 2px solid var(--signal);\n outline-offset: 1px;\n}\n.chip-pin {\n opacity: 0.7;\n}\n.chip-icon {\n transition: opacity var(--transition-fast);\n}\n.chip-close {\n border-radius: 50%;\n transition: opacity var(--transition-fast);\n}\n\n/* 桌面(有悬停):× 盖在左侧图标的位置上,悬停 / 键盘聚焦到页签时才出现(图标淡出让位),不占布局宽度。\n 这是 Safari 标签栏的做法:标题多得 20px,收缩后四个汉字的页签名仍放得下。\n 没有图标的页签没有可盖的位置,× 退回流内、仍只在悬停时出现。 */\n@media (hover: hover) {\n .chip-close {\n position: absolute;\n left: 12px;\n top: 50%;\n margin-top: -6.5px;\n opacity: 0;\n pointer-events: none;\n }\n .chip:hover .chip-close,\n .chip:focus-within .chip-close {\n opacity: 0.75;\n pointer-events: auto;\n }\n .chip:hover .chip-close:hover,\n .chip-close:focus-visible {\n opacity: 1;\n }\n .chip:hover .chip-icon,\n .chip:focus-within .chip-icon {\n opacity: 0;\n }\n .chip:not(:has(.chip-icon)) .chip-close {\n position: static;\n margin-top: 0;\n }\n}\n\n/* 触屏没有悬停:× 常显在右侧(仍占宽度),保证关得掉 */\n@media (hover: none) {\n .chip {\n padding-right: 8px;\n }\n .chip-close {\n opacity: 0.7;\n }\n}\n\n/* 页签增删:宽度 / 内边距 / 间距一起收拢或展开,右边的页签随布局平滑滑动(flex 实时重排,不需要 FLIP)。\n 曲线取 macOS 切换外观同款 ease-in-out;系统开了减少动态效果时由全局规则压成瞬时。 */\n.chip-enter-active,\n.chip-leave-active {\n overflow: hidden;\n transition-property:\n width, max-width, min-width, padding-left, padding-right, margin-right, opacity;\n transition-duration: 0.22s;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n.chip-enter-from {\n max-width: 0;\n min-width: 0;\n padding-left: 0;\n padding-right: 0;\n margin-right: 0;\n opacity: 0;\n}\n.chip-leave-active {\n flex: none;\n pointer-events: none;\n}\n.chip-leave-from {\n width: var(--chip-w);\n}\n.chip-leave-to {\n width: 0;\n min-width: 0;\n padding-left: 0;\n padding-right: 0;\n margin-right: 0;\n opacity: 0;\n}\n</style>\n"],"names":["tabs","useTabsStore","route","useRoute","router","useRouter","t","useI18n","activePath","computed","scrollerRef","ref","tabTitle","item","translateMenuTitle","onClick","renderIcon","name","h","Icon","ctxShow","ctxX","ctxY","ctxTab","ctxOptions","_a","_b","_c","_d","onContext","nextTick","onCtxSelect","key","tab","watch","fadeStart","fadeEnd","measureFade","c","onWheel","onBeforeLeave","el","ro","onMounted","onBeforeUnmount","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_createVNode","_TransitionGroup","_Fragment","_renderList","_unref","$event","_withKeys","_withModifiers","_createBlock","AppIcon","lineIcon","_hoisted_3","_toDisplayString","NDropdown"],"mappings":"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"}
|
|
@@ -5,10 +5,13 @@ type __VLS_Props = {
|
|
|
5
5
|
collapsed?: boolean;
|
|
6
6
|
rail?: boolean;
|
|
7
7
|
showBrand?: boolean;
|
|
8
|
+
showSearch?: boolean;
|
|
8
9
|
};
|
|
9
10
|
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
11
|
+
search: () => any;
|
|
10
12
|
select: (key: string) => any;
|
|
11
13
|
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
|
+
onSearch?: (() => any) | undefined;
|
|
12
15
|
onSelect?: ((key: string) => any) | undefined;
|
|
13
16
|
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
14
17
|
declare const _default: typeof __VLS_export;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./SideNav2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-
|
|
4
|
+
const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-0b541618"]]);
|
|
5
5
|
export {
|
|
6
6
|
p as default
|
|
7
7
|
};
|
|
@@ -1,41 +1,69 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { NScrollbar as
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
1
|
+
import { defineComponent as v, computed as f, openBlock as i, createElementBlock as r, normalizeClass as y, createVNode as s, withDirectives as w, createElementVNode as B, toDisplayString as S, unref as o, vShow as N, createCommentVNode as p, withKeys as _, withCtx as d } from "vue";
|
|
2
|
+
import { NInput as b, NScrollbar as g, NMenu as k } from "naive-ui";
|
|
3
|
+
import { Icon as z } from "@iconify/vue";
|
|
4
|
+
import { useI18n as C } from "vue-i18n";
|
|
5
|
+
import x from "../../components/SmartLogo.vue.js";
|
|
6
|
+
import { useSite as I } from "../../composables/useSite.js";
|
|
7
|
+
const V = {
|
|
6
8
|
key: 0,
|
|
7
9
|
class: "brand"
|
|
8
|
-
},
|
|
10
|
+
}, D = {
|
|
11
|
+
key: 1,
|
|
12
|
+
class: "side-search"
|
|
13
|
+
}, j = /* @__PURE__ */ v({
|
|
9
14
|
__name: "SideNav",
|
|
10
15
|
props: {
|
|
11
16
|
options: {},
|
|
12
17
|
value: {},
|
|
13
18
|
collapsed: { type: Boolean },
|
|
14
19
|
rail: { type: Boolean },
|
|
15
|
-
showBrand: { type: Boolean }
|
|
20
|
+
showBrand: { type: Boolean },
|
|
21
|
+
showSearch: { type: Boolean }
|
|
16
22
|
},
|
|
17
|
-
emits: ["select"],
|
|
18
|
-
setup(
|
|
19
|
-
const { site:
|
|
20
|
-
return (
|
|
21
|
-
class:
|
|
23
|
+
emits: ["select", "search"],
|
|
24
|
+
setup(m, { emit: u }) {
|
|
25
|
+
const { site: h } = I(), { t: c } = C(), e = m, l = u, t = f(() => e.collapsed || e.rail);
|
|
26
|
+
return (E, a) => (i(), r("div", {
|
|
27
|
+
class: y(["sidenav", { rail: e.rail, "icon-only": t.value }])
|
|
22
28
|
}, [
|
|
23
|
-
e.showBrand ? (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
[
|
|
29
|
+
e.showBrand ? (i(), r("div", V, [
|
|
30
|
+
s(x, { size: 28 }),
|
|
31
|
+
w(B("span", { class: "brand-name" }, S(o(h).title), 513), [
|
|
32
|
+
[N, !t.value]
|
|
27
33
|
])
|
|
28
|
-
])) :
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
])) : p("", !0),
|
|
35
|
+
e.showSearch && !t.value ? (i(), r("div", D, [
|
|
36
|
+
s(o(b), {
|
|
37
|
+
size: "small",
|
|
38
|
+
readonly: "",
|
|
39
|
+
class: "search-input",
|
|
40
|
+
placeholder: o(c)("app.search"),
|
|
41
|
+
"aria-label": o(c)("app.search"),
|
|
42
|
+
onClick: a[0] || (a[0] = (n) => l("search")),
|
|
43
|
+
onKeydown: a[1] || (a[1] = _((n) => l("search"), ["enter"]))
|
|
44
|
+
}, {
|
|
45
|
+
prefix: d(() => [
|
|
46
|
+
s(o(z), {
|
|
47
|
+
icon: "ph:magnifying-glass",
|
|
48
|
+
width: 15,
|
|
49
|
+
class: "search-ico"
|
|
50
|
+
})
|
|
51
|
+
]),
|
|
52
|
+
_: 1
|
|
53
|
+
}, 8, ["placeholder", "aria-label"])
|
|
54
|
+
])) : p("", !0),
|
|
55
|
+
s(o(g), { class: "side-menu" }, {
|
|
56
|
+
default: d(() => [
|
|
57
|
+
s(o(k), {
|
|
32
58
|
options: e.options,
|
|
33
59
|
value: e.value,
|
|
34
|
-
collapsed:
|
|
35
|
-
"collapsed-width": e.rail ? 64 :
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
60
|
+
collapsed: t.value,
|
|
61
|
+
"collapsed-width": e.rail ? 64 : 68,
|
|
62
|
+
"collapsed-icon-size": 20,
|
|
63
|
+
"icon-size": 18,
|
|
64
|
+
indent: 14,
|
|
65
|
+
"root-indent": 14,
|
|
66
|
+
"onUpdate:value": a[2] || (a[2] = (n) => l("select", n))
|
|
39
67
|
}, null, 8, ["options", "value", "collapsed", "collapsed-width"])
|
|
40
68
|
]),
|
|
41
69
|
_: 1
|
|
@@ -44,6 +72,6 @@ const C = {
|
|
|
44
72
|
}
|
|
45
73
|
});
|
|
46
74
|
export {
|
|
47
|
-
|
|
75
|
+
j as default
|
|
48
76
|
};
|
|
49
77
|
//# sourceMappingURL=SideNav2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideNav2.vue.js","sources":["../../../src/layouts/components/SideNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 侧栏薄壳:对 n-menu 的展示层封装,default.vue 复用于 4 处——完整树/二级子树/一级图标 rail/移动抽屉。\n// collapsed(用户折叠开关) 与 rail(一级细栏,恒图标态、固定窄宽、无品牌字) 是两条独立的\"收窄\"来源,\n// 二者任一为真都令 n-menu 进入 collapsed;rail 另用更窄的 collapsed-width。\nimport { NMenu, NScrollbar, type MenuOption } from 'naive-ui'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { useSite } from '#/composables/useSite'\n\nconst { site } = useSite()\n\nconst props = defineProps<{\n options: MenuOption[]\n value?: string\n collapsed?: boolean\n rail?: boolean // 细图标栏(一级),强制图标态、无品牌文字\n showBrand?: boolean\n}>()\nconst emit = defineEmits<{ select: [key: string] }>()\n</script>\n\n<template>\n <div class=\"sidenav\" :class=\"{ rail: props.rail }\">\n <div v-if=\"props.showBrand\" class=\"brand\">\n <SmartLogo :size=\"
|
|
1
|
+
{"version":3,"file":"SideNav2.vue.js","sources":["../../../src/layouts/components/SideNav.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 侧栏薄壳:对 n-menu 的展示层封装,default.vue 复用于 4 处——完整树/二级子树/一级图标 rail/移动抽屉。\n// collapsed(用户折叠开关) 与 rail(一级细栏,恒图标态、固定窄宽、无品牌字) 是两条独立的\"收窄\"来源,\n// 二者任一为真都令 n-menu 进入 collapsed;rail 另用更窄的 collapsed-width。\n// 玻璃底由外层 aside / 抽屉提供,这里保持透明,不自带底色(否则两层半透明叠出一块灰)。\nimport { computed } from 'vue'\nimport { NInput, NMenu, NScrollbar, type MenuOption } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useI18n } from 'vue-i18n'\nimport SmartLogo from '#/components/SmartLogo.vue'\nimport { useSite } from '#/composables/useSite'\n\nconst { site } = useSite()\nconst { t } = useI18n()\n\nconst props = defineProps<{\n options: MenuOption[]\n value?: string\n collapsed?: boolean\n rail?: boolean // 细图标栏(一级),强制图标态、无品牌文字\n showBrand?: boolean\n showSearch?: boolean // 品牌下方的菜单搜索入口(只读输入框,点开 Ctrl+K 同一个面板)\n}>()\nconst emit = defineEmits<{ select: [key: string]; search: [] }>()\n\nconst iconOnly = computed(() => props.collapsed || props.rail)\n</script>\n\n<template>\n <div class=\"sidenav\" :class=\"{ rail: props.rail, 'icon-only': iconOnly }\">\n <div v-if=\"props.showBrand\" class=\"brand\">\n <SmartLogo :size=\"28\" />\n <span v-show=\"!iconOnly\" class=\"brand-name\">\n {{ site.title }}\n </span>\n </div>\n <div v-if=\"props.showSearch && !iconOnly\" class=\"side-search\">\n <n-input\n size=\"small\"\n readonly\n class=\"search-input\"\n :placeholder=\"t('app.search')\"\n :aria-label=\"t('app.search')\"\n @click=\"emit('search')\"\n @keydown.enter=\"emit('search')\"\n >\n <template #prefix>\n <Icon icon=\"ph:magnifying-glass\" :width=\"15\" class=\"search-ico\" />\n </template>\n </n-input>\n </div>\n <n-scrollbar class=\"side-menu\">\n <n-menu\n :options=\"props.options\"\n :value=\"props.value\"\n :collapsed=\"iconOnly\"\n :collapsed-width=\"props.rail ? 64 : 68\"\n :collapsed-icon-size=\"20\"\n :icon-size=\"18\"\n :indent=\"14\"\n :root-indent=\"14\"\n @update:value=\"(k: string) => emit('select', k)\"\n />\n </n-scrollbar>\n </div>\n</template>\n\n<style scoped>\n.sidenav {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: transparent;\n overflow: hidden;\n}\n.brand {\n display: flex;\n align-items: center;\n gap: 10px;\n height: 50px;\n padding: 0 18px;\n color: var(--text-1);\n overflow: hidden;\n white-space: nowrap;\n flex-shrink: 0;\n}\n.icon-only .brand {\n padding: 0;\n justify-content: center;\n}\n.brand-name {\n min-width: 0;\n font-size: 15px;\n font-weight: 600;\n letter-spacing: -0.02em;\n line-height: 1.2;\n color: var(--text-1); /* 品牌文字跟随主题文字色:固定深色在暗色下看不清 */\n}\n.side-search {\n flex-shrink: 0;\n padding: 0 12px 12px;\n}\n.search-input {\n cursor: pointer;\n}\n/* 只读输入框:光标也是手型,点哪都能打开面板 */\n.search-input :deep(.n-input__input-el) {\n cursor: pointer;\n}\n.search-ico {\n color: var(--text-3);\n}\n\n.side-menu {\n flex: 1;\n min-height: 0;\n /* 菜单滚到底时最后一行淡出,不被圆角面板的下沿硬切 */\n -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n mask-image: linear-gradient(180deg, #000 calc(100% - 22px), transparent);\n}\n/* 选中项只靠行底色 + 强调色文字 / 图标 + 加粗到 600 表达(与横向页签栏的选中页签同一字重),不画左侧竖条 */\n.sidenav :deep(.n-menu-item-content--selected .n-menu-item-content-header) {\n font-weight: 600;\n}\n</style>\n"],"names":["site","useSite","t","useI18n","props","__props","emit","__emit","iconOnly","computed","_createElementBlock","_openBlock","_hoisted_1","_createVNode","SmartLogo","_withDirectives","_createElementVNode","_toDisplayString","_unref","_hoisted_2","NInput","Icon","NScrollbar","NMenu","_cache","k"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAYA,UAAM,EAAE,MAAAA,EAAA,IAASC,EAAA,GACX,EAAE,GAAAC,EAAA,IAAMC,EAAA,GAERC,IAAQC,GAQRC,IAAOC,GAEPC,IAAWC,EAAS,MAAML,EAAM,aAAaA,EAAM,IAAI;2BAI3DM,EAmCM,OAAA;AAAA,MAnCD,UAAM,WAAS,EAAA,MAAiBN,EAAM,mBAAmBI,EAAA,OAAQ,CAAA;AAAA,IAAA;MACzDJ,EAAM,aAAjBO,EAAA,GAAAD,EAKM,OALNE,GAKM;AAAA,QAJJC,EAAwBC,GAAA,EAAZ,MAAM,IAAE;AAAA,QACpBC,EAAAC,EAEO,UAFkB,OAAM,aAAA,GAAYC,EACtCC,EAAAlB,CAAA,EAAK,KAAK,GAAA,GAAA,GAAA;AAAA,eADAQ,EAAA,KAAQ;AAAA,QAAA;;MAIdJ,EAAM,cAAU,CAAKI,EAAA,SAAhCG,KAAAD,EAcM,OAdNS,GAcM;AAAA,QAbJN,EAYUK,EAAAE,CAAA,GAAA;AAAA,UAXR,MAAK;AAAA,UACL,UAAA;AAAA,UACA,OAAM;AAAA,UACL,aAAaF,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACd,cAAYgB,EAAAhB,CAAA,EAAC,YAAA;AAAA,UACb,gCAAOI,EAAI,QAAA;AAAA,UACX,oCAAeA,EAAI,QAAA,GAAA,CAAA,OAAA,CAAA;AAAA,QAAA;UAET,UACT,MAAkE;AAAA,YAAlEO,EAAkEK,EAAAG,CAAA,GAAA;AAAA,cAA5D,MAAK;AAAA,cAAuB,OAAO;AAAA,cAAI,OAAM;AAAA,YAAA;;;;;MAIzDR,EAYcK,EAAAI,CAAA,GAAA,EAZD,OAAM,eAAW;AAAA,mBAC5B,MAUE;AAAA,UAVFT,EAUEK,EAAAK,CAAA,GAAA;AAAA,YATC,SAASnB,EAAM;AAAA,YACf,OAAOA,EAAM;AAAA,YACb,WAAWI,EAAA;AAAA,YACX,mBAAiBJ,EAAM,OAAI,KAAA;AAAA,YAC3B,uBAAqB;AAAA,YACrB,aAAW;AAAA,YACX,QAAQ;AAAA,YACR,eAAa;AAAA,YACb,kBAAYoB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAcnB,YAAemB,CAAC;AAAA,UAAA;;;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./default2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import t from "../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-
|
|
4
|
+
const e = /* @__PURE__ */ t(o, [["__scopeId", "data-v-167bced3"]]);
|
|
5
5
|
export {
|
|
6
6
|
e as default
|
|
7
7
|
};
|