@go-wind/admin-react 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +74 -2
- package/dist/access/access-control.d.ts +39 -0
- package/dist/access/field-permission.d.ts +11 -0
- package/dist/access/index.d.ts +4 -0
- package/dist/access/use-access.d.ts +50 -0
- package/dist/admin-react.css +2 -0
- package/dist/admin-react.js +36561 -0
- package/dist/admin-react.js.map +1 -0
- package/dist/auth-gateway.d.ts +54 -0
- package/dist/components/ListTable/ResizableHeaderCell.d.ts +31 -0
- package/dist/components/ListTable/TableSkeleton.d.ts +25 -0
- package/dist/components/ListTable/index.d.ts +20 -0
- package/dist/components/Loading/index.d.ts +22 -0
- package/dist/constants.d.ts +30 -0
- package/dist/env.d.ts +5 -0
- package/dist/hooks/useClipboard.d.ts +3 -0
- package/dist/hooks/useEcharts.d.ts +10 -0
- package/dist/hooks/useKeyStroke.d.ts +13 -0
- package/dist/hooks/usePageFullscreen.d.ts +9 -0
- package/dist/hooks/useProTableScrollY.d.ts +22 -0
- package/dist/hooks/useTime.d.ts +6 -0
- package/dist/hooks/useTitle.d.ts +1 -0
- package/dist/hooks/useTokenRefresh.d.ts +26 -0
- package/dist/hooks/useWatermark.d.ts +20 -0
- package/dist/i18n/components/LocaleSwitcher/index.d.ts +1 -0
- package/dist/i18n/components/index.d.ts +1 -0
- package/dist/i18n/config/i18n.d.ts +18 -0
- package/dist/i18n/hooks/index.d.ts +2 -0
- package/dist/i18n/hooks/useI18n.d.ts +96 -0
- package/dist/i18n/hooks/useLocaleSync.d.ts +4 -0
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/utils/detector.d.ts +26 -0
- package/dist/i18n/utils/formatter.d.ts +38 -0
- package/dist/i18n/utils/index.d.ts +3 -0
- package/dist/i18n/utils/sync.d.ts +27 -0
- package/dist/index.d.ts +41 -0
- package/dist/locales/en-US/index.d.ts +2 -0
- package/dist/locales/index.d.ts +10 -0
- package/dist/locales/zh-CN/index.d.ts +2 -0
- package/dist/nprogress-CwfUlis6.js +159 -0
- package/dist/nprogress-CwfUlis6.js.map +1 -0
- package/dist/preferences/components/PreferencesPanel/AppearancePanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/GeneralPanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/LayoutPanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/ShortcutKeyPanel.d.ts +3 -0
- package/dist/preferences/components/PreferencesPanel/index.d.ts +8 -0
- package/dist/preferences/components/ThemeProvider/index.d.ts +9 -0
- package/dist/preferences/components/index.d.ts +2 -0
- package/dist/preferences/config/constants.d.ts +24 -0
- package/dist/preferences/config/darkTheme.d.ts +32 -0
- package/dist/preferences/config/default.d.ts +3 -0
- package/dist/preferences/config/index.d.ts +4 -0
- package/dist/preferences/config/lightTheme.d.ts +33 -0
- package/dist/preferences/hooks/index.d.ts +3 -0
- package/dist/preferences/hooks/useLocale.d.ts +23 -0
- package/dist/preferences/hooks/usePreferences.d.ts +31 -0
- package/dist/preferences/hooks/useThemeConfig.d.ts +2 -0
- package/dist/preferences/index.d.ts +5 -0
- package/dist/preferences/store/index.d.ts +24 -0
- package/dist/preferences/theme-transition.d.ts +17 -0
- package/dist/preferences/types/app.d.ts +238 -0
- package/dist/preferences/types/index.d.ts +4 -0
- package/dist/preferences/types/layout.d.ts +78 -0
- package/dist/preferences/types/preferences-root.d.ts +48 -0
- package/dist/preferences/types/theme.d.ts +29 -0
- package/dist/preferences/utils/diff.d.ts +7 -0
- package/dist/preferences/utils/merge.d.ts +9 -0
- package/dist/query-client.d.ts +9 -0
- package/dist/rolldown-runtime-BbCBk-LD.js +19 -0
- package/dist/router/factory.d.ts +7 -0
- package/dist/router/generators/generate-menus.d.ts +13 -0
- package/dist/router/generators/generate-routes-backend.d.ts +12 -0
- package/dist/router/generators/generate-routes-frontend.d.ts +17 -0
- package/dist/router/generators/index.d.ts +3 -0
- package/dist/router/index.d.ts +5 -0
- package/dist/router/routes-context.d.ts +8 -0
- package/dist/router/types/index.d.ts +207 -0
- package/dist/router/utils/index.d.ts +8 -0
- package/dist/router/utils/inject-redirect.d.ts +6 -0
- package/dist/router/utils/lazy.d.ts +11 -0
- package/dist/router/utils/loader.d.ts +14 -0
- package/dist/router/utils/menu.d.ts +5 -0
- package/dist/router/utils/merge-route-modules.d.ts +23 -0
- package/dist/router/utils/reset-routes.d.ts +18 -0
- package/dist/router/utils/sort-routes.d.ts +5 -0
- package/dist/router/utils/transform-meta-to-handle.d.ts +11 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/storage.class.d.ts +125 -0
- package/dist/storage/storage.types.d.ts +199 -0
- package/dist/stores/auth.d.ts +56 -0
- package/dist/stores/index.d.ts +2 -0
- package/dist/stores/user.d.ts +32 -0
- package/dist/transport/rest/captcha-headers.d.ts +2 -0
- package/dist/transport/rest/index.d.ts +8 -0
- package/dist/transport/rest/modules/downloader.d.ts +9 -0
- package/dist/transport/rest/modules/interceptor.d.ts +9 -0
- package/dist/transport/rest/modules/uploader.d.ts +10 -0
- package/dist/transport/rest/pagination.d.ts +73 -0
- package/dist/transport/rest/preset-interceptors.d.ts +25 -0
- package/dist/transport/rest/request-api.d.ts +6 -0
- package/dist/transport/rest/request-client.d.ts +87 -0
- package/dist/transport/rest/types.d.ts +38 -0
- package/dist/transport/rest/utils.d.ts +16 -0
- package/dist/transport/sse/event.d.ts +44 -0
- package/dist/transport/sse/index.d.ts +5 -0
- package/dist/transport/sse/sse_client.d.ts +76 -0
- package/dist/transport/sse/types.d.ts +27 -0
- package/dist/types.d.ts +44 -0
- package/dist/utils/color.d.ts +27 -0
- package/dist/utils/date.d.ts +5 -0
- package/dist/utils/diff.d.ts +6 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/inference.d.ts +111 -0
- package/dist/utils/merge.d.ts +17 -0
- package/dist/utils/nprogress.d.ts +11 -0
- package/dist/utils/tree.d.ts +27 -0
- package/dist/utils/url.d.ts +11 -0
- package/dist/utils/utils.d.ts +37 -0
- package/package.json +77 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 tx7do
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,75 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @go-wind/admin-react
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
React 19 管理端壳层**机制**包,自 [go-wind-admin](https://github.com/tx7do/go-wind-admin) 的 `src/core` 及关联基础设施抽取。
|
|
4
|
+
|
|
5
|
+
**边界约定:机制进包,数据留宿主。**
|
|
6
|
+
|
|
7
|
+
| 进包(机制) | 留宿主(数据/视图) |
|
|
8
|
+
|---|---|
|
|
9
|
+
| axios transport(token 轮换、验证码 header、分页工具)+ SSE 客户端 | generated API 客户端(`make ts` 产物)与 api hooks |
|
|
10
|
+
| auth store(内存态 token、MFA 挑战、登出清理),数据面经 `AuthGateway` 注入 | 登录/刷新/登出等后端端点实现(宿主用自己再生成的 mutation 组装 gateway) |
|
|
11
|
+
| 路由工厂(frontend/backend 双权限模式)与菜单生成器 | `import.meta.glob` 扫出的 pageMap、路由表、权限码 |
|
|
12
|
+
| i18n 引擎(资源经 `initI18n` 注入,内置 common/auth/editor/preferences 框架命名空间) | 业务文案命名空间、`routes` 命名空间(业务路由标题) |
|
|
13
|
+
| 主题/偏好(ThemeProvider、PreferencesPanel、偏好 store) | 设计 token 覆盖、布局壳、登录页、业务页面 |
|
|
14
|
+
| 权限检查(useAccess / AccessControl / 字段级权限)、query client、通用 hooks/utils | —— |
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pnpm add @go-wind/admin-react
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
**单例关键库全部走 peerDependencies**(react / react-dom / antd / @ant-design/icons / @ant-design/pro-components / react-router-dom / react-i18next / i18next / @tanstack/react-query / zustand)——宿主必须提供同一实例,禁止包内自带副本(i18n 上下文、QueryClientProvider、zustand store 都要求单例)。
|
|
23
|
+
|
|
24
|
+
## Quick start(宿主 bootstrap 接线示例)
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import {
|
|
28
|
+
setAuthGateway, configureAdminRuntime, configureQueryClient,
|
|
29
|
+
initI18n, coreResources, connectSSEServer,
|
|
30
|
+
createAccessibleRouter, loginMutation, /* 宿主自己的 generated mutations */
|
|
31
|
+
} from '@go-wind/admin-react';
|
|
32
|
+
import { apiClient, fetchUserProfile } from '@/api'; // 宿主 generated 层
|
|
33
|
+
|
|
34
|
+
// 1. 认证数据面注入(密钥属宿主 env,包内零 import.meta.env 直读)
|
|
35
|
+
setAuthGateway({
|
|
36
|
+
login: (p) => loginMutation.execute(p),
|
|
37
|
+
verifyMfa: (p) => verifyMfaMutation.execute(p),
|
|
38
|
+
ssoLogin: (p) => apiClient.authenticationService.SsoLogin(p),
|
|
39
|
+
logout: () => logoutMutation.execute({}),
|
|
40
|
+
refresh: () => refreshTokenMutation.execute(undefined),
|
|
41
|
+
fetchProfile: async () => (await fetchUserProfile()) as AdminUserInfo,
|
|
42
|
+
encryptPassword: (plain) => encryptPasswordEnvelope(plain, import.meta.env.VITE_PASSWORD_RSA_PUB),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// 2. 运行时开关(lib 构建会把 import.meta.env 静态替换成包构建时的值,故走运行时注入)
|
|
46
|
+
configureAdminRuntime({ isDev: import.meta.env.DEV });
|
|
47
|
+
configureQueryClient({ isDev: import.meta.env.DEV });
|
|
48
|
+
|
|
49
|
+
// 3. i18n:包框架命名空间 + 宿主业务命名空间合并(同名宿主覆盖)
|
|
50
|
+
const resources = { 'zh-CN': { ...coreResources['zh-CN'], ...appZhCN }, 'en-US': { ...coreResources['en-US'], ...appEnUS } };
|
|
51
|
+
await initI18n(initialLang, { resources, namespaces: Object.keys(resources['zh-CN']), missingKeyWarn: import.meta.env.DEV });
|
|
52
|
+
|
|
53
|
+
// 4. SSE 地址由宿主解析后传入(后续刷新重连复用)
|
|
54
|
+
connectSSEServer(import.meta.env.VITE_SSE_URL ?? '/api/sse');
|
|
55
|
+
|
|
56
|
+
// 5. 路由工厂(pageMap 由宿主 glob 注入)
|
|
57
|
+
const { router } = await createAccessibleRouter(accessMode, {
|
|
58
|
+
routes, layoutMap, pageMap, fetchMenuListAsync,
|
|
59
|
+
defaultHomePath: ROUTES.DEFAULT_HOME,
|
|
60
|
+
});
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
样式(PreferencesPanel 的 less 产物):
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import '@go-wind/admin-react/style.css';
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Host integration notes (Vite)
|
|
70
|
+
|
|
71
|
+
无 Monaco worker / CJS 兼容坑,无需 `optimizeDeps.exclude`,正常消费即可(同 `@go-wind/bi-*`)。链接本地开发用 `pnpm add @go-wind/admin-react@link:../相对路径`(先 `pnpm build` 出 dist)。
|
|
72
|
+
|
|
73
|
+
## 内部结构
|
|
74
|
+
|
|
75
|
+
`access/`(权限)· `auth-gateway.ts`(认证数据面边界)· `env.ts`(运行时 dev 标志)· `i18n/`(引擎+hooks+LocaleSwitcher)· `locales/`(框架文案)· `preferences/`(主题偏好)· `query-client.ts` · `router/`(工厂/生成器)· `storage/` · `stores/`(auth/user)· `transport/`(rest+sse)· `hooks/`(useTokenRefresh 等)· `utils/` · `components/Loading`(`ThemeLoading`)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AccessControl 权限控制组件
|
|
3
|
+
* 对齐 Vue 版 <AccessControl>,无权限时不渲染子元素
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* // 基于权限码
|
|
8
|
+
* <AccessControl codes={['sys:user:create']} type="code">
|
|
9
|
+
* <Button>新建用户</Button>
|
|
10
|
+
* </AccessControl>
|
|
11
|
+
*
|
|
12
|
+
* // 基于角色码
|
|
13
|
+
* <AccessControl codes={['ADMIN']} type="role">
|
|
14
|
+
* <Button>管理员操作</Button>
|
|
15
|
+
* </AccessControl>
|
|
16
|
+
*
|
|
17
|
+
* // 混合匹配(meta.authority 模式)
|
|
18
|
+
* <AccessControl codes={['admin', 'sys:user:export']} type="authority">
|
|
19
|
+
* <Button>导出</Button>
|
|
20
|
+
* </AccessControl>
|
|
21
|
+
*
|
|
22
|
+
* // 自定义 fallback
|
|
23
|
+
* <AccessControl codes={['sys:user:delete']} type="code" fallback={<span>无权限</span>}>
|
|
24
|
+
* <Button danger>删除</Button>
|
|
25
|
+
* </AccessControl>
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
import type { ReactNode } from 'react';
|
|
29
|
+
export interface AccessControlProps {
|
|
30
|
+
/** 子元素 */
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
/** 所需权限码/角色码列表 */
|
|
33
|
+
codes: string[];
|
|
34
|
+
/** 权限类型 */
|
|
35
|
+
type?: 'code' | 'role' | 'authority';
|
|
36
|
+
/** 无权限时的替代内容(默认不渲染) */
|
|
37
|
+
fallback?: ReactNode;
|
|
38
|
+
}
|
|
39
|
+
export declare const AccessControl: ({ children, codes, type, fallback, }: AccessControlProps) => import("react").JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 字段级权限工具
|
|
3
|
+
*
|
|
4
|
+
* 隐藏字段集来自 GetMyPermissionCode 响应的 hiddenFields("资源.字段" 串数组,
|
|
5
|
+
* 如 "User.email"),由后端按角色配置在登录期聚合。前端用它驱动列/字段显隐;
|
|
6
|
+
* 真正的数据裁剪在后端响应侧完成,这里只管 UI 呈现。
|
|
7
|
+
*/
|
|
8
|
+
/** 从 "资源.字段" 串数组解析出指定资源的隐藏字段名集合 */
|
|
9
|
+
export declare function parseResourceHiddenFields(entries: string[] | undefined | null, resource: string): Set<string>;
|
|
10
|
+
/** 判断指定资源的某字段是否被隐藏 */
|
|
11
|
+
export declare function isFieldHidden(entries: string[] | undefined | null, resource: string, field: string): boolean;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { useAccess, getAccessStatic, checkAccessByRoles, checkAccessByCodes, checkAccessByAuthority } from './use-access';
|
|
2
|
+
export { AccessControl } from './access-control';
|
|
3
|
+
export type { AccessControlProps } from './access-control';
|
|
4
|
+
export { parseResourceHiddenFields, isFieldHidden } from './field-permission';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 核心权限判断逻辑(纯函数,可复用)
|
|
3
|
+
*/
|
|
4
|
+
declare function checkAccessByRoles(userRoles: string[], requiredRoles: string[]): boolean;
|
|
5
|
+
declare function checkAccessByCodes(accessCodes: string[], requiredCodes: string[]): boolean;
|
|
6
|
+
declare function checkAccessByAuthority(userRoles: string[], accessCodes: string[], authority: string[] | undefined): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* React Hook:权限鉴权(组件内使用)
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* const { hasAccessByCodes, hasAccessByRoles, hasAccessByAuthority } = useAccess();
|
|
13
|
+
*
|
|
14
|
+
* // 按钮级权限
|
|
15
|
+
* {hasAccessByCodes(['sys:user:create']) && <Button>新建</Button>}
|
|
16
|
+
* {hasAccessByRoles(['admin']) && <Button>系统设置</Button>}
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
declare function useAccess(): {
|
|
20
|
+
/** 用户的角色码列表 */
|
|
21
|
+
userRoles: string[];
|
|
22
|
+
/** 用户的权限码列表 */
|
|
23
|
+
accessCodes: string[];
|
|
24
|
+
/** 基于角色码鉴权 */
|
|
25
|
+
hasAccessByRoles: (roles: string[]) => boolean;
|
|
26
|
+
/** 基于权限码鉴权 */
|
|
27
|
+
hasAccessByCodes: (codes: string[]) => boolean;
|
|
28
|
+
/** 基于 meta.authority 鉴权(角色码+权限码混合匹配) */
|
|
29
|
+
hasAccessByAuthority: (authority: string[] | undefined) => boolean;
|
|
30
|
+
/** 获取合并权限列表 */
|
|
31
|
+
getAllPermissions: () => string[];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 非组件内的静态访问方法(用于路由生成、工具函数等非 React 场景)
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* // 在路由生成中使用
|
|
39
|
+
* const freshPermissions = getAccessStatic().getAllPermissions();
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function getAccessStatic(): {
|
|
43
|
+
userRoles: string[];
|
|
44
|
+
accessCodes: string[];
|
|
45
|
+
hasAccessByRoles: (roles: string[]) => boolean;
|
|
46
|
+
hasAccessByCodes: (codes: string[]) => boolean;
|
|
47
|
+
hasAccessByAuthority: (authority: string[] | undefined) => boolean;
|
|
48
|
+
getAllPermissions: () => string[];
|
|
49
|
+
};
|
|
50
|
+
export { useAccess, checkAccessByRoles, checkAccessByCodes, checkAccessByAuthority };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.appearance-panel{flex-direction:column;gap:12px;display:flex}.appearance-section{flex-direction:column;gap:8px;display:flex}.appearance-section .section-title{color:var(--ant-color-text);margin:0 0 8px;font-size:14px;font-weight:600}.appearance-section .preference-item{justify-content:space-between;align-items:center;padding:4px 0;display:flex}.appearance-section .preference-item.disabled{opacity:.4;pointer-events:none}.appearance-section .preference-item.width-control{gap:12px}.appearance-section .preference-item .ant-switch{background:var(--ant-color-fill)}.appearance-section .preference-item .ant-switch.ant-switch-checked{background:var(--ant-color-primary)}.appearance-section .theme-mode-options{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.appearance-section .theme-mode-wrapper{cursor:pointer;flex-direction:column;align-items:center;gap:6px;width:100%;display:flex}.appearance-section .theme-mode-item{border:1px solid var(--ant-color-border);background:0 0;border-radius:6px;justify-content:center;align-items:center;width:100%;height:64px;padding:0;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex}.appearance-section .theme-mode-item:hover{border-color:var(--ant-color-primary);background:var(--ant-color-primary-bg);transform:translateY(-2px);box-shadow:0 4px 12px #0000001a}.appearance-section .theme-mode-item:hover .theme-icon{color:var(--gowind-primary-text);transform:scale(1.1)}.appearance-section .theme-mode-item:hover~.theme-mode-label{color:var(--gowind-primary-text);font-weight:500}.appearance-section .theme-mode-item:active{transform:translateY(0);box-shadow:0 2px 6px #00000014}.appearance-section .theme-mode-item.active{border:2px solid var(--ant-color-primary);background:0 0}.appearance-section .theme-mode-item.active .theme-icon{color:var(--gowind-primary-text)}.appearance-section .theme-mode-item.active~.theme-mode-label{color:var(--gowind-primary-text);font-weight:500}.appearance-section .theme-mode-item .theme-icon{color:var(--ant-color-text-secondary);font-size:24px;transition:all .3s}.appearance-section .theme-mode-label{color:var(--ant-color-text-secondary);font-size:11px;font-weight:400;transition:all .3s}.appearance-section .builtin-themes-grid{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.appearance-section .builtin-theme-wrapper{cursor:pointer;flex-direction:column;align-items:center;gap:4px;width:100%;display:flex}.appearance-section .builtin-theme-item{border:1px solid var(--ant-color-border);background:0 0;border-radius:6px;flex-direction:column;justify-content:center;align-items:center;width:100%;height:64px;padding:0;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex}.appearance-section .builtin-theme-item:hover{border-color:var(--ant-color-primary);background:var(--ant-color-primary-bg);transform:translateY(-2px);box-shadow:0 4px 12px #0000001a}.appearance-section .builtin-theme-item:hover .theme-color-preview{transform:scale(1.15);box-shadow:0 2px 8px #00000026}.appearance-section .builtin-theme-item:hover~.theme-name{color:var(--gowind-primary-text);font-weight:500}.appearance-section .builtin-theme-item:active{transform:translateY(0);box-shadow:0 2px 6px #00000014}.appearance-section .builtin-theme-item.active{border:2px solid var(--ant-color-primary);background:0 0}.appearance-section .builtin-theme-item.active~.theme-name{color:var(--gowind-primary-text);font-weight:500}.appearance-section .builtin-theme-item .theme-color-preview{border-radius:5px;justify-content:center;align-items:center;width:28px;height:28px;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex}.appearance-section .builtin-theme-item .theme-color-preview .custom-icon{color:var(--ant-color-text);font-size:20px}.appearance-section .builtin-theme-item .theme-name{color:var(--ant-color-text-secondary);margin:0;font-size:11px;font-weight:400}.appearance-section .radius-segmented{background:var(--ant-color-fill-secondary);border-radius:6px;justify-content:center;align-items:center;width:100%;height:64px;padding:0;display:flex}.appearance-section .radius-segmented .ant-segmented-group{gap:4px;padding:2px;display:flex}.appearance-section .radius-segmented .ant-segmented-item{border-radius:5px;flex:1;justify-content:center;align-items:center;height:54px;font-size:12px;font-weight:500;transition:all .2s;display:flex}.appearance-section .radius-segmented .ant-segmented-item.ant-segmented-item-selected{background:var(--ant-color-bg-container);box-shadow:0 2px 4px #0000001a}.layout-panel{flex-direction:column;gap:12px;display:flex}.layout-section{flex-direction:column;gap:8px;display:flex}.layout-section .section-title{color:var(--ant-color-text);margin:0 0 8px;font-size:14px;font-weight:600}.layout-section .preference-item{justify-content:space-between;align-items:center;padding:6px 0;display:flex}.layout-section .preference-item.disabled{opacity:.4;pointer-events:none}.layout-section .preference-item.width-control{gap:6px}.layout-section .preference-item .ant-switch{background:var(--ant-color-fill)}.layout-section .preference-item .ant-switch.ant-switch-checked{background:var(--ant-color-primary)}.layout-section .preference-item .ant-input,.layout-section .preference-item .ant-select{background:var(--ant-color-fill);border:1px solid var(--ant-color-border)}.layout-section .preference-item .ant-input:hover,.layout-section .preference-item .ant-select:hover{border-color:var(--ant-color-primary)}.layout-section .preference-item .ant-input:focus,.layout-section .preference-item .ant-select:focus,.layout-section .preference-item .ant-input.ant-input-affix-wrapper-focused,.layout-section .preference-item .ant-select.ant-input-affix-wrapper-focused,.layout-section .preference-item .ant-input.ant-select-focused .ant-select-selector,.layout-section .preference-item .ant-select.ant-select-focused .ant-select-selector{border-color:var(--ant-color-primary);box-shadow:0 0 0 2px var(--ant-color-primary-bg)}.layout-section .preference-item .ant-input.ant-input-disabled,.layout-section .preference-item .ant-select.ant-input-disabled,.layout-section .preference-item .ant-input.ant-select-disabled,.layout-section .preference-item .ant-select.ant-select-disabled{background:var(--ant-color-fill-secondary);cursor:not-allowed}.layout-section .preference-item .ant-input .ant-select-selector,.layout-section .preference-item .ant-select .ant-select-selector{background:0 0;border:none}.layout-section .layout-grid{grid-template-columns:repeat(2,1fr);justify-items:start;gap:8px;display:grid}.layout-section .layout-wrapper{cursor:pointer;flex-direction:column;align-items:center;gap:6px;width:100%;max-width:120px;display:flex}.layout-section .layout-item{border:1px solid var(--ant-color-border);background:0 0;border-radius:4px;width:100%;padding:8px 6px;transition:all .3s cubic-bezier(.4,0,.2,1)}.layout-section .layout-item:hover{border-color:var(--ant-color-primary);background:var(--ant-color-primary-bg);transform:translateY(-1px);box-shadow:0 1px 4px #0000000f}.layout-section .layout-item:hover~.layout-label span{color:var(--gowind-primary-text);font-weight:500}.layout-section .layout-item.active{border:2px solid var(--ant-color-primary);background:0 0}.layout-section .layout-item.active~.layout-label span{color:var(--gowind-primary-text);font-weight:500}.layout-section .layout-item .layout-preview{background:var(--ant-color-fill-secondary);border-radius:4px;justify-content:center;align-items:center;width:100%;height:65px;padding:2px;display:flex;overflow:hidden}.layout-section .layout-item .layout-preview .layout-visual{gap:2px;width:100%;height:100%;display:flex;position:relative}.layout-section .layout-item .layout-preview .layout-visual .sidebar{background:var(--ant-color-primary);border-radius:2px;flex-direction:column;align-items:center;gap:2px;width:12px;padding:2px 0;display:flex;position:relative;overflow:hidden}.layout-section .layout-item .layout-preview .layout-visual .sidebar.gray{background:var(--ant-color-fill);border:1px solid var(--ant-color-border)}.layout-section .layout-item .layout-preview .layout-visual .sidebar.gray:before{background:var(--ant-color-text-secondary)}.layout-section .layout-item .layout-preview .layout-visual .sidebar.gray:after{background:var(--ant-color-text-tertiary);box-shadow:0 5px 0 var(--ant-color-text-tertiary), 0 10px 0 var(--ant-color-text-tertiary), 0 15px 0 var(--ant-color-text-tertiary)}.layout-section .layout-item .layout-preview .layout-visual .sidebar:before{content:"";background:#fffffff2;border-radius:1.5px;flex-shrink:0;width:6px;height:6px}.layout-section .layout-item .layout-preview .layout-visual .sidebar:after{content:"";background:#ffffffe6;border-radius:1px;width:8px;height:1.5px;box-shadow:0 3px #ffffffe6,0 6px #ffffffe6,0 9px #ffffffe6}.layout-section .layout-item .layout-preview .layout-visual .sidebar.thin{width:6px}.layout-section .layout-item .layout-preview .layout-visual .sidebar.thin:before,.layout-section .layout-item .layout-preview .layout-visual .sidebar.thin:after{left:1px;right:1px}.layout-section .layout-item .layout-preview .layout-visual .sidebar.thin.gray:before{display:none}.layout-section .layout-item .layout-preview .layout-visual .main-content{flex-direction:column;flex:1;gap:2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual .main-content .header-bar{background:var(--ant-color-primary);border-radius:2px;justify-content:space-between;align-items:center;height:8px;padding:0 2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual .main-content .header-bar.gray{background:var(--ant-color-fill);border:1px solid var(--ant-color-border)}.layout-section .layout-item .layout-preview .layout-visual .main-content .header-bar.gray:before{background:var(--ant-color-text-secondary);box-shadow:6px 0 0 var(--ant-color-text-secondary), 12px 0 0 var(--ant-color-text-secondary)}.layout-section .layout-item .layout-preview .layout-visual .main-content .header-bar:before{content:"";background:#ffffffe6;border-radius:50%;flex-shrink:0;width:2.5px;height:2.5px;box-shadow:4px 0 #ffffffe6,8px 0 #ffffffe6}.layout-section .layout-item .layout-preview .layout-visual .main-content .header-bar.full-width{width:100%;position:relative;top:auto;left:auto}.layout-section .layout-item .layout-preview .layout-visual .main-content .header-bar .menu-item{background:#fffc;border-radius:1px;width:6px;height:2.5px;margin-right:2px;display:inline-block}.layout-section .layout-item .layout-preview .layout-visual .main-content .header-bar .menu-item:last-child{margin-right:0}.layout-section .layout-item .layout-preview .layout-visual .main-content .content-area{flex-direction:column;flex:1;gap:2px;padding:0;display:flex}.layout-section .layout-item .layout-preview .layout-visual .main-content .content-area.full-width{width:100%}.layout-section .layout-item .layout-preview .layout-visual .main-content .content-area .block-row{flex:1;gap:2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual .main-content .content-area .block-row .block{background:var(--ant-color-fill);border-radius:1.5px;flex:1}.layout-section .layout-item .layout-preview .layout-visual .main-content .content-area .block:nth-child(2){background:var(--ant-color-fill);border-radius:1.5px;flex:1.2}.layout-section .layout-item .layout-preview .layout-visual.sidebar-mixed-nav{gap:2px}.layout-section .layout-item .layout-preview .layout-visual.sidebar-mixed-nav .sidebar.gray:before{background:var(--ant-color-text-secondary);box-shadow:none}.layout-section .layout-item .layout-preview .layout-visual.sidebar-mixed-nav .sidebar.gray:after{background:var(--ant-color-text-tertiary);box-shadow:0 5px 0 var(--ant-color-text-tertiary), 0 10px 0 var(--ant-color-text-tertiary), 0 15px 0 var(--ant-color-text-tertiary)}.layout-section .layout-item .layout-preview .layout-visual.header-nav{flex-direction:column;gap:0}.layout-section .layout-item .layout-preview .layout-visual.header-nav .content-wrapper{flex-direction:column;gap:2px;width:100%;height:100%;display:flex}.layout-section .layout-item .layout-preview .layout-visual.header-nav .header-bar{background:var(--ant-color-primary);align-items:center;gap:2px;width:100%;padding:0 2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual.header-nav .header-bar:before{background:#ffffffe6;box-shadow:5px 0 #ffffffe6,10px 0 #ffffffe6}.layout-section .layout-item .layout-preview .layout-visual.header-nav .header-bar .menu-item{background:#fffc;border-radius:1px;width:8px;height:3px;display:inline-block}.layout-section .layout-item .layout-preview .layout-visual.header-nav .content-area{flex-direction:column;flex:1;gap:2px;width:100%;padding:0;display:flex}.layout-section .layout-item .layout-preview .layout-visual.header-nav .content-area .block-row{flex:1;gap:2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual.header-nav .content-area .block-row .block{background:var(--ant-color-fill);border-radius:1.5px;flex:1}.layout-section .layout-item .layout-preview .layout-visual.header-nav .content-area .block:nth-child(2){background:var(--ant-color-fill);border-radius:1.5px;flex:1.2}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .content-wrapper{flex-direction:column;gap:0;width:100%;height:100%;display:flex}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .header-bar{background:var(--ant-color-primary);align-items:center;gap:3px;width:100%;padding:0 3px;display:flex}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .header-bar:before{background:#ffffffe6;box-shadow:5px 0 #ffffffe6,10px 0 #ffffffe6}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .header-bar .menu-item{background:#fffc;border-radius:1px;width:8px;height:3px;display:inline-block}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .main-content{flex-direction:row;flex:1;gap:2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .main-content .content-area{flex-direction:column;flex:1;gap:2px;padding:0;display:flex}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .main-content .content-area .block-row{flex:1;gap:2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .main-content .content-area .block-row .block{background:var(--ant-color-fill);border-radius:1.5px;flex:1}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .main-content .content-area .block:nth-child(2){background:var(--ant-color-fill);border-radius:1.5px;flex:1.2}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .sidebar.thin{width:6px}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .sidebar.thin:before{display:none}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .sidebar.thin:after{background:var(--ant-color-text-tertiary);box-shadow:0 5px 0 var(--ant-color-text-tertiary), 0 10px 0 var(--ant-color-text-tertiary), 0 15px 0 var(--ant-color-text-tertiary)}.layout-section .layout-item .layout-preview .layout-visual.mixed-nav .sidebar.gray{background:var(--ant-color-fill);border:1px solid var(--ant-color-border)}.layout-section .layout-item .layout-preview .layout-visual.full-content .content-area{flex-direction:column;gap:2px;width:100%;height:100%;padding:0;display:flex}.layout-section .layout-item .layout-preview .layout-visual.full-content .content-area .block-row{flex:1;gap:2px;display:flex}.layout-section .layout-item .layout-preview .layout-visual.full-content .content-area .block-row .block{background:var(--ant-color-fill);border-radius:1.5px;flex:1}.layout-section .layout-item .layout-preview .layout-visual.full-content .content-area .block:nth-child(2){background:var(--ant-color-fill);border-radius:1.5px;flex:1.2}.layout-section .layout-item .layout-label{color:var(--ant-color-text-secondary);align-items:center;gap:2px;font-size:11px;font-weight:400;display:flex}.layout-section .layout-item .layout-label .help-icon{color:var(--ant-color-text-tertiary);cursor:help;font-size:11px}.layout-section .content-compact-grid{grid-template-columns:repeat(2,1fr);justify-items:start;gap:8px;display:grid}.layout-section .content-compact-wrapper{cursor:pointer;flex-direction:column;align-items:center;gap:6px;width:100%;max-width:120px;display:flex}.layout-section .content-compact-item{border:1px solid var(--ant-color-border);background:0 0;border-radius:4px;width:100%;padding:8px 6px;transition:all .3s cubic-bezier(.4,0,.2,1)}.layout-section .content-compact-item:hover{border-color:var(--ant-color-primary);background:var(--ant-color-primary-bg);transform:translateY(-1px);box-shadow:0 1px 4px #0000000f}.layout-section .content-compact-item:hover~span{color:var(--gowind-primary-text);font-weight:500}.layout-section .content-compact-item.active{border:2px solid var(--ant-color-primary);background:0 0}.layout-section .content-compact-item.active~span{color:var(--gowind-primary-text);font-weight:500}.layout-section .content-compact-item .content-preview{background:var(--ant-color-fill-secondary);border-radius:4px;justify-content:center;align-items:center;width:100%;height:65px;padding:2px;display:flex;position:relative;overflow:hidden}.layout-section .content-compact-item .content-preview:before{content:"";background:var(--ant-color-primary);border-radius:4px 4px 0 0;height:8px;position:absolute;top:0;left:0;right:0}.layout-section .content-compact-item .content-preview:after{content:"";z-index:1;background:#ffffffe6;border-radius:50%;width:3px;height:3px;position:absolute;top:3px;right:5px;box-shadow:-5px 0 #ffffffe6,-10px 0 #ffffffe6}.layout-section .content-compact-item .content-preview .preview-bar{background:var(--ant-color-fill);border-radius:2px;flex-direction:column;gap:2px;height:calc(100% - 16px);margin-top:12px;padding:2px;display:flex}.layout-section .content-compact-item .content-preview .preview-bar.narrow{width:70%;margin-left:auto;margin-right:auto}.layout-section .content-compact-item .content-preview .preview-bar.narrow:before{content:"";background:var(--ant-color-bg-container);box-shadow:0 0 0 1px var(--ant-color-border);border-radius:1.5px;flex:1}.layout-section .content-compact-item .content-preview .preview-bar.wide{width:100%}.layout-section .content-compact-item .content-preview .preview-bar.wide:before{content:"";background:var(--ant-color-bg-container);box-shadow:0 0 0 1px var(--ant-color-border);border-radius:1.5px;flex:1}.layout-section .content-compact-item span{color:var(--ant-color-text-secondary);font-size:11px;font-weight:400}html[data-theme=dark] .layout-section .ant-segmented{background:var(--ant-color-fill);border:1px solid var(--ant-color-border)}html[data-theme=dark] .layout-section .ant-segmented .ant-segmented-item{color:var(--ant-color-text-secondary)}html[data-theme=dark] .layout-section .ant-segmented .ant-segmented-item.ant-segmented-item-selected{background:var(--ant-color-primary);color:var(--ant-color-white)}html[data-theme=dark] .layout-section .ant-segmented .ant-segmented-item:hover:not(.ant-segmented-item-selected){color:var(--ant-color-text);background:var(--ant-color-fill-secondary)}html[data-theme=dark] .layout-section .ant-input,html[data-theme=dark] .layout-section .ant-select{background:var(--ant-color-fill);border:1px solid var(--ant-color-border);color:var(--ant-color-text)}html[data-theme=dark] .layout-section .ant-input:hover,html[data-theme=dark] .layout-section .ant-select:hover{border-color:var(--ant-color-primary)}html[data-theme=dark] .layout-section .ant-input:focus,html[data-theme=dark] .layout-section .ant-select:focus,html[data-theme=dark] .layout-section .ant-input.ant-input-affix-wrapper-focused,html[data-theme=dark] .layout-section .ant-select.ant-input-affix-wrapper-focused,html[data-theme=dark] .layout-section .ant-input.ant-select-focused .ant-select-selector,html[data-theme=dark] .layout-section .ant-select.ant-select-focused .ant-select-selector{border-color:var(--ant-color-primary);box-shadow:none}html[data-theme=dark] .layout-section .ant-input.ant-input-disabled,html[data-theme=dark] .layout-section .ant-select.ant-input-disabled,html[data-theme=dark] .layout-section .ant-input.ant-select-disabled,html[data-theme=dark] .layout-section .ant-select.ant-select-disabled{background:var(--ant-color-fill-secondary);color:var(--ant-color-text-secondary)}html[data-theme=dark] .layout-section .ant-input .ant-select-selector,html[data-theme=dark] .layout-section .ant-select .ant-select-selector{color:var(--ant-color-text)!important;background:0 0!important}.shortcut-panel{flex-direction:column;gap:12px;display:flex}.shortcut-section{flex-direction:column;gap:8px;display:flex}.shortcut-section .section-title{color:var(--ant-color-text);margin:0 0 8px;font-size:14px;font-weight:600}.shortcut-section .preference-item{justify-content:space-between;align-items:center;padding:6px 0;display:flex}.shortcut-section .preference-item.disabled{opacity:.4;pointer-events:none}.shortcut-section .preference-item .ant-switch{background:var(--ant-color-fill)}.shortcut-section .preference-item .ant-switch.ant-switch-checked{background:var(--ant-color-primary)}.shortcut-section .shortcut-key-row{align-items:center;gap:6px;display:flex}.shortcut-section .kbd-badge{min-width:28px;height:26px;color:var(--ant-color-text-secondary);background:var(--ant-color-fill-secondary);border:1px solid var(--ant-color-border);box-shadow:0 1px 0 var(--ant-color-border);border-radius:5px;justify-content:center;align-items:center;padding:3px 8px;font-family:monospace;font-size:12px;font-weight:500;display:inline-flex}.general-panel{flex-direction:column;gap:12px;display:flex}.general-section{flex-direction:column;gap:8px;display:flex}.general-section .section-title{color:var(--ant-color-text);margin:0 0 8px;font-size:14px;font-weight:600}.general-section .preference-item{justify-content:space-between;align-items:center;padding:6px 0;display:flex}.general-section .preference-item.disabled{opacity:.4;pointer-events:none}.general-section .preference-item .ant-switch{background:var(--ant-color-fill)}.general-section .preference-item .ant-switch.ant-switch-checked{background:var(--ant-color-primary)}.general-section .transition-animations.disabled{opacity:.5;pointer-events:none}.general-section .transition-animations .transition-grid{grid-template-columns:repeat(4,1fr);gap:8px;display:grid}.general-section .transition-animations .transition-wrapper{cursor:pointer;flex-direction:column;align-items:center;gap:6px;width:100%;display:flex}.general-section .transition-animations .transition-item{border:1px solid var(--ant-color-border);background:0 0;border-radius:4px;width:100%;padding:8px 6px;transition:all .3s cubic-bezier(.4,0,.2,1)}.general-section .transition-animations .transition-item:hover{border-color:var(--ant-color-primary);background:var(--ant-color-primary-bg);transform:translateY(-1px);box-shadow:0 1px 4px #0000000f}.general-section .transition-animations .transition-item:hover~.transition-label{color:var(--gowind-primary-text);font-weight:500}.general-section .transition-animations .transition-item.active{border:2px solid var(--ant-color-primary);background:0 0}.general-section .transition-animations .transition-item.active~.transition-label{color:var(--gowind-primary-text);font-weight:500}.general-section .transition-animations .transition-item.active .transition-preview{background:var(--ant-color-fill-quaternary)}.general-section .transition-animations .transition-item .transition-preview{background:var(--ant-color-fill-secondary);border-radius:4px;justify-content:center;align-items:center;width:56px;height:56px;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;position:relative;overflow:hidden}.general-section .transition-animations .transition-item .transition-preview .animation-box{opacity:1;border:3px solid var(--ant-color-primary);background:0 0;border-radius:4px;width:36px;height:36px;transition:all .3s cubic-bezier(.4,0,.2,1)}.general-section .transition-animations .transition-item .transition-preview .animation-box.fade{animation:2s infinite fadeIn}.general-section .transition-animations .transition-item .transition-preview .animation-box.fade-down{animation:2s infinite fadeDown}.general-section .transition-animations .transition-item .transition-preview .animation-box.fade-slide{animation:2s infinite fadeSlide}.general-section .transition-animations .transition-item .transition-preview .animation-box.fade-up{animation:2s infinite fadeUp}.general-section .transition-animations .transition-item .transition-label{color:var(--ant-color-text-secondary);font-size:11px;font-weight:400}@keyframes fadeIn{0%,to{opacity:0;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}@keyframes fadeDown{0%,to{opacity:0;transform:translateY(-20px)}50%{opacity:1;transform:translateY(0)}}@keyframes fadeSlide{0%,to{opacity:0;transform:translate(-20px)}50%{opacity:1;transform:translate(0)}}@keyframes fadeUp{0%,to{opacity:0;transform:translateY(20px)}50%{opacity:1;transform:translateY(0)}}.preferences-drawer .ant-drawer-header{border-bottom:1px solid var(--ant-color-split);padding:16px 24px}.preferences-drawer .ant-drawer-footer{border-top:1px solid var(--ant-color-split)}.preferences-drawer .drawer-header{justify-content:space-between;align-items:flex-start;width:100%;display:flex}.preferences-drawer .drawer-title{color:var(--ant-color-text);margin:0;font-size:16px;font-weight:600;line-height:1.4}.preferences-drawer .drawer-subtitle{color:var(--ant-color-text-secondary);margin:4px 0 0;font-size:12px}.preferences-drawer .drawer-actions{gap:8px;display:flex}.preferences-drawer .drawer-actions .ant-btn{justify-content:center;align-items:center;width:32px;height:32px;padding:0;display:flex}.preferences-drawer .drawer-actions .ant-btn .anticon{font-size:16px}.preferences-drawer .drawer-tabs{margin-bottom:24px}.preferences-drawer .drawer-tabs .ant-segmented{background:var(--ant-color-fill-secondary);border-radius:6px;padding:2px}.preferences-drawer .drawer-tabs .ant-segmented .ant-segmented-item{border-radius:4px;transition:all .2s}.preferences-drawer .drawer-tabs .ant-segmented .ant-segmented-item.ant-segmented-item-selected{background:var(--ant-color-bg-container);box-shadow:0 2px 4px #0000001a}.preferences-drawer .drawer-content{padding-bottom:70px}.preferences-drawer .drawer-footer{justify-content:space-between;align-items:center;padding:16px 0;display:flex}.preferences-drawer .drawer-footer .ant-btn{flex:1}.list-table-col-resizer{z-index:3;cursor:col-resize;touch-action:none;-webkit-user-select:none;user-select:none;width:8px;position:absolute;top:0;bottom:0;right:0}.list-table-col-resizer:before{content:"";background-color:#0000;border-radius:1px;width:2px;transition:background-color .15s;position:absolute;top:25%;bottom:25%;right:3px}.list-table-col-resizer:hover:before,th.ant-table-cell-resizing .list-table-col-resizer:before{background-color:var(--ant-color-primary)}
|
|
2
|
+
/*$vite$:1*/
|