@oj-module/runtime 0.1.20 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,28 @@
1
+ /** 展示名:title 缺省回落机器名。 */
2
+ export declare function roleLabel(role: {
3
+ name: string;
4
+ title?: string | null;
5
+ }): string;
6
+ /** AC1-19:builtin 角色(superadmin/admin/editor/viewer)无绑定编辑入口。 */
7
+ export declare function canEditRoleBindings(role: {
8
+ builtin: boolean;
9
+ }): boolean;
10
+ /** AC1-19/20:删除入口——非 builtin 且当前无持有者(服务端 409 仍是权威判据)。 */
11
+ export declare function canDeleteRole(role: {
12
+ builtin: boolean;
13
+ holders: number;
14
+ }): boolean;
15
+ /** AC1-8:actor 能否把 roleName 分配给用户。 */
16
+ export declare function canAssignRole(actorRoles: string[], roleName: string): boolean;
17
+ /** 绑定编辑 diff(审计明细同款语义,AC1-28)。 */
18
+ export declare function bindingDiff(before: string[], after: string[]): {
19
+ added: string[];
20
+ removed: string[];
21
+ };
22
+ /** 按 module 分组(角色下拉/权限勾选的分组展示)。 */
23
+ export declare function groupByModule<T extends {
24
+ module: string;
25
+ }>(items: T[]): Array<{
26
+ module: string;
27
+ items: T[];
28
+ }>;
@@ -0,0 +1,43 @@
1
+ import type { AuthSessionPayload, LoginMethods, RbacContact, RbacOplogPage, RbacPermission, RbacRole, RbacSettingGroup, RbacUser } from "./types";
2
+ export * from "./types";
3
+ export declare const fetchRbacRoleList: () => Promise<RbacRole[]>;
4
+ export declare const fetchRbacPermissionList: () => Promise<RbacPermission[]>;
5
+ export declare const fetchRbacCreateRole: (body: {
6
+ name: string;
7
+ title: string;
8
+ permissions?: string[];
9
+ }) => Promise<unknown>;
10
+ export declare const fetchRbacUpdateBindings: (name: string, permissions: string[]) => Promise<unknown>;
11
+ export declare const fetchRbacDeleteRole: (name: string) => Promise<unknown>;
12
+ export declare const fetchRbacUserList: () => Promise<RbacUser[]>;
13
+ export declare const fetchRbacCreateUser: (body: {
14
+ username: string;
15
+ password: string;
16
+ displayName?: string;
17
+ email?: string;
18
+ }) => Promise<unknown>;
19
+ export declare const fetchRbacUpdateUserRoles: (uid: number, roles: string[]) => Promise<unknown>;
20
+ export declare const fetchRbacAdminResetPassword: (uid: number, password: string) => Promise<unknown>;
21
+ export declare const fetchRbacSetForbidden: (uid: number, forbidden: boolean) => Promise<unknown>;
22
+ export declare function fetchRbacOplog(query: {
23
+ action?: string;
24
+ username?: string;
25
+ module?: string;
26
+ limit?: number;
27
+ }): Promise<RbacOplogPage>;
28
+ export declare const fetchRbacSettings: () => Promise<RbacSettingGroup[]>;
29
+ export declare const fetchRbacUpdateSetting: (key: string, value: string) => Promise<unknown>;
30
+ export declare function fetchRbacContacts(keyword: string, limit?: number): Promise<RbacContact[]>;
31
+ export declare const fetchRbacContactDetail: (id: number) => Promise<RbacContact & {
32
+ email: string | null;
33
+ avatar_base64: string | null;
34
+ }>;
35
+ export declare const fetchLoginMethods: () => Promise<LoginMethods>;
36
+ export declare const fetchChangePassword: (body: {
37
+ old_password: string;
38
+ new_password: string;
39
+ }) => Promise<AuthSessionPayload>;
40
+ export declare const fetchLdapLogin: (body: {
41
+ username: string;
42
+ password: string;
43
+ }) => Promise<AuthSessionPayload>;
@@ -0,0 +1,81 @@
1
+ export interface RbacRole {
2
+ name: string;
3
+ module: string;
4
+ title: string | null;
5
+ description: string | null;
6
+ builtin: boolean;
7
+ deprecated: boolean;
8
+ holders: number;
9
+ permissions: string[];
10
+ }
11
+ export interface RbacPermission {
12
+ code: string;
13
+ module: string;
14
+ title_key: string | null;
15
+ deprecated: boolean;
16
+ }
17
+ export interface RbacUser {
18
+ id: number;
19
+ username: string;
20
+ display_name: string | null;
21
+ email: string | null;
22
+ is_forbidden: boolean;
23
+ must_change: boolean;
24
+ roles: string[];
25
+ }
26
+ export interface RbacOplogEntry {
27
+ id: number;
28
+ create_time: number;
29
+ user_id: number;
30
+ username: string;
31
+ action: string;
32
+ module: string;
33
+ version: string | null;
34
+ target: string | null;
35
+ detail: string | null;
36
+ level: number;
37
+ }
38
+ export interface RbacOplogPage {
39
+ list: RbacOplogEntry[];
40
+ total: number;
41
+ truncated: boolean;
42
+ }
43
+ export interface RbacContact {
44
+ id: number;
45
+ username: string;
46
+ display_name: string | null;
47
+ }
48
+ export interface RbacSettingItem {
49
+ key: string;
50
+ module: string;
51
+ group: string;
52
+ type: string;
53
+ value: string | null;
54
+ default_value: string | null;
55
+ label_key: string | null;
56
+ options: string | null;
57
+ secret: boolean;
58
+ update_time: number;
59
+ }
60
+ export interface RbacSettingGroup {
61
+ group: string;
62
+ items: RbacSettingItem[];
63
+ }
64
+ export interface LoginMethods {
65
+ methods: Array<"local" | "ldap" | "sso">;
66
+ }
67
+ /** 登录响应(auth/login、auth/refresh、auth/password 同形) */
68
+ export interface AuthSessionPayload {
69
+ access_token: string;
70
+ refresh_token: string;
71
+ expires_in: number;
72
+ restricted: boolean;
73
+ user: {
74
+ id: number;
75
+ username: string;
76
+ display_name: string | null;
77
+ avatar_base64: string | null;
78
+ must_change: boolean;
79
+ roles: string[];
80
+ };
81
+ }
@@ -17,6 +17,8 @@ export interface UserInfoType {
17
17
  roles: Array<string>;
18
18
  /** 权限码列表(后端下发;模块级 requiredPermissions 门禁消费,P7.12) */
19
19
  permissions?: Array<string>;
20
+ /** 首登须改密(AC1-27;后端 web/user-info 下发) */
21
+ mustChange?: boolean;
20
22
  menus?: AppRouteRecordRaw[];
21
23
  }
22
24
  export interface AuthListProps {
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 本页自己的页签 key(`removeTrailingSlash(pathname)`),供 `setTableTitle` /
3
+ * `resetTableTitle` / `addTab` 定位页签。
4
+ *
5
+ * keepAlive 陷阱:keepalive-for-react 把页面缓存在隐藏 portal 里,而 LocationContext
6
+ * 在 KeepAlive **之上**——切 tab 时缓存树随**激活页**位置重渲染,缓存页里的
7
+ * `useLocation()` 返回的是别家页签的路径。若拿它当页签 key,`setTableTitle` 会把
8
+ * 本页标题写到当前激活页签上(最后打开的文档页把之后切换到的每个页签都改成自己的标题)。
9
+ *
10
+ * 页签存活期内 key 不变(宿主 cacheKey = pathname+search,一页一路径),故首渲染
11
+ * (此时本页必是激活页)捕获一次即可;缓存树后续多少次重渲染都不会漂移。
12
+ * 需要跟随导航的位置信息请直接用 `useLocation`,不要用本 hook。
13
+ */
14
+ export declare function useTabKey(): string;
package/dist/index.d.ts CHANGED
@@ -11,6 +11,8 @@
11
11
  */
12
12
  import "./styles/index.css";
13
13
  export { notify } from "./api/notify";
14
+ export * from "./api/rbac";
15
+ export * from "./api/rbac/helpers";
14
16
  export * from "./api/system/menu";
15
17
  export * from "./api/system/role";
16
18
  export * from "./api/user";
@@ -26,6 +28,7 @@ export { PageError } from "./components/page-error";
26
28
  export * from "./constants/options";
27
29
  export * from "./hooks/use-access";
28
30
  export { usePreferences } from "./hooks/use-preferences";
31
+ export { useTabKey } from "./hooks/use-tab-key";
29
32
  export * from "./icons";
30
33
  export { LayoutEffects } from "./layout/layout-effects";
31
34
  export { setupI18n } from "./locales";
package/dist/runtime.js CHANGED
@@ -2,7 +2,7 @@
2
2
  if (typeof document !== "undefined" && !document.querySelector("style[data-ojm-runtime-css]")) {
3
3
  const s = document.createElement("style");
4
4
  s.setAttribute("data-ojm-runtime-css", "");
5
- s.textContent = "\n@layer properties, reset, antd;\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer reset{\n/* stylelint-disable */\nhtml,\nbody {\n width: 100%;\n height: 100%;\n}\ninput::-ms-clear,\ninput::-ms-reveal {\n display: none;\n}\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n margin: 0;\n}\n[tabindex='-1']:focus {\n outline: none;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n margin-bottom: 0.5em;\n font-weight: 500;\n}\np {\n margin-top: 0;\n margin-bottom: 1em;\n}\nabbr[title],\nabbr[data-original-title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n border-bottom: 0;\n cursor: help;\n}\naddress {\n margin-bottom: 1em;\n font-style: normal;\n line-height: inherit;\n}\ninput[type='text'],\ninput[type='password'],\ninput[type='number'],\ntextarea {\n -webkit-appearance: none;\n}\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1em;\n}\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\ndt {\n font-weight: 500;\n}\ndd {\n margin-bottom: 0.5em;\n margin-left: 0;\n}\nblockquote {\n margin: 0 0 1em;\n}\ndfn {\n font-style: italic;\n}\nb,\nstrong {\n font-weight: bolder;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\npre,\ncode,\nkbd,\nsamp {\n font-size: 1em;\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n}\npre {\n margin-top: 0;\n margin-bottom: 1em;\n overflow: auto;\n}\nfigure {\n margin: 0 0 1em;\n}\nimg {\n vertical-align: middle;\n border-style: none;\n}\na,\narea,\nbutton,\n[role='button'],\ninput:not([type='range']),\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\ntable {\n border-collapse: collapse;\n}\ncaption {\n padding-top: 0.75em;\n padding-bottom: 0.3em;\n text-align: left;\n caption-side: bottom;\n}\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n}\nbutton,\ninput {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml [type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button;\n}\nbutton::-moz-focus-inner,\n[type='button']::-moz-focus-inner,\n[type='reset']::-moz-focus-inner,\n[type='submit']::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\ninput[type='radio'],\ninput[type='checkbox'] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type='date'],\ninput[type='time'],\ninput[type='datetime-local'],\ninput[type='month'] {\n -webkit-appearance: listbox;\n}\ntextarea {\n overflow: auto;\n resize: vertical;\n}\nfieldset {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: 0.5em;\n padding: 0;\n color: inherit;\n font-size: 1.5em;\n line-height: inherit;\n white-space: normal;\n}\nprogress {\n vertical-align: baseline;\n}\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n height: auto;\n}\n[type='search'] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n[type='search']::-webkit-search-cancel-button,\n[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\noutput {\n display: inline-block;\n}\nsummary {\n display: list-item;\n}\ntemplate {\n display: none;\n}\n[hidden] {\n display: none !important;\n}\n}\n@layer simplebar{\n[data-simplebar]{position:relative;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:0}.simplebar-offset{direction:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:auto;max-width:100%;max-height:100%;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{display:none;width:0;height:0}.simplebar-content:after,.simplebar-content:before{content:' ';display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{box-sizing:inherit!important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;flex-grow:inherit;flex-shrink:0;flex-basis:0}.simplebar-height-auto-observer{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging{pointer-events:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;left:0;right:0;min-height:10px}.simplebar-scrollbar:before{position:absolute;content:'';background:#000;border-radius:7px;left:2px;right:2px;opacity:0;transition:opacity .2s .5s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;transition-delay:0s;transition-duration:0s}.simplebar-track.simplebar-vertical{top:0;width:11px}.simplebar-scrollbar:before{top:2px;bottom:2px;left:2px;right:2px}.simplebar-track.simplebar-horizontal{left:0;height:11px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:0;bottom:0;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.simplebar-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:scrollbar!important}.simplebar-dummy-scrollbar-size>div{width:200%;height:200%;margin:10px 0}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}\n}\n@layer simplebar {\n .simplebar-scrollbar:before {\n background-color: #909399;\n }\n\n .simplebar-content {\n height: 100%;\n }\n}\n\n#root {\n height: 100vh;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhtml.color-blind-mode {\n --tw-invert: invert(100%);\n filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );\n}\n\nhtml.gray-mode {\n --tw-grayscale: grayscale(100%);\n filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );\n}\n\n@layer theme {\n :root, :host {\n --font-sans: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", Arial,\n sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --spacing: .25rem;\n --container-md: 28rem;\n --text-xs: .75rem;\n --text-xs--line-height: calc(1 / .75);\n --text-sm: .875rem;\n --text-sm--line-height: calc(1.25 / .875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -.025em;\n --radius-sm: .25rem;\n --radius-md: .375rem;\n --radius-xl: .75rem;\n --ease-in: cubic-bezier(.4, 0, 1, 1);\n --animate-spin: spin 1s linear infinite;\n --default-transition-duration: .15s;\n --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);\n --animate-wiggle: wiggle 1s both;\n --animate-bounce-in-down-out-up: bounce-in-down-out-up 4s ease-in-out 0s infinite;\n }\n}\n\n@layer base, components;\n\n@layer utilities {\n .visible {\n visibility: visible;\n }\n\n .absolute {\n position: absolute;\n }\n\n .fixed {\n position: fixed;\n }\n\n .relative {\n position: relative;\n }\n\n .static {\n position: static;\n }\n\n .top-0 {\n top: 0;\n }\n\n .top-1\\.5 {\n top: calc(var(--spacing) * 1.5);\n }\n\n .top-2 {\n top: calc(var(--spacing) * 2);\n }\n\n .top-3 {\n top: calc(var(--spacing) * 3);\n }\n\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n\n .right-3 {\n right: calc(var(--spacing) * 3);\n }\n\n .right-4 {\n right: calc(var(--spacing) * 4);\n }\n\n .bottom-0 {\n bottom: 0;\n }\n\n .bottom-3 {\n bottom: calc(var(--spacing) * 3);\n }\n\n .left-0 {\n left: 0;\n }\n\n .left-1\\/2 {\n left: 50%;\n }\n\n .left-3 {\n left: calc(var(--spacing) * 3);\n }\n\n .z-10 {\n z-index: 10;\n }\n\n .container {\n width: 100%;\n }\n\n @media (min-width: 480px) {\n .container {\n max-width: 480px;\n }\n }\n\n @media (min-width: 576px) {\n .container {\n max-width: 576px;\n }\n }\n\n @media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n }\n\n @media (min-width: 992px) {\n .container {\n max-width: 992px;\n }\n }\n\n @media (min-width: 1200px) {\n .container {\n max-width: 1200px;\n }\n }\n\n @media (min-width: 1600px) {\n .container {\n max-width: 1600px;\n }\n }\n\n .m-0 {\n margin: 0;\n }\n\n .m-152 {\n margin: calc(var(--spacing) * 152);\n }\n\n .mx-3 {\n margin-inline: calc(var(--spacing) * 3);\n }\n\n .mx-4 {\n margin-inline: calc(var(--spacing) * 4);\n }\n\n .mx-auto {\n margin-inline: auto;\n }\n\n .my-0 {\n margin-block: 0;\n }\n\n .my-1 {\n margin-block: var(--spacing);\n }\n\n .my-4 {\n margin-block: calc(var(--spacing) * 4);\n }\n\n .my-8 {\n margin-block: calc(var(--spacing) * 8);\n }\n\n .mt-2 {\n margin-top: calc(var(--spacing) * 2);\n }\n\n .mt-2\\.5 {\n margin-top: calc(var(--spacing) * 2.5);\n }\n\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n\n .mt-6 {\n margin-top: calc(var(--spacing) * 6);\n }\n\n .mr-2 {\n margin-right: calc(var(--spacing) * 2);\n }\n\n .mr-3 {\n margin-right: calc(var(--spacing) * 3);\n }\n\n .mr-8 {\n margin-right: calc(var(--spacing) * 8);\n }\n\n .mr-17 {\n margin-right: calc(var(--spacing) * 17);\n }\n\n .mb-0 {\n margin-bottom: 0;\n }\n\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n\n .ml-2 {\n margin-left: calc(var(--spacing) * 2);\n }\n\n .ml-4 {\n margin-left: calc(var(--spacing) * 4);\n }\n\n .box-border {\n box-sizing: border-box;\n }\n\n .line-clamp-2 {\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n overflow: hidden;\n }\n\n .block {\n display: block;\n }\n\n .flex {\n display: flex;\n }\n\n .hidden {\n display: none;\n }\n\n .inline {\n display: inline;\n }\n\n .inline-block {\n display: inline-block;\n }\n\n .table {\n display: table;\n }\n\n .aspect-square {\n aspect-ratio: 1;\n }\n\n .size-5 {\n width: calc(var(--spacing) * 5);\n height: calc(var(--spacing) * 5);\n }\n\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n\n .h-64 {\n height: calc(var(--spacing) * 64);\n }\n\n .h-\\[0\\.63em\\] {\n height: .63em;\n }\n\n .h-full {\n height: 100%;\n }\n\n .h-screen {\n height: 100vh;\n }\n\n .w-1\\/3 {\n width: 33.3333%;\n }\n\n .w-2 {\n width: calc(var(--spacing) * 2);\n }\n\n .w-2\\/5 {\n width: 40%;\n }\n\n .w-7\\/12 {\n width: 58.3333%;\n }\n\n .w-10 {\n width: calc(var(--spacing) * 10);\n }\n\n .w-11 {\n width: calc(var(--spacing) * 11);\n }\n\n .w-12 {\n width: calc(var(--spacing) * 12);\n }\n\n .w-40 {\n width: calc(var(--spacing) * 40);\n }\n\n .w-72 {\n width: calc(var(--spacing) * 72);\n }\n\n .w-full {\n width: 100%;\n }\n\n .max-w-90 {\n max-width: calc(var(--spacing) * 90);\n }\n\n .min-w-0 {\n min-width: 0;\n }\n\n .flex-1 {\n flex: 1;\n }\n\n .flex-auto {\n flex: auto;\n }\n\n .flex-shrink-0, .shrink-0 {\n flex-shrink: 0;\n }\n\n .grow {\n flex-grow: 1;\n }\n\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n\n .scale-75 {\n --tw-scale-x: 75%;\n --tw-scale-y: 75%;\n --tw-scale-z: 75%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n\n .transform {\n transform: var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, );\n }\n\n .animate-spin {\n animation: var(--animate-spin);\n }\n\n .cursor-help {\n cursor: help;\n }\n\n .cursor-pointer {\n cursor: pointer;\n }\n\n .list-none {\n list-style-type: none;\n }\n\n .flex-col {\n flex-direction: column;\n }\n\n .flex-row-reverse {\n flex-direction: row-reverse;\n }\n\n .flex-wrap {\n flex-wrap: wrap;\n }\n\n .items-center {\n align-items: center;\n }\n\n .justify-between {\n justify-content: space-between;\n }\n\n .justify-center {\n justify-content: center;\n }\n\n .justify-start {\n justify-content: flex-start;\n }\n\n .gap-1 {\n gap: var(--spacing);\n }\n\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n\n .gap-5 {\n gap: calc(var(--spacing) * 5);\n }\n\n .gap-x-3 {\n column-gap: calc(var(--spacing) * 3);\n }\n\n .gap-y-5 {\n row-gap: calc(var(--spacing) * 5);\n }\n\n .overflow-hidden {\n overflow: hidden;\n }\n\n .overflow-x-hidden {\n overflow-x: hidden;\n }\n\n .overflow-y-auto {\n overflow-y: auto;\n }\n\n .rounded {\n border-radius: .25rem;\n }\n\n .rounded-full {\n border-radius: 3.40282e38px;\n }\n\n .rounded-md {\n border-radius: var(--radius-md);\n }\n\n .rounded-none {\n border-radius: 0;\n }\n\n .rounded-sm {\n border-radius: var(--radius-sm);\n }\n\n .rounded-r-xl {\n border-top-right-radius: var(--radius-xl);\n border-bottom-right-radius: var(--radius-xl);\n }\n\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n\n .border-l {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n\n .\\!border-none {\n --tw-border-style: none !important;\n border-style: none !important;\n }\n\n .border-t-\\[\\#303030\\] {\n border-top-color: #303030;\n }\n\n .border-t-colorBorderSecondary {\n border-top-color: var(--oo-colorBorderSecondary);\n }\n\n .border-r-\\[\\#303030\\] {\n border-right-color: #303030;\n }\n\n .border-r-colorBorderSecondary {\n border-right-color: var(--oo-colorBorderSecondary);\n }\n\n .border-l-colorBorderSecondary {\n border-left-color: var(--oo-colorBorderSecondary);\n }\n\n .bg-\\[\\#F3F4F5\\] {\n background-color: #f3f4f5;\n }\n\n .bg-blue-500\\/20 {\n background-color: rgb(var(--oo-blue-5));\n }\n\n @supports (color: color-mix(in lab, red, red)) {\n .bg-blue-500\\/20 {\n background-color: color-mix(in oklab, rgb(var(--oo-blue-5)) 20%, transparent);\n }\n }\n\n .bg-blue-600 {\n background-color: rgb(var(--oo-blue-6));\n }\n\n .bg-colorBgContainer {\n background-color: var(--oo-colorBgContainer);\n }\n\n .bg-colorBgLayout {\n background-color: var(--oo-colorBgLayout);\n }\n\n .bg-gray-100 {\n background-color: #f5f5f5;\n }\n\n .bg-primary {\n background-color: rgb(var(--oo-colorPrimary));\n }\n\n .bg-primaryActive {\n background-color: rgb(var(--oo-colorPrimaryActive));\n }\n\n .object-cover {\n object-fit: cover;\n }\n\n .p-0 {\n padding: 0;\n }\n\n .p-1 {\n padding: var(--spacing);\n }\n\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n\n .px-0 {\n padding-inline: 0;\n }\n\n .px-1 {\n padding-inline: var(--spacing);\n }\n\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n\n .px-2\\.75 {\n padding-inline: calc(var(--spacing) * 2.75);\n }\n\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n\n .px-9 {\n padding-inline: calc(var(--spacing) * 9);\n }\n\n .px-10 {\n padding-inline: calc(var(--spacing) * 10);\n }\n\n .px-\\[11px\\] {\n padding-inline: 11px;\n }\n\n .py-1 {\n padding-block: var(--spacing);\n }\n\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n\n .py-2\\.5 {\n padding-block: calc(var(--spacing) * 2.5);\n }\n\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n\n .py-10 {\n padding-block: calc(var(--spacing) * 10);\n }\n\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n\n .pl-2 {\n padding-left: calc(var(--spacing) * 2);\n }\n\n .text-center {\n text-align: center;\n }\n\n .font-sans {\n font-family: var(--font-sans);\n }\n\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n\n .text-\\[4rem\\] {\n font-size: 4rem;\n }\n\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n\n .tracking-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n\n .text-colorBgContainer {\n color: var(--oo-colorBgContainer);\n }\n\n .text-colorBgContainer\\! {\n color: var(--oo-colorBgContainer) !important;\n }\n\n .text-colorText {\n color: var(--oo-colorText);\n }\n\n .text-colorText\\! {\n color: var(--oo-colorText) !important;\n }\n\n .text-colorTextSecondary {\n color: var(--oo-colorTextSecondary);\n }\n\n .text-colorTextTertiary {\n color: var(--oo-colorTextTertiary);\n }\n\n .opacity-50 {\n opacity: .5;\n }\n\n .opacity-90 {\n opacity: .9;\n }\n\n .outline, .outline-1 {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n\n .outline-2 {\n outline-style: var(--tw-outline-style);\n outline-width: 2px;\n }\n\n .outline-blue-600 {\n outline-color: rgb(var(--oo-blue-6));\n }\n\n .outline-gray-300 {\n outline-color: #d9d9d9;\n }\n\n .filter {\n filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );\n }\n\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n\n .duration-300 {\n --tw-duration: .3s;\n transition-duration: .3s;\n }\n\n .ease-in {\n --tw-ease: var(--ease-in);\n transition-timing-function: var(--ease-in);\n }\n\n @media (hover: hover) {\n .group-hover\\:animate-wiggle:is(:where(.group):hover *) {\n animation: var(--animate-wiggle);\n }\n\n .group-hover\\:opacity-100:is(:where(.group):hover *) {\n opacity: 1;\n }\n }\n\n .before\\:absolute:before {\n content: var(--tw-content);\n position: absolute;\n }\n\n .before\\:top-1\\/2:before {\n content: var(--tw-content);\n top: 50%;\n }\n\n .before\\:left-1\\/2:before {\n content: var(--tw-content);\n left: 50%;\n }\n\n .before\\:h-0:before {\n content: var(--tw-content);\n height: 0;\n }\n\n .before\\:w-0:before {\n content: var(--tw-content);\n width: 0;\n }\n\n .before\\:rounded-sm:before {\n content: var(--tw-content);\n border-radius: var(--radius-sm);\n }\n\n .before\\:opacity-0:before {\n content: var(--tw-content);\n opacity: 0;\n }\n\n .before\\:outline:before {\n content: var(--tw-content);\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n\n .before\\:outline-2:before {\n content: var(--tw-content);\n outline-style: var(--tw-outline-style);\n outline-width: 2px;\n }\n\n .before\\:outline-transparent:before {\n content: var(--tw-content);\n outline-color: #0000;\n }\n\n .before\\:transition-all:before {\n content: var(--tw-content);\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n\n .before\\:duration-300:before {\n content: var(--tw-content);\n --tw-duration: .3s;\n transition-duration: .3s;\n }\n\n .before\\:content-\\[\\'\\'\\]:before {\n --tw-content: \"\";\n content: var(--tw-content);\n }\n\n .last\\:mr-auto:last-child {\n margin-right: auto;\n }\n\n @media (hover: hover) {\n .hover\\:bg-gray-100:hover {\n background-color: #f5f5f5;\n }\n\n .hover\\:text-colorText:hover {\n color: var(--oo-colorText);\n }\n }\n\n .before\\:hover\\:top-0:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:top-0:before:hover {\n top: 0;\n }\n }\n\n .before\\:hover\\:left-0:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:left-0:before:hover {\n left: 0;\n }\n }\n\n .before\\:hover\\:h-full:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:h-full:before:hover {\n height: 100%;\n }\n }\n\n .before\\:hover\\:w-full:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:w-full:before:hover {\n width: 100%;\n }\n }\n\n .before\\:hover\\:p-1:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:p-1:before:hover {\n padding: var(--spacing);\n }\n }\n\n .before\\:hover\\:opacity-100:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:opacity-100:before:hover {\n opacity: 1;\n }\n }\n\n .before\\:hover\\:outline-blue-600:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:outline-blue-600:before:hover {\n outline-color: rgb(var(--oo-blue-6));\n }\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .motion-safe\\:animate-bounce-in-down-out-up {\n animation: var(--animate-bounce-in-down-out-up);\n }\n }\n\n @media (min-width: 576px) {\n .sm\\:mx-auto {\n margin-inline: auto;\n }\n }\n\n @media (min-width: 768px) {\n .md\\:mr-2\\.5 {\n margin-right: calc(var(--spacing) * 2.5);\n }\n\n .md\\:block {\n display: block;\n }\n\n .md\\:w-3\\/12 {\n width: 25%;\n }\n\n .md\\:w-96 {\n width: calc(var(--spacing) * 96);\n }\n\n .md\\:max-w-md {\n max-width: var(--container-md);\n }\n\n .md\\:bg-colorBgLayout {\n background-color: var(--oo-colorBgLayout);\n }\n\n .md\\:px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n\n .md\\:pb-0 {\n padding-bottom: 0;\n }\n\n .md\\:text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n\n @media (min-width: 992px) {\n .lg\\:text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n }\n\n @media (min-width: 1200px) {\n .xl\\:w-2\\/12 {\n width: 16.6667%;\n }\n\n .xl\\:px-8 {\n padding-inline: calc(var(--spacing) * 8);\n }\n }\n\n .dark\\:bg-\\[\\#26313C\\]:where(.dark, .dark *) {\n background-color: #26313c;\n }\n\n .dark\\:bg-black:where(.dark, .dark *) {\n background-color: #000;\n }\n\n .dark\\:bg-gray-700:where(.dark, .dark *) {\n background-color: #434343;\n }\n\n .dark\\:outline-blue-700:where(.dark, .dark *) {\n outline-color: rgb(var(--oo-blue-7));\n }\n\n .dark\\:outline-gray-700:where(.dark, .dark *) {\n outline-color: #434343;\n }\n\n @media (hover: hover) {\n .dark\\:hover\\:bg-gray-700:where(.dark, .dark *):hover {\n background-color: #434343;\n }\n }\n\n .dark\\:before\\:hover\\:outline-blue-700:where(.dark, .dark *):before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .dark\\:before\\:hover\\:outline-blue-700:where(.dark, .dark *):before:hover {\n outline-color: rgb(var(--oo-blue-7));\n }\n }\n\n .en-US\\:gap-y-3:where(:lang(en-US)) {\n row-gap: calc(var(--spacing) * 3);\n }\n\n .en-US\\:text-\\[9rem\\]:where(:lang(en-US)) {\n font-size: 9rem;\n }\n\n .zh-CN\\:hidden:where(:lang(zh-CN)) {\n display: none;\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes fade-out {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n\n@keyframes slide-in {\n from {\n transform: translateX(-30px);\n }\n\n to {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-out {\n from {\n transform: translateX(0);\n }\n\n to {\n transform: translateX(30px);\n }\n}\n\n@keyframes slide-top-in {\n from {\n transform: translateY(-10%);\n }\n\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes slide-top-out {\n from {\n transform: translateY(0);\n }\n\n to {\n transform: translateY(-10%);\n }\n}\n\n@keyframes slide-bottom-in {\n from {\n transform: translateY(10%);\n }\n\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes slide-bottom-out {\n from {\n transform: translateY(0);\n }\n\n to {\n transform: translateY(10%);\n }\n}\n\n@keyframes fade-slide {\n 0% {\n opacity: 0;\n transform: translate(-30px);\n }\n\n 50% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n transform: translate(30px);\n }\n}\n\n@keyframes fade-up {\n 0% {\n opacity: 0;\n transform: translateY(10%);\n }\n\n 50% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n transform: translateY(-10%);\n }\n}\n\n@keyframes fade-down {\n 0% {\n opacity: 0;\n transform: translateY(-10%);\n }\n\n 50% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n transform: translateY(10%);\n }\n}\n\n.fade-slide {\n animation: 3s linear infinite fade-slide;\n}\n\n.fade {\n animation: 3s linear infinite alternate fade-in;\n}\n\n.fade-up {\n animation: 3s infinite fade-up;\n}\n\n.fade-down {\n animation: 3s infinite fade-down;\n}\n\n@keyframes zoom-in {\n 0% {\n transform: scale(.8);\n }\n\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes zoom-out {\n 0% {\n transform: scale(1);\n }\n\n 100% {\n opacity: 1;\n transform: scale(1.25);\n }\n}\n\n@keyframes fade-zoom {\n 0% {\n opacity: 0;\n transform: scale(.8);\n }\n\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n\n 100% {\n opacity: 0;\n transform: scale(1.25);\n }\n}\n\n.fade-zoom {\n animation: 3s infinite fade-zoom;\n}\n\n.keepalive-fade.active {\n animation: .3s ease-in-out fade-in;\n}\n\n.keepalive-fade.inactive {\n animation: .3s ease-in-out fade-out;\n}\n\n.keepalive-fade-slide.active {\n animation: .3s ease-in-out fade-in, .3s ease-in-out slide-in;\n}\n\n.keepalive-fade-slide.inactive {\n animation: .3s ease-in-out fade-out, .3s ease-in-out slide-out;\n}\n\n.keepalive-fade-up.active {\n animation: .3s ease-in-out fade-in, .3s ease-in-out slide-bottom-in;\n}\n\n.keepalive-fade-up.inactive {\n animation: .3s ease-in-out fade-out, .3s ease-in-out slide-top-out;\n}\n\n.keepalive-fade-down.active {\n animation: .3s ease-in-out fade-in, .3s ease-in-out slide-top-in;\n}\n\n.keepalive-fade-down.inactive {\n animation: .3s ease-in-out fade-out, .3s ease-in-out slide-bottom-out;\n}\n\n.keepalive-fade-zoom.active {\n animation: .3s ease-in-out zoom-in, .3s ease-in-out zoom-in;\n}\n\n.keepalive-fade-zoom.inactive {\n animation: .3s ease-in-out zoom-out, .3s ease-in-out fade-out;\n}\n\n@property --tw-blur {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-brightness {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-contrast {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-grayscale {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-hue-rotate {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-invert {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-opacity {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-saturate {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-sepia {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-drop-shadow {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-drop-shadow-color {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-drop-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n\n@property --tw-drop-shadow-size {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n\n@property --tw-leading {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n\n@property --tw-duration {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-ease {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-content {\n syntax: \"*\";\n inherits: false;\n initial-value: \"\";\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes wiggle {\n 0%, 100% {\n transform-origin: top;\n }\n\n 15% {\n transform: rotateZ(10deg);\n }\n\n 30% {\n transform: rotateZ(-10deg);\n }\n\n 45% {\n transform: rotateZ(5deg);\n }\n\n 60% {\n transform: rotateZ(-5deg);\n }\n\n 75% {\n transform: rotateZ(2deg);\n }\n}\n\n@keyframes bounce-in-down-out-up {\n 0% {\n transform: translateY(0);\n }\n\n 50% {\n transform: translateY(-20px);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n\n@layer properties {\n @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {\n *, :before, :after, ::backdrop {\n --tw-blur: initial;\n --tw-brightness: initial;\n --tw-contrast: initial;\n --tw-grayscale: initial;\n --tw-hue-rotate: initial;\n --tw-invert: initial;\n --tw-opacity: initial;\n --tw-saturate: initial;\n --tw-sepia: initial;\n --tw-drop-shadow: initial;\n --tw-drop-shadow-color: initial;\n --tw-drop-shadow-alpha: 100%;\n --tw-drop-shadow-size: initial;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-outline-style: solid;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-content: \"\";\n }\n }\n}\n/*$vite$:1*/";
5
+ s.textContent = "\n@layer properties, reset, antd;\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer reset{\n/* stylelint-disable */\nhtml,\nbody {\n width: 100%;\n height: 100%;\n}\ninput::-ms-clear,\ninput::-ms-reveal {\n display: none;\n}\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n margin: 0;\n}\n[tabindex='-1']:focus {\n outline: none;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0;\n margin-bottom: 0.5em;\n font-weight: 500;\n}\np {\n margin-top: 0;\n margin-bottom: 1em;\n}\nabbr[title],\nabbr[data-original-title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n border-bottom: 0;\n cursor: help;\n}\naddress {\n margin-bottom: 1em;\n font-style: normal;\n line-height: inherit;\n}\ninput[type='text'],\ninput[type='password'],\ninput[type='number'],\ntextarea {\n -webkit-appearance: none;\n}\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1em;\n}\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\ndt {\n font-weight: 500;\n}\ndd {\n margin-bottom: 0.5em;\n margin-left: 0;\n}\nblockquote {\n margin: 0 0 1em;\n}\ndfn {\n font-style: italic;\n}\nb,\nstrong {\n font-weight: bolder;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsub {\n bottom: -0.25em;\n}\nsup {\n top: -0.5em;\n}\npre,\ncode,\nkbd,\nsamp {\n font-size: 1em;\n font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;\n}\npre {\n margin-top: 0;\n margin-bottom: 1em;\n overflow: auto;\n}\nfigure {\n margin: 0 0 1em;\n}\nimg {\n vertical-align: middle;\n border-style: none;\n}\na,\narea,\nbutton,\n[role='button'],\ninput:not([type='range']),\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\ntable {\n border-collapse: collapse;\n}\ncaption {\n padding-top: 0.75em;\n padding-bottom: 0.3em;\n text-align: left;\n caption-side: bottom;\n}\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n color: inherit;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n}\nbutton,\ninput {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml [type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button;\n}\nbutton::-moz-focus-inner,\n[type='button']::-moz-focus-inner,\n[type='reset']::-moz-focus-inner,\n[type='submit']::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\ninput[type='radio'],\ninput[type='checkbox'] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type='date'],\ninput[type='time'],\ninput[type='datetime-local'],\ninput[type='month'] {\n -webkit-appearance: listbox;\n}\ntextarea {\n overflow: auto;\n resize: vertical;\n}\nfieldset {\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: 0.5em;\n padding: 0;\n color: inherit;\n font-size: 1.5em;\n line-height: inherit;\n white-space: normal;\n}\nprogress {\n vertical-align: baseline;\n}\n[type='number']::-webkit-inner-spin-button,\n[type='number']::-webkit-outer-spin-button {\n height: auto;\n}\n[type='search'] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n[type='search']::-webkit-search-cancel-button,\n[type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\noutput {\n display: inline-block;\n}\nsummary {\n display: list-item;\n}\ntemplate {\n display: none;\n}\n[hidden] {\n display: none !important;\n}\n}\n@layer simplebar{\n[data-simplebar]{position:relative;flex-direction:column;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}.simplebar-wrapper{overflow:hidden;width:inherit;height:inherit;max-width:inherit;max-height:inherit}.simplebar-mask{direction:inherit;position:absolute;overflow:hidden;padding:0;margin:0;left:0;top:0;bottom:0;right:0;width:auto!important;height:auto!important;z-index:0}.simplebar-offset{direction:inherit!important;box-sizing:inherit!important;resize:none!important;position:absolute;top:0;left:0;bottom:0;right:0;padding:0;margin:0;-webkit-overflow-scrolling:touch}.simplebar-content-wrapper{direction:inherit;box-sizing:border-box!important;position:relative;display:block;height:100%;width:auto;max-width:100%;max-height:100%;overflow:auto;scrollbar-width:none;-ms-overflow-style:none}.simplebar-content-wrapper::-webkit-scrollbar,.simplebar-hide-scrollbar::-webkit-scrollbar{display:none;width:0;height:0}.simplebar-content:after,.simplebar-content:before{content:' ';display:table}.simplebar-placeholder{max-height:100%;max-width:100%;width:100%;pointer-events:none}.simplebar-height-auto-observer-wrapper{box-sizing:inherit!important;height:100%;width:100%;max-width:1px;position:relative;float:left;max-height:1px;overflow:hidden;z-index:-1;padding:0;margin:0;pointer-events:none;flex-grow:inherit;flex-shrink:0;flex-basis:0}.simplebar-height-auto-observer{box-sizing:inherit;display:block;opacity:0;position:absolute;top:0;left:0;height:1000%;width:1000%;min-height:1px;min-width:1px;overflow:hidden;pointer-events:none;z-index:-1}.simplebar-track{z-index:1;position:absolute;right:0;bottom:0;pointer-events:none;overflow:hidden}[data-simplebar].simplebar-dragging{pointer-events:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-simplebar].simplebar-dragging .simplebar-content{pointer-events:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[data-simplebar].simplebar-dragging .simplebar-track{pointer-events:all}.simplebar-scrollbar{position:absolute;left:0;right:0;min-height:10px}.simplebar-scrollbar:before{position:absolute;content:'';background:#000;border-radius:7px;left:2px;right:2px;opacity:0;transition:opacity .2s .5s linear}.simplebar-scrollbar.simplebar-visible:before{opacity:.5;transition-delay:0s;transition-duration:0s}.simplebar-track.simplebar-vertical{top:0;width:11px}.simplebar-scrollbar:before{top:2px;bottom:2px;left:2px;right:2px}.simplebar-track.simplebar-horizontal{left:0;height:11px}.simplebar-track.simplebar-horizontal .simplebar-scrollbar{right:auto;left:0;top:0;bottom:0;min-height:0;min-width:10px;width:auto}[data-simplebar-direction=rtl] .simplebar-track.simplebar-vertical{right:auto;left:0}.simplebar-dummy-scrollbar-size{direction:rtl;position:fixed;opacity:0;visibility:hidden;height:500px;width:500px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:scrollbar!important}.simplebar-dummy-scrollbar-size>div{width:200%;height:200%;margin:10px 0}.simplebar-hide-scrollbar{position:fixed;left:0;visibility:hidden;overflow-y:scroll;scrollbar-width:none;-ms-overflow-style:none}\n}\n@layer simplebar {\n .simplebar-scrollbar:before {\n background-color: #909399;\n }\n\n .simplebar-content {\n height: 100%;\n }\n}\n\n#root {\n height: 100vh;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhtml.color-blind-mode {\n --tw-invert: invert(100%);\n filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );\n}\n\nhtml.gray-mode {\n --tw-grayscale: grayscale(100%);\n filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );\n}\n\n@layer theme {\n :root, :host {\n --font-sans: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", Arial,\n sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --spacing: .25rem;\n --container-md: 28rem;\n --text-xs: .75rem;\n --text-xs--line-height: calc(1 / .75);\n --text-sm: .875rem;\n --text-sm--line-height: calc(1.25 / .875);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --tracking-tight: -.025em;\n --radius-sm: .25rem;\n --radius-md: .375rem;\n --radius-xl: .75rem;\n --ease-in: cubic-bezier(.4, 0, 1, 1);\n --animate-spin: spin 1s linear infinite;\n --default-transition-duration: .15s;\n --default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);\n --animate-wiggle: wiggle 1s both;\n --animate-bounce-in-down-out-up: bounce-in-down-out-up 4s ease-in-out 0s infinite;\n }\n}\n\n@layer base, components;\n\n@layer utilities {\n .visible {\n visibility: visible;\n }\n\n .absolute {\n position: absolute;\n }\n\n .fixed {\n position: fixed;\n }\n\n .relative {\n position: relative;\n }\n\n .static {\n position: static;\n }\n\n .top-0 {\n top: 0;\n }\n\n .top-1\\.5 {\n top: calc(var(--spacing) * 1.5);\n }\n\n .top-2 {\n top: calc(var(--spacing) * 2);\n }\n\n .top-3 {\n top: calc(var(--spacing) * 3);\n }\n\n .right-2 {\n right: calc(var(--spacing) * 2);\n }\n\n .right-3 {\n right: calc(var(--spacing) * 3);\n }\n\n .right-4 {\n right: calc(var(--spacing) * 4);\n }\n\n .bottom-0 {\n bottom: 0;\n }\n\n .bottom-3 {\n bottom: calc(var(--spacing) * 3);\n }\n\n .left-0 {\n left: 0;\n }\n\n .left-1\\/2 {\n left: 50%;\n }\n\n .left-3 {\n left: calc(var(--spacing) * 3);\n }\n\n .z-10 {\n z-index: 10;\n }\n\n .container {\n width: 100%;\n }\n\n @media (min-width: 480px) {\n .container {\n max-width: 480px;\n }\n }\n\n @media (min-width: 576px) {\n .container {\n max-width: 576px;\n }\n }\n\n @media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n }\n\n @media (min-width: 992px) {\n .container {\n max-width: 992px;\n }\n }\n\n @media (min-width: 1200px) {\n .container {\n max-width: 1200px;\n }\n }\n\n @media (min-width: 1600px) {\n .container {\n max-width: 1600px;\n }\n }\n\n .m-0 {\n margin: 0;\n }\n\n .m-152 {\n margin: calc(var(--spacing) * 152);\n }\n\n .mx-3 {\n margin-inline: calc(var(--spacing) * 3);\n }\n\n .mx-4 {\n margin-inline: calc(var(--spacing) * 4);\n }\n\n .mx-auto {\n margin-inline: auto;\n }\n\n .my-0 {\n margin-block: 0;\n }\n\n .my-1 {\n margin-block: var(--spacing);\n }\n\n .my-4 {\n margin-block: calc(var(--spacing) * 4);\n }\n\n .my-8 {\n margin-block: calc(var(--spacing) * 8);\n }\n\n .mt-2 {\n margin-top: calc(var(--spacing) * 2);\n }\n\n .mt-2\\.5 {\n margin-top: calc(var(--spacing) * 2.5);\n }\n\n .mt-4 {\n margin-top: calc(var(--spacing) * 4);\n }\n\n .mt-6 {\n margin-top: calc(var(--spacing) * 6);\n }\n\n .mr-2 {\n margin-right: calc(var(--spacing) * 2);\n }\n\n .mr-3 {\n margin-right: calc(var(--spacing) * 3);\n }\n\n .mr-8 {\n margin-right: calc(var(--spacing) * 8);\n }\n\n .mr-17 {\n margin-right: calc(var(--spacing) * 17);\n }\n\n .mb-0 {\n margin-bottom: 0;\n }\n\n .mb-2 {\n margin-bottom: calc(var(--spacing) * 2);\n }\n\n .mb-3 {\n margin-bottom: calc(var(--spacing) * 3);\n }\n\n .mb-6 {\n margin-bottom: calc(var(--spacing) * 6);\n }\n\n .ml-2 {\n margin-left: calc(var(--spacing) * 2);\n }\n\n .ml-4 {\n margin-left: calc(var(--spacing) * 4);\n }\n\n .box-border {\n box-sizing: border-box;\n }\n\n .line-clamp-2 {\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n overflow: hidden;\n }\n\n .block {\n display: block;\n }\n\n .flex {\n display: flex;\n }\n\n .hidden {\n display: none;\n }\n\n .inline {\n display: inline;\n }\n\n .inline-block {\n display: inline-block;\n }\n\n .table {\n display: table;\n }\n\n .aspect-square {\n aspect-ratio: 1;\n }\n\n .size-5 {\n width: calc(var(--spacing) * 5);\n height: calc(var(--spacing) * 5);\n }\n\n .h-2 {\n height: calc(var(--spacing) * 2);\n }\n\n .h-5 {\n height: calc(var(--spacing) * 5);\n }\n\n .h-10 {\n height: calc(var(--spacing) * 10);\n }\n\n .h-64 {\n height: calc(var(--spacing) * 64);\n }\n\n .h-\\[0\\.63em\\] {\n height: .63em;\n }\n\n .h-full {\n height: 100%;\n }\n\n .h-screen {\n height: 100vh;\n }\n\n .w-1\\/3 {\n width: 33.3333%;\n }\n\n .w-2 {\n width: calc(var(--spacing) * 2);\n }\n\n .w-2\\/5 {\n width: 40%;\n }\n\n .w-7\\/12 {\n width: 58.3333%;\n }\n\n .w-10 {\n width: calc(var(--spacing) * 10);\n }\n\n .w-11 {\n width: calc(var(--spacing) * 11);\n }\n\n .w-12 {\n width: calc(var(--spacing) * 12);\n }\n\n .w-40 {\n width: calc(var(--spacing) * 40);\n }\n\n .w-72 {\n width: calc(var(--spacing) * 72);\n }\n\n .w-full {\n width: 100%;\n }\n\n .max-w-90 {\n max-width: calc(var(--spacing) * 90);\n }\n\n .min-w-0 {\n min-width: 0;\n }\n\n .flex-1 {\n flex: 1;\n }\n\n .flex-auto {\n flex: auto;\n }\n\n .flex-shrink-0, .shrink-0 {\n flex-shrink: 0;\n }\n\n .grow {\n flex-grow: 1;\n }\n\n .-translate-x-1\\/2 {\n --tw-translate-x: calc(calc(1 / 2 * 100%) * -1);\n translate: var(--tw-translate-x) var(--tw-translate-y);\n }\n\n .scale-75 {\n --tw-scale-x: 75%;\n --tw-scale-y: 75%;\n --tw-scale-z: 75%;\n scale: var(--tw-scale-x) var(--tw-scale-y);\n }\n\n .transform {\n transform: var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, );\n }\n\n .animate-spin {\n animation: var(--animate-spin);\n }\n\n .cursor-help {\n cursor: help;\n }\n\n .cursor-pointer {\n cursor: pointer;\n }\n\n .list-none {\n list-style-type: none;\n }\n\n .flex-col {\n flex-direction: column;\n }\n\n .flex-row-reverse {\n flex-direction: row-reverse;\n }\n\n .flex-wrap {\n flex-wrap: wrap;\n }\n\n .items-center {\n align-items: center;\n }\n\n .justify-between {\n justify-content: space-between;\n }\n\n .justify-center {\n justify-content: center;\n }\n\n .justify-start {\n justify-content: flex-start;\n }\n\n .gap-1 {\n gap: var(--spacing);\n }\n\n .gap-2 {\n gap: calc(var(--spacing) * 2);\n }\n\n .gap-3 {\n gap: calc(var(--spacing) * 3);\n }\n\n .gap-5 {\n gap: calc(var(--spacing) * 5);\n }\n\n .gap-x-3 {\n column-gap: calc(var(--spacing) * 3);\n }\n\n .gap-y-5 {\n row-gap: calc(var(--spacing) * 5);\n }\n\n .overflow-hidden {\n overflow: hidden;\n }\n\n .overflow-x-auto {\n overflow-x: auto;\n }\n\n .overflow-x-hidden {\n overflow-x: hidden;\n }\n\n .overflow-y-auto {\n overflow-y: auto;\n }\n\n .rounded {\n border-radius: .25rem;\n }\n\n .rounded-full {\n border-radius: 3.40282e38px;\n }\n\n .rounded-md {\n border-radius: var(--radius-md);\n }\n\n .rounded-none {\n border-radius: 0;\n }\n\n .rounded-sm {\n border-radius: var(--radius-sm);\n }\n\n .rounded-r-xl {\n border-top-right-radius: var(--radius-xl);\n border-bottom-right-radius: var(--radius-xl);\n }\n\n .border {\n border-style: var(--tw-border-style);\n border-width: 1px;\n }\n\n .border-t {\n border-top-style: var(--tw-border-style);\n border-top-width: 1px;\n }\n\n .border-r {\n border-right-style: var(--tw-border-style);\n border-right-width: 1px;\n }\n\n .border-l {\n border-left-style: var(--tw-border-style);\n border-left-width: 1px;\n }\n\n .\\!border-none {\n --tw-border-style: none !important;\n border-style: none !important;\n }\n\n .border-t-\\[\\#303030\\] {\n border-top-color: #303030;\n }\n\n .border-t-colorBorderSecondary {\n border-top-color: var(--oo-colorBorderSecondary);\n }\n\n .border-r-\\[\\#303030\\] {\n border-right-color: #303030;\n }\n\n .border-r-colorBorderSecondary {\n border-right-color: var(--oo-colorBorderSecondary);\n }\n\n .border-l-colorBorderSecondary {\n border-left-color: var(--oo-colorBorderSecondary);\n }\n\n .bg-\\[\\#F3F4F5\\] {\n background-color: #f3f4f5;\n }\n\n .bg-blue-500\\/20 {\n background-color: rgb(var(--oo-blue-5));\n }\n\n @supports (color: color-mix(in lab, red, red)) {\n .bg-blue-500\\/20 {\n background-color: color-mix(in oklab, rgb(var(--oo-blue-5)) 20%, transparent);\n }\n }\n\n .bg-blue-600 {\n background-color: rgb(var(--oo-blue-6));\n }\n\n .bg-colorBgContainer {\n background-color: var(--oo-colorBgContainer);\n }\n\n .bg-colorBgLayout {\n background-color: var(--oo-colorBgLayout);\n }\n\n .bg-gray-100 {\n background-color: #f5f5f5;\n }\n\n .bg-primary {\n background-color: rgb(var(--oo-colorPrimary));\n }\n\n .bg-primaryActive {\n background-color: rgb(var(--oo-colorPrimaryActive));\n }\n\n .object-cover {\n object-fit: cover;\n }\n\n .p-0 {\n padding: 0;\n }\n\n .p-1 {\n padding: var(--spacing);\n }\n\n .p-2 {\n padding: calc(var(--spacing) * 2);\n }\n\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n\n .px-0 {\n padding-inline: 0;\n }\n\n .px-1 {\n padding-inline: var(--spacing);\n }\n\n .px-1\\.5 {\n padding-inline: calc(var(--spacing) * 1.5);\n }\n\n .px-2 {\n padding-inline: calc(var(--spacing) * 2);\n }\n\n .px-2\\.75 {\n padding-inline: calc(var(--spacing) * 2.75);\n }\n\n .px-3 {\n padding-inline: calc(var(--spacing) * 3);\n }\n\n .px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n\n .px-6 {\n padding-inline: calc(var(--spacing) * 6);\n }\n\n .px-9 {\n padding-inline: calc(var(--spacing) * 9);\n }\n\n .px-10 {\n padding-inline: calc(var(--spacing) * 10);\n }\n\n .px-\\[11px\\] {\n padding-inline: 11px;\n }\n\n .py-1 {\n padding-block: var(--spacing);\n }\n\n .py-1\\.5 {\n padding-block: calc(var(--spacing) * 1.5);\n }\n\n .py-2 {\n padding-block: calc(var(--spacing) * 2);\n }\n\n .py-2\\.5 {\n padding-block: calc(var(--spacing) * 2.5);\n }\n\n .py-4 {\n padding-block: calc(var(--spacing) * 4);\n }\n\n .py-10 {\n padding-block: calc(var(--spacing) * 10);\n }\n\n .pb-4 {\n padding-bottom: calc(var(--spacing) * 4);\n }\n\n .pl-2 {\n padding-left: calc(var(--spacing) * 2);\n }\n\n .text-center {\n text-align: center;\n }\n\n .font-sans {\n font-family: var(--font-sans);\n }\n\n .text-3xl {\n font-size: var(--text-3xl);\n line-height: var(--tw-leading, var(--text-3xl--line-height));\n }\n\n .text-lg {\n font-size: var(--text-lg);\n line-height: var(--tw-leading, var(--text-lg--line-height));\n }\n\n .text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n\n .text-xl {\n font-size: var(--text-xl);\n line-height: var(--tw-leading, var(--text-xl--line-height));\n }\n\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n\n .text-\\[4rem\\] {\n font-size: 4rem;\n }\n\n .leading-none {\n --tw-leading: 1;\n line-height: 1;\n }\n\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n\n .font-medium {\n --tw-font-weight: var(--font-weight-medium);\n font-weight: var(--font-weight-medium);\n }\n\n .font-semibold {\n --tw-font-weight: var(--font-weight-semibold);\n font-weight: var(--font-weight-semibold);\n }\n\n .tracking-tight {\n --tw-tracking: var(--tracking-tight);\n letter-spacing: var(--tracking-tight);\n }\n\n .text-colorBgContainer {\n color: var(--oo-colorBgContainer);\n }\n\n .text-colorBgContainer\\! {\n color: var(--oo-colorBgContainer) !important;\n }\n\n .text-colorText {\n color: var(--oo-colorText);\n }\n\n .text-colorText\\! {\n color: var(--oo-colorText) !important;\n }\n\n .text-colorTextSecondary {\n color: var(--oo-colorTextSecondary);\n }\n\n .text-colorTextTertiary {\n color: var(--oo-colorTextTertiary);\n }\n\n .opacity-50 {\n opacity: .5;\n }\n\n .opacity-90 {\n opacity: .9;\n }\n\n .outline, .outline-1 {\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n\n .outline-2 {\n outline-style: var(--tw-outline-style);\n outline-width: 2px;\n }\n\n .outline-blue-600 {\n outline-color: rgb(var(--oo-blue-6));\n }\n\n .outline-gray-300 {\n outline-color: #d9d9d9;\n }\n\n .filter {\n filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );\n }\n\n .transition {\n transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n\n .transition-all {\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n\n .duration-300 {\n --tw-duration: .3s;\n transition-duration: .3s;\n }\n\n .ease-in {\n --tw-ease: var(--ease-in);\n transition-timing-function: var(--ease-in);\n }\n\n @media (hover: hover) {\n .group-hover\\:animate-wiggle:is(:where(.group):hover *) {\n animation: var(--animate-wiggle);\n }\n\n .group-hover\\:opacity-100:is(:where(.group):hover *) {\n opacity: 1;\n }\n }\n\n .before\\:absolute:before {\n content: var(--tw-content);\n position: absolute;\n }\n\n .before\\:top-1\\/2:before {\n content: var(--tw-content);\n top: 50%;\n }\n\n .before\\:left-1\\/2:before {\n content: var(--tw-content);\n left: 50%;\n }\n\n .before\\:h-0:before {\n content: var(--tw-content);\n height: 0;\n }\n\n .before\\:w-0:before {\n content: var(--tw-content);\n width: 0;\n }\n\n .before\\:rounded-sm:before {\n content: var(--tw-content);\n border-radius: var(--radius-sm);\n }\n\n .before\\:opacity-0:before {\n content: var(--tw-content);\n opacity: 0;\n }\n\n .before\\:outline:before {\n content: var(--tw-content);\n outline-style: var(--tw-outline-style);\n outline-width: 1px;\n }\n\n .before\\:outline-2:before {\n content: var(--tw-content);\n outline-style: var(--tw-outline-style);\n outline-width: 2px;\n }\n\n .before\\:outline-transparent:before {\n content: var(--tw-content);\n outline-color: #0000;\n }\n\n .before\\:transition-all:before {\n content: var(--tw-content);\n transition-property: all;\n transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));\n transition-duration: var(--tw-duration, var(--default-transition-duration));\n }\n\n .before\\:duration-300:before {\n content: var(--tw-content);\n --tw-duration: .3s;\n transition-duration: .3s;\n }\n\n .before\\:content-\\[\\'\\'\\]:before {\n --tw-content: \"\";\n content: var(--tw-content);\n }\n\n .last\\:mr-auto:last-child {\n margin-right: auto;\n }\n\n @media (hover: hover) {\n .hover\\:bg-gray-100:hover {\n background-color: #f5f5f5;\n }\n\n .hover\\:text-colorText:hover {\n color: var(--oo-colorText);\n }\n }\n\n .before\\:hover\\:top-0:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:top-0:before:hover {\n top: 0;\n }\n }\n\n .before\\:hover\\:left-0:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:left-0:before:hover {\n left: 0;\n }\n }\n\n .before\\:hover\\:h-full:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:h-full:before:hover {\n height: 100%;\n }\n }\n\n .before\\:hover\\:w-full:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:w-full:before:hover {\n width: 100%;\n }\n }\n\n .before\\:hover\\:p-1:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:p-1:before:hover {\n padding: var(--spacing);\n }\n }\n\n .before\\:hover\\:opacity-100:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:opacity-100:before:hover {\n opacity: 1;\n }\n }\n\n .before\\:hover\\:outline-blue-600:before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .before\\:hover\\:outline-blue-600:before:hover {\n outline-color: rgb(var(--oo-blue-6));\n }\n }\n\n @media (prefers-reduced-motion: no-preference) {\n .motion-safe\\:animate-bounce-in-down-out-up {\n animation: var(--animate-bounce-in-down-out-up);\n }\n }\n\n @media (min-width: 576px) {\n .sm\\:mx-auto {\n margin-inline: auto;\n }\n }\n\n @media (min-width: 768px) {\n .md\\:mr-2\\.5 {\n margin-right: calc(var(--spacing) * 2.5);\n }\n\n .md\\:block {\n display: block;\n }\n\n .md\\:w-3\\/12 {\n width: 25%;\n }\n\n .md\\:w-96 {\n width: calc(var(--spacing) * 96);\n }\n\n .md\\:max-w-md {\n max-width: var(--container-md);\n }\n\n .md\\:bg-colorBgLayout {\n background-color: var(--oo-colorBgLayout);\n }\n\n .md\\:px-4 {\n padding-inline: calc(var(--spacing) * 4);\n }\n\n .md\\:pb-0 {\n padding-bottom: 0;\n }\n\n .md\\:text-sm {\n font-size: var(--text-sm);\n line-height: var(--tw-leading, var(--text-sm--line-height));\n }\n }\n\n @media (min-width: 992px) {\n .lg\\:text-2xl {\n font-size: var(--text-2xl);\n line-height: var(--tw-leading, var(--text-2xl--line-height));\n }\n }\n\n @media (min-width: 1200px) {\n .xl\\:w-2\\/12 {\n width: 16.6667%;\n }\n\n .xl\\:px-8 {\n padding-inline: calc(var(--spacing) * 8);\n }\n }\n\n .dark\\:bg-\\[\\#26313C\\]:where(.dark, .dark *) {\n background-color: #26313c;\n }\n\n .dark\\:bg-black:where(.dark, .dark *) {\n background-color: #000;\n }\n\n .dark\\:bg-gray-700:where(.dark, .dark *) {\n background-color: #434343;\n }\n\n .dark\\:outline-blue-700:where(.dark, .dark *) {\n outline-color: rgb(var(--oo-blue-7));\n }\n\n .dark\\:outline-gray-700:where(.dark, .dark *) {\n outline-color: #434343;\n }\n\n @media (hover: hover) {\n .dark\\:hover\\:bg-gray-700:where(.dark, .dark *):hover {\n background-color: #434343;\n }\n }\n\n .dark\\:before\\:hover\\:outline-blue-700:where(.dark, .dark *):before {\n content: var(--tw-content);\n }\n\n @media (hover: hover) {\n .dark\\:before\\:hover\\:outline-blue-700:where(.dark, .dark *):before:hover {\n outline-color: rgb(var(--oo-blue-7));\n }\n }\n\n .en-US\\:gap-y-3:where(:lang(en-US)) {\n row-gap: calc(var(--spacing) * 3);\n }\n\n .en-US\\:text-\\[9rem\\]:where(:lang(en-US)) {\n font-size: 9rem;\n }\n\n .zh-CN\\:hidden:where(:lang(zh-CN)) {\n display: none;\n }\n}\n\n@keyframes fade-in {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes fade-out {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n\n@keyframes slide-in {\n from {\n transform: translateX(-30px);\n }\n\n to {\n transform: translateX(0);\n }\n}\n\n@keyframes slide-out {\n from {\n transform: translateX(0);\n }\n\n to {\n transform: translateX(30px);\n }\n}\n\n@keyframes slide-top-in {\n from {\n transform: translateY(-10%);\n }\n\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes slide-top-out {\n from {\n transform: translateY(0);\n }\n\n to {\n transform: translateY(-10%);\n }\n}\n\n@keyframes slide-bottom-in {\n from {\n transform: translateY(10%);\n }\n\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes slide-bottom-out {\n from {\n transform: translateY(0);\n }\n\n to {\n transform: translateY(10%);\n }\n}\n\n@keyframes fade-slide {\n 0% {\n opacity: 0;\n transform: translate(-30px);\n }\n\n 50% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n transform: translate(30px);\n }\n}\n\n@keyframes fade-up {\n 0% {\n opacity: 0;\n transform: translateY(10%);\n }\n\n 50% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n transform: translateY(-10%);\n }\n}\n\n@keyframes fade-down {\n 0% {\n opacity: 0;\n transform: translateY(-10%);\n }\n\n 50% {\n opacity: 1;\n }\n\n 100% {\n opacity: 0;\n transform: translateY(10%);\n }\n}\n\n.fade-slide {\n animation: 3s linear infinite fade-slide;\n}\n\n.fade {\n animation: 3s linear infinite alternate fade-in;\n}\n\n.fade-up {\n animation: 3s infinite fade-up;\n}\n\n.fade-down {\n animation: 3s infinite fade-down;\n}\n\n@keyframes zoom-in {\n 0% {\n transform: scale(.8);\n }\n\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@keyframes zoom-out {\n 0% {\n transform: scale(1);\n }\n\n 100% {\n opacity: 1;\n transform: scale(1.25);\n }\n}\n\n@keyframes fade-zoom {\n 0% {\n opacity: 0;\n transform: scale(.8);\n }\n\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n\n 100% {\n opacity: 0;\n transform: scale(1.25);\n }\n}\n\n.fade-zoom {\n animation: 3s infinite fade-zoom;\n}\n\n.keepalive-fade.active {\n animation: .3s ease-in-out fade-in;\n}\n\n.keepalive-fade.inactive {\n animation: .3s ease-in-out fade-out;\n}\n\n.keepalive-fade-slide.active {\n animation: .3s ease-in-out fade-in, .3s ease-in-out slide-in;\n}\n\n.keepalive-fade-slide.inactive {\n animation: .3s ease-in-out fade-out, .3s ease-in-out slide-out;\n}\n\n.keepalive-fade-up.active {\n animation: .3s ease-in-out fade-in, .3s ease-in-out slide-bottom-in;\n}\n\n.keepalive-fade-up.inactive {\n animation: .3s ease-in-out fade-out, .3s ease-in-out slide-top-out;\n}\n\n.keepalive-fade-down.active {\n animation: .3s ease-in-out fade-in, .3s ease-in-out slide-top-in;\n}\n\n.keepalive-fade-down.inactive {\n animation: .3s ease-in-out fade-out, .3s ease-in-out slide-bottom-out;\n}\n\n.keepalive-fade-zoom.active {\n animation: .3s ease-in-out zoom-in, .3s ease-in-out zoom-in;\n}\n\n.keepalive-fade-zoom.inactive {\n animation: .3s ease-in-out zoom-out, .3s ease-in-out fade-out;\n}\n\n@property --tw-blur {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-brightness {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-contrast {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-grayscale {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-hue-rotate {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-invert {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-opacity {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-saturate {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-sepia {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-drop-shadow {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-drop-shadow-color {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-drop-shadow-alpha {\n syntax: \"<percentage>\";\n inherits: false;\n initial-value: 100%;\n}\n\n@property --tw-drop-shadow-size {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-translate-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n\n@property --tw-translate-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n\n@property --tw-translate-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 0;\n}\n\n@property --tw-scale-x {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n\n@property --tw-scale-y {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n\n@property --tw-scale-z {\n syntax: \"*\";\n inherits: false;\n initial-value: 1;\n}\n\n@property --tw-rotate-x {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-rotate-y {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-rotate-z {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-skew-x {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-skew-y {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-border-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n\n@property --tw-leading {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-font-weight {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-tracking {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-outline-style {\n syntax: \"*\";\n inherits: false;\n initial-value: solid;\n}\n\n@property --tw-duration {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-ease {\n syntax: \"*\";\n inherits: false\n}\n\n@property --tw-content {\n syntax: \"*\";\n inherits: false;\n initial-value: \"\";\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes wiggle {\n 0%, 100% {\n transform-origin: top;\n }\n\n 15% {\n transform: rotateZ(10deg);\n }\n\n 30% {\n transform: rotateZ(-10deg);\n }\n\n 45% {\n transform: rotateZ(5deg);\n }\n\n 60% {\n transform: rotateZ(-5deg);\n }\n\n 75% {\n transform: rotateZ(2deg);\n }\n}\n\n@keyframes bounce-in-down-out-up {\n 0% {\n transform: translateY(0);\n }\n\n 50% {\n transform: translateY(-20px);\n }\n\n 100% {\n transform: translateY(0);\n }\n}\n\n@layer properties {\n @supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))) {\n *, :before, :after, ::backdrop {\n --tw-blur: initial;\n --tw-brightness: initial;\n --tw-contrast: initial;\n --tw-grayscale: initial;\n --tw-hue-rotate: initial;\n --tw-invert: initial;\n --tw-opacity: initial;\n --tw-saturate: initial;\n --tw-sepia: initial;\n --tw-drop-shadow: initial;\n --tw-drop-shadow-color: initial;\n --tw-drop-shadow-alpha: 100%;\n --tw-drop-shadow-size: initial;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-translate-z: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-scale-z: 1;\n --tw-rotate-x: initial;\n --tw-rotate-y: initial;\n --tw-rotate-z: initial;\n --tw-skew-x: initial;\n --tw-skew-y: initial;\n --tw-border-style: solid;\n --tw-leading: initial;\n --tw-font-weight: initial;\n --tw-tracking: initial;\n --tw-outline-style: solid;\n --tw-duration: initial;\n --tw-ease: initial;\n --tw-content: \"\";\n }\n }\n}\n/*$vite$:1*/";
6
6
  document.head.appendChild(s);
7
7
  }
8
8
  import ky from "ky";
@@ -10,11 +10,11 @@ import { create } from "zustand";
10
10
  import { persist } from "zustand/middleware";
11
11
  import { Link, Navigate, Outlet, createBrowserRouter, matchRoutes, useLocation, useMatches, useNavigate, useOutlet, useSearchParams } from "react-router";
12
12
  import { ErrorBoundary, ErrorBoundary as ErrorBoundary$1 } from "react-error-boundary";
13
- import { AntDesignOutlined, ApartmentOutlined, AppstoreOutlined, ArrowDownOutlined, ArrowLeftOutlined, ArrowUpOutlined, BellOutlined, CloseOutlined, CloudOutlined, ContainerOutlined, CopyOutlined, CopyrightOutlined, DownOutlined, EnterOutlined, EyeOutlined, FileTextOutlined, FullscreenExitOutlined, FullscreenOutlined, HomeOutlined, LoadingOutlined, LockOutlined, LogoutOutlined, MenuFoldOutlined, MenuOutlined, MenuUnfoldOutlined, NodeExpandOutlined, QuestionCircleOutlined, RedoOutlined, ReloadOutlined, RocketOutlined, SafetyOutlined, SearchOutlined, SettingOutlined, SisternodeOutlined, SubnodeOutlined, SwapOutlined, TeamOutlined, TranslationOutlined, UploadOutlined, UserOutlined, VerticalAlignBottomOutlined, VerticalAlignMiddleOutlined, VerticalAlignTopOutlined } from "@ant-design/icons";
13
+ import { AntDesignOutlined, ApartmentOutlined, AppstoreOutlined, ArrowDownOutlined, ArrowLeftOutlined, ArrowUpOutlined, BellOutlined, CloseOutlined, CloudOutlined, ContainerOutlined, CopyOutlined, CopyrightOutlined, DownOutlined, EnterOutlined, ExclamationCircleFilled, EyeOutlined, FileTextOutlined, FullscreenExitOutlined, FullscreenOutlined, HomeOutlined, LoadingOutlined, LockOutlined, LogoutOutlined, MenuFoldOutlined, MenuOutlined, MenuUnfoldOutlined, NodeExpandOutlined, QuestionCircleOutlined, RedoOutlined, ReloadOutlined, RocketOutlined, SafetyOutlined, SearchOutlined, SettingOutlined, SisternodeOutlined, SubnodeOutlined, SwapOutlined, TeamOutlined, TranslationOutlined, UploadOutlined, UserOutlined, VerticalAlignBottomOutlined, VerticalAlignMiddleOutlined, VerticalAlignTopOutlined } from "@ant-design/icons";
14
14
  import { App, Avatar, Badge, Breadcrumb, Button, Checkbox, Col, ColorPicker, ConfigProvider, Divider, Drawer, Dropdown, Empty, FloatButton, Form, Grid, Input, InputNumber, List, Menu, Modal, Popover, Result, Row, Select, Slider, Space, Spin, Switch, Tabs, Tooltip, Tree, Typography, Upload, Watermark, message, notification, theme } from "antd";
15
- import { Fragment, Suspense, cloneElement, createElement, forwardRef, isValidElement, lazy, use, useCallback, useEffect, useMemo, useRef, useState } from "react";
15
+ import { Children, Suspense, cloneElement, createElement, forwardRef, isValidElement, lazy, use, useCallback, useEffect, useMemo, useRef, useState } from "react";
16
16
  import { initReactI18next, useTranslation } from "react-i18next";
17
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
17
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
18
18
  import "antd/locale/en_US";
19
19
  import "antd/locale/zh_CN";
20
20
  import i18next from "i18next";
@@ -255,10 +255,10 @@ function getAppInfo() {
255
255
  return {
256
256
  "pkg": {
257
257
  "name": "@oj-module/runtime",
258
- "version": "0.1.20",
258
+ "version": "0.2.1",
259
259
  "license": "MIT"
260
260
  },
261
- "lastBuildTime": "2026-10-15 16:50:57"
261
+ "lastBuildTime": "2026-10-16 20:19:27"
262
262
  };
263
263
  }
264
264
  var init_get_app_info = __esmMin((() => {}));
@@ -548,7 +548,7 @@ var init_authority$1 = __esmMin((() => {
548
548
  privacyPolicy: privacyPolicy$1,
549
549
  termsOfService: termsOfService$1
550
550
  };
551
- })), appLoading$1, back$1, backHome$1, warning$1, confirm$1, fail$1, success$2, deleteSuccess$1, confirmDelete$1, view$1, edit$1, error$61, index$1, upload$1, noData$1, action$1, add$1, addSuccess$1, backToHome$1, batchDelete$1, cancel$1, close$1, check$2, expandColumn$1, columnSetting$1, config$2, keywordSearch$1, modify$1, modifySuccess$1, pleaseCheckValue$1, refresh$1, reset$1, search$3, tip$1, tipMessage$1, trigger$1, update$1, updateSuccess$1, userCenter$1, name$1, id$1, status$1, enabled$1, deactivated$1, activated$1, disabled$1, createTime$1, updateTime$1, remark$1, demoOnly$1, pagination$1, expandAll$1, collapseAll$1, checkAll$1, cancelAll$1, common_default$1;
551
+ })), appLoading$1, back$1, backHome$1, warning$1, confirm$1, fail$1, success$2, deleteSuccess$1, confirmDelete$1, view$1, edit$1, error$61, index$1, upload$1, noData$1, action$1, add$1, addSuccess$1, backToHome$1, batchDelete$1, cancel$1, close$1, check$2, expandColumn$1, columnSetting$1, config$2, keywordSearch$1, modify$1, modifySuccess$1, pleaseCheckValue$1, refresh$1, reset$1, search$3, tip$1, tipMessage$1, trigger$1, update$1, updateSuccess$1, userCenter$1, name$1, id$1, status$1, enabled$1, deactivated$1, activated$1, disabled$1, createTime$1, updateTime$1, remark$1, demoOnly$1, pagination$1, expandAll$1, collapseAll$1, checkAll$1, cancelAll$1, total$1, save$1, deleteFailed$1, common_default$1;
552
552
  var init_common$1 = __esmMin((() => {
553
553
  appLoading$1 = "资源正在加载中...";
554
554
  back$1 = "返回";
@@ -605,6 +605,9 @@ var init_common$1 = __esmMin((() => {
605
605
  collapseAll$1 = "折叠所有";
606
606
  checkAll$1 = "选择所有";
607
607
  cancelAll$1 = "取消所有";
608
+ total$1 = "共 {total} 条";
609
+ save$1 = "保存";
610
+ deleteFailed$1 = "删除失败";
608
611
  common_default$1 = {
609
612
  appLoading: appLoading$1,
610
613
  back: back$1,
@@ -664,7 +667,10 @@ var init_common$1 = __esmMin((() => {
664
667
  expandAll: expandAll$1,
665
668
  collapseAll: collapseAll$1,
666
669
  checkAll: checkAll$1,
667
- cancelAll: cancelAll$1
670
+ cancelAll: cancelAll$1,
671
+ total: total$1,
672
+ save: save$1,
673
+ deleteFailed: deleteFailed$1
668
674
  };
669
675
  })), notFoundSubTitle$1, unknownComponentTitle$1, unknownComponentSubTitle$1, pageErrorTitle$1, exception_default$1;
670
676
  var init_exception$2 = __esmMin((() => {
@@ -982,7 +988,7 @@ var init_authority = __esmMin((() => {
982
988
  privacyPolicy,
983
989
  termsOfService
984
990
  };
985
- })), appLoading, back, backHome, warning, confirm, fail, success$1, deleteSuccess, confirmDelete, view, edit, error$60, index, upload, noData, action, addSuccess, backToHome, batchDelete, cancel, close, check$1, expandColumn, columnSetting, config$1, keywordSearch, modify, modifySuccess, pleaseCheckValue, refresh, reset, search$1, tipMessage, trigger, update, updateSuccess, userCenter, name, status, enabled, deactivated, activated, disabled, createTime, updateTime, remark, demoOnly, pagination, expandAll, collapseAll, checkAll, cancelAll, common_default;
991
+ })), appLoading, back, backHome, warning, confirm, fail, success$1, deleteSuccess, confirmDelete, view, edit, error$60, index, upload, noData, action, addSuccess, backToHome, batchDelete, cancel, close, check$1, expandColumn, columnSetting, config$1, keywordSearch, modify, modifySuccess, pleaseCheckValue, refresh, reset, search$1, tipMessage, trigger, update, updateSuccess, userCenter, name, status, enabled, deactivated, activated, disabled, createTime, updateTime, remark, demoOnly, pagination, expandAll, collapseAll, checkAll, cancelAll, total, save, deleteFailed, common_default;
986
992
  var init_common = __esmMin((() => {
987
993
  appLoading = "Loading Resources...";
988
994
  back = "Back";
@@ -1036,6 +1042,9 @@ var init_common = __esmMin((() => {
1036
1042
  collapseAll = "Collapse All";
1037
1043
  checkAll = "Check All";
1038
1044
  cancelAll = "Cancel All";
1045
+ total = "Total {total}";
1046
+ save = "Save";
1047
+ deleteFailed = "Delete failed";
1039
1048
  common_default = {
1040
1049
  appLoading,
1041
1050
  back,
@@ -1095,7 +1104,10 @@ var init_common = __esmMin((() => {
1095
1104
  expandAll,
1096
1105
  collapseAll,
1097
1106
  checkAll,
1098
- cancelAll
1107
+ cancelAll,
1108
+ total,
1109
+ save,
1110
+ deleteFailed
1099
1111
  };
1100
1112
  })), notFoundSubTitle, unknownComponentTitle, unknownComponentSubTitle, pageErrorTitle, exception_default;
1101
1113
  var init_exception$1 = __esmMin((() => {
@@ -1470,7 +1482,7 @@ function TermsOfService$1() {
1470
1482
  className: "p-4 dark:bg-black",
1471
1483
  children: /* @__PURE__ */ jsx(Typography.Title, {
1472
1484
  level: 1,
1473
- children: /* @__PURE__ */ jsx(Fragment$1, { children: t("authority.termsOfService") })
1485
+ children: /* @__PURE__ */ jsx(Fragment, { children: t("authority.termsOfService") })
1474
1486
  })
1475
1487
  });
1476
1488
  }
@@ -2703,7 +2715,7 @@ function LayoutFooter({ className }) {
2703
2715
  }), "\xA0"] }) : null,
2704
2716
  "Copyright ©\xA0",
2705
2717
  copyrightDate,
2706
- copyrightDate ? /* @__PURE__ */ jsx(Fragment$1, { children: "\xA0" }) : "",
2718
+ copyrightDate ? /* @__PURE__ */ jsx(Fragment, { children: "\xA0" }) : "",
2707
2719
  companyName ? /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsxs("a", {
2708
2720
  href: companyWebsite,
2709
2721
  rel: "noreferrer noopener",
@@ -3175,34 +3187,6 @@ function unregisterAuthProvider(moduleName) {
3175
3187
  var current$1;
3176
3188
  var init_auth_provider = __esmMin((() => {}));
3177
3189
  //#endregion
3178
- //#region src/store/user.ts
3179
- var initialState$4, useUserStore;
3180
- var init_user = __esmMin((() => {
3181
- init_user$1();
3182
- init_auth_provider();
3183
- initialState$4 = {
3184
- id: "",
3185
- avatar: "",
3186
- username: "",
3187
- email: "",
3188
- phoneNumber: "",
3189
- description: "",
3190
- roles: []
3191
- };
3192
- useUserStore = create()((set) => ({
3193
- ...initialState$4,
3194
- getUserInfo: async () => {
3195
- const provider = getAuthProvider();
3196
- const result = provider ? await provider.getUserInfo() : await fetchUserInfo();
3197
- set({ ...result });
3198
- return result;
3199
- },
3200
- reset: () => {
3201
- return set({ ...initialState$4 });
3202
- }
3203
- }));
3204
- }));
3205
- //#endregion
3206
3190
  //#region src/utils/is/index.ts
3207
3191
  /**
3208
3192
  * 判断给定的值是否为有限数字
@@ -3246,6 +3230,95 @@ function isUndefined(value) {
3246
3230
  }
3247
3231
  var init_is = __esmMin((() => {}));
3248
3232
  //#endregion
3233
+ //#region src/utils/static-antd/index.ts
3234
+ /**
3235
+ * @see https://ant.design/components/app
3236
+ * @see https://ant.design/docs/blog/why-not-static
3237
+ */
3238
+ function StaticAntd() {
3239
+ const staticFunctions = App.useApp();
3240
+ message$1 = staticFunctions.message;
3241
+ notification$1 = staticFunctions.notification;
3242
+ modal = staticFunctions.modal;
3243
+ window.$message = message$1;
3244
+ window.$modal = modal;
3245
+ window.$notification = notification$1;
3246
+ return null;
3247
+ }
3248
+ var message$1, notification$1, resetFns, modal;
3249
+ var init_static_antd = __esmMin((() => {
3250
+ message$1 = message;
3251
+ notification$1 = notification;
3252
+ ({...resetFns} = Modal);
3253
+ modal = resetFns;
3254
+ }));
3255
+ //#endregion
3256
+ //#region src/utils/request/must-change.tsx
3257
+ function isMustChange(data) {
3258
+ if (isObject$1(data)) {
3259
+ const json = data;
3260
+ if (json.code === "must_change") return true;
3261
+ return (json.msg ?? "").includes("password change required");
3262
+ }
3263
+ return false;
3264
+ }
3265
+ function openMustChangeModal() {
3266
+ if (mustChangeModalOpen) return;
3267
+ if (location.pathname.endsWith("/change-password")) return;
3268
+ mustChangeModalOpen = true;
3269
+ modal.confirm({
3270
+ title: "需要修改密码",
3271
+ icon: /* @__PURE__ */ jsx(ExclamationCircleFilled, {}),
3272
+ content: "出于安全策略,当前账号要求首次登录后修改密码。请先完成密码修改,再继续使用系统功能。",
3273
+ okText: "去修改密码",
3274
+ closable: false,
3275
+ maskClosable: false,
3276
+ cancelButtonProps: { style: { display: "none" } },
3277
+ onOk: () => {
3278
+ window.location.href = `/change-password`;
3279
+ },
3280
+ afterClose: () => {
3281
+ mustChangeModalOpen = false;
3282
+ }
3283
+ });
3284
+ }
3285
+ var mustChangeModalOpen;
3286
+ var init_must_change = __esmMin((() => {
3287
+ init_is();
3288
+ init_static_antd();
3289
+ mustChangeModalOpen = false;
3290
+ }));
3291
+ //#endregion
3292
+ //#region src/store/user.ts
3293
+ var initialState$4, useUserStore;
3294
+ var init_user = __esmMin((() => {
3295
+ init_user$1();
3296
+ init_auth_provider();
3297
+ init_must_change();
3298
+ initialState$4 = {
3299
+ id: "",
3300
+ avatar: "",
3301
+ username: "",
3302
+ email: "",
3303
+ phoneNumber: "",
3304
+ description: "",
3305
+ roles: []
3306
+ };
3307
+ useUserStore = create()((set) => ({
3308
+ ...initialState$4,
3309
+ getUserInfo: async () => {
3310
+ const provider = getAuthProvider();
3311
+ const result = provider ? await provider.getUserInfo() : await fetchUserInfo();
3312
+ set({ ...result });
3313
+ if (result.must_change === true || result.mustChange === true) openMustChangeModal();
3314
+ return result;
3315
+ },
3316
+ reset: () => {
3317
+ return set({ ...initialState$4 });
3318
+ }
3319
+ }));
3320
+ }));
3321
+ //#endregion
3249
3322
  //#region src/utils/progress/index.tsx
3250
3323
  var init_progress = __esmMin((() => {
3251
3324
  NProgress.configure({
@@ -4100,7 +4173,7 @@ var init_layout_content = __esmMin((() => {
4100
4173
  //#region src/layout/widgets/global-search/components/search-footer.tsx
4101
4174
  function SearchFooter({ searchItems }) {
4102
4175
  const { t } = useTranslation();
4103
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Divider, { className: "mt-2 my-0" }), /* @__PURE__ */ jsxs("div", {
4176
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Divider, { className: "mt-2 my-0" }), /* @__PURE__ */ jsxs("div", {
4104
4177
  className: "px-4 py-2 flex items-center justify-between text-xs",
4105
4178
  children: [/* @__PURE__ */ jsxs("div", {
4106
4179
  className: "flex items-center",
@@ -4146,7 +4219,7 @@ function SearchPanel({ menuItem, active, enter, setActiveKey, showCloseButton, r
4146
4219
  function handleMouseEnter(key) {
4147
4220
  setActiveKey(key);
4148
4221
  }
4149
- return /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("li", {
4222
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("li", {
4150
4223
  "data-search-item": menuItem.key,
4151
4224
  onMouseEnter: () => {
4152
4225
  handleMouseEnter(menuItem.key);
@@ -4301,7 +4374,7 @@ function GlobalSearch() {
4301
4374
  useEffect(() => {
4302
4375
  if (!keyword.length && Array.isArray(searchHistory)) setResultOptions(searchMenuList.filter((item) => searchHistory?.includes(item.key)));
4303
4376
  }, [keyword, searchHistory]);
4304
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("div", {
4377
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
4305
4378
  onClick: () => setOpen((open) => !open),
4306
4379
  className: "group flex justify-center items-center gap-2 md:bg-colorBgLayout px-3 py-1.5 rounded-full cursor-pointer text-colorTextSecondary hover:text-colorText md:mr-2.5",
4307
4380
  children: [
@@ -4322,7 +4395,7 @@ function GlobalSearch() {
4322
4395
  if (open) inputRef.current?.focus();
4323
4396
  },
4324
4397
  keyboard: true,
4325
- title: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
4398
+ title: /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
4326
4399
  className: "mr-17",
4327
4400
  children: /* @__PURE__ */ jsx(Input, {
4328
4401
  ref: inputRef,
@@ -4618,7 +4691,7 @@ function Animation() {
4618
4691
  function handleClick(value) {
4619
4692
  setPreferences("transitionName", value);
4620
4693
  }
4621
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
4694
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4622
4695
  /* @__PURE__ */ jsx(SwitchItem, {
4623
4696
  name: "transitionProgress",
4624
4697
  checked: transitionProgress,
@@ -4698,7 +4771,7 @@ var init_text_input = __esmMin((() => {}));
4698
4771
  function PreferencesFooter() {
4699
4772
  const { t } = useTranslation();
4700
4773
  const { enableFooter, fixedFooter, companyName, companyWebsite, copyrightDate, ICPNumber, ICPLink, setPreferences } = usePreferencesStore();
4701
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
4774
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4702
4775
  /* @__PURE__ */ jsx(SwitchItem, {
4703
4776
  name: "enableFooter",
4704
4777
  checked: enableFooter,
@@ -4774,7 +4847,7 @@ var init_select_item = __esmMin((() => {
4774
4847
  function General() {
4775
4848
  const { t } = useTranslation();
4776
4849
  const { language, enableDynamicTitle, watermark, watermarkContent, enableCheckUpdates, enableBackTopButton, setPreferences } = usePreferencesStore();
4777
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
4850
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4778
4851
  /* @__PURE__ */ jsx(SelectItem, {
4779
4852
  name: "language",
4780
4853
  value: language,
@@ -4856,7 +4929,7 @@ function PreferencesLayout() {
4856
4929
  function handleClick(value) {
4857
4930
  setPreferences("navigationStyle", value);
4858
4931
  }
4859
- return /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("ul", {
4932
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("ul", {
4860
4933
  className: "w-full flex flex-wrap justify-between gap-1 en-US:gap-y-3 px-0 list-none",
4861
4934
  children: navigationPreset.map((item) => /* @__PURE__ */ jsx("li", {
4862
4935
  onClick: () => handleClick(item.type),
@@ -4941,7 +5014,7 @@ function Sidebar() {
4941
5014
  const handleChange = (name, value) => {
4942
5015
  setPreferences(name, value);
4943
5016
  };
4944
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
5017
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4945
5018
  sidebarPreset.map((item) => {
4946
5019
  return /* @__PURE__ */ jsx(SwitchItem, {
4947
5020
  name: item.name,
@@ -5015,7 +5088,7 @@ function Tabbar() {
5015
5088
  value: "brisk"
5016
5089
  }
5017
5090
  ];
5018
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
5091
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
5019
5092
  /* @__PURE__ */ jsx(SwitchItem, {
5020
5093
  name: "tabbarEnable",
5021
5094
  checked: tabbarEnable,
@@ -5119,7 +5192,7 @@ function BuiltinTheme() {
5119
5192
  color: "#13c2c2"
5120
5193
  },
5121
5194
  {
5122
- label: /* @__PURE__ */ jsxs(Fragment$1, { children: [
5195
+ label: /* @__PURE__ */ jsxs(Fragment, { children: [
5123
5196
  /* @__PURE__ */ jsx("span", { children: t("preferences.theme.builtin.blue") }),
5124
5197
  /* @__PURE__ */ jsx("br", { className: "zh-CN:hidden" }),
5125
5198
  /* @__PURE__ */ jsxs("span", { children: [
@@ -5171,7 +5244,7 @@ function BuiltinTheme() {
5171
5244
  themeColorPrimary: builtinThemePresets.find((item) => item.value === value)?.color
5172
5245
  });
5173
5246
  }
5174
- return /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx("ul", {
5247
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("ul", {
5175
5248
  className: "flex justify-between flex-wrap w-full gap-3 p-0 m-0 list-none",
5176
5249
  children: builtinThemePresets.map((item) => {
5177
5250
  const innerBlock = /* @__PURE__ */ jsx("li", {
@@ -5241,7 +5314,7 @@ function SiteTheme() {
5241
5314
  const handleChange = (newValue) => {
5242
5315
  setPreferences("themeRadius", newValue);
5243
5316
  };
5244
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
5317
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
5245
5318
  /* @__PURE__ */ jsx("ul", {
5246
5319
  className: "flex justify-between w-full gap-3 p-0 m-0 list-none",
5247
5320
  children: themePresets.map((item) => /* @__PURE__ */ jsx("li", {
@@ -5349,7 +5422,7 @@ function Preferences({ ...restProps }) {
5349
5422
  content: t("preferences.copyPreferencesSuccess")
5350
5423
  });
5351
5424
  };
5352
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(BasicButton, {
5425
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(BasicButton, {
5353
5426
  type: "text",
5354
5427
  ...restProps,
5355
5428
  onClick: (e) => {
@@ -5592,10 +5665,17 @@ function LayoutHeader({ className, children }) {
5592
5665
  const { isTopNav, isMixedNav } = useLayout();
5593
5666
  const slotActions = useSlotNodes("header-actions");
5594
5667
  const isFixedDarkTheme = isDark || sidebarTheme === "dark" && (isMixedNav || isTopNav);
5668
+ const buttonProps = isMobile ? {
5669
+ size: "middle",
5670
+ className: "px-2"
5671
+ } : {
5672
+ size: "large",
5673
+ className: "px-[11px]"
5674
+ };
5595
5675
  return /* @__PURE__ */ jsx(ConfigProvider, {
5596
5676
  theme: { algorithm: isFixedDarkTheme ? theme.darkAlgorithm : theme.defaultAlgorithm },
5597
5677
  children: /* @__PURE__ */ jsxs("header", {
5598
- className: cn("flex-shrink-0 flex gap-5 justify-between items-center transition-all md:px-4", { "overflow-hidden": isMaximize }, className),
5678
+ className: cn("flex-shrink-0 flex justify-between items-center transition-all px-2 md:px-4", isMobile ? "gap-2" : "gap-5", { "overflow-hidden": isMaximize }, className),
5599
5679
  style: {
5600
5680
  background: isFixedDarkTheme ? Menu?.darkItemBg : Menu?.itemBg,
5601
5681
  height: isMaximize ? 0 : 48
@@ -5612,9 +5692,9 @@ function LayoutHeader({ className, children }) {
5612
5692
  children
5613
5693
  }),
5614
5694
  /* @__PURE__ */ jsxs("div", {
5615
- className: "flex items-center",
5695
+ className: cn("flex items-center min-w-0", isMobile && "overflow-x-auto"),
5616
5696
  children: [
5617
- slotActions.map((node, index) => /* @__PURE__ */ jsx(Fragment, { children: node }, index)),
5697
+ Children.toArray(slotActions),
5618
5698
  /* @__PURE__ */ jsx(GlobalSearch, {}),
5619
5699
  /* @__PURE__ */ jsx(Preferences, { ...buttonProps }),
5620
5700
  /* @__PURE__ */ jsx(ThemeButton, { ...buttonProps }),
@@ -5631,7 +5711,6 @@ function LayoutHeader({ className, children }) {
5631
5711
  })
5632
5712
  });
5633
5713
  }
5634
- var buttonProps;
5635
5714
  var init_layout_header = __esmMin((() => {
5636
5715
  init_use_device_type();
5637
5716
  init_use_preferences();
@@ -5647,10 +5726,6 @@ var init_layout_header = __esmMin((() => {
5647
5726
  init_language_button();
5648
5727
  init_theme_button();
5649
5728
  init_user_menu();
5650
- buttonProps = {
5651
- size: "large",
5652
- className: "px-[11px]"
5653
- };
5654
5729
  }));
5655
5730
  //#endregion
5656
5731
  //#region src/router/utils/remove-trailing-slash.ts
@@ -6873,7 +6948,7 @@ function ContainerLayout() {
6873
6948
  style: { paddingLeft: computedSidebarWidth },
6874
6949
  className: cn("transition-all flex flex-col h-screen"),
6875
6950
  children: [
6876
- /* @__PURE__ */ jsx(LayoutHeader, { children: isTopNav || isMixedNav ? /* @__PURE__ */ jsxs(Fragment$1, { children: [isTopNav ? /* @__PURE__ */ jsx(Logo, {
6951
+ /* @__PURE__ */ jsx(LayoutHeader, { children: isTopNav || isMixedNav ? /* @__PURE__ */ jsxs(Fragment, { children: [isTopNav ? /* @__PURE__ */ jsx(Logo, {
6877
6952
  sidebarCollapsed: false,
6878
6953
  className: "mr-8"
6879
6954
  }) : null, /* @__PURE__ */ jsx(LayoutMenu, {
@@ -8406,29 +8481,6 @@ var init_auth = __esmMin((() => {
8406
8481
  }), { name: getAppNamespace("access-token") }));
8407
8482
  }));
8408
8483
  //#endregion
8409
- //#region src/utils/static-antd/index.ts
8410
- /**
8411
- * @see https://ant.design/components/app
8412
- * @see https://ant.design/docs/blog/why-not-static
8413
- */
8414
- function StaticAntd() {
8415
- const staticFunctions = App.useApp();
8416
- message$1 = staticFunctions.message;
8417
- notification$1 = staticFunctions.notification;
8418
- modal = staticFunctions.modal;
8419
- window.$message = message$1;
8420
- window.$modal = modal;
8421
- window.$notification = notification$1;
8422
- return null;
8423
- }
8424
- var message$1, notification$1, resetFns, modal;
8425
- var init_static_antd = __esmMin((() => {
8426
- message$1 = message;
8427
- notification$1 = notification;
8428
- ({...resetFns} = Modal);
8429
- modal = resetFns;
8430
- }));
8431
- //#endregion
8432
8484
  //#region src/utils/request/error-response.ts
8433
8485
  /**
8434
8486
  * 处理错误响应
@@ -8448,6 +8500,10 @@ async function handleErrorResponse(response) {
8448
8500
  data = JSON.parse(text);
8449
8501
  } catch {}
8450
8502
  if (isObject$1(data)) {
8503
+ if (isMustChange(data)) {
8504
+ openMustChangeModal();
8505
+ return response;
8506
+ }
8451
8507
  const json = data;
8452
8508
  message$1.error(json.msg || response.statusText);
8453
8509
  } else message$1.error(response.statusText);
@@ -8456,6 +8512,7 @@ async function handleErrorResponse(response) {
8456
8512
  var init_error_response = __esmMin((() => {
8457
8513
  init_is();
8458
8514
  init_static_antd();
8515
+ init_must_change();
8459
8516
  }));
8460
8517
  //#endregion
8461
8518
  //#region src/utils/request/global-progress.ts
@@ -8691,6 +8748,86 @@ var init_request = __esmMin((() => {
8691
8748
  request = ky.create(defaultConfig);
8692
8749
  }));
8693
8750
  //#endregion
8751
+ //#region src/api/rbac/index.ts
8752
+ init_request();
8753
+ function get(url) {
8754
+ return request.get(url).json().then((env) => env.data);
8755
+ }
8756
+ function post(url, json) {
8757
+ return request.post(url, { json }).json().then((env) => env.data);
8758
+ }
8759
+ function put(url, json) {
8760
+ return request.put(url, { json }).json().then((env) => env.data);
8761
+ }
8762
+ function del(url) {
8763
+ return request.delete(url).json().then((env) => env.data);
8764
+ }
8765
+ var fetchRbacRoleList = () => get("system/roles");
8766
+ var fetchRbacPermissionList = () => get("system/permissions");
8767
+ var fetchRbacCreateRole = (body) => post("system/roles", body);
8768
+ var fetchRbacUpdateBindings = (name, permissions) => put(`system/roles/bindings?name=${encodeURIComponent(name)}`, { permissions });
8769
+ var fetchRbacDeleteRole = (name) => del(`system/roles?name=${encodeURIComponent(name)}`);
8770
+ var fetchRbacUserList = () => get("system/users");
8771
+ var fetchRbacCreateUser = (body) => post("system/users", body);
8772
+ var fetchRbacUpdateUserRoles = (uid, roles) => put(`system/users/roles?uid=${uid}`, { roles });
8773
+ var fetchRbacAdminResetPassword = (uid, password) => put(`system/users/password?uid=${uid}`, { password });
8774
+ var fetchRbacSetForbidden = (uid, forbidden) => put(`system/users/forbidden?uid=${uid}`, { forbidden });
8775
+ function fetchRbacOplog(query) {
8776
+ const sp = new URLSearchParams();
8777
+ for (const [k, v] of Object.entries(query)) if (v != null && v !== "") sp.set(k, String(v));
8778
+ return get(`system/oplog?${sp.toString()}`);
8779
+ }
8780
+ var fetchRbacSettings = () => get("system/settings");
8781
+ var fetchRbacUpdateSetting = (key, value) => put("system/settings", {
8782
+ key,
8783
+ value
8784
+ });
8785
+ function fetchRbacContacts(keyword, limit) {
8786
+ return get(`_platform/contacts?keyword=${encodeURIComponent(keyword)}${limit ? `&limit=${limit}` : ""}`);
8787
+ }
8788
+ var fetchRbacContactDetail = (id) => get(`_platform/contacts/detail?id=${id}`);
8789
+ var fetchLoginMethods = () => get("system/login-methods");
8790
+ var fetchChangePassword = (body) => put("auth/password", body);
8791
+ var fetchLdapLogin = (body) => post("auth/ldap-login", body);
8792
+ //#endregion
8793
+ //#region src/api/rbac/helpers.ts
8794
+ /** 展示名:title 缺省回落机器名。 */
8795
+ function roleLabel(role) {
8796
+ return role.title || role.name;
8797
+ }
8798
+ /** AC1-19:builtin 角色(superadmin/admin/editor/viewer)无绑定编辑入口。 */
8799
+ function canEditRoleBindings(role) {
8800
+ return !role.builtin;
8801
+ }
8802
+ /** AC1-19/20:删除入口——非 builtin 且当前无持有者(服务端 409 仍是权威判据)。 */
8803
+ function canDeleteRole(role) {
8804
+ return !role.builtin && role.holders === 0;
8805
+ }
8806
+ /** AC1-8:actor 能否把 roleName 分配给用户。 */
8807
+ function canAssignRole(actorRoles, roleName) {
8808
+ if (actorRoles.includes("superadmin")) return true;
8809
+ if (actorRoles.includes("admin")) return roleName !== "superadmin" && roleName !== "admin";
8810
+ return false;
8811
+ }
8812
+ /** 绑定编辑 diff(审计明细同款语义,AC1-28)。 */
8813
+ function bindingDiff(before, after) {
8814
+ const b = new Set(before);
8815
+ const a = new Set(after);
8816
+ return {
8817
+ added: after.filter((x) => !b.has(x)),
8818
+ removed: before.filter((x) => !a.has(x))
8819
+ };
8820
+ }
8821
+ /** 按 module 分组(角色下拉/权限勾选的分组展示)。 */
8822
+ function groupByModule(items) {
8823
+ const map = /* @__PURE__ */ new Map();
8824
+ for (const item of items) (map.get(item.module) ?? map.set(item.module, []).get(item.module)).push(item);
8825
+ return [...map.entries()].map(([module, items]) => ({
8826
+ module,
8827
+ items
8828
+ }));
8829
+ }
8830
+ //#endregion
8694
8831
  //#region src/api/system/menu/index.ts
8695
8832
  init_api_provider();
8696
8833
  init_request();
@@ -9094,7 +9231,7 @@ function FormAvatarItem({ value, onChange }) {
9094
9231
  const uploadProvider = getUploadApiProvider();
9095
9232
  const uploadAction = uploadProvider?.action ?? `/api/upload`;
9096
9233
  const uploadHeaders = uploadProvider?.headers() ?? { authorization: "authorization-text" };
9097
- return /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsxs("div", {
9234
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("div", {
9098
9235
  className: "flex items-center gap-5",
9099
9236
  children: [/* @__PURE__ */ jsx(Avatar, {
9100
9237
  size: 100,
@@ -9186,7 +9323,7 @@ function FormTreeItem({ treeData, value, onChange }) {
9186
9323
  if (checkedOptions.includes("checkAll")) onChange?.(flattenTreeData.map((item) => item.id));
9187
9324
  else onChange?.([]);
9188
9325
  }, [checkedOptions, flattenTreeData]);
9189
- return /* @__PURE__ */ jsxs(Fragment$1, { children: [
9326
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
9190
9327
  /* @__PURE__ */ jsx(Search, {
9191
9328
  className: "mb-3",
9192
9329
  placeholder: t("common.keywordSearch"),
@@ -9372,6 +9509,28 @@ function getBooleanOptions(t) {
9372
9509
  }];
9373
9510
  }
9374
9511
  //#endregion
9512
+ //#region src/hooks/use-tab-key/index.ts
9513
+ init_remove_trailing_slash();
9514
+ /**
9515
+ * 本页自己的页签 key(`removeTrailingSlash(pathname)`),供 `setTableTitle` /
9516
+ * `resetTableTitle` / `addTab` 定位页签。
9517
+ *
9518
+ * keepAlive 陷阱:keepalive-for-react 把页面缓存在隐藏 portal 里,而 LocationContext
9519
+ * 在 KeepAlive **之上**——切 tab 时缓存树随**激活页**位置重渲染,缓存页里的
9520
+ * `useLocation()` 返回的是别家页签的路径。若拿它当页签 key,`setTableTitle` 会把
9521
+ * 本页标题写到当前激活页签上(最后打开的文档页把之后切换到的每个页签都改成自己的标题)。
9522
+ *
9523
+ * 页签存活期内 key 不变(宿主 cacheKey = pathname+search,一页一路径),故首渲染
9524
+ * (此时本页必是激活页)捕获一次即可;缓存树后续多少次重渲染都不会漂移。
9525
+ * 需要跟随导航的位置信息请直接用 `useLocation`,不要用本 hook。
9526
+ */
9527
+ function useTabKey() {
9528
+ const { pathname } = useLocation();
9529
+ const keyRef = useRef(void 0);
9530
+ if (keyRef.current === void 0) keyRef.current = removeTrailingSlash(pathname);
9531
+ return keyRef.current;
9532
+ }
9533
+ //#endregion
9375
9534
  //#region src/module-loader/define-module.ts
9376
9535
  /**
9377
9536
  * 声明一个模块。
@@ -27441,4 +27600,4 @@ init_ri();
27441
27600
  init_menu_icons();
27442
27601
  init_tree();
27443
27602
  //#endregion
27444
- export { AccessControl, AccessControlRoles, AntdApp, BasicButton, BasicContent, BasicTable, EmbeddedIcon, ErrorBoundary, ExternalIcon, FormAvatarItem, FormTreeItem, Iframe, LayoutCenterIcon, LayoutEffects, LayoutLeftIcon, LayoutRightIcon, MixedNavigationIcon, OutsidePageIcon, PageError, ProfileCardIcon, RiAccountCircleLine, RiContrastFill, RiFullscreenExitLine, RiFullscreenLine, RiMailCheckLine, RiMoonIcon, RiReactjsLine, RiSunIcon, RiUserSettingsLine, ServerErrorIcon, SideNavigationIcon, TopNavigationIcon, TwoColumnNavigationIcon, accessControlCodes, defineModule, fetchAddMenuItem, fetchAddRoleItem, fetchAsyncRoutes, fetchDeleteMenuItem, fetchDeleteRoleItem, fetchLogin, fetchLogout, fetchMenuByRoleId, fetchMenuList, fetchRefreshToken, fetchRoleList, fetchRoleMenu, fetchUpdateMenuItem, fetchUpdateRoleItem, fetchUserInfo, filterTree, getAllExpandedKeys, getAppInfo, getBooleanOptions, getModule, getModules, getRedirectPath, getRegisteredApiPrefix, getRegisteredStore, getRoutes, getYesNoOptions, handleTree, loadAll, mapTree, menuIcons, notify, permissionPrefix, setupI18n, traverseTreeValues, unloadModule, useAccess, useAuthStore, usePreferences, useSlotNodes, useTabsStore, useUserStore, external_exports as z };
27603
+ export { AccessControl, AccessControlRoles, AntdApp, BasicButton, BasicContent, BasicTable, EmbeddedIcon, ErrorBoundary, ExternalIcon, FormAvatarItem, FormTreeItem, Iframe, LayoutCenterIcon, LayoutEffects, LayoutLeftIcon, LayoutRightIcon, MixedNavigationIcon, OutsidePageIcon, PageError, ProfileCardIcon, RiAccountCircleLine, RiContrastFill, RiFullscreenExitLine, RiFullscreenLine, RiMailCheckLine, RiMoonIcon, RiReactjsLine, RiSunIcon, RiUserSettingsLine, ServerErrorIcon, SideNavigationIcon, TopNavigationIcon, TwoColumnNavigationIcon, accessControlCodes, bindingDiff, canAssignRole, canDeleteRole, canEditRoleBindings, defineModule, fetchAddMenuItem, fetchAddRoleItem, fetchAsyncRoutes, fetchChangePassword, fetchDeleteMenuItem, fetchDeleteRoleItem, fetchLdapLogin, fetchLogin, fetchLoginMethods, fetchLogout, fetchMenuByRoleId, fetchMenuList, fetchRbacAdminResetPassword, fetchRbacContactDetail, fetchRbacContacts, fetchRbacCreateRole, fetchRbacCreateUser, fetchRbacDeleteRole, fetchRbacOplog, fetchRbacPermissionList, fetchRbacRoleList, fetchRbacSetForbidden, fetchRbacSettings, fetchRbacUpdateBindings, fetchRbacUpdateSetting, fetchRbacUpdateUserRoles, fetchRbacUserList, fetchRefreshToken, fetchRoleList, fetchRoleMenu, fetchUpdateMenuItem, fetchUpdateRoleItem, fetchUserInfo, filterTree, getAllExpandedKeys, getAppInfo, getBooleanOptions, getModule, getModules, getRedirectPath, getRegisteredApiPrefix, getRegisteredStore, getRoutes, getYesNoOptions, groupByModule, handleTree, loadAll, mapTree, menuIcons, notify, permissionPrefix, roleLabel, setupI18n, traverseTreeValues, unloadModule, useAccess, useAuthStore, usePreferences, useSlotNodes, useTabKey, useTabsStore, useUserStore, external_exports as z };
@@ -0,0 +1,2 @@
1
+ export declare function isMustChange(data: unknown): boolean;
2
+ export declare function openMustChangeModal(): void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oj-module/runtime",
3
3
  "type": "module",
4
- "version": "0.1.20",
4
+ "version": "0.2.1",
5
5
  "description": "React Antd Admin 框架运行时,供模块工程消费",
6
6
  "license": "MIT",
7
7
  "imports": {