smart-admin-web 10.14.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 +6 -6
- package/dist/api/index.d.ts +41 -2
- package/dist/api/index.js +36 -15
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +418 -6
- package/dist/assets/icons/ph-subset.json.js +7 -7
- package/dist/assets/smart-logo.svg.js +5 -0
- package/dist/assets/smart-logo.svg.js.map +1 -0
- 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/SmartLogo.vue.d.ts +3 -0
- package/dist/components/SmartLogo.vue.js +1 -1
- package/dist/components/SmartLogo2.vue.js +22 -64
- package/dist/components/SmartLogo2.vue.js.map +1 -1
- package/dist/{views/system/config/components/GroupExtraConfig.vue.d.ts → components/TableTotal/index.vue.d.ts} +1 -4
- 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/useLoginHero.d.ts +2 -0
- package/dist/composables/useLoginHero.js +22 -0
- package/dist/composables/useLoginHero.js.map +1 -0
- package/dist/composables/useModule.js +39 -29
- package/dist/composables/useModule.js.map +1 -1
- package/dist/composables/usePageTitle.js +16 -14
- package/dist/composables/usePageTitle.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 +20 -0
- package/dist/composables/useSite.js +18 -13
- 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 +223 -208
- 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/favicon.d.ts +1 -0
- package/dist/lib/favicon.js +12 -0
- package/dist/lib/favicon.js.map +1 -0
- package/dist/lib/loginHero.d.ts +16 -0
- package/dist/lib/loginHero.js +33 -0
- package/dist/lib/loginHero.js.map +1 -0
- package/dist/lib/logoCrop.d.ts +25 -0
- package/dist/lib/logoCrop.js +22 -0
- package/dist/lib/logoCrop.js.map +1 -0
- package/dist/lib/runtime.d.ts +2 -0
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/runtime.js.map +1 -1
- package/dist/lib/securityRules.d.ts +26 -0
- package/dist/lib/securityRules.js +86 -0
- package/dist/lib/securityRules.js.map +1 -0
- 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 +462 -42
- package/dist/locales/en-US.js +491 -78
- 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 +462 -42
- package/dist/locales/zh-CN.js +490 -81
- 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 +12 -12
- 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.d.ts +34 -9
- package/dist/utils/oauthBrand.js +70 -74
- 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.d.ts +18 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js +8 -0
- package/dist/views/login/components/LoginHeroPanel.vue.js.map +1 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js +61 -0
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -0
- 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 +8 -0
- package/dist/views/system/config/components/AdminMock.vue.js.map +1 -0
- package/dist/views/system/config/components/AdminMock2.vue.js +93 -0
- package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js +8 -0
- package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js +163 -0
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection.vue.d.ts +7 -0
- package/dist/views/system/config/components/BrandSection.vue.js +8 -0
- package/dist/views/system/config/components/BrandSection.vue.js.map +1 -0
- package/dist/views/system/config/components/BrandSection2.vue.js +266 -0
- package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup.vue.d.ts +18 -0
- package/dist/views/system/config/components/CfgGroup.vue.js +8 -0
- package/dist/views/system/config/components/CfgGroup.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js +22 -0
- package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow.vue.d.ts +26 -0
- package/dist/views/system/config/components/CfgRow.vue.js +9 -0
- package/dist/views/system/config/components/CfgRow.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgRow2.vue.js +54 -0
- package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment.vue.d.ts +28 -0
- package/dist/views/system/config/components/CfgSegment.vue.js +8 -0
- package/dist/views/system/config/components/CfgSegment.vue.js.map +1 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js +45 -0
- package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -0
- package/dist/views/system/config/components/ConfigFormModal.vue.js +4 -1
- package/dist/views/system/config/components/ConfigFormModal.vue.js.map +1 -1
- package/dist/views/system/config/components/ConfigFormModal2.vue.js +72 -60
- package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
- package/dist/views/system/config/components/JobSection.vue.js +8 -0
- package/dist/views/system/config/components/JobSection.vue.js.map +1 -0
- package/dist/views/system/config/components/JobSection2.vue.js +140 -0
- package/dist/views/system/config/components/JobSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/LoginMock.vue.d.ts +8 -0
- package/dist/views/system/config/components/LoginMock.vue.js +8 -0
- package/dist/views/system/config/components/LoginMock.vue.js.map +1 -0
- package/dist/views/system/config/components/LoginMock2.vue.js +132 -0
- package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper.vue.d.ts +10 -0
- package/dist/views/system/config/components/LogoCropper.vue.js +8 -0
- package/dist/views/system/config/components/LogoCropper.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js +122 -0
- package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor.vue.js +8 -0
- package/dist/views/system/config/components/LogoEditor.vue.js.map +1 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js +161 -0
- package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet.vue.d.ts +17 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js +8 -0
- package/dist/views/system/config/components/ProviderSheet.vue.js.map +1 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js +343 -0
- package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -0
- package/dist/{layouts/SettingRow.vue.d.ts → views/system/config/components/ScaleToFit.vue.d.ts} +2 -1
- package/dist/views/system/config/components/ScaleToFit.vue.js +8 -0
- package/dist/views/system/config/components/ScaleToFit.vue.js.map +1 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js +41 -0
- package/dist/views/system/config/components/ScaleToFit2.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout.vue.d.ts +30 -0
- package/dist/views/system/config/components/SectionLayout.vue.js +8 -0
- package/dist/views/system/config/components/SectionLayout.vue.js.map +1 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js +69 -0
- package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection.vue.js +8 -0
- package/dist/views/system/config/components/SecuritySection.vue.js.map +1 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js +417 -0
- package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js +8 -0
- package/dist/views/system/config/components/SensitiveSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js +214 -0
- package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection.vue.js +8 -0
- package/dist/views/system/config/components/SigninSection.vue.js.map +1 -0
- package/dist/views/system/config/components/SigninSection2.vue.js +201 -0
- package/dist/views/system/config/components/SigninSection2.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection.vue.js +8 -0
- package/dist/views/system/config/components/UploadSection.vue.js.map +1 -0
- package/dist/views/system/config/components/UploadSection2.vue.js +176 -0
- package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -0
- 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 +148 -0
- package/dist/views/system/config/draft.js +170 -0
- package/dist/views/system/config/draft.js.map +1 -0
- package/dist/views/system/config/flash.d.ts +2 -0
- package/dist/views/system/config/flash.js +9 -0
- package/dist/views/system/config/flash.js.map +1 -0
- package/dist/views/system/config/groups.d.ts +38 -7
- package/dist/views/system/config/groups.js +104 -14
- package/dist/views/system/config/groups.js.map +1 -1
- package/dist/views/system/config/index.vue.js +6 -2
- package/dist/views/system/config/index.vue.js.map +1 -1
- package/dist/views/system/config/index2.vue.js +201 -111
- 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/config/providerForm.d.ts +33 -0
- package/dist/views/system/config/providerForm.js +63 -0
- package/dist/views/system/config/providerForm.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 +6 -8
- 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.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.js +0 -8
- package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
- package/dist/views/login/skins/SplitPanel2.vue.js +0 -85
- package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
- 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/views/system/config/components/ExternalAuthConfig.vue.js +0 -8
- package/dist/views/system/config/components/ExternalAuthConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js +0 -218
- package/dist/views/system/config/components/ExternalAuthConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig.vue.js +0 -8
- package/dist/views/system/config/components/GroupExtraConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js +0 -108
- package/dist/views/system/config/components/GroupExtraConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig.vue.js +0 -5
- package/dist/views/system/config/components/HighSensConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/HighSensConfig2.vue.js +0 -134
- package/dist/views/system/config/components/HighSensConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig.vue.js +0 -5
- package/dist/views/system/config/components/JobConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/JobConfig2.vue.js +0 -116
- package/dist/views/system/config/components/JobConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig.vue.js +0 -5
- package/dist/views/system/config/components/OtherConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/OtherConfig2.vue.js +0 -121
- package/dist/views/system/config/components/OtherConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig.vue.js +0 -8
- package/dist/views/system/config/components/SecurityConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SecurityConfig2.vue.js +0 -456
- package/dist/views/system/config/components/SecurityConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig.vue.js +0 -5
- package/dist/views/system/config/components/SysBaseConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/SysBaseConfig2.vue.js +0 -107
- package/dist/views/system/config/components/SysBaseConfig2.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig.vue.d.ts +0 -3
- package/dist/views/system/config/components/UploadConfig.vue.js +0 -5
- package/dist/views/system/config/components/UploadConfig.vue.js.map +0 -1
- package/dist/views/system/config/components/UploadConfig2.vue.js +0 -135
- package/dist/views/system/config/components/UploadConfig2.vue.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/AdminMock.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/SplitPanel.vue.d.ts → system/config/components/AdvancedSection.vue.d.ts} +0 -0
- /package/dist/views/{login/skins/Spotlight.vue.d.ts → system/config/components/JobSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{ExternalAuthConfig.vue.d.ts → LogoEditor.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{HighSensConfig.vue.d.ts → SecuritySection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{JobConfig.vue.d.ts → SensitiveSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{OtherConfig.vue.d.ts → SigninSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{SecurityConfig.vue.d.ts → UploadSection.vue.d.ts} +0 -0
- /package/dist/views/system/config/components/{SysBaseConfig.vue.d.ts → WatermarkSection.vue.d.ts} +0 -0
|
@@ -1,41 +1,43 @@
|
|
|
1
|
-
import { defineComponent as
|
|
2
|
-
import { RouterView as
|
|
3
|
-
import { NButton as
|
|
4
|
-
import { Icon as
|
|
5
|
-
import { useBreakpoints as
|
|
6
|
-
import { useI18n as
|
|
7
|
-
import { useAppStore as
|
|
8
|
-
import { useUserStore as
|
|
9
|
-
import { useLayoutMenu as
|
|
10
|
-
import { useTabsStore as
|
|
11
|
-
import { useSite as
|
|
12
|
-
import { useRealtime as
|
|
13
|
-
import { useVisualViewportHeight as
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
},
|
|
1
|
+
import { defineComponent as te, onMounted as oe, onUnmounted as re, ref as k, computed as r, watch as le, nextTick as A, openBlock as i, createElementBlock as N, normalizeClass as x, normalizeStyle as se, Fragment as ie, createVNode as s, unref as e, createBlock as u, createCommentVNode as h, createElementVNode as f, withCtx as p, Transition as ne, KeepAlive as ue, resolveDynamicComponent as de } from "vue";
|
|
2
|
+
import { RouterView as ce } from "vue-router";
|
|
3
|
+
import { NButton as pe, NDrawer as ve, NDrawerContent as me } from "naive-ui";
|
|
4
|
+
import { Icon as he } from "@iconify/vue";
|
|
5
|
+
import { useBreakpoints as fe, breakpointsTailwind as be, onKeyStroke as we } from "@vueuse/core";
|
|
6
|
+
import { useI18n as ye } from "vue-i18n";
|
|
7
|
+
import { useAppStore as Se } from "../stores/app.js";
|
|
8
|
+
import { useUserStore as ke } from "../stores/user.js";
|
|
9
|
+
import { useLayoutMenu as xe } from "../composables/useLayoutMenu.js";
|
|
10
|
+
import { useTabsStore as ge } from "../stores/tabs.js";
|
|
11
|
+
import { useSite as Te } from "../composables/useSite.js";
|
|
12
|
+
import { useRealtime as _e } from "../composables/useRealtime.js";
|
|
13
|
+
import { useVisualViewportHeight as Ne } from "../composables/useVisualViewportHeight.js";
|
|
14
|
+
import { provideShellBreakpoint as Me } from "../composables/useShellBreakpoint.js";
|
|
15
|
+
import Be from "../components/ErrorBoundary/index.vue.js";
|
|
16
|
+
import Ce from "../components/MenuSearch.vue.js";
|
|
17
|
+
import Ee from "../components/AppWatermark.vue.js";
|
|
18
|
+
import Ke from "./AppHeader.vue.js";
|
|
19
|
+
import b from "./components/SideNav.vue.js";
|
|
20
|
+
import Ie from "./TabsBar.vue.js";
|
|
21
|
+
const Re = ["inert"], $e = { class: "toolbar" }, He = { class: "apph" }, Oe = { class: "content" }, Ve = ["data-bp"], la = /* @__PURE__ */ te({
|
|
22
22
|
__name: "default",
|
|
23
|
-
setup(
|
|
24
|
-
const { t:
|
|
25
|
-
|
|
26
|
-
const
|
|
23
|
+
setup(Ae) {
|
|
24
|
+
const { t: L } = ye(), n = Se(), w = ke(), y = ge(), { site: M } = Te(), { menuOptions: B, l1Options: C, l2Options: E, selectedL1: K, activeKey: S, onSelect: g, onSelectL1: I } = xe(), { start: U, stop: z } = _e();
|
|
25
|
+
oe(U), re(z), Ne();
|
|
26
|
+
const v = fe(be).smaller("md"), m = k(!1), d = k(!1), R = k(), { bp: $ } = Me(R), o = r(() => v.value ? "mobile" : n.layoutMode), D = /* @__PURE__ */ new Set([
|
|
27
27
|
"vertical",
|
|
28
28
|
"vertical-mix",
|
|
29
29
|
"vertical-hybrid-header-first",
|
|
30
30
|
"top-hybrid-sidebar-first",
|
|
31
31
|
"top-hybrid-header-first"
|
|
32
|
-
]),
|
|
32
|
+
]), F = /* @__PURE__ */ new Set([
|
|
33
33
|
"horizontal",
|
|
34
34
|
"vertical-hybrid-header-first",
|
|
35
35
|
"top-hybrid-sidebar-first",
|
|
36
36
|
"top-hybrid-header-first"
|
|
37
|
-
]),
|
|
38
|
-
|
|
37
|
+
]), T = r(() => !v.value && D.has(n.layoutMode)), W = r(() => o.value === "vertical" || o.value === "vertical-mix"), q = r(
|
|
38
|
+
() => v.value || F.has(o.value) || c.value
|
|
39
|
+
), P = r(() => {
|
|
40
|
+
switch (o.value) {
|
|
39
41
|
case "horizontal":
|
|
40
42
|
return "full";
|
|
41
43
|
case "vertical-hybrid-header-first":
|
|
@@ -46,116 +48,145 @@ const Ne = { class: "apph" }, ge = { class: "content" }, Be = {
|
|
|
46
48
|
default:
|
|
47
49
|
return null;
|
|
48
50
|
}
|
|
49
|
-
}),
|
|
51
|
+
}), H = /* @__PURE__ */ new Set([
|
|
50
52
|
"vertical",
|
|
51
53
|
"vertical-mix",
|
|
52
54
|
"vertical-hybrid-header-first",
|
|
53
55
|
"top-hybrid-header-first"
|
|
54
|
-
]),
|
|
55
|
-
() =>
|
|
56
|
-
),
|
|
57
|
-
() =>
|
|
58
|
-
)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
]), O = r(() => !v.value && H.has(o.value)), c = r(
|
|
57
|
+
() => T.value && n.collapsed && H.has(o.value)
|
|
58
|
+
), X = r(
|
|
59
|
+
() => T.value && !c.value && o.value !== "top-hybrid-sidebar-first"
|
|
60
|
+
);
|
|
61
|
+
function j(a) {
|
|
62
|
+
return a instanceof HTMLElement ? ["INPUT", "TEXTAREA", "SELECT"].includes(a.tagName) || a.isContentEditable || !!a.closest(".cm-editor, .md-editor, .md-editor-v3") : !1;
|
|
63
|
+
}
|
|
64
|
+
we("b", (a) => {
|
|
65
|
+
!(a.ctrlKey || a.metaKey) || a.altKey || a.shiftKey || !O.value || j(a.target) || (a.preventDefault(), n.toggleCollapsed());
|
|
66
|
+
});
|
|
67
|
+
const G = r(
|
|
68
|
+
() => o.value === "vertical" ? B.value : E.value
|
|
69
|
+
), J = r(() => o.value === "vertical-mix" ? "calc(var(--rail-w) + var(--sidebar-w))" : o.value === "top-hybrid-sidebar-first" ? "var(--rail-w)" : "var(--sidebar-w)"), Q = r(() => ({
|
|
70
|
+
"--aside-w": J.value,
|
|
71
|
+
width: c.value ? "0px" : "var(--aside-w)"
|
|
72
|
+
})), Y = r(
|
|
73
|
+
() => n.pageTransition === "none" ? void 0 : n.pageTransition
|
|
74
|
+
), Z = r(() => {
|
|
75
|
+
var a, t, l, V;
|
|
76
|
+
return {
|
|
77
|
+
name: (a = w.userInfo) == null ? void 0 : a.name,
|
|
78
|
+
account: (t = w.userInfo) == null ? void 0 : t.account,
|
|
79
|
+
org: (l = w.userInfo) == null ? void 0 : l.orgName,
|
|
80
|
+
phoneTail: (V = w.userInfo) == null ? void 0 : V.phoneTail
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
function ee(a) {
|
|
84
|
+
g(a), m.value = !1;
|
|
66
85
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
86
|
+
function ae() {
|
|
87
|
+
m.value = !1, d.value = !0;
|
|
88
|
+
}
|
|
89
|
+
const _ = k(!0);
|
|
90
|
+
return le(
|
|
91
|
+
() => y.reloadKey,
|
|
70
92
|
async () => {
|
|
71
|
-
|
|
93
|
+
_.value = !1, await A(), _.value = !0, await A(), y.excludeName = "";
|
|
72
94
|
}
|
|
73
|
-
), (
|
|
74
|
-
class:
|
|
95
|
+
), (a, t) => (i(), N("div", {
|
|
96
|
+
class: x(["layout", [`mode-${o.value}`, { "aside-hidden": c.value }]])
|
|
75
97
|
}, [
|
|
76
|
-
|
|
98
|
+
T.value ? (i(), N("aside", {
|
|
77
99
|
key: 0,
|
|
78
|
-
class:
|
|
79
|
-
style:
|
|
100
|
+
class: x(["aside glass", { "aside--mix": o.value === "vertical-mix", "aside--hidden": c.value }]),
|
|
101
|
+
style: se(Q.value),
|
|
102
|
+
inert: c.value
|
|
80
103
|
}, [
|
|
81
|
-
|
|
82
|
-
|
|
104
|
+
o.value === "vertical-mix" ? (i(), N(ie, { key: 0 }, [
|
|
105
|
+
s(b, {
|
|
83
106
|
class: "rail",
|
|
84
|
-
options: e(
|
|
85
|
-
value: e(
|
|
107
|
+
options: e(C),
|
|
108
|
+
value: e(K),
|
|
86
109
|
rail: "",
|
|
87
110
|
"show-brand": "",
|
|
88
|
-
onSelect: e(
|
|
111
|
+
onSelect: e(I)
|
|
89
112
|
}, null, 8, ["options", "value", "onSelect"]),
|
|
90
|
-
|
|
113
|
+
s(b, {
|
|
91
114
|
class: "l2col",
|
|
92
|
-
options: e(
|
|
93
|
-
value: e(
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
[
|
|
97
|
-
])
|
|
98
|
-
], 64)) :
|
|
115
|
+
options: e(E),
|
|
116
|
+
value: e(S),
|
|
117
|
+
"show-search": "",
|
|
118
|
+
onSelect: e(g),
|
|
119
|
+
onSearch: t[0] || (t[0] = (l) => d.value = !0)
|
|
120
|
+
}, null, 8, ["options", "value", "onSelect"])
|
|
121
|
+
], 64)) : o.value === "top-hybrid-sidebar-first" ? (i(), u(b, {
|
|
99
122
|
key: 1,
|
|
100
|
-
options: e(
|
|
101
|
-
value: e(
|
|
123
|
+
options: e(C),
|
|
124
|
+
value: e(K),
|
|
102
125
|
rail: "",
|
|
103
|
-
onSelect: e(
|
|
104
|
-
}, null, 8, ["options", "value", "onSelect"])) : (
|
|
126
|
+
onSelect: e(I)
|
|
127
|
+
}, null, 8, ["options", "value", "onSelect"])) : (i(), u(b, {
|
|
105
128
|
key: 2,
|
|
106
|
-
options:
|
|
107
|
-
value: e(
|
|
108
|
-
|
|
109
|
-
"show-
|
|
110
|
-
onSelect: e(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
129
|
+
options: G.value,
|
|
130
|
+
value: e(S),
|
|
131
|
+
"show-brand": W.value,
|
|
132
|
+
"show-search": "",
|
|
133
|
+
onSelect: e(g),
|
|
134
|
+
onSearch: t[1] || (t[1] = (l) => d.value = !0)
|
|
135
|
+
}, null, 8, ["options", "value", "show-brand", "onSelect"]))
|
|
136
|
+
], 14, Re)) : h("", !0),
|
|
137
|
+
f("div", {
|
|
138
|
+
class: x(["shell-head glass", { "shell-head--static": !e(n).fixedHeader }])
|
|
115
139
|
}, [
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
f("header", $e, [
|
|
141
|
+
e(v) ? (i(), u(e(pe), {
|
|
142
|
+
key: 0,
|
|
143
|
+
quaternary: "",
|
|
144
|
+
circle: "",
|
|
145
|
+
class: "hbg",
|
|
146
|
+
"aria-label": e(L)("app.openMenu"),
|
|
147
|
+
onClick: t[2] || (t[2] = (l) => m.value = !0)
|
|
148
|
+
}, {
|
|
149
|
+
default: p(() => [
|
|
150
|
+
s(e(he), {
|
|
151
|
+
icon: "ph:sidebar-simple",
|
|
152
|
+
width: 19
|
|
153
|
+
})
|
|
154
|
+
]),
|
|
155
|
+
_: 1
|
|
156
|
+
}, 8, ["aria-label"])) : h("", !0),
|
|
157
|
+
f("div", He, [
|
|
158
|
+
s(Ke, {
|
|
159
|
+
"show-collapse": O.value,
|
|
160
|
+
"show-brand": q.value,
|
|
161
|
+
"top-menu": P.value,
|
|
162
|
+
"show-search": !X.value,
|
|
163
|
+
onSearch: t[3] || (t[3] = (l) => d.value = !0)
|
|
164
|
+
}, null, 8, ["show-collapse", "show-brand", "top-menu", "show-search"])
|
|
165
|
+
])
|
|
166
|
+
]),
|
|
167
|
+
e(n).showTabs ? (i(), u(Ie, { key: 0 })) : h("", !0)
|
|
139
168
|
], 2),
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
169
|
+
f("main", Oe, [
|
|
170
|
+
f("div", {
|
|
171
|
+
ref_key: "pageRef",
|
|
172
|
+
ref: R,
|
|
173
|
+
class: x(["page", `bp-${e($)}`]),
|
|
174
|
+
"data-bp": e($)
|
|
175
|
+
}, [
|
|
176
|
+
s(Be, null, {
|
|
177
|
+
default: p(() => [
|
|
178
|
+
s(e(ce), null, {
|
|
179
|
+
default: p(({ Component: l }) => [
|
|
180
|
+
s(ne, {
|
|
181
|
+
name: Y.value,
|
|
151
182
|
mode: "out-in"
|
|
152
183
|
}, {
|
|
153
|
-
default:
|
|
154
|
-
(
|
|
155
|
-
include: e(
|
|
156
|
-
exclude: e(
|
|
184
|
+
default: p(() => [
|
|
185
|
+
(i(), u(ue, {
|
|
186
|
+
include: e(y).cachedNames,
|
|
187
|
+
exclude: e(y).excludeName
|
|
157
188
|
}, [
|
|
158
|
-
|
|
189
|
+
_.value ? (i(), u(de(l), { key: e(S) })) : h("", !0)
|
|
159
190
|
], 1032, ["include", "exclude"]))
|
|
160
191
|
]),
|
|
161
192
|
_: 2
|
|
@@ -166,48 +197,47 @@ const Ne = { class: "apph" }, ge = { class: "content" }, Be = {
|
|
|
166
197
|
]),
|
|
167
198
|
_: 1
|
|
168
199
|
})
|
|
169
|
-
]),
|
|
170
|
-
e(
|
|
171
|
-
key:
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
"font-size": 14,
|
|
176
|
-
"line-height": 16,
|
|
177
|
-
width: 192,
|
|
178
|
-
height: 128,
|
|
179
|
-
rotate: -16,
|
|
180
|
-
"font-color": W.value
|
|
181
|
-
}, null, 8, ["content", "font-color"])) : c("", !0)
|
|
200
|
+
], 10, Ve),
|
|
201
|
+
e(M).watermark.enabled ? (i(), u(Ee, {
|
|
202
|
+
key: 0,
|
|
203
|
+
settings: e(M).watermark,
|
|
204
|
+
who: Z.value
|
|
205
|
+
}, null, 8, ["settings", "who"])) : h("", !0)
|
|
182
206
|
]),
|
|
183
|
-
|
|
184
|
-
show:
|
|
185
|
-
"onUpdate:show":
|
|
207
|
+
s(e(ve), {
|
|
208
|
+
show: m.value,
|
|
209
|
+
"onUpdate:show": t[4] || (t[4] = (l) => m.value = l),
|
|
186
210
|
placement: "left",
|
|
187
211
|
width: 236
|
|
188
212
|
}, {
|
|
189
|
-
default:
|
|
190
|
-
|
|
213
|
+
default: p(() => [
|
|
214
|
+
s(e(me), {
|
|
191
215
|
"native-scrollbar": !1,
|
|
192
216
|
"body-content-style": "padding:0"
|
|
193
217
|
}, {
|
|
194
|
-
default:
|
|
195
|
-
|
|
196
|
-
options: e(
|
|
197
|
-
value: e(
|
|
218
|
+
default: p(() => [
|
|
219
|
+
s(b, {
|
|
220
|
+
options: e(B),
|
|
221
|
+
value: e(S),
|
|
198
222
|
"show-brand": "",
|
|
199
|
-
|
|
223
|
+
"show-search": "",
|
|
224
|
+
onSelect: ee,
|
|
225
|
+
onSearch: ae
|
|
200
226
|
}, null, 8, ["options", "value"])
|
|
201
227
|
]),
|
|
202
228
|
_: 1
|
|
203
229
|
})
|
|
204
230
|
]),
|
|
205
231
|
_: 1
|
|
206
|
-
}, 8, ["show"])
|
|
232
|
+
}, 8, ["show"]),
|
|
233
|
+
s(Ce, {
|
|
234
|
+
show: d.value,
|
|
235
|
+
"onUpdate:show": t[5] || (t[5] = (l) => d.value = l)
|
|
236
|
+
}, null, 8, ["show"])
|
|
207
237
|
], 2));
|
|
208
238
|
}
|
|
209
239
|
});
|
|
210
240
|
export {
|
|
211
|
-
|
|
241
|
+
la as default
|
|
212
242
|
};
|
|
213
243
|
//# sourceMappingURL=default2.vue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default2.vue.js","sources":["../../src/layouts/default.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { RouterView } from 'vue-router'\nimport { NWatermark, NDrawer, NDrawerContent, NButton } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useBreakpoints, breakpointsTailwind } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore, type LayoutMode } from '#/stores/app'\nimport { useUserStore } from '#/stores/user'\nimport { useLayoutMenu } from '#/composables/useLayoutMenu'\nimport { useTabsStore } from '#/stores/tabs'\nimport { useSite } from '#/composables/useSite'\nimport { useRealtime } from '#/composables/useRealtime'\nimport { useVisualViewportHeight } from '#/composables/useVisualViewportHeight'\nimport ErrorBoundary from '#/components/ErrorBoundary/index.vue'\nimport AppHeader from './AppHeader.vue'\nimport SideNav from './components/SideNav.vue'\nimport TabsBar from './TabsBar.vue'\n\nconst { t } = useI18n()\nconst app = useAppStore()\nconst user = useUserStore()\nconst tabs = useTabsStore()\nconst { site } = useSite()\nconst { menuOptions, l1Options, l2Options, selectedL1, activeKey, onSelect, onSelectL1 } =\n useLayoutMenu()\n\n// 实时通知(SignalR):鉴权外壳挂载即连、卸载即断。后端未开启实时时连接静默失败,退回轮询/惰性 401(纯增强)。\nconst { start: startRealtime, stop: stopRealtime } = useRealtime()\nonMounted(startRealtime)\nonUnmounted(stopRealtime)\n\n// 维护 --vvh(真实可视高度):软键盘弹起时 dvh 不变,只有 visualViewport 会缩。\n// 布局壳自身用 100dvh 就够,变量留给需要贴着键盘排版的页面(见 composables/useVisualViewportHeight)。\nuseVisualViewportHeight()\n\nconst isMobile = useBreakpoints(breakpointsTailwind).smaller('md')\nconst mobileOpen = ref(false)\n\n// 窄屏忽略 layoutMode,统一走 mobile(单列 + 抽屉侧栏)。\nconst mode = computed<LayoutMode | 'mobile'>(() => (isMobile.value ? 'mobile' : app.layoutMode))\n\n// 除 horizontal(无侧栏)外都有侧栏。\nconst withSider = new Set<LayoutMode>([\n 'vertical',\n 'vertical-mix',\n 'vertical-hybrid-header-first',\n 'top-hybrid-sidebar-first',\n 'top-hybrid-header-first',\n])\n// 顶栏显示品牌的模式(其余由侧栏/rail 顶部显示品牌,保证每种布局品牌只出现一处)。\nconst headerBrandModes = new Set<string>([\n 'horizontal',\n 'vertical-hybrid-header-first',\n 'top-hybrid-sidebar-first',\n 'top-hybrid-header-first',\n])\nconst showSider = computed(() => !isMobile.value && withSider.has(app.layoutMode))\nconst sideShowBrand = computed(() => mode.value === 'vertical' || mode.value === 'vertical-mix')\nconst headerShowBrand = computed(() => isMobile.value || headerBrandModes.has(mode.value))\n// 顶栏菜单:horizontal=完整树;两个 header-first=一级;侧边优先=二级(选中的一级的子菜单)。\nconst headerTopMenu = computed<'full' | 'l1' | 'l2' | null>(() => {\n switch (mode.value) {\n case 'horizontal':\n return 'full'\n case 'vertical-hybrid-header-first':\n case 'top-hybrid-header-first':\n return 'l1'\n case 'top-hybrid-sidebar-first':\n return 'l2'\n default:\n return null\n }\n})\n// 折叠按钮:有可折叠树侧栏的模式(侧边优先的一级 rail 固定宽,不折叠)。\nconst collapsibleSider = new Set<string>([\n 'vertical',\n 'vertical-mix',\n 'vertical-hybrid-header-first',\n 'top-hybrid-header-first',\n])\nconst showCollapse = computed(() => !isMobile.value && collapsibleSider.has(mode.value))\n\n// 非特殊侧栏内容:vertical=完整树;两个 header-first hybrid=二级子菜单树。\nconst asideOptions = computed(() =>\n mode.value === 'vertical' ? menuOptions.value : l2Options.value,\n)\nconst asideStyle = computed(() => {\n if (mode.value === 'vertical-mix') {\n return { width: app.collapsed ? 'var(--rail-w)' : 'calc(var(--rail-w) + var(--sidebar-w))' }\n }\n if (mode.value === 'top-hybrid-sidebar-first') {\n return { width: 'var(--rail-w)' } // 一级 icon rail,固定宽\n }\n return { width: app.collapsed ? 'var(--sidebar-w-collapsed)' : 'var(--sidebar-w)' }\n})\n\nconst transitionName = computed(() =>\n app.pageTransition === 'none' ? undefined : app.pageTransition,\n)\n\nconst watermarkContent = computed(\n () => [user.userInfo?.name, app.watermarkText].filter(Boolean).join(' · ') || site.title,\n)\nconst watermarkColor = computed(() => (app.isDark ? 'rgba(255,255,255,0.12)' : 'rgba(0,0,0,0.06)'))\n\nfunction onMobileSelect(key: string) {\n onSelect(key)\n mobileOpen.value = false\n}\n\n// 刷新标签:store 置 excludeName(逐出缓存)+ 递增 reloadKey;这里 v-if 关开一次令当前页重挂,再放行缓存。\nconst rvShow = ref(true)\nwatch(\n () => tabs.reloadKey,\n async () => {\n rvShow.value = false\n await nextTick()\n rvShow.value = true\n await nextTick()\n tabs.excludeName = ''\n },\n)\n</script>\n\n<template>\n <div class=\"layout\" :class=\"`mode-${mode}`\">\n <!-- 侧栏 -->\n <aside\n v-if=\"showSider\"\n class=\"aside\"\n :class=\"{ 'aside--mix': mode === 'vertical-mix' }\"\n :style=\"asideStyle\"\n >\n <template v-if=\"mode === 'vertical-mix'\">\n <SideNav\n class=\"rail\"\n :options=\"l1Options\"\n :value=\"selectedL1\"\n rail\n show-brand\n @select=\"onSelectL1\"\n />\n <SideNav\n v-show=\"!app.collapsed\"\n class=\"l2col\"\n :options=\"l2Options\"\n :value=\"activeKey\"\n @select=\"onSelect\"\n />\n </template>\n <!-- 顶部混合-侧边优先:侧栏只放一级 icon rail(二级在顶栏) -->\n <SideNav\n v-else-if=\"mode === 'top-hybrid-sidebar-first'\"\n :options=\"l1Options\"\n :value=\"selectedL1\"\n rail\n @select=\"onSelectL1\"\n />\n <SideNav\n v-else\n :options=\"asideOptions\"\n :value=\"activeKey\"\n :collapsed=\"app.collapsed\"\n :show-brand=\"sideShowBrand\"\n @select=\"onSelect\"\n />\n </aside>\n\n <!-- 顶栏 -->\n <header class=\"header\" :class=\"{ 'header--static': !app.fixedHeader }\">\n <n-button\n v-if=\"isMobile\"\n quaternary\n circle\n class=\"hbg\"\n :aria-label=\"t('app.openMenu')\"\n @click=\"mobileOpen = true\"\n >\n <Icon icon=\"ph:list\" :width=\"20\" />\n </n-button>\n <div class=\"apph\">\n <AppHeader\n :show-collapse=\"showCollapse\"\n :show-brand=\"headerShowBrand\"\n :top-menu=\"headerTopMenu\"\n />\n </div>\n </header>\n\n <!-- 内容 -->\n <main class=\"content\">\n <div v-if=\"app.showTabs\" class=\"tabs\"><TabsBar /></div>\n <div class=\"page\">\n <!-- 错误边界包住整个内容区:页面组件抛异常时 Vue 会卸掉整棵子树,没有它就是白屏。\n component :key=路由 path 给稳定身份:out-in 过渡才能正确区分进/出场,否则显示上一页缓存\n (按 path 各自成键,不塌缩缓存)。每个页面经 namedPage 套了一层 <div.page-view> 单元素根,\n out-in 能瞬时过渡任何页。 -->\n <ErrorBoundary>\n <router-view v-slot=\"{ Component }\">\n <transition :name=\"transitionName\" mode=\"out-in\">\n <keep-alive :include=\"tabs.cachedNames\" :exclude=\"tabs.excludeName\">\n <component :is=\"Component\" v-if=\"rvShow\" :key=\"activeKey\" />\n </keep-alive>\n </transition>\n </router-view>\n </ErrorBoundary>\n </div>\n <n-watermark\n v-if=\"app.watermark\"\n :content=\"watermarkContent\"\n cross\n fullscreen\n :font-size=\"14\"\n :line-height=\"16\"\n :width=\"192\"\n :height=\"128\"\n :rotate=\"-16\"\n :font-color=\"watermarkColor\"\n />\n </main>\n\n <!-- 移动端抽屉侧栏 -->\n <n-drawer v-model:show=\"mobileOpen\" placement=\"left\" :width=\"236\">\n <n-drawer-content :native-scrollbar=\"false\" body-content-style=\"padding:0\">\n <SideNav :options=\"menuOptions\" :value=\"activeKey\" show-brand @select=\"onMobileSelect\" />\n </n-drawer-content>\n </n-drawer>\n </div>\n</template>\n\n<style scoped>\n.layout {\n display: grid;\n /* dvh 而非 vh:移动端浏览器地址栏收起时 vh 仍按最小视口算,底部会被裁掉一条 */\n height: 100dvh;\n overflow: hidden;\n background: var(--color-bg-app); /* 整页画布跟随 tokens,暗色自动切深蓝黑渐变 */\n}\n/* 竖向壳:侧栏满高在左,顶栏缩进到内容列上方 */\n.mode-vertical,\n.mode-vertical-mix,\n.mode-vertical-hybrid-header-first {\n grid-template-columns: auto 1fr;\n grid-template-rows: var(--header-h) 1fr;\n grid-template-areas: 'aside header' 'aside content';\n}\n/* 顶栏壳:顶栏通栏,侧栏在其下方左侧 */\n.mode-top-hybrid-sidebar-first,\n.mode-top-hybrid-header-first {\n grid-template-columns: auto 1fr;\n grid-template-rows: var(--header-h) 1fr;\n grid-template-areas: 'header header' 'aside content';\n}\n.mode-horizontal,\n.mode-mobile {\n grid-template-columns: 1fr;\n grid-template-rows: var(--header-h) 1fr;\n grid-template-areas: 'header' 'content';\n}\n\n.aside {\n grid-area: aside;\n height: 100%;\n overflow: hidden;\n border-right: 1px solid var(--color-border);\n background: var(--color-bg-container);\n backdrop-filter: blur(18px); /* 侧栏玻璃背景,与顶栏/弹层质感统一 */\n -webkit-backdrop-filter: blur(18px);\n transition: width 0.2s ease;\n}\n.aside--mix {\n display: flex;\n}\n.aside--mix .rail {\n width: var(--rail-w);\n flex-shrink: 0;\n border-right: 1px solid var(--color-border);\n}\n.aside--mix .l2col {\n flex: 1;\n min-width: 0;\n}\n\n.header {\n grid-area: header;\n display: flex;\n align-items: stretch;\n border-bottom: 1px solid var(--color-border);\n background: var(--color-header-bg);\n backdrop-filter: blur(12px);\n z-index: 10;\n}\n.header--static {\n backdrop-filter: none;\n}\n.hbg {\n align-self: center;\n margin-left: 8px;\n}\n.apph {\n flex: 1;\n min-width: 0;\n height: 100%;\n}\n\n.content {\n grid-area: content;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n.tabs {\n flex-shrink: 0;\n}\n.page {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: var(--pad-page);\n}\n</style>\n"],"names":["t","useI18n","app","useAppStore","user","useUserStore","tabs","useTabsStore","site","useSite","menuOptions","l1Options","l2Options","selectedL1","activeKey","onSelect","onSelectL1","useLayoutMenu","startRealtime","stopRealtime","useRealtime","onMounted","onUnmounted","useVisualViewportHeight","isMobile","useBreakpoints","breakpointsTailwind","mobileOpen","ref","mode","computed","withSider","headerBrandModes","showSider","sideShowBrand","headerShowBrand","headerTopMenu","collapsibleSider","showCollapse","asideOptions","asideStyle","transitionName","watermarkContent","_a","watermarkColor","onMobileSelect","key","rvShow","watch","nextTick","_createElementBlock","_normalizeClass","_Fragment","_createVNode","SideNav","_unref","_vShow","_createBlock","_createElementVNode","NButton","Icon","_hoisted_1","AppHeader","_hoisted_2","_openBlock","_hoisted_3","TabsBar","_hoisted_4","ErrorBoundary","RouterView","_withCtx","Component","_Transition","_KeepAlive","_resolveDynamicComponent","NWatermark","NDrawer","$event","NDrawerContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"default2.vue.js","sources":["../../src/layouts/default.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'\nimport { RouterView } from 'vue-router'\nimport { NDrawer, NDrawerContent, NButton } from 'naive-ui'\nimport { Icon } from '@iconify/vue'\nimport { useBreakpoints, breakpointsTailwind, onKeyStroke } from '@vueuse/core'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore, type LayoutMode } from '#/stores/app'\nimport { useUserStore } from '#/stores/user'\nimport { useLayoutMenu } from '#/composables/useLayoutMenu'\nimport { useTabsStore } from '#/stores/tabs'\nimport { useSite } from '#/composables/useSite'\nimport { useRealtime } from '#/composables/useRealtime'\nimport { useVisualViewportHeight } from '#/composables/useVisualViewportHeight'\nimport { provideShellBreakpoint } from '#/composables/useShellBreakpoint'\nimport ErrorBoundary from '#/components/ErrorBoundary/index.vue'\nimport MenuSearch from '#/components/MenuSearch.vue'\nimport AppWatermark from '#/components/AppWatermark.vue'\nimport AppHeader from './AppHeader.vue'\nimport SideNav from './components/SideNav.vue'\nimport TabsBar from './TabsBar.vue'\n\nconst { t } = useI18n()\nconst app = useAppStore()\nconst user = useUserStore()\nconst tabs = useTabsStore()\nconst { site } = useSite()\nconst { menuOptions, l1Options, l2Options, selectedL1, activeKey, onSelect, onSelectL1 } =\n useLayoutMenu()\n\n// 实时通知(SignalR):鉴权外壳挂载即连、卸载即断。后端未开启实时时连接静默失败,退回轮询/惰性 401(纯增强)。\nconst { start: startRealtime, stop: stopRealtime } = useRealtime()\nonMounted(startRealtime)\nonUnmounted(stopRealtime)\n\n// 维护 --vvh(真实可视高度):软键盘弹起时 dvh 不变,只有 visualViewport 会缩。\n// 布局壳自身用 100dvh 就够,变量留给需要贴着键盘排版的页面(见 composables/useVisualViewportHeight)。\nuseVisualViewportHeight()\n\nconst isMobile = useBreakpoints(breakpointsTailwind).smaller('md')\nconst mobileOpen = ref(false)\n// 菜单搜索面板(Ctrl+K 同一个):侧栏里的只读输入框、顶栏的搜索按钮都开它,面板本身在 MenuSearch 里。\nconst searchOpen = ref(false)\n\n// 壳层三档(wide / mid / narrow):按内容区(.page 的 content box)宽度判,盯住的就是下面的 .page。\n// 页面里用 useShellBreakpoint() 读;样式里用 .page 上的 bp-* 类 / data-bp。阈值与理由见 composables/useShellBreakpoint。\nconst pageRef = ref<HTMLElement>()\nconst { bp } = provideShellBreakpoint(pageRef)\n\n// 窄屏忽略 layoutMode,统一走 mobile(单列 + 抽屉侧栏)。\nconst mode = computed<LayoutMode | 'mobile'>(() => (isMobile.value ? 'mobile' : app.layoutMode))\n\n// 除 horizontal(无侧栏)外都有侧栏。\nconst withSider = new Set<LayoutMode>([\n 'vertical',\n 'vertical-mix',\n 'vertical-hybrid-header-first',\n 'top-hybrid-sidebar-first',\n 'top-hybrid-header-first',\n])\n// 顶栏显示品牌的模式(其余由侧栏/rail 顶部显示品牌,保证每种布局品牌只出现一处)。\nconst headerBrandModes = new Set<string>([\n 'horizontal',\n 'vertical-hybrid-header-first',\n 'top-hybrid-sidebar-first',\n 'top-hybrid-header-first',\n])\nconst showSider = computed(() => !isMobile.value && withSider.has(app.layoutMode))\nconst sideShowBrand = computed(() => mode.value === 'vertical' || mode.value === 'vertical-mix')\n// 侧栏整个隐藏时品牌回到顶栏,否则这种布局下品牌无处可显\nconst headerShowBrand = computed(\n () => isMobile.value || headerBrandModes.has(mode.value) || asideHidden.value,\n)\n// 顶栏菜单:horizontal=完整树;两个 header-first=一级;侧边优先=二级(选中的一级的子菜单)。\nconst headerTopMenu = computed<'full' | 'l1' | 'l2' | null>(() => {\n switch (mode.value) {\n case 'horizontal':\n return 'full'\n case 'vertical-hybrid-header-first':\n case 'top-hybrid-header-first':\n return 'l1'\n case 'top-hybrid-sidebar-first':\n return 'l2'\n default:\n return null\n }\n})\n// 折叠按钮:有可折叠树侧栏的模式(侧边优先的一级 rail 固定宽,不折叠)。\nconst collapsibleSider = new Set<string>([\n 'vertical',\n 'vertical-mix',\n 'vertical-hybrid-header-first',\n 'top-hybrid-header-first',\n])\nconst showCollapse = computed(() => !isMobile.value && collapsibleSider.has(mode.value))\n// 折叠 = 把侧栏整个隐藏(不是收成图标条):内容区铺满,再点一次(或 Ctrl/⌘+B)恢复。\nconst asideHidden = computed(\n () => showSider.value && app.collapsed && collapsibleSider.has(mode.value),\n)\n// 侧栏树列自带搜索入口(品牌下的只读输入框)时,顶栏不再重复放搜索按钮;\n// 一级 rail 与侧栏隐藏时侧栏里没有输入框,搜索入口回到顶栏。\nconst sideHasSearch = computed(\n () => showSider.value && !asideHidden.value && mode.value !== 'top-hybrid-sidebar-first',\n)\n\n// Ctrl/⌘+B 收起 / 展开侧栏(只在有可折叠侧栏的布局生效)。\n// 编辑器里 Ctrl+B 是「加粗」,在输入控件 / 富文本 / 代码编辑器里不抢。\nfunction inEditable(target: EventTarget | null) {\n if (!(target instanceof HTMLElement)) return false\n return (\n ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName) ||\n target.isContentEditable ||\n !!target.closest('.cm-editor, .md-editor, .md-editor-v3')\n )\n}\nonKeyStroke('b', e => {\n if (!(e.ctrlKey || e.metaKey) || e.altKey || e.shiftKey) return\n if (!showCollapse.value || inEditable(e.target)) return\n e.preventDefault()\n app.toggleCollapsed()\n})\n\n// 非特殊侧栏内容:vertical=完整树;两个 header-first hybrid=二级子菜单树。\nconst asideOptions = computed(() =>\n mode.value === 'vertical' ? menuOptions.value : l2Options.value,\n)\nconst asideFullWidth = computed(() => {\n if (mode.value === 'vertical-mix') return 'calc(var(--rail-w) + var(--sidebar-w))'\n if (mode.value === 'top-hybrid-sidebar-first') return 'var(--rail-w)' // 一级 icon rail,固定宽\n return 'var(--sidebar-w)'\n})\n// 收起 = 宽度过渡到 0(侧栏不卸载,才有得过渡)。--aside-w 是满宽,内容按它定宽、被 aside 的 overflow 裁掉,\n// 收窄过程中菜单文字不会跟着重排。\nconst asideStyle = computed(() => ({\n '--aside-w': asideFullWidth.value,\n width: asideHidden.value ? '0px' : 'var(--aside-w)',\n}))\n\nconst transitionName = computed(() =>\n app.pageTransition === 'none' ? undefined : app.pageTransition,\n)\n\nconst watermarkWho = computed(() => ({\n name: user.userInfo?.name,\n account: user.userInfo?.account,\n org: user.userInfo?.orgName,\n phoneTail: user.userInfo?.phoneTail,\n}))\n\nfunction onMobileSelect(key: string) {\n onSelect(key)\n mobileOpen.value = false\n}\nfunction onMobileSearch() {\n mobileOpen.value = false\n searchOpen.value = true\n}\n\n// 刷新标签:store 置 excludeName(逐出缓存)+ 递增 reloadKey;这里 v-if 关开一次令当前页重挂,再放行缓存。\nconst rvShow = ref(true)\nwatch(\n () => tabs.reloadKey,\n async () => {\n rvShow.value = false\n await nextTick()\n rvShow.value = true\n await nextTick()\n tabs.excludeName = ''\n },\n)\n</script>\n\n<template>\n <div class=\"layout\" :class=\"[`mode-${mode}`, { 'aside-hidden': asideHidden }]\">\n <!-- 侧栏:玻璃面板,悬浮在壁纸上 -->\n <!-- 收起时仍挂载(宽度过渡到 0),inert 让它退出 Tab 序列与无障碍树 -->\n <aside\n v-if=\"showSider\"\n class=\"aside glass\"\n :class=\"{ 'aside--mix': mode === 'vertical-mix', 'aside--hidden': asideHidden }\"\n :style=\"asideStyle\"\n :inert=\"asideHidden\"\n >\n <template v-if=\"mode === 'vertical-mix'\">\n <SideNav\n class=\"rail\"\n :options=\"l1Options\"\n :value=\"selectedL1\"\n rail\n show-brand\n @select=\"onSelectL1\"\n />\n <SideNav\n class=\"l2col\"\n :options=\"l2Options\"\n :value=\"activeKey\"\n show-search\n @select=\"onSelect\"\n @search=\"searchOpen = true\"\n />\n </template>\n <!-- 顶部混合-侧边优先:侧栏只放一级 icon rail(二级在顶栏) -->\n <SideNav\n v-else-if=\"mode === 'top-hybrid-sidebar-first'\"\n :options=\"l1Options\"\n :value=\"selectedL1\"\n rail\n @select=\"onSelectL1\"\n />\n <SideNav\n v-else\n :options=\"asideOptions\"\n :value=\"activeKey\"\n :show-brand=\"sideShowBrand\"\n show-search\n @select=\"onSelect\"\n @search=\"searchOpen = true\"\n />\n </aside>\n\n <!-- 顶部玻璃面板:工具栏 + 页签条同一块,页签条在工具栏下方、以一条发丝线分隔 -->\n <div class=\"shell-head glass\" :class=\"{ 'shell-head--static': !app.fixedHeader }\">\n <header class=\"toolbar\">\n <n-button\n v-if=\"isMobile\"\n quaternary\n circle\n class=\"hbg\"\n :aria-label=\"t('app.openMenu')\"\n @click=\"mobileOpen = true\"\n >\n <Icon icon=\"ph:sidebar-simple\" :width=\"19\" />\n </n-button>\n <div class=\"apph\">\n <AppHeader\n :show-collapse=\"showCollapse\"\n :show-brand=\"headerShowBrand\"\n :top-menu=\"headerTopMenu\"\n :show-search=\"!sideHasSearch\"\n @search=\"searchOpen = true\"\n />\n </div>\n </header>\n <TabsBar v-if=\"app.showTabs\" />\n </div>\n\n <!-- 内容:壁纸(柔光渐变)上直接摆页面,内容层不挂玻璃 -->\n <main class=\"content\">\n <div ref=\"pageRef\" class=\"page\" :class=\"`bp-${bp}`\" :data-bp=\"bp\">\n <!-- 错误边界包住整个内容区:页面组件抛异常时 Vue 会卸掉整棵子树,没有它就是白屏。\n component :key=路由 path 给稳定身份:out-in 过渡才能正确区分进/出场,否则显示上一页缓存\n (按 path 各自成键,不塌缩缓存)。每个页面经 namedPage 套了一层 <div.page-view> 单元素根,\n out-in 能瞬时过渡任何页。 -->\n <ErrorBoundary>\n <router-view v-slot=\"{ Component }\">\n <transition :name=\"transitionName\" mode=\"out-in\">\n <keep-alive :include=\"tabs.cachedNames\" :exclude=\"tabs.excludeName\">\n <component :is=\"Component\" v-if=\"rvShow\" :key=\"activeKey\" />\n </keep-alive>\n </transition>\n </router-view>\n </ErrorBoundary>\n </div>\n <AppWatermark v-if=\"site.watermark.enabled\" :settings=\"site.watermark\" :who=\"watermarkWho\" />\n </main>\n\n <!-- 移动端抽屉侧栏 -->\n <n-drawer v-model:show=\"mobileOpen\" placement=\"left\" :width=\"236\">\n <n-drawer-content :native-scrollbar=\"false\" body-content-style=\"padding:0\">\n <SideNav\n :options=\"menuOptions\"\n :value=\"activeKey\"\n show-brand\n show-search\n @select=\"onMobileSelect\"\n @search=\"onMobileSearch\"\n />\n </n-drawer-content>\n </n-drawer>\n\n <MenuSearch v-model:show=\"searchOpen\" />\n </div>\n</template>\n\n<style scoped>\n/* 壳层:两块玻璃面板(侧栏 / 顶部)+ 一块内容区,离屏幕边缘 8px、面板之间 8px。\n 背景是一整张氛围壁纸(--wallpaper:由强调色推导的柔光 + 底色,不画网格),玻璃叠在光上才有层次;\n 内容层的卡片不用玻璃(只有侧栏、顶栏、弹层是玻璃)。\n z-index 全部压在 1999 以下:smart-naive-table 的放大层是 1999(刻意低于 naive 浮层的 2000),\n 壳层不能盖住它。 */\n.layout {\n --sidebar-w: 232px;\n --rail-w: 64px;\n --aside-duration: 0.28s; /* 侧栏收起 / 展开,macOS 侧栏滑动的量级 */\n display: grid;\n /* dvh 而非 vh:移动端浏览器地址栏收起时 vh 仍按最小视口算,底部会被裁掉一条 */\n height: 100dvh;\n padding: 8px;\n gap: 8px;\n overflow: hidden;\n background: var(--wallpaper, var(--bg-app));\n}\n/* 竖向壳:侧栏满高在左,顶栏缩进到内容列上方 */\n.mode-vertical,\n.mode-vertical-mix,\n.mode-vertical-hybrid-header-first {\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n grid-template-areas: 'aside header' 'aside content';\n}\n/* 顶栏壳:顶栏通栏,侧栏在其下方左侧 */\n.mode-top-hybrid-sidebar-first,\n.mode-top-hybrid-header-first {\n grid-template-columns: auto minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n grid-template-areas: 'header header' 'aside content';\n}\n.mode-horizontal,\n.mode-mobile {\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: auto minmax(0, 1fr);\n grid-template-areas: 'header' 'content';\n}\n\n/* 侧栏隐藏:列还在,侧栏宽度过渡到 0;列间距也要归零,否则空列旁边还留一道 8px。\n 两者用同一时长与曲线,内容区才是被侧栏「推」着变宽,而不是先后跳两下。 */\n.layout {\n transition: column-gap var(--aside-duration) var(--ease-sheet);\n}\n.layout.aside-hidden {\n column-gap: 0;\n}\n\n/* 玻璃面板:半透明底 + 强模糊 + 发丝描边 + 顶边高光 + 深投影 */\n.glass {\n background: var(--glass-panel);\n backdrop-filter: blur(40px) saturate(180%);\n -webkit-backdrop-filter: blur(40px) saturate(180%);\n border: 1px solid var(--glass-border);\n box-shadow: var(--glass-shadow);\n}\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n .glass {\n background: var(--glass-solid, var(--glass-panel));\n }\n}\n\n.aside {\n grid-area: aside;\n position: relative;\n z-index: 2;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n border-radius: var(--radius-lg);\n transition:\n width var(--aside-duration) var(--ease-sheet),\n border-width var(--aside-duration) var(--ease-sheet),\n opacity 0.2s ease;\n}\n/* 收起:border-box 下宽 0 仍会留两侧 1px 描边,一并归零;透明度同时带走投影 */\n.aside--hidden {\n border-width: 0;\n opacity: 0;\n}\n/* 内容按满宽定宽,被 .aside 的 overflow:hidden 裁掉,收窄时不重排(mix 模式由下面两条各自定宽) */\n.aside:not(.aside--mix) > * {\n width: var(--aside-w);\n}\n.aside--mix {\n display: flex;\n}\n.aside--mix .rail {\n width: var(--rail-w);\n flex-shrink: 0;\n border-right: 1px solid var(--hairline);\n}\n.aside--mix .l2col {\n flex: none;\n width: var(--sidebar-w);\n}\n\n.shell-head {\n grid-area: header;\n position: relative;\n z-index: 5;\n min-width: 0;\n overflow: hidden;\n border-radius: 14px;\n}\n/* 「固定头部」关闭:顶栏不再模糊背后的内容 */\n.shell-head--static {\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n}\n.toolbar {\n display: flex;\n align-items: stretch;\n height: 44px;\n}\n.hbg {\n align-self: center;\n margin-left: 8px;\n}\n.apph {\n flex: 1;\n min-width: 0;\n height: 100%;\n}\n\n.content {\n grid-area: content;\n display: flex;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n}\n/* 页面滚动层。左右只留 2px(让卡片的描边 / 投影不被 overflow 裁掉)。\n 顶部不留白:顶栏到首张卡片永远是面板之间的 8px(--gap-card),满屏页和自然滚动页一样 —— 两类页面顶部间距不同的话,\n 从列表页切到工作台首张卡片会下跳一截。自然滚动页底部留 8px 给卡片投影,满屏页(下条)只留 2px。\n 内边距不进壳层档位的数字:档位量的是这块的 content box,见 composables/useShellBreakpoint。 */\n.page {\n flex: 1;\n min-height: 0;\n overflow: auto;\n padding: 0 2px 8px;\n}\n/* 满屏页(列表 / 左右分栏)吃满一屏,四周只留 2px,滚动发生在表体里 */\n.page:not(.bp-narrow):has(> .page-view > :is(.smart-table, .fill-page, .side-page)) {\n padding: 0 2px 2px;\n}\n/* narrow:整页自然滚动,不再锁一屏高度。满屏列表页的 .page-view 在 layout.css 里被补成 height:100%,\n 这里放回自动高度,内容多长页面就多长、由 .page 滚动。 */\n.page.bp-narrow :deep(.page-view) {\n height: auto;\n}\n</style>\n"],"names":["t","useI18n","app","useAppStore","user","useUserStore","tabs","useTabsStore","site","useSite","menuOptions","l1Options","l2Options","selectedL1","activeKey","onSelect","onSelectL1","useLayoutMenu","startRealtime","stopRealtime","useRealtime","onMounted","onUnmounted","useVisualViewportHeight","isMobile","useBreakpoints","breakpointsTailwind","mobileOpen","ref","searchOpen","pageRef","bp","provideShellBreakpoint","mode","computed","withSider","headerBrandModes","showSider","sideShowBrand","headerShowBrand","asideHidden","headerTopMenu","collapsibleSider","showCollapse","sideHasSearch","inEditable","target","onKeyStroke","e","asideOptions","asideFullWidth","asideStyle","transitionName","watermarkWho","_a","_b","_c","_d","onMobileSelect","key","onMobileSearch","rvShow","watch","nextTick","_createElementBlock","_normalizeClass","_Fragment","_createVNode","SideNav","_unref","_createBlock","_createElementVNode","_hoisted_2","NButton","Icon","_hoisted_3","AppHeader","TabsBar","_hoisted_4","ErrorBoundary","RouterView","_withCtx","Component","_Transition","_KeepAlive","_openBlock","_resolveDynamicComponent","AppWatermark","NDrawer","$event","NDrawerContent","MenuSearch"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function applyFavicon(doc: Document, logo: string | null | undefined): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const i = /* @__PURE__ */ new WeakMap();
|
|
2
|
+
function l(f, r) {
|
|
3
|
+
const n = f.querySelectorAll('link[rel~="icon"]');
|
|
4
|
+
for (const e of n) {
|
|
5
|
+
let t = i.get(e);
|
|
6
|
+
t || (t = { href: e.getAttribute("href") ?? "", type: e.getAttribute("type") }, i.set(e, t)), r ? (e.href = r, e.removeAttribute("type")) : (e.setAttribute("href", t.href), t.type && e.setAttribute("type", t.type));
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export {
|
|
10
|
+
l as applyFavicon
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=favicon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favicon.js","sources":["../../src/lib/favicon.ts"],"sourcesContent":["// 浏览器标签页图标跟随站点 Logo。改写页面里所有 rel=icon 的 href,而不是再追加一个:\n// 多个候选时各浏览器挑哪个并不一致,追加的那个未必生效。原 href/type 记在 WeakMap 里,Logo 清空时还原。\n// 不记在 DOM 属性上:从 DOM 读出再写回 href,会被静态分析当成\"DOM 文本重新解释为 HTML\"。\n// apple-touch-icon 不动:iOS 主屏图标要 180×180 不透明底,和 Logo 的要求不同。\n\ninterface IconDefaults {\n href: string\n type: string | null\n}\n\nconst defaults = new WeakMap<HTMLLinkElement, IconDefaults>()\n\nexport function applyFavicon(doc: Document, logo: string | null | undefined): void {\n const links = doc.querySelectorAll<HTMLLinkElement>('link[rel~=\"icon\"]')\n for (const link of links) {\n let original = defaults.get(link)\n if (!original) {\n original = { href: link.getAttribute('href') ?? '', type: link.getAttribute('type') }\n defaults.set(link, original)\n }\n if (logo) {\n link.href = logo\n link.removeAttribute('type') // 原 type 可能是 image/svg+xml,留着会让浏览器按错的类型解析 Logo\n } else {\n link.setAttribute('href', original.href)\n if (original.type) link.setAttribute('type', original.type)\n }\n }\n}\n"],"names":["defaults","applyFavicon","doc","logo","links","link","original"],"mappings":"AAUA,MAAMA,wBAAe,QAAA;AAEd,SAASC,EAAaC,GAAeC,GAAuC;AACjF,QAAMC,IAAQF,EAAI,iBAAkC,mBAAmB;AACvE,aAAWG,KAAQD,GAAO;AACxB,QAAIE,IAAWN,EAAS,IAAIK,CAAI;AAChC,IAAKC,MACHA,IAAW,EAAE,MAAMD,EAAK,aAAa,MAAM,KAAK,IAAI,MAAMA,EAAK,aAAa,MAAM,EAAA,GAClFL,EAAS,IAAIK,GAAMC,CAAQ,IAEzBH,KACFE,EAAK,OAAOF,GACZE,EAAK,gBAAgB,MAAM,MAE3BA,EAAK,aAAa,QAAQC,EAAS,IAAI,GACnCA,EAAS,QAAMD,EAAK,aAAa,QAAQC,EAAS,IAAI;AAAA,EAE9D;AACF;"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface LoginHeroCopy {
|
|
2
|
+
headline: string;
|
|
3
|
+
highlight: string;
|
|
4
|
+
features: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface LoginHeroFallbacks {
|
|
7
|
+
headline: string;
|
|
8
|
+
highlight: string;
|
|
9
|
+
features: string[];
|
|
10
|
+
}
|
|
11
|
+
/** 亮点按行输入;空行忽略,最多保留 5 条。 */
|
|
12
|
+
export declare function splitLoginHeroFeatures(value: string | null | undefined, max?: number): string[];
|
|
13
|
+
/** 归一化站点接口下发的 Hero 文案,非法形状按缺失处理。 */
|
|
14
|
+
export declare function normalizeLoginHero(value: unknown): Record<string, LoginHeroCopy>;
|
|
15
|
+
/** 空配置逐字段回退内置文案;亮点开关关闭时返回空清单。 */
|
|
16
|
+
export declare function resolveLoginHero(copy: Partial<LoginHeroCopy> | undefined, fallback: LoginHeroFallbacks, showFeatures?: boolean): LoginHeroCopy;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
function s(r, t = 5) {
|
|
2
|
+
return r != null && r.trim() ? r.replace(/\r\n/g, `
|
|
3
|
+
`).split(`
|
|
4
|
+
`).map((n) => n.trim()).filter(Boolean).slice(0, t) : [];
|
|
5
|
+
}
|
|
6
|
+
function f(r) {
|
|
7
|
+
if (!r || typeof r != "object" || Array.isArray(r)) return {};
|
|
8
|
+
const t = {};
|
|
9
|
+
for (const [n, i] of Object.entries(r)) {
|
|
10
|
+
if (!i || typeof i != "object" || Array.isArray(i)) continue;
|
|
11
|
+
const e = i;
|
|
12
|
+
t[n] = {
|
|
13
|
+
headline: typeof e.headline == "string" ? e.headline : "",
|
|
14
|
+
highlight: typeof e.highlight == "string" ? e.highlight : "",
|
|
15
|
+
features: Array.isArray(e.features) ? e.features.filter((h) => typeof h == "string" && !!h.trim()) : []
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return t;
|
|
19
|
+
}
|
|
20
|
+
function g(r, t, n = !0) {
|
|
21
|
+
var i, e, h;
|
|
22
|
+
return {
|
|
23
|
+
headline: ((i = r == null ? void 0 : r.headline) == null ? void 0 : i.trim()) || t.headline,
|
|
24
|
+
highlight: ((e = r == null ? void 0 : r.highlight) == null ? void 0 : e.trim()) || t.highlight,
|
|
25
|
+
features: n ? (h = r == null ? void 0 : r.features) != null && h.length ? r.features : t.features : []
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
f as normalizeLoginHero,
|
|
30
|
+
g as resolveLoginHero,
|
|
31
|
+
s as splitLoginHeroFeatures
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=loginHero.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loginHero.js","sources":["../../src/lib/loginHero.ts"],"sourcesContent":["export interface LoginHeroCopy {\n headline: string\n highlight: string\n features: string[]\n}\n\nexport interface LoginHeroFallbacks {\n headline: string\n highlight: string\n features: string[]\n}\n\n/** 亮点按行输入;空行忽略,最多保留 5 条。 */\nexport function splitLoginHeroFeatures(value: string | null | undefined, max = 5): string[] {\n if (!value?.trim()) return []\n return value\n .replace(/\\r\\n/g, '\\n')\n .split('\\n')\n .map(line => line.trim())\n .filter(Boolean)\n .slice(0, max)\n}\n\n/** 归一化站点接口下发的 Hero 文案,非法形状按缺失处理。 */\nexport function normalizeLoginHero(value: unknown): Record<string, LoginHeroCopy> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n\n const result: Record<string, LoginHeroCopy> = {}\n for (const [locale, raw] of Object.entries(value)) {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue\n const copy = raw as Record<string, unknown>\n result[locale] = {\n headline: typeof copy.headline === 'string' ? copy.headline : '',\n highlight: typeof copy.highlight === 'string' ? copy.highlight : '',\n features: Array.isArray(copy.features)\n ? copy.features.filter((item): item is string => typeof item === 'string' && !!item.trim())\n : [],\n }\n }\n return result\n}\n\n/** 空配置逐字段回退内置文案;亮点开关关闭时返回空清单。 */\nexport function resolveLoginHero(\n copy: Partial<LoginHeroCopy> | undefined,\n fallback: LoginHeroFallbacks,\n showFeatures = true,\n): LoginHeroCopy {\n return {\n headline: copy?.headline?.trim() || fallback.headline,\n highlight: copy?.highlight?.trim() || fallback.highlight,\n features: showFeatures ? (copy?.features?.length ? copy.features : fallback.features) : [],\n }\n}\n"],"names":["splitLoginHeroFeatures","value","max","line","normalizeLoginHero","result","locale","raw","copy","item","resolveLoginHero","fallback","showFeatures","_a","_b","_c"],"mappings":"AAaO,SAASA,EAAuBC,GAAkCC,IAAM,GAAa;AAC1F,SAAKD,KAAA,QAAAA,EAAO,SACLA,EACJ,QAAQ,SAAS;AAAA,CAAI,EACrB,MAAM;AAAA,CAAI,EACV,IAAI,OAAQE,EAAK,KAAA,CAAM,EACvB,OAAO,OAAO,EACd,MAAM,GAAGD,CAAG,IANY,CAAA;AAO7B;AAGO,SAASE,EAAmBH,GAA+C;AAChF,MAAI,CAACA,KAAS,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK,EAAG,QAAO,CAAA;AAExE,QAAMI,IAAwC,CAAA;AAC9C,aAAW,CAACC,GAAQC,CAAG,KAAK,OAAO,QAAQN,CAAK,GAAG;AACjD,QAAI,CAACM,KAAO,OAAOA,KAAQ,YAAY,MAAM,QAAQA,CAAG,EAAG;AAC3D,UAAMC,IAAOD;AACb,IAAAF,EAAOC,CAAM,IAAI;AAAA,MACf,UAAU,OAAOE,EAAK,YAAa,WAAWA,EAAK,WAAW;AAAA,MAC9D,WAAW,OAAOA,EAAK,aAAc,WAAWA,EAAK,YAAY;AAAA,MACjE,UAAU,MAAM,QAAQA,EAAK,QAAQ,IACjCA,EAAK,SAAS,OAAO,CAACC,MAAyB,OAAOA,KAAS,YAAY,CAAC,CAACA,EAAK,KAAA,CAAM,IACxF,CAAA;AAAA,IAAC;AAAA,EAET;AACA,SAAOJ;AACT;AAGO,SAASK,EACdF,GACAG,GACAC,IAAe,IACA;AAlCV,MAAAC,GAAAC,GAAAC;AAmCL,SAAO;AAAA,IACL,YAAUF,IAAAL,KAAA,gBAAAA,EAAM,aAAN,gBAAAK,EAAgB,WAAUF,EAAS;AAAA,IAC7C,aAAWG,IAAAN,KAAA,gBAAAA,EAAM,cAAN,gBAAAM,EAAiB,WAAUH,EAAS;AAAA,IAC/C,UAAUC,KAAgBG,IAAAP,KAAA,gBAAAA,EAAM,aAAN,QAAAO,EAAgB,SAASP,EAAK,WAAWG,EAAS,WAAY,CAAA;AAAA,EAAC;AAE7F;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface CropState {
|
|
2
|
+
/** 图片原始宽高 */
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
/** 取景框边长(px,视口坐标) */
|
|
6
|
+
frame: number;
|
|
7
|
+
/** 当前缩放(图片像素 → 视口像素) */
|
|
8
|
+
scale: number;
|
|
9
|
+
/** 图片中心相对取景框中心的偏移(视口像素) */
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
}
|
|
13
|
+
/** 刚好铺满取景框的最小缩放:短边等于框边,不留空白。 */
|
|
14
|
+
export declare function coverScale(width: number, height: number, frame: number): number;
|
|
15
|
+
/** 把偏移收在"图片始终盖满取景框"的范围内。 */
|
|
16
|
+
export declare function clampOffset(s: CropState): {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
};
|
|
20
|
+
/** 取景框在原图上的区域(原图像素),供 drawImage 取源矩形。 */
|
|
21
|
+
export declare function sourceRect(s: CropState): {
|
|
22
|
+
sx: number;
|
|
23
|
+
sy: number;
|
|
24
|
+
size: number;
|
|
25
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
function n(t, e, a) {
|
|
2
|
+
return a / Math.min(t, e);
|
|
3
|
+
}
|
|
4
|
+
const c = (t, e) => e === 0 ? 0 : Math.min(e, Math.max(-e, t));
|
|
5
|
+
function r(t) {
|
|
6
|
+
const e = Math.max(0, (t.width * t.scale - t.frame) / 2), a = Math.max(0, (t.height * t.scale - t.frame) / 2);
|
|
7
|
+
return { x: c(t.x, e), y: c(t.y, a) };
|
|
8
|
+
}
|
|
9
|
+
function h(t) {
|
|
10
|
+
const e = t.frame / t.scale;
|
|
11
|
+
return {
|
|
12
|
+
sx: t.width / 2 - t.x / t.scale - e / 2,
|
|
13
|
+
sy: t.height / 2 - t.y / t.scale - e / 2,
|
|
14
|
+
size: e
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
r as clampOffset,
|
|
19
|
+
n as coverScale,
|
|
20
|
+
h as sourceRect
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=logoCrop.js.map
|