@qlover/create-app 0.7.5 → 0.7.7

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 (166) hide show
  1. package/CHANGELOG.md +257 -0
  2. package/dist/index.cjs +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/templates/next-app/.env.template +22 -0
  5. package/dist/templates/next-app/.prettierignore +58 -0
  6. package/dist/templates/next-app/README.md +36 -0
  7. package/dist/templates/next-app/build/generateLocales.ts +25 -0
  8. package/dist/templates/next-app/config/IOCIdentifier.ts +45 -0
  9. package/dist/templates/next-app/config/Identifier/common.error.ts +34 -0
  10. package/dist/templates/next-app/config/Identifier/common.ts +62 -0
  11. package/dist/templates/next-app/config/Identifier/index.ts +10 -0
  12. package/dist/templates/next-app/config/Identifier/page.about.ts +181 -0
  13. package/dist/templates/next-app/config/Identifier/page.executor.ts +272 -0
  14. package/dist/templates/next-app/config/Identifier/page.home.ts +63 -0
  15. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +39 -0
  16. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +72 -0
  17. package/dist/templates/next-app/config/Identifier/page.login.ts +165 -0
  18. package/dist/templates/next-app/config/Identifier/page.register.ts +147 -0
  19. package/dist/templates/next-app/config/Identifier/page.request.ts +182 -0
  20. package/dist/templates/next-app/config/common.ts +34 -0
  21. package/dist/templates/next-app/config/i18n/PageI18nInterface.ts +51 -0
  22. package/dist/templates/next-app/config/i18n/i18nConfig.ts +12 -0
  23. package/dist/templates/next-app/config/i18n/index.ts +3 -0
  24. package/dist/templates/next-app/config/i18n/loginI18n.ts +42 -0
  25. package/dist/templates/next-app/config/theme.ts +23 -0
  26. package/dist/templates/next-app/docs/env.md +94 -0
  27. package/dist/templates/next-app/eslint.config.mjs +181 -0
  28. package/dist/templates/next-app/next.config.ts +21 -0
  29. package/dist/templates/next-app/package.json +58 -0
  30. package/dist/templates/next-app/plugins/eslint-plugin-testid.mjs +94 -0
  31. package/dist/templates/next-app/plugins/generateLocalesPlugin.ts +33 -0
  32. package/dist/templates/next-app/postcss.config.mjs +5 -0
  33. package/dist/templates/next-app/public/file.svg +1 -0
  34. package/dist/templates/next-app/public/globe.svg +1 -0
  35. package/dist/templates/next-app/public/locales/en/common.json +183 -0
  36. package/dist/templates/next-app/public/locales/zh/common.json +183 -0
  37. package/dist/templates/next-app/public/next.svg +1 -0
  38. package/dist/templates/next-app/public/vercel.svg +1 -0
  39. package/dist/templates/next-app/public/window.svg +1 -0
  40. package/dist/templates/next-app/src/app/[locale]/favicon.ico +0 -0
  41. package/dist/templates/next-app/src/app/[locale]/layout.tsx +44 -0
  42. package/dist/templates/next-app/src/app/[locale]/login/FeatureItem.tsx +13 -0
  43. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +115 -0
  44. package/dist/templates/next-app/src/app/[locale]/login/page.tsx +73 -0
  45. package/dist/templates/next-app/src/app/[locale]/not-found.tsx +24 -0
  46. package/dist/templates/next-app/src/app/[locale]/page.tsx +106 -0
  47. package/dist/templates/next-app/src/base/cases/AppConfig.ts +15 -0
  48. package/dist/templates/next-app/src/base/cases/InversifyContainer.ts +33 -0
  49. package/dist/templates/next-app/src/base/port/I18nServiceInterface.ts +25 -0
  50. package/dist/templates/next-app/src/base/port/UserServiceInterface.ts +11 -0
  51. package/dist/templates/next-app/src/base/services/I18nService.ts +115 -0
  52. package/dist/templates/next-app/src/base/services/UserService.ts +23 -0
  53. package/dist/templates/next-app/src/core/IOC.ts +58 -0
  54. package/dist/templates/next-app/src/core/IocRegisterImpl.ts +100 -0
  55. package/dist/templates/next-app/src/core/bootstraps/BootstrapClient.ts +98 -0
  56. package/dist/templates/next-app/src/core/bootstraps/BootstrapsRegistry.ts +47 -0
  57. package/dist/templates/next-app/src/core/bootstraps/IocIdentifierTest.ts +26 -0
  58. package/dist/templates/next-app/src/core/bootstraps/PrintBootstrap.ts +18 -0
  59. package/dist/templates/next-app/src/core/globals.ts +21 -0
  60. package/dist/templates/next-app/src/i18n/request.ts +22 -0
  61. package/dist/templates/next-app/src/i18n/routing.ts +30 -0
  62. package/dist/templates/next-app/src/middleware.ts +22 -0
  63. package/dist/templates/next-app/src/server/getServerI18n.ts +26 -0
  64. package/dist/templates/next-app/src/styles/css/antd-themes/_default.css +239 -0
  65. package/dist/templates/next-app/src/styles/css/antd-themes/dark.css +178 -0
  66. package/dist/templates/next-app/src/styles/css/antd-themes/index.css +3 -0
  67. package/dist/templates/next-app/src/styles/css/antd-themes/no-context.css +34 -0
  68. package/dist/templates/next-app/src/styles/css/antd-themes/pink.css +204 -0
  69. package/dist/templates/next-app/src/styles/css/index.css +6 -0
  70. package/dist/templates/next-app/src/styles/css/page.css +19 -0
  71. package/dist/templates/next-app/src/styles/css/tailwind.css +5 -0
  72. package/dist/templates/next-app/src/styles/css/themes/_default.css +29 -0
  73. package/dist/templates/next-app/src/styles/css/themes/dark.css +29 -0
  74. package/dist/templates/next-app/src/styles/css/themes/index.css +3 -0
  75. package/dist/templates/next-app/src/styles/css/themes/pink.css +29 -0
  76. package/dist/templates/next-app/src/styles/css/zIndex.css +9 -0
  77. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +42 -0
  78. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +25 -0
  79. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +45 -0
  80. package/dist/templates/next-app/src/uikit/components/LanguageSwitcher.tsx +52 -0
  81. package/dist/templates/next-app/src/uikit/components/LocaleLink.tsx +51 -0
  82. package/dist/templates/next-app/src/uikit/components/NextIntlProvider.tsx +21 -0
  83. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +86 -0
  84. package/dist/templates/next-app/src/uikit/context/IOCContext.ts +6 -0
  85. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +28 -0
  86. package/dist/templates/next-app/src/uikit/hook/useIOC.ts +37 -0
  87. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +11 -0
  88. package/dist/templates/next-app/src/uikit/hook/useStore.ts +15 -0
  89. package/dist/templates/next-app/tailwind.config.ts +8 -0
  90. package/dist/templates/next-app/tsconfig.json +36 -0
  91. package/dist/templates/react-app/.env.template +0 -2
  92. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +1 -1
  93. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +6 -31
  94. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +1 -1
  95. package/dist/templates/react-app/config/IOCIdentifier.ts +77 -5
  96. package/dist/templates/react-app/config/app.router.ts +2 -2
  97. package/dist/templates/react-app/package.json +4 -7
  98. package/dist/templates/react-app/public/locales/en/common.json +1 -1
  99. package/dist/templates/react-app/public/locales/zh/common.json +1 -1
  100. package/dist/templates/react-app/src/App.tsx +9 -4
  101. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +1 -1
  102. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +4 -0
  103. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +16 -13
  104. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +4 -3
  105. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +2 -2
  106. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +39 -0
  107. package/dist/templates/react-app/src/base/cases/RequestState.ts +20 -0
  108. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +2 -2
  109. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +8 -2
  110. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +7 -0
  111. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +24 -0
  112. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +10 -0
  113. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +20 -0
  114. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +20 -0
  115. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +23 -0
  116. package/dist/templates/react-app/src/base/port/RequestStatusInterface.ts +5 -0
  117. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +27 -0
  118. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +12 -0
  119. package/dist/templates/react-app/src/base/services/I18nService.ts +10 -6
  120. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +23 -5
  121. package/dist/templates/react-app/src/base/services/RouteService.ts +25 -54
  122. package/dist/templates/react-app/src/base/services/UserService.ts +10 -20
  123. package/dist/templates/react-app/src/core/IOC.ts +1 -26
  124. package/dist/templates/react-app/src/core/IocRegisterImpl.ts +125 -0
  125. package/dist/templates/react-app/src/core/bootstraps/BootstrapApp.ts +4 -6
  126. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +8 -6
  127. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +26 -0
  128. package/dist/templates/react-app/src/pages/auth/Layout.tsx +2 -2
  129. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +5 -6
  130. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +8 -7
  131. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +8 -19
  132. package/dist/templates/react-app/src/pages/base/{ErrorIdentifierPage.tsx → IdentifierPage.tsx} +1 -1
  133. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +11 -15
  134. package/dist/templates/react-app/src/pages/base/Layout.tsx +1 -1
  135. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +2 -2
  136. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +34 -46
  137. package/dist/templates/react-app/src/styles/css/antd-themes/_default.css +2 -2
  138. package/dist/templates/react-app/src/styles/css/antd-themes/dark.css +2 -2
  139. package/dist/templates/react-app/src/styles/css/antd-themes/pink.css +2 -2
  140. package/dist/templates/react-app/src/styles/css/index.css +1 -0
  141. package/dist/templates/react-app/src/styles/css/page.css +8 -0
  142. package/dist/templates/react-app/src/styles/css/zIndex.css +9 -0
  143. package/dist/templates/react-app/src/uikit/{controllers/ExecutorController.ts → bridges/ExecutorPageBridge.ts} +13 -36
  144. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +41 -0
  145. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +16 -0
  146. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +136 -0
  147. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +3 -2
  148. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +2 -2
  149. package/dist/templates/react-app/src/uikit/{providers → components}/ProcessExecutorProvider.tsx +4 -4
  150. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +1 -1
  151. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +3 -5
  152. package/dist/templates/react-app/src/uikit/{providers → components}/UserAuthProvider.tsx +3 -3
  153. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +5 -2
  154. package/dist/templates/react-app/src/uikit/hooks/{userRouterService.ts → useNavigateBridge.ts} +3 -3
  155. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +5 -2
  156. package/dist/templates/react-app/tsconfig.json +1 -4
  157. package/package.json +1 -1
  158. package/dist/templates/react-app/src/base/port/InteractionHubInterface.ts +0 -94
  159. package/dist/templates/react-app/src/base/port/UIDependenciesInterface.ts +0 -37
  160. package/dist/templates/react-app/src/core/registers/IocRegisterImpl.ts +0 -25
  161. package/dist/templates/react-app/src/core/registers/RegisterCommon.ts +0 -74
  162. package/dist/templates/react-app/src/core/registers/RegisterControllers.ts +0 -26
  163. package/dist/templates/react-app/src/core/registers/RegisterGlobals.ts +0 -30
  164. package/dist/templates/react-app/src/uikit/controllers/JSONStorageController.ts +0 -49
  165. package/dist/templates/react-app/src/uikit/controllers/RequestController.ts +0 -158
  166. /package/dist/templates/react-app/src/uikit/{providers → components}/BaseRouteProvider.tsx +0 -0
@@ -0,0 +1,21 @@
1
+ // ! global variables, don't import any dependencies and don't have side effects
2
+ import { ColorFormatter, ConsoleHandler, Logger } from '@qlover/corekit-bridge';
3
+ import { JSONSerializer } from '@qlover/fe-corekit';
4
+ import { loggerStyles } from '@config/common';
5
+ import { AppConfig } from '@/base/cases/AppConfig';
6
+
7
+ export const appConfig = new AppConfig();
8
+
9
+ /**
10
+ * Global logger
11
+ */
12
+ export const logger = new Logger({
13
+ handlers: new ConsoleHandler(new ColorFormatter(loggerStyles)),
14
+ silent: false,
15
+ level: 'debug'
16
+ });
17
+
18
+ /**
19
+ * Override JSONSerializer to use the global logger
20
+ */
21
+ export const JSON = new JSONSerializer();
@@ -0,0 +1,22 @@
1
+ // src/i18n/request.ts
2
+
3
+ import { getRequestConfig } from 'next-intl/server';
4
+ import { routing, type Locale } from './routing';
5
+
6
+ // Export a function to configure next-intl on each request (server-side)
7
+ export default getRequestConfig(async ({ requestLocale }) => {
8
+ // The incoming requestLocale typically matches the `[locale]` URL segment
9
+ let locale = await requestLocale;
10
+
11
+ // Ensure a valid, supported locale is always used
12
+ if (!locale || !routing.locales.includes(locale as Locale)) {
13
+ locale = routing.defaultLocale;
14
+ }
15
+
16
+ // Dynamically import the translation messages for the selected locale
17
+ return {
18
+ locale,
19
+ messages: (await import(`../../public/locales/${locale}/common.json`))
20
+ .default
21
+ };
22
+ });
@@ -0,0 +1,30 @@
1
+ import { createNavigation } from 'next-intl/navigation';
2
+ import { defineRouting } from 'next-intl/routing';
3
+ import { useLocaleRoutes } from '@config/common';
4
+ import { i18nConfig } from '@config/i18n';
5
+
6
+ const locales = i18nConfig.supportedLngs;
7
+
8
+ export type Locale = (typeof locales)[number];
9
+
10
+ export const routing = defineRouting({
11
+ locales,
12
+
13
+ defaultLocale: i18nConfig.fallbackLng,
14
+
15
+ localePrefix: useLocaleRoutes ? undefined : 'as-needed',
16
+
17
+ pathnames: {
18
+ '/': {
19
+ en: '/',
20
+ zh: '/'
21
+ },
22
+ '/about': {
23
+ en: '/about',
24
+ zh: '/about'
25
+ }
26
+ }
27
+ });
28
+
29
+ export const { Link, redirect, usePathname, useRouter, getPathname } =
30
+ createNavigation(routing);
@@ -0,0 +1,22 @@
1
+ // src/middleware.ts
2
+
3
+ // Import the Next.js middleware helper from next-intl
4
+ import createMiddleware from 'next-intl/middleware';
5
+
6
+ // Import your routing configuration which contains all locales, defaultLocale, and pathnames
7
+ import { routing } from './i18n/routing';
8
+
9
+ // Export the middleware created by next-intl
10
+ // This middleware will handle locale detection, redirects, and internationalized routing automatically
11
+ export default createMiddleware(routing);
12
+
13
+ // Next.js middleware configuration object
14
+ export const config = {
15
+ matcher: [
16
+ '/', // Match the root path explicitly
17
+
18
+ // Match all paths except for API routes, Next.js internals, static assets, favicon, and sitemap.xml
19
+ // This prevents middleware from rewriting or interfering with these special paths
20
+ '/((?!api|_next/static|_next/image|icon|favicon.ico|sitemap.xml|sitemap-0.xml).*)'
21
+ ]
22
+ };
@@ -0,0 +1,26 @@
1
+ 'use server';
2
+ import { getTranslations } from 'next-intl/server';
3
+ import type { PageI18nInterface } from '@config/i18n/PageI18nInterface';
4
+
5
+ export async function getServerI18n<T extends PageI18nInterface>(params: {
6
+ locale: string;
7
+ namespace?: string;
8
+ i18nInterface: T;
9
+ }): Promise<T> {
10
+ // Load translation messages from the HomePage namespace
11
+ const t = await getTranslations({
12
+ locale: params.locale,
13
+ namespace: params.namespace
14
+ });
15
+
16
+ const result = Object.fromEntries(
17
+ Object.entries(params.i18nInterface).map(([key, value]) => {
18
+ if (typeof value === 'string') {
19
+ return [key, t(value)];
20
+ }
21
+ return [key, value];
22
+ })
23
+ ) as T;
24
+
25
+ return result;
26
+ }
@@ -0,0 +1,239 @@
1
+ /* custom variables - for antd and custom css */
2
+ html,
3
+ .fe-theme {
4
+ /* Antd 主色调相关变量 - 浅蓝色主题 */
5
+ --fe-color-primary: #60a5fa; /* blue-400 */
6
+ --fe-color-primary-hover: #3b82f6; /* blue-500 */
7
+ --fe-color-primary-active: #2563eb; /* blue-600 */
8
+ --fe-color-primary-bg: rgba(
9
+ 96,
10
+ 165,
11
+ 250,
12
+ 0.1
13
+ ); /* blue-400 with 0.1 opacity */
14
+ --fe-color-primary-border: #60a5fa; /* blue-400 */
15
+ --fe-color-primary-text: #60a5fa; /* blue-400 */
16
+ --fe-color-primary-text-hover: #3b82f6; /* blue-500 */
17
+ --fe-color-primary-text-active: #2563eb; /* blue-600 */
18
+ --fe-color-primary-deprecated-bg: #60a5fa; /* blue-400 */
19
+ --fe-color-primary-deprecated-border: #60a5fa; /* blue-400 */
20
+
21
+ /* 状态色 */
22
+ --fe-color-success: #52c41a;
23
+ --fe-color-warning: #faad14;
24
+ /* 警告信息相关颜色 */
25
+ --fe-color-warning-bg: #fffbe6;
26
+ --fe-color-warning-bg-hover: #fff1b8;
27
+ --fe-color-warning-border: #ffe58f;
28
+ --fe-color-warning-border-hover: #ffd666;
29
+ --fe-color-warning-hover: #ffd666;
30
+ --fe-color-warning-active: #d48806;
31
+ --fe-color-warning-text-hover: #ffc53d;
32
+ --fe-color-warning-text: #faad14;
33
+ --fe-color-warning-text-active: #d48806;
34
+ --fe-color-error: #ff4d4f;
35
+ --fe-color-info: var(--fe-color-primary);
36
+ --fe-color-link: var(--fe-color-primary);
37
+
38
+ /* Antd 基础变量 */
39
+ --fe-color-bg-container: rgb(255 255 255);
40
+ --fe-color-bg-elevated: rgb(248 250 252);
41
+ --fe-color-text-heading: rgb(15 23 42); /* slate-900 用于标题文本 */
42
+ --fe-color-text: rgba(15 23 42 / 0.85);
43
+ --fe-color-text-secondary: rgba(15 23 42 / 0.45);
44
+ --fe-color-text-tertiary: rgba(15 23 42 / 0.35);
45
+ --fe-color-text-quaternary: rgba(15 23 42 / 0.15);
46
+ --fe-color-text-placeholder: rgba(15 23 42 / 0.25);
47
+ --fe-color-border: rgb(226 232 240);
48
+
49
+ /* Antd 组件通用变量 */
50
+ --fe-line-width: 1px;
51
+ --fe-line-type: solid;
52
+ --fe-border-radius: 6px;
53
+ --fe-motion-duration-mid: 0.2s;
54
+ --fe-line-height: 1.5715;
55
+
56
+ /* Motion 动画变量 */
57
+ --fe-motion-duration-slow: 0.3s;
58
+ --fe-motion-duration-normal: 0.2s;
59
+ --fe-motion-duration-fast: 0.1s;
60
+
61
+ /* Antd 图标相关变量 */
62
+ --fe-color-icon: rgba(0, 0, 0, 0.45); /* 默认图标颜色 */
63
+ --fe-color-icon-hover: rgba(0, 0, 0, 0.88); /* 图标悬停颜色 */
64
+ --fe-color-icon-active: var(--fe-color-primary); /* 图标激活颜色 */
65
+ --fe-color-icon-disabled: rgba(0, 0, 0, 0.25); /* 禁用状态图标颜色 */
66
+
67
+ /* Antd Input 组件变量 */
68
+ .ant-input,
69
+ .ant-input-css-var {
70
+ /* Input 内边距 */
71
+ --fe-input-padding-block: 4px;
72
+ --fe-input-padding-block-sm: 0px;
73
+ --fe-input-padding-block-lg: 7px;
74
+ --fe-input-padding-inline: 11px;
75
+ --fe-input-padding-inline-sm: 7px;
76
+ --fe-input-padding-inline-lg: 11px;
77
+
78
+ /* Input 字体大小 */
79
+ --fe-input-input-font-size: 14px;
80
+ --fe-input-input-font-size-lg: 16px;
81
+ --fe-input-input-font-size-sm: 14px;
82
+
83
+ /* Input 交互状态 */
84
+ --fe-input-hover-border-color: #4096ff;
85
+ --fe-input-active-border-color: #1677ff;
86
+ --fe-input-active-shadow: 0 0 0 2px rgba(5, 145, 255, 0.1);
87
+ --fe-input-error-active-shadow: 0 0 0 2px rgba(255, 38, 5, 0.06);
88
+ --fe-input-warning-active-shadow: 0 0 0 2px rgba(255, 215, 5, 0.1);
89
+ --fe-input-hover-bg: #ffffff;
90
+ --fe-input-active-bg: #ffffff;
91
+ --fe-input-addon-bg: rgba(0, 0, 0, 0.02);
92
+ }
93
+
94
+ /* Antd Button 组件变量 */
95
+ .ant-btn,
96
+ .ant-btn-css-var {
97
+ /* 基础样式 */
98
+ --fe-button-font-weight: 400;
99
+ --fe-button-padding-inline: 15px;
100
+ --fe-button-padding-inline-lg: 15px;
101
+ --fe-button-padding-inline-sm: 7px;
102
+ --fe-button-padding-block: 4px;
103
+ --fe-button-padding-block-sm: 0px;
104
+ --fe-button-padding-block-lg: 7px;
105
+
106
+ /* 字体大小 */
107
+ --fe-button-content-font-size: 14px;
108
+ --fe-button-content-font-size-sm: 14px;
109
+ --fe-button-content-font-size-lg: 16px;
110
+ --fe-button-content-line-height: 1.5714285714285714;
111
+ --fe-button-content-line-height-sm: 1.5714285714285714;
112
+ --fe-button-content-line-height-lg: 1.5;
113
+
114
+ /* 浅蓝色主题 */
115
+ --fe-button-primary-color: #fff;
116
+ --fe-button-primary-bg: #60a5fa; /* blue-400 */
117
+ --fe-button-primary-hover-bg: #3b82f6; /* blue-500 */
118
+ --fe-button-primary-active-bg: #2563eb; /* blue-600 */
119
+ --fe-button-primary-shadow: 0 2px 0 rgba(37, 99, 235, 0.1);
120
+
121
+ /* 默认按钮 */
122
+ --fe-button-default-color: rgba(0, 0, 0, 0.88);
123
+ --fe-button-default-bg: #ffffff;
124
+ --fe-button-default-border-color: #d9d9d9;
125
+ --fe-button-default-hover-bg: #ffffff;
126
+ --fe-button-default-hover-color: #60a5fa;
127
+ --fe-button-default-hover-border-color: #60a5fa;
128
+ --fe-button-default-active-bg: #ffffff;
129
+ --fe-button-default-active-color: #2563eb;
130
+ --fe-button-default-active-border-color: #2563eb;
131
+ --fe-button-default-shadow: 0 2px 0 rgba(0, 0, 0, 0.02);
132
+
133
+ /* 其他状态 */
134
+ --fe-button-danger-color: #fff;
135
+ --fe-button-danger-shadow: 0 2px 0 rgba(255, 38, 5, 0.06);
136
+ --fe-button-border-color-disabled: #d9d9d9;
137
+ --fe-button-text-hover-bg: rgba(0, 0, 0, 0.04);
138
+ }
139
+
140
+ /* Antd Select 组件变量 */
141
+ .ant-select,
142
+ .ant-select-css-var {
143
+ --fe-select-internal_fixed_item_margin: 2px;
144
+ --fe-select-z-index-popup: var(--zi-select);
145
+ --fe-select-option-selected-color: rgba(0, 0, 0, 0.88);
146
+ --fe-select-option-selected-font-weight: 600;
147
+ --fe-select-option-selected-bg: var(--fe-color-primary-bg);
148
+ --fe-select-option-active-bg: rgba(0, 0, 0, 0.04);
149
+ --fe-select-option-padding: 5px 12px;
150
+ --fe-select-option-font-size: 14px;
151
+ --fe-select-option-line-height: 1.5714285714285714;
152
+ --fe-select-option-height: 32px;
153
+ --fe-select-selector-bg: var(--fe-color-bg-container);
154
+ --fe-select-clear-bg: var(--fe-color-bg-container);
155
+ --fe-select-single-item-height-lg: 40px;
156
+ --fe-select-multiple-item-bg: rgba(0, 0, 0, 0.06);
157
+ --fe-select-multiple-item-border-color: transparent;
158
+ --fe-select-multiple-item-height: 24px;
159
+ --fe-select-multiple-item-height-sm: 16px;
160
+ --fe-select-multiple-item-height-lg: 32px;
161
+ --fe-select-multiple-selector-bg-disabled: rgba(0, 0, 0, 0.04);
162
+ --fe-select-multiple-item-color-disabled: rgba(0, 0, 0, 0.25);
163
+ --fe-select-multiple-item-border-color-disabled: transparent;
164
+ --fe-select-show-arrow-padding-inline-end: 18px;
165
+ --fe-select-hover-border-color: var(--fe-color-primary);
166
+ --fe-select-active-border-color: var(--fe-color-primary-active);
167
+ --fe-select-active-outline-color: var(--fe-color-primary-bg);
168
+ --fe-select-select-affix-padding: 4px;
169
+ }
170
+
171
+ /* Antd Tag 组件变量 */
172
+ .ant-tag,
173
+ .ant-tag-css-var {
174
+ --fe-tag-default-bg: var(--fe-color-bg-container);
175
+ --fe-tag-default-color: var(--fe-color-text);
176
+ --fe-tag-default-border-color: var(--fe-color-border);
177
+ --fe-tag-font-size: 12px;
178
+ --fe-tag-line-height: 20px;
179
+ --fe-tag-height: 22px;
180
+ --fe-tag-padding-horizontal: 7px;
181
+ --fe-tag-margin: 0 8px 0 0;
182
+ --fe-tag-border-radius: 4px;
183
+ }
184
+
185
+ /* Antd Progress 组件变量 */
186
+ .ant-progress,
187
+ .ant-progress-css-var {
188
+ --fe-progress-default-color: var(--fe-color-primary);
189
+ --fe-progress-remaining-color: var(--fe-color-bg-elevated);
190
+ --fe-progress-text-color: var(--fe-color-text);
191
+ --fe-progress-line-font-size: 14px;
192
+ --fe-progress-circle-font-size: 14px;
193
+ --fe-progress-circle-text-color: var(--fe-color-text);
194
+ --fe-progress-circle-trail-color: var(--fe-color-bg-elevated);
195
+ --fe-progress-circle-stroke-width: 6px;
196
+ --fe-progress-line-stroke-width: 8px;
197
+ }
198
+
199
+ /* Antd Modal 组件变量 */
200
+ .ant-modal,
201
+ .ant-modal-css-var {
202
+ --fe-modal-footer-bg: transparent;
203
+ --fe-modal-header-bg: var(--fe-color-bg-container);
204
+ --fe-modal-title-line-height: var(--fe-line-height);
205
+ --fe-modal-title-font-size: 16px;
206
+ --fe-modal-content-bg: var(--fe-color-bg-container);
207
+ --fe-modal-title-color: var(--fe-color-text);
208
+ --fe-modal-content-padding: 20px 24px;
209
+ --fe-modal-header-padding: 0px;
210
+ --fe-modal-header-border-bottom: none;
211
+ --fe-modal-header-margin-bottom: 8px;
212
+ --fe-modal-body-padding: 0px;
213
+ --fe-modal-footer-padding: 0px;
214
+ --fe-modal-footer-border-top: none;
215
+ --fe-modal-footer-border-radius: var(--fe-border-radius);
216
+ --fe-modal-footer-margin-top: 12px;
217
+ --fe-modal-confirm-body-padding: 0px;
218
+ --fe-modal-confirm-icon-margin-inline-end: 12px;
219
+ --fe-modal-confirm-btns-margin-top: 12px;
220
+ }
221
+
222
+ /* Antd Message 组件变量 */
223
+ .ant-message,
224
+ .ant-message-css-var {
225
+ --fe-message-z-index-popup: var(--zi-message);
226
+ --fe-message-content-bg: var(--fe-color-bg-container);
227
+ --fe-message-content-padding: 9px 12px;
228
+ --fe-message-notice-content-padding: 10px 16px;
229
+ --fe-message-notice-content-bg: var(--fe-color-bg-container);
230
+ --fe-message-notice-content-shadow:
231
+ 0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 3px 6px -4px rgba(0, 0, 0, 0.12),
232
+ 0 9px 28px 8px rgba(0, 0, 0, 0.05);
233
+ --fe-message-success-color: #52c41a;
234
+ --fe-message-error-color: #ff4d4f;
235
+ --fe-message-warning-color: #faad14;
236
+ --fe-message-info-color: var(--fe-color-primary);
237
+ --fe-message-loading-color: var(--fe-color-primary);
238
+ }
239
+ }
@@ -0,0 +1,178 @@
1
+ [data-theme='dark'],
2
+ [data-theme='dark'] .fe-theme {
3
+ /* Antd 主色调相关变量 - 紫色主题 */
4
+ --fe-color-primary: #9333ea; /* purple-600 */
5
+ --fe-color-primary-hover: #a855f7; /* purple-500 */
6
+ --fe-color-primary-active: #7e22ce; /* purple-700 */
7
+ --fe-color-primary-bg: rgba(
8
+ 147,
9
+ 51,
10
+ 234,
11
+ 0.1
12
+ ); /* purple-600 with 0.1 opacity */
13
+ --fe-color-primary-border: #9333ea; /* purple-600 */
14
+ --fe-color-primary-text: #a855f7; /* purple-500 - 文字用亮一点的紫色 */
15
+ --fe-color-primary-text-hover: #c084fc; /* purple-400 */
16
+ --fe-color-primary-text-active: #9333ea; /* purple-600 */
17
+ --fe-color-primary-deprecated-bg: #9333ea; /* purple-600 */
18
+ --fe-color-primary-deprecated-border: #9333ea; /* purple-600 */
19
+
20
+ /* 状态色 */
21
+ --fe-color-success: #52c41a;
22
+ --fe-color-warning: #faad14;
23
+ /* 警告信息相关颜色 - 暗色主题 */
24
+ --fe-color-warning-bg: rgba(250, 173, 20, 0.15);
25
+ --fe-color-warning-bg-hover: rgba(250, 173, 20, 0.25);
26
+ --fe-color-warning-border: rgba(250, 173, 20, 0.3);
27
+ --fe-color-warning-border-hover: #d48806;
28
+ --fe-color-warning-hover: #d48806;
29
+ --fe-color-warning-active: #ad6800;
30
+ --fe-color-warning-text-hover: #ffc53d;
31
+ --fe-color-warning-text: #faad14;
32
+ --fe-color-warning-text-active: #d48806;
33
+ --fe-color-error: #ff4d4f;
34
+ --fe-color-info: var(--fe-color-primary);
35
+ --fe-color-link: var(--fe-color-primary);
36
+
37
+ /* Antd 基础变量 */
38
+ --fe-color-bg-container: rgb(30 41 59);
39
+ --fe-color-bg-elevated: rgb(51 65 85);
40
+ --fe-color-text-heading: rgb(
41
+ 241 245 249
42
+ ); /* slate-100 用于暗色主题标题文本 */
43
+ --fe-color-text: rgba(255, 255, 255, 0.85);
44
+ --fe-color-text-secondary: rgba(255, 255, 255, 0.45);
45
+ --fe-color-text-tertiary: rgba(255, 255, 255, 0.35);
46
+ --fe-color-text-quaternary: rgba(255, 255, 255, 0.15);
47
+ --fe-color-text-placeholder: rgba(255, 255, 255, 0.25);
48
+ --fe-color-border: rgb(51 65 85);
49
+
50
+ /* Antd 图标相关变量 */
51
+ --fe-color-icon: rgba(255, 255, 255, 0.45); /* 暗色主题下的图标颜色 */
52
+ --fe-color-icon-hover: rgba(255, 255, 255, 0.85); /* 暗色主题下图标悬停颜色 */
53
+ --fe-color-icon-active: var(--fe-color-primary); /* 使用主题紫色 */
54
+ --fe-color-icon-disabled: rgba(255, 255, 255, 0.25); /* 暗色主题下禁用状态 */
55
+
56
+ /* Antd Input 组件变量 */
57
+ .ant-input,
58
+ .ant-input-css-var {
59
+ /* Input 交互状态 */
60
+ --fe-input-hover-border-color: #4096ff;
61
+ --fe-input-active-border-color: #1677ff;
62
+ --fe-input-active-shadow: 0 0 0 2px rgba(5, 145, 255, 0.2);
63
+ --fe-input-hover-bg: rgb(51 65 85);
64
+ --fe-input-active-bg: rgb(51 65 85);
65
+ --fe-input-addon-bg: rgba(255, 255, 255, 0.02);
66
+ }
67
+
68
+ /* Antd Button 组件变量 */
69
+ .ant-btn,
70
+ .ant-btn-css-var {
71
+ /* 紫色主题 */
72
+ --fe-button-primary-color: #fff;
73
+ --fe-button-primary-bg: #8b5cf6; /* violet-500 */
74
+ --fe-button-primary-hover-bg: #7c3aed; /* violet-600 */
75
+ --fe-button-primary-active-bg: #6d28d9; /* violet-700 */
76
+ --fe-button-primary-shadow: 0 2px 0 rgba(109, 40, 217, 0.2);
77
+
78
+ /* 默认按钮 */
79
+ --fe-button-default-color: rgba(255, 255, 255, 0.85);
80
+ --fe-button-default-bg: rgb(30 41 59); /* slate-800 */
81
+ --fe-button-default-border-color: rgb(51 65 85); /* slate-700 */
82
+ --fe-button-default-hover-bg: rgb(30 41 59);
83
+ --fe-button-default-hover-color: #8b5cf6;
84
+ --fe-button-default-hover-border-color: #8b5cf6;
85
+ --fe-button-default-active-bg: rgb(30 41 59);
86
+ --fe-button-default-active-color: #6d28d9;
87
+ --fe-button-default-active-border-color: #6d28d9;
88
+ --fe-button-default-shadow: 0 2px 0 rgba(0, 0, 0, 0.1);
89
+
90
+ /* 其他状态 */
91
+ --fe-button-text-hover-bg: rgba(255, 255, 255, 0.08);
92
+ --fe-button-border-color-disabled: rgb(51 65 85);
93
+ }
94
+
95
+ /* Antd Select 组件变量 */
96
+ .ant-select,
97
+ .ant-select-css-var {
98
+ --fe-select-internal_fixed_item_margin: 2px;
99
+ --fe-select-z-index-popup: var(--zi-select);
100
+ --fe-select-option-selected-color: rgba(255, 255, 255, 0.88);
101
+ --fe-select-option-selected-font-weight: 600;
102
+ --fe-select-option-selected-bg: var(--fe-color-primary-bg);
103
+ --fe-select-option-active-bg: rgba(255, 255, 255, 0.08);
104
+ --fe-select-option-padding: 5px 12px;
105
+ --fe-select-option-font-size: 14px;
106
+ --fe-select-option-line-height: 1.5714285714285714;
107
+ --fe-select-option-height: 32px;
108
+ --fe-select-selector-bg: var(--fe-color-bg-container);
109
+ --fe-select-clear-bg: var(--fe-color-bg-container);
110
+ --fe-select-single-item-height-lg: 40px;
111
+ --fe-select-multiple-item-bg: rgba(255, 255, 255, 0.08);
112
+ --fe-select-multiple-item-border-color: transparent;
113
+ --fe-select-multiple-item-height: 24px;
114
+ --fe-select-multiple-item-height-sm: 16px;
115
+ --fe-select-multiple-item-height-lg: 32px;
116
+ --fe-select-multiple-selector-bg-disabled: rgba(255, 255, 255, 0.08);
117
+ --fe-select-multiple-item-color-disabled: rgba(255, 255, 255, 0.25);
118
+ --fe-select-multiple-item-border-color-disabled: transparent;
119
+ --fe-select-show-arrow-padding-inline-end: 18px;
120
+ --fe-select-hover-border-color: var(--fe-color-primary);
121
+ --fe-select-active-border-color: var(--fe-color-primary-active);
122
+ --fe-select-active-outline-color: var(--fe-color-primary-bg);
123
+ --fe-select-select-affix-padding: 4px;
124
+ }
125
+
126
+ /* Antd Tag 组件变量 */
127
+ .ant-tag,
128
+ .ant-tag-css-var {
129
+ --fe-tag-default-bg: var(--fe-color-bg-container);
130
+ --fe-tag-default-color: var(--fe-color-text);
131
+ --fe-tag-default-border-color: var(--fe-color-border);
132
+ --fe-tag-font-size: 12px;
133
+ --fe-tag-line-height: 20px;
134
+ --fe-tag-height: 22px;
135
+ --fe-tag-padding-horizontal: 7px;
136
+ --fe-tag-margin: 0 8px 0 0;
137
+ --fe-tag-border-radius: 4px;
138
+ }
139
+
140
+ /* Antd Progress 组件变量 */
141
+ .ant-progress,
142
+ .ant-progress-css-var {
143
+ --fe-progress-default-color: var(--fe-color-primary);
144
+ --fe-progress-remaining-color: var(--fe-color-bg-elevated);
145
+ --fe-progress-text-color: var(--fe-color-text);
146
+ --fe-progress-line-font-size: 14px;
147
+ --fe-progress-circle-font-size: 14px;
148
+ --fe-progress-circle-text-color: var(--fe-color-text);
149
+ --fe-progress-circle-trail-color: var(--fe-color-bg-elevated);
150
+ --fe-progress-circle-stroke-width: 6px;
151
+ --fe-progress-line-stroke-width: 8px;
152
+ }
153
+
154
+ /* Antd Message 组件变量 */
155
+ .ant-message,
156
+ .ant-message-css-var {
157
+ --fe-message-z-index-popup: var(--zi-message);
158
+ --fe-message-content-bg: rgb(51 65 85); /* slate-700,比容器背景色深一点 */
159
+ --fe-message-content-padding: 9px 12px;
160
+ --fe-message-notice-content-padding: 10px 16px;
161
+ --fe-message-notice-content-bg: rgb(51 65 85);
162
+ --fe-message-notice-content-shadow:
163
+ 0 6px 16px 0 rgba(0, 0, 0, 0.25), 0 3px 6px -4px rgba(0, 0, 0, 0.3),
164
+ 0 9px 28px 8px rgba(0, 0, 0, 0.2);
165
+ --fe-message-notice-content-border: 1px solid rgb(71 85 105); /* slate-600,添加边框 */
166
+ --fe-message-success-color: #52c41a;
167
+ --fe-message-error-color: #ff4d4f;
168
+ --fe-message-warning-color: #faad14;
169
+ --fe-message-info-color: var(--fe-color-primary);
170
+ --fe-message-loading-color: var(--fe-color-primary);
171
+ --fe-message-text-color: rgba(
172
+ 255,
173
+ 255,
174
+ 255,
175
+ 0.85
176
+ ); /* 确保文字在深色背景上清晰可见 */
177
+ }
178
+ }
@@ -0,0 +1,3 @@
1
+ @import './_default.css';
2
+ @import './dark.css';
3
+ @import './pink.css';
@@ -0,0 +1,34 @@
1
+ /*
2
+ 这里是 Antd Message 和 Notification 静态组件变量
3
+ 因为静态组件是全局样式,应用不上antd context样式主题变量,需要在这里覆盖
4
+ */
5
+ .ant-message:not(.fe-theme) {
6
+ color: var(--fe-color-text);
7
+
8
+ .ant-message-notice-wrapper .ant-message-notice-content {
9
+ background: var(--fe-message-content-bg);
10
+ }
11
+
12
+ .ant-message-notice-wrapper .ant-message-info > .anticon,
13
+ .ant-message-notice-wrapper .ant-message-loading > .anticon {
14
+ color: var(--fe-color-info);
15
+ }
16
+ }
17
+
18
+ .ant-notification:not(.fe-theme) {
19
+ .ant-notification-notice-wrapper {
20
+ background: var(--fe-color-bg-elevated);
21
+ }
22
+
23
+ .ant-notification-notice-wrapper .ant-notification-notice-close {
24
+ color: var(--fe-color-icon);
25
+ }
26
+
27
+ .ant-notification-notice-wrapper .ant-notification-notice-message {
28
+ color: var(--fe-color-text-heading);
29
+ }
30
+
31
+ .ant-notification-notice-wrapper .ant-notification-notice-description {
32
+ color: var(--fe-color-text);
33
+ }
34
+ }