@qlover/create-app 0.7.10 → 0.7.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/index.cjs +6 -6
  3. package/dist/index.js +6 -6
  4. package/dist/templates/next-app/config/Identifier/api.ts +14 -0
  5. package/dist/templates/next-app/config/Identifier/common.ts +7 -0
  6. package/dist/templates/next-app/eslint.config.mjs +17 -0
  7. package/dist/templates/next-app/migrations/schema/UserSchema.ts +21 -10
  8. package/dist/templates/next-app/next.config.ts +1 -0
  9. package/dist/templates/next-app/package.json +1 -0
  10. package/dist/templates/next-app/public/locales/en.json +4 -1
  11. package/dist/templates/next-app/public/locales/zh.json +4 -1
  12. package/dist/templates/next-app/src/app/[locale]/admin/layout.tsx +4 -7
  13. package/dist/templates/next-app/src/app/[locale]/admin/page.tsx +16 -4
  14. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +62 -0
  15. package/dist/templates/next-app/src/app/[locale]/layout.tsx +1 -1
  16. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +1 -1
  17. package/dist/templates/next-app/src/app/[locale]/login/page.tsx +1 -1
  18. package/dist/templates/next-app/src/app/[locale]/page.tsx +3 -3
  19. package/dist/templates/next-app/src/app/[locale]/register/RegisterForm.tsx +1 -1
  20. package/dist/templates/next-app/src/app/[locale]/register/page.tsx +1 -1
  21. package/dist/templates/next-app/src/app/api/admin/users/route.ts +39 -0
  22. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +40 -0
  23. package/dist/templates/next-app/src/base/cases/AppConfig.ts +1 -1
  24. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +13 -2
  25. package/dist/templates/next-app/src/base/cases/PageParams.ts +1 -1
  26. package/dist/templates/next-app/src/base/cases/RequestState.ts +20 -0
  27. package/dist/templates/next-app/src/base/cases/UserServiceApi.ts +1 -1
  28. package/dist/templates/next-app/src/base/port/AdminLayoutInterface.ts +26 -0
  29. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +87 -0
  30. package/dist/templates/next-app/src/base/port/AppApiInterface.ts +1 -1
  31. package/dist/templates/next-app/src/base/port/AppUserApiInterface.ts +4 -4
  32. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +7 -0
  33. package/dist/templates/next-app/src/base/port/DBBridgeInterface.ts +3 -0
  34. package/dist/templates/next-app/src/base/port/PaginationInterface.ts +6 -0
  35. package/dist/templates/next-app/src/base/services/AdminUserService.ts +45 -0
  36. package/dist/templates/next-app/src/base/services/UserService.ts +1 -1
  37. package/dist/templates/next-app/src/base/services/adminApi/AdminApiRequester.ts +21 -0
  38. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +34 -0
  39. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +2 -2
  40. package/dist/templates/next-app/src/base/services/appApi/AppApiRequester.ts +56 -0
  41. package/dist/templates/next-app/src/base/services/appApi/AppUserApi.ts +30 -31
  42. package/dist/templates/next-app/src/base/services/appApi/AppUserApiBootstrap.ts +5 -4
  43. package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +1 -1
  44. package/dist/templates/next-app/src/core/bootstraps/BootstrapServer.ts +3 -14
  45. package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +2 -2
  46. package/dist/templates/next-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  47. package/dist/templates/next-app/src/core/clientIoc/ClientIOC.ts +1 -1
  48. package/dist/templates/next-app/src/core/clientIoc/ClientIOCRegister.ts +1 -1
  49. package/dist/templates/next-app/src/core/globals.ts +1 -1
  50. package/dist/templates/next-app/src/core/serverIoc/ServerIOC.ts +1 -1
  51. package/dist/templates/next-app/src/core/serverIoc/ServerIOCRegister.ts +1 -1
  52. package/dist/templates/next-app/src/server/ServerAuth.ts +13 -3
  53. package/dist/templates/next-app/src/server/SupabaseBridge.ts +37 -2
  54. package/dist/templates/next-app/src/server/UserCredentialToken.ts +1 -1
  55. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +10 -0
  56. package/dist/templates/next-app/src/server/port/{UserAuthInterface.ts → ServerAuthInterface.ts} +3 -1
  57. package/dist/templates/next-app/src/server/port/UserRepositoryInterface.ts +1 -1
  58. package/dist/templates/next-app/src/server/repositorys/UserRepository.ts +32 -1
  59. package/dist/templates/next-app/src/server/services/AdminAuthPlugin.ts +19 -0
  60. package/dist/templates/next-app/src/server/services/ApiUserService.ts +26 -0
  61. package/dist/templates/next-app/src/server/services/UserService.ts +3 -3
  62. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +48 -0
  63. package/dist/templates/next-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +74 -1
  64. package/dist/templates/next-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +73 -0
  65. package/dist/templates/next-app/src/styles/css/antd-themes/_common/index.css +3 -0
  66. package/dist/templates/next-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +70 -0
  67. package/dist/templates/next-app/src/styles/css/antd-themes/index.css +4 -3
  68. package/dist/templates/next-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  69. package/dist/templates/next-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  70. package/dist/templates/next-app/src/styles/css/antd-themes/menu/index.css +3 -0
  71. package/dist/templates/next-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  72. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +33 -0
  73. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +32 -0
  74. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  75. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +35 -0
  76. package/dist/templates/next-app/src/styles/css/antd-themes/table/_default.css +44 -0
  77. package/dist/templates/next-app/src/styles/css/antd-themes/table/dark.css +43 -0
  78. package/dist/templates/next-app/src/styles/css/antd-themes/table/index.css +3 -0
  79. package/dist/templates/next-app/src/styles/css/antd-themes/table/pink.css +43 -0
  80. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +106 -0
  81. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +68 -17
  82. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +6 -1
  83. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +1 -1
  84. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +11 -3
  85. package/dist/templates/next-app/src/uikit/components/LanguageSwitcher.tsx +1 -1
  86. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +1 -1
  87. package/dist/templates/next-app/src/uikit/hook/useIOC.ts +1 -1
  88. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +7 -1
  89. package/package.json +1 -1
  90. package/dist/templates/next-app/src/base/cases/ServerErrorHandler.ts +0 -27
  91. package/dist/templates/next-app/src/base/port/DBTableInterface.ts +0 -3
  92. package/dist/templates/next-app/src/base/services/appApi/AppUserType.ts +0 -51
@@ -0,0 +1,26 @@
1
+ import { inject, injectable } from 'inversify';
2
+ import type { PaginationInterface } from '@/base/port/PaginationInterface';
3
+ import type { UserSchema } from '@migrations/schema/UserSchema';
4
+ import { UserRepository } from '../repositorys/UserRepository';
5
+ import { PaginationValidator } from '../validators/PaginationValidator';
6
+ import type { UserRepositoryInterface } from '../port/UserRepositoryInterface';
7
+ import type { ValidatorInterface } from '../port/ValidatorInterface';
8
+
9
+ @injectable()
10
+ export class ApiUserService {
11
+ constructor(
12
+ @inject(UserRepository)
13
+ protected userRepository: UserRepositoryInterface,
14
+ @inject(PaginationValidator)
15
+ protected paginationValidator: ValidatorInterface
16
+ ) {}
17
+
18
+ async getUsers(params: {
19
+ page: number;
20
+ pageSize: number;
21
+ }): Promise<PaginationInterface<UserSchema>> {
22
+ const result = await this.userRepository.pagination(params);
23
+
24
+ return result as PaginationInterface<UserSchema>;
25
+ }
26
+ }
@@ -1,5 +1,6 @@
1
1
  import { inject, injectable } from 'inversify';
2
2
  import { isEmpty, last, omit } from 'lodash';
3
+ import type { UserSchema } from '@migrations/schema/UserSchema';
3
4
  import {
4
5
  API_USER_NOT_FOUND,
5
6
  API_USER_ALREADY_EXISTS
@@ -12,10 +13,9 @@ import {
12
13
  type UserCredentialTokenValue
13
14
  } from '../UserCredentialToken';
14
15
  import type { CrentialTokenInterface } from '../port/CrentialTokenInterface';
15
- import type { UserAuthInterface } from '../port/UserAuthInterface';
16
+ import type { ServerAuthInterface } from '../port/ServerAuthInterface';
16
17
  import type { UserRepositoryInterface } from '../port/UserRepositoryInterface';
17
18
  import type { UserServiceInterface } from '../port/UserServiceInterface';
18
- import type { UserSchema } from '@migrations/schema/UserSchema';
19
19
  import type { Encryptor } from '@qlover/fe-corekit';
20
20
 
21
21
  @injectable()
@@ -24,7 +24,7 @@ export class UserService implements UserServiceInterface {
24
24
  @inject(UserRepository)
25
25
  protected userRepository: UserRepositoryInterface,
26
26
  @inject(ServerAuth)
27
- protected userAuth: UserAuthInterface,
27
+ protected userAuth: ServerAuthInterface,
28
28
  @inject(PasswordEncrypt)
29
29
  protected encryptor: Encryptor<string, string>,
30
30
  @inject(UserCredentialToken)
@@ -0,0 +1,48 @@
1
+ import { z } from 'zod';
2
+ import type { PaginationInterface } from '@/base/port/PaginationInterface';
3
+ import { API_PAGE_INVALID } from '@config/Identifier';
4
+ import {
5
+ type ValidationFaildResult,
6
+ type ValidatorInterface
7
+ } from '../port/ValidatorInterface';
8
+
9
+ const pageSchema = z
10
+ .number()
11
+ .or(z.string())
12
+ .transform((val) => Number(val))
13
+ .refine((val) => val > 0, {
14
+ message: API_PAGE_INVALID
15
+ });
16
+
17
+ export class PaginationValidator implements ValidatorInterface {
18
+ protected defaultPageSize = 10;
19
+
20
+ validatePageSize(value: unknown): void | ValidationFaildResult {
21
+ const result = pageSchema.safeParse(value);
22
+ if (!result.success) {
23
+ return result.error.issues[0];
24
+ }
25
+ }
26
+
27
+ validate(data: unknown): void | ValidationFaildResult {
28
+ if (typeof data !== 'object' || data === null) {
29
+ return {
30
+ path: ['form'],
31
+ message: 'form is required'
32
+ };
33
+ }
34
+
35
+ return this.validatePageSize((data as Record<string, unknown>).page);
36
+ }
37
+
38
+ getThrow(
39
+ data: unknown
40
+ ): Pick<PaginationInterface<unknown>, 'page' | 'pageSize'> {
41
+ const result = this.validate(data);
42
+ if (result) {
43
+ throw new Error(result.message);
44
+ }
45
+
46
+ return { page: 1, pageSize: 10 };
47
+ }
48
+ }
@@ -44,6 +44,7 @@ html,
44
44
  --fe-color-text-tertiary: rgba(15 23 42 / 0.35);
45
45
  --fe-color-text-quaternary: rgba(15 23 42 / 0.15);
46
46
  --fe-color-text-placeholder: rgba(15 23 42 / 0.25);
47
+ --fe-color-text-disabled: rgba(15 23 42 / 0.25); /* 禁用状态文本颜色 */
47
48
  --fe-color-border: rgb(226 232 240);
48
49
 
49
50
  /* Antd 组件通用变量 */
@@ -246,6 +247,78 @@ html,
246
247
  --fe-control-item-bg-active-hover: #bae0ff;
247
248
  --fe-control-item-bg-active-disabled: rgba(0, 0, 0, 0.15);
248
249
  --fe-control-tmp-outline: rgba(0, 0, 0, 0.02);
249
- --fe-control-outline: rgba(96, 165, 250, 0.1); /* blue-400 with 0.1 opacity */
250
+ --fe-control-outline: rgba(
251
+ 96,
252
+ 165,
253
+ 250,
254
+ 0.1
255
+ ); /* blue-400 with 0.1 opacity */
256
+ }
257
+
258
+ /* Antd Layout 组件变量 */
259
+ &.ant-layout-sider {
260
+ --fe-layout-color-bg-header: rgb(var(--color-bg-base));
261
+ --fe-layout-color-bg-body: rgb(var(--color-bg-secondary));
262
+ --fe-layout-color-bg-trigger: rgb(var(--color-bg-elevated));
263
+ --fe-layout-body-bg: rgb(var(--color-bg-secondary));
264
+ --fe-layout-header-bg: rgb(var(--color-bg-base));
265
+ --fe-layout-header-height: 64px;
266
+ --fe-layout-header-padding: 0 50px;
267
+ --fe-layout-header-color: rgb(var(--text-primary));
268
+ --fe-layout-footer-padding: 24px 50px;
269
+ --fe-layout-footer-bg: rgb(var(--color-bg-secondary));
270
+ --fe-layout-sider-bg: rgb(var(--color-bg-base));
271
+ --fe-layout-trigger-height: 48px;
272
+ --fe-layout-trigger-bg: rgb(var(--color-bg-elevated));
273
+ --fe-layout-trigger-color: rgb(var(--text-primary));
274
+ --fe-layout-zero-trigger-width: 40px;
275
+ --fe-layout-zero-trigger-height: 40px;
276
+ --fe-layout-light-sider-bg: rgb(var(--color-bg-base));
277
+ --fe-layout-light-trigger-bg: rgb(var(--color-bg-base));
278
+ --fe-layout-light-trigger-color: rgb(var(--text-primary));
279
+ }
280
+
281
+ /* 滚动条样式变量 */
282
+ --fe-scrollbar-size: 6px;
283
+ --fe-scrollbar-thumb-bg: rgba(15 23 42 / 0.2);
284
+ --fe-scrollbar-thumb-hover-bg: rgba(15 23 42 / 0.3);
285
+ --fe-scrollbar-track-bg: transparent;
286
+
287
+ /* 滚动条样式 */
288
+ ::-webkit-scrollbar {
289
+ width: var(--fe-scrollbar-size);
290
+ height: var(--fe-scrollbar-size);
291
+ }
292
+
293
+ ::-webkit-scrollbar-track {
294
+ background: var(--fe-scrollbar-track-bg);
295
+ border-radius: var(--fe-scrollbar-size);
296
+ }
297
+
298
+ ::-webkit-scrollbar-thumb {
299
+ background: var(--fe-scrollbar-thumb-bg);
300
+ border-radius: var(--fe-scrollbar-size);
301
+ }
302
+
303
+ ::-webkit-scrollbar-thumb:hover {
304
+ background: var(--fe-scrollbar-thumb-hover-bg);
305
+ }
306
+
307
+ ::-webkit-scrollbar-corner {
308
+ background: transparent;
309
+ }
310
+
311
+ /* 可选的细滚动条样式 */
312
+ .scrollbar-thin {
313
+ --fe-scrollbar-size: 4px;
314
+ }
315
+
316
+ /* 隐藏滚动条但保持可滚动 */
317
+ .scrollbar-hidden {
318
+ -ms-overflow-style: none;
319
+ scrollbar-width: none;
320
+ &::-webkit-scrollbar {
321
+ display: none;
322
+ }
250
323
  }
251
324
  }
@@ -45,6 +45,12 @@
45
45
  --fe-color-text-tertiary: rgba(255, 255, 255, 0.35);
46
46
  --fe-color-text-quaternary: rgba(255, 255, 255, 0.15);
47
47
  --fe-color-text-placeholder: rgba(255, 255, 255, 0.25);
48
+ --fe-color-text-disabled: rgba(
49
+ 255,
50
+ 255,
51
+ 255,
52
+ 0.25
53
+ ); /* 暗色主题禁用状态文本颜色 */
48
54
  --fe-color-border: rgb(51 65 85);
49
55
 
50
56
  /* Antd 图标相关变量 */
@@ -201,4 +207,71 @@
201
207
  0.1
202
208
  ); /* blue-400 with 0.1 opacity */
203
209
  }
210
+
211
+ /* Antd Layout 组件变量 */
212
+ &.ant-layout-sider {
213
+ --fe-layout-color-bg-header: rgb(15 23 42);
214
+ --fe-layout-color-bg-body: rgb(30 41 59);
215
+ --fe-layout-color-bg-trigger: rgb(15 23 42);
216
+ --fe-layout-body-bg: rgb(30 41 59);
217
+ --fe-layout-header-bg: rgb(15 23 42);
218
+ --fe-layout-header-height: 64px;
219
+ --fe-layout-header-padding: 0 50px;
220
+ --fe-layout-header-color: rgb(var(--text-primary));
221
+ --fe-layout-footer-padding: 24px 50px;
222
+ --fe-layout-footer-bg: rgb(30 41 59);
223
+ --fe-layout-sider-bg: rgb(15 23 42);
224
+ --fe-layout-trigger-height: 48px;
225
+ --fe-layout-trigger-bg: rgb(15 23 42);
226
+ --fe-layout-trigger-color: rgb(255 255 255);
227
+ --fe-layout-zero-trigger-width: 40px;
228
+ --fe-layout-zero-trigger-height: 40px;
229
+ --fe-layout-light-sider-bg: rgb(30 41 59);
230
+ --fe-layout-light-trigger-bg: rgb(30 41 59);
231
+ --fe-layout-light-trigger-color: rgb(var(--text-primary));
232
+ }
233
+
234
+ /* 滚动条样式变量 */
235
+ --fe-scrollbar-size: 6px;
236
+ --fe-scrollbar-thumb-bg: rgba(255 255 255 / 0.2);
237
+ --fe-scrollbar-thumb-hover-bg: rgba(255 255 255 / 0.3);
238
+ --fe-scrollbar-track-bg: transparent;
239
+
240
+ /* 滚动条样式 */
241
+ ::-webkit-scrollbar {
242
+ width: var(--fe-scrollbar-size);
243
+ height: var(--fe-scrollbar-size);
244
+ }
245
+
246
+ ::-webkit-scrollbar-track {
247
+ background: var(--fe-scrollbar-track-bg);
248
+ border-radius: var(--fe-scrollbar-size);
249
+ }
250
+
251
+ ::-webkit-scrollbar-thumb {
252
+ background: var(--fe-scrollbar-thumb-bg);
253
+ border-radius: var(--fe-scrollbar-size);
254
+ }
255
+
256
+ ::-webkit-scrollbar-thumb:hover {
257
+ background: var(--fe-scrollbar-thumb-hover-bg);
258
+ }
259
+
260
+ ::-webkit-scrollbar-corner {
261
+ background: transparent;
262
+ }
263
+
264
+ /* 可选的细滚动条样式 */
265
+ .scrollbar-thin {
266
+ --fe-scrollbar-size: 4px;
267
+ }
268
+
269
+ /* 隐藏滚动条但保持可滚动 */
270
+ .scrollbar-hidden {
271
+ -ms-overflow-style: none;
272
+ scrollbar-width: none;
273
+ &::-webkit-scrollbar {
274
+ display: none;
275
+ }
276
+ }
204
277
  }
@@ -0,0 +1,3 @@
1
+ @import './_default.css';
2
+ @import './dark.css';
3
+ @import './pink.css';
@@ -43,6 +43,9 @@
43
43
  --ant-color-text-tertiary: rgba(190 18 60 / 0.35);
44
44
  --ant-color-text-quaternary: rgba(190 18 60 / 0.15);
45
45
  --ant-color-text-placeholder: rgba(190 18 60 / 0.25);
46
+ --fe-color-text-disabled: rgba(
47
+ 190 18 60 / 0.25
48
+ ); /* 粉色主题禁用状态文本颜色 */
46
49
  --ant-color-border: rgb(254 205 211);
47
50
 
48
51
  /* Antd 图标相关变量 */
@@ -217,4 +220,71 @@
217
220
  0.1
218
221
  ); /* pink-400 with 0.1 opacity */
219
222
  }
223
+
224
+ /* Antd Layout 组件变量 */
225
+ &.ant-layout-sider {
226
+ --fe-layout-color-bg-header: var(--ant-color-bg-container);
227
+ --fe-layout-color-bg-body: rgb(255 241 242);
228
+ --fe-layout-color-bg-trigger: var(--ant-color-bg-elevated);
229
+ --fe-layout-body-bg: rgb(255 241 242);
230
+ --fe-layout-header-bg: var(--ant-color-bg-container);
231
+ --fe-layout-header-height: 64px;
232
+ --fe-layout-header-padding: 0 50px;
233
+ --fe-layout-header-color: var(--ant-color-text);
234
+ --fe-layout-footer-padding: 24px 50px;
235
+ --fe-layout-footer-bg: rgb(255 241 242);
236
+ --fe-layout-sider-bg: var(--ant-color-bg-container);
237
+ --fe-layout-trigger-height: 48px;
238
+ --fe-layout-trigger-bg: var(--ant-color-bg-elevated);
239
+ --fe-layout-trigger-color: var(--ant-color-text);
240
+ --fe-layout-zero-trigger-width: 40px;
241
+ --fe-layout-zero-trigger-height: 40px;
242
+ --fe-layout-light-sider-bg: var(--ant-color-bg-container);
243
+ --fe-layout-light-trigger-bg: var(--ant-color-bg-container);
244
+ --fe-layout-light-trigger-color: var(--ant-color-text);
245
+ }
246
+
247
+ /* 滚动条样式变量 */
248
+ --fe-scrollbar-size: 6px;
249
+ --fe-scrollbar-thumb-bg: rgba(244 114 182 / 0.3);
250
+ --fe-scrollbar-thumb-hover-bg: rgba(244 114 182 / 0.4);
251
+ --fe-scrollbar-track-bg: transparent;
252
+
253
+ /* 滚动条样式 */
254
+ ::-webkit-scrollbar {
255
+ width: var(--fe-scrollbar-size);
256
+ height: var(--fe-scrollbar-size);
257
+ }
258
+
259
+ ::-webkit-scrollbar-track {
260
+ background: var(--fe-scrollbar-track-bg);
261
+ border-radius: var(--fe-scrollbar-size);
262
+ }
263
+
264
+ ::-webkit-scrollbar-thumb {
265
+ background: var(--fe-scrollbar-thumb-bg);
266
+ border-radius: var(--fe-scrollbar-size);
267
+ }
268
+
269
+ ::-webkit-scrollbar-thumb:hover {
270
+ background: var(--fe-scrollbar-thumb-hover-bg);
271
+ }
272
+
273
+ ::-webkit-scrollbar-corner {
274
+ background: transparent;
275
+ }
276
+
277
+ /* 可选的细滚动条样式 */
278
+ .scrollbar-thin {
279
+ --fe-scrollbar-size: 4px;
280
+ }
281
+
282
+ /* 隐藏滚动条但保持可滚动 */
283
+ .scrollbar-hidden {
284
+ -ms-overflow-style: none;
285
+ scrollbar-width: none;
286
+ &::-webkit-scrollbar {
287
+ display: none;
288
+ }
289
+ }
220
290
  }
@@ -1,3 +1,4 @@
1
- @import './_default.css';
2
- @import './dark.css';
3
- @import './pink.css';
1
+ @import './_common/index.css';
2
+ @import './table/index.css';
3
+ @import './pagination/index.css';
4
+ @import './menu/index.css';
@@ -0,0 +1,108 @@
1
+ /* custom variables - for antd and custom css */
2
+ html,
3
+ .fe-theme {
4
+ &.ant-menu-css-var {
5
+ /* 基础尺寸 */
6
+ --fe-menu-dropdown-width: 160px;
7
+ --fe-menu-z-index-popup: 1050;
8
+ --fe-menu-radius-item: 8px;
9
+ --fe-menu-item-border-radius: 8px;
10
+ --fe-menu-radius-sub-menu-item: 4px;
11
+ --fe-menu-sub-menu-item-border-radius: 4px;
12
+ --fe-menu-item-margin-inline: 4px;
13
+ --fe-menu-item-margin-block: 4px;
14
+ --fe-menu-item-padding-inline: 16px;
15
+ --fe-menu-item-height: 40px;
16
+ --fe-menu-item-width: calc(100% - 8px);
17
+ --fe-menu-collapsed-width: 80px;
18
+
19
+ /* 文字颜色 */
20
+ --fe-menu-color-item-text: rgb(var(--text-primary));
21
+ --fe-menu-item-color: rgb(var(--text-primary));
22
+ --fe-menu-color-item-text-hover: rgb(var(--text-primary));
23
+ --fe-menu-item-hover-color: rgb(var(--text-primary));
24
+ --fe-menu-color-group-title: rgb(var(--text-secondary));
25
+ --fe-menu-group-title-color: rgb(var(--text-secondary));
26
+ --fe-menu-color-item-text-disabled: rgb(var(--text-disabled));
27
+ --fe-menu-item-disabled-color: rgb(var(--text-disabled));
28
+
29
+ /* 选中和激活状态 */
30
+ --fe-menu-color-item-text-selected: rgb(var(--color-brand));
31
+ --fe-menu-item-selected-color: rgb(var(--color-brand));
32
+ --fe-menu-sub-menu-item-selected-color: rgb(var(--color-brand));
33
+ --fe-menu-color-item-text-selected-horizontal: rgb(var(--color-brand));
34
+ --fe-menu-horizontal-item-selected-color: rgb(var(--color-brand));
35
+
36
+ /* 背景颜色 */
37
+ --fe-menu-color-item-bg: rgb(var(--color-bg-base));
38
+ --fe-menu-item-bg: rgb(var(--color-bg-base));
39
+ --fe-menu-color-item-bg-hover: rgba(var(--text-primary), 0.06);
40
+ --fe-menu-item-hover-bg: rgba(var(--text-primary), 0.06);
41
+ --fe-menu-color-item-bg-active: rgba(var(--text-primary), 0.06);
42
+ --fe-menu-item-active-bg: rgba(var(--color-brand), 0.1);
43
+ --fe-menu-color-sub-item-bg: rgba(var(--text-primary), 0.02);
44
+ --fe-menu-sub-menu-item-bg: rgba(var(--text-primary), 0.02);
45
+ --fe-menu-color-item-bg-selected: rgba(var(--color-brand), 0.1);
46
+ --fe-menu-item-selected-bg: rgba(var(--color-brand), 0.1);
47
+ --fe-menu-popup-bg: rgb(var(--color-bg-base));
48
+
49
+ /* 水平菜单特殊样式 */
50
+ --fe-menu-color-item-text-hover-horizontal: rgb(var(--color-brand));
51
+ --fe-menu-horizontal-item-hover-color: rgb(var(--color-brand));
52
+ --fe-menu-color-item-bg-selected-horizontal: transparent;
53
+ --fe-menu-horizontal-item-selected-bg: transparent;
54
+ --fe-menu-horizontal-item-border-radius: 0px;
55
+ --fe-menu-horizontal-item-hover-bg: transparent;
56
+ --fe-menu-horizontal-line-height: 46px;
57
+
58
+ /* 激活条样式 */
59
+ --fe-menu-color-active-bar-width: 0px;
60
+ --fe-menu-active-bar-width: 0px;
61
+ --fe-menu-color-active-bar-height: 2px;
62
+ --fe-menu-active-bar-height: 2px;
63
+ --fe-menu-color-active-bar-border-size: 1px;
64
+ --fe-menu-active-bar-border-width: 1px;
65
+
66
+ /* 图标样式 */
67
+ --fe-menu-icon-size: 14px;
68
+ --fe-menu-icon-margin-inline-end: 10px;
69
+ --fe-menu-collapsed-icon-size: 16px;
70
+
71
+ /* 分组标题样式 */
72
+ --fe-menu-group-title-font-size: 14px;
73
+ --fe-menu-group-title-line-height: 1.5714285714285714;
74
+
75
+ /* 危险项样式 */
76
+ --fe-menu-color-danger-item-text: var(--fe-color-error);
77
+ --fe-menu-danger-item-color: var(--fe-color-error);
78
+ --fe-menu-color-danger-item-text-hover: var(--fe-color-error);
79
+ --fe-menu-danger-item-hover-color: var(--fe-color-error);
80
+ --fe-menu-color-danger-item-text-selected: var(--fe-color-error);
81
+ --fe-menu-danger-item-selected-color: var(--fe-color-error);
82
+ --fe-menu-color-danger-item-bg-active: rgba(var(--fe-color-error), 0.1);
83
+ --fe-menu-danger-item-active-bg: rgba(var(--fe-color-error), 0.1);
84
+ --fe-menu-color-danger-item-bg-selected: rgba(var(--fe-color-error), 0.1);
85
+ --fe-menu-danger-item-selected-bg: rgba(var(--fe-color-error), 0.1);
86
+
87
+ /* 暗色主题特殊样式 */
88
+ --fe-menu-dark-item-disabled-color: rgba(255, 255, 255, 0.25);
89
+ --fe-menu-dark-item-color: rgba(255, 255, 255, 0.65);
90
+ --fe-menu-dark-danger-item-color: var(--fe-color-error);
91
+ --fe-menu-dark-item-bg: rgb(15 23 42);
92
+ --fe-menu-dark-popup-bg: rgb(15 23 42);
93
+ --fe-menu-dark-sub-menu-item-bg: rgb(30 41 59);
94
+ --fe-menu-dark-item-selected-color: rgb(255 255 255);
95
+ --fe-menu-dark-item-selected-bg: rgb(var(--color-brand));
96
+ --fe-menu-dark-danger-item-selected-bg: var(--fe-color-error);
97
+ --fe-menu-dark-item-hover-bg: transparent;
98
+ --fe-menu-dark-group-title-color: rgba(255, 255, 255, 0.65);
99
+ --fe-menu-dark-item-hover-color: rgb(255 255 255);
100
+ --fe-menu-dark-danger-item-hover-color: color-mix(
101
+ in srgb,
102
+ var(--fe-color-error) 90%,
103
+ white
104
+ );
105
+ --fe-menu-dark-danger-item-selected-color: rgb(255 255 255);
106
+ --fe-menu-dark-danger-item-active-bg: var(--fe-color-error);
107
+ }
108
+ }
@@ -0,0 +1,67 @@
1
+ [data-theme='dark'],
2
+ [data-theme='dark'] .fe-theme {
3
+ &.ant-menu-css-var {
4
+ /* 文字颜色 */
5
+ --fe-menu-color-item-text: rgb(var(--text-primary));
6
+ --fe-menu-item-color: rgb(var(--text-primary));
7
+ --fe-menu-color-item-text-hover: rgb(var(--text-primary));
8
+ --fe-menu-item-hover-color: rgb(var(--text-primary));
9
+ --fe-menu-color-group-title: rgb(var(--text-secondary));
10
+ --fe-menu-group-title-color: rgb(var(--text-secondary));
11
+ --fe-menu-color-item-text-disabled: rgb(var(--text-disabled));
12
+ --fe-menu-item-disabled-color: rgb(var(--text-disabled));
13
+
14
+ /* 选中和激活状态 */
15
+ --fe-menu-color-item-text-selected: rgb(var(--color-brand));
16
+ --fe-menu-item-selected-color: rgb(var(--color-brand));
17
+ --fe-menu-sub-menu-item-selected-color: rgb(var(--color-brand));
18
+ --fe-menu-color-item-text-selected-horizontal: rgb(var(--color-brand));
19
+ --fe-menu-horizontal-item-selected-color: rgb(var(--color-brand));
20
+
21
+ /* 背景颜色 */
22
+ --fe-menu-color-item-bg: rgb(var(--color-bg-base));
23
+ --fe-menu-item-bg: rgb(var(--color-bg-base));
24
+ --fe-menu-color-item-bg-hover: rgba(255 255 255 / 0.08);
25
+ --fe-menu-item-hover-bg: rgba(255 255 255 / 0.08);
26
+ --fe-menu-color-item-bg-active: rgba(255 255 255 / 0.08);
27
+ --fe-menu-item-active-bg: rgba(var(--color-brand), 0.2);
28
+ --fe-menu-color-sub-item-bg: rgba(255 255 255 / 0.04);
29
+ --fe-menu-sub-menu-item-bg: rgba(255 255 255 / 0.04);
30
+ --fe-menu-color-item-bg-selected: rgba(var(--color-brand), 0.2);
31
+ --fe-menu-item-selected-bg: rgba(var(--color-brand), 0.2);
32
+ --fe-menu-popup-bg: rgb(var(--color-bg-base));
33
+
34
+ /* 危险项样式 */
35
+ --fe-menu-color-danger-item-text: var(--fe-color-error);
36
+ --fe-menu-danger-item-color: var(--fe-color-error);
37
+ --fe-menu-color-danger-item-text-hover: var(--fe-color-error);
38
+ --fe-menu-danger-item-hover-color: var(--fe-color-error);
39
+ --fe-menu-color-danger-item-text-selected: var(--fe-color-error);
40
+ --fe-menu-danger-item-selected-color: var(--fe-color-error);
41
+ --fe-menu-color-danger-item-bg-active: rgba(var(--fe-color-error), 0.2);
42
+ --fe-menu-danger-item-active-bg: rgba(var(--fe-color-error), 0.2);
43
+ --fe-menu-color-danger-item-bg-selected: rgba(var(--fe-color-error), 0.2);
44
+ --fe-menu-danger-item-selected-bg: rgba(var(--fe-color-error), 0.2);
45
+
46
+ /* 暗色主题特殊样式 */
47
+ --fe-menu-dark-item-disabled-color: rgba(255, 255, 255, 0.25);
48
+ --fe-menu-dark-item-color: rgba(255, 255, 255, 0.65);
49
+ --fe-menu-dark-danger-item-color: var(--fe-color-error);
50
+ --fe-menu-dark-item-bg: rgb(15 23 42);
51
+ --fe-menu-dark-popup-bg: rgb(15 23 42);
52
+ --fe-menu-dark-sub-menu-item-bg: rgb(30 41 59);
53
+ --fe-menu-dark-item-selected-color: rgb(255 255 255);
54
+ --fe-menu-dark-item-selected-bg: rgb(var(--color-brand));
55
+ --fe-menu-dark-danger-item-selected-bg: var(--fe-color-error);
56
+ --fe-menu-dark-item-hover-bg: transparent;
57
+ --fe-menu-dark-group-title-color: rgba(255, 255, 255, 0.65);
58
+ --fe-menu-dark-item-hover-color: rgb(255 255 255);
59
+ --fe-menu-dark-danger-item-hover-color: color-mix(
60
+ in srgb,
61
+ var(--fe-color-error) 90%,
62
+ white
63
+ );
64
+ --fe-menu-dark-danger-item-selected-color: rgb(255 255 255);
65
+ --fe-menu-dark-danger-item-active-bg: var(--fe-color-error);
66
+ }
67
+ }
@@ -0,0 +1,3 @@
1
+ @import './_default.css';
2
+ @import './dark.css';
3
+ @import './pink.css';
@@ -0,0 +1,67 @@
1
+ [data-theme='pink'],
2
+ [data-theme='pink'] .fe-theme {
3
+ &.ant-menu-css-var {
4
+ /* 文字颜色 */
5
+ --fe-menu-color-item-text: var(--ant-color-text);
6
+ --fe-menu-item-color: var(--ant-color-text);
7
+ --fe-menu-color-item-text-hover: var(--ant-color-text);
8
+ --fe-menu-item-hover-color: var(--ant-color-text);
9
+ --fe-menu-color-group-title: var(--ant-color-text-secondary);
10
+ --fe-menu-group-title-color: var(--ant-color-text-secondary);
11
+ --fe-menu-color-item-text-disabled: var(--fe-color-text-disabled);
12
+ --fe-menu-item-disabled-color: var(--fe-color-text-disabled);
13
+
14
+ /* 选中和激活状态 */
15
+ --fe-menu-color-item-text-selected: var(--fe-color-primary);
16
+ --fe-menu-item-selected-color: var(--fe-color-primary);
17
+ --fe-menu-sub-menu-item-selected-color: var(--fe-color-primary);
18
+ --fe-menu-color-item-text-selected-horizontal: var(--fe-color-primary);
19
+ --fe-menu-horizontal-item-selected-color: var(--fe-color-primary);
20
+
21
+ /* 背景颜色 */
22
+ --fe-menu-color-item-bg: var(--ant-color-bg-container);
23
+ --fe-menu-item-bg: var(--ant-color-bg-container);
24
+ --fe-menu-color-item-bg-hover: rgba(244 114 182 / 0.06);
25
+ --fe-menu-item-hover-bg: rgba(244 114 182 / 0.06);
26
+ --fe-menu-color-item-bg-active: rgba(244 114 182 / 0.06);
27
+ --fe-menu-item-active-bg: var(--fe-color-primary-bg);
28
+ --fe-menu-color-sub-item-bg: rgba(244 114 182 / 0.02);
29
+ --fe-menu-sub-menu-item-bg: rgba(244 114 182 / 0.02);
30
+ --fe-menu-color-item-bg-selected: var(--fe-color-primary-bg);
31
+ --fe-menu-item-selected-bg: var(--fe-color-primary-bg);
32
+ --fe-menu-popup-bg: var(--ant-color-bg-container);
33
+
34
+ /* 危险项样式 */
35
+ --fe-menu-color-danger-item-text: var(--fe-color-error);
36
+ --fe-menu-danger-item-color: var(--fe-color-error);
37
+ --fe-menu-color-danger-item-text-hover: var(--fe-color-error);
38
+ --fe-menu-danger-item-hover-color: var(--fe-color-error);
39
+ --fe-menu-color-danger-item-text-selected: var(--fe-color-error);
40
+ --fe-menu-danger-item-selected-color: var(--fe-color-error);
41
+ --fe-menu-color-danger-item-bg-active: rgba(251 113 133 / 0.1);
42
+ --fe-menu-danger-item-active-bg: rgba(251 113 133 / 0.1);
43
+ --fe-menu-color-danger-item-bg-selected: rgba(251 113 133 / 0.1);
44
+ --fe-menu-danger-item-selected-bg: rgba(251 113 133 / 0.1);
45
+
46
+ /* 暗色主题特殊样式 */
47
+ --fe-menu-dark-item-disabled-color: rgba(255, 255, 255, 0.25);
48
+ --fe-menu-dark-item-color: rgba(255, 255, 255, 0.65);
49
+ --fe-menu-dark-danger-item-color: var(--fe-color-error);
50
+ --fe-menu-dark-item-bg: rgb(190 18 60);
51
+ --fe-menu-dark-popup-bg: rgb(190 18 60);
52
+ --fe-menu-dark-sub-menu-item-bg: rgb(159 18 57);
53
+ --fe-menu-dark-item-selected-color: rgb(255 255 255);
54
+ --fe-menu-dark-item-selected-bg: var(--fe-color-primary);
55
+ --fe-menu-dark-danger-item-selected-bg: var(--fe-color-error);
56
+ --fe-menu-dark-item-hover-bg: transparent;
57
+ --fe-menu-dark-group-title-color: rgba(255, 255, 255, 0.65);
58
+ --fe-menu-dark-item-hover-color: rgb(255 255 255);
59
+ --fe-menu-dark-danger-item-hover-color: color-mix(
60
+ in srgb,
61
+ var(--fe-color-error) 90%,
62
+ white
63
+ );
64
+ --fe-menu-dark-danger-item-selected-color: rgb(255 255 255);
65
+ --fe-menu-dark-danger-item-active-bg: var(--fe-color-error);
66
+ }
67
+ }
@@ -0,0 +1,33 @@
1
+ /* custom variables - for antd and custom css */
2
+ html,
3
+ .fe-theme {
4
+ /* Antd Pagination 组件变量 */
5
+ .ant-pagination-css-var {
6
+ --fe-pagination-item-bg: rgb(var(--color-bg-base));
7
+ --fe-pagination-item-size: 32px;
8
+ --fe-pagination-item-size-sm: 24px;
9
+ --fe-pagination-item-active-bg: rgb(var(--color-bg-base));
10
+ --fe-pagination-item-link-bg: rgb(var(--color-bg-base));
11
+ --fe-pagination-item-active-color-disabled: rgb(var(--text-tertiary));
12
+ --fe-pagination-item-active-bg-disabled: rgba(var(--text-primary), 0.15);
13
+ --fe-pagination-item-input-bg: rgb(var(--color-bg-base));
14
+ --fe-pagination-mini-options-size-changer-top: 0px;
15
+ --fe-pagination-padding-block: 4px;
16
+ --fe-pagination-padding-block-sm: 0px;
17
+ --fe-pagination-padding-block-lg: 7px;
18
+ --fe-pagination-padding-inline: 11px;
19
+ --fe-pagination-padding-inline-sm: 7px;
20
+ --fe-pagination-padding-inline-lg: 11px;
21
+ --fe-pagination-addon-bg: rgba(var(--text-primary), 0.02);
22
+ --fe-pagination-active-border-color: rgb(var(--color-brand));
23
+ --fe-pagination-hover-border-color: rgb(var(--color-brand-hover));
24
+ --fe-pagination-active-shadow: 0 0 0 2px rgba(var(--color-brand), 0.1);
25
+ --fe-pagination-error-active-shadow: 0 0 0 2px rgba(220, 38, 38, 0.1);
26
+ --fe-pagination-warning-active-shadow: 0 0 0 2px rgba(234, 179, 8, 0.1);
27
+ --fe-pagination-hover-bg: rgb(var(--color-bg-base));
28
+ --fe-pagination-active-bg: rgb(var(--color-bg-base));
29
+ --fe-pagination-input-font-size: 14px;
30
+ --fe-pagination-input-font-size-lg: 16px;
31
+ --fe-pagination-input-font-size-sm: 14px;
32
+ }
33
+ }