smart-admin-web 10.12.0 → 10.12.2

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 (37) hide show
  1. package/dist/api/index.d.ts +13 -1
  2. package/dist/api/index.js +25 -13
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/api/schema.d.ts +360 -3
  5. package/dist/assets/icons/ph-subset.json.js +1 -1
  6. package/dist/lib/runtime.js +1 -1
  7. package/dist/locales/en-US.d.ts +13 -1
  8. package/dist/locales/en-US.js +15 -3
  9. package/dist/locales/en-US.js.map +1 -1
  10. package/dist/locales/zh-CN.d.ts +13 -1
  11. package/dist/locales/zh-CN.js +15 -3
  12. package/dist/locales/zh-CN.js.map +1 -1
  13. package/dist/router/index.js +18 -13
  14. package/dist/router/index.js.map +1 -1
  15. package/dist/router/viewRegistry.js +1 -1
  16. package/dist/router/viewRegistry.js.map +1 -1
  17. package/dist/style.css +1 -1
  18. package/dist/types/api.d.ts +26 -0
  19. package/dist/types/api.js.map +1 -1
  20. package/dist/views/dashboard/ShortcutPicker.vue.d.ts +16 -0
  21. package/dist/views/dashboard/ShortcutPicker.vue.js +8 -0
  22. package/dist/views/dashboard/ShortcutPicker.vue.js.map +1 -0
  23. package/dist/views/dashboard/ShortcutPicker2.vue.js +86 -0
  24. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -0
  25. package/dist/views/dashboard/biz.vue.js +2 -2
  26. package/dist/views/dashboard/biz2.vue.js +265 -93
  27. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  28. package/dist/views/dashboard/onlineDuration.d.ts +5 -0
  29. package/dist/views/dashboard/onlineDuration.js +8 -0
  30. package/dist/views/dashboard/onlineDuration.js.map +1 -0
  31. package/dist/views/dashboard/shortcutGroups.d.ts +18 -0
  32. package/dist/views/dashboard/shortcutGroups.js +19 -0
  33. package/dist/views/dashboard/shortcutGroups.js.map +1 -0
  34. package/dist/views/system/user/index.vue.js +2 -2
  35. package/dist/views/system/user/index2.vue.js +281 -211
  36. package/dist/views/system/user/index2.vue.js.map +1 -1
  37. package/package.json +1 -1
@@ -15,7 +15,7 @@ function m() {
15
15
  function v() {
16
16
  return Object.entries(s).filter(([e]) => e.endsWith("/detail"));
17
17
  }
18
- n(/* @__PURE__ */ Object.assign({ "../views/dashboard/biz.vue": () => import("../views/dashboard/biz.vue.js"), "../views/dashboard/workbench.vue": () => import("../views/dashboard/workbench.vue.js"), "../views/embed/iframe.vue": () => import("../views/embed/iframe.vue.js"), "../views/error/404.vue": () => import("../views/error/404.vue.js"), "../views/error/BootError.vue": () => import("../views/error/BootError.vue.js"), "../views/error/MissingRoute.vue": () => import("../views/error/MissingRoute.vue.js"), "../views/login/LoginForm.vue": () => import("../views/login/LoginForm.vue.js"), "../views/login/index.vue": () => import("../views/login/index.vue.js"), "../views/login/skins/AuroraGlass.vue": () => import("../views/login/skins/AuroraGlass.vue.js"), "../views/login/skins/SplitPanel.vue": () => import("../views/login/skins/SplitPanel.vue.js"), "../views/login/skins/Spotlight.vue": () => import("../views/login/skins/Spotlight.vue.js"), "../views/mfa/index.vue": () => import("../views/mfa/index.vue.js"), "../views/module/index.vue": () => import("../views/module/index.vue.js"), "../views/oauth/callback.vue": () => import("../views/oauth/callback.vue.js"), "../views/personal/bindings.vue": () => import("../views/personal/bindings.vue.js"), "../views/personal/notice.vue": () => import("../views/personal/notice.vue.js"), "../views/personal/password.vue": () => import("../views/personal/password.vue.js"), "../views/personal/profile.vue": () => import("../views/personal/profile.vue.js"), "../views/personal/security.vue": () => import("../views/personal/security.vue.js"), "../views/personal/sessions.vue": () => import("../views/personal/sessions.vue.js"), "../views/system/ai-model/components/ProviderCard.vue": () => import("../views/system/ai-model/components/ProviderCard.vue.js"), "../views/system/ai-model/components/ProviderForm.vue": () => import("../views/system/ai-model/components/ProviderForm.vue.js"), "../views/system/ai-model/index.vue": () => import("../views/system/ai-model/index.vue.js"), "../views/system/ai-usage/index.vue": () => import("../views/system/ai-usage/index.vue.js"), "../views/system/cache/index.vue": () => import("../views/system/cache/index.vue.js"), "../views/system/config/components/ConfigFormModal.vue": () => import("../views/system/config/components/ConfigFormModal.vue.js"), "../views/system/config/components/ExternalAuthConfig.vue": () => import("../views/system/config/components/ExternalAuthConfig.vue.js"), "../views/system/config/components/GroupExtraConfig.vue": () => import("../views/system/config/components/GroupExtraConfig.vue.js"), "../views/system/config/components/HighSensConfig.vue": () => import("../views/system/config/components/HighSensConfig.vue.js"), "../views/system/config/components/JobConfig.vue": () => import("../views/system/config/components/JobConfig.vue.js"), "../views/system/config/components/OtherConfig.vue": () => import("../views/system/config/components/OtherConfig.vue.js"), "../views/system/config/components/SecurityConfig.vue": () => import("../views/system/config/components/SecurityConfig.vue.js"), "../views/system/config/components/SysBaseConfig.vue": () => import("../views/system/config/components/SysBaseConfig.vue.js"), "../views/system/config/components/UploadConfig.vue": () => import("../views/system/config/components/UploadConfig.vue.js"), "../views/system/config/index.vue": () => import("../views/system/config/index.vue.js"), "../views/system/dict/index.vue": () => import("../views/system/dict/index.vue.js"), "../views/system/file/index.vue": () => import("../views/system/file/index.vue.js"), "../views/system/job-log/index.vue": () => import("../views/system/job-log/index.vue.js"), "../views/system/job-monitor/index.vue": () => import("../views/system/job-monitor/index.vue.js"), "../views/system/job/index.vue": () => import("../views/system/job/index.vue.js"), "../views/system/log/exception/index.vue": () => import("../views/system/log/exception/index.vue.js"), "../views/system/log/login/index.vue": () => import("../views/system/log/login/index.vue.js"), "../views/system/log/op/index.vue": () => import("../views/system/log/op/index.vue.js"), "../views/system/menu/components/ButtonManager.vue": () => import("../views/system/menu/components/ButtonManager.vue.js"), "../views/system/menu/components/MenuFormModal.vue": () => import("../views/system/menu/components/MenuFormModal.vue.js"), "../views/system/menu/index.vue": () => import("../views/system/menu/index.vue.js"), "../views/system/module/index.vue": () => import("../views/system/module/index.vue.js"), "../views/system/monitor/index.vue": () => import("../views/system/monitor/index.vue.js"), "../views/system/notice/index.vue": () => import("../views/system/notice/index.vue.js"), "../views/system/org/index.vue": () => import("../views/system/org/index.vue.js"), "../views/system/position/index.vue": () => import("../views/system/position/index.vue.js"), "../views/system/recycle/index.vue": () => import("../views/system/recycle/index.vue.js"), "../views/system/role/components/GrantMenuTable.vue": () => import("../views/system/role/components/GrantMenuTable.vue.js"), "../views/system/role/index.vue": () => import("../views/system/role/index.vue.js"), "../views/system/session/index.vue": () => import("../views/system/session/index.vue.js"), "../views/system/user/components/ResetPasswordModal.vue": () => import("../views/system/user/components/ResetPasswordModal.vue.js"), "../views/system/user/components/UserFormModal.vue": () => import("../views/system/user/components/UserFormModal.vue.js"), "../views/system/user/index.vue": () => import("../views/system/user/index.vue.js") }));
18
+ n(/* @__PURE__ */ Object.assign({ "../views/dashboard/ShortcutPicker.vue": () => import("../views/dashboard/ShortcutPicker.vue.js"), "../views/dashboard/biz.vue": () => import("../views/dashboard/biz.vue.js"), "../views/dashboard/workbench.vue": () => import("../views/dashboard/workbench.vue.js"), "../views/embed/iframe.vue": () => import("../views/embed/iframe.vue.js"), "../views/error/404.vue": () => import("../views/error/404.vue.js"), "../views/error/BootError.vue": () => import("../views/error/BootError.vue.js"), "../views/error/MissingRoute.vue": () => import("../views/error/MissingRoute.vue.js"), "../views/login/LoginForm.vue": () => import("../views/login/LoginForm.vue.js"), "../views/login/index.vue": () => import("../views/login/index.vue.js"), "../views/login/skins/AuroraGlass.vue": () => import("../views/login/skins/AuroraGlass.vue.js"), "../views/login/skins/SplitPanel.vue": () => import("../views/login/skins/SplitPanel.vue.js"), "../views/login/skins/Spotlight.vue": () => import("../views/login/skins/Spotlight.vue.js"), "../views/mfa/index.vue": () => import("../views/mfa/index.vue.js"), "../views/module/index.vue": () => import("../views/module/index.vue.js"), "../views/oauth/callback.vue": () => import("../views/oauth/callback.vue.js"), "../views/personal/bindings.vue": () => import("../views/personal/bindings.vue.js"), "../views/personal/notice.vue": () => import("../views/personal/notice.vue.js"), "../views/personal/password.vue": () => import("../views/personal/password.vue.js"), "../views/personal/profile.vue": () => import("../views/personal/profile.vue.js"), "../views/personal/security.vue": () => import("../views/personal/security.vue.js"), "../views/personal/sessions.vue": () => import("../views/personal/sessions.vue.js"), "../views/system/ai-model/components/ProviderCard.vue": () => import("../views/system/ai-model/components/ProviderCard.vue.js"), "../views/system/ai-model/components/ProviderForm.vue": () => import("../views/system/ai-model/components/ProviderForm.vue.js"), "../views/system/ai-model/index.vue": () => import("../views/system/ai-model/index.vue.js"), "../views/system/ai-usage/index.vue": () => import("../views/system/ai-usage/index.vue.js"), "../views/system/cache/index.vue": () => import("../views/system/cache/index.vue.js"), "../views/system/config/components/ConfigFormModal.vue": () => import("../views/system/config/components/ConfigFormModal.vue.js"), "../views/system/config/components/ExternalAuthConfig.vue": () => import("../views/system/config/components/ExternalAuthConfig.vue.js"), "../views/system/config/components/GroupExtraConfig.vue": () => import("../views/system/config/components/GroupExtraConfig.vue.js"), "../views/system/config/components/HighSensConfig.vue": () => import("../views/system/config/components/HighSensConfig.vue.js"), "../views/system/config/components/JobConfig.vue": () => import("../views/system/config/components/JobConfig.vue.js"), "../views/system/config/components/OtherConfig.vue": () => import("../views/system/config/components/OtherConfig.vue.js"), "../views/system/config/components/SecurityConfig.vue": () => import("../views/system/config/components/SecurityConfig.vue.js"), "../views/system/config/components/SysBaseConfig.vue": () => import("../views/system/config/components/SysBaseConfig.vue.js"), "../views/system/config/components/UploadConfig.vue": () => import("../views/system/config/components/UploadConfig.vue.js"), "../views/system/config/index.vue": () => import("../views/system/config/index.vue.js"), "../views/system/dict/index.vue": () => import("../views/system/dict/index.vue.js"), "../views/system/file/index.vue": () => import("../views/system/file/index.vue.js"), "../views/system/job-log/index.vue": () => import("../views/system/job-log/index.vue.js"), "../views/system/job-monitor/index.vue": () => import("../views/system/job-monitor/index.vue.js"), "../views/system/job/index.vue": () => import("../views/system/job/index.vue.js"), "../views/system/log/exception/index.vue": () => import("../views/system/log/exception/index.vue.js"), "../views/system/log/login/index.vue": () => import("../views/system/log/login/index.vue.js"), "../views/system/log/op/index.vue": () => import("../views/system/log/op/index.vue.js"), "../views/system/menu/components/ButtonManager.vue": () => import("../views/system/menu/components/ButtonManager.vue.js"), "../views/system/menu/components/MenuFormModal.vue": () => import("../views/system/menu/components/MenuFormModal.vue.js"), "../views/system/menu/index.vue": () => import("../views/system/menu/index.vue.js"), "../views/system/module/index.vue": () => import("../views/system/module/index.vue.js"), "../views/system/monitor/index.vue": () => import("../views/system/monitor/index.vue.js"), "../views/system/notice/index.vue": () => import("../views/system/notice/index.vue.js"), "../views/system/org/index.vue": () => import("../views/system/org/index.vue.js"), "../views/system/position/index.vue": () => import("../views/system/position/index.vue.js"), "../views/system/recycle/index.vue": () => import("../views/system/recycle/index.vue.js"), "../views/system/role/components/GrantMenuTable.vue": () => import("../views/system/role/components/GrantMenuTable.vue.js"), "../views/system/role/index.vue": () => import("../views/system/role/index.vue.js"), "../views/system/session/index.vue": () => import("../views/system/session/index.vue.js"), "../views/system/user/components/ResetPasswordModal.vue": () => import("../views/system/user/components/ResetPasswordModal.vue.js"), "../views/system/user/components/UserFormModal.vue": () => import("../views/system/user/components/UserFormModal.vue.js"), "../views/system/user/index.vue": () => import("../views/system/user/index.vue.js") }));
19
19
  export {
20
20
  v as detailViews,
21
21
  r as getView,
@@ -1 +1 @@
1
- {"version":3,"file":"viewRegistry.js","sources":["../../src/router/viewRegistry.ts"],"sourcesContent":["import type { Component } from 'vue'\n\n/** 页面懒加载器:import.meta.glob 的每个值就是一个。 */\nexport type ViewLoader = () => Promise<Component | { default: Component }>\n\n// 页面表:key 即菜单 component 字段的取值(如 system/user/index)。内核内置页在本模块加载时登记,\n// 消费方与插件经 registerViews 并入;同名覆盖,谁后注册谁生效(createSmartAdmin 里插件在前、应用最后)。\n// 每个 loader 引用稳定(glob 每文件一个函数),namedPage 靠它判断 keep-alive 缓存要不要失效。\nconst views: Record<string, ViewLoader> = {}\n\n/** glob 键 → 页面 key:取最后一个 `/views/` 之后、去掉 .vue(`./views/system/user/index.vue` → `system/user/index`)。 */\nexport function normalizeViewKey(path: string): string {\n const i = path.lastIndexOf('/views/')\n const rel = i >= 0 ? path.slice(i + '/views/'.length) : path.replace(/^\\.?\\/+/, '')\n return rel.replace(/\\.vue$/, '')\n}\n\n/** 并入一批页面(键可以是 glob 原始路径,也可以是已规范化的 key)。 */\nexport function registerViews(map: Record<string, ViewLoader>): void {\n for (const [key, loader] of Object.entries(map)) views[normalizeViewKey(key)] = loader\n}\n\nexport function getView(key: string): ViewLoader | undefined {\n return views[key]\n}\n\nexport function hasView(key: string): boolean {\n return key in views\n}\n\n/**\n * 菜单 component 字段的全部合法取值,供菜单管理表单的「组件路径」下拉:\n * 手敲错一个字符时 buildRoutesForModule 会保留路径并落到 MissingRoute 诊断页;下拉仍是第一道防线。\n */\nexport function viewComponentPaths(): string[] {\n return Object.keys(views).toSorted()\n}\n\n/** 约定式详情页:key 以 `/detail` 结尾的页面(views/<模块>/detail.vue)。 */\nexport function detailViews(): Array<[key: string, loader: ViewLoader]> {\n return Object.entries(views).filter(([k]) => k.endsWith('/detail'))\n}\n\n// 内核内置页\nregisterViews(import.meta.glob('../views/**/*.vue') as Record<string, ViewLoader>)\n"],"names":["views","normalizeViewKey","path","registerViews","map","key","loader","getView","viewComponentPaths","detailViews","k"],"mappings":"AAQA,MAAMA,IAAoC,CAAA;AAGnC,SAASC,EAAiBC,GAAsB;AACrD,QAAM,IAAIA,EAAK,YAAY,SAAS;AAEpC,UADY,KAAK,IAAIA,EAAK,MAAM,IAAI,CAAgB,IAAIA,EAAK,QAAQ,WAAW,EAAE,GACvE,QAAQ,UAAU,EAAE;AACjC;AAGO,SAASC,EAAcC,GAAuC;AACnE,aAAW,CAACC,GAAKC,CAAM,KAAK,OAAO,QAAQF,CAAG,EAAG,CAAAJ,EAAMC,EAAiBI,CAAG,CAAC,IAAIC;AAClF;AAEO,SAASC,EAAQF,GAAqC;AAC3D,SAAOL,EAAMK,CAAG;AAClB;AAUO,SAASG,IAA+B;AAC7C,SAAO,OAAO,KAAKR,CAAK,EAAE,SAAA;AAC5B;AAGO,SAASS,IAAwD;AACtE,SAAO,OAAO,QAAQT,CAAK,EAAE,OAAO,CAAC,CAACU,CAAC,MAAMA,EAAE,SAAS,SAAS,CAAC;AACpE;AAGAP,2jLAAiF;"}
1
+ {"version":3,"file":"viewRegistry.js","sources":["../../src/router/viewRegistry.ts"],"sourcesContent":["import type { Component } from 'vue'\n\n/** 页面懒加载器:import.meta.glob 的每个值就是一个。 */\nexport type ViewLoader = () => Promise<Component | { default: Component }>\n\n// 页面表:key 即菜单 component 字段的取值(如 system/user/index)。内核内置页在本模块加载时登记,\n// 消费方与插件经 registerViews 并入;同名覆盖,谁后注册谁生效(createSmartAdmin 里插件在前、应用最后)。\n// 每个 loader 引用稳定(glob 每文件一个函数),namedPage 靠它判断 keep-alive 缓存要不要失效。\nconst views: Record<string, ViewLoader> = {}\n\n/** glob 键 → 页面 key:取最后一个 `/views/` 之后、去掉 .vue(`./views/system/user/index.vue` → `system/user/index`)。 */\nexport function normalizeViewKey(path: string): string {\n const i = path.lastIndexOf('/views/')\n const rel = i >= 0 ? path.slice(i + '/views/'.length) : path.replace(/^\\.?\\/+/, '')\n return rel.replace(/\\.vue$/, '')\n}\n\n/** 并入一批页面(键可以是 glob 原始路径,也可以是已规范化的 key)。 */\nexport function registerViews(map: Record<string, ViewLoader>): void {\n for (const [key, loader] of Object.entries(map)) views[normalizeViewKey(key)] = loader\n}\n\nexport function getView(key: string): ViewLoader | undefined {\n return views[key]\n}\n\nexport function hasView(key: string): boolean {\n return key in views\n}\n\n/**\n * 菜单 component 字段的全部合法取值,供菜单管理表单的「组件路径」下拉:\n * 手敲错一个字符时 buildRoutesForModule 会保留路径并落到 MissingRoute 诊断页;下拉仍是第一道防线。\n */\nexport function viewComponentPaths(): string[] {\n return Object.keys(views).toSorted()\n}\n\n/** 约定式详情页:key 以 `/detail` 结尾的页面(views/<模块>/detail.vue)。 */\nexport function detailViews(): Array<[key: string, loader: ViewLoader]> {\n return Object.entries(views).filter(([k]) => k.endsWith('/detail'))\n}\n\n// 内核内置页\nregisterViews(import.meta.glob('../views/**/*.vue') as Record<string, ViewLoader>)\n"],"names":["views","normalizeViewKey","path","registerViews","map","key","loader","getView","viewComponentPaths","detailViews","k"],"mappings":"AAQA,MAAMA,IAAoC,CAAA;AAGnC,SAASC,EAAiBC,GAAsB;AACrD,QAAM,IAAIA,EAAK,YAAY,SAAS;AAEpC,UADY,KAAK,IAAIA,EAAK,MAAM,IAAI,CAAgB,IAAIA,EAAK,QAAQ,WAAW,EAAE,GACvE,QAAQ,UAAU,EAAE;AACjC;AAGO,SAASC,EAAcC,GAAuC;AACnE,aAAW,CAACC,GAAKC,CAAM,KAAK,OAAO,QAAQF,CAAG,EAAG,CAAAJ,EAAMC,EAAiBI,CAAG,CAAC,IAAIC;AAClF;AAEO,SAASC,EAAQF,GAAqC;AAC3D,SAAOL,EAAMK,CAAG;AAClB;AAUO,SAASG,IAA+B;AAC7C,SAAO,OAAO,KAAKR,CAAK,EAAE,SAAA;AAC5B;AAGO,SAASS,IAAwD;AACtE,SAAO,OAAO,QAAQT,CAAK,EAAE,OAAO,CAAC,CAACU,CAAC,MAAMA,EAAE,SAAS,SAAS,CAAC;AACpE;AAGAP,8pLAAiF;"}
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-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)}.provider-card[data-v-659dbae9]{border-radius:var(--radius-lg);transition:border-color .15s,background-color .15s,opacity .15s}.provider-card[data-v-659dbae9] .n-card-content{display:flex;flex-direction:column;gap:10px}.provider-card.provider-card--enabled[data-v-659dbae9]{border-color:color-mix(in srgb,var(--color-primary) 45%,var(--color-border));background:color-mix(in srgb,var(--color-primary) 4%,var(--color-bg-container))}.provider-card.provider-card--disabled[data-v-659dbae9]{opacity:.72}.provider-card.provider-card--pending[data-v-659dbae9]{border-style:dashed;border-color:color-mix(in srgb,var(--color-warning) 55%,var(--color-border))}.card-head[data-v-659dbae9]{display:flex;align-items:flex-start;gap:10px;min-width:0}.badge[data-v-659dbae9]{flex-shrink:0;width:42px;height:42px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,currentColor 14%,transparent)}.head-meta[data-v-659dbae9]{min-width:0;flex:1}.name-row[data-v-659dbae9]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.name[data-v-659dbae9]{font-size:15px;font-weight:600;color:var(--color-text-primary);line-height:1.3}.code[data-v-659dbae9]{display:inline-block;margin-top:4px;font-size:12px;color:var(--color-text-tertiary);background:var(--color-fill);padding:1px 6px;border-radius:4px}.pending-tip[data-v-659dbae9]{display:flex;align-items:center;gap:6px;padding:6px 10px;border-radius:var(--radius-sm);background:var(--color-warning-bg);color:var(--color-warning);font-size:12px}.card-body[data-v-659dbae9]{display:flex;flex-direction:column;gap:6px}.row[data-v-659dbae9]{display:flex;align-items:baseline;gap:8px;font-size:12px;min-width:0}.label[data-v-659dbae9]{flex-shrink:0;color:var(--color-text-tertiary);width:66px}.value[data-v-659dbae9]{min-width:0;color:var(--color-text-secondary)}.value.ellipsis[data-v-659dbae9]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.mask[data-v-659dbae9]{margin-left:4px;color:var(--color-text-tertiary)}.card-actions[data-v-659dbae9]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding-top:8px;border-top:1px dashed var(--color-border)}.switch-group[data-v-659dbae9]{display:flex;align-items:center;gap:6px}.switch-text[data-v-659dbae9]{font-size:12px;color:var(--color-text-tertiary)}.test-result[data-v-659dbae9]{display:flex;flex-direction:column;gap:4px;font-size:12px}.test-head[data-v-659dbae9]{display:flex;align-items:center;gap:6px;font-weight:600;margin-bottom:2px}.test-head.ok[data-v-659dbae9]{color:var(--color-success)}.test-head.fail[data-v-659dbae9]{color:var(--color-danger)}.test-row[data-v-659dbae9]{color:var(--color-text-secondary)}.test-error[data-v-659dbae9]{color:var(--color-danger)}.hint[data-v-adc0e948]{font-size:12px;color:var(--color-text-tertiary, #999)}.model-row[data-v-adc0e948]{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:10px 12px}.model-row+.model-row[data-v-adc0e948]{margin-top:8px}.model-row-head[data-v-adc0e948]{display:flex;align-items:center;gap:8px}.model-index[data-v-adc0e948]{font-size:12px;font-weight:600;color:var(--color-text-tertiary)}.model-row-spacer[data-v-adc0e948]{flex:1}.model-row-fields[data-v-adc0e948]{display:flex;gap:8px;margin-top:8px}.field[data-v-adc0e948]{flex:1;min-width:0}.mini-label[data-v-adc0e948]{display:block;margin-bottom:2px;font-size:11px;color:var(--color-text-tertiary)}.view[data-v-b955f807]{display:flex;flex-direction:column;gap:var(--gap-card, 16px)}.toolbar[data-v-b955f807]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.toolbar-spacer[data-v-b955f807]{flex:1}.empty[data-v-b955f807]{padding:64px 0}.view[data-v-d81fc5a2]{display:flex;flex-direction:column;gap:var(--gap-card)}.filter-bar[data-v-d81fc5a2]{display:flex;flex-wrap:wrap;align-items:flex-end;gap:16px 24px}.filter-item[data-v-d81fc5a2]{display:flex;flex-direction:column;gap:6px}.filter-label[data-v-d81fc5a2]{font-size:var(--font-size-sm, 13px);color:var(--color-text-secondary)}.date-filter-row[data-v-d81fc5a2]{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.quick-range[data-v-d81fc5a2]{display:flex;gap:4px}.metric-body[data-v-d81fc5a2]{min-width:0}.metric-val[data-v-d81fc5a2]{font-size:28px;font-weight:700;color:var(--color-text-primary);line-height:1.1}.metric-suffix[data-v-d81fc5a2]{font-size:14px;font-weight:400;color:var(--color-text-secondary)}.metric-label[data-v-d81fc5a2]{color:var(--color-text-secondary);margin-top:4px}.share-cell[data-v-d81fc5a2]{display:flex;align-items:center;gap:8px}.share-bar[data-v-d81fc5a2]{flex:1;min-width:60px}.share-text[data-v-d81fc5a2]{flex:0 0 auto;color:var(--color-text-secondary);font-size:12px}.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)}
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)}.row[data-v-1ba501cb]{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:var(--radius-md);cursor:pointer}.row[data-v-1ba501cb]:hover{background:var(--color-fill-hover)}.empty[data-v-1ba501cb]{padding:24px 0}.view[data-v-4a6a23e0]{display:flex;flex-direction:column;gap:var(--gap-card)}.banner[data-v-4a6a23e0]{display:flex;align-items:center;gap:16px;padding:24px;border-radius:var(--radius-lg);background:var(--color-primary-light)}.avatar[data-v-4a6a23e0]{flex-shrink:0;width:52px;height:52px;border-radius:50%;display:flex;align-items:center;justify-content:center}.banner-body[data-v-4a6a23e0]{min-width:0}.hi[data-v-4a6a23e0]{font-size:var(--font-size-lg);font-weight:600;color:var(--color-text-primary)}.tip[data-v-4a6a23e0]{color:var(--color-text-secondary);margin-top:4px}.meta-row[data-v-4a6a23e0]{margin-top:8px;display:flex;align-items:center;gap:10px;font-size:13px;color:var(--color-text-tertiary);font-variant-numeric:tabular-nums}.meta-dot[data-v-4a6a23e0]{width:3px;height:3px;border-radius:50%;background:var(--color-text-disabled);flex-shrink:0}.row[data-v-4a6a23e0]{display:grid;grid-template-columns:1.35fr 1fr;gap:var(--gap-card);align-items:start}@media(max-width:760px){.row[data-v-4a6a23e0]{grid-template-columns:1fr}}.todo-list[data-v-4a6a23e0]{display:flex;flex-direction:column}.todo-row[data-v-4a6a23e0]{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--color-border);cursor:pointer}.todo-row[data-v-4a6a23e0]:last-child{border-bottom:none}.todo-title[data-v-4a6a23e0]{color:var(--color-text-primary);font-weight:500}.todo-sub[data-v-4a6a23e0]{margin-top:2px;font-size:12px;color:var(--color-text-tertiary)}.todo-time[data-v-4a6a23e0]{flex-shrink:0;font-size:12px;color:var(--color-text-tertiary)}.quick-group-label[data-v-4a6a23e0]{font-size:12px;color:var(--color-text-tertiary);margin:4px 0 8px}.quick-grid[data-v-4a6a23e0]{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:4px}.quick-item[data-v-4a6a23e0]{position:relative;border:1px solid var(--color-border);border-radius:var(--radius-md)}.quick-item.suggested[data-v-4a6a23e0]{border-style:dashed}.quick-body[data-v-4a6a23e0]{display:flex;align-items:center;gap:8px;padding:8px 14px 8px 10px;cursor:pointer}.quick-name[data-v-4a6a23e0]{font-size:13px;color:var(--color-text-secondary)}.quick-star[data-v-4a6a23e0]{position:absolute;top:-6px;right:-6px;width:18px;height:18px;border-radius:50%;border:1px solid var(--color-border);background:var(--color-bg-elevated);color:var(--color-text-disabled);display:flex;align-items:center;justify-content:center;cursor:pointer}.quick-star.active[data-v-4a6a23e0]{color:var(--color-warning)}.notice-row[data-v-4a6a23e0]{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer}.notice-title[data-v-4a6a23e0]{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-4a6a23e0]{flex-shrink:0;width:6px;height:6px;border-radius:50%;background:var(--color-primary)}.notice-time[data-v-4a6a23e0]{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)}.provider-card[data-v-659dbae9]{border-radius:var(--radius-lg);transition:border-color .15s,background-color .15s,opacity .15s}.provider-card[data-v-659dbae9] .n-card-content{display:flex;flex-direction:column;gap:10px}.provider-card.provider-card--enabled[data-v-659dbae9]{border-color:color-mix(in srgb,var(--color-primary) 45%,var(--color-border));background:color-mix(in srgb,var(--color-primary) 4%,var(--color-bg-container))}.provider-card.provider-card--disabled[data-v-659dbae9]{opacity:.72}.provider-card.provider-card--pending[data-v-659dbae9]{border-style:dashed;border-color:color-mix(in srgb,var(--color-warning) 55%,var(--color-border))}.card-head[data-v-659dbae9]{display:flex;align-items:flex-start;gap:10px;min-width:0}.badge[data-v-659dbae9]{flex-shrink:0;width:42px;height:42px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,currentColor 14%,transparent)}.head-meta[data-v-659dbae9]{min-width:0;flex:1}.name-row[data-v-659dbae9]{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.name[data-v-659dbae9]{font-size:15px;font-weight:600;color:var(--color-text-primary);line-height:1.3}.code[data-v-659dbae9]{display:inline-block;margin-top:4px;font-size:12px;color:var(--color-text-tertiary);background:var(--color-fill);padding:1px 6px;border-radius:4px}.pending-tip[data-v-659dbae9]{display:flex;align-items:center;gap:6px;padding:6px 10px;border-radius:var(--radius-sm);background:var(--color-warning-bg);color:var(--color-warning);font-size:12px}.card-body[data-v-659dbae9]{display:flex;flex-direction:column;gap:6px}.row[data-v-659dbae9]{display:flex;align-items:baseline;gap:8px;font-size:12px;min-width:0}.label[data-v-659dbae9]{flex-shrink:0;color:var(--color-text-tertiary);width:66px}.value[data-v-659dbae9]{min-width:0;color:var(--color-text-secondary)}.value.ellipsis[data-v-659dbae9]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}.mask[data-v-659dbae9]{margin-left:4px;color:var(--color-text-tertiary)}.card-actions[data-v-659dbae9]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding-top:8px;border-top:1px dashed var(--color-border)}.switch-group[data-v-659dbae9]{display:flex;align-items:center;gap:6px}.switch-text[data-v-659dbae9]{font-size:12px;color:var(--color-text-tertiary)}.test-result[data-v-659dbae9]{display:flex;flex-direction:column;gap:4px;font-size:12px}.test-head[data-v-659dbae9]{display:flex;align-items:center;gap:6px;font-weight:600;margin-bottom:2px}.test-head.ok[data-v-659dbae9]{color:var(--color-success)}.test-head.fail[data-v-659dbae9]{color:var(--color-danger)}.test-row[data-v-659dbae9]{color:var(--color-text-secondary)}.test-error[data-v-659dbae9]{color:var(--color-danger)}.hint[data-v-adc0e948]{font-size:12px;color:var(--color-text-tertiary, #999)}.model-row[data-v-adc0e948]{border:1px solid var(--color-border);border-radius:var(--radius-md);padding:10px 12px}.model-row+.model-row[data-v-adc0e948]{margin-top:8px}.model-row-head[data-v-adc0e948]{display:flex;align-items:center;gap:8px}.model-index[data-v-adc0e948]{font-size:12px;font-weight:600;color:var(--color-text-tertiary)}.model-row-spacer[data-v-adc0e948]{flex:1}.model-row-fields[data-v-adc0e948]{display:flex;gap:8px;margin-top:8px}.field[data-v-adc0e948]{flex:1;min-width:0}.mini-label[data-v-adc0e948]{display:block;margin-bottom:2px;font-size:11px;color:var(--color-text-tertiary)}.view[data-v-b955f807]{display:flex;flex-direction:column;gap:var(--gap-card, 16px)}.toolbar[data-v-b955f807]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.toolbar-spacer[data-v-b955f807]{flex:1}.empty[data-v-b955f807]{padding:64px 0}.view[data-v-d81fc5a2]{display:flex;flex-direction:column;gap:var(--gap-card)}.filter-bar[data-v-d81fc5a2]{display:flex;flex-wrap:wrap;align-items:flex-end;gap:16px 24px}.filter-item[data-v-d81fc5a2]{display:flex;flex-direction:column;gap:6px}.filter-label[data-v-d81fc5a2]{font-size:var(--font-size-sm, 13px);color:var(--color-text-secondary)}.date-filter-row[data-v-d81fc5a2]{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.quick-range[data-v-d81fc5a2]{display:flex;gap:4px}.metric-body[data-v-d81fc5a2]{min-width:0}.metric-val[data-v-d81fc5a2]{font-size:28px;font-weight:700;color:var(--color-text-primary);line-height:1.1}.metric-suffix[data-v-d81fc5a2]{font-size:14px;font-weight:400;color:var(--color-text-secondary)}.metric-label[data-v-d81fc5a2]{color:var(--color-text-secondary);margin-top:4px}.share-cell[data-v-d81fc5a2]{display:flex;align-items:center;gap:8px}.share-bar[data-v-d81fc5a2]{flex:1;min-width:60px}.share-text[data-v-d81fc5a2]{flex:0 0 auto;color:var(--color-text-secondary);font-size:12px}.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}.user-layout[data-v-99109370]{--side-filter-width: 248px}
@@ -59,6 +59,32 @@ export interface MySessionItem {
59
59
  expiresAt: string;
60
60
  isCurrent: boolean;
61
61
  }
62
+ /** 上一次成功登录的信息(后端 LastLoginOutput;排除本次,首次登录时接口整体返回 null)。 */
63
+ export interface LastLoginInfo {
64
+ time: string;
65
+ ip?: string | null;
66
+ userAgent?: string | null;
67
+ }
68
+ /** 工作台待办单条(后端 WorkbenchTodoItem)。 */
69
+ export interface WorkbenchTodoItem {
70
+ id: number;
71
+ title: string;
72
+ description?: string | null;
73
+ url?: string | null;
74
+ createTime: string;
75
+ }
76
+ /** 工作台待办摘要(后端 WorkbenchTodoSummary;内核默认恒空)。 */
77
+ export interface WorkbenchTodoSummary {
78
+ totalCount: number;
79
+ items: WorkbenchTodoItem[];
80
+ }
81
+ /** 工作台快捷方式项(后端 UserShortcutItem;后端已按"置顶优先+高频补位"排好序)。 */
82
+ export interface UserShortcutItem {
83
+ menuPath: string;
84
+ pinned: boolean;
85
+ title: string;
86
+ icon?: string | null;
87
+ }
62
88
  /** 后端统一分页结果 PagedList<T>。 */
63
89
  export interface PagedList<T> {
64
90
  current: number;
@@ -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 * 缺省时前端用 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\n// ── AI 管理(与后端 AiProviderModels/AiUsageModels 对齐;错误码文案在 error.ai.*,别重复) ──\n\n/** 厂商下的一个模型(后端 AiModelView)。 */\nexport interface AiModelView {\n id: number\n name: string\n displayName: string\n enabled: boolean\n isDefault: boolean\n contextWindow: number | null\n inputPrice: number | null\n outputPrice: number | null\n}\n\n/** 厂商行(后端 AiProviderView;列表/详情共用,apiKey 只回 hasApiKey + 掩码提示,不回明文)。 */\nexport interface AiProviderView {\n id: number\n code: string\n name: string\n preset: string\n protocol: string\n baseUrl: string\n authScheme: string\n apiKeyHint: string | null\n hasApiKey: boolean\n enabled: boolean\n sort: number\n remark: string | null\n models: AiModelView[]\n}\n\n/**\n * 模型新增/编辑入参(后端 AiModelInput;id 为 `null` = 新增该行)。\n * 后端定义为位置式 record——字段在请求体里必须都存在(可以是 null),不能整键省略,\n * 这里特意都不带 `?`,免得页面代码漏填导致类型能过编译、实际发请求时字段缺失。\n */\nexport interface AiModelInput {\n id: number | null\n name: string\n displayName: string\n enabled: boolean\n isDefault: boolean\n contextWindow: number | null\n inputPrice: number | null\n outputPrice: number | null\n}\n\n/** 厂商新增入参(后端 AiProviderAddInput;code 仅新增时填,apiKey 传 null 由后端拒绝/提示未配置)。 */\nexport interface AiProviderAddInput {\n code: string\n name: string\n preset: string\n baseUrl: string\n authScheme: string\n apiKey: string | null\n sort: number\n remark: string | null\n models: AiModelInput[]\n}\n\n/** 厂商编辑入参(后端 AiProviderUpdateInput;无 code——编辑禁用;apiKey 传 null = 不修改现有 Key)。 */\nexport interface AiProviderUpdateInput {\n code: string\n name: string\n baseUrl: string\n authScheme: string\n apiKey: string | null\n sort: number\n remark: string | null\n models: AiModelInput[]\n}\n\n/** 厂商预置(GET /api/v1/sys/ai/provider/presets,静态表,表单下拉用)。 */\nexport interface AiModelPreset {\n name: string\n displayName: string\n contextWindow?: number | null\n}\n\n/** 厂商预置(后端 AiProviderPresets.cs 落定的 11 个 code)。 */\nexport interface AiProviderPreset {\n code: string\n name: string\n protocol: string\n baseUrl: string\n authScheme: string\n models: AiModelPreset[]\n}\n\n/**\n * 后端 AiUsageSource 是普通枚举,没配 JsonStringEnumConverter,序列化按数字下发(System.Text.Json 默认行为)。\n * 1=Reported(上游上报的真实用量),2=Missing(上游没给,记 0 或估算兜底)。\n */\nexport const AI_USAGE_SOURCE = { Reported: 1, Missing: 2 } as const\nexport type AiUsageSourceValue = 1 | 2\n\n/** 一次调用的 Token 用量(后端 AiUsage;source 标记数值是上游上报还是估算兜底)。 */\nexport interface AiUsage {\n inputTokens: number\n outputTokens: number\n totalTokens: number\n source: AiUsageSourceValue\n}\n\n/** 测试连接结果(后端 AiTestResult)。 */\nexport interface AiTestResult {\n ok: boolean\n model?: string | null\n latencyMs: number\n usage?: AiUsage | null\n error?: string | null\n}\n\n/**\n * 用量统计分组维度(后端 AiUsageGroupBy,普通枚举,查询参按数字下发/上送)。\n * 1=Provider、2=Model、3=Scene、4=User。\n */\nexport const AI_USAGE_GROUP_BY = { Provider: 1, Model: 2, Scene: 3, User: 4 } as const\nexport type AiUsageGroupBy = 1 | 2 | 3 | 4\n\n/** 用量统计四格指标(后端 AiUsageTotals;failuresByErrorCode 键为 ErrorCode 数值)。 */\nexport interface AiUsageTotals {\n totalTokens: number\n inputTokens: number\n outputTokens: number\n callCount: number\n failureCount: number\n failuresByErrorCode: Record<number, number>\n}\n\n/** 分组维度下的一行(后端 AiUsageGroupRow)。 */\nexport interface AiUsageGroupRow {\n key: string\n label?: string | null\n inputTokens: number\n outputTokens: number\n callCount: number\n sharePercent: number\n avgLatencyMs: number\n}\n\n/** 用量统计汇总(后端 AiUsageSummary)。 */\nexport interface AiUsageSummary {\n totals: AiUsageTotals\n groups: AiUsageGroupRow[]\n}\n\n/** 用量趋势的一天(后端 AiUsageTrendPoint)。 */\nexport interface AiUsageTrendPoint {\n date: string\n inputTokens: number\n outputTokens: number\n callCount: number\n}\n\n/** 用量明细行(后端 SysAiUsageLog;只读,分页项已含全字段)。 */\nexport interface SysAiUsageLog {\n id: number\n providerId: number\n providerCode: string\n model: string\n scene: string\n userId?: number | null\n inputTokens: number\n outputTokens: number\n totalTokens: number\n usageSource: AiUsageSourceValue\n latencyMs: number\n success: boolean\n errorCode?: number | null\n errorMessage?: string | null\n streamed: boolean\n requestId?: string | null\n createTime: string\n}\n"],"names":["DataScopeType","NoticeType","ReceiverType","DuplicateStrategy","JobHandlerKind","JobTriggerKind","JobMisfireStrategy","JobConcurrencyMode","JobStatus","JobRunStatus","JobFireMode","AI_USAGE_SOURCE","AI_USAGE_GROUP_BY"],"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;AA0OL,MAAMC,IAAkB,EAAE,UAAU,GAAG,SAAS,EAAA,GAwB1CC,IAAoB,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,EAAA;"}
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/** 上一次成功登录的信息(后端 LastLoginOutput;排除本次,首次登录时接口整体返回 null)。 */\nexport interface LastLoginInfo {\n time: string\n ip?: string | null\n userAgent?: string | null\n}\n\n/** 工作台待办单条(后端 WorkbenchTodoItem)。 */\nexport interface WorkbenchTodoItem {\n id: number\n title: string\n description?: string | null\n url?: string | null\n createTime: string\n}\n\n/** 工作台待办摘要(后端 WorkbenchTodoSummary;内核默认恒空)。 */\nexport interface WorkbenchTodoSummary {\n totalCount: number\n items: WorkbenchTodoItem[]\n}\n\n/** 工作台快捷方式项(后端 UserShortcutItem;后端已按\"置顶优先+高频补位\"排好序)。 */\nexport interface UserShortcutItem {\n menuPath: string\n pinned: boolean\n title: string\n icon?: string | null\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\n// ── AI 管理(与后端 AiProviderModels/AiUsageModels 对齐;错误码文案在 error.ai.*,别重复) ──\n\n/** 厂商下的一个模型(后端 AiModelView)。 */\nexport interface AiModelView {\n id: number\n name: string\n displayName: string\n enabled: boolean\n isDefault: boolean\n contextWindow: number | null\n inputPrice: number | null\n outputPrice: number | null\n}\n\n/** 厂商行(后端 AiProviderView;列表/详情共用,apiKey 只回 hasApiKey + 掩码提示,不回明文)。 */\nexport interface AiProviderView {\n id: number\n code: string\n name: string\n preset: string\n protocol: string\n baseUrl: string\n authScheme: string\n apiKeyHint: string | null\n hasApiKey: boolean\n enabled: boolean\n sort: number\n remark: string | null\n models: AiModelView[]\n}\n\n/**\n * 模型新增/编辑入参(后端 AiModelInput;id 为 `null` = 新增该行)。\n * 后端定义为位置式 record——字段在请求体里必须都存在(可以是 null),不能整键省略,\n * 这里特意都不带 `?`,免得页面代码漏填导致类型能过编译、实际发请求时字段缺失。\n */\nexport interface AiModelInput {\n id: number | null\n name: string\n displayName: string\n enabled: boolean\n isDefault: boolean\n contextWindow: number | null\n inputPrice: number | null\n outputPrice: number | null\n}\n\n/** 厂商新增入参(后端 AiProviderAddInput;code 仅新增时填,apiKey 传 null 由后端拒绝/提示未配置)。 */\nexport interface AiProviderAddInput {\n code: string\n name: string\n preset: string\n baseUrl: string\n authScheme: string\n apiKey: string | null\n sort: number\n remark: string | null\n models: AiModelInput[]\n}\n\n/** 厂商编辑入参(后端 AiProviderUpdateInput;无 code——编辑禁用;apiKey 传 null = 不修改现有 Key)。 */\nexport interface AiProviderUpdateInput {\n code: string\n name: string\n baseUrl: string\n authScheme: string\n apiKey: string | null\n sort: number\n remark: string | null\n models: AiModelInput[]\n}\n\n/** 厂商预置(GET /api/v1/sys/ai/provider/presets,静态表,表单下拉用)。 */\nexport interface AiModelPreset {\n name: string\n displayName: string\n contextWindow?: number | null\n}\n\n/** 厂商预置(后端 AiProviderPresets.cs 落定的 11 个 code)。 */\nexport interface AiProviderPreset {\n code: string\n name: string\n protocol: string\n baseUrl: string\n authScheme: string\n models: AiModelPreset[]\n}\n\n/**\n * 后端 AiUsageSource 是普通枚举,没配 JsonStringEnumConverter,序列化按数字下发(System.Text.Json 默认行为)。\n * 1=Reported(上游上报的真实用量),2=Missing(上游没给,记 0 或估算兜底)。\n */\nexport const AI_USAGE_SOURCE = { Reported: 1, Missing: 2 } as const\nexport type AiUsageSourceValue = 1 | 2\n\n/** 一次调用的 Token 用量(后端 AiUsage;source 标记数值是上游上报还是估算兜底)。 */\nexport interface AiUsage {\n inputTokens: number\n outputTokens: number\n totalTokens: number\n source: AiUsageSourceValue\n}\n\n/** 测试连接结果(后端 AiTestResult)。 */\nexport interface AiTestResult {\n ok: boolean\n model?: string | null\n latencyMs: number\n usage?: AiUsage | null\n error?: string | null\n}\n\n/**\n * 用量统计分组维度(后端 AiUsageGroupBy,普通枚举,查询参按数字下发/上送)。\n * 1=Provider、2=Model、3=Scene、4=User。\n */\nexport const AI_USAGE_GROUP_BY = { Provider: 1, Model: 2, Scene: 3, User: 4 } as const\nexport type AiUsageGroupBy = 1 | 2 | 3 | 4\n\n/** 用量统计四格指标(后端 AiUsageTotals;failuresByErrorCode 键为 ErrorCode 数值)。 */\nexport interface AiUsageTotals {\n totalTokens: number\n inputTokens: number\n outputTokens: number\n callCount: number\n failureCount: number\n failuresByErrorCode: Record<number, number>\n}\n\n/** 分组维度下的一行(后端 AiUsageGroupRow)。 */\nexport interface AiUsageGroupRow {\n key: string\n label?: string | null\n inputTokens: number\n outputTokens: number\n callCount: number\n sharePercent: number\n avgLatencyMs: number\n}\n\n/** 用量统计汇总(后端 AiUsageSummary)。 */\nexport interface AiUsageSummary {\n totals: AiUsageTotals\n groups: AiUsageGroupRow[]\n}\n\n/** 用量趋势的一天(后端 AiUsageTrendPoint)。 */\nexport interface AiUsageTrendPoint {\n date: string\n inputTokens: number\n outputTokens: number\n callCount: number\n}\n\n/** 用量明细行(后端 SysAiUsageLog;只读,分页项已含全字段)。 */\nexport interface SysAiUsageLog {\n id: number\n providerId: number\n providerCode: string\n model: string\n scene: string\n userId?: number | null\n inputTokens: number\n outputTokens: number\n totalTokens: number\n usageSource: AiUsageSourceValue\n latencyMs: number\n success: boolean\n errorCode?: number | null\n errorMessage?: string | null\n streamed: boolean\n requestId?: string | null\n createTime: string\n}\n"],"names":["DataScopeType","NoticeType","ReceiverType","DuplicateStrategy","JobHandlerKind","JobTriggerKind","JobMisfireStrategy","JobConcurrencyMode","JobStatus","JobRunStatus","JobFireMode","AI_USAGE_SOURCE","AI_USAGE_GROUP_BY"],"mappings":"AAmaO,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;AA0OL,MAAMC,IAAkB,EAAE,UAAU,GAAG,SAAS,EAAA,GAwB1CC,IAAoB,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,EAAA;"}