smart-admin-web 10.5.0 → 10.10.1

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.
Files changed (70) hide show
  1. package/README.md +2 -1
  2. package/cli/icon-subset.mjs +132 -0
  3. package/cli/smart-admin-icons.mjs +57 -0
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/index.d.ts +3 -3
  6. package/dist/api/index.js +2 -2
  7. package/dist/api/index.js.map +1 -1
  8. package/dist/components/DetailPage/index.vue.js +1 -1
  9. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  10. package/dist/components/IconPicker/index.vue.js.map +1 -1
  11. package/dist/components/ImportWizard/index.vue.js +1 -1
  12. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  13. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  14. package/dist/composables/useConfirm.js.map +1 -1
  15. package/dist/composables/useLayoutMenu.js.map +1 -1
  16. package/dist/composables/useRealtime.d.ts +1 -1
  17. package/dist/composables/useRealtime.js.map +1 -1
  18. package/dist/createSmartAdmin.d.ts +5 -2
  19. package/dist/createSmartAdmin.js +33 -32
  20. package/dist/createSmartAdmin.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +257 -244
  23. package/dist/index.js.map +1 -1
  24. package/dist/layouts/default.vue.js +2 -2
  25. package/dist/layouts/default2.vue.js.map +1 -1
  26. package/dist/lib/icons.d.ts +5 -2
  27. package/dist/lib/icons.js +15 -13
  28. package/dist/lib/icons.js.map +1 -1
  29. package/dist/lib/markdown.js.map +1 -1
  30. package/dist/lib/runtime.js +1 -1
  31. package/dist/locales/en-US.js +1 -1
  32. package/dist/locales/en-US.js.map +1 -1
  33. package/dist/locales/zh-CN.js +2 -2
  34. package/dist/locales/zh-CN.js.map +1 -1
  35. package/dist/router/detailRoutes.js.map +1 -1
  36. package/dist/router/index.js.map +1 -1
  37. package/dist/router/routes.js +1 -1
  38. package/dist/router/routes.js.map +1 -1
  39. package/dist/stores/user.d.ts +2 -2
  40. package/dist/stores/user.js.map +1 -1
  41. package/dist/style.css +1 -1
  42. package/dist/theme/mix.d.ts +3 -3
  43. package/dist/theme/mix.js.map +1 -1
  44. package/dist/types/api.d.ts +1 -1
  45. package/dist/types/api.js.map +1 -1
  46. package/dist/utils/url.d.ts +2 -0
  47. package/dist/utils/url.js +9 -3
  48. package/dist/utils/url.js.map +1 -1
  49. package/dist/views/error/404.vue.js +2 -2
  50. package/dist/views/error/4042.vue.js.map +1 -1
  51. package/dist/views/login/skins/SplitPanel.vue.js +1 -1
  52. package/dist/views/login/skins/SplitPanel2.vue.js.map +1 -1
  53. package/dist/views/system/log/op/index.vue.js +1 -1
  54. package/dist/views/system/log/op/index2.vue.js +1 -1
  55. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  56. package/dist/views/system/menu/components/ButtonManager.vue.js +1 -1
  57. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  58. package/dist/views/system/menu/components/MenuFormModal.vue.js +3 -3
  59. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  60. package/dist/views/system/menu/index.vue.js +2 -2
  61. package/dist/views/system/menu/index2.vue.js +6 -6
  62. package/dist/views/system/menu/index2.vue.js.map +1 -1
  63. package/dist/views/system/module/index.vue.js +2 -2
  64. package/dist/views/system/module/index2.vue.js +2 -2
  65. package/dist/views/system/module/index2.vue.js.map +1 -1
  66. package/dist/views/system/user/components/ResetPasswordModal.vue.js +1 -1
  67. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  68. package/dist/views/system/user/components/UserFormModal.vue.js +1 -1
  69. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  70. package/package.json +6 -2
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .reauth-hint[data-v-f489ff1a]{margin:0 0 12px;color:var(--n-text-color-3);font-size:13px;line-height:1.5}:root{--color-gray-900: #181a2a;--color-gray-800: #2f313f;--color-gray-700: #5d5f6a;--color-gray-600: #7b7c85;--color-gray-500: #85868e;--color-gray-400: #bababf;--color-gray-300: #d1d1d1;--color-gray-200: #e3e3e3;--color-gray-100: #f1f1f1;--color-gray-50: #f0f0f0;--color-white: #ffffff;--color-primary: #646cff;--color-primary-hover: #7d84ff;--color-primary-pressed: #5259d1;--color-primary-light: #f0f0ff;--color-success: #00a43b;--color-success-bg: #e0f4e7;--color-warning: #a88400;--color-warning-bg: #fff8e0;--color-danger: #d15054;--color-danger-bg: #ffeced;--color-info: #0090b5;--color-info-bg: #e0f2f6;--color-bg-body: #f2f8f5;--color-bg-app: linear-gradient( 135deg, #f7fbf9 0%, #edf7f3 55%, #f7fbf9 100% );--color-bg-container: rgba(255, 255, 255, .78);--color-bg-container-solid: #fefefe;--color-bg-elevated: #ffffff;--color-text-primary: #111827;--color-text-secondary: #374151;--color-text-tertiary: #6b7280;--color-text-disabled: #9ca3af;--color-border: #d7dbe0;--color-border-strong: #bfc5cd;--color-fill: #eef1f5;--color-fill-hover: #e5e9ef;--color-bg-input: #ffffff;--color-fill-disabled: #eef1f5;--color-mask: rgba(24, 26, 42, .45);--color-header-bg: rgba(255, 255, 255, .82);--font-family-base: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;--font-family-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;--font-size-xs: 12px;--line-height-xs: 18px;--font-size-sm: 13px;--line-height-sm: 20px;--font-size-base: 14px;--line-height-base: 22px;--font-size-md: 16px;--line-height-md: 24px;--font-size-lg: 20px;--line-height-lg: 28px;--font-size-xl: 24px;--line-height-xl: 32px;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--space-4: 4px;--space-8: 8px;--space-12: 12px;--space-16: 16px;--space-24: 24px;--space-32: 32px;--radius-sm: 6px;--radius-md: 10px;--radius-lg: 12px;--radius-xl: 16px;--shadow-1: 0 1px 2px rgba(24, 26, 42, .05), 0 2px 6px rgba(24, 26, 42, .06);--shadow-2: 0 10px 30px rgba(24, 26, 42, .12);--shadow-3: 0 16px 48px rgba(24, 26, 42, .18);--transition-fast: .15s ease;--transition-base: .2s ease}:root[data-theme=dark]{--color-primary: #14b8a6;--color-primary-hover: #2dd4bf;--color-primary-pressed: #0f766e;--color-primary-light: rgba(20, 184, 166, .16);--color-success: #34d399;--color-success-bg: rgba(16, 185, 129, .14);--color-warning: #fbbf24;--color-warning-bg: rgba(251, 191, 36, .14);--color-danger: #fb7185;--color-danger-bg: rgba(244, 63, 94, .16);--color-info: #38bdf8;--color-info-bg: rgba(56, 189, 248, .14);--color-bg-body: #020617;--color-bg-app: linear-gradient( 135deg, #020617 0%, #0f172a 55%, #020617 100% );--color-bg-container: rgba(18, 28, 46, .9);--color-bg-container-solid: #121c2e;--color-bg-elevated: #182234;--color-text-primary: #f8fafc;--color-text-secondary: #cbd5e1;--color-text-tertiary: #94a3b8;--color-text-disabled: #64748b;--color-border: rgba(71, 85, 105, .4);--color-border-strong: rgba(100, 116, 139, .5);--color-fill: #0f172a;--color-fill-hover: #1a2436;--color-bg-input: #0f172a;--color-fill-disabled: #1b2434;--color-mask: rgba(2, 6, 23, .72);--color-header-bg: rgba(15, 23, 42, .7);--shadow-1: 0 1px 0 rgba(255, 255, 255, .04) inset, 0 2px 8px rgba(2, 6, 23, .3);--shadow-2: 0 10px 30px rgba(2, 6, 23, .45), 0 0 0 1px rgba(51, 65, 85, .35);--shadow-3: 0 16px 48px rgba(2, 6, 23, .55), 0 0 0 1px rgba(51, 65, 85, .4)}:root{--pad-page: 14px;--gap-card: 12px;--row-h: 58px;--sidebar-w: 236px;--sidebar-w-collapsed: 76px;--rail-w: 64px;--header-h: 62px}:root[data-density=compact]{--pad-page: 10px;--gap-card: 8px;--row-h: 48px}*{box-sizing:border-box}html,body,#app{height:100%;margin:0}body{font-family:var(--font-family-base);font-size:var(--font-size-base);line-height:var(--line-height-base);color:var(--color-text-primary);background:var(--color-bg-app);-webkit-font-smoothing:antialiased}:root[data-theme=dark] body{background-attachment:fixed}a{color:var(--color-primary);text-decoration:none}.tabular{font-variant-numeric:tabular-nums}.n-card{border:1px solid var(--color-border)}:root:not([data-theme=dark]) .n-card:not(.n-modal){background:linear-gradient(145deg,#ffffffe0,#ffffffad);box-shadow:inset 0 1px #ffffffe6,0 8px 24px #2d695a14;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}:root:not([data-theme=dark]) .n-card.n-modal{background:var(--color-bg-elevated);box-shadow:var(--shadow-3);backdrop-filter:none;-webkit-backdrop-filter:none}:root[data-theme=dark] .n-card{background:#121c2e;border-color:#47556966;box-shadow:0 8px 24px #02061738}:root[data-theme=dark] ::-webkit-scrollbar-thumb{background:#64748b85}:root[data-theme=dark] ::-webkit-scrollbar-thumb:hover{background:#94a3b8b3}:root[data-theme=dark] ::selection{background:#14b8a647;color:#ecfeff}html.theme-switching,html.theme-switching *,html.theme-switching *:before,html.theme-switching *:after{transition:background-color .22s ease,color .22s ease,border-color .22s ease,box-shadow .22s ease!important}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-thumb{background:#90939966;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#909399b3}::-webkit-scrollbar-track{background:transparent}html[data-gray]{filter:grayscale(1)}.fade-enter-active,.fade-leave-active{transition:opacity .2s ease}.fade-enter-from,.fade-leave-to{opacity:0}.fade-slide-enter-active,.fade-slide-leave-active{transition:opacity .24s ease,transform .24s ease}.fade-slide-enter-from{opacity:0;transform:translate(16px)}.fade-slide-leave-to{opacity:0;transform:translate(-16px)}.n-menu,.n-dropdown-menu{user-select:none;-webkit-user-select:none}.n-data-table{--table-selected-bg: var(--color-primary-light)}.n-data-table .n-data-table-tr:nth-child(2n)>.n-data-table-td{background-color:var(--n-merged-td-color-striped)}.n-data-table .n-data-table-tr:has(>.n-data-table-td--selection .n-checkbox--checked,>.n-data-table-td--selection .n-radio--checked)>.n-data-table-td,.smart-table .smart-table-row--active>.n-data-table-td{background-color:var(--table-selected-bg)}.n-data-table .n-data-table-tr.row-selected>.n-data-table-td{background-color:var(--table-selected-bg)}.n-data-table .n-data-table-tr.row-selected>.n-data-table-td--fixed-left,.n-data-table .n-data-table-tr.row-selected>.n-data-table-td--fixed-right{background-color:var(--table-fixed-bg);background-image:linear-gradient(var(--table-selected-bg),var(--table-selected-bg))}.n-data-table .n-data-table-tr.row-selected>.n-data-table-td:first-child{box-shadow:inset 3px 0 0 var(--color-primary)}.n-data-table .n-data-table-th,.n-data-table .n-data-table-td{border-right:1px solid var(--n-merged-border-color);white-space:nowrap}.n-data-table .n-data-table-th--last,.n-data-table .n-data-table-td--last-col{border-right:0}.n-data-table .n-data-table-th--fixed-left,.n-data-table .n-data-table-th--fixed-right{background-color:var(--color-fill)}.n-data-table{--table-fixed-bg: var(--color-bg-container-solid)}.n-modal .n-data-table,.n-drawer .n-data-table,.n-popover .n-data-table{--table-fixed-bg: var(--n-merged-td-color)}.n-data-table .n-data-table-td--fixed-left,.n-data-table .n-data-table-td--fixed-right{background-color:var(--table-fixed-bg)}.smart-table .n-data-table .smart-table-row--active>.n-data-table-td--fixed-left,.smart-table .n-data-table .smart-table-row--active>.n-data-table-td--fixed-right{background-color:var(--table-fixed-bg);background-image:linear-gradient(var(--smart-table-active-row-bg, rgba(99, 102, 241, .08)),var(--smart-table-active-row-bg, rgba(99, 102, 241, .08)))}.n-data-table .n-data-table-td--last-col .n-space{gap:0!important}.n-data-table .n-data-table-td .n-space:has(.n-button){flex-wrap:nowrap!important;min-width:max-content;white-space:nowrap}.n-data-table .n-data-table-td .n-space:has(.n-button)>.n-space-item,.n-data-table .n-data-table-td .n-button{white-space:nowrap}.table-zoom{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:var(--color-bg-body);padding:16px;display:flex;flex-direction:column;min-height:0;gap:8px}.table-zoom>.n-data-table,.table-zoom>.route-table,.table-zoom>.table-zoom-body{flex:1;min-height:0}.row-sort .drag-handle{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:var(--radius-sm, 6px);color:var(--color-text-tertiary);cursor:grab;transition:color var(--transition-base, .2s ease),background-color var(--transition-base, .2s ease)}.row-sort .drag-handle:hover{background:var(--color-fill-hover);color:var(--color-primary)}.row-sort .drag-handle:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.row-sort .drag-handle:active{cursor:grabbing}.row-sort .row-chosen>td{position:relative;z-index:1;background:var(--color-bg-elevated);box-shadow:0 6px 16px #0000001f;cursor:grabbing}.row-sort .row-ghost>td{background:var(--color-primary-light);color:var(--color-primary)}.row-sort .row-ghost>td:first-child{box-shadow:inset 3px 0 0 var(--color-primary)}.row-sort .row-fallback{display:none!important}.row-sort.is-dragging .n-data-table-tr:not(.row-ghost){opacity:.5}.row-sort.is-dragging .n-data-table-td{transition:none}.side-filter{flex:0 0 var(--side-filter-width, 224px);display:flex;flex-direction:column;gap:8px;min-height:0;padding:12px 10px;border-radius:var(--radius-lg, 12px);background:var(--color-bg-container);box-shadow:var(--shadow-1);transition:flex-basis var(--transition-base, .2s ease)}.side-filter__head{display:flex;align-items:center;justify-content:space-between;gap:4px;min-height:24px;padding-left:6px}.side-filter__actions{display:flex;flex:none;margin-left:auto;align-items:center;gap:2px}.side-filter__body{display:flex;flex:1;flex-direction:column;gap:2px;min-height:0;overflow-y:auto;scrollbar-width:thin}.side-filter__divider{height:1px;margin:6px 8px;background:var(--color-border)}.side-filter__empty{display:flex;flex-direction:column;align-items:center;gap:10px;margin-top:24px;color:var(--color-text-tertiary);font-size:var(--font-size-sm, 13px)}.side-row{position:relative;display:flex;align-items:center;gap:8px;width:100%;height:34px;padding:0 10px;border:0;border-radius:var(--radius-md, 10px);background:transparent;color:var(--color-text-secondary);font:inherit;font-size:var(--font-size-base, 14px);text-align:left;cursor:pointer;transition:background var(--transition-fast, .15s ease),color var(--transition-fast, .15s ease)}.side-row:hover{background:var(--color-fill-hover);color:var(--color-text-primary)}.side-row.is-active{background:var(--color-primary-light);color:var(--color-primary);font-weight:var(--font-weight-medium, 500)}.side-row.is-active:before,.side-tree .n-tree-node--selected:before{content:"";position:absolute;top:50%;left:0;width:3px;height:16px;border-radius:0 3px 3px 0;background:var(--color-primary);transform:translateY(-50%)}.side-row__icon,.side-row__dot{flex:none}.side-row__dot{width:6px;height:6px;margin:0 4px;border-radius:50%;background:var(--color-border-strong);transition:background var(--transition-fast, .15s ease)}.side-row:hover .side-row__dot{background:var(--color-text-tertiary)}.side-row.is-active .side-row__dot{background:currentcolor}.side-row__label{flex:1;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.side-row__count{flex:none;min-width:22px;height:18px;padding:0 6px;border-radius:9px;background:var(--color-fill);color:var(--color-text-tertiary);font-size:var(--font-size-xs, 12px);font-variant-numeric:tabular-nums;line-height:18px;text-align:center;transition:background var(--transition-fast, .15s ease),color var(--transition-fast, .15s ease)}.side-row.is-active .side-row__count{background:var(--color-primary);color:var(--color-white, #fff)}.side-tree.n-tree{flex:1;min-height:0;overflow:auto;scrollbar-width:thin}.side-tree .n-tree-node{position:relative;padding-right:4px}.side-tree .n-tree-node--selected .n-tree-node-content__text{color:var(--color-primary);font-weight:var(--font-weight-medium, 500)}.side-tree .n-tree-node-content__suffix{opacity:0;transition:opacity var(--transition-fast, .15s ease)}.side-tree .n-tree-node:hover .n-tree-node-content__suffix,.side-tree .n-tree-node--selected .n-tree-node-content__suffix{opacity:1}.side-actions{display:flex;align-items:center;gap:2px}@media(max-width:1280px){.side-filter{flex-basis:min(var(--side-filter-width, 224px),200px)}}.form-section+.form-section{margin-top:16px}.form-section__title{margin-bottom:10px;color:var(--color-text-primary);font-weight:var(--font-weight-semibold, 600)}.form-section--fieldset,.form-section--panel{min-width:0;border:none;padding:0}.form-section--fieldset{margin-inline:0}.form-section--fieldset>legend{display:block;width:100%;margin-bottom:12px;padding:0 0 8px;border-bottom:1px solid var(--color-border);color:var(--color-text-primary);font-weight:var(--font-weight-semibold, 600)}.form-section--panel>.form-section__title,.form-section--panel>.head{display:flex;box-sizing:content-box;align-items:center;justify-content:space-between;height:var(--panel-head-h, 30px);margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid var(--color-border)}.page-view:has(>.smart-table),.page-view:has(>.fill-page),.page-view:has(>.side-page){height:100%}.page-view>.smart-table{height:100%;min-height:0}.fill-page{display:flex;flex-direction:column;min-height:0;height:100%;overflow:hidden}.fill-page>*{flex-shrink:0}.side-page{display:flex;gap:12px;align-items:stretch;height:100%;min-height:0}.side-page>.smart-table{flex:1;align-self:stretch;min-width:0;min-height:0;height:100%}.fill-page>.smart-table,.fill-main,:is(.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table{flex:1 1 auto;min-height:0}.fill-main{display:flex;flex-direction:column}:is(.page-view,.fill-page,.side-page,.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table>.smart-table-card{display:flex;flex:1;flex-direction:column;min-height:0}:is(.page-view,.fill-page,.side-page,.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table>.smart-table-card>:is(.n-card-content,.n-card__content){display:flex;flex:1;flex-direction:column;min-height:0}:is(.page-view,.fill-page,.side-page,.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table>.smart-table-card>:is(.n-card-content,.n-card__content)>.n-data-table{flex:1;min-height:0}.fill-card{display:flex;flex:1;flex-direction:column;min-height:0}.fill-card>:is(.n-card-content,.n-card__content){display:flex;flex:1;flex-direction:column;min-height:0}.fill-card>:is(.n-card-content,.n-card__content)>.n-data-table{flex:1;min-height:0}.fill-tabs{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.fill-tabs>.n-tabs-nav{flex-shrink:0}.fill-tabs>.n-tabs-pane-wrapper,.fill-tabs>.n-tabs-pane-wrapper>.n-tab-pane,.fill-tabs>.n-tab-pane{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.fill-split{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--fill-split-gap, var(--gap-card, 12px));min-height:0}.fill-split--row{flex-direction:row}.fill-split>.fill-main,.fill-split>.smart-table{flex:1 1 0;min-height:0}.fill-pass,.fill-pass>.n-spin-content{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.fill-page--soft{height:auto;min-height:100%;overflow:visible}.chart[data-v-558fd76a]{width:100%;height:320px}.code-block[data-v-953af54c]{position:relative;font-size:12px;line-height:1.5}.copy-btn[data-v-953af54c]{position:absolute;top:0;right:0}.cron-editor[data-v-8ed8204a]{width:100%}.cron-rows[data-v-8ed8204a]{display:flex;flex-direction:column;gap:10px;width:100%}.cron-row[data-v-8ed8204a]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.cron-num[data-v-8ed8204a]{width:96px}.cron-dow[data-v-8ed8204a]{width:120px}.cron-list[data-v-8ed8204a]{flex:1;min-width:200px}.cron-sep[data-v-8ed8204a]{color:var(--color-text-secondary);font-size:var(--font-size-sm)}.cron-hint[data-v-8ed8204a]{margin-top:6px;font-size:12px;color:var(--color-text-tertiary)}.cron-preview[data-v-8ed8204a]{margin-top:12px;padding:10px 12px;border-radius:var(--radius-md);background:var(--color-fill);display:flex;flex-direction:column;gap:8px}.cron-warn[data-v-8ed8204a]{margin-bottom:2px}.cron-preview-error[data-v-8ed8204a]{color:var(--color-danger);font-size:var(--font-size-sm)}.cron-preview-row[data-v-8ed8204a]{display:flex;gap:12px;align-items:flex-start}.cron-preview-label[data-v-8ed8204a]{flex:0 0 auto;color:var(--color-text-secondary);font-size:var(--font-size-sm);line-height:22px}.cron-code[data-v-8ed8204a]{font-family:var(--font-family-mono, ui-monospace, monospace);font-size:13px;line-height:22px}.cron-occurrences[data-v-8ed8204a]{display:flex;flex-wrap:wrap;gap:2px 16px}.cron-occurrence[data-v-8ed8204a]{font-family:var(--font-family-mono, ui-monospace, monospace);font-size:13px;line-height:22px;font-variant-numeric:tabular-nums}.cron-empty[data-v-8ed8204a]{color:var(--color-text-tertiary);font-size:var(--font-size-sm)}.detail-page[data-v-e99908b8]{display:flex;flex-direction:column;gap:var(--gap-card, 16px)}.detail-header[data-v-e99908b8]{display:flex;align-items:center;gap:8px}.detail-title[data-v-e99908b8]{margin:0;font-size:var(--font-size-lg, 18px);font-weight:600;color:var(--color-text-primary)}.detail-actions[data-v-e99908b8]{margin-left:auto}.error-boundary[data-v-3b4e3577]{min-height:60vh;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;color:var(--color-text-secondary)}h2[data-v-3b4e3577]{margin:0;color:var(--color-text-primary);font-size:var(--font-size-lg)}.desc[data-v-3b4e3577]{margin:0;max-width:460px}.detail[data-v-3b4e3577]{max-width:100%;padding:6px 10px;overflow-x:auto;border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg-container);color:var(--color-danger);font-family:var(--font-family-mono);font-size:var(--font-size-xs)}.export-cols-head[data-v-6b86f7cf]{margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--n-border-color)}.smart-form--fullscreen{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;display:flex;flex-direction:column;border-radius:0}.smart-form--fullscreen>.n-card__content{flex:1;min-height:0;overflow:auto}.import-steps[data-v-72e37069]{margin-bottom:20px}.import-pane[data-v-72e37069]{min-height:200px}.import-upload-icon[data-v-72e37069]{margin-bottom:12px;color:var(--n-text-color-3)}.import-mapping-head[data-v-72e37069],.import-mapping-row[data-v-72e37069]{display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:center}.import-mapping-head[data-v-72e37069]{font-weight:600;font-size:13px;margin-bottom:8px;color:var(--n-text-color-2)}.import-mapping-row[data-v-72e37069]{margin-bottom:8px}.import-mapping-header[data-v-72e37069]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.import-strategy[data-v-72e37069]{margin-top:16px;display:flex;flex-wrap:wrap;align-items:center;gap:8px}[data-v-72e37069] .import-cell{padding:2px;border-radius:4px}[data-v-72e37069] .import-cell--error{background:var(--color-danger-bg)}[data-v-72e37069] .import-cell--dup{background:var(--color-warning-bg)}.pw-meter[data-v-81b0f6bf]{margin:-8px 0 14px}.pw-bar[data-v-81b0f6bf]{display:flex;gap:6px}.pw-bar span[data-v-81b0f6bf]{flex:1;height:4px;border-radius:2px;transition:background var(--transition-fast)}.pw-level[data-v-81b0f6bf]{margin-top:6px;font-size:12px}.pw-rules[data-v-81b0f6bf]{margin:8px 0 0;padding:0;list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:2px 12px}.pw-rules li[data-v-81b0f6bf]{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--color-text-tertiary)}.pw-rules li.ok[data-v-81b0f6bf]{color:#5aa86e}.select-table[data-v-78ca7f91]{height:520px;min-height:0;display:flex;flex-direction:column;gap:12px}.select-table-search[data-v-78ca7f91]{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.select-table-search[data-v-78ca7f91] .n-input{flex:0 1 200px}.select-table-search .keyword-input[data-v-78ca7f91]{flex:1 1 320px;min-width:260px}.select-table-search[data-v-78ca7f91] .n-button{flex:none}.select-table-grid[data-v-78ca7f91]{flex:1;min-height:0}[data-v-78ca7f91] .select-table-row-selected td{background-color:var(--table-selected-bg)}.user-picker[data-v-41b95328]{display:flex;gap:12px;min-height:400px}.panel-header[data-v-41b95328]{display:flex;align-items:center;justify-content:space-between;font-size:13px;font-weight:600;padding:0 0 8px;border-bottom:1px solid var(--n-border-color, #e0e0e6);margin-bottom:8px}.picker-tree[data-v-41b95328]{width:160px;flex-shrink:0;overflow:auto;border-right:1px solid var(--n-border-color, #e0e0e6);padding-right:12px}.picker-table[data-v-41b95328]{flex:1;min-width:0;overflow:hidden}.picker-selected[data-v-41b95328]{width:200px;flex-shrink:0;border-left:1px solid var(--n-border-color, #e0e0e6);padding-left:12px;display:flex;flex-direction:column}.selected-list[data-v-41b95328]{flex:1;overflow:auto;max-height:380px}.selected-item[data-v-41b95328]{display:flex;align-items:center;justify-content:space-between;padding:4px 0;font-size:13px;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.selected-item[data-v-41b95328]:last-child{border-bottom:none}.selected-name[data-v-41b95328]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.selected-account[data-v-41b95328]{color:var(--n-text-color-disabled, #999);font-size:12px;margin-left:2px}.palette[data-v-7f4fa2eb]{width:560px;max-width:92vw;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-3);overflow:hidden}.search[data-v-7f4fa2eb]{display:flex;align-items:center;gap:8px;padding:6px 16px;border-bottom:1px solid var(--color-border)}.sicon[data-v-7f4fa2eb]{color:var(--color-text-tertiary);flex-shrink:0}.list[data-v-7f4fa2eb]{padding:8px}.item[data-v-7f4fa2eb]{display:flex;align-items:center;gap:10px;height:44px;padding:0 12px;border-radius:var(--radius-md);cursor:pointer;color:var(--color-text-primary)}.item.active[data-v-7f4fa2eb]{background:var(--color-primary-light);color:var(--color-primary)}.iicon[data-v-7f4fa2eb]{flex-shrink:0}.ititle[data-v-7f4fa2eb]{font-size:var(--font-size-md)}.ititle[data-v-7f4fa2eb] mark{background:transparent;color:var(--color-primary);font-weight:600}.ipath[data-v-7f4fa2eb]{margin-left:auto;font-size:var(--font-size-sm);color:var(--color-text-tertiary)}.empty[data-v-7f4fa2eb]{padding:32px 0}.hint[data-v-7f4fa2eb]{padding:8px 16px;border-top:1px solid var(--color-border);font-size:var(--font-size-sm);color:var(--color-text-tertiary)}.site-logo[data-v-88ac0194]{display:block;width:auto;max-width:100%;object-fit:contain}.oauth-brand-badge[data-v-d7509bf4]{display:block;width:100%;height:100%;max-width:100%;max-height:100%;object-fit:cover;border-radius:50%;overflow:hidden;pointer-events:none;-webkit-user-select:none;user-select:none;flex-shrink:0}.oauth-brand-icon[data-v-d7509bf4]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:0}.oauth-brand-letter[data-v-d7509bf4]{font-size:12px;font-weight:700;color:var(--color-text-secondary, #666);line-height:1}.login-form[data-v-edac6de7]{width:100%}.lf-pending-alert[data-v-edac6de7]{margin-bottom:16px;border-radius:10px;text-align:left}.lf-brand[data-v-edac6de7]{display:flex;align-items:center;gap:10px;margin-bottom:18px}.lf-word[data-v-edac6de7]{font-size:22px;font-weight:700;letter-spacing:.2px;color:var(--lf-title, var(--color-text-primary))}.lf-title[data-v-edac6de7]{font-size:var(--font-size-lg);font-weight:600;margin:0 0 22px;color:var(--lf-title, var(--color-text-primary))}.lf-hint-line[data-v-edac6de7]{margin:-14px 0 18px;font-size:13px;color:var(--lf-hint, var(--color-text-tertiary))}.row[data-v-edac6de7]{margin:4px 0 20px}.lf-between[data-v-edac6de7]{display:flex;align-items:center;justify-content:space-between}.lf-link[data-v-edac6de7]{font-size:13px;color:var(--color-primary);cursor:pointer;-webkit-user-select:none;user-select:none}.lf-link[data-v-edac6de7]:hover{opacity:.85}.lf-link-disabled[data-v-edac6de7]{color:var(--lf-hint, var(--color-text-tertiary));cursor:default;pointer-events:none}.lf-captcha[data-v-edac6de7]{display:flex;gap:10px;width:100%;align-items:stretch}.lf-captcha-img[data-v-edac6de7]{flex:0 0 auto;height:40px;min-width:96px;padding:0;border:1px solid var(--lf-border, var(--color-border));border-radius:var(--radius-md);background:#fff;cursor:pointer;overflow:hidden;display:flex;align-items:center;justify-content:center}.lf-captcha-img[data-v-edac6de7] svg{height:100%;width:auto}.lf-send-btn[data-v-edac6de7]{flex:0 0 auto;height:40px;min-width:96px;padding:0 12px;border:1px solid var(--lf-border, var(--color-border));border-radius:var(--radius-md);background:var(--color-fill);font-size:13px;color:var(--lf-title, var(--color-text-secondary));cursor:pointer;transition:border-color var(--transition-fast),color var(--transition-fast)}.lf-send-btn[data-v-edac6de7]:hover:not(:disabled){border-color:var(--color-primary);color:var(--color-primary)}.lf-send-btn[data-v-edac6de7]:disabled{opacity:.6;cursor:not-allowed}.hero-btn[data-v-edac6de7]{width:100%;height:48px;border:none;border-radius:var(--radius-md);color:#fff;font-size:var(--font-size-md);font-weight:600;cursor:pointer;transition:transform var(--transition-fast),box-shadow var(--transition-fast)}.hero-btn[data-v-edac6de7]:hover{transform:translateY(-2px)}.hero-btn[data-v-edac6de7]:active{transform:translateY(0)}.hero-btn[data-v-edac6de7]:disabled{opacity:.7;cursor:not-allowed}.lf-divider[data-v-edac6de7]{display:flex;align-items:center;gap:14px;margin:24px 0 16px}.lf-divider[data-v-edac6de7]:before,.lf-divider[data-v-edac6de7]:after{content:"";flex:1;height:1px;background:var(--lf-border, var(--color-border))}.lf-divider span[data-v-edac6de7]{font-size:12px;color:var(--lf-hint, var(--color-text-tertiary))}.lf-sso[data-v-edac6de7]{display:flex;flex-wrap:wrap;justify-content:center;gap:12px}.lf-sso-btn[data-v-edac6de7]{width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:inherit;text-decoration:none;cursor:pointer;overflow:hidden;box-sizing:border-box;flex-shrink:0}.lf-sso-btn[data-v-edac6de7]:hover{text-decoration:none;color:inherit}.lf-sso-btn[data-v-edac6de7]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.lf-sso-more[data-v-edac6de7]{width:32px;height:32px;border:1px solid var(--lf-border, var(--color-border));background:var(--color-fill, #f5f5f5);color:var(--color-text-tertiary, #999)}.lf-foot[data-v-edac6de7]{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:24px;font-size:12px;color:var(--lf-hint, var(--color-text-tertiary))}.lf-foot a[data-v-edac6de7]{color:inherit;text-decoration:none}.lf-foot a[data-v-edac6de7]:hover{color:var(--color-primary)}.lf-ver[data-v-edac6de7]{opacity:.75}.aurora[data-v-e994c489]{position:relative;height:100dvh;overflow:hidden;display:flex;align-items:center;justify-content:center;background:radial-gradient(140% 120% at 50% 0%,#12162b,#0a0b12 55%,#06060c)}.aurora[data-v-e994c489]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);background-size:46px 46px;-webkit-mask-image:radial-gradient(circle at 50% 45%,#000 0%,transparent 72%);mask-image:radial-gradient(circle at 50% 45%,#000 0%,transparent 72%)}.aurora[data-v-e994c489]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none;background:radial-gradient(120% 120% at 50% 42%,transparent 52%,rgba(0,0,0,.6) 100%)}.aurora-bg[data-v-e994c489]{position:absolute;top:-20%;right:-20%;bottom:-20%;left:-20%;z-index:0;background:radial-gradient(38% 38% at 18% 22%,var(--a1),transparent 68%),radial-gradient(42% 42% at 82% 18%,var(--a2),transparent 70%),radial-gradient(48% 48% at 60% 88%,var(--a3),transparent 72%),radial-gradient(34% 34% at 88% 68%,var(--a4),transparent 66%);filter:blur(28px);animation:aurora-move-e994c489 18s ease-in-out infinite alternate}@keyframes aurora-move-e994c489{0%{transform:translate3d(-3%,-2%,0) rotate(0) scale(1.05)}50%{transform:translate3d(3%,2%,0) rotate(4deg) scale(1.16)}to{transform:translate3d(-2%,3%,0) rotate(-3deg) scale(1.08)}}.stars[data-v-e994c489]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-image:radial-gradient(1.5px 1.5px at 20% 30%,rgba(255,255,255,.7),transparent 60%),radial-gradient(1px 1px at 70% 62%,rgba(255,255,255,.5),transparent 60%),radial-gradient(1.5px 1.5px at 42% 82%,rgba(255,255,255,.6),transparent 60%),radial-gradient(1px 1px at 85% 22%,rgba(255,255,255,.5),transparent 60%),radial-gradient(1px 1px at 55% 14%,rgba(255,255,255,.55),transparent 60%),radial-gradient(1.5px 1.5px at 12% 66%,rgba(255,255,255,.5),transparent 60%),radial-gradient(1px 1px at 92% 48%,rgba(255,255,255,.45),transparent 60%);animation:twinkle-e994c489 5s ease-in-out infinite}@keyframes twinkle-e994c489{0%,to{opacity:.45}50%{opacity:.9}}.orb[data-v-e994c489]{position:absolute;z-index:0;border-radius:50%;filter:blur(55px);opacity:.55}.orb-1[data-v-e994c489]{width:340px;height:340px;background:var(--a1);top:-60px;left:-40px;animation:float-y-e994c489 14s ease-in-out infinite}.orb-2[data-v-e994c489]{width:280px;height:280px;background:var(--a4);bottom:-80px;right:-40px;animation:float-y-e994c489 16s ease-in-out infinite reverse}.orb-3[data-v-e994c489]{width:200px;height:200px;background:var(--a3);top:38%;right:18%;animation:float-y-e994c489 20s ease-in-out infinite}@keyframes float-y-e994c489{0%,to{transform:translateY(0)}50%{transform:translateY(-30px)}}.aurora-content[data-v-e994c489]{position:relative;z-index:3;width:100%;max-width:520px;padding:24px}.halo[data-v-e994c489]{position:absolute;z-index:0;top:8px;right:8px;bottom:8px;left:8px;border-radius:36px;background:conic-gradient(from 0deg,var(--a1),var(--a2),var(--a3),var(--a4),var(--a1));filter:blur(48px);opacity:.6;animation:spin-e994c489 16s linear infinite}@keyframes spin-e994c489{to{transform:rotate(360deg)}}.glass-card[data-v-e994c489]{--lf-title: #fff;--lf-hint: rgba(255, 255, 255, .5);position:relative;z-index:1;width:100%;padding:46px;border-radius:20px;background:#ffffff12;border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(26px) saturate(150%);-webkit-backdrop-filter:blur(26px) saturate(150%);box-shadow:0 30px 80px #0000008c,0 0 60px -12px var(--a2),inset 0 1px #fff3;overflow:hidden}.glass-card[data-v-e994c489]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:20px;padding:1px;background:linear-gradient(135deg,var(--a1),transparent 45%,var(--a2));-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none;opacity:.9}.glass-card[data-v-e994c489]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;pointer-events:none;background:linear-gradient(120deg,transparent 36%,rgba(255,255,255,.1) 48%,transparent 60%);background-size:220% 100%;background-repeat:no-repeat;animation:sheen-e994c489 8s ease-in-out infinite}@keyframes sheen-e994c489{0%{background-position:180% 0}55%,to{background-position:-60% 0}}.grain[data-v-e994c489]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;pointer-events:none;opacity:.05;mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}.aurora.light[data-v-e994c489]{background:radial-gradient(140% 120% at 50% 0%,#eef1fb,#f6f7fc 55%,#fff)}.aurora.light[data-v-e994c489]:before{background-image:linear-gradient(rgba(0,0,0,.05) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.05) 1px,transparent 1px)}.aurora.light[data-v-e994c489]:after{background:radial-gradient(120% 120% at 50% 42%,transparent 55%,rgba(120,130,180,.12) 100%)}.aurora.light .stars[data-v-e994c489]{display:none}.aurora.light .halo[data-v-e994c489]{opacity:.5}.aurora.light .glass-card[data-v-e994c489]{--lf-title: var(--color-text-primary);--lf-hint: var(--color-text-tertiary);background:#ffffff9e;border:1px solid rgba(214,218,235,.9);box-shadow:0 30px 80px #505aa02e,0 0 60px -12px var(--a2),inset 0 1px #ffffffe6}.aurora.light .glass-card[data-v-e994c489]:before{display:none}.aurora.light .glass-card[data-v-e994c489]:after{display:none}@media(max-width:480px){.aurora-content[data-v-e994c489]{padding:16px}.glass-card[data-v-e994c489]{padding:32px 24px}}@media(prefers-reduced-motion:reduce){.aurora-bg[data-v-e994c489],.orb[data-v-e994c489],.stars[data-v-e994c489],.halo[data-v-e994c489],.glass-card[data-v-e994c489]:after{animation:none}.glass-card[data-v-e994c489]:after{display:none}}.split[data-v-9b2b9733]{height:100dvh;display:grid;grid-template-columns:1.15fr .85fr;background:var(--color-bg-body)}.panel[data-v-9b2b9733]{position:relative;overflow:hidden;background:var(--color-bg-body);border-right:1px solid var(--color-border)}.panel[data-v-9b2b9733]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(127,127,127,.08) 1px,transparent 1px),linear-gradient(90deg,rgba(127,127,127,.08) 1px,transparent 1px);background-size:40px 40px;-webkit-mask-image:radial-gradient(circle at 30% 40%,#000,transparent 72%);mask-image:radial-gradient(circle at 30% 40%,#000,transparent 72%)}.panel-aurora[data-v-9b2b9733]{position:absolute;top:-20%;right:-20%;bottom:-20%;left:-20%;background:radial-gradient(40% 40% at 25% 20%,var(--a1),transparent 68%),radial-gradient(45% 45% at 80% 78%,var(--a2),transparent 70%);filter:blur(45px);opacity:.9;animation:panel-move-9b2b9733 22s ease-in-out infinite alternate}@keyframes panel-move-9b2b9733{0%{transform:translate3d(-3%,-2%,0) scale(1.05)}to{transform:translate3d(3%,3%,0) scale(1.12)}}.panel-inner[data-v-9b2b9733]{position:relative;z-index:1;padding:64px 56px;display:flex;flex-direction:column;height:100%;justify-content:center}.logo[data-v-9b2b9733]{display:flex;align-items:center;gap:12px;font-size:22px;font-weight:700;color:#2a3c82}.bar[data-v-9b2b9733]{width:40px;height:3px;border-radius:2px;margin:28px 0 20px}.headline[data-v-9b2b9733]{font-size:42px;line-height:1.2;font-weight:800;color:var(--color-text-primary);margin:0}.sub[data-v-9b2b9733]{color:var(--color-text-secondary);margin:16px 0 28px}.points[data-v-9b2b9733]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:14px}.points li[data-v-9b2b9733]{display:flex;align-items:center;gap:10px;color:var(--color-text-secondary)}.form-wrap[data-v-9b2b9733]{position:relative;display:flex;flex-direction:column;background:var(--color-bg-container)}.mid[data-v-9b2b9733]{flex:1;display:flex;align-items:center;justify-content:center;padding:24px}.form-inner[data-v-9b2b9733]{width:100%;max-width:340px;animation:fade-up-9b2b9733 .6s cubic-bezier(.16,1,.3,1) both}.greet[data-v-9b2b9733]{font-size:26px;font-weight:700;letter-spacing:-.01em;color:var(--color-text-primary);margin:0 0 6px}.greet-sub[data-v-9b2b9733]{font-size:var(--font-size-sm);color:var(--color-text-tertiary);margin:0 0 26px}.foot[data-v-9b2b9733]{margin:0;padding:18px 24px 22px;text-align:center;font-size:var(--font-size-sm);color:var(--color-text-tertiary)}.foot a[data-v-9b2b9733]{color:inherit;text-decoration:none}.foot a[data-v-9b2b9733]:hover{color:var(--color-primary)}.foot-ver[data-v-9b2b9733]{margin-left:8px;opacity:.75}@keyframes fade-up-9b2b9733{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}@media(max-width:900px){.split[data-v-9b2b9733]{grid-template-columns:1fr}.panel[data-v-9b2b9733]{display:none}}@media(prefers-reduced-motion:reduce){.panel-aurora[data-v-9b2b9733],.form-inner[data-v-9b2b9733]{animation:none}}.spotlight[data-v-2d0bde1c]{position:relative;height:100dvh;overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--color-bg-body)}.mesh[data-v-2d0bde1c]{position:absolute;top:0;right:0;bottom:0;left:0;background:radial-gradient(30% 40% at 15% 20%,var(--s1),transparent 60%),radial-gradient(30% 40% at 85% 80%,var(--s2),transparent 60%);opacity:.9}.spot[data-v-2d0bde1c]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:radial-gradient(340px 340px at var(--mx) var(--my),var(--spot),transparent 60%);transition:background .12s ease-out}.card[data-v-2d0bde1c]{position:relative;z-index:2;width:100%;max-width:460px;padding:46px;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:var(--radius-xl);box-shadow:var(--shadow-3);animation:fade-up-2d0bde1c .6s cubic-bezier(.16,1,.3,1) both}@keyframes fade-up-2d0bde1c{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}@media(max-width:480px){.spotlight[data-v-2d0bde1c]{padding:0 16px}.card[data-v-2d0bde1c]{padding:32px 24px}}@media(prefers-reduced-motion:reduce){.spot[data-v-2d0bde1c]{transition:none}.card[data-v-2d0bde1c]{animation:none}}.login-shell[data-v-846afb99]{position:relative;height:100dvh;overflow:hidden}.login-topbar[data-v-846afb99]{position:fixed;top:20px;right:24px;z-index:10;display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:10px}.login-tools[data-v-846afb99]{display:flex;gap:2px;padding:4px;border-radius:999px;background:#12141c8c;border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:0 6px 20px #00000047}.tool-btn[data-v-846afb99]{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:30px;padding:0 10px;border:none;cursor:pointer;border-radius:999px;background:transparent;font-size:13px;font-weight:600;color:#ffffff9e;transition:color .2s,background .2s}.tool-btn[data-v-846afb99]:hover{color:#fff}.tool-btn[data-v-846afb99]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.skin-switch[data-v-846afb99]{display:flex;gap:2px;padding:4px;border-radius:999px;background:#12141c8c;border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:0 6px 20px #00000047}.skin-seg[data-v-846afb99]{border:none;cursor:pointer;padding:6px 16px;border-radius:999px;background:transparent;font-size:13px;font-weight:600;color:#ffffff9e;transition:color .2s,background .2s}.skin-seg[data-v-846afb99]:hover{color:#fff}.skin-seg.active[data-v-846afb99]{background:var(--color-primary);color:#fff}.oauth-cb[data-v-843f1b99]{min-height:100dvh;display:flex;align-items:center;justify-content:center;background:var(--color-bg-layout, #f5f6f8)}.oauth-box[data-v-843f1b99]{display:flex;flex-direction:column;align-items:center;gap:14px}.oauth-msg[data-v-843f1b99]{font-size:15px;color:var(--color-text-primary)}.oauth-sub[data-v-843f1b99]{font-size:13px;color:var(--color-text-tertiary)}.oauth-err-icon[data-v-843f1b99]{font-size:44px;color:var(--color-error, #e88080)}.mfa-page[data-v-b6e82c2c]{min-height:100dvh;display:grid;place-items:center;padding:24px;background:var(--color-body, #f5f7fa)}.mfa-card[data-v-b6e82c2c]{width:min(100%,520px)}.mfa-header[data-v-b6e82c2c]{display:flex;align-items:center;justify-content:space-between;gap:12px}.mfa-qr-wrap[data-v-b6e82c2c]{display:flex;justify-content:center;margin:0 0 16px;padding:16px;background:#fff;border-radius:8px;border:1px solid var(--color-border, #e5e7eb)}.mfa-manual-hint[data-v-b6e82c2c]{margin:-8px 0 12px;font-size:12px;color:var(--color-text-tertiary, #9ca3af);line-height:1.5}.recovery-codes[data-v-b6e82c2c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.recovery-codes[data-v-b6e82c2c] .n-alert,.recovery-codes[data-v-b6e82c2c] .n-button{grid-column:1 / -1}.recovery-code[data-v-b6e82c2c]{padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:var(--color-hover, #f4f4f5);border-radius:4px}@media(max-width:480px){.mfa-page[data-v-b6e82c2c]{padding:12px}.recovery-codes[data-v-b6e82c2c]{grid-template-columns:1fr}}.boot-error[data-v-c523298c]{min-height:100dvh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;background:var(--color-bg-app)}h1[data-v-c523298c]{margin:0;color:var(--color-text-primary);font-size:var(--font-size-xl)}p[data-v-c523298c]{margin:0 0 8px;max-width:480px;color:var(--color-text-secondary)}.wrap[data-v-f50f3abd]{min-height:100dvh;background:var(--color-bg-body);padding:80px 24px;display:flex;flex-direction:column;align-items:center}.head[data-v-f50f3abd]{display:flex;align-items:center;gap:12px;margin-bottom:32px}.head h1[data-v-f50f3abd]{font-size:var(--font-size-xl);font-weight:600;color:var(--color-text-primary)}.grid[data-v-f50f3abd]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--gap-card);width:100%;max-width:900px}.card[data-v-f50f3abd]{position:relative;display:flex;align-items:center;gap:14px;padding:20px;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-1);cursor:pointer;transition:transform var(--transition-fast),border-color var(--transition-fast)}.card.current[data-v-f50f3abd]{border-color:var(--color-primary)}.card[data-v-f50f3abd]:hover{transform:translateY(-3px);border-color:var(--color-primary);box-shadow:var(--shadow-2)}.card[data-v-f50f3abd]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ico[data-v-f50f3abd]{color:var(--color-primary)}.name[data-v-f50f3abd]{font-size:var(--font-size-md);font-weight:600;color:var(--color-text-primary)}.code[data-v-f50f3abd]{font-size:var(--font-size-sm);color:var(--color-text-tertiary);font-family:var(--font-family-mono)}.def[data-v-f50f3abd]{position:absolute;top:10px;right:12px}.row[data-v-195679a9]{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:40px}.lbl[data-v-195679a9]{color:var(--color-text-secondary);font-size:var(--font-size-sm);white-space:nowrap}.ctl[data-v-195679a9]{display:flex;align-items:center;min-width:0}.grid[data-v-66443dff]{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;padding-inline:3px}.cell[data-v-66443dff]{display:flex;flex-direction:column;align-items:center;gap:8px;cursor:pointer}.card[data-v-66443dff]{width:100%;height:62px;padding:6px;border:none;border-radius:4px;background:var(--color-bg-container);box-shadow:0 1px 3px #141b2d1a,0 0 0 2px transparent;cursor:pointer;transition:box-shadow .15s ease}.cell:hover .card[data-v-66443dff],.card.on[data-v-66443dff]{box-shadow:0 1px 3px #141b2d1a,0 0 0 2px var(--color-primary)}.inner[data-v-66443dff]{--strong: var(--color-primary);--p300: color-mix(in srgb, var(--color-primary) 58%, var(--color-bg-container));--p200: color-mix(in srgb, var(--color-primary) 34%, var(--color-bg-container));display:flex;gap:5px;width:100%;height:100%}.inner.row[data-v-66443dff]{flex-direction:row}.inner.col[data-v-66443dff]{flex-direction:column}.inner i[data-v-66443dff],.inner .vwrap[data-v-66443dff],.inner .hwrap[data-v-66443dff]{border-radius:3px}.strong[data-v-66443dff]{background:var(--strong)}.p300[data-v-66443dff]{background:var(--p300)}.p200[data-v-66443dff]{background:var(--p200)}.sider[data-v-66443dff]{width:18%;flex-shrink:0}.rail[data-v-66443dff]{width:9%;flex-shrink:0}.subsider[data-v-66443dff]{width:16%;flex-shrink:0}.header[data-v-66443dff]{flex-shrink:0;height:13px}.header.full[data-v-66443dff]{width:100%}.main[data-v-66443dff]{flex:1}.vwrap[data-v-66443dff]{flex:1;display:flex;flex-direction:column;gap:5px}.vwrap .header[data-v-66443dff]{width:100%}.hwrap[data-v-66443dff]{flex:1;display:flex;flex-direction:row;gap:5px}.label[data-v-66443dff]{margin:0;text-align:center;font-size:var(--font-size-xs);line-height:var(--line-height-xs);color:var(--color-text-secondary)}.label.on[data-v-66443dff]{color:var(--color-primary);font-weight:var(--font-weight-medium)}.tabs[data-v-adecf714]{height:100%}.footer-actions[data-v-adecf714]{display:flex;flex-direction:column;gap:8px;width:100%}.ri[data-v-adecf714]{margin-right:5px;font-size:15px}.seg[data-v-adecf714]{display:flex;width:100%}.seg[data-v-adecf714] .n-radio-button{flex:1;display:flex;align-items:center;justify-content:center}.accents[data-v-adecf714]{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:12px}.dot[data-v-adecf714]{position:relative;width:100%;max-width:30px;margin:0 auto;aspect-ratio:1;padding:0;border:none;border-radius:50%;cursor:pointer;box-shadow:inset 0 0 0 1px #00000014;display:flex;align-items:center;justify-content:center;transition:transform .15s ease,box-shadow .15s ease}.dot[data-v-adecf714]:hover{transform:scale(1.12)}.dot.on[data-v-adecf714]{transform:scale(1.1);box-shadow:0 0 0 2px var(--color-bg-container),0 0 0 4px var(--color-primary)}.tick[data-v-adecf714]{color:#fff;font-size:14px;filter:drop-shadow(0 0 1px rgba(0,0,0,.35))}.notice-panel[data-v-1ac49123]{width:360px;max-width:92vw}.notice-head[data-v-1ac49123]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px 4px}.notice-title[data-v-1ac49123]{font-weight:600;font-size:var(--font-size-md)}.notice-empty[data-v-1ac49123]{padding:32px 0}.notice-list[data-v-1ac49123]{margin:0;padding:0;list-style:none}.notice-item[data-v-1ac49123]{position:relative;display:flex;gap:8px;padding:12px 16px;cursor:pointer;border-top:1px solid var(--n-divider-color, rgba(128, 128, 128, .15));transition:background-color .2s}.notice-item[data-v-1ac49123]:hover{background-color:#80808014}.notice-item.unread[data-v-1ac49123]{background-color:color-mix(in srgb,var(--color-primary) 4%,transparent)}.notice-item.unread[data-v-1ac49123]:hover{background-color:color-mix(in srgb,var(--color-primary) 9%,transparent)}.notice-item.read[data-v-1ac49123]{opacity:.55}.dot[data-v-1ac49123]{position:absolute;left:6px;top:18px;width:6px;height:6px;border-radius:50%;background:var(--color-primary, #d03050)}.notice-body[data-v-1ac49123]{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.line1[data-v-1ac49123]{display:flex;align-items:center;gap:6px;min-width:0}.item-title[data-v-1ac49123]{flex:1;min-width:0;font-size:var(--font-size-sm)}.item-title.unread[data-v-1ac49123]{font-weight:600}.item-actions-mark[data-v-1ac49123]{flex-shrink:0;color:var(--color-primary, #d03050)}.item-snippet[data-v-1ac49123]{font-size:12px;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.item-time[data-v-1ac49123]{font-size:11px}.notice-foot[data-v-1ac49123]{display:flex;justify-content:center;padding:8px;border-top:1px solid var(--n-divider-color, rgba(128, 128, 128, .15))}.bar[data-v-8dc4f67f]{height:100%;display:flex;align-items:center;gap:12px;padding:0 16px}.left[data-v-8dc4f67f]{display:flex;align-items:center;gap:10px;min-width:0;overflow:hidden}.brand[data-v-8dc4f67f]{display:flex;align-items:center;gap:8px;color:var(--color-text-primary);font-weight:600;flex-shrink:0}.brand-name[data-v-8dc4f67f]{font-size:var(--font-size-md)}.title[data-v-8dc4f67f]{font-size:var(--font-size-md);font-weight:500;color:var(--color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.uname[data-v-8dc4f67f]{margin-left:6px}.center[data-v-8dc4f67f]{flex:1;min-width:0;overflow:hidden}.right[data-v-8dc4f67f]{display:flex;align-items:center;gap:6px;margin-left:auto;flex-shrink:0}@media(max-width:767px){.bar[data-v-8dc4f67f]{gap:8px;padding:0 8px}.mobile-hide[data-v-8dc4f67f]{display:none}}.sidenav[data-v-0b56822a]{height:100%;display:flex;flex-direction:column;background:var(--color-bg-container);overflow:hidden}.brand[data-v-0b56822a]{display:flex;align-items:center;gap:10px;height:var(--header-h);padding:0 22px;color:var(--color-text-primary);font-weight:600;overflow:hidden;white-space:nowrap;flex-shrink:0}.rail .brand[data-v-0b56822a]{padding:0;justify-content:center}.brand-name[data-v-0b56822a]{font-size:20px;font-weight:700;color:var(--color-text-primary)}.sidenav[data-v-0b56822a] .n-scrollbar{flex:1;min-height:0}.tabsbar[data-v-8fc6542a]{height:42px;display:flex;align-items:center;padding:0 8px;background:var(--color-bg-container);border-bottom:1px solid var(--color-border)}.strip[data-v-8fc6542a]{display:flex;align-items:center;gap:6px;padding:5px 0}.chip[data-v-8fc6542a]{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-fill);color:var(--color-text-secondary);font-size:var(--font-size-sm);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .15s,background .15s,border-color .15s}.chip[data-v-8fc6542a]:hover{color:var(--color-text-primary)}.chip.active[data-v-8fc6542a]{background:var(--color-primary-light);border-color:var(--color-primary);color:var(--color-primary)}.chip[data-v-8fc6542a]:focus-visible,.chip-close[data-v-8fc6542a]:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.chip-pin[data-v-8fc6542a]{opacity:.7}.chip-close[data-v-8fc6542a]{border-radius:50%;opacity:.6}.chip-close[data-v-8fc6542a]:hover{opacity:1;background:var(--color-fill)}.layout[data-v-2f5b2de6]{display:grid;height:100dvh;overflow:hidden;background:var(--color-bg-app)}.mode-vertical[data-v-2f5b2de6],.mode-vertical-mix[data-v-2f5b2de6],.mode-vertical-hybrid-header-first[data-v-2f5b2de6]{grid-template-columns:auto 1fr;grid-template-rows:var(--header-h) 1fr;grid-template-areas:"aside header" "aside content"}.mode-top-hybrid-sidebar-first[data-v-2f5b2de6],.mode-top-hybrid-header-first[data-v-2f5b2de6]{grid-template-columns:auto 1fr;grid-template-rows:var(--header-h) 1fr;grid-template-areas:"header header" "aside content"}.mode-horizontal[data-v-2f5b2de6],.mode-mobile[data-v-2f5b2de6]{grid-template-columns:1fr;grid-template-rows:var(--header-h) 1fr;grid-template-areas:"header" "content"}.aside[data-v-2f5b2de6]{grid-area:aside;height:100%;overflow:hidden;border-right:1px solid var(--color-border);background:var(--color-bg-container);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);transition:width .2s ease}.aside--mix[data-v-2f5b2de6]{display:flex}.aside--mix .rail[data-v-2f5b2de6]{width:var(--rail-w);flex-shrink:0;border-right:1px solid var(--color-border)}.aside--mix .l2col[data-v-2f5b2de6]{flex:1;min-width:0}.header[data-v-2f5b2de6]{grid-area:header;display:flex;align-items:stretch;border-bottom:1px solid var(--color-border);background:var(--color-header-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:10}.header--static[data-v-2f5b2de6]{-webkit-backdrop-filter:none;backdrop-filter:none}.hbg[data-v-2f5b2de6]{align-self:center;margin-left:8px}.apph[data-v-2f5b2de6]{flex:1;min-width:0;height:100%}.content[data-v-2f5b2de6]{grid-area:content;display:flex;flex-direction:column;min-height:0;overflow:hidden}.tabs[data-v-2f5b2de6]{flex-shrink:0}.page[data-v-2f5b2de6]{flex:1;min-height:0;overflow:auto;padding:var(--pad-page)}.personal-layout[data-v-45e1c4ea]{display:flex;gap:16px;align-items:stretch;min-height:100%}.personal-sider[data-v-45e1c4ea]{width:200px;flex-shrink:0;background:var(--color-bg-container, #fff);border:1px solid var(--color-border, #e5e7eb);border-radius:8px;padding:8px 0 12px}.personal-main[data-v-45e1c4ea]{flex:1;min-width:0;display:flex;flex-direction:column;gap:12px}.personal-mobile-nav[data-v-45e1c4ea]{max-width:360px}.personal-content[data-v-45e1c4ea]{min-width:0}.personal-layout.is-mobile[data-v-45e1c4ea]{flex-direction:column}.avatar-field[data-v-5c4afffc]{display:flex;align-items:center;gap:12px}.sec-desc[data-v-7afb110e]{margin:0 0 16px;color:var(--color-text-2, #666);line-height:1.5}.sec-note[data-v-7afb110e]{margin:20px 0 0;font-size:12px;color:var(--color-text-3, #999);line-height:1.5}[data-v-83e5e6b1] .device-cell{display:flex;align-items:center;gap:8px}.bind-page[data-v-3ab6b190]{max-width:920px}.bind-header[data-v-3ab6b190]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:14px;flex-wrap:wrap}.bind-title[data-v-3ab6b190]{margin:0 0 6px;font-size:18px;font-weight:600;line-height:1.3;color:var(--color-text-primary, #1f1f1f)}.bind-hint[data-v-3ab6b190]{margin:0;max-width:520px;font-size:13px;line-height:1.55;color:var(--color-text-secondary, #666)}.bind-summary[data-v-3ab6b190]{display:inline-flex;align-items:baseline;gap:4px;padding:8px 12px;border-radius:10px;background:var(--color-fill, #f5f5f5);font-size:13px;color:var(--color-text-secondary, #666);flex-shrink:0}.bind-summary-num[data-v-3ab6b190]{font-size:18px;font-weight:700;color:var(--color-primary, #646cff);font-variant-numeric:tabular-nums}.bind-summary-sep[data-v-3ab6b190]{opacity:.5}.bind-summary-label[data-v-3ab6b190]{margin-left:4px}.bind-alert[data-v-3ab6b190]{margin-bottom:16px;border-radius:10px}.bind-empty[data-v-3ab6b190]{padding:48px 0}.bind-grid[data-v-3ab6b190]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.bind-card[data-v-3ab6b190] .n-card-content{display:flex;flex-direction:column;gap:14px}.bind-card[data-v-3ab6b190]:hover{box-shadow:0 4px 14px #0000000f}.bind-card.bind-card--bound[data-v-3ab6b190]{border-color:color-mix(in srgb,var(--color-success, #18a058) 40%,var(--color-border, #e8e8e8));background:color-mix(in srgb,var(--color-success, #18a058) 4%,var(--color-bg-container, #fff))}.bind-card.bind-card--disabled[data-v-3ab6b190]{opacity:.78;background:var(--color-fill-quaternary, #f7f7f7);border-style:dashed}.bind-card-main[data-v-3ab6b190]{display:flex;align-items:flex-start;gap:12px;min-width:0}.bind-avatar[data-v-3ab6b190]{position:relative;display:inline-flex;width:48px;height:48px;flex-shrink:0;align-items:center;justify-content:center;border-radius:50%;overflow:visible;background:var(--color-fill, #f5f5f5)}.bind-avatar[data-v-3ab6b190] .oauth-brand-badge,.bind-avatar[data-v-3ab6b190] img{border-radius:50%;overflow:hidden}.bind-avatar--bound[data-v-3ab6b190]{box-shadow:0 0 0 2px color-mix(in srgb,var(--color-success, #18a058) 35%,transparent)}.bind-check[data-v-3ab6b190]{position:absolute;right:-2px;bottom:-2px;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;border-radius:50%;background:var(--color-success, #18a058);color:#fff;border:2px solid var(--color-bg-container, #fff);line-height:0}.bind-meta[data-v-3ab6b190]{min-width:0;flex:1}.bind-title-row[data-v-3ab6b190]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}.bind-name[data-v-3ab6b190]{font-size:15px;font-weight:600;color:var(--color-text-primary, #1f1f1f);line-height:1.3}.bind-code[data-v-3ab6b190]{display:inline-block;font-size:12px;color:var(--color-text-tertiary, #999);background:var(--color-fill, #f5f5f5);padding:1px 6px;border-radius:4px}.bind-time[data-v-3ab6b190],.bind-free-tip[data-v-3ab6b190],.bind-disabled-tip[data-v-3ab6b190]{margin:8px 0 0;font-size:12px;line-height:1.45;color:var(--color-text-tertiary, #999)}.bind-time[data-v-3ab6b190]{color:var(--color-text-secondary, #666)}.bind-actions[data-v-3ab6b190]{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding-top:12px;border-top:1px dashed var(--color-border, #e8e8e8);min-height:36px}.bind-na[data-v-3ab6b190]{font-size:12px;color:var(--color-text-tertiary, #999)}.nf[data-v-b6fdc641]{min-height:60vh;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:var(--color-bg-body)}.code[data-v-b6fdc641]{font-size:96px;font-weight:800;line-height:1}.msg[data-v-b6fdc641]{color:var(--color-text-secondary);font-size:var(--font-size-md)}.view[data-v-e7ff753e]{display:flex;flex-direction:column;gap:var(--gap-card)}.banner[data-v-e7ff753e]{display:flex;align-items:center;gap:16px;padding:24px;border-radius:var(--radius-lg);background:var(--color-primary-light)}.avatar[data-v-e7ff753e]{width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center}.hi[data-v-e7ff753e]{font-size:var(--font-size-lg);font-weight:600;color:var(--color-text-primary)}.tip[data-v-e7ff753e]{color:var(--color-text-secondary);margin-top:4px}.quick[data-v-e7ff753e]{display:flex;flex-wrap:wrap;gap:12px}.notice-row[data-v-e7ff753e]{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer}.notice-title[data-v-e7ff753e]{display:flex;align-items:center;gap:8px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--color-text-primary)}.dot[data-v-e7ff753e]{flex-shrink:0;width:6px;height:6px;border-radius:50%;background:var(--color-primary)}.notice-time[data-v-e7ff753e]{flex-shrink:0;color:var(--color-text-secondary);font-size:12px}.view[data-v-a20971bd]{display:flex;flex-direction:column;gap:var(--gap-card)}.banner[data-v-a20971bd]{display:flex;align-items:center;gap:16px;padding:24px;border-radius:var(--radius-lg);background:var(--color-primary-light)}.avatar[data-v-a20971bd]{width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center}.hi[data-v-a20971bd]{font-size:var(--font-size-lg);font-weight:600;color:var(--color-text-primary)}.tip[data-v-a20971bd]{color:var(--color-text-secondary);margin-top:4px}.stat[data-v-a20971bd]{display:flex;align-items:center;gap:16px}.stat-body[data-v-a20971bd]{min-width:0}.stat-ico[data-v-a20971bd]{flex-shrink:0;width:48px;height:48px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,currentColor 12%,transparent)}.stat-val[data-v-a20971bd]{font-size:28px;font-weight:700;color:var(--color-text-primary);line-height:1.1}.stat-label[data-v-a20971bd]{color:var(--color-text-secondary);margin-top:2px}.embed-wrap[data-v-dcc7858a]{height:100%;min-height:calc(100dvh - 160px)}.embed[data-v-dcc7858a]{display:block;width:100%;height:100%;min-height:calc(100dvh - 160px);border:0}.missing-route[data-v-1e499090]{min-height:60vh;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--color-text-secondary);text-align:center}h1[data-v-1e499090]{margin:0;color:var(--color-text-primary);font-size:var(--font-size-xl)}p[data-v-1e499090]{margin:0}code[data-v-1e499090]{padding:6px 8px;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:4px;color:var(--color-danger)}.cache[data-v-21abb77a]{display:flex;flex-direction:column;gap:12px}.action-card[data-v-21abb77a]{height:100%}.head[data-v-21abb77a]{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:600}.desc[data-v-21abb77a]{margin:10px 0 14px;font-size:13px;line-height:1.6;color:var(--color-text-secondary, #999);min-height:42px}.note[data-v-21abb77a]{margin:4px 0 0;font-size:12px;line-height:1.6;color:var(--color-text-secondary, #999)}.group-extra-hint[data-v-3cb9c09b]{margin:-6px 0 12px;font-size:12px;color:var(--color-text-tertiary)}.ea[data-v-71792251]{max-width:920px}.ea-alert[data-v-71792251]{margin-bottom:16px;border-radius:10px}.ea-empty[data-v-71792251]{padding:48px 0}.ea-toolbar[data-v-71792251]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px;flex-wrap:wrap}.ea-summary[data-v-71792251]{font-size:13px;color:var(--color-text-secondary, #666)}.ea-toolbar-actions[data-v-71792251]{display:flex;align-items:center;gap:8px}.ea-grid[data-v-71792251]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.ea-card[data-v-71792251]{display:flex;flex-direction:column;gap:14px;padding:16px;border-radius:12px;border:1px solid var(--color-border, #e8e8e8);background:var(--color-bg-container, #fff);transition:border-color .15s ease,box-shadow .15s ease,opacity .15s ease}.ea-card[data-v-71792251]:hover{box-shadow:0 4px 14px #0000000f}.ea-card--off[data-v-71792251]{opacity:.85;background:var(--color-fill-quaternary, #fafafa)}.ea-card--on[data-v-71792251]{border-color:color-mix(in srgb,var(--color-primary, #18a058) 35%,var(--color-border, #e8e8e8))}.ea-card--na[data-v-71792251]{opacity:.72;background:var(--color-fill-quaternary, #f7f7f7);border-style:dashed}.ea-card-main[data-v-71792251]{display:flex;align-items:flex-start;gap:12px;min-width:0}.ea-avatar[data-v-71792251]{display:inline-flex;width:44px;height:44px;flex-shrink:0;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;background:var(--color-fill, #f5f5f5)}.ea-meta[data-v-71792251]{min-width:0;flex:1}.ea-title-row[data-v-71792251]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}.ea-name[data-v-71792251]{font-size:15px;font-weight:600;color:var(--color-text-primary, #1f1f1f);line-height:1.3}.ea-code[data-v-71792251]{font-size:12px;color:var(--color-text-tertiary, #999);background:var(--color-fill, #f5f5f5);padding:1px 6px;border-radius:4px}.ea-na-tip[data-v-71792251]{margin:8px 0 0;font-size:12px;line-height:1.45;color:var(--color-text-tertiary, #999)}.ea-switch[data-v-71792251]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:12px;border-top:1px dashed var(--color-border, #e8e8e8)}.ea-switch+.ea-switch[data-v-71792251]{margin-top:-4px;padding-top:0;border-top:0}.ea-switch-label[data-v-71792251]{font-size:13px;color:var(--color-text-secondary, #666)}.sms-hint[data-v-c20e33fd]{margin:-6px 0 12px;font-size:12px;color:var(--color-text-tertiary)}.dict-layout[data-v-a7b1ad76]{flex-wrap:wrap;gap:var(--gap-card)}.dict-pane[data-v-a7b1ad76]{flex:1 1 380px;min-width:0}.clear-body[data-v-8324d44c]{display:flex;flex-direction:column;gap:10px}.clear-hint[data-v-8324d44c]{font-size:12px;color:var(--color-text-tertiary)}.attempts-title[data-v-8324d44c]{margin:16px 0 8px;font-size:var(--font-size-sm);font-weight:600;color:var(--color-text-primary)}.log-output[data-v-8324d44c]{margin:0;white-space:pre-wrap;word-break:break-all;font-family:var(--font-family-mono, ui-monospace, monospace);font-size:12px;line-height:1.5}.log-error[data-v-8324d44c]{color:var(--color-danger)}.view[data-v-34ed407f]{gap:var(--gap-card)}.job-tables[data-v-34ed407f],.job-tables[data-v-34ed407f]>*{min-height:240px}.stat[data-v-34ed407f]{display:flex;align-items:center;gap:16px}.stat-ico[data-v-34ed407f]{flex-shrink:0;width:48px;height:48px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,currentColor 12%,transparent)}.stat-val[data-v-34ed407f]{font-size:28px;font-weight:700;color:var(--color-text-primary);line-height:1.1}.stat-label[data-v-34ed407f]{color:var(--color-text-secondary);margin-top:2px}.kv-editor[data-v-aabac178]{display:flex;flex-direction:column;gap:8px;width:100%}.kv-row[data-v-aabac178]{display:flex;gap:8px;align-items:center}.kv-hint[data-v-aabac178]{font-size:12px;color:var(--color-text-tertiary)}.job-hint[data-v-aabac178]{font-size:12px;color:var(--color-text-tertiary);white-space:nowrap;line-height:1.4}.job-inline[data-v-aabac178]{display:flex;align-items:center;gap:10px;flex-wrap:nowrap;min-width:0}.job-sec-text[data-v-aabac178]{font-size:var(--font-size-sm);font-weight:600}.job-sections[data-v-aabac178] .n-collapse-item{margin:0}.job-sections[data-v-aabac178] .n-collapse-item__header{padding:10px 0}.job-sections[data-v-aabac178] .n-collapse-item__content-inner{padding:4px 0 12px}.job-sections[data-v-aabac178] .n-form-item{margin-bottom:14px}.job-sections[data-v-aabac178] .n-form-item-feedback-wrapper:empty,.job-sections[data-v-aabac178] .n-form-item-feedback-wrapper:has(:empty){min-height:0}.job-advanced[data-v-aabac178] .n-form-item{margin-bottom:18px}.job-advanced[data-v-aabac178] .n-form-item-label{padding-right:12px}.exception[data-v-d5b09c10],.exception[data-v-e1c2f8d3]{margin:0;white-space:pre-wrap;word-break:break-all;font-family:var(--font-mono, ui-monospace, monospace);font-size:12px;line-height:1.5;color:var(--color-danger)}.perm-hint[data-v-5c30c592],.link-hint[data-v-b458eaa0]{font-size:12px;color:var(--color-text-tertiary, #999);line-height:1.5}.view[data-v-dfe8710a]{display:flex;flex-direction:column;gap:var(--gap-card)}[data-v-dfe8710a] .row-no{font-variant-numeric:tabular-nums;white-space:nowrap}[data-v-dfe8710a] .row-no__path{color:var(--color-text-disabled)}[data-v-dfe8710a] .row-no__self{color:var(--color-text-secondary);font-weight:var(--font-weight-medium)}.hint[data-v-61407825]{font-size:12px;color:var(--color-text-secondary, #999)}.monitor[data-v-8ea4d493]{display:flex;flex-direction:column;gap:12px}.bar[data-v-8ea4d493]{display:flex;justify-content:flex-end}.metric[data-v-8ea4d493]{font-size:28px;font-weight:600;line-height:1.2;margin-bottom:10px}.metric.small[data-v-8ea4d493]{font-size:18px}.unit[data-v-8ea4d493]{font-size:16px;margin-left:2px;color:var(--color-text-secondary, #999)}.sub[data-v-8ea4d493]{margin-top:8px;font-size:12px;color:var(--color-text-secondary, #999)}.rows[data-v-8ea4d493]{display:grid;gap:8px;font-size:13px}.rows .k[data-v-8ea4d493]{display:inline-block;width:88px;color:var(--color-text-secondary, #999)}.rows .v[data-v-8ea4d493]{word-break:break-all}.notice-actions-editor[data-v-5c6d1da0]{width:100%}.notice-action-row[data-v-5c6d1da0]{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:100%}.notice-actions-hint[data-v-5c6d1da0]{display:block;margin-top:4px;font-size:12px;line-height:1.4}.view[data-v-72e7ef38],.view[data-v-ef7d111d]{gap:var(--gap-card)}.grant-menu-table[data-v-6c2563ee]{display:flex;flex-direction:column;gap:10px}.grant-toolbar[data-v-6c2563ee]{display:flex;gap:8px}.grant-grid[data-v-6c2563ee]{border:1px solid var(--n-border-color, #e0e0e6);border-radius:4px;font-size:13px;overflow:hidden}.grant-header[data-v-6c2563ee]{display:flex;background:var(--n-th-color, #fafafc);font-weight:600;font-size:12px;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.grant-header>div[data-v-6c2563ee]{padding:8px 12px}.grant-group[data-v-6c2563ee]{display:flex;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.grant-group[data-v-6c2563ee]:last-child{border-bottom:none}.grant-group>.col-catalog[data-v-6c2563ee]{display:flex;align-items:center;gap:4px;padding:8px 12px;border-right:1px solid var(--n-border-color, #e0e0e6);cursor:pointer;-webkit-user-select:none;user-select:none}.collapse-arrow[data-v-6c2563ee]{display:inline-block;font-size:10px;transition:transform .2s;color:var(--n-text-color-disabled, #999)}.collapse-arrow.is-collapsed[data-v-6c2563ee]{transform:rotate(-90deg)}.group-rows[data-v-6c2563ee]{flex:1;min-width:0}.grant-row[data-v-6c2563ee]{display:flex;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.grant-row[data-v-6c2563ee]:last-child{border-bottom:none}.col-catalog[data-v-6c2563ee]{width:130px;flex-shrink:0}.col-menu[data-v-6c2563ee]{width:140px;flex-shrink:0;display:flex;align-items:center;padding:6px 12px;border-right:1px solid var(--n-border-color, #e0e0e6)}.anchor-tag[data-v-6c2563ee]{font-size:12px}.col-buttons[data-v-6c2563ee]{flex:1;display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;padding:6px 12px;min-width:0}.no-buttons[data-v-6c2563ee]{color:var(--n-text-color-disabled, #c0c0c0)}.grant-empty[data-v-6c2563ee]{text-align:center;padding:24px;color:var(--n-text-color-disabled, #c0c0c0)}.reset-hint[data-v-db4d7427]{margin:0 0 12px;font-size:var(--font-size-sm, 13px);color:var(--color-text-secondary, #888)}.pw-field[data-v-04e2ffaa]{flex:1;min-width:0}.avatar-field[data-v-04e2ffaa]{display:flex;align-items:center;gap:12px}.org-filter[data-v-48cff6c5]{flex:0 0 200px}.org-filter[data-v-48cff6c5] .n-tree{flex:1;min-height:0;overflow:auto}.org-filter-head[data-v-48cff6c5]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.org-filter-title[data-v-48cff6c5]{font-weight:600;font-size:var(--font-size-sm, 13px)}
1
+ .reauth-hint[data-v-f489ff1a]{margin:0 0 12px;color:var(--n-text-color-3);font-size:13px;line-height:1.5}:root{--color-gray-900: #181a2a;--color-gray-800: #2f313f;--color-gray-700: #5d5f6a;--color-gray-600: #7b7c85;--color-gray-500: #85868e;--color-gray-400: #bababf;--color-gray-300: #d1d1d1;--color-gray-200: #e3e3e3;--color-gray-100: #f1f1f1;--color-gray-50: #f0f0f0;--color-white: #ffffff;--color-primary: #646cff;--color-primary-hover: #7d84ff;--color-primary-pressed: #5259d1;--color-primary-light: #f0f0ff;--color-success: #00a43b;--color-success-bg: #e0f4e7;--color-warning: #a88400;--color-warning-bg: #fff8e0;--color-danger: #d15054;--color-danger-bg: #ffeced;--color-info: #0090b5;--color-info-bg: #e0f2f6;--color-bg-body: #f2f8f5;--color-bg-app: linear-gradient( 135deg, #f7fbf9 0%, #edf7f3 55%, #f7fbf9 100% );--color-bg-container: rgba(255, 255, 255, .78);--color-bg-container-solid: #fefefe;--color-bg-elevated: #ffffff;--color-text-primary: #111827;--color-text-secondary: #374151;--color-text-tertiary: #6b7280;--color-text-disabled: #9ca3af;--color-border: #d7dbe0;--color-border-strong: #bfc5cd;--color-fill: #eef1f5;--color-fill-hover: #e5e9ef;--color-bg-input: #ffffff;--color-fill-disabled: #eef1f5;--color-mask: rgba(24, 26, 42, .45);--color-header-bg: rgba(255, 255, 255, .82);--font-family-base: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif;--font-family-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;--font-size-xs: 12px;--line-height-xs: 18px;--font-size-sm: 13px;--line-height-sm: 20px;--font-size-base: 14px;--line-height-base: 22px;--font-size-md: 16px;--line-height-md: 24px;--font-size-lg: 20px;--line-height-lg: 28px;--font-size-xl: 24px;--line-height-xl: 32px;--font-weight-normal: 400;--font-weight-medium: 500;--font-weight-semibold: 600;--space-4: 4px;--space-8: 8px;--space-12: 12px;--space-16: 16px;--space-24: 24px;--space-32: 32px;--radius-sm: 6px;--radius-md: 10px;--radius-lg: 12px;--radius-xl: 16px;--shadow-1: 0 1px 2px rgba(24, 26, 42, .05), 0 2px 6px rgba(24, 26, 42, .06);--shadow-2: 0 10px 30px rgba(24, 26, 42, .12);--shadow-3: 0 16px 48px rgba(24, 26, 42, .18);--transition-fast: .15s ease;--transition-base: .2s ease}:root[data-theme=dark]{--color-primary: #14b8a6;--color-primary-hover: #2dd4bf;--color-primary-pressed: #0f766e;--color-primary-light: rgba(20, 184, 166, .16);--color-success: #34d399;--color-success-bg: rgba(16, 185, 129, .14);--color-warning: #fbbf24;--color-warning-bg: rgba(251, 191, 36, .14);--color-danger: #fb7185;--color-danger-bg: rgba(244, 63, 94, .16);--color-info: #38bdf8;--color-info-bg: rgba(56, 189, 248, .14);--color-bg-body: #020617;--color-bg-app: linear-gradient( 135deg, #020617 0%, #0f172a 55%, #020617 100% );--color-bg-container: rgba(18, 28, 46, .9);--color-bg-container-solid: #121c2e;--color-bg-elevated: #182234;--color-text-primary: #f8fafc;--color-text-secondary: #cbd5e1;--color-text-tertiary: #94a3b8;--color-text-disabled: #64748b;--color-border: rgba(71, 85, 105, .4);--color-border-strong: rgba(100, 116, 139, .5);--color-fill: #0f172a;--color-fill-hover: #1a2436;--color-bg-input: #0f172a;--color-fill-disabled: #1b2434;--color-mask: rgba(2, 6, 23, .72);--color-header-bg: rgba(15, 23, 42, .7);--shadow-1: 0 1px 0 rgba(255, 255, 255, .04) inset, 0 2px 8px rgba(2, 6, 23, .3);--shadow-2: 0 10px 30px rgba(2, 6, 23, .45), 0 0 0 1px rgba(51, 65, 85, .35);--shadow-3: 0 16px 48px rgba(2, 6, 23, .55), 0 0 0 1px rgba(51, 65, 85, .4)}:root{--pad-page: 14px;--gap-card: 12px;--row-h: 58px;--sidebar-w: 236px;--sidebar-w-collapsed: 76px;--rail-w: 64px;--header-h: 62px}:root[data-density=compact]{--pad-page: 10px;--gap-card: 8px;--row-h: 48px}*{box-sizing:border-box}html,body,#app{height:100%;margin:0}body{font-family:var(--font-family-base);font-size:var(--font-size-base);line-height:var(--line-height-base);color:var(--color-text-primary);background:var(--color-bg-app);-webkit-font-smoothing:antialiased}:root[data-theme=dark] body{background-attachment:fixed}a{color:var(--color-primary);text-decoration:none}.tabular{font-variant-numeric:tabular-nums}.n-card{border:1px solid var(--color-border)}:root:not([data-theme=dark]) .n-card:not(.n-modal){background:linear-gradient(145deg,#ffffffe0,#ffffffad);box-shadow:inset 0 1px #ffffffe6,0 8px 24px #2d695a14;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}:root:not([data-theme=dark]) .n-card.n-modal{background:var(--color-bg-elevated);box-shadow:var(--shadow-3);backdrop-filter:none;-webkit-backdrop-filter:none}:root[data-theme=dark] .n-card{background:#121c2e;border-color:#47556966;box-shadow:0 8px 24px #02061738}:root[data-theme=dark] ::-webkit-scrollbar-thumb{background:#64748b85}:root[data-theme=dark] ::-webkit-scrollbar-thumb:hover{background:#94a3b8b3}:root[data-theme=dark] ::selection{background:#14b8a647;color:#ecfeff}html.theme-switching,html.theme-switching *,html.theme-switching *:before,html.theme-switching *:after{transition:background-color .22s ease,color .22s ease,border-color .22s ease,box-shadow .22s ease!important}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-thumb{background:#90939966;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#909399b3}::-webkit-scrollbar-track{background:transparent}html[data-gray]{filter:grayscale(1)}.fade-enter-active,.fade-leave-active{transition:opacity .2s ease}.fade-enter-from,.fade-leave-to{opacity:0}.fade-slide-enter-active,.fade-slide-leave-active{transition:opacity .24s ease,transform .24s ease}.fade-slide-enter-from{opacity:0;transform:translate(16px)}.fade-slide-leave-to{opacity:0;transform:translate(-16px)}.n-menu,.n-dropdown-menu{user-select:none;-webkit-user-select:none}.n-data-table{--table-selected-bg: var(--color-primary-light)}.n-data-table .n-data-table-tr:nth-child(2n)>.n-data-table-td{background-color:var(--n-merged-td-color-striped)}.n-data-table .n-data-table-tr:has(>.n-data-table-td--selection .n-checkbox--checked,>.n-data-table-td--selection .n-radio--checked)>.n-data-table-td,.smart-table .smart-table-row--active>.n-data-table-td{background-color:var(--table-selected-bg)}.n-data-table .n-data-table-tr.row-selected>.n-data-table-td{background-color:var(--table-selected-bg)}.n-data-table .n-data-table-tr.row-selected>.n-data-table-td--fixed-left,.n-data-table .n-data-table-tr.row-selected>.n-data-table-td--fixed-right{background-color:var(--table-fixed-bg);background-image:linear-gradient(var(--table-selected-bg),var(--table-selected-bg))}.n-data-table .n-data-table-tr.row-selected>.n-data-table-td:first-child{box-shadow:inset 3px 0 0 var(--color-primary)}.n-data-table .n-data-table-th,.n-data-table .n-data-table-td{border-right:1px solid var(--n-merged-border-color);white-space:nowrap}.n-data-table .n-data-table-th--last,.n-data-table .n-data-table-td--last-col{border-right:0}.n-data-table .n-data-table-th--fixed-left,.n-data-table .n-data-table-th--fixed-right{background-color:var(--color-fill)}.n-data-table{--table-fixed-bg: var(--color-bg-container-solid)}.n-modal .n-data-table,.n-drawer .n-data-table,.n-popover .n-data-table{--table-fixed-bg: var(--n-merged-td-color)}.n-data-table .n-data-table-td--fixed-left,.n-data-table .n-data-table-td--fixed-right{background-color:var(--table-fixed-bg)}.smart-table .n-data-table .smart-table-row--active>.n-data-table-td--fixed-left,.smart-table .n-data-table .smart-table-row--active>.n-data-table-td--fixed-right{background-color:var(--table-fixed-bg);background-image:linear-gradient(var(--smart-table-active-row-bg, rgba(99, 102, 241, .08)),var(--smart-table-active-row-bg, rgba(99, 102, 241, .08)))}.n-data-table .n-data-table-td--last-col .n-space{gap:0!important}.n-data-table .n-data-table-td .n-space:has(.n-button){flex-wrap:nowrap!important;min-width:max-content;white-space:nowrap}.n-data-table .n-data-table-td .n-space:has(.n-button)>.n-space-item,.n-data-table .n-data-table-td .n-button{white-space:nowrap}.table-zoom{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:var(--color-bg-body);padding:16px;display:flex;flex-direction:column;min-height:0;gap:8px}.table-zoom>.n-data-table,.table-zoom>.route-table,.table-zoom>.table-zoom-body{flex:1;min-height:0}.row-sort .drag-handle{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:var(--radius-sm, 6px);color:var(--color-text-tertiary);cursor:grab;transition:color var(--transition-base, .2s ease),background-color var(--transition-base, .2s ease)}.row-sort .drag-handle:hover{background:var(--color-fill-hover);color:var(--color-primary)}.row-sort .drag-handle:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.row-sort .drag-handle:active{cursor:grabbing}.row-sort .row-chosen>td{position:relative;z-index:1;background:var(--color-bg-elevated);box-shadow:0 6px 16px #0000001f;cursor:grabbing}.row-sort .row-ghost>td{background:var(--color-primary-light);color:var(--color-primary)}.row-sort .row-ghost>td:first-child{box-shadow:inset 3px 0 0 var(--color-primary)}.row-sort .row-fallback{display:none!important}.row-sort.is-dragging .n-data-table-tr:not(.row-ghost){opacity:.5}.row-sort.is-dragging .n-data-table-td{transition:none}.side-filter{flex:0 0 var(--side-filter-width, 224px);display:flex;flex-direction:column;gap:8px;min-height:0;padding:12px 10px;border-radius:var(--radius-lg, 12px);background:var(--color-bg-container);box-shadow:var(--shadow-1);transition:flex-basis var(--transition-base, .2s ease)}.side-filter__head{display:flex;align-items:center;justify-content:space-between;gap:4px;min-height:24px;padding-left:6px}.side-filter__actions{display:flex;flex:none;margin-left:auto;align-items:center;gap:2px}.side-filter__body{display:flex;flex:1;flex-direction:column;gap:2px;min-height:0;overflow-y:auto;scrollbar-width:thin}.side-filter__divider{height:1px;margin:6px 8px;background:var(--color-border)}.side-filter__empty{display:flex;flex-direction:column;align-items:center;gap:10px;margin-top:24px;color:var(--color-text-tertiary);font-size:var(--font-size-sm, 13px)}.side-row{position:relative;display:flex;align-items:center;gap:8px;width:100%;height:34px;padding:0 10px;border:0;border-radius:var(--radius-md, 10px);background:transparent;color:var(--color-text-secondary);font:inherit;font-size:var(--font-size-base, 14px);text-align:left;cursor:pointer;transition:background var(--transition-fast, .15s ease),color var(--transition-fast, .15s ease)}.side-row:hover{background:var(--color-fill-hover);color:var(--color-text-primary)}.side-row.is-active{background:var(--color-primary-light);color:var(--color-primary);font-weight:var(--font-weight-medium, 500)}.side-row.is-active:before,.side-tree .n-tree-node--selected:before{content:"";position:absolute;top:50%;left:0;width:3px;height:16px;border-radius:0 3px 3px 0;background:var(--color-primary);transform:translateY(-50%)}.side-row__icon,.side-row__dot{flex:none}.side-row__dot{width:6px;height:6px;margin:0 4px;border-radius:50%;background:var(--color-border-strong);transition:background var(--transition-fast, .15s ease)}.side-row:hover .side-row__dot{background:var(--color-text-tertiary)}.side-row.is-active .side-row__dot{background:currentcolor}.side-row__label{flex:1;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.side-row__count{flex:none;min-width:22px;height:18px;padding:0 6px;border-radius:9px;background:var(--color-fill);color:var(--color-text-tertiary);font-size:var(--font-size-xs, 12px);font-variant-numeric:tabular-nums;line-height:18px;text-align:center;transition:background var(--transition-fast, .15s ease),color var(--transition-fast, .15s ease)}.side-row.is-active .side-row__count{background:var(--color-primary);color:var(--color-white, #fff)}.side-tree.n-tree{flex:1;min-height:0;overflow:auto;scrollbar-width:thin}.side-tree .n-tree-node{position:relative;padding-right:4px}.side-tree .n-tree-node--selected .n-tree-node-content__text{color:var(--color-primary);font-weight:var(--font-weight-medium, 500)}.side-tree .n-tree-node-content__suffix{opacity:0;transition:opacity var(--transition-fast, .15s ease)}.side-tree .n-tree-node:hover .n-tree-node-content__suffix,.side-tree .n-tree-node--selected .n-tree-node-content__suffix{opacity:1}.side-actions{display:flex;align-items:center;gap:2px}@media(max-width:1280px){.side-filter{flex-basis:min(var(--side-filter-width, 224px),200px)}}.form-section+.form-section{margin-top:16px}.form-section__title{margin-bottom:10px;color:var(--color-text-primary);font-weight:var(--font-weight-semibold, 600)}.form-section--fieldset,.form-section--panel{min-width:0;border:none;padding:0}.form-section--fieldset{margin-inline:0}.form-section--fieldset>legend{display:block;width:100%;margin-bottom:12px;padding:0 0 8px;border-bottom:1px solid var(--color-border);color:var(--color-text-primary);font-weight:var(--font-weight-semibold, 600)}.form-section--panel>.form-section__title,.form-section--panel>.head{display:flex;box-sizing:content-box;align-items:center;justify-content:space-between;height:var(--panel-head-h, 30px);margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid var(--color-border)}.page-view:has(>.smart-table),.page-view:has(>.fill-page),.page-view:has(>.side-page){height:100%}.page-view>.smart-table{height:100%;min-height:0}.fill-page{display:flex;flex-direction:column;min-height:0;height:100%;overflow:hidden}.fill-page>*{flex-shrink:0}.side-page{display:flex;gap:12px;align-items:stretch;height:100%;min-height:0}.side-page>.smart-table{flex:1;align-self:stretch;min-width:0;min-height:0;height:100%}.fill-page>.smart-table,.fill-main,:is(.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table{flex:1 1 auto;min-height:0}.fill-main{display:flex;flex-direction:column}:is(.page-view,.fill-page,.side-page,.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table>.smart-table-card{display:flex;flex:1;flex-direction:column;min-height:0}:is(.page-view,.fill-page,.side-page,.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table>.smart-table-card>:is(.n-card-content,.n-card__content){display:flex;flex:1;flex-direction:column;min-height:0}:is(.page-view,.fill-page,.side-page,.fill-main,.fill-split,.fill-tabs .n-tab-pane,.fill-pass>.n-spin-content)>.smart-table>.smart-table-card>:is(.n-card-content,.n-card__content)>.n-data-table{flex:1;min-height:0}.fill-card{display:flex;flex:1;flex-direction:column;min-height:0}.fill-card>:is(.n-card-content,.n-card__content){display:flex;flex:1;flex-direction:column;min-height:0}.fill-card>:is(.n-card-content,.n-card__content)>.n-data-table{flex:1;min-height:0}.fill-tabs{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.fill-tabs>.n-tabs-nav{flex-shrink:0}.fill-tabs>.n-tabs-pane-wrapper,.fill-tabs>.n-tabs-pane-wrapper>.n-tab-pane,.fill-tabs>.n-tab-pane{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.fill-split{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--fill-split-gap, var(--gap-card, 12px));min-height:0}.fill-split--row{flex-direction:row}.fill-split>.fill-main,.fill-split>.smart-table{flex:1 1 0;min-height:0}.fill-pass,.fill-pass>.n-spin-content{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.fill-page--soft{height:auto;min-height:100%;overflow:visible}.chart[data-v-558fd76a]{width:100%;height:320px}.code-block[data-v-953af54c]{position:relative;font-size:12px;line-height:1.5}.copy-btn[data-v-953af54c]{position:absolute;top:0;right:0}.cron-editor[data-v-8ed8204a]{width:100%}.cron-rows[data-v-8ed8204a]{display:flex;flex-direction:column;gap:10px;width:100%}.cron-row[data-v-8ed8204a]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.cron-num[data-v-8ed8204a]{width:96px}.cron-dow[data-v-8ed8204a]{width:120px}.cron-list[data-v-8ed8204a]{flex:1;min-width:200px}.cron-sep[data-v-8ed8204a]{color:var(--color-text-secondary);font-size:var(--font-size-sm)}.cron-hint[data-v-8ed8204a]{margin-top:6px;font-size:12px;color:var(--color-text-tertiary)}.cron-preview[data-v-8ed8204a]{margin-top:12px;padding:10px 12px;border-radius:var(--radius-md);background:var(--color-fill);display:flex;flex-direction:column;gap:8px}.cron-warn[data-v-8ed8204a]{margin-bottom:2px}.cron-preview-error[data-v-8ed8204a]{color:var(--color-danger);font-size:var(--font-size-sm)}.cron-preview-row[data-v-8ed8204a]{display:flex;gap:12px;align-items:flex-start}.cron-preview-label[data-v-8ed8204a]{flex:0 0 auto;color:var(--color-text-secondary);font-size:var(--font-size-sm);line-height:22px}.cron-code[data-v-8ed8204a]{font-family:var(--font-family-mono, ui-monospace, monospace);font-size:13px;line-height:22px}.cron-occurrences[data-v-8ed8204a]{display:flex;flex-wrap:wrap;gap:2px 16px}.cron-occurrence[data-v-8ed8204a]{font-family:var(--font-family-mono, ui-monospace, monospace);font-size:13px;line-height:22px;font-variant-numeric:tabular-nums}.cron-empty[data-v-8ed8204a]{color:var(--color-text-tertiary);font-size:var(--font-size-sm)}.detail-page[data-v-6733c96a]{display:flex;flex-direction:column;gap:var(--gap-card, 16px)}.detail-header[data-v-6733c96a]{display:flex;align-items:center;gap:8px}.detail-title[data-v-6733c96a]{margin:0;font-size:var(--font-size-lg, 18px);font-weight:600;color:var(--color-text-primary)}.detail-actions[data-v-6733c96a]{margin-left:auto}.error-boundary[data-v-3b4e3577]{min-height:60vh;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;color:var(--color-text-secondary)}h2[data-v-3b4e3577]{margin:0;color:var(--color-text-primary);font-size:var(--font-size-lg)}.desc[data-v-3b4e3577]{margin:0;max-width:460px}.detail[data-v-3b4e3577]{max-width:100%;padding:6px 10px;overflow-x:auto;border:1px solid var(--color-border);border-radius:var(--radius-sm);background:var(--color-bg-container);color:var(--color-danger);font-family:var(--font-family-mono);font-size:var(--font-size-xs)}.export-cols-head[data-v-6b86f7cf]{margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--n-border-color)}.smart-form--fullscreen{width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;display:flex;flex-direction:column;border-radius:0}.smart-form--fullscreen>.n-card__content{flex:1;min-height:0;overflow:auto}.import-steps[data-v-20fd3250]{margin-bottom:20px}.import-pane[data-v-20fd3250]{min-height:200px}.import-upload-icon[data-v-20fd3250]{margin-bottom:12px;color:var(--n-text-color-3)}.import-mapping-head[data-v-20fd3250],.import-mapping-row[data-v-20fd3250]{display:grid;grid-template-columns:1fr 1fr;gap:12px;align-items:center}.import-mapping-head[data-v-20fd3250]{font-weight:600;font-size:13px;margin-bottom:8px;color:var(--n-text-color-2)}.import-mapping-row[data-v-20fd3250]{margin-bottom:8px}.import-mapping-header[data-v-20fd3250]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.import-strategy[data-v-20fd3250]{margin-top:16px;display:flex;flex-wrap:wrap;align-items:center;gap:8px}[data-v-20fd3250] .import-cell{padding:2px;border-radius:4px}[data-v-20fd3250] .import-cell--error{background:var(--color-danger-bg)}[data-v-20fd3250] .import-cell--dup{background:var(--color-warning-bg)}.pw-meter[data-v-81b0f6bf]{margin:-8px 0 14px}.pw-bar[data-v-81b0f6bf]{display:flex;gap:6px}.pw-bar span[data-v-81b0f6bf]{flex:1;height:4px;border-radius:2px;transition:background var(--transition-fast)}.pw-level[data-v-81b0f6bf]{margin-top:6px;font-size:12px}.pw-rules[data-v-81b0f6bf]{margin:8px 0 0;padding:0;list-style:none;display:grid;grid-template-columns:1fr 1fr;gap:2px 12px}.pw-rules li[data-v-81b0f6bf]{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--color-text-tertiary)}.pw-rules li.ok[data-v-81b0f6bf]{color:#5aa86e}.select-table[data-v-78ca7f91]{height:520px;min-height:0;display:flex;flex-direction:column;gap:12px}.select-table-search[data-v-78ca7f91]{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.select-table-search[data-v-78ca7f91] .n-input{flex:0 1 200px}.select-table-search .keyword-input[data-v-78ca7f91]{flex:1 1 320px;min-width:260px}.select-table-search[data-v-78ca7f91] .n-button{flex:none}.select-table-grid[data-v-78ca7f91]{flex:1;min-height:0}[data-v-78ca7f91] .select-table-row-selected td{background-color:var(--table-selected-bg)}.user-picker[data-v-41b95328]{display:flex;gap:12px;min-height:400px}.panel-header[data-v-41b95328]{display:flex;align-items:center;justify-content:space-between;font-size:13px;font-weight:600;padding:0 0 8px;border-bottom:1px solid var(--n-border-color, #e0e0e6);margin-bottom:8px}.picker-tree[data-v-41b95328]{width:160px;flex-shrink:0;overflow:auto;border-right:1px solid var(--n-border-color, #e0e0e6);padding-right:12px}.picker-table[data-v-41b95328]{flex:1;min-width:0;overflow:hidden}.picker-selected[data-v-41b95328]{width:200px;flex-shrink:0;border-left:1px solid var(--n-border-color, #e0e0e6);padding-left:12px;display:flex;flex-direction:column}.selected-list[data-v-41b95328]{flex:1;overflow:auto;max-height:380px}.selected-item[data-v-41b95328]{display:flex;align-items:center;justify-content:space-between;padding:4px 0;font-size:13px;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.selected-item[data-v-41b95328]:last-child{border-bottom:none}.selected-name[data-v-41b95328]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.selected-account[data-v-41b95328]{color:var(--n-text-color-disabled, #999);font-size:12px;margin-left:2px}.palette[data-v-7f4fa2eb]{width:560px;max-width:92vw;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-3);overflow:hidden}.search[data-v-7f4fa2eb]{display:flex;align-items:center;gap:8px;padding:6px 16px;border-bottom:1px solid var(--color-border)}.sicon[data-v-7f4fa2eb]{color:var(--color-text-tertiary);flex-shrink:0}.list[data-v-7f4fa2eb]{padding:8px}.item[data-v-7f4fa2eb]{display:flex;align-items:center;gap:10px;height:44px;padding:0 12px;border-radius:var(--radius-md);cursor:pointer;color:var(--color-text-primary)}.item.active[data-v-7f4fa2eb]{background:var(--color-primary-light);color:var(--color-primary)}.iicon[data-v-7f4fa2eb]{flex-shrink:0}.ititle[data-v-7f4fa2eb]{font-size:var(--font-size-md)}.ititle[data-v-7f4fa2eb] mark{background:transparent;color:var(--color-primary);font-weight:600}.ipath[data-v-7f4fa2eb]{margin-left:auto;font-size:var(--font-size-sm);color:var(--color-text-tertiary)}.empty[data-v-7f4fa2eb]{padding:32px 0}.hint[data-v-7f4fa2eb]{padding:8px 16px;border-top:1px solid var(--color-border);font-size:var(--font-size-sm);color:var(--color-text-tertiary)}.site-logo[data-v-88ac0194]{display:block;width:auto;max-width:100%;object-fit:contain}.oauth-brand-badge[data-v-d7509bf4]{display:block;width:100%;height:100%;max-width:100%;max-height:100%;object-fit:cover;border-radius:50%;overflow:hidden;pointer-events:none;-webkit-user-select:none;user-select:none;flex-shrink:0}.oauth-brand-icon[data-v-d7509bf4]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;line-height:0}.oauth-brand-letter[data-v-d7509bf4]{font-size:12px;font-weight:700;color:var(--color-text-secondary, #666);line-height:1}.login-form[data-v-edac6de7]{width:100%}.lf-pending-alert[data-v-edac6de7]{margin-bottom:16px;border-radius:10px;text-align:left}.lf-brand[data-v-edac6de7]{display:flex;align-items:center;gap:10px;margin-bottom:18px}.lf-word[data-v-edac6de7]{font-size:22px;font-weight:700;letter-spacing:.2px;color:var(--lf-title, var(--color-text-primary))}.lf-title[data-v-edac6de7]{font-size:var(--font-size-lg);font-weight:600;margin:0 0 22px;color:var(--lf-title, var(--color-text-primary))}.lf-hint-line[data-v-edac6de7]{margin:-14px 0 18px;font-size:13px;color:var(--lf-hint, var(--color-text-tertiary))}.row[data-v-edac6de7]{margin:4px 0 20px}.lf-between[data-v-edac6de7]{display:flex;align-items:center;justify-content:space-between}.lf-link[data-v-edac6de7]{font-size:13px;color:var(--color-primary);cursor:pointer;-webkit-user-select:none;user-select:none}.lf-link[data-v-edac6de7]:hover{opacity:.85}.lf-link-disabled[data-v-edac6de7]{color:var(--lf-hint, var(--color-text-tertiary));cursor:default;pointer-events:none}.lf-captcha[data-v-edac6de7]{display:flex;gap:10px;width:100%;align-items:stretch}.lf-captcha-img[data-v-edac6de7]{flex:0 0 auto;height:40px;min-width:96px;padding:0;border:1px solid var(--lf-border, var(--color-border));border-radius:var(--radius-md);background:#fff;cursor:pointer;overflow:hidden;display:flex;align-items:center;justify-content:center}.lf-captcha-img[data-v-edac6de7] svg{height:100%;width:auto}.lf-send-btn[data-v-edac6de7]{flex:0 0 auto;height:40px;min-width:96px;padding:0 12px;border:1px solid var(--lf-border, var(--color-border));border-radius:var(--radius-md);background:var(--color-fill);font-size:13px;color:var(--lf-title, var(--color-text-secondary));cursor:pointer;transition:border-color var(--transition-fast),color var(--transition-fast)}.lf-send-btn[data-v-edac6de7]:hover:not(:disabled){border-color:var(--color-primary);color:var(--color-primary)}.lf-send-btn[data-v-edac6de7]:disabled{opacity:.6;cursor:not-allowed}.hero-btn[data-v-edac6de7]{width:100%;height:48px;border:none;border-radius:var(--radius-md);color:#fff;font-size:var(--font-size-md);font-weight:600;cursor:pointer;transition:transform var(--transition-fast),box-shadow var(--transition-fast)}.hero-btn[data-v-edac6de7]:hover{transform:translateY(-2px)}.hero-btn[data-v-edac6de7]:active{transform:translateY(0)}.hero-btn[data-v-edac6de7]:disabled{opacity:.7;cursor:not-allowed}.lf-divider[data-v-edac6de7]{display:flex;align-items:center;gap:14px;margin:24px 0 16px}.lf-divider[data-v-edac6de7]:before,.lf-divider[data-v-edac6de7]:after{content:"";flex:1;height:1px;background:var(--lf-border, var(--color-border))}.lf-divider span[data-v-edac6de7]{font-size:12px;color:var(--lf-hint, var(--color-text-tertiary))}.lf-sso[data-v-edac6de7]{display:flex;flex-wrap:wrap;justify-content:center;gap:12px}.lf-sso-btn[data-v-edac6de7]{width:32px;height:32px;padding:0;display:inline-flex;align-items:center;justify-content:center;border:none;border-radius:50%;background:transparent;color:inherit;text-decoration:none;cursor:pointer;overflow:hidden;box-sizing:border-box;flex-shrink:0}.lf-sso-btn[data-v-edac6de7]:hover{text-decoration:none;color:inherit}.lf-sso-btn[data-v-edac6de7]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.lf-sso-more[data-v-edac6de7]{width:32px;height:32px;border:1px solid var(--lf-border, var(--color-border));background:var(--color-fill, #f5f5f5);color:var(--color-text-tertiary, #999)}.lf-foot[data-v-edac6de7]{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:24px;font-size:12px;color:var(--lf-hint, var(--color-text-tertiary))}.lf-foot a[data-v-edac6de7]{color:inherit;text-decoration:none}.lf-foot a[data-v-edac6de7]:hover{color:var(--color-primary)}.lf-ver[data-v-edac6de7]{opacity:.75}.aurora[data-v-e994c489]{position:relative;height:100dvh;overflow:hidden;display:flex;align-items:center;justify-content:center;background:radial-gradient(140% 120% at 50% 0%,#12162b,#0a0b12 55%,#06060c)}.aurora[data-v-e994c489]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);background-size:46px 46px;-webkit-mask-image:radial-gradient(circle at 50% 45%,#000 0%,transparent 72%);mask-image:radial-gradient(circle at 50% 45%,#000 0%,transparent 72%)}.aurora[data-v-e994c489]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:none;background:radial-gradient(120% 120% at 50% 42%,transparent 52%,rgba(0,0,0,.6) 100%)}.aurora-bg[data-v-e994c489]{position:absolute;top:-20%;right:-20%;bottom:-20%;left:-20%;z-index:0;background:radial-gradient(38% 38% at 18% 22%,var(--a1),transparent 68%),radial-gradient(42% 42% at 82% 18%,var(--a2),transparent 70%),radial-gradient(48% 48% at 60% 88%,var(--a3),transparent 72%),radial-gradient(34% 34% at 88% 68%,var(--a4),transparent 66%);filter:blur(28px);animation:aurora-move-e994c489 18s ease-in-out infinite alternate}@keyframes aurora-move-e994c489{0%{transform:translate3d(-3%,-2%,0) rotate(0) scale(1.05)}50%{transform:translate3d(3%,2%,0) rotate(4deg) scale(1.16)}to{transform:translate3d(-2%,3%,0) rotate(-3deg) scale(1.08)}}.stars[data-v-e994c489]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-image:radial-gradient(1.5px 1.5px at 20% 30%,rgba(255,255,255,.7),transparent 60%),radial-gradient(1px 1px at 70% 62%,rgba(255,255,255,.5),transparent 60%),radial-gradient(1.5px 1.5px at 42% 82%,rgba(255,255,255,.6),transparent 60%),radial-gradient(1px 1px at 85% 22%,rgba(255,255,255,.5),transparent 60%),radial-gradient(1px 1px at 55% 14%,rgba(255,255,255,.55),transparent 60%),radial-gradient(1.5px 1.5px at 12% 66%,rgba(255,255,255,.5),transparent 60%),radial-gradient(1px 1px at 92% 48%,rgba(255,255,255,.45),transparent 60%);animation:twinkle-e994c489 5s ease-in-out infinite}@keyframes twinkle-e994c489{0%,to{opacity:.45}50%{opacity:.9}}.orb[data-v-e994c489]{position:absolute;z-index:0;border-radius:50%;filter:blur(55px);opacity:.55}.orb-1[data-v-e994c489]{width:340px;height:340px;background:var(--a1);top:-60px;left:-40px;animation:float-y-e994c489 14s ease-in-out infinite}.orb-2[data-v-e994c489]{width:280px;height:280px;background:var(--a4);bottom:-80px;right:-40px;animation:float-y-e994c489 16s ease-in-out infinite reverse}.orb-3[data-v-e994c489]{width:200px;height:200px;background:var(--a3);top:38%;right:18%;animation:float-y-e994c489 20s ease-in-out infinite}@keyframes float-y-e994c489{0%,to{transform:translateY(0)}50%{transform:translateY(-30px)}}.aurora-content[data-v-e994c489]{position:relative;z-index:3;width:100%;max-width:520px;padding:24px}.halo[data-v-e994c489]{position:absolute;z-index:0;top:8px;right:8px;bottom:8px;left:8px;border-radius:36px;background:conic-gradient(from 0deg,var(--a1),var(--a2),var(--a3),var(--a4),var(--a1));filter:blur(48px);opacity:.6;animation:spin-e994c489 16s linear infinite}@keyframes spin-e994c489{to{transform:rotate(360deg)}}.glass-card[data-v-e994c489]{--lf-title: #fff;--lf-hint: rgba(255, 255, 255, .5);position:relative;z-index:1;width:100%;padding:46px;border-radius:20px;background:#ffffff12;border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(26px) saturate(150%);-webkit-backdrop-filter:blur(26px) saturate(150%);box-shadow:0 30px 80px #0000008c,0 0 60px -12px var(--a2),inset 0 1px #fff3;overflow:hidden}.glass-card[data-v-e994c489]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:20px;padding:1px;background:linear-gradient(135deg,var(--a1),transparent 45%,var(--a2));-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;pointer-events:none;opacity:.9}.glass-card[data-v-e994c489]:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;pointer-events:none;background:linear-gradient(120deg,transparent 36%,rgba(255,255,255,.1) 48%,transparent 60%);background-size:220% 100%;background-repeat:no-repeat;animation:sheen-e994c489 8s ease-in-out infinite}@keyframes sheen-e994c489{0%{background-position:180% 0}55%,to{background-position:-60% 0}}.grain[data-v-e994c489]{position:absolute;top:0;right:0;bottom:0;left:0;z-index:5;pointer-events:none;opacity:.05;mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}.aurora.light[data-v-e994c489]{background:radial-gradient(140% 120% at 50% 0%,#eef1fb,#f6f7fc 55%,#fff)}.aurora.light[data-v-e994c489]:before{background-image:linear-gradient(rgba(0,0,0,.05) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.05) 1px,transparent 1px)}.aurora.light[data-v-e994c489]:after{background:radial-gradient(120% 120% at 50% 42%,transparent 55%,rgba(120,130,180,.12) 100%)}.aurora.light .stars[data-v-e994c489]{display:none}.aurora.light .halo[data-v-e994c489]{opacity:.5}.aurora.light .glass-card[data-v-e994c489]{--lf-title: var(--color-text-primary);--lf-hint: var(--color-text-tertiary);background:#ffffff9e;border:1px solid rgba(214,218,235,.9);box-shadow:0 30px 80px #505aa02e,0 0 60px -12px var(--a2),inset 0 1px #ffffffe6}.aurora.light .glass-card[data-v-e994c489]:before{display:none}.aurora.light .glass-card[data-v-e994c489]:after{display:none}@media(max-width:480px){.aurora-content[data-v-e994c489]{padding:16px}.glass-card[data-v-e994c489]{padding:32px 24px}}@media(prefers-reduced-motion:reduce){.aurora-bg[data-v-e994c489],.orb[data-v-e994c489],.stars[data-v-e994c489],.halo[data-v-e994c489],.glass-card[data-v-e994c489]:after{animation:none}.glass-card[data-v-e994c489]:after{display:none}}.split[data-v-75743368]{height:100dvh;display:grid;grid-template-columns:1.15fr .85fr;background:var(--color-bg-body)}.panel[data-v-75743368]{position:relative;overflow:hidden;background:var(--color-bg-body);border-right:1px solid var(--color-border)}.panel[data-v-75743368]:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(rgba(127,127,127,.08) 1px,transparent 1px),linear-gradient(90deg,rgba(127,127,127,.08) 1px,transparent 1px);background-size:40px 40px;-webkit-mask-image:radial-gradient(circle at 30% 40%,#000,transparent 72%);mask-image:radial-gradient(circle at 30% 40%,#000,transparent 72%)}.panel-aurora[data-v-75743368]{position:absolute;top:-20%;right:-20%;bottom:-20%;left:-20%;background:radial-gradient(40% 40% at 25% 20%,var(--a1),transparent 68%),radial-gradient(45% 45% at 80% 78%,var(--a2),transparent 70%);filter:blur(45px);opacity:.9;animation:panel-move-75743368 22s ease-in-out infinite alternate}@keyframes panel-move-75743368{0%{transform:translate3d(-3%,-2%,0) scale(1.05)}to{transform:translate3d(3%,3%,0) scale(1.12)}}.panel-inner[data-v-75743368]{position:relative;z-index:1;padding:64px 56px;display:flex;flex-direction:column;height:100%;justify-content:center}.logo[data-v-75743368]{display:flex;align-items:center;gap:12px;font-size:22px;font-weight:700;color:#2a3c82}.bar[data-v-75743368]{width:40px;height:3px;border-radius:2px;margin:28px 0 20px}.headline[data-v-75743368]{font-size:42px;line-height:1.2;font-weight:800;color:var(--color-text-primary);margin:0}.sub[data-v-75743368]{color:var(--color-text-secondary);margin:16px 0 28px}.points[data-v-75743368]{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:14px}.points li[data-v-75743368]{display:flex;align-items:center;gap:10px;color:var(--color-text-secondary)}.form-wrap[data-v-75743368]{position:relative;display:flex;flex-direction:column;background:var(--color-bg-container)}.mid[data-v-75743368]{flex:1;display:flex;align-items:center;justify-content:center;padding:24px}.form-inner[data-v-75743368]{width:100%;max-width:340px;animation:fade-up-75743368 .6s cubic-bezier(.16,1,.3,1) both}.greet[data-v-75743368]{font-size:26px;font-weight:700;letter-spacing:-.01em;color:var(--color-text-primary);margin:0 0 6px}.greet-sub[data-v-75743368]{font-size:var(--font-size-sm);color:var(--color-text-tertiary);margin:0 0 26px}.foot[data-v-75743368]{margin:0;padding:18px 24px 22px;text-align:center;font-size:var(--font-size-sm);color:var(--color-text-tertiary)}.foot a[data-v-75743368]{color:inherit;text-decoration:none}.foot a[data-v-75743368]:hover{color:var(--color-primary)}.foot-ver[data-v-75743368]{margin-left:8px;opacity:.75}@keyframes fade-up-75743368{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}@media(max-width:900px){.split[data-v-75743368]{grid-template-columns:1fr}.panel[data-v-75743368]{display:none}}@media(prefers-reduced-motion:reduce){.panel-aurora[data-v-75743368],.form-inner[data-v-75743368]{animation:none}}.spotlight[data-v-2d0bde1c]{position:relative;height:100dvh;overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--color-bg-body)}.mesh[data-v-2d0bde1c]{position:absolute;top:0;right:0;bottom:0;left:0;background:radial-gradient(30% 40% at 15% 20%,var(--s1),transparent 60%),radial-gradient(30% 40% at 85% 80%,var(--s2),transparent 60%);opacity:.9}.spot[data-v-2d0bde1c]{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:radial-gradient(340px 340px at var(--mx) var(--my),var(--spot),transparent 60%);transition:background .12s ease-out}.card[data-v-2d0bde1c]{position:relative;z-index:2;width:100%;max-width:460px;padding:46px;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:var(--radius-xl);box-shadow:var(--shadow-3);animation:fade-up-2d0bde1c .6s cubic-bezier(.16,1,.3,1) both}@keyframes fade-up-2d0bde1c{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}@media(max-width:480px){.spotlight[data-v-2d0bde1c]{padding:0 16px}.card[data-v-2d0bde1c]{padding:32px 24px}}@media(prefers-reduced-motion:reduce){.spot[data-v-2d0bde1c]{transition:none}.card[data-v-2d0bde1c]{animation:none}}.login-shell[data-v-846afb99]{position:relative;height:100dvh;overflow:hidden}.login-topbar[data-v-846afb99]{position:fixed;top:20px;right:24px;z-index:10;display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;gap:10px}.login-tools[data-v-846afb99]{display:flex;gap:2px;padding:4px;border-radius:999px;background:#12141c8c;border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:0 6px 20px #00000047}.tool-btn[data-v-846afb99]{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:30px;padding:0 10px;border:none;cursor:pointer;border-radius:999px;background:transparent;font-size:13px;font-weight:600;color:#ffffff9e;transition:color .2s,background .2s}.tool-btn[data-v-846afb99]:hover{color:#fff}.tool-btn[data-v-846afb99]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.skin-switch[data-v-846afb99]{display:flex;gap:2px;padding:4px;border-radius:999px;background:#12141c8c;border:1px solid rgba(255,255,255,.14);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);box-shadow:0 6px 20px #00000047}.skin-seg[data-v-846afb99]{border:none;cursor:pointer;padding:6px 16px;border-radius:999px;background:transparent;font-size:13px;font-weight:600;color:#ffffff9e;transition:color .2s,background .2s}.skin-seg[data-v-846afb99]:hover{color:#fff}.skin-seg.active[data-v-846afb99]{background:var(--color-primary);color:#fff}.oauth-cb[data-v-843f1b99]{min-height:100dvh;display:flex;align-items:center;justify-content:center;background:var(--color-bg-layout, #f5f6f8)}.oauth-box[data-v-843f1b99]{display:flex;flex-direction:column;align-items:center;gap:14px}.oauth-msg[data-v-843f1b99]{font-size:15px;color:var(--color-text-primary)}.oauth-sub[data-v-843f1b99]{font-size:13px;color:var(--color-text-tertiary)}.oauth-err-icon[data-v-843f1b99]{font-size:44px;color:var(--color-error, #e88080)}.mfa-page[data-v-b6e82c2c]{min-height:100dvh;display:grid;place-items:center;padding:24px;background:var(--color-body, #f5f7fa)}.mfa-card[data-v-b6e82c2c]{width:min(100%,520px)}.mfa-header[data-v-b6e82c2c]{display:flex;align-items:center;justify-content:space-between;gap:12px}.mfa-qr-wrap[data-v-b6e82c2c]{display:flex;justify-content:center;margin:0 0 16px;padding:16px;background:#fff;border-radius:8px;border:1px solid var(--color-border, #e5e7eb)}.mfa-manual-hint[data-v-b6e82c2c]{margin:-8px 0 12px;font-size:12px;color:var(--color-text-tertiary, #9ca3af);line-height:1.5}.recovery-codes[data-v-b6e82c2c]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.recovery-codes[data-v-b6e82c2c] .n-alert,.recovery-codes[data-v-b6e82c2c] .n-button{grid-column:1 / -1}.recovery-code[data-v-b6e82c2c]{padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:var(--color-hover, #f4f4f5);border-radius:4px}@media(max-width:480px){.mfa-page[data-v-b6e82c2c]{padding:12px}.recovery-codes[data-v-b6e82c2c]{grid-template-columns:1fr}}.boot-error[data-v-c523298c]{min-height:100dvh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;background:var(--color-bg-app)}h1[data-v-c523298c]{margin:0;color:var(--color-text-primary);font-size:var(--font-size-xl)}p[data-v-c523298c]{margin:0 0 8px;max-width:480px;color:var(--color-text-secondary)}.wrap[data-v-f50f3abd]{min-height:100dvh;background:var(--color-bg-body);padding:80px 24px;display:flex;flex-direction:column;align-items:center}.head[data-v-f50f3abd]{display:flex;align-items:center;gap:12px;margin-bottom:32px}.head h1[data-v-f50f3abd]{font-size:var(--font-size-xl);font-weight:600;color:var(--color-text-primary)}.grid[data-v-f50f3abd]{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--gap-card);width:100%;max-width:900px}.card[data-v-f50f3abd]{position:relative;display:flex;align-items:center;gap:14px;padding:20px;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-1);cursor:pointer;transition:transform var(--transition-fast),border-color var(--transition-fast)}.card.current[data-v-f50f3abd]{border-color:var(--color-primary)}.card[data-v-f50f3abd]:hover{transform:translateY(-3px);border-color:var(--color-primary);box-shadow:var(--shadow-2)}.card[data-v-f50f3abd]:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.ico[data-v-f50f3abd]{color:var(--color-primary)}.name[data-v-f50f3abd]{font-size:var(--font-size-md);font-weight:600;color:var(--color-text-primary)}.code[data-v-f50f3abd]{font-size:var(--font-size-sm);color:var(--color-text-tertiary);font-family:var(--font-family-mono)}.def[data-v-f50f3abd]{position:absolute;top:10px;right:12px}.row[data-v-195679a9]{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:40px}.lbl[data-v-195679a9]{color:var(--color-text-secondary);font-size:var(--font-size-sm);white-space:nowrap}.ctl[data-v-195679a9]{display:flex;align-items:center;min-width:0}.grid[data-v-66443dff]{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;padding-inline:3px}.cell[data-v-66443dff]{display:flex;flex-direction:column;align-items:center;gap:8px;cursor:pointer}.card[data-v-66443dff]{width:100%;height:62px;padding:6px;border:none;border-radius:4px;background:var(--color-bg-container);box-shadow:0 1px 3px #141b2d1a,0 0 0 2px transparent;cursor:pointer;transition:box-shadow .15s ease}.cell:hover .card[data-v-66443dff],.card.on[data-v-66443dff]{box-shadow:0 1px 3px #141b2d1a,0 0 0 2px var(--color-primary)}.inner[data-v-66443dff]{--strong: var(--color-primary);--p300: color-mix(in srgb, var(--color-primary) 58%, var(--color-bg-container));--p200: color-mix(in srgb, var(--color-primary) 34%, var(--color-bg-container));display:flex;gap:5px;width:100%;height:100%}.inner.row[data-v-66443dff]{flex-direction:row}.inner.col[data-v-66443dff]{flex-direction:column}.inner i[data-v-66443dff],.inner .vwrap[data-v-66443dff],.inner .hwrap[data-v-66443dff]{border-radius:3px}.strong[data-v-66443dff]{background:var(--strong)}.p300[data-v-66443dff]{background:var(--p300)}.p200[data-v-66443dff]{background:var(--p200)}.sider[data-v-66443dff]{width:18%;flex-shrink:0}.rail[data-v-66443dff]{width:9%;flex-shrink:0}.subsider[data-v-66443dff]{width:16%;flex-shrink:0}.header[data-v-66443dff]{flex-shrink:0;height:13px}.header.full[data-v-66443dff]{width:100%}.main[data-v-66443dff]{flex:1}.vwrap[data-v-66443dff]{flex:1;display:flex;flex-direction:column;gap:5px}.vwrap .header[data-v-66443dff]{width:100%}.hwrap[data-v-66443dff]{flex:1;display:flex;flex-direction:row;gap:5px}.label[data-v-66443dff]{margin:0;text-align:center;font-size:var(--font-size-xs);line-height:var(--line-height-xs);color:var(--color-text-secondary)}.label.on[data-v-66443dff]{color:var(--color-primary);font-weight:var(--font-weight-medium)}.tabs[data-v-adecf714]{height:100%}.footer-actions[data-v-adecf714]{display:flex;flex-direction:column;gap:8px;width:100%}.ri[data-v-adecf714]{margin-right:5px;font-size:15px}.seg[data-v-adecf714]{display:flex;width:100%}.seg[data-v-adecf714] .n-radio-button{flex:1;display:flex;align-items:center;justify-content:center}.accents[data-v-adecf714]{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:12px}.dot[data-v-adecf714]{position:relative;width:100%;max-width:30px;margin:0 auto;aspect-ratio:1;padding:0;border:none;border-radius:50%;cursor:pointer;box-shadow:inset 0 0 0 1px #00000014;display:flex;align-items:center;justify-content:center;transition:transform .15s ease,box-shadow .15s ease}.dot[data-v-adecf714]:hover{transform:scale(1.12)}.dot.on[data-v-adecf714]{transform:scale(1.1);box-shadow:0 0 0 2px var(--color-bg-container),0 0 0 4px var(--color-primary)}.tick[data-v-adecf714]{color:#fff;font-size:14px;filter:drop-shadow(0 0 1px rgba(0,0,0,.35))}.notice-panel[data-v-1ac49123]{width:360px;max-width:92vw}.notice-head[data-v-1ac49123]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px 4px}.notice-title[data-v-1ac49123]{font-weight:600;font-size:var(--font-size-md)}.notice-empty[data-v-1ac49123]{padding:32px 0}.notice-list[data-v-1ac49123]{margin:0;padding:0;list-style:none}.notice-item[data-v-1ac49123]{position:relative;display:flex;gap:8px;padding:12px 16px;cursor:pointer;border-top:1px solid var(--n-divider-color, rgba(128, 128, 128, .15));transition:background-color .2s}.notice-item[data-v-1ac49123]:hover{background-color:#80808014}.notice-item.unread[data-v-1ac49123]{background-color:color-mix(in srgb,var(--color-primary) 4%,transparent)}.notice-item.unread[data-v-1ac49123]:hover{background-color:color-mix(in srgb,var(--color-primary) 9%,transparent)}.notice-item.read[data-v-1ac49123]{opacity:.55}.dot[data-v-1ac49123]{position:absolute;left:6px;top:18px;width:6px;height:6px;border-radius:50%;background:var(--color-primary, #d03050)}.notice-body[data-v-1ac49123]{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.line1[data-v-1ac49123]{display:flex;align-items:center;gap:6px;min-width:0}.item-title[data-v-1ac49123]{flex:1;min-width:0;font-size:var(--font-size-sm)}.item-title.unread[data-v-1ac49123]{font-weight:600}.item-actions-mark[data-v-1ac49123]{flex-shrink:0;color:var(--color-primary, #d03050)}.item-snippet[data-v-1ac49123]{font-size:12px;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.item-time[data-v-1ac49123]{font-size:11px}.notice-foot[data-v-1ac49123]{display:flex;justify-content:center;padding:8px;border-top:1px solid var(--n-divider-color, rgba(128, 128, 128, .15))}.bar[data-v-8dc4f67f]{height:100%;display:flex;align-items:center;gap:12px;padding:0 16px}.left[data-v-8dc4f67f]{display:flex;align-items:center;gap:10px;min-width:0;overflow:hidden}.brand[data-v-8dc4f67f]{display:flex;align-items:center;gap:8px;color:var(--color-text-primary);font-weight:600;flex-shrink:0}.brand-name[data-v-8dc4f67f]{font-size:var(--font-size-md)}.title[data-v-8dc4f67f]{font-size:var(--font-size-md);font-weight:500;color:var(--color-text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.uname[data-v-8dc4f67f]{margin-left:6px}.center[data-v-8dc4f67f]{flex:1;min-width:0;overflow:hidden}.right[data-v-8dc4f67f]{display:flex;align-items:center;gap:6px;margin-left:auto;flex-shrink:0}@media(max-width:767px){.bar[data-v-8dc4f67f]{gap:8px;padding:0 8px}.mobile-hide[data-v-8dc4f67f]{display:none}}.sidenav[data-v-0b56822a]{height:100%;display:flex;flex-direction:column;background:var(--color-bg-container);overflow:hidden}.brand[data-v-0b56822a]{display:flex;align-items:center;gap:10px;height:var(--header-h);padding:0 22px;color:var(--color-text-primary);font-weight:600;overflow:hidden;white-space:nowrap;flex-shrink:0}.rail .brand[data-v-0b56822a]{padding:0;justify-content:center}.brand-name[data-v-0b56822a]{font-size:20px;font-weight:700;color:var(--color-text-primary)}.sidenav[data-v-0b56822a] .n-scrollbar{flex:1;min-height:0}.tabsbar[data-v-8fc6542a]{height:42px;display:flex;align-items:center;padding:0 8px;background:var(--color-bg-container);border-bottom:1px solid var(--color-border)}.strip[data-v-8fc6542a]{display:flex;align-items:center;gap:6px;padding:5px 0}.chip[data-v-8fc6542a]{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-fill);color:var(--color-text-secondary);font-size:var(--font-size-sm);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color .15s,background .15s,border-color .15s}.chip[data-v-8fc6542a]:hover{color:var(--color-text-primary)}.chip.active[data-v-8fc6542a]{background:var(--color-primary-light);border-color:var(--color-primary);color:var(--color-primary)}.chip[data-v-8fc6542a]:focus-visible,.chip-close[data-v-8fc6542a]:focus-visible{outline:2px solid var(--color-primary);outline-offset:1px}.chip-pin[data-v-8fc6542a]{opacity:.7}.chip-close[data-v-8fc6542a]{border-radius:50%;opacity:.6}.chip-close[data-v-8fc6542a]:hover{opacity:1;background:var(--color-fill)}.layout[data-v-aa6e9642]{display:grid;height:100dvh;overflow:hidden;background:var(--color-bg-app)}.mode-vertical[data-v-aa6e9642],.mode-vertical-mix[data-v-aa6e9642],.mode-vertical-hybrid-header-first[data-v-aa6e9642]{grid-template-columns:auto 1fr;grid-template-rows:var(--header-h) 1fr;grid-template-areas:"aside header" "aside content"}.mode-top-hybrid-sidebar-first[data-v-aa6e9642],.mode-top-hybrid-header-first[data-v-aa6e9642]{grid-template-columns:auto 1fr;grid-template-rows:var(--header-h) 1fr;grid-template-areas:"header header" "aside content"}.mode-horizontal[data-v-aa6e9642],.mode-mobile[data-v-aa6e9642]{grid-template-columns:1fr;grid-template-rows:var(--header-h) 1fr;grid-template-areas:"header" "content"}.aside[data-v-aa6e9642]{grid-area:aside;height:100%;overflow:hidden;border-right:1px solid var(--color-border);background:var(--color-bg-container);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);transition:width .2s ease}.aside--mix[data-v-aa6e9642]{display:flex}.aside--mix .rail[data-v-aa6e9642]{width:var(--rail-w);flex-shrink:0;border-right:1px solid var(--color-border)}.aside--mix .l2col[data-v-aa6e9642]{flex:1;min-width:0}.header[data-v-aa6e9642]{grid-area:header;display:flex;align-items:stretch;border-bottom:1px solid var(--color-border);background:var(--color-header-bg);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:10}.header--static[data-v-aa6e9642]{-webkit-backdrop-filter:none;backdrop-filter:none}.hbg[data-v-aa6e9642]{align-self:center;margin-left:8px}.apph[data-v-aa6e9642]{flex:1;min-width:0;height:100%}.content[data-v-aa6e9642]{grid-area:content;display:flex;flex-direction:column;min-height:0;overflow:hidden}.tabs[data-v-aa6e9642]{flex-shrink:0}.page[data-v-aa6e9642]{flex:1;min-height:0;overflow:auto;padding:var(--pad-page)}.personal-layout[data-v-45e1c4ea]{display:flex;gap:16px;align-items:stretch;min-height:100%}.personal-sider[data-v-45e1c4ea]{width:200px;flex-shrink:0;background:var(--color-bg-container, #fff);border:1px solid var(--color-border, #e5e7eb);border-radius:8px;padding:8px 0 12px}.personal-main[data-v-45e1c4ea]{flex:1;min-width:0;display:flex;flex-direction:column;gap:12px}.personal-mobile-nav[data-v-45e1c4ea]{max-width:360px}.personal-content[data-v-45e1c4ea]{min-width:0}.personal-layout.is-mobile[data-v-45e1c4ea]{flex-direction:column}.avatar-field[data-v-5c4afffc]{display:flex;align-items:center;gap:12px}.sec-desc[data-v-7afb110e]{margin:0 0 16px;color:var(--color-text-2, #666);line-height:1.5}.sec-note[data-v-7afb110e]{margin:20px 0 0;font-size:12px;color:var(--color-text-3, #999);line-height:1.5}[data-v-83e5e6b1] .device-cell{display:flex;align-items:center;gap:8px}.bind-page[data-v-3ab6b190]{max-width:920px}.bind-header[data-v-3ab6b190]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:14px;flex-wrap:wrap}.bind-title[data-v-3ab6b190]{margin:0 0 6px;font-size:18px;font-weight:600;line-height:1.3;color:var(--color-text-primary, #1f1f1f)}.bind-hint[data-v-3ab6b190]{margin:0;max-width:520px;font-size:13px;line-height:1.55;color:var(--color-text-secondary, #666)}.bind-summary[data-v-3ab6b190]{display:inline-flex;align-items:baseline;gap:4px;padding:8px 12px;border-radius:10px;background:var(--color-fill, #f5f5f5);font-size:13px;color:var(--color-text-secondary, #666);flex-shrink:0}.bind-summary-num[data-v-3ab6b190]{font-size:18px;font-weight:700;color:var(--color-primary, #646cff);font-variant-numeric:tabular-nums}.bind-summary-sep[data-v-3ab6b190]{opacity:.5}.bind-summary-label[data-v-3ab6b190]{margin-left:4px}.bind-alert[data-v-3ab6b190]{margin-bottom:16px;border-radius:10px}.bind-empty[data-v-3ab6b190]{padding:48px 0}.bind-grid[data-v-3ab6b190]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.bind-card[data-v-3ab6b190] .n-card-content{display:flex;flex-direction:column;gap:14px}.bind-card[data-v-3ab6b190]:hover{box-shadow:0 4px 14px #0000000f}.bind-card.bind-card--bound[data-v-3ab6b190]{border-color:color-mix(in srgb,var(--color-success, #18a058) 40%,var(--color-border, #e8e8e8));background:color-mix(in srgb,var(--color-success, #18a058) 4%,var(--color-bg-container, #fff))}.bind-card.bind-card--disabled[data-v-3ab6b190]{opacity:.78;background:var(--color-fill-quaternary, #f7f7f7);border-style:dashed}.bind-card-main[data-v-3ab6b190]{display:flex;align-items:flex-start;gap:12px;min-width:0}.bind-avatar[data-v-3ab6b190]{position:relative;display:inline-flex;width:48px;height:48px;flex-shrink:0;align-items:center;justify-content:center;border-radius:50%;overflow:visible;background:var(--color-fill, #f5f5f5)}.bind-avatar[data-v-3ab6b190] .oauth-brand-badge,.bind-avatar[data-v-3ab6b190] img{border-radius:50%;overflow:hidden}.bind-avatar--bound[data-v-3ab6b190]{box-shadow:0 0 0 2px color-mix(in srgb,var(--color-success, #18a058) 35%,transparent)}.bind-check[data-v-3ab6b190]{position:absolute;right:-2px;bottom:-2px;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;border-radius:50%;background:var(--color-success, #18a058);color:#fff;border:2px solid var(--color-bg-container, #fff);line-height:0}.bind-meta[data-v-3ab6b190]{min-width:0;flex:1}.bind-title-row[data-v-3ab6b190]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}.bind-name[data-v-3ab6b190]{font-size:15px;font-weight:600;color:var(--color-text-primary, #1f1f1f);line-height:1.3}.bind-code[data-v-3ab6b190]{display:inline-block;font-size:12px;color:var(--color-text-tertiary, #999);background:var(--color-fill, #f5f5f5);padding:1px 6px;border-radius:4px}.bind-time[data-v-3ab6b190],.bind-free-tip[data-v-3ab6b190],.bind-disabled-tip[data-v-3ab6b190]{margin:8px 0 0;font-size:12px;line-height:1.45;color:var(--color-text-tertiary, #999)}.bind-time[data-v-3ab6b190]{color:var(--color-text-secondary, #666)}.bind-actions[data-v-3ab6b190]{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding-top:12px;border-top:1px dashed var(--color-border, #e8e8e8);min-height:36px}.bind-na[data-v-3ab6b190]{font-size:12px;color:var(--color-text-tertiary, #999)}.nf[data-v-6b886879]{min-height:60vh;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:var(--color-bg-body)}.code[data-v-6b886879]{font-size:96px;font-weight:800;line-height:1}.msg[data-v-6b886879]{color:var(--color-text-secondary);font-size:var(--font-size-md)}.view[data-v-e7ff753e]{display:flex;flex-direction:column;gap:var(--gap-card)}.banner[data-v-e7ff753e]{display:flex;align-items:center;gap:16px;padding:24px;border-radius:var(--radius-lg);background:var(--color-primary-light)}.avatar[data-v-e7ff753e]{width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center}.hi[data-v-e7ff753e]{font-size:var(--font-size-lg);font-weight:600;color:var(--color-text-primary)}.tip[data-v-e7ff753e]{color:var(--color-text-secondary);margin-top:4px}.quick[data-v-e7ff753e]{display:flex;flex-wrap:wrap;gap:12px}.notice-row[data-v-e7ff753e]{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer}.notice-title[data-v-e7ff753e]{display:flex;align-items:center;gap:8px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--color-text-primary)}.dot[data-v-e7ff753e]{flex-shrink:0;width:6px;height:6px;border-radius:50%;background:var(--color-primary)}.notice-time[data-v-e7ff753e]{flex-shrink:0;color:var(--color-text-secondary);font-size:12px}.view[data-v-a20971bd]{display:flex;flex-direction:column;gap:var(--gap-card)}.banner[data-v-a20971bd]{display:flex;align-items:center;gap:16px;padding:24px;border-radius:var(--radius-lg);background:var(--color-primary-light)}.avatar[data-v-a20971bd]{width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center}.hi[data-v-a20971bd]{font-size:var(--font-size-lg);font-weight:600;color:var(--color-text-primary)}.tip[data-v-a20971bd]{color:var(--color-text-secondary);margin-top:4px}.stat[data-v-a20971bd]{display:flex;align-items:center;gap:16px}.stat-body[data-v-a20971bd]{min-width:0}.stat-ico[data-v-a20971bd]{flex-shrink:0;width:48px;height:48px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,currentColor 12%,transparent)}.stat-val[data-v-a20971bd]{font-size:28px;font-weight:700;color:var(--color-text-primary);line-height:1.1}.stat-label[data-v-a20971bd]{color:var(--color-text-secondary);margin-top:2px}.embed-wrap[data-v-dcc7858a]{height:100%;min-height:calc(100dvh - 160px)}.embed[data-v-dcc7858a]{display:block;width:100%;height:100%;min-height:calc(100dvh - 160px);border:0}.missing-route[data-v-1e499090]{min-height:60vh;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--color-text-secondary);text-align:center}h1[data-v-1e499090]{margin:0;color:var(--color-text-primary);font-size:var(--font-size-xl)}p[data-v-1e499090]{margin:0}code[data-v-1e499090]{padding:6px 8px;background:var(--color-bg-container);border:1px solid var(--color-border);border-radius:4px;color:var(--color-danger)}.cache[data-v-21abb77a]{display:flex;flex-direction:column;gap:12px}.action-card[data-v-21abb77a]{height:100%}.head[data-v-21abb77a]{display:flex;align-items:center;gap:8px;font-size:15px;font-weight:600}.desc[data-v-21abb77a]{margin:10px 0 14px;font-size:13px;line-height:1.6;color:var(--color-text-secondary, #999);min-height:42px}.note[data-v-21abb77a]{margin:4px 0 0;font-size:12px;line-height:1.6;color:var(--color-text-secondary, #999)}.group-extra-hint[data-v-3cb9c09b]{margin:-6px 0 12px;font-size:12px;color:var(--color-text-tertiary)}.ea[data-v-71792251]{max-width:920px}.ea-alert[data-v-71792251]{margin-bottom:16px;border-radius:10px}.ea-empty[data-v-71792251]{padding:48px 0}.ea-toolbar[data-v-71792251]{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px;flex-wrap:wrap}.ea-summary[data-v-71792251]{font-size:13px;color:var(--color-text-secondary, #666)}.ea-toolbar-actions[data-v-71792251]{display:flex;align-items:center;gap:8px}.ea-grid[data-v-71792251]{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px}.ea-card[data-v-71792251]{display:flex;flex-direction:column;gap:14px;padding:16px;border-radius:12px;border:1px solid var(--color-border, #e8e8e8);background:var(--color-bg-container, #fff);transition:border-color .15s ease,box-shadow .15s ease,opacity .15s ease}.ea-card[data-v-71792251]:hover{box-shadow:0 4px 14px #0000000f}.ea-card--off[data-v-71792251]{opacity:.85;background:var(--color-fill-quaternary, #fafafa)}.ea-card--on[data-v-71792251]{border-color:color-mix(in srgb,var(--color-primary, #18a058) 35%,var(--color-border, #e8e8e8))}.ea-card--na[data-v-71792251]{opacity:.72;background:var(--color-fill-quaternary, #f7f7f7);border-style:dashed}.ea-card-main[data-v-71792251]{display:flex;align-items:flex-start;gap:12px;min-width:0}.ea-avatar[data-v-71792251]{display:inline-flex;width:44px;height:44px;flex-shrink:0;align-items:center;justify-content:center;border-radius:50%;overflow:hidden;background:var(--color-fill, #f5f5f5)}.ea-meta[data-v-71792251]{min-width:0;flex:1}.ea-title-row[data-v-71792251]{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}.ea-name[data-v-71792251]{font-size:15px;font-weight:600;color:var(--color-text-primary, #1f1f1f);line-height:1.3}.ea-code[data-v-71792251]{font-size:12px;color:var(--color-text-tertiary, #999);background:var(--color-fill, #f5f5f5);padding:1px 6px;border-radius:4px}.ea-na-tip[data-v-71792251]{margin:8px 0 0;font-size:12px;line-height:1.45;color:var(--color-text-tertiary, #999)}.ea-switch[data-v-71792251]{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:12px;border-top:1px dashed var(--color-border, #e8e8e8)}.ea-switch+.ea-switch[data-v-71792251]{margin-top:-4px;padding-top:0;border-top:0}.ea-switch-label[data-v-71792251]{font-size:13px;color:var(--color-text-secondary, #666)}.sms-hint[data-v-c20e33fd]{margin:-6px 0 12px;font-size:12px;color:var(--color-text-tertiary)}.dict-layout[data-v-a7b1ad76]{flex-wrap:wrap;gap:var(--gap-card)}.dict-pane[data-v-a7b1ad76]{flex:1 1 380px;min-width:0}.clear-body[data-v-8324d44c]{display:flex;flex-direction:column;gap:10px}.clear-hint[data-v-8324d44c]{font-size:12px;color:var(--color-text-tertiary)}.attempts-title[data-v-8324d44c]{margin:16px 0 8px;font-size:var(--font-size-sm);font-weight:600;color:var(--color-text-primary)}.log-output[data-v-8324d44c]{margin:0;white-space:pre-wrap;word-break:break-all;font-family:var(--font-family-mono, ui-monospace, monospace);font-size:12px;line-height:1.5}.log-error[data-v-8324d44c]{color:var(--color-danger)}.view[data-v-34ed407f]{gap:var(--gap-card)}.job-tables[data-v-34ed407f],.job-tables[data-v-34ed407f]>*{min-height:240px}.stat[data-v-34ed407f]{display:flex;align-items:center;gap:16px}.stat-ico[data-v-34ed407f]{flex-shrink:0;width:48px;height:48px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,currentColor 12%,transparent)}.stat-val[data-v-34ed407f]{font-size:28px;font-weight:700;color:var(--color-text-primary);line-height:1.1}.stat-label[data-v-34ed407f]{color:var(--color-text-secondary);margin-top:2px}.kv-editor[data-v-aabac178]{display:flex;flex-direction:column;gap:8px;width:100%}.kv-row[data-v-aabac178]{display:flex;gap:8px;align-items:center}.kv-hint[data-v-aabac178]{font-size:12px;color:var(--color-text-tertiary)}.job-hint[data-v-aabac178]{font-size:12px;color:var(--color-text-tertiary);white-space:nowrap;line-height:1.4}.job-inline[data-v-aabac178]{display:flex;align-items:center;gap:10px;flex-wrap:nowrap;min-width:0}.job-sec-text[data-v-aabac178]{font-size:var(--font-size-sm);font-weight:600}.job-sections[data-v-aabac178] .n-collapse-item{margin:0}.job-sections[data-v-aabac178] .n-collapse-item__header{padding:10px 0}.job-sections[data-v-aabac178] .n-collapse-item__content-inner{padding:4px 0 12px}.job-sections[data-v-aabac178] .n-form-item{margin-bottom:14px}.job-sections[data-v-aabac178] .n-form-item-feedback-wrapper:empty,.job-sections[data-v-aabac178] .n-form-item-feedback-wrapper:has(:empty){min-height:0}.job-advanced[data-v-aabac178] .n-form-item{margin-bottom:18px}.job-advanced[data-v-aabac178] .n-form-item-label{padding-right:12px}.exception[data-v-d5b09c10],.exception[data-v-9e9a338d]{margin:0;white-space:pre-wrap;word-break:break-all;font-family:var(--font-mono, ui-monospace, monospace);font-size:12px;line-height:1.5;color:var(--color-danger)}.perm-hint[data-v-0a7963e1],.link-hint[data-v-5b265f65]{font-size:12px;color:var(--color-text-tertiary, #999);line-height:1.5}.view[data-v-d019bdd8]{display:flex;flex-direction:column;gap:var(--gap-card)}[data-v-d019bdd8] .row-no{font-variant-numeric:tabular-nums;white-space:nowrap}[data-v-d019bdd8] .row-no__path{color:var(--color-text-disabled)}[data-v-d019bdd8] .row-no__self{color:var(--color-text-secondary);font-weight:var(--font-weight-medium)}.hint[data-v-ea6672c5]{font-size:12px;color:var(--color-text-secondary, #999)}.monitor[data-v-8ea4d493]{display:flex;flex-direction:column;gap:12px}.bar[data-v-8ea4d493]{display:flex;justify-content:flex-end}.metric[data-v-8ea4d493]{font-size:28px;font-weight:600;line-height:1.2;margin-bottom:10px}.metric.small[data-v-8ea4d493]{font-size:18px}.unit[data-v-8ea4d493]{font-size:16px;margin-left:2px;color:var(--color-text-secondary, #999)}.sub[data-v-8ea4d493]{margin-top:8px;font-size:12px;color:var(--color-text-secondary, #999)}.rows[data-v-8ea4d493]{display:grid;gap:8px;font-size:13px}.rows .k[data-v-8ea4d493]{display:inline-block;width:88px;color:var(--color-text-secondary, #999)}.rows .v[data-v-8ea4d493]{word-break:break-all}.notice-actions-editor[data-v-5c6d1da0]{width:100%}.notice-action-row[data-v-5c6d1da0]{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:100%}.notice-actions-hint[data-v-5c6d1da0]{display:block;margin-top:4px;font-size:12px;line-height:1.4}.view[data-v-72e7ef38],.view[data-v-ef7d111d]{gap:var(--gap-card)}.grant-menu-table[data-v-6c2563ee]{display:flex;flex-direction:column;gap:10px}.grant-toolbar[data-v-6c2563ee]{display:flex;gap:8px}.grant-grid[data-v-6c2563ee]{border:1px solid var(--n-border-color, #e0e0e6);border-radius:4px;font-size:13px;overflow:hidden}.grant-header[data-v-6c2563ee]{display:flex;background:var(--n-th-color, #fafafc);font-weight:600;font-size:12px;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.grant-header>div[data-v-6c2563ee]{padding:8px 12px}.grant-group[data-v-6c2563ee]{display:flex;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.grant-group[data-v-6c2563ee]:last-child{border-bottom:none}.grant-group>.col-catalog[data-v-6c2563ee]{display:flex;align-items:center;gap:4px;padding:8px 12px;border-right:1px solid var(--n-border-color, #e0e0e6);cursor:pointer;-webkit-user-select:none;user-select:none}.collapse-arrow[data-v-6c2563ee]{display:inline-block;font-size:10px;transition:transform .2s;color:var(--n-text-color-disabled, #999)}.collapse-arrow.is-collapsed[data-v-6c2563ee]{transform:rotate(-90deg)}.group-rows[data-v-6c2563ee]{flex:1;min-width:0}.grant-row[data-v-6c2563ee]{display:flex;border-bottom:1px solid var(--n-border-color, #e0e0e6)}.grant-row[data-v-6c2563ee]:last-child{border-bottom:none}.col-catalog[data-v-6c2563ee]{width:130px;flex-shrink:0}.col-menu[data-v-6c2563ee]{width:140px;flex-shrink:0;display:flex;align-items:center;padding:6px 12px;border-right:1px solid var(--n-border-color, #e0e0e6)}.anchor-tag[data-v-6c2563ee]{font-size:12px}.col-buttons[data-v-6c2563ee]{flex:1;display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;padding:6px 12px;min-width:0}.no-buttons[data-v-6c2563ee]{color:var(--n-text-color-disabled, #c0c0c0)}.grant-empty[data-v-6c2563ee]{text-align:center;padding:24px;color:var(--n-text-color-disabled, #c0c0c0)}.reset-hint[data-v-104f8da0]{margin:0 0 12px;font-size:var(--font-size-sm, 13px);color:var(--color-text-secondary, #888)}.pw-field[data-v-f2afa7e7]{flex:1;min-width:0}.avatar-field[data-v-f2afa7e7]{display:flex;align-items:center;gap:12px}.org-filter[data-v-48cff6c5]{flex:0 0 200px}.org-filter[data-v-48cff6c5] .n-tree{flex:1;min-height:0;overflow:auto}.org-filter-head[data-v-48cff6c5]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.org-filter-title[data-v-48cff6c5]{font-weight:600;font-size:var(--font-size-sm, 13px)}
@@ -10,9 +10,9 @@ export interface PrimaryRamp {
10
10
  /**
11
11
  * accent → 主色四态(DESIGN.md)。暗色先把 accent 提亮一档,再派生 hover/pressed/light。
12
12
  *
13
- * 收在这里是因为从前有两份实现:`naive-theme.ts` 的私有 `derivePrimary`(算前三态,喂 Naive overrides)
14
- * 与 `useTheme.ts` 的 `applyPrimaryVars`(算四态,写 CSS 变量),同样的魔数写了两遍。
15
- * 改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,**而没有任何东西会报错**。
13
+ * 派生只在这一处:`naive-theme.ts`(取前三态,喂 Naive overrides)与 `useTheme.ts` 的 `applyPrimaryVars`
14
+ * (取四态,写 CSS 变量)都调它。两边各算一份的话,改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,
15
+ * **而没有任何东西会报错**。
16
16
  *
17
17
  * `darkContainer` 只在暗色下参与 `light`(浅底要往容器色靠,否则在暗底上白得刺眼);亮色下忽略。
18
18
  * 调用方通常传当前的 `--color-bg-container`。只要前三态的调用方(Naive)不关心 `light`,多算一次 mix 而已。
@@ -1 +1 @@
1
- {"version":3,"file":"mix.js","sources":["../../src/theme/mix.ts"],"sourcesContent":["// 颜色派生规则(DESIGN.md 权威实现)。纯函数,无框架依赖。\n\nfunction clampByte(n: number): number {\n return Math.max(0, Math.min(255, Math.round(n)))\n}\n\nfunction parseHex(hex: string): [number, number, number] {\n let h = hex.replace('#', '').trim()\n if (h.length === 3)\n h = h\n .split('')\n .map(c => c + c)\n .join('')\n const n = Number.parseInt(h, 16)\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map(v => clampByte(v).toString(16).padStart(2, '0')).join('')\n}\n\n/** 在 a、b 之间按 t∈[0,1] 线性插值(sRGB 分量)。t=0→a,t=1→b。 */\nexport function mix(a: string, b: string, t: number): string {\n const [ar, ag, ab] = parseHex(a)\n const [br, bg, bb] = parseHex(b)\n return toHex(ar + (br - ar) * t, ag + (bg - ag) * t, ab + (bb - ab) * t)\n}\n\nexport interface PrimaryRamp {\n primary: string\n hover: string\n pressed: string\n /** 浅底(选中背景 / 标签底)。 */\n light: string\n}\n\n/**\n * accent → 主色四态(DESIGN.md)。暗色先把 accent 提亮一档,再派生 hover/pressed/light。\n *\n * 收在这里是因为从前有两份实现:`naive-theme.ts` 的私有 `derivePrimary`(算前三态,喂 Naive overrides)\n * 与 `useTheme.ts` 的 `applyPrimaryVars`(算四态,写 CSS 变量),同样的魔数写了两遍。\n * 改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,**而没有任何东西会报错**。\n *\n * `darkContainer` 只在暗色下参与 `light`(浅底要往容器色靠,否则在暗底上白得刺眼);亮色下忽略。\n * 调用方通常传当前的 `--color-bg-container`。只要前三态的调用方(Naive)不关心 `light`,多算一次 mix 而已。\n */\nexport function derivePrimary(\n accent: string,\n dark: boolean,\n darkContainer = '#1F2229',\n): PrimaryRamp {\n // 亮色下 primary 就是 accent 本身(不派生),但**要统一转小写**:其余三个都经 `toHex` 出小写,\n // 而 accent 通常是色板里的大写字面量。不归一的话输出的大小写会随主题变化,任何拿 `===` 直接比的\n // 地方就会得到一个**只在亮色下失败**的不一致。CSS 不区分大小写,归一无副作用\n // (已核实:全仓唯一的 accent `===` 比较在 SettingsDrawer 色板选中态,两边都是原始 accent,不经此函数)。\n const primary = (dark ? mix(accent, '#FFFFFF', 0.18) : accent).toLowerCase()\n return {\n primary,\n hover: mix(primary, '#FFFFFF', 0.16),\n pressed: mix(primary, '#000000', 0.18),\n light: dark ? mix(primary, darkContainer, 0.82) : mix(primary, '#FFFFFF', 0.9),\n }\n}\n\n/** accent → rgba(...,alpha),用于发光 / 渐变。 */\nexport function rgba(hex: string, alpha: number): string {\n const [r, g, b] = parseHex(hex)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\n/** 英雄主按钮渐变(仅登录页 / 欢迎横幅 / 头像)。 */\nexport function btnGrad(accent: string): string {\n return `linear-gradient(135deg, ${accent} 0%, ${mix(accent, '#8B5CF6', 0.55)} 55%, ${mix(accent, '#EC4899', 0.62)} 100%)`\n}\n\n/** 英雄按钮发光阴影。 */\nexport function glowSh(accent: string): string {\n return `0 6px 20px ${rgba(accent, 0.42)}`\n}\n"],"names":["clampByte","n","parseHex","hex","h","c","toHex","g","b","v","mix","a","t","ar","ag","ab","br","bg","bb","derivePrimary","accent","dark","darkContainer","primary","rgba","alpha","r","btnGrad","glowSh"],"mappings":"AAEA,SAASA,EAAUC,GAAmB;AACpC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAMA,CAAC,CAAC,CAAC;AACjD;AAEA,SAASC,EAASC,GAAuC;AACvD,MAAIC,IAAID,EAAI,QAAQ,KAAK,EAAE,EAAE,KAAA;AAC7B,EAAIC,EAAE,WAAW,MACfA,IAAIA,EACD,MAAM,EAAE,EACR,IAAI,OAAKC,IAAIA,CAAC,EACd,KAAK,EAAE;AACZ,QAAMJ,IAAI,OAAO,SAASG,GAAG,EAAE;AAC/B,SAAO,CAAEH,KAAK,KAAM,KAAMA,KAAK,IAAK,KAAKA,IAAI,GAAG;AAClD;AAEA,SAASK,EAAM,GAAWC,GAAWC,GAAmB;AACtD,SAAO,MAAM,CAAC,GAAGD,GAAGC,CAAC,EAAE,IAAI,OAAKR,EAAUS,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACrF;AAGO,SAASC,EAAIC,GAAWH,GAAWI,GAAmB;AAC3D,QAAM,CAACC,GAAIC,GAAIC,CAAE,IAAIb,EAASS,CAAC,GACzB,CAACK,GAAIC,GAAIC,CAAE,IAAIhB,EAASM,CAAC;AAC/B,SAAOF,EAAMO,KAAMG,IAAKH,KAAMD,GAAGE,KAAMG,IAAKH,KAAMF,GAAGG,KAAMG,IAAKH,KAAMH,CAAC;AACzE;AAoBO,SAASO,EACdC,GACAC,GACAC,IAAgB,WACH;AAKb,QAAMC,KAAWF,IAAOX,EAAIU,GAAQ,WAAW,IAAI,IAAIA,GAAQ,YAAA;AAC/D,SAAO;AAAA,IACL,SAAAG;AAAA,IACA,OAAOb,EAAIa,GAAS,WAAW,IAAI;AAAA,IACnC,SAASb,EAAIa,GAAS,WAAW,IAAI;AAAA,IACrC,OAAOF,IAAOX,EAAIa,GAASD,GAAe,IAAI,IAAIZ,EAAIa,GAAS,WAAW,GAAG;AAAA,EAAA;AAEjF;AAGO,SAASC,EAAKrB,GAAasB,GAAuB;AACvD,QAAM,CAACC,GAAGnB,GAAGC,CAAC,IAAIN,EAASC,CAAG;AAC9B,SAAO,QAAQuB,CAAC,KAAKnB,CAAC,KAAKC,CAAC,KAAKiB,CAAK;AACxC;AAGO,SAASE,EAAQP,GAAwB;AAC9C,SAAO,2BAA2BA,CAAM,QAAQV,EAAIU,GAAQ,WAAW,IAAI,CAAC,SAASV,EAAIU,GAAQ,WAAW,IAAI,CAAC;AACnH;AAGO,SAASQ,EAAOR,GAAwB;AAC7C,SAAO,cAAcI,EAAKJ,GAAQ,IAAI,CAAC;AACzC;"}
1
+ {"version":3,"file":"mix.js","sources":["../../src/theme/mix.ts"],"sourcesContent":["// 颜色派生规则(DESIGN.md 权威实现)。纯函数,无框架依赖。\n\nfunction clampByte(n: number): number {\n return Math.max(0, Math.min(255, Math.round(n)))\n}\n\nfunction parseHex(hex: string): [number, number, number] {\n let h = hex.replace('#', '').trim()\n if (h.length === 3)\n h = h\n .split('')\n .map(c => c + c)\n .join('')\n const n = Number.parseInt(h, 16)\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map(v => clampByte(v).toString(16).padStart(2, '0')).join('')\n}\n\n/** 在 a、b 之间按 t∈[0,1] 线性插值(sRGB 分量)。t=0→a,t=1→b。 */\nexport function mix(a: string, b: string, t: number): string {\n const [ar, ag, ab] = parseHex(a)\n const [br, bg, bb] = parseHex(b)\n return toHex(ar + (br - ar) * t, ag + (bg - ag) * t, ab + (bb - ab) * t)\n}\n\nexport interface PrimaryRamp {\n primary: string\n hover: string\n pressed: string\n /** 浅底(选中背景 / 标签底)。 */\n light: string\n}\n\n/**\n * accent → 主色四态(DESIGN.md)。暗色先把 accent 提亮一档,再派生 hover/pressed/light。\n *\n * 派生只在这一处:`naive-theme.ts`(取前三态,喂 Naive overrides)与 `useTheme.ts` 的 `applyPrimaryVars`\n * (取四态,写 CSS 变量)都调它。两边各算一份的话,改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,\n * **而没有任何东西会报错**。\n *\n * `darkContainer` 只在暗色下参与 `light`(浅底要往容器色靠,否则在暗底上白得刺眼);亮色下忽略。\n * 调用方通常传当前的 `--color-bg-container`。只要前三态的调用方(Naive)不关心 `light`,多算一次 mix 而已。\n */\nexport function derivePrimary(\n accent: string,\n dark: boolean,\n darkContainer = '#1F2229',\n): PrimaryRamp {\n // 亮色下 primary 就是 accent 本身(不派生),但**要统一转小写**:其余三个都经 `toHex` 出小写,\n // 而 accent 通常是色板里的大写字面量。不归一的话输出的大小写会随主题变化,任何拿 `===` 直接比的\n // 地方就会得到一个**只在亮色下失败**的不一致。CSS 不区分大小写,归一无副作用\n // (已核实:全仓唯一的 accent `===` 比较在 SettingsDrawer 色板选中态,两边都是原始 accent,不经此函数)。\n const primary = (dark ? mix(accent, '#FFFFFF', 0.18) : accent).toLowerCase()\n return {\n primary,\n hover: mix(primary, '#FFFFFF', 0.16),\n pressed: mix(primary, '#000000', 0.18),\n light: dark ? mix(primary, darkContainer, 0.82) : mix(primary, '#FFFFFF', 0.9),\n }\n}\n\n/** accent → rgba(...,alpha),用于发光 / 渐变。 */\nexport function rgba(hex: string, alpha: number): string {\n const [r, g, b] = parseHex(hex)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\n/** 英雄主按钮渐变(仅登录页 / 欢迎横幅 / 头像)。 */\nexport function btnGrad(accent: string): string {\n return `linear-gradient(135deg, ${accent} 0%, ${mix(accent, '#8B5CF6', 0.55)} 55%, ${mix(accent, '#EC4899', 0.62)} 100%)`\n}\n\n/** 英雄按钮发光阴影。 */\nexport function glowSh(accent: string): string {\n return `0 6px 20px ${rgba(accent, 0.42)}`\n}\n"],"names":["clampByte","n","parseHex","hex","h","c","toHex","g","b","v","mix","a","t","ar","ag","ab","br","bg","bb","derivePrimary","accent","dark","darkContainer","primary","rgba","alpha","r","btnGrad","glowSh"],"mappings":"AAEA,SAASA,EAAUC,GAAmB;AACpC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAMA,CAAC,CAAC,CAAC;AACjD;AAEA,SAASC,EAASC,GAAuC;AACvD,MAAIC,IAAID,EAAI,QAAQ,KAAK,EAAE,EAAE,KAAA;AAC7B,EAAIC,EAAE,WAAW,MACfA,IAAIA,EACD,MAAM,EAAE,EACR,IAAI,OAAKC,IAAIA,CAAC,EACd,KAAK,EAAE;AACZ,QAAMJ,IAAI,OAAO,SAASG,GAAG,EAAE;AAC/B,SAAO,CAAEH,KAAK,KAAM,KAAMA,KAAK,IAAK,KAAKA,IAAI,GAAG;AAClD;AAEA,SAASK,EAAM,GAAWC,GAAWC,GAAmB;AACtD,SAAO,MAAM,CAAC,GAAGD,GAAGC,CAAC,EAAE,IAAI,OAAKR,EAAUS,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACrF;AAGO,SAASC,EAAIC,GAAWH,GAAWI,GAAmB;AAC3D,QAAM,CAACC,GAAIC,GAAIC,CAAE,IAAIb,EAASS,CAAC,GACzB,CAACK,GAAIC,GAAIC,CAAE,IAAIhB,EAASM,CAAC;AAC/B,SAAOF,EAAMO,KAAMG,IAAKH,KAAMD,GAAGE,KAAMG,IAAKH,KAAMF,GAAGG,KAAMG,IAAKH,KAAMH,CAAC;AACzE;AAoBO,SAASO,EACdC,GACAC,GACAC,IAAgB,WACH;AAKb,QAAMC,KAAWF,IAAOX,EAAIU,GAAQ,WAAW,IAAI,IAAIA,GAAQ,YAAA;AAC/D,SAAO;AAAA,IACL,SAAAG;AAAA,IACA,OAAOb,EAAIa,GAAS,WAAW,IAAI;AAAA,IACnC,SAASb,EAAIa,GAAS,WAAW,IAAI;AAAA,IACrC,OAAOF,IAAOX,EAAIa,GAASD,GAAe,IAAI,IAAIZ,EAAIa,GAAS,WAAW,GAAG;AAAA,EAAA;AAEjF;AAGO,SAASC,EAAKrB,GAAasB,GAAuB;AACvD,QAAM,CAACC,GAAGnB,GAAGC,CAAC,IAAIN,EAASC,CAAG;AAC9B,SAAO,QAAQuB,CAAC,KAAKnB,CAAC,KAAKC,CAAC,KAAKiB,CAAK;AACxC;AAGO,SAASE,EAAQP,GAAwB;AAC9C,SAAO,2BAA2BA,CAAM,QAAQV,EAAIU,GAAQ,WAAW,IAAI,CAAC,SAASV,EAAIU,GAAQ,WAAW,IAAI,CAAC;AACnH;AAGO,SAASQ,EAAOR,GAAwB;AAC7C,SAAO,cAAcI,EAAKJ,GAAQ,IAAI,CAAC;AACzC;"}
@@ -14,7 +14,7 @@ export interface LoginOutput {
14
14
  * 会话交付模式(可选)。
15
15
  * - `body`:刷新令牌在 JSON 体(默认,前端 localStorage 持久化)
16
16
  * - `cookie`:刷新令牌在 HttpOnly Cookie,access 仅内存
17
- * 旧后端/未 regen 的 schema 可能缺此字段,前端用 refreshToken 空串 + csrfRequired 兜底判定。
17
+ * 缺省时前端用 refreshToken 空串 + csrfRequired 兜底判定(见 stores/user.ts 的 isCookieSession)。
18
18
  */
19
19
  sessionMode?: 'body' | 'cookie' | string | null;
20
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../src/types/api.ts"],"sourcesContent":["// 接口出参领域类型(与后端 DTO 对齐)。API 层用它标注 unwrap<T> 的返回,视图直接消费。\nimport type { AppModule } from './menu'\n\n/** 登录/刷新出参(后端 LoginOutput)。 */\nexport interface LoginOutput {\n accessToken: string\n expiresAt: string\n refreshToken: string\n refreshExpiresAt: string\n userId: number\n account: string\n name: string\n /** 是否需强制改密(管理员建号/重置后首登为 true)。 */\n mustChangePassword: boolean\n /**\n * 会话交付模式(可选)。\n * - `body`:刷新令牌在 JSON 体(默认,前端 localStorage 持久化)\n * - `cookie`:刷新令牌在 HttpOnly Cookie,access 仅内存\n * 旧后端/未 regen 的 schema 可能缺此字段,前端用 refreshToken 空串 + csrfRequired 兜底判定。\n */\n sessionMode?: 'body' | 'cookie' | string | null\n /**\n * 是否要求双提交 CSRF(`X-Smart-CSRF` + `smart_csrf` Cookie)。\n * Cookie 会话为 true;默认模式为 false/缺省。\n */\n csrfRequired?: boolean | null\n /** 是否超管;前端据此在 profile 接口故障时仍能正确 fail-open v-auth。 */\n isSuperAdmin?: boolean\n}\n\n/** 我的应用列表(后端 MyModulesOutput)。 */\nexport interface MyModulesOutput {\n modules: AppModule[]\n defaultModuleId?: number | null\n}\n\n/** 个人资料(后端 UserProfile)。 */\nexport interface UserProfile {\n id: number\n account: string\n name: string\n orgId?: number | null\n positionId?: number | null\n /** 机构名称(未分配/已删则 null) */\n orgName?: string | null\n /** 职位名称(未分配/已删则 null) */\n positionName?: string | null\n nickname?: string | null\n phone?: string | null\n email?: string | null\n /** 性别:字典 gender 的项 Value(\"1\"男/\"2\"女/\"0\"未知) */\n gender?: string | null\n /** 头像(文件签名直链 ViewUrl,直接进 img) */\n avatar?: string | null\n isSuperAdmin: boolean\n}\n\n/** 我的会话项(后端 MySessionItem;个人视角,isCurrent 标记本次请求所用会话)。 */\nexport interface MySessionItem {\n sessionId: string\n ip?: string | null\n userAgent?: string | null\n loginTime: string\n expiresAt: string\n isCurrent: boolean\n}\n\n/** 后端统一分页结果 PagedList<T>。 */\nexport interface PagedList<T> {\n current: number\n size: number\n total: number\n pages: number\n items: T[]\n}\n\n/** 用户列表项(后端 UserItem;刻意不含密码)。 */\nexport interface UserItem {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n orgName?: string | null\n positionName?: string | null\n directorName?: string | null\n enabled: boolean\n isSuperAdmin: boolean\n /** 管理员显式强制 TOTP(只能加严)。 */\n forceTotp?: boolean\n /** 是否已绑定 TOTP(只读)。 */\n totpEnabled?: boolean\n createTime: string\n}\n\n/** 模块/应用管理行(后端 SysModule;列表全字段)。 */\nexport interface ModuleRow {\n id: number\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n /** 后端路由匹配前缀(如 sys/biz):菜单配按钮时权限路由下拉据此按应用软过滤;留空=不过滤。 */\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 工作台首页统计(后端 DashboardSummaryOutput)。趋势三条数组等长(近 7 日,含今天,无登录的日子为 0)。 */\nexport interface DashboardSummary {\n roles: number\n users: number\n perms: number\n onlineSessions: number\n trendDays: string[]\n trendLogins: number[]\n trendActiveUsers: number[]\n}\n\n/** 字典项消费投影(后端 SysDictItem;sort 归一为 number,甩掉 int64 序列化的 number|string 噪音)。 */\nexport interface DictItem {\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 模块新增/编辑入参(后端 ModuleInput)。 */\nexport interface ModuleInput {\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 系统配置行(后端 SysConfig;列表返回全字段,int64 收敛为 number)。 */\nexport interface SysConfig {\n id: number\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n createTime?: string\n}\n\n/** 配置新增/编辑入参(后端 ConfigInput;configKey 创建后不可改)。 */\nexport interface ConfigInput {\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n}\n\n/** 字典类型行(后端 SysDictType;Code 创建后不可改)。int64 收敛为 number。 */\nexport interface SysDictType {\n id: number\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 字典项行(后端 SysDictItem;管理端分页含停用项,带 id——区别于下拉投影 DictItem)。int64 收敛为 number。 */\nexport interface SysDictItem {\n id: number\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 字典类型新增/编辑入参(后端 DictTypeInput;code 创建后不可改,更新时服务端忽略)。 */\nexport interface DictTypeInput {\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 字典项新增/编辑入参(后端 DictItemInput;dictTypeCode = 当前类型,表单隐藏)。 */\nexport interface DictItemInput {\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 文件记录行(后端 SysFile;列表返回,int64 收敛为 number)。 */\nexport interface SysFile {\n id: number\n originalName: string\n storagePath: string\n extension: string\n contentType?: string | null\n sizeBytes: number\n fileHash?: string | null\n createTime?: string\n}\n\n/** 上传出参(后端 FileUploadOutput)。 */\nexport interface FileUploadOutput {\n id: number\n originalName: string\n /** 存储层相对路径。**别当 URL 用**:后端默认不静态托管上传目录,当 src 必然坏链。要展示图片用 viewUrl。 */\n storagePath: string\n sizeBytes: number\n fileHash?: string | null\n /** 签名直链(匿名可取、不可伪造),可直接塞进 `<img src>`;后端签发,前端不自己拼。 */\n viewUrl?: string | null\n}\n\n/** 分片上传初始化出参(后端 ChunkInitOutput)。 */\nexport interface ChunkInitOutput {\n /** 秒传命中(同内容哈希已存在,无需再传)。 */\n uploaded: boolean\n /** 秒传命中时的既有文件。 */\n file?: FileUploadOutput | null\n /** 上传会话 Id(= 文件哈希);非秒传时返回。 */\n uploadId?: string | null\n /** 服务端已收到的分片下标(断点续传:跳过已传)。 */\n receivedIndexes: number[]\n}\n\n/** 在线会话行(后端 OnlineSessionItem;只读 + 强退按 sessionId)。int64 收敛为 number。 */\nexport interface OnlineSessionItem {\n sessionId: string\n userId: number\n account: string\n ip?: string | null\n userAgent?: string | null\n loginTime?: string\n expiresAt?: string\n}\n\n/** 登录日志行(后端 SysLoginLog;只读,int64 收敛为 number)。 */\nexport interface SysLoginLog {\n id: number\n account: string\n success: boolean\n resultCode: number\n userId?: number | null\n name?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 操作日志行(后端 SysOpLog;只读,分页项已含全字段,详情抽屉直接用行数据)。 */\nexport interface SysOpLog {\n id: number\n title: string\n httpMethod: string\n path: string\n paramJson?: string | null\n resultCode: number\n success: boolean\n exceptionMessage?: string | null\n elapsedMs: number\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 磁盘分区容量(后端 DiskInfo)。 */\nexport interface DiskInfo {\n name: string\n totalBytes: number\n freeBytes: number\n}\n\n/** 服务器运行快照(后端 ServerInfoOutput;进程/主机基础指标)。 */\nexport interface ServerInfoOutput {\n machineName: string\n osDescription: string\n frameworkDescription: string\n processArchitecture: string\n processorCount: number\n processUptimeSeconds: number\n processCpuPercent: number\n processWorkingSetBytes: number\n gcHeapBytes: number\n totalAvailableMemoryBytes: number\n threadCount: number\n disks: DiskInfo[]\n}\n\n/** 异常日志行(后端 SysExceptionLog;未捕获异常留痕,只读,分页项已含全字段)。 */\nexport interface SysExceptionLog {\n id: number\n httpMethod: string\n path: string\n traceId?: string | null\n exceptionType: string\n message?: string | null\n stackTrace?: string | null\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 机构行(后端 SysOrg;平铺,前端 buildTree)。int64 收敛为 number。 */\nexport interface SysOrg {\n id: number\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 机构新增/编辑入参(后端 OrgInput;parentId 0=根,code 编辑禁用)。 */\nexport interface OrgInput {\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n}\n\n/** 职位行(后端 SysPosition)。int64 收敛为 number。 */\nexport interface SysPosition {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 职位新增/编辑入参(后端 PositionInput;增改同一份字段,code 编辑禁用)。 */\nexport interface PositionInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n}\n\n/** 角色行(后端 SysRole)。int64 收敛为 number。 */\nexport interface SysRole {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n createTime?: string\n}\n\n/** 角色新增/编辑入参(后端 RoleInput;增改同一份字段,code 编辑禁用)。 */\nexport interface RoleInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n}\n\n/** 数据范围类型(后端 DataScopeType;存库为 int,枚举值须与后端一致)。 */\nexport enum DataScopeType {\n All = 1,\n Org = 2,\n OrgAndChildren = 3,\n Self = 4,\n Custom = 5,\n}\n\n/** 角色数据范围配置(后端 SysRoleDataScope;数据范围抽屉回显)。customOrgIds 逗号分隔。 */\nexport interface SysRoleDataScope {\n id: number\n roleId: number\n scopeType: DataScopeType\n customOrgIds: string\n}\n\n/** 新增用户入参(后端 AddUserInput;account 建后不可改,password 留空=系统生成随机强口令)。 */\nexport interface AddUserInput {\n account: string\n password?: string | null\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n /** 建号即强制 TOTP。 */\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 新增用户出参(后端 AddUserOutput):新 Id + 实际生效的初始口令明文——留空口令时是随机生成的,不展示给管理员就没人知道。 */\nexport interface AddUserOutput {\n id: number\n initialPassword: string\n}\n\n/** 一条可授权路由(后端 PermissionRouteItem);喂菜单表单权限码下拉,code 即写进 SysMenu.Permission 的值。 */\nexport interface PermissionRouteItem {\n code: string\n method: string\n path: string\n}\n\n/** 更新用户入参(后端 UpdateUserInput;无 account/password。roleIds 由 detail 原样带回避免清空)。 */\nexport interface UpdateUserInput {\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 用户详情(后端 UserDetail;列表字段 + roleIds,编辑回显用)。 */\nexport interface UserDetail {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n isSuperAdmin: boolean\n forceTotp?: boolean\n totpEnabled?: boolean\n roleIds: number[]\n createTime?: string\n}\n\n/** 通知类型(后端 NoticeType;存库 int,枚举值须与后端一致)。 */\nexport enum NoticeType {\n Notice = 1,\n Announcement = 2,\n Message = 3,\n}\n\n/** 接收范围(后端 ReceiverType;All=0 对全体广播,Role/User 定向)。 */\nexport enum ReceiverType {\n All = 0,\n Role = 1,\n User = 2,\n}\n\n/**\n * 通知动作(后端 NoticeAction):前端渲染成正文下的按钮。url 以 /api/ 开头是接口调用(按 method 发请求),\n * 其它单个 / 开头的站内路径是页面跳转;协议相对 URL(//host、/\\host)发布时即被拒绝。\n * label 含 `.` 视为 i18n key。comment=true 先弹意见框,把 { comment } 作为请求体带上。\n */\nexport interface NoticeAction {\n label: string\n method: 'GET' | 'POST'\n url: string\n style?: 'primary' | 'default' | 'error' | null\n confirm?: boolean\n comment?: boolean\n}\n\n/** 通知行(后端 SysNotice;管理端列表全字段,int64 收敛为 number)。 */\nexport interface SysNotice {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n createTime?: string\n /** 动作列表原文(JSON 数组);管理端只展示条数 */\n actionsJson?: string | null\n}\n\n/** 我的通知项(后端 NoticeMineItem;含当前用户已读标记)。 */\nexport interface NoticeMineItem {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n publishTime: string\n isRead: boolean\n actions?: NoticeAction[] | null\n}\n\n/** 发布通知入参(后端 NoticePublishInput)。 */\nexport interface NoticePublishInput {\n title: string\n content?: string | null\n type: NoticeType\n /** 接收范围;缺省 All 广播全体。 */\n receiverType: ReceiverType\n /** 接收目标 Id(角色 Id 或用户 Id,取决于 receiverType);All 时忽略。 */\n receiverIds?: number[]\n /** 动作列表(可选,最多 5 条) */\n actions?: NoticeAction[] | null\n}\n\n// ── 导入 / 导出(与后端 Core DTO 对齐) ──\n\n/** 导入列声明。 */\nexport interface ImportColumn {\n key: string\n title: string\n required?: boolean\n dictTypeCode?: string | null\n hint?: string | null\n width?: number\n}\n\n/** 导出列声明(前端选列弹窗用;DefaultSelected 决定默认勾选)。 */\nexport interface ExportColumnDef {\n key: string\n title: string\n defaultSelected?: boolean\n}\n\n/** 单元格级错误:只带码,文案由前端 translateError(code) 渲染。 */\nexport interface CellError {\n columnKey: string\n code: number\n args?: Record<string, unknown> | null\n}\n\n/** 一行导入数据;单元格一律字符串。 */\nexport interface ImportRow {\n index: number\n cells: Record<string, string | null | undefined>\n errors: CellError[]\n}\n\n/** 预览 / 重验结果。 */\nexport interface ImportPreview {\n headers: string[]\n /** 表头文本 → 列 Key */\n mapping: Record<string, string>\n columns: ImportColumn[]\n rows: ImportRow[]\n total: number\n errorRows: number\n columnErrors: CellError[]\n}\n\n/** 重复处理策略(与后端 DuplicateStrategy 一致)。 */\nexport enum DuplicateStrategy {\n Skip = 0,\n Overwrite = 1,\n Error = 2,\n}\n\n/** 提交结果。 */\nexport interface ImportCommitResult {\n total: number\n inserted: number\n updated: number\n skipped: number\n failed: number\n failures: ImportRow[]\n}\n\n// ── 定时任务(与后端 SysJob/SysJobLog/JobInput 对齐) ──\n\n/** 载荷类型(后端 JobHandlerKind;存库 int)。 */\nexport enum JobHandlerKind {\n Compiled = 1,\n Http = 2,\n Sql = 3,\n}\n\n/** 触发类型(后端 JobTriggerKind)。 */\nexport enum JobTriggerKind {\n Cron = 1,\n Interval = 2,\n OneShot = 3,\n}\n\n/** 错过策略(后端 JobMisfireStrategy)。 */\nexport enum JobMisfireStrategy {\n Skip = 1,\n FireOnceNow = 2,\n}\n\n/** 并发模式(后端 JobConcurrencyMode;SerialSkip=上次未结束则跳过本次)。 */\nexport enum JobConcurrencyMode {\n SerialSkip = 1,\n Parallel = 2,\n}\n\n/** 任务状态(后端 JobStatus;无 Running 态——\"正在运行\"由未闭合执行记录推导)。 */\nexport enum JobStatus {\n Ready = 1,\n Paused = 2,\n Completed = 3,\n Panic = 4,\n}\n\n/** 单次执行结果(后端 JobRunStatus)。 */\nexport enum JobRunStatus {\n Running = 1,\n Success = 2,\n Failed = 3,\n Timeout = 4,\n Cancelled = 5,\n Skipped = 6,\n}\n\n/** 触发来源(后端 JobFireMode)。 */\nexport enum JobFireMode {\n Schedule = 1,\n Manual = 2,\n Misfire = 3,\n MissedSkipped = 4,\n}\n\n/** 任务行(后端 SysJob;page 返回整行,编辑表单直接用行数据回填)。 */\nexport interface SysJob {\n id: number\n code: string\n name: string\n handlerKind: JobHandlerKind\n handlerName: string\n /** 属性包 JSON(Dictionary<string,string?> 字符串化;HTTP 的 headers 值读取时已被掩码)。 */\n propsJson?: string | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n status: JobStatus\n nextRunTime?: string | null\n lastRunTime?: string | null\n numberOfRuns: number\n numberOfErrors: number\n consecutiveErrors: number\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n isSystem: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 任务新增/编辑入参(后端 JobInput;code 仅新增时生效,更新被服务层忽略)。 */\nexport interface JobInput {\n code: string\n name: string\n handlerKind: JobHandlerKind\n /** 编译类填处理器标识;HTTP/SQL 由服务端固定填内置处理器名,传空即可。 */\n handlerName: string\n /** 属性包对象(非字符串!后端存成 propsJson;HTTP 的 headers 子键值对序列化成 JSON 字符串放 properties.headers)。 */\n properties?: Record<string, string> | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n /** ≥5(<5 后端拒 47004)。 */\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n remark?: string | null\n}\n\n/** 执行记录行(后端 SysJobLog;endTime 为空 = 运行中,同 fireInstanceId 聚合重试)。 */\nexport interface SysJobLog {\n id: number\n jobId: number\n jobName: string\n fireInstanceId: number\n retryIndex: number\n fireMode: JobFireMode\n scheduledTime: string\n startTime: string\n endTime?: string | null\n runStatus: JobRunStatus\n elapsedMs: number\n nodeName: string\n killRequested: boolean\n messageText?: string | null\n errorText?: string | null\n createTime?: string\n}\n\n/** cron 预览结果(后端 CronPreviewOutput)。 */\nexport interface CronPreviewOutput {\n normalized: string\n occurrences: string[]\n /** 秒段等效每秒执行的告警(仅提示,不拦截)。 */\n everySecondWarning: boolean\n}\n\n/** 处理器清单(后端 JobHandlersOutput)。 */\nexport interface JobHandlersOutput {\n /** 已注册的编译类处理器名(IAdminJob.Name)。 */\n handlers: string[]\n /** SQL 载荷总闸(SmartAdmin:Jobs:Sql:Enabled);false 时前端禁选 SQL 并提示。 */\n sqlEnabled: boolean\n}\n\n/** 成败趋势的一天。 */\nexport interface JobTrendPoint {\n date: string\n success: number\n failed: number\n}\n\n/** 即将执行的一项。 */\nexport interface JobUpcomingItem {\n jobId: number\n name: string\n nextRunTime: string\n}\n\n/** 集群节点一行(角色由与锁行比对得出)。 */\nexport interface JobNodeItem {\n nodeName: string\n hostName: string\n isLeader: boolean\n lastHeartbeat: string\n workerId: number\n pid: number\n}\n\n/** 任务监控仪表盘(后端 JobDashboardOutput)。 */\nexport interface JobDashboard {\n todaySuccess: number\n todayFailed: number\n running: number\n totalJobs: number\n /** 按状态的任务数(键 = Ready/Paused/Completed/Panic)。 */\n statusCounts: Record<string, number>\n trend: JobTrendPoint[]\n upcoming: JobUpcomingItem[]\n nodes: JobNodeItem[]\n}\n"],"names":["DataScopeType","NoticeType","ReceiverType","DuplicateStrategy","JobHandlerKind","JobTriggerKind","JobMisfireStrategy","JobConcurrencyMode","JobStatus","JobRunStatus","JobFireMode"],"mappings":"AAqYO,IAAKA,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,iBAAiB,CAAA,IAAjB,kBACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UALUA,IAAAA,KAAA,CAAA,CAAA,GAsFAC,sBAAAA,OACVA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,eAAe,CAAA,IAAf,gBACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QAHUA,IAAAA,KAAA,CAAA,CAAA,GAqGAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAHUA,IAAAA,KAAA,CAAA,CAAA,GAmBAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,cAAc,CAAA,IAAd,eAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,aAAa,CAAA,IAAb,cACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAJUA,IAAAA,KAAA,CAAA,CAAA,GAQAC,sBAAAA,OACVA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WANUA,IAAAA,KAAA,CAAA,CAAA,GAUAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,gBAAgB,CAAA,IAAhB,iBAJUA,IAAAA,KAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"api.js","sources":["../../src/types/api.ts"],"sourcesContent":["// 接口出参领域类型(与后端 DTO 对齐)。API 层用它标注 unwrap<T> 的返回,视图直接消费。\nimport type { AppModule } from './menu'\n\n/** 登录/刷新出参(后端 LoginOutput)。 */\nexport interface LoginOutput {\n accessToken: string\n expiresAt: string\n refreshToken: string\n refreshExpiresAt: string\n userId: number\n account: string\n name: string\n /** 是否需强制改密(管理员建号/重置后首登为 true)。 */\n mustChangePassword: boolean\n /**\n * 会话交付模式(可选)。\n * - `body`:刷新令牌在 JSON 体(默认,前端 localStorage 持久化)\n * - `cookie`:刷新令牌在 HttpOnly Cookie,access 仅内存\n * 缺省时前端用 refreshToken 空串 + csrfRequired 兜底判定(见 stores/user.ts 的 isCookieSession)。\n */\n sessionMode?: 'body' | 'cookie' | string | null\n /**\n * 是否要求双提交 CSRF(`X-Smart-CSRF` + `smart_csrf` Cookie)。\n * Cookie 会话为 true;默认模式为 false/缺省。\n */\n csrfRequired?: boolean | null\n /** 是否超管;前端据此在 profile 接口故障时仍能正确 fail-open v-auth。 */\n isSuperAdmin?: boolean\n}\n\n/** 我的应用列表(后端 MyModulesOutput)。 */\nexport interface MyModulesOutput {\n modules: AppModule[]\n defaultModuleId?: number | null\n}\n\n/** 个人资料(后端 UserProfile)。 */\nexport interface UserProfile {\n id: number\n account: string\n name: string\n orgId?: number | null\n positionId?: number | null\n /** 机构名称(未分配/已删则 null) */\n orgName?: string | null\n /** 职位名称(未分配/已删则 null) */\n positionName?: string | null\n nickname?: string | null\n phone?: string | null\n email?: string | null\n /** 性别:字典 gender 的项 Value(\"1\"男/\"2\"女/\"0\"未知) */\n gender?: string | null\n /** 头像(文件签名直链 ViewUrl,直接进 img) */\n avatar?: string | null\n isSuperAdmin: boolean\n}\n\n/** 我的会话项(后端 MySessionItem;个人视角,isCurrent 标记本次请求所用会话)。 */\nexport interface MySessionItem {\n sessionId: string\n ip?: string | null\n userAgent?: string | null\n loginTime: string\n expiresAt: string\n isCurrent: boolean\n}\n\n/** 后端统一分页结果 PagedList<T>。 */\nexport interface PagedList<T> {\n current: number\n size: number\n total: number\n pages: number\n items: T[]\n}\n\n/** 用户列表项(后端 UserItem;刻意不含密码)。 */\nexport interface UserItem {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n orgName?: string | null\n positionName?: string | null\n directorName?: string | null\n enabled: boolean\n isSuperAdmin: boolean\n /** 管理员显式强制 TOTP(只能加严)。 */\n forceTotp?: boolean\n /** 是否已绑定 TOTP(只读)。 */\n totpEnabled?: boolean\n createTime: string\n}\n\n/** 模块/应用管理行(后端 SysModule;列表全字段)。 */\nexport interface ModuleRow {\n id: number\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n /** 后端路由匹配前缀(如 sys/biz):菜单配按钮时权限路由下拉据此按应用软过滤;留空=不过滤。 */\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 工作台首页统计(后端 DashboardSummaryOutput)。趋势三条数组等长(近 7 日,含今天,无登录的日子为 0)。 */\nexport interface DashboardSummary {\n roles: number\n users: number\n perms: number\n onlineSessions: number\n trendDays: string[]\n trendLogins: number[]\n trendActiveUsers: number[]\n}\n\n/** 字典项消费投影(后端 SysDictItem;sort 归一为 number,甩掉 int64 序列化的 number|string 噪音)。 */\nexport interface DictItem {\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 模块新增/编辑入参(后端 ModuleInput)。 */\nexport interface ModuleInput {\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 系统配置行(后端 SysConfig;列表返回全字段,int64 收敛为 number)。 */\nexport interface SysConfig {\n id: number\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n createTime?: string\n}\n\n/** 配置新增/编辑入参(后端 ConfigInput;configKey 创建后不可改)。 */\nexport interface ConfigInput {\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n}\n\n/** 字典类型行(后端 SysDictType;Code 创建后不可改)。int64 收敛为 number。 */\nexport interface SysDictType {\n id: number\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 字典项行(后端 SysDictItem;管理端分页含停用项,带 id——区别于下拉投影 DictItem)。int64 收敛为 number。 */\nexport interface SysDictItem {\n id: number\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 字典类型新增/编辑入参(后端 DictTypeInput;code 创建后不可改,更新时服务端忽略)。 */\nexport interface DictTypeInput {\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 字典项新增/编辑入参(后端 DictItemInput;dictTypeCode = 当前类型,表单隐藏)。 */\nexport interface DictItemInput {\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 文件记录行(后端 SysFile;列表返回,int64 收敛为 number)。 */\nexport interface SysFile {\n id: number\n originalName: string\n storagePath: string\n extension: string\n contentType?: string | null\n sizeBytes: number\n fileHash?: string | null\n createTime?: string\n}\n\n/** 上传出参(后端 FileUploadOutput)。 */\nexport interface FileUploadOutput {\n id: number\n originalName: string\n /** 存储层相对路径。**别当 URL 用**:后端默认不静态托管上传目录,当 src 必然坏链。要展示图片用 viewUrl。 */\n storagePath: string\n sizeBytes: number\n fileHash?: string | null\n /** 签名直链(匿名可取、不可伪造),可直接塞进 `<img src>`;后端签发,前端不自己拼。 */\n viewUrl?: string | null\n}\n\n/** 分片上传初始化出参(后端 ChunkInitOutput)。 */\nexport interface ChunkInitOutput {\n /** 秒传命中(同内容哈希已存在,无需再传)。 */\n uploaded: boolean\n /** 秒传命中时的既有文件。 */\n file?: FileUploadOutput | null\n /** 上传会话 Id(= 文件哈希);非秒传时返回。 */\n uploadId?: string | null\n /** 服务端已收到的分片下标(断点续传:跳过已传)。 */\n receivedIndexes: number[]\n}\n\n/** 在线会话行(后端 OnlineSessionItem;只读 + 强退按 sessionId)。int64 收敛为 number。 */\nexport interface OnlineSessionItem {\n sessionId: string\n userId: number\n account: string\n ip?: string | null\n userAgent?: string | null\n loginTime?: string\n expiresAt?: string\n}\n\n/** 登录日志行(后端 SysLoginLog;只读,int64 收敛为 number)。 */\nexport interface SysLoginLog {\n id: number\n account: string\n success: boolean\n resultCode: number\n userId?: number | null\n name?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 操作日志行(后端 SysOpLog;只读,分页项已含全字段,详情抽屉直接用行数据)。 */\nexport interface SysOpLog {\n id: number\n title: string\n httpMethod: string\n path: string\n paramJson?: string | null\n resultCode: number\n success: boolean\n exceptionMessage?: string | null\n elapsedMs: number\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 磁盘分区容量(后端 DiskInfo)。 */\nexport interface DiskInfo {\n name: string\n totalBytes: number\n freeBytes: number\n}\n\n/** 服务器运行快照(后端 ServerInfoOutput;进程/主机基础指标)。 */\nexport interface ServerInfoOutput {\n machineName: string\n osDescription: string\n frameworkDescription: string\n processArchitecture: string\n processorCount: number\n processUptimeSeconds: number\n processCpuPercent: number\n processWorkingSetBytes: number\n gcHeapBytes: number\n totalAvailableMemoryBytes: number\n threadCount: number\n disks: DiskInfo[]\n}\n\n/** 异常日志行(后端 SysExceptionLog;未捕获异常留痕,只读,分页项已含全字段)。 */\nexport interface SysExceptionLog {\n id: number\n httpMethod: string\n path: string\n traceId?: string | null\n exceptionType: string\n message?: string | null\n stackTrace?: string | null\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 机构行(后端 SysOrg;平铺,前端 buildTree)。int64 收敛为 number。 */\nexport interface SysOrg {\n id: number\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 机构新增/编辑入参(后端 OrgInput;parentId 0=根,code 编辑禁用)。 */\nexport interface OrgInput {\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n}\n\n/** 职位行(后端 SysPosition)。int64 收敛为 number。 */\nexport interface SysPosition {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 职位新增/编辑入参(后端 PositionInput;增改同一份字段,code 编辑禁用)。 */\nexport interface PositionInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n}\n\n/** 角色行(后端 SysRole)。int64 收敛为 number。 */\nexport interface SysRole {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n createTime?: string\n}\n\n/** 角色新增/编辑入参(后端 RoleInput;增改同一份字段,code 编辑禁用)。 */\nexport interface RoleInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n}\n\n/** 数据范围类型(后端 DataScopeType;存库为 int,枚举值须与后端一致)。 */\nexport enum DataScopeType {\n All = 1,\n Org = 2,\n OrgAndChildren = 3,\n Self = 4,\n Custom = 5,\n}\n\n/** 角色数据范围配置(后端 SysRoleDataScope;数据范围抽屉回显)。customOrgIds 逗号分隔。 */\nexport interface SysRoleDataScope {\n id: number\n roleId: number\n scopeType: DataScopeType\n customOrgIds: string\n}\n\n/** 新增用户入参(后端 AddUserInput;account 建后不可改,password 留空=系统生成随机强口令)。 */\nexport interface AddUserInput {\n account: string\n password?: string | null\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n /** 建号即强制 TOTP。 */\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 新增用户出参(后端 AddUserOutput):新 Id + 实际生效的初始口令明文——留空口令时是随机生成的,不展示给管理员就没人知道。 */\nexport interface AddUserOutput {\n id: number\n initialPassword: string\n}\n\n/** 一条可授权路由(后端 PermissionRouteItem);喂菜单表单权限码下拉,code 即写进 SysMenu.Permission 的值。 */\nexport interface PermissionRouteItem {\n code: string\n method: string\n path: string\n}\n\n/** 更新用户入参(后端 UpdateUserInput;无 account/password。roleIds 由 detail 原样带回避免清空)。 */\nexport interface UpdateUserInput {\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 用户详情(后端 UserDetail;列表字段 + roleIds,编辑回显用)。 */\nexport interface UserDetail {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n isSuperAdmin: boolean\n forceTotp?: boolean\n totpEnabled?: boolean\n roleIds: number[]\n createTime?: string\n}\n\n/** 通知类型(后端 NoticeType;存库 int,枚举值须与后端一致)。 */\nexport enum NoticeType {\n Notice = 1,\n Announcement = 2,\n Message = 3,\n}\n\n/** 接收范围(后端 ReceiverType;All=0 对全体广播,Role/User 定向)。 */\nexport enum ReceiverType {\n All = 0,\n Role = 1,\n User = 2,\n}\n\n/**\n * 通知动作(后端 NoticeAction):前端渲染成正文下的按钮。url 以 /api/ 开头是接口调用(按 method 发请求),\n * 其它单个 / 开头的站内路径是页面跳转;协议相对 URL(//host、/\\host)发布时即被拒绝。\n * label 含 `.` 视为 i18n key。comment=true 先弹意见框,把 { comment } 作为请求体带上。\n */\nexport interface NoticeAction {\n label: string\n method: 'GET' | 'POST'\n url: string\n style?: 'primary' | 'default' | 'error' | null\n confirm?: boolean\n comment?: boolean\n}\n\n/** 通知行(后端 SysNotice;管理端列表全字段,int64 收敛为 number)。 */\nexport interface SysNotice {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n createTime?: string\n /** 动作列表原文(JSON 数组);管理端只展示条数 */\n actionsJson?: string | null\n}\n\n/** 我的通知项(后端 NoticeMineItem;含当前用户已读标记)。 */\nexport interface NoticeMineItem {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n publishTime: string\n isRead: boolean\n actions?: NoticeAction[] | null\n}\n\n/** 发布通知入参(后端 NoticePublishInput)。 */\nexport interface NoticePublishInput {\n title: string\n content?: string | null\n type: NoticeType\n /** 接收范围;缺省 All 广播全体。 */\n receiverType: ReceiverType\n /** 接收目标 Id(角色 Id 或用户 Id,取决于 receiverType);All 时忽略。 */\n receiverIds?: number[]\n /** 动作列表(可选,最多 5 条) */\n actions?: NoticeAction[] | null\n}\n\n// ── 导入 / 导出(与后端 Core DTO 对齐) ──\n\n/** 导入列声明。 */\nexport interface ImportColumn {\n key: string\n title: string\n required?: boolean\n dictTypeCode?: string | null\n hint?: string | null\n width?: number\n}\n\n/** 导出列声明(前端选列弹窗用;DefaultSelected 决定默认勾选)。 */\nexport interface ExportColumnDef {\n key: string\n title: string\n defaultSelected?: boolean\n}\n\n/** 单元格级错误:只带码,文案由前端 translateError(code) 渲染。 */\nexport interface CellError {\n columnKey: string\n code: number\n args?: Record<string, unknown> | null\n}\n\n/** 一行导入数据;单元格一律字符串。 */\nexport interface ImportRow {\n index: number\n cells: Record<string, string | null | undefined>\n errors: CellError[]\n}\n\n/** 预览 / 重验结果。 */\nexport interface ImportPreview {\n headers: string[]\n /** 表头文本 → 列 Key */\n mapping: Record<string, string>\n columns: ImportColumn[]\n rows: ImportRow[]\n total: number\n errorRows: number\n columnErrors: CellError[]\n}\n\n/** 重复处理策略(与后端 DuplicateStrategy 一致)。 */\nexport enum DuplicateStrategy {\n Skip = 0,\n Overwrite = 1,\n Error = 2,\n}\n\n/** 提交结果。 */\nexport interface ImportCommitResult {\n total: number\n inserted: number\n updated: number\n skipped: number\n failed: number\n failures: ImportRow[]\n}\n\n// ── 定时任务(与后端 SysJob/SysJobLog/JobInput 对齐) ──\n\n/** 载荷类型(后端 JobHandlerKind;存库 int)。 */\nexport enum JobHandlerKind {\n Compiled = 1,\n Http = 2,\n Sql = 3,\n}\n\n/** 触发类型(后端 JobTriggerKind)。 */\nexport enum JobTriggerKind {\n Cron = 1,\n Interval = 2,\n OneShot = 3,\n}\n\n/** 错过策略(后端 JobMisfireStrategy)。 */\nexport enum JobMisfireStrategy {\n Skip = 1,\n FireOnceNow = 2,\n}\n\n/** 并发模式(后端 JobConcurrencyMode;SerialSkip=上次未结束则跳过本次)。 */\nexport enum JobConcurrencyMode {\n SerialSkip = 1,\n Parallel = 2,\n}\n\n/** 任务状态(后端 JobStatus;无 Running 态——\"正在运行\"由未闭合执行记录推导)。 */\nexport enum JobStatus {\n Ready = 1,\n Paused = 2,\n Completed = 3,\n Panic = 4,\n}\n\n/** 单次执行结果(后端 JobRunStatus)。 */\nexport enum JobRunStatus {\n Running = 1,\n Success = 2,\n Failed = 3,\n Timeout = 4,\n Cancelled = 5,\n Skipped = 6,\n}\n\n/** 触发来源(后端 JobFireMode)。 */\nexport enum JobFireMode {\n Schedule = 1,\n Manual = 2,\n Misfire = 3,\n MissedSkipped = 4,\n}\n\n/** 任务行(后端 SysJob;page 返回整行,编辑表单直接用行数据回填)。 */\nexport interface SysJob {\n id: number\n code: string\n name: string\n handlerKind: JobHandlerKind\n handlerName: string\n /** 属性包 JSON(Dictionary<string,string?> 字符串化;HTTP 的 headers 值读取时已被掩码)。 */\n propsJson?: string | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n status: JobStatus\n nextRunTime?: string | null\n lastRunTime?: string | null\n numberOfRuns: number\n numberOfErrors: number\n consecutiveErrors: number\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n isSystem: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 任务新增/编辑入参(后端 JobInput;code 仅新增时生效,更新被服务层忽略)。 */\nexport interface JobInput {\n code: string\n name: string\n handlerKind: JobHandlerKind\n /** 编译类填处理器标识;HTTP/SQL 由服务端固定填内置处理器名,传空即可。 */\n handlerName: string\n /** 属性包对象(非字符串!后端存成 propsJson;HTTP 的 headers 子键值对序列化成 JSON 字符串放 properties.headers)。 */\n properties?: Record<string, string> | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n /** ≥5(<5 后端拒 47004)。 */\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n remark?: string | null\n}\n\n/** 执行记录行(后端 SysJobLog;endTime 为空 = 运行中,同 fireInstanceId 聚合重试)。 */\nexport interface SysJobLog {\n id: number\n jobId: number\n jobName: string\n fireInstanceId: number\n retryIndex: number\n fireMode: JobFireMode\n scheduledTime: string\n startTime: string\n endTime?: string | null\n runStatus: JobRunStatus\n elapsedMs: number\n nodeName: string\n killRequested: boolean\n messageText?: string | null\n errorText?: string | null\n createTime?: string\n}\n\n/** cron 预览结果(后端 CronPreviewOutput)。 */\nexport interface CronPreviewOutput {\n normalized: string\n occurrences: string[]\n /** 秒段等效每秒执行的告警(仅提示,不拦截)。 */\n everySecondWarning: boolean\n}\n\n/** 处理器清单(后端 JobHandlersOutput)。 */\nexport interface JobHandlersOutput {\n /** 已注册的编译类处理器名(IAdminJob.Name)。 */\n handlers: string[]\n /** SQL 载荷总闸(SmartAdmin:Jobs:Sql:Enabled);false 时前端禁选 SQL 并提示。 */\n sqlEnabled: boolean\n}\n\n/** 成败趋势的一天。 */\nexport interface JobTrendPoint {\n date: string\n success: number\n failed: number\n}\n\n/** 即将执行的一项。 */\nexport interface JobUpcomingItem {\n jobId: number\n name: string\n nextRunTime: string\n}\n\n/** 集群节点一行(角色由与锁行比对得出)。 */\nexport interface JobNodeItem {\n nodeName: string\n hostName: string\n isLeader: boolean\n lastHeartbeat: string\n workerId: number\n pid: number\n}\n\n/** 任务监控仪表盘(后端 JobDashboardOutput)。 */\nexport interface JobDashboard {\n todaySuccess: number\n todayFailed: number\n running: number\n totalJobs: number\n /** 按状态的任务数(键 = Ready/Paused/Completed/Panic)。 */\n statusCounts: Record<string, number>\n trend: JobTrendPoint[]\n upcoming: JobUpcomingItem[]\n nodes: JobNodeItem[]\n}\n"],"names":["DataScopeType","NoticeType","ReceiverType","DuplicateStrategy","JobHandlerKind","JobTriggerKind","JobMisfireStrategy","JobConcurrencyMode","JobStatus","JobRunStatus","JobFireMode"],"mappings":"AAqYO,IAAKA,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,iBAAiB,CAAA,IAAjB,kBACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UALUA,IAAAA,KAAA,CAAA,CAAA,GAsFAC,sBAAAA,OACVA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,eAAe,CAAA,IAAf,gBACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QAHUA,IAAAA,KAAA,CAAA,CAAA,GAqGAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAHUA,IAAAA,KAAA,CAAA,CAAA,GAmBAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,cAAc,CAAA,IAAd,eAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,aAAa,CAAA,IAAb,cACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAJUA,IAAAA,KAAA,CAAA,CAAA,GAQAC,sBAAAA,OACVA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WANUA,IAAAA,KAAA,CAAA,CAAA,GAUAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,gBAAgB,CAAA,IAAhB,iBAJUA,IAAAA,KAAA,CAAA,CAAA;"}
@@ -4,6 +4,8 @@
4
4
  * - 内嵌 iframe 菜单:节点 component 为 URL(path 为内部路径)→ 注册通用 iframe 视图,URL 进 meta.iframeSrc。
5
5
  */
6
6
  export declare function isHttpUrl(s: string | undefined | null): boolean;
7
+ /** 去掉尾部连续的 `/`(中间的不动)。从尾部线性扫描,不用正则。 */
8
+ export declare function trimTrailingSlashes(s: string): string;
7
9
  /** 整屏页路由前缀:这类路由注册在布局壳之外,占满整个窗口(车间大屏看板等)。 */
8
10
  export declare const FULLSCREEN_PATH_PREFIX = "/fullscreen/";
9
11
  /**
package/dist/utils/url.js CHANGED
@@ -1,13 +1,19 @@
1
1
  function r(t) {
2
2
  return !!t && /^https?:\/\//i.test(t);
3
3
  }
4
+ function i(t) {
5
+ let e = t.length;
6
+ for (; e > 0 && t.charCodeAt(e - 1) === 47; ) e--;
7
+ return t.slice(0, e);
8
+ }
4
9
  const n = "/fullscreen/";
5
- function e(t) {
10
+ function l(t) {
6
11
  return !!t && t.startsWith(n);
7
12
  }
8
13
  export {
9
14
  n as FULLSCREEN_PATH_PREFIX,
10
- e as isFullscreenPath,
11
- r as isHttpUrl
15
+ l as isFullscreenPath,
16
+ r as isHttpUrl,
17
+ i as trimTrailingSlashes
12
18
  };
13
19
  //# sourceMappingURL=url.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sources":["../../src/utils/url.ts"],"sourcesContent":["/**\n * 是否 http(s) 绝对 URL。外链/iframe 菜单的约定判据:\n * - 外链菜单:节点 path 为 URL(component 空)→ 点击 window.open,不建路由。\n * - 内嵌 iframe 菜单:节点 component 为 URL(path 为内部路径)→ 注册通用 iframe 视图,URL 进 meta.iframeSrc。\n */\nexport function isHttpUrl(s: string | undefined | null): boolean {\n return !!s && /^https?:\\/\\//i.test(s)\n}\n\n/** 整屏页路由前缀:这类路由注册在布局壳之外,占满整个窗口(车间大屏看板等)。 */\nexport const FULLSCREEN_PATH_PREFIX = '/fullscreen/'\n\n/**\n * 是否「站内整屏页」菜单:节点 path 以 {@link FULLSCREEN_PATH_PREFIX} 开头、component 空。\n *\n * 与外链菜单同样走 `window.open` 新标签打开,但目标是站内静态路由而不是外部 URL——\n * 大屏看板挂在墙上,必须整屏无侧栏无标签栏,塞进布局壳里就没意义了;\n * 又不能像外链那样写死 `http://host/...`,那会把部署域名钉死在菜单数据里。\n */\nexport function isFullscreenPath(s: string | undefined | null): boolean {\n return !!s && s.startsWith(FULLSCREEN_PATH_PREFIX)\n}\n"],"names":["isHttpUrl","s","FULLSCREEN_PATH_PREFIX","isFullscreenPath"],"mappings":"AAKO,SAASA,EAAUC,GAAuC;AAC/D,SAAO,CAAC,CAACA,KAAK,gBAAgB,KAAKA,CAAC;AACtC;AAGO,MAAMC,IAAyB;AAS/B,SAASC,EAAiBF,GAAuC;AACtE,SAAO,CAAC,CAACA,KAAKA,EAAE,WAAWC,CAAsB;AACnD;"}
1
+ {"version":3,"file":"url.js","sources":["../../src/utils/url.ts"],"sourcesContent":["/**\n * 是否 http(s) 绝对 URL。外链/iframe 菜单的约定判据:\n * - 外链菜单:节点 path 为 URL(component 空)→ 点击 window.open,不建路由。\n * - 内嵌 iframe 菜单:节点 component 为 URL(path 为内部路径)→ 注册通用 iframe 视图,URL 进 meta.iframeSrc。\n */\nexport function isHttpUrl(s: string | undefined | null): boolean {\n return !!s && /^https?:\\/\\//i.test(s)\n}\n\n/** 去掉尾部连续的 `/`(中间的不动)。从尾部线性扫描,不用正则。 */\nexport function trimTrailingSlashes(s: string): string {\n let end = s.length\n while (end > 0 && s.charCodeAt(end - 1) === 47) end--\n return s.slice(0, end)\n}\n\n/** 整屏页路由前缀:这类路由注册在布局壳之外,占满整个窗口(车间大屏看板等)。 */\nexport const FULLSCREEN_PATH_PREFIX = '/fullscreen/'\n\n/**\n * 是否「站内整屏页」菜单:节点 path 以 {@link FULLSCREEN_PATH_PREFIX} 开头、component 空。\n *\n * 与外链菜单同样走 `window.open` 新标签打开,但目标是站内静态路由而不是外部 URL——\n * 大屏看板挂在墙上,必须整屏无侧栏无标签栏,塞进布局壳里就没意义了;\n * 又不能像外链那样写死 `http://host/...`,那会把部署域名钉死在菜单数据里。\n */\nexport function isFullscreenPath(s: string | undefined | null): boolean {\n return !!s && s.startsWith(FULLSCREEN_PATH_PREFIX)\n}\n"],"names":["isHttpUrl","s","trimTrailingSlashes","end","FULLSCREEN_PATH_PREFIX","isFullscreenPath"],"mappings":"AAKO,SAASA,EAAUC,GAAuC;AAC/D,SAAO,CAAC,CAACA,KAAK,gBAAgB,KAAKA,CAAC;AACtC;AAGO,SAASC,EAAoBD,GAAmB;AACrD,MAAIE,IAAMF,EAAE;AACZ,SAAOE,IAAM,KAAKF,EAAE,WAAWE,IAAM,CAAC,MAAM,KAAI,CAAAA;AAChD,SAAOF,EAAE,MAAM,GAAGE,CAAG;AACvB;AAGO,MAAMC,IAAyB;AAS/B,SAASC,EAAiBJ,GAAuC;AACtE,SAAO,CAAC,CAACA,KAAKA,EAAE,WAAWG,CAAsB;AACnD;"}
@@ -1,8 +1,8 @@
1
1
  import o from "./4042.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-b6fdc641"]]);
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-6b886879"]]);
5
5
  export {
6
- m as default
6
+ p as default
7
7
  };
8
8
  //# sourceMappingURL=404.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"4042.vue.js","sources":["../../../src/views/error/404.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router'\nimport { NButton } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore } from '#/stores/app'\n\nconst router = useRouter()\nconst app = useAppStore()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"nf\">\n <div class=\"code\" :style=\"{ color: app.accent }\">404</div>\n <div class=\"msg\">{{ t('notFound.desc') }}</div>\n <n-button type=\"primary\" @click=\"router.replace('/')\">{{ t('notFound.back') }}</n-button>\n </div>\n</template>\n\n<style scoped>\n.nf {\n /* 撑满 layout 的 .page 容器,而不是整个视口——404 现在住在外壳里 */\n min-height: 60vh;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: var(--color-bg-body);\n}\n.code {\n font-size: 96px;\n font-weight: 800;\n line-height: 1;\n}\n.msg {\n color: var(--color-text-secondary);\n font-size: var(--font-size-md);\n}\n</style>\n"],"names":["router","useRouter","app","useAppStore","useI18n","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeStyle","_unref","_hoisted_2","_toDisplayString","_createVNode","NButton","_cache","$event"],"mappings":";;;;;;;;AAMA,UAAMA,IAASC,EAAA,GACTC,IAAMC,EAAA,GACN,EAAE,EAAA,IAAMC,EAAA;sBAIZC,EAAA,GAAAC,EAIM,OAJNC,GAIM;AAAA,MAHJC,EAA0D,OAAA;AAAA,QAArD,OAAM;AAAA,QAAQ,OAAKC,EAAA,EAAA,OAAWC,EAAAR,CAAA,EAAI,QAAM;AAAA,MAAA,GAAI,OAAG,CAAA;AAAA,MACpDM,EAA+C,OAA/CG,GAA+CC,EAA3BF,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,MACrBG,EAAyFH,EAAAI,CAAA,GAAA;AAAA,QAA/E,MAAK;AAAA,QAAW,SAAKC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEN,EAAAV,CAAA,EAAO,QAAO,GAAA;AAAA,MAAA;mBAAO,MAAwB;AAAA,cAArBU,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,QAAA;;;;;;"}
1
+ {"version":3,"file":"4042.vue.js","sources":["../../../src/views/error/404.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { useRouter } from 'vue-router'\nimport { NButton } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { useAppStore } from '#/stores/app'\n\nconst router = useRouter()\nconst app = useAppStore()\nconst { t } = useI18n()\n</script>\n\n<template>\n <div class=\"nf\">\n <div class=\"code\" :style=\"{ color: app.accent }\">404</div>\n <div class=\"msg\">{{ t('notFound.desc') }}</div>\n <n-button type=\"primary\" @click=\"router.replace('/')\">{{ t('notFound.back') }}</n-button>\n </div>\n</template>\n\n<style scoped>\n.nf {\n /* 撑满 layout 的 .page 容器,而不是整个视口——404 挂在布局壳内 */\n min-height: 60vh;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: var(--color-bg-body);\n}\n.code {\n font-size: 96px;\n font-weight: 800;\n line-height: 1;\n}\n.msg {\n color: var(--color-text-secondary);\n font-size: var(--font-size-md);\n}\n</style>\n"],"names":["router","useRouter","app","useAppStore","useI18n","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeStyle","_unref","_hoisted_2","_toDisplayString","_createVNode","NButton","_cache","$event"],"mappings":";;;;;;;;AAMA,UAAMA,IAASC,EAAA,GACTC,IAAMC,EAAA,GACN,EAAE,EAAA,IAAMC,EAAA;sBAIZC,EAAA,GAAAC,EAIM,OAJNC,GAIM;AAAA,MAHJC,EAA0D,OAAA;AAAA,QAArD,OAAM;AAAA,QAAQ,OAAKC,EAAA,EAAA,OAAWC,EAAAR,CAAA,EAAI,QAAM;AAAA,MAAA,GAAI,OAAG,CAAA;AAAA,MACpDM,EAA+C,OAA/CG,GAA+CC,EAA3BF,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,MACrBG,EAAyFH,EAAAI,CAAA,GAAA;AAAA,QAA/E,MAAK;AAAA,QAAW,SAAKC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAC,MAAEN,EAAAV,CAAA,EAAO,QAAO,GAAA;AAAA,MAAA;mBAAO,MAAwB;AAAA,cAArBU,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,QAAA;;;;;;"}
@@ -1,7 +1,7 @@
1
1
  import o from "./SplitPanel2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-9b2b9733"]]);
4
+ const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-75743368"]]);
5
5
  export {
6
6
  m as default
7
7
  };