@qlover/create-app 0.7.14 → 0.8.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.
Files changed (361) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/configs/_common/.gitignore.template +6 -0
  3. package/dist/configs/_common/.prettierignore +17 -5
  4. package/dist/configs/_common/.vscode/settings.json +6 -1
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/templates/next-app/.env.template +1 -1
  8. package/dist/templates/next-app/README.en.md +130 -0
  9. package/dist/templates/next-app/README.md +114 -20
  10. package/dist/templates/next-app/config/Identifier/api.ts +5 -5
  11. package/dist/templates/next-app/config/Identifier/common/admint.table.ts +69 -0
  12. package/dist/templates/next-app/config/Identifier/common/common.ts +76 -0
  13. package/dist/templates/next-app/config/Identifier/common/index.ts +3 -0
  14. package/dist/templates/next-app/config/Identifier/{validator.ts → common/validators.ts} +5 -5
  15. package/dist/templates/next-app/config/Identifier/index.ts +2 -12
  16. package/dist/templates/next-app/config/Identifier/pages/index.ts +6 -0
  17. package/dist/templates/next-app/config/Identifier/pages/page.admin.home.ts +27 -0
  18. package/dist/templates/next-app/config/Identifier/pages/page.admin.locales.ts +266 -0
  19. package/dist/templates/next-app/config/Identifier/pages/page.admin.user.ts +293 -0
  20. package/dist/templates/{react-app/config/Identifier → next-app/config/Identifier/pages}/page.home.ts +15 -22
  21. package/dist/templates/next-app/config/Identifier/{page.login.ts → pages/page.login.ts} +28 -34
  22. package/dist/templates/next-app/config/Identifier/{page.register.ts → pages/page.register.ts} +30 -29
  23. package/dist/templates/next-app/config/adminNavs.ts +19 -0
  24. package/dist/templates/next-app/config/common.ts +22 -13
  25. package/dist/templates/next-app/config/i18n/HomeI18n.ts +5 -5
  26. package/dist/templates/next-app/config/i18n/admin18n.ts +61 -19
  27. package/dist/templates/next-app/config/i18n/i18nConfig.ts +2 -0
  28. package/dist/templates/next-app/config/i18n/i18nKeyScheam.ts +36 -0
  29. package/dist/templates/next-app/config/i18n/loginI18n.ts +22 -22
  30. package/dist/templates/next-app/config/i18n/register18n.ts +23 -24
  31. package/dist/templates/next-app/docs/en/api.md +387 -0
  32. package/dist/templates/next-app/docs/en/component.md +544 -0
  33. package/dist/templates/next-app/docs/en/database.md +496 -0
  34. package/dist/templates/next-app/docs/en/development-guide.md +727 -0
  35. package/dist/templates/next-app/docs/en/env.md +563 -0
  36. package/dist/templates/next-app/docs/en/i18n.md +287 -0
  37. package/dist/templates/next-app/docs/en/index.md +165 -0
  38. package/dist/templates/next-app/docs/en/page.md +457 -0
  39. package/dist/templates/next-app/docs/en/project-structure.md +176 -0
  40. package/dist/templates/next-app/docs/en/router.md +427 -0
  41. package/dist/templates/next-app/docs/en/theme.md +532 -0
  42. package/dist/templates/next-app/docs/en/validator.md +478 -0
  43. package/dist/templates/next-app/docs/zh/api.md +387 -0
  44. package/dist/templates/next-app/docs/zh/component.md +544 -0
  45. package/dist/templates/next-app/docs/zh/database.md +496 -0
  46. package/dist/templates/next-app/docs/zh/development-guide.md +727 -0
  47. package/dist/templates/next-app/docs/zh/env.md +563 -0
  48. package/dist/templates/next-app/docs/zh/i18n.md +287 -0
  49. package/dist/templates/next-app/docs/zh/index.md +165 -0
  50. package/dist/templates/next-app/docs/zh/page.md +457 -0
  51. package/dist/templates/next-app/docs/zh/project-structure.md +176 -0
  52. package/dist/templates/next-app/docs/zh/router.md +427 -0
  53. package/dist/templates/next-app/docs/zh/theme.md +532 -0
  54. package/dist/templates/next-app/docs/zh/validator.md +476 -0
  55. package/dist/templates/next-app/make/generateLocales.ts +19 -12
  56. package/dist/templates/next-app/migrations/schema/LocalesSchema.ts +15 -0
  57. package/dist/templates/next-app/migrations/sql/1694244000000.sql +11 -0
  58. package/dist/templates/next-app/package.json +7 -3
  59. package/dist/templates/next-app/public/locales/en.json +172 -207
  60. package/dist/templates/next-app/public/locales/zh.json +172 -207
  61. package/dist/templates/next-app/src/app/[locale]/admin/locales/page.tsx +153 -0
  62. package/dist/templates/next-app/src/app/[locale]/admin/users/page.tsx +48 -50
  63. package/dist/templates/next-app/src/app/[locale]/login/LoginForm.tsx +2 -2
  64. package/dist/templates/next-app/src/app/api/admin/locales/create/route.ts +34 -0
  65. package/dist/templates/next-app/src/app/api/admin/locales/import/route.ts +40 -0
  66. package/dist/templates/next-app/src/app/api/admin/locales/route.ts +42 -0
  67. package/dist/templates/next-app/src/app/api/admin/locales/update/route.ts +32 -0
  68. package/dist/templates/next-app/src/app/api/locales/json/route.ts +44 -0
  69. package/dist/templates/next-app/src/base/cases/AdminPageManager.ts +1 -13
  70. package/dist/templates/next-app/src/base/cases/Datetime.ts +18 -0
  71. package/dist/templates/next-app/src/base/cases/DialogErrorPlugin.ts +12 -6
  72. package/dist/templates/next-app/src/base/cases/ResourceState.ts +17 -0
  73. package/dist/templates/next-app/src/base/cases/TranslateI18nInterface.ts +25 -0
  74. package/dist/templates/next-app/src/base/cases/ZodColumnBuilder.ts +200 -0
  75. package/dist/templates/next-app/src/base/port/ZodBuilderInterface.ts +8 -0
  76. package/dist/templates/next-app/src/base/services/AdminLocalesService.ts +20 -0
  77. package/dist/templates/next-app/src/base/services/AdminPageEvent.ts +26 -0
  78. package/dist/templates/next-app/src/base/services/AdminPageScheduler.ts +42 -0
  79. package/dist/templates/next-app/src/base/services/ResourceService.ts +122 -0
  80. package/dist/templates/next-app/src/base/services/adminApi/AdminLocalesApi.ts +104 -0
  81. package/dist/templates/next-app/src/base/services/adminApi/AdminUserApi.ts +38 -5
  82. package/dist/templates/next-app/src/base/services/appApi/AppApiPlugin.ts +1 -1
  83. package/dist/templates/next-app/src/i18n/request.ts +30 -1
  84. package/dist/templates/next-app/src/server/PageParams.ts +2 -10
  85. package/dist/templates/next-app/src/server/port/DBBridgeInterface.ts +5 -0
  86. package/dist/templates/next-app/src/server/port/DBTableInterface.ts +2 -0
  87. package/dist/templates/next-app/src/server/port/LocalesRepositoryInterface.ts +43 -0
  88. package/dist/templates/next-app/src/server/repositorys/LocalesRepository.ts +197 -0
  89. package/dist/templates/next-app/src/server/services/ApiLocaleService.ts +122 -0
  90. package/dist/templates/next-app/src/server/sqlBridges/SupabaseBridge.ts +60 -11
  91. package/dist/templates/next-app/src/server/validators/ExtendedExecutorError.ts +6 -0
  92. package/dist/templates/next-app/src/server/validators/LocalesValidator.ts +131 -0
  93. package/dist/templates/next-app/src/server/validators/LoginValidator.ts +2 -5
  94. package/dist/templates/next-app/src/server/validators/PaginationValidator.ts +32 -16
  95. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/_default.css +2 -1
  96. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/dark.css +28 -29
  97. package/dist/templates/next-app/src/styles/css/antd-themes/pagination/pink.css +2 -1
  98. package/dist/templates/next-app/src/uikit/components/AdminLayout.tsx +17 -3
  99. package/dist/templates/next-app/src/uikit/components/BaseHeader.tsx +5 -4
  100. package/dist/templates/next-app/src/uikit/components/BaseLayout.tsx +5 -4
  101. package/dist/templates/next-app/src/uikit/components/BootstrapsProvider.tsx +3 -2
  102. package/dist/templates/next-app/src/uikit/components/ComboProvider.tsx +1 -1
  103. package/dist/templates/next-app/src/uikit/components/EditableCell.tsx +118 -0
  104. package/dist/templates/next-app/src/uikit/components/LogoutButton.tsx +5 -6
  105. package/dist/templates/next-app/src/uikit/components/ThemeSwitcher.tsx +1 -1
  106. package/dist/templates/next-app/src/uikit/components/With.tsx +2 -2
  107. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportButton.tsx +62 -0
  108. package/dist/templates/next-app/src/uikit/components/localesImportButton/LocalesImportEvent.ts +28 -0
  109. package/dist/templates/next-app/src/uikit/components/localesImportButton/import.module.css +6 -0
  110. package/dist/templates/next-app/src/uikit/hook/useI18nInterface.ts +8 -14
  111. package/dist/templates/next-app/src/uikit/hook/useWarnTranslations.ts +25 -0
  112. package/dist/templates/react-app/.prettierignore +17 -0
  113. package/dist/templates/react-app/README.en.md +71 -54
  114. package/dist/templates/react-app/README.md +35 -18
  115. package/dist/templates/react-app/__tests__/__mocks__/BootstrapTest.ts +14 -0
  116. package/dist/templates/react-app/__tests__/__mocks__/MockAppConfit.ts +1 -1
  117. package/dist/templates/react-app/__tests__/__mocks__/MockDialogHandler.ts +2 -2
  118. package/dist/templates/react-app/__tests__/__mocks__/MockLogger.ts +1 -1
  119. package/dist/templates/react-app/__tests__/__mocks__/components/TestApp.tsx +45 -0
  120. package/dist/templates/react-app/__tests__/__mocks__/components/TestBootstrapsProvider.tsx +34 -0
  121. package/dist/templates/react-app/__tests__/__mocks__/components/TestRouter.tsx +46 -0
  122. package/dist/templates/react-app/__tests__/__mocks__/components/index.ts +12 -0
  123. package/dist/templates/react-app/__tests__/__mocks__/createMockGlobals.ts +1 -2
  124. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOC.ts +51 -0
  125. package/dist/templates/react-app/__tests__/__mocks__/testIOC/TestIOCRegister.ts +69 -0
  126. package/dist/templates/react-app/__tests__/setup/index.ts +1 -51
  127. package/dist/templates/react-app/__tests__/setup/setupGlobal.ts +51 -0
  128. package/dist/templates/react-app/__tests__/src/App.structure.test.tsx +115 -0
  129. package/dist/templates/react-app/__tests__/src/base/cases/AppConfig.test.ts +2 -2
  130. package/dist/templates/react-app/__tests__/src/base/cases/AppError.test.ts +1 -1
  131. package/dist/templates/react-app/__tests__/src/base/cases/DialogHandler.test.ts +3 -5
  132. package/dist/templates/react-app/__tests__/src/base/cases/I18nKeyErrorPlugin.test.ts +13 -2
  133. package/dist/templates/react-app/__tests__/src/base/cases/InversifyContainer.test.ts +1 -1
  134. package/dist/templates/react-app/__tests__/src/base/cases/PublicAssetsPath.test.ts +1 -1
  135. package/dist/templates/react-app/__tests__/src/base/cases/RequestLogger.test.ts +5 -5
  136. package/dist/templates/react-app/__tests__/src/base/cases/RequestStatusCatcher.test.ts +1 -2
  137. package/dist/templates/react-app/__tests__/src/base/cases/RouterLoader.test.ts +25 -15
  138. package/dist/templates/react-app/__tests__/src/base/services/I18nService.test.ts +29 -15
  139. package/dist/templates/react-app/__tests__/src/core/IOC.test.ts +19 -9
  140. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapClient.test.ts +153 -0
  141. package/dist/templates/react-app/__tests__/src/core/bootstraps/BootstrapsApp.test.ts +9 -7
  142. package/dist/templates/react-app/__tests__/src/main.integration.test.tsx +4 -5
  143. package/dist/templates/react-app/__tests__/src/main.test.tsx +4 -4
  144. package/dist/templates/react-app/__tests__/src/uikit/components/BaseHeader.test.tsx +68 -59
  145. package/dist/templates/react-app/config/IOCIdentifier.ts +8 -8
  146. package/dist/templates/react-app/config/Identifier/{common.error.ts → common/common.error.ts} +5 -5
  147. package/dist/templates/react-app/config/Identifier/{common.ts → common/common.ts} +9 -9
  148. package/dist/templates/react-app/config/Identifier/common/index.ts +2 -0
  149. package/dist/templates/react-app/config/Identifier/index.ts +1 -9
  150. package/dist/templates/react-app/config/Identifier/pages/index.ts +8 -0
  151. package/dist/templates/react-app/config/Identifier/{page.about.ts → pages/page.about.ts} +34 -26
  152. package/dist/templates/react-app/config/Identifier/{page.executor.ts → pages/page.executor.ts} +47 -39
  153. package/dist/templates/{next-app/config/Identifier → react-app/config/Identifier/pages}/page.home.ts +24 -23
  154. package/dist/templates/react-app/config/Identifier/pages/page.identifiter.ts +102 -0
  155. package/dist/templates/react-app/config/Identifier/{page.jsonStorage.ts → pages/page.jsonStorage.ts} +18 -11
  156. package/dist/templates/react-app/config/Identifier/{page.login.ts → pages/page.login.ts} +37 -27
  157. package/dist/templates/react-app/config/Identifier/{page.register.ts → pages/page.register.ts} +37 -25
  158. package/dist/templates/react-app/config/Identifier/{page.request.ts → pages/page.request.ts} +34 -44
  159. package/dist/templates/react-app/config/app.router.ts +66 -69
  160. package/dist/templates/react-app/config/i18n/PageI18nInterface.ts +51 -0
  161. package/dist/templates/react-app/config/i18n/aboutI18n.ts +42 -0
  162. package/dist/templates/react-app/config/i18n/executorI18n.ts +51 -0
  163. package/dist/templates/react-app/config/i18n/homeI18n.ts +24 -0
  164. package/dist/templates/react-app/config/i18n/i18nConfig.ts +30 -0
  165. package/dist/templates/react-app/config/i18n/identifiter18n.ts +30 -0
  166. package/dist/templates/react-app/config/i18n/jsonStorage18n.ts +27 -0
  167. package/dist/templates/react-app/config/i18n/login18n.ts +42 -0
  168. package/dist/templates/react-app/config/i18n/notFoundI18n.ts +34 -0
  169. package/dist/templates/react-app/config/i18n/register18n.ts +40 -0
  170. package/dist/templates/react-app/config/i18n/request18n.ts +41 -0
  171. package/dist/templates/react-app/config/theme.ts +14 -4
  172. package/dist/templates/react-app/docs/en/bootstrap.md +1670 -341
  173. package/dist/templates/react-app/docs/en/development-guide.md +1021 -345
  174. package/dist/templates/react-app/docs/en/env.md +1132 -278
  175. package/dist/templates/react-app/docs/en/i18n.md +858 -147
  176. package/dist/templates/react-app/docs/en/index.md +733 -104
  177. package/dist/templates/react-app/docs/en/ioc.md +1228 -287
  178. package/dist/templates/react-app/docs/en/playwright/e2e-tests.md +321 -0
  179. package/dist/templates/react-app/docs/en/playwright/index.md +19 -0
  180. package/dist/templates/react-app/docs/en/playwright/installation-summary.md +332 -0
  181. package/dist/templates/react-app/docs/en/playwright/overview.md +222 -0
  182. package/dist/templates/react-app/docs/en/playwright/quickstart.md +325 -0
  183. package/dist/templates/react-app/docs/en/playwright/reorganization-notes.md +340 -0
  184. package/dist/templates/react-app/docs/en/playwright/setup-complete.md +290 -0
  185. package/dist/templates/react-app/docs/en/playwright/testing-guide.md +565 -0
  186. package/dist/templates/react-app/docs/en/store.md +1194 -184
  187. package/dist/templates/react-app/docs/en/why-no-globals.md +797 -0
  188. package/dist/templates/react-app/docs/zh/bootstrap.md +1670 -341
  189. package/dist/templates/react-app/docs/zh/development-guide.md +1021 -345
  190. package/dist/templates/react-app/docs/zh/env.md +1132 -275
  191. package/dist/templates/react-app/docs/zh/i18n.md +858 -147
  192. package/dist/templates/react-app/docs/zh/index.md +717 -104
  193. package/dist/templates/react-app/docs/zh/ioc.md +1229 -287
  194. package/dist/templates/react-app/docs/zh/playwright/e2e-tests.md +321 -0
  195. package/dist/templates/react-app/docs/zh/playwright/index.md +19 -0
  196. package/dist/templates/react-app/docs/zh/playwright/installation-summary.md +332 -0
  197. package/dist/templates/react-app/docs/zh/playwright/overview.md +222 -0
  198. package/dist/templates/react-app/docs/zh/playwright/quickstart.md +325 -0
  199. package/dist/templates/react-app/docs/zh/playwright/reorganization-notes.md +340 -0
  200. package/dist/templates/react-app/docs/zh/playwright/setup-complete.md +290 -0
  201. package/dist/templates/react-app/docs/zh/playwright/testing-guide.md +565 -0
  202. package/dist/templates/react-app/docs/zh/store.md +1192 -184
  203. package/dist/templates/react-app/docs/zh/why-no-globals.md +797 -0
  204. package/dist/templates/react-app/e2e/App.spec.ts +319 -0
  205. package/dist/templates/react-app/e2e/fixtures/base.fixture.ts +40 -0
  206. package/dist/templates/react-app/e2e/main.spec.ts +20 -0
  207. package/dist/templates/react-app/e2e/utils/test-helpers.ts +19 -0
  208. package/dist/templates/react-app/eslint.config.mjs +247 -0
  209. package/dist/templates/react-app/makes/eslint-utils.mjs +195 -0
  210. package/dist/templates/react-app/makes/generateTs2LocalesOptions.ts +26 -0
  211. package/dist/templates/react-app/package.json +31 -3
  212. package/dist/templates/react-app/playwright.config.ts +79 -0
  213. package/dist/templates/react-app/public/locales/en/common.json +190 -179
  214. package/dist/templates/react-app/public/locales/zh/common.json +190 -179
  215. package/dist/templates/react-app/src/App.tsx +15 -42
  216. package/dist/templates/react-app/src/base/apis/AiApi.ts +5 -5
  217. package/dist/templates/react-app/src/base/apis/feApi/FeApi.ts +1 -1
  218. package/dist/templates/react-app/src/base/apis/feApi/FeApiAdapter.ts +1 -1
  219. package/dist/templates/react-app/src/base/apis/feApi/FeApiBootstarp.ts +8 -8
  220. package/dist/templates/react-app/src/base/apis/feApi/FeApiType.ts +1 -1
  221. package/dist/templates/react-app/src/base/apis/userApi/UserApi.ts +6 -6
  222. package/dist/templates/react-app/src/base/apis/userApi/UserApiAdapter.ts +1 -1
  223. package/dist/templates/react-app/src/base/apis/userApi/UserApiBootstarp.ts +12 -14
  224. package/dist/templates/react-app/src/base/apis/userApi/UserApiType.ts +1 -1
  225. package/dist/templates/react-app/src/base/cases/DialogHandler.ts +5 -2
  226. package/dist/templates/react-app/src/base/cases/I18nKeyErrorPlugin.ts +3 -3
  227. package/dist/templates/react-app/src/base/cases/InversifyContainer.ts +3 -3
  228. package/dist/templates/react-app/src/base/cases/RequestLanguages.ts +2 -2
  229. package/dist/templates/react-app/src/base/cases/RequestLogger.ts +4 -4
  230. package/dist/templates/react-app/src/base/cases/RequestStatusCatcher.ts +1 -1
  231. package/dist/templates/react-app/src/base/cases/ResourceState.ts +23 -0
  232. package/dist/templates/react-app/src/base/cases/RouterLoader.ts +4 -4
  233. package/dist/templates/react-app/src/base/cases/TranslateI18nInterface.ts +26 -0
  234. package/dist/templates/react-app/src/base/port/ExecutorPageBridgeInterface.ts +2 -3
  235. package/dist/templates/react-app/src/base/port/I18nServiceInterface.ts +1 -1
  236. package/dist/templates/react-app/src/base/port/IOCInterface.ts +36 -0
  237. package/dist/templates/react-app/src/base/port/JSONStoragePageBridgeInterface.ts +2 -1
  238. package/dist/templates/react-app/src/base/port/ProcesserExecutorInterface.ts +1 -1
  239. package/dist/templates/react-app/src/base/port/RequestPageBridgeInterface.ts +2 -2
  240. package/dist/templates/react-app/src/base/port/RouteServiceInterface.ts +9 -5
  241. package/dist/templates/react-app/src/base/port/UserServiceInterface.ts +1 -1
  242. package/dist/templates/react-app/src/base/services/I18nService.ts +29 -29
  243. package/dist/templates/react-app/src/base/services/IdentifierService.ts +143 -0
  244. package/dist/templates/react-app/src/base/services/ProcesserExecutor.ts +3 -3
  245. package/dist/templates/react-app/src/base/services/RouteService.ts +27 -8
  246. package/dist/templates/react-app/src/base/services/UserService.ts +8 -8
  247. package/dist/templates/react-app/src/base/types/Page.ts +14 -2
  248. package/dist/templates/react-app/src/base/types/global.d.ts +1 -1
  249. package/dist/templates/react-app/src/core/IOC.ts +5 -46
  250. package/dist/templates/react-app/src/core/bootstraps/{BootstrapApp.ts → BootstrapClient.ts} +44 -17
  251. package/dist/templates/react-app/src/core/bootstraps/BootstrapsRegistry.ts +14 -7
  252. package/dist/templates/react-app/src/core/bootstraps/IocIdentifierTest.ts +1 -1
  253. package/dist/templates/react-app/src/core/bootstraps/PrintBootstrap.ts +1 -1
  254. package/dist/templates/react-app/src/core/clientIoc/ClientIOC.ts +40 -0
  255. package/dist/templates/react-app/src/core/{IocRegisterImpl.ts → clientIoc/ClientIOCRegister.ts} +35 -24
  256. package/dist/templates/react-app/src/core/globals.ts +9 -9
  257. package/dist/templates/react-app/src/main.tsx +4 -4
  258. package/dist/templates/react-app/src/pages/404.tsx +6 -3
  259. package/dist/templates/react-app/src/pages/500.tsx +5 -2
  260. package/dist/templates/react-app/src/pages/NoRouteFound.tsx +5 -0
  261. package/dist/templates/react-app/src/pages/auth/Layout.tsx +9 -6
  262. package/dist/templates/react-app/src/pages/auth/LoginPage.tsx +46 -56
  263. package/dist/templates/react-app/src/pages/auth/RegisterPage.tsx +46 -58
  264. package/dist/templates/react-app/src/pages/base/AboutPage.tsx +35 -40
  265. package/dist/templates/react-app/src/pages/base/ExecutorPage.tsx +51 -51
  266. package/dist/templates/react-app/src/pages/base/HomePage.tsx +14 -15
  267. package/dist/templates/react-app/src/pages/base/IdentifierPage.tsx +70 -11
  268. package/dist/templates/react-app/src/pages/base/JSONStoragePage.tsx +24 -25
  269. package/dist/templates/react-app/src/pages/base/Layout.tsx +2 -2
  270. package/dist/templates/react-app/src/pages/base/RedirectPathname.tsx +3 -2
  271. package/dist/templates/react-app/src/pages/base/RequestPage.tsx +41 -59
  272. package/dist/templates/react-app/src/styles/css/antd-themes/{_default.css → _common/_default.css} +85 -0
  273. package/dist/templates/react-app/src/styles/css/antd-themes/{dark.css → _common/dark.css} +99 -0
  274. package/dist/templates/react-app/src/styles/css/antd-themes/_common/index.css +3 -0
  275. package/dist/templates/react-app/src/styles/css/antd-themes/{pink.css → _common/pink.css} +86 -0
  276. package/dist/templates/react-app/src/styles/css/antd-themes/index.css +4 -3
  277. package/dist/templates/react-app/src/styles/css/antd-themes/menu/_default.css +108 -0
  278. package/dist/templates/react-app/src/styles/css/antd-themes/menu/dark.css +67 -0
  279. package/dist/templates/react-app/src/styles/css/antd-themes/menu/index.css +3 -0
  280. package/dist/templates/react-app/src/styles/css/antd-themes/menu/pink.css +67 -0
  281. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/_default.css +34 -0
  282. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/dark.css +31 -0
  283. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/index.css +3 -0
  284. package/dist/templates/react-app/src/styles/css/antd-themes/pagination/pink.css +36 -0
  285. package/dist/templates/react-app/src/styles/css/antd-themes/table/_default.css +44 -0
  286. package/dist/templates/react-app/src/styles/css/antd-themes/table/dark.css +43 -0
  287. package/dist/templates/react-app/src/styles/css/antd-themes/table/index.css +3 -0
  288. package/dist/templates/react-app/src/styles/css/antd-themes/table/pink.css +43 -0
  289. package/dist/templates/react-app/src/styles/css/page.css +4 -3
  290. package/dist/templates/react-app/src/styles/css/themes/_default.css +1 -0
  291. package/dist/templates/react-app/src/styles/css/themes/dark.css +1 -0
  292. package/dist/templates/react-app/src/styles/css/themes/pink.css +1 -0
  293. package/dist/templates/react-app/src/styles/css/zIndex.css +1 -1
  294. package/dist/templates/react-app/src/uikit/bridges/ExecutorPageBridge.ts +3 -3
  295. package/dist/templates/react-app/src/uikit/bridges/JSONStoragePageBridge.ts +2 -2
  296. package/dist/templates/react-app/src/uikit/bridges/NavigateBridge.ts +1 -1
  297. package/dist/templates/react-app/src/uikit/bridges/RequestPageBridge.ts +3 -3
  298. package/dist/templates/react-app/src/uikit/components/AppRouterProvider.tsx +35 -0
  299. package/dist/templates/react-app/src/uikit/components/BaseHeader.tsx +15 -11
  300. package/dist/templates/react-app/src/uikit/components/BaseRouteProvider.tsx +14 -11
  301. package/dist/templates/react-app/src/uikit/components/BaseRouteSeo.tsx +18 -0
  302. package/dist/templates/react-app/src/uikit/components/BootstrapsProvider.tsx +13 -0
  303. package/dist/templates/react-app/src/uikit/components/ClientSeo.tsx +62 -0
  304. package/dist/templates/react-app/src/uikit/components/ComboProvider.tsx +38 -0
  305. package/dist/templates/react-app/src/uikit/components/LanguageSwitcher.tsx +48 -27
  306. package/dist/templates/react-app/src/uikit/components/Loading.tsx +4 -2
  307. package/dist/templates/react-app/src/uikit/components/LocaleLink.tsx +4 -5
  308. package/dist/templates/react-app/src/uikit/components/LogoutButton.tsx +34 -11
  309. package/dist/templates/react-app/src/uikit/components/ProcessExecutorProvider.tsx +9 -5
  310. package/dist/templates/react-app/src/uikit/components/RouterRenderComponent.tsx +6 -3
  311. package/dist/templates/react-app/src/uikit/components/ThemeSwitcher.tsx +97 -40
  312. package/dist/templates/react-app/src/uikit/components/UserAuthProvider.tsx +5 -5
  313. package/dist/templates/react-app/src/uikit/components/With.tsx +17 -0
  314. package/dist/templates/react-app/src/uikit/contexts/BaseRouteContext.ts +17 -11
  315. package/dist/templates/react-app/src/uikit/contexts/IOCContext.ts +13 -0
  316. package/dist/templates/react-app/src/uikit/hooks/useAppTranslation.ts +26 -0
  317. package/dist/templates/react-app/src/uikit/hooks/useI18nGuard.ts +8 -11
  318. package/dist/templates/react-app/src/uikit/hooks/useI18nInterface.ts +25 -0
  319. package/dist/templates/react-app/src/uikit/hooks/useIOC.ts +35 -0
  320. package/dist/templates/react-app/src/uikit/hooks/useNavigateBridge.ts +3 -3
  321. package/dist/templates/react-app/src/uikit/hooks/useStrictEffect.ts +0 -1
  322. package/dist/templates/react-app/tsconfig.e2e.json +21 -0
  323. package/dist/templates/react-app/tsconfig.json +8 -1
  324. package/dist/templates/react-app/tsconfig.node.json +1 -1
  325. package/dist/templates/react-app/tsconfig.test.json +3 -1
  326. package/dist/templates/react-app/vite.config.ts +50 -34
  327. package/package.json +2 -1
  328. package/dist/configs/react-app/eslint.config.js +0 -94
  329. package/dist/templates/next-app/config/Identifier/common.error.ts +0 -41
  330. package/dist/templates/next-app/config/Identifier/common.ts +0 -69
  331. package/dist/templates/next-app/config/Identifier/page.about.ts +0 -181
  332. package/dist/templates/next-app/config/Identifier/page.admin.ts +0 -48
  333. package/dist/templates/next-app/config/Identifier/page.executor.ts +0 -272
  334. package/dist/templates/next-app/config/Identifier/page.identifiter.ts +0 -39
  335. package/dist/templates/next-app/config/Identifier/page.jsonStorage.ts +0 -72
  336. package/dist/templates/next-app/config/Identifier/page.request.ts +0 -182
  337. package/dist/templates/next-app/docs/env.md +0 -94
  338. package/dist/templates/next-app/src/base/cases/ChatAction.ts +0 -21
  339. package/dist/templates/next-app/src/base/cases/FocusBarAction.ts +0 -36
  340. package/dist/templates/next-app/src/base/cases/RequestState.ts +0 -20
  341. package/dist/templates/next-app/src/base/port/AdminPageInterface.ts +0 -85
  342. package/dist/templates/next-app/src/base/port/AsyncStateInterface.ts +0 -7
  343. package/dist/templates/next-app/src/base/services/AdminUserService.ts +0 -45
  344. package/dist/templates/next-app/src/uikit/components/ChatRoot.tsx +0 -17
  345. package/dist/templates/next-app/src/uikit/components/chat/ChatActionInterface.ts +0 -30
  346. package/dist/templates/next-app/src/uikit/components/chat/ChatFocusBar.tsx +0 -65
  347. package/dist/templates/next-app/src/uikit/components/chat/ChatMessages.tsx +0 -59
  348. package/dist/templates/next-app/src/uikit/components/chat/ChatWrap.tsx +0 -28
  349. package/dist/templates/next-app/src/uikit/components/chat/FocusBarActionInterface.ts +0 -19
  350. package/dist/templates/next-app/src/uikit/hook/useMountedClient.ts +0 -17
  351. package/dist/templates/next-app/src/uikit/hook/useStore.ts +0 -15
  352. package/dist/templates/react-app/__tests__/__mocks__/I18nService.ts +0 -13
  353. package/dist/templates/react-app/__tests__/src/App.test.tsx +0 -139
  354. package/dist/templates/react-app/config/Identifier/page.identifiter.ts +0 -39
  355. package/dist/templates/react-app/config/i18n.ts +0 -15
  356. package/dist/templates/react-app/docs/en/project-structure.md +0 -434
  357. package/dist/templates/react-app/docs/zh/project-structure.md +0 -434
  358. package/dist/templates/react-app/src/base/cases/RequestState.ts +0 -20
  359. package/dist/templates/react-app/src/base/port/AsyncStateInterface.ts +0 -7
  360. package/dist/templates/react-app/src/uikit/hooks/useDocumentTitle.ts +0 -15
  361. package/dist/templates/react-app/src/uikit/hooks/useStore.ts +0 -15
@@ -0,0 +1,532 @@
1
+ # 主题系统开发指南
2
+
3
+ ## 目录
4
+
5
+ 1. [主题系统概述](#主题系统概述)
6
+ 2. [主题变量和样式系统](#主题变量和样式系统)
7
+ 3. [组件主题实现](#组件主题实现)
8
+ 4. [主题切换和状态管理](#主题切换和状态管理)
9
+ 5. [最佳实践和示例](#最佳实践和示例)
10
+
11
+ ## 主题系统概述
12
+
13
+ ### 1. 主题架构
14
+
15
+ 项目采用分层的主题系统设计:
16
+
17
+ ```
18
+ 样式层 组件层
19
+ ┌──────────────┐ ┌──────────────┐
20
+ │ CSS 变量 │ │ 主题提供者 │
21
+ ├──────────────┤ ├──────────────┤
22
+ │ 主题样式 │ ◄─────┤ 主题消费者 │
23
+ ├──────────────┤ ├──────────────┤
24
+ │ 组件样式 │ │ 主题切换器 │
25
+ └──────────────┘ └──────────────┘
26
+ ```
27
+
28
+ ### 2. 主题类型
29
+
30
+ ```typescript
31
+ // config/theme.ts
32
+ export const themeConfig = {
33
+ // 支持的主题
34
+ supportedThemes: ['light', 'dark', 'pink'] as const,
35
+ defaultTheme: 'system',
36
+
37
+ // DOM 属性
38
+ domAttribute: 'data-theme',
39
+
40
+ // 存储键
41
+ storageKey: 'theme'
42
+ };
43
+
44
+ // 主题类型定义
45
+ export type ThemeMode = (typeof themeConfig.supportedThemes)[number];
46
+ ```
47
+
48
+ ## 主题变量和样式系统
49
+
50
+ ### 1. 基础变量定义
51
+
52
+ ```css
53
+ /* styles/css/antd-themes/_common/_default.css */
54
+ html,
55
+ .fe-theme {
56
+ /* 主色调相关变量 */
57
+ --fe-color-primary: #60a5fa;
58
+ --fe-color-primary-hover: #3b82f6;
59
+ --fe-color-primary-active: #2563eb;
60
+ --fe-color-primary-bg: rgba(96, 165, 250, 0.1);
61
+
62
+ /* 状态色 */
63
+ --fe-color-success: #52c41a;
64
+ --fe-color-warning: #faad14;
65
+ --fe-color-error: #ff4d4f;
66
+ --fe-color-info: var(--fe-color-primary);
67
+
68
+ /* 基础变量 */
69
+ --fe-color-bg-container: rgb(255 255 255);
70
+ --fe-color-bg-elevated: rgb(248 250 252);
71
+ --fe-color-text-heading: rgb(15 23 42);
72
+ --fe-color-text: rgba(15 23 42 / 0.85);
73
+ --fe-color-text-secondary: rgba(15 23 42 / 0.45);
74
+ --fe-color-border: rgb(226 232 240);
75
+ }
76
+ ```
77
+
78
+ ### 2. 暗色主题变量
79
+
80
+ ```css
81
+ /* styles/css/antd-themes/_common/dark.css */
82
+ [data-theme='dark'],
83
+ [data-theme='dark'] .fe-theme {
84
+ /* 主色调 - 紫色主题 */
85
+ --fe-color-primary: #9333ea;
86
+ --fe-color-primary-hover: #a855f7;
87
+ --fe-color-primary-active: #7e22ce;
88
+
89
+ /* 基础变量覆盖 */
90
+ --fe-color-bg-container: rgb(30 41 59);
91
+ --fe-color-bg-elevated: rgb(51 65 85);
92
+ --fe-color-text-heading: rgb(241 245 249);
93
+ --fe-color-text: rgba(255, 255, 255, 0.85);
94
+ --fe-color-border: rgb(51 65 85);
95
+ }
96
+ ```
97
+
98
+ ### 3. 粉色主题变量
99
+
100
+ ```css
101
+ /* styles/css/antd-themes/_common/pink.css */
102
+ [data-theme='pink'],
103
+ [data-theme='pink'] .fe-theme {
104
+ /* 主色调 - 玫瑰色主题 */
105
+ --fe-color-primary: #f472b6;
106
+ --fe-color-primary-hover: #ec4899;
107
+ --fe-color-primary-active: #db2777;
108
+
109
+ /* 基础变量覆盖 */
110
+ --ant-color-bg-container: rgb(255 241 242);
111
+ --ant-color-bg-elevated: rgb(254 205 211);
112
+ --fe-color-text-heading: rgb(159 18 57);
113
+ --fe-color-text: rgba(190 18 60 / 0.85);
114
+ }
115
+ ```
116
+
117
+ ## Ant Design 主题系统
118
+
119
+ ### 1. 基础主题变量
120
+
121
+ ```css
122
+ /* styles/css/antd-themes/_common/_default.css */
123
+ html,
124
+ .fe-theme {
125
+ /* Antd 主色调相关变量 - 浅蓝色主题 */
126
+ --fe-color-primary: #60a5fa; /* blue-400 */
127
+ --fe-color-primary-hover: #3b82f6; /* blue-500 */
128
+ --fe-color-primary-active: #2563eb; /* blue-600 */
129
+ --fe-color-primary-bg: rgba(96, 165, 250, 0.1);
130
+
131
+ /* 状态色 */
132
+ --fe-color-success: #52c41a;
133
+ --fe-color-warning: #faad14;
134
+ --fe-color-error: #ff4d4f;
135
+ --fe-color-info: var(--fe-color-primary);
136
+
137
+ /* Antd 基础变量 */
138
+ --fe-color-bg-container: rgb(255 255 255);
139
+ --fe-color-bg-elevated: rgb(248 250 252);
140
+ --fe-color-text-heading: rgb(15 23 42);
141
+ --fe-color-text: rgba(15 23 42 / 0.85);
142
+ --fe-color-border: rgb(226 232 240);
143
+
144
+ /* Antd 组件通用变量 */
145
+ --fe-line-width: 1px;
146
+ --fe-border-radius: 6px;
147
+ --fe-motion-duration-mid: 0.2s;
148
+ }
149
+ ```
150
+
151
+ ### 2. 暗色主题组件变量
152
+
153
+ ```css
154
+ /* styles/css/antd-themes/_common/dark.css */
155
+ [data-theme='dark'] {
156
+ /* Input 组件变量 */
157
+ .ant-input-css-var {
158
+ --fe-input-hover-border-color: #4096ff;
159
+ --fe-input-active-border-color: #1677ff;
160
+ --fe-input-hover-bg: rgb(51 65 85);
161
+ --fe-input-active-bg: rgb(51 65 85);
162
+ }
163
+
164
+ /* Button 组件变量 */
165
+ .ant-btn-css-var {
166
+ /* 紫色主题 */
167
+ --fe-button-primary-color: #fff;
168
+ --fe-button-primary-bg: #8b5cf6;
169
+ --fe-button-primary-hover-bg: #7c3aed;
170
+ --fe-button-primary-active-bg: #6d28d9;
171
+
172
+ /* 默认按钮 */
173
+ --fe-button-default-color: rgba(255, 255, 255, 0.85);
174
+ --fe-button-default-bg: rgb(30 41 59);
175
+ --fe-button-default-border-color: rgb(51 65 85);
176
+ }
177
+
178
+ /* Select 组件变量 */
179
+ .ant-select-css-var {
180
+ --fe-select-dropdown-bg: rgb(30 41 59);
181
+ --fe-select-item-selected-bg: rgba(147, 51, 234, 0.1);
182
+ }
183
+ }
184
+ ```
185
+
186
+ ### 3. 粉色主题组件变量
187
+
188
+ ```css
189
+ /* styles/css/antd-themes/_common/pink.css */
190
+ [data-theme='pink'] {
191
+ /* 主色调 */
192
+ --fe-color-primary: #f472b6; /* pink-400 */
193
+ --fe-color-primary-hover: #ec4899; /* pink-500 */
194
+ --fe-color-primary-active: #db2777; /* pink-600 */
195
+
196
+ /* 状态色 */
197
+ --fe-color-error: #fb7185; /* rose-400 */
198
+ --fe-color-warning-bg: #fff7e6;
199
+ --fe-color-warning-border: #ffd591;
200
+
201
+ /* 基础变量 */
202
+ --ant-color-bg-container: rgb(255 241 242);
203
+ --ant-color-bg-elevated: rgb(254 205 211);
204
+ --fe-color-text-heading: rgb(159 18 57);
205
+ }
206
+ ```
207
+
208
+ ### 4. Ant Design 组件覆盖
209
+
210
+ ```typescript
211
+ // 1. 配置主题令牌
212
+ const theme = {
213
+ token: {
214
+ colorPrimary: '#60a5fa',
215
+ borderRadius: 6,
216
+ colorBgContainer: '#ffffff',
217
+ colorText: 'rgba(15, 23, 42, 0.85)',
218
+ colorBorder: 'rgb(226, 232, 240)'
219
+ },
220
+ components: {
221
+ Button: {
222
+ colorPrimary: '#60a5fa',
223
+ algorithm: true // 启用算法
224
+ },
225
+ Input: {
226
+ colorBgContainer: '#ffffff',
227
+ activeBorderColor: '#60a5fa'
228
+ }
229
+ }
230
+ };
231
+
232
+ // 2. 使用主题提供者
233
+ export function AntdProvider({ children }: PropsWithChildren) {
234
+ return (
235
+ <ConfigProvider theme={theme}>
236
+ {children}
237
+ </ConfigProvider>
238
+ );
239
+ }
240
+ ```
241
+
242
+ ## 组件主题实现
243
+
244
+ ### 1. 菜单组件主题
245
+
246
+ ```css
247
+ /* styles/css/antd-themes/menu/_default.css */
248
+ .fe-theme {
249
+ &.ant-menu-css-var {
250
+ /* 基础尺寸 */
251
+ --fe-menu-item-height: 40px;
252
+ --fe-menu-item-padding-inline: 16px;
253
+ --fe-menu-radius-item: 8px;
254
+
255
+ /* 文字颜色 */
256
+ --fe-menu-color-item-text: rgb(var(--text-primary));
257
+ --fe-menu-color-item-text-hover: rgb(var(--text-primary));
258
+ --fe-menu-color-group-title: rgb(var(--text-secondary));
259
+
260
+ /* 选中和激活状态 */
261
+ --fe-menu-color-item-text-selected: rgb(var(--color-brand));
262
+ --fe-menu-color-item-bg-selected: rgba(var(--color-brand), 0.1);
263
+
264
+ /* 背景颜色 */
265
+ --fe-menu-color-item-bg: rgb(var(--color-bg-base));
266
+ --fe-menu-color-item-bg-hover: rgba(var(--text-primary), 0.06);
267
+ }
268
+ }
269
+ ```
270
+
271
+ ### 2. 表格组件主题
272
+
273
+ ```css
274
+ /* styles/css/antd-themes/table/_default.css */
275
+ .fe-theme {
276
+ &.ant-table-css-var {
277
+ /* 表格样式变量 */
278
+ --fe-table-header-bg: var(--fe-color-bg-elevated);
279
+ --fe-table-row-hover-bg: var(--fe-color-primary-bg);
280
+ --fe-table-border-color: var(--fe-color-border);
281
+ }
282
+ }
283
+ ```
284
+
285
+ ### 3. 组件主题使用
286
+
287
+ ```typescript
288
+ // 1. 在组件中使用主题变量
289
+ function ThemedButton({ children }: PropsWithChildren) {
290
+ return (
291
+ <button
292
+ className="
293
+ bg-primary
294
+ hover:bg-primary-hover
295
+ active:bg-primary-active
296
+ text-white
297
+ px-4
298
+ py-2
299
+ rounded
300
+ "
301
+ >
302
+ {children}
303
+ </button>
304
+ );
305
+ }
306
+
307
+ // 2. 主题感知组件
308
+ function ThemedCard({ children }: PropsWithChildren) {
309
+ return (
310
+ <div className="
311
+ bg-bg-container
312
+ dark:bg-bg-elevated
313
+ text-text
314
+ dark:text-text-light
315
+ border
316
+ border-border
317
+ rounded-lg
318
+ p-4
319
+ ">
320
+ {children}
321
+ </div>
322
+ );
323
+ }
324
+ ```
325
+
326
+ ## 主题切换和状态管理
327
+
328
+ ### 1. 主题提供者
329
+
330
+ ```typescript
331
+ // 1. 主题配置提供者
332
+ export function ThemeProvider({ children }: PropsWithChildren) {
333
+ return (
334
+ <NextThemesProvider
335
+ attribute={themeConfig.domAttribute}
336
+ defaultTheme={themeConfig.defaultTheme}
337
+ themes={themeConfig.supportedThemes}
338
+ enableSystem
339
+ >
340
+ <AntdThemeProvider theme={themeConfig.antdTheme}>
341
+ {children}
342
+ </AntdThemeProvider>
343
+ </NextThemesProvider>
344
+ );
345
+ }
346
+
347
+ // 2. 主题切换器
348
+ export function ThemeSwitcher() {
349
+ const { theme, setTheme } = useTheme();
350
+
351
+ return (
352
+ <Select
353
+ value={theme}
354
+ onChange={setTheme}
355
+ options={[
356
+ { value: 'light', label: t('theme.light') },
357
+ { value: 'dark', label: t('theme.dark') },
358
+ { value: 'pink', label: t('theme.pink') },
359
+ { value: 'system', label: t('theme.system') }
360
+ ]}
361
+ />
362
+ );
363
+ }
364
+ ```
365
+
366
+ ### 2. 主题状态管理
367
+
368
+ ```typescript
369
+ // 1. 主题 Store
370
+ @injectable()
371
+ export class ThemeStore extends StoreInterface<ThemeState> {
372
+ constructor() {
373
+ super(() => ({
374
+ mode: themeConfig.defaultTheme,
375
+ systemTheme: 'light'
376
+ }));
377
+ }
378
+
379
+ setTheme(mode: ThemeMode) {
380
+ this.emit({ ...this.state, mode });
381
+ localStorage.setItem(themeConfig.storageKey, mode);
382
+ }
383
+
384
+ // 监听系统主题变化
385
+ watchSystemTheme() {
386
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
387
+ const handler = (e: MediaQueryListEvent) => {
388
+ this.emit({
389
+ ...this.state,
390
+ systemTheme: e.matches ? 'dark' : 'light'
391
+ });
392
+ };
393
+
394
+ mediaQuery.addEventListener('change', handler);
395
+ return () => mediaQuery.removeEventListener('change', handler);
396
+ }
397
+ }
398
+
399
+ // 2. 在组件中使用
400
+ function ThemeAwareComponent() {
401
+ const themeStore = useIOC(ThemeStore);
402
+ const theme = useStore(themeStore, state => state.mode);
403
+ const systemTheme = useStore(themeStore, state => state.systemTheme);
404
+
405
+ const actualTheme = theme === 'system' ? systemTheme : theme;
406
+
407
+ return (
408
+ <div className={`theme-${actualTheme}`}>
409
+ {/* 组件内容 */}
410
+ </div>
411
+ );
412
+ }
413
+ ```
414
+
415
+ ## 最佳实践和示例
416
+
417
+ ### 1. 主题变量命名规范
418
+
419
+ ```css
420
+ /* ✅ 好的命名规范 */
421
+ --fe-color-primary
422
+ --fe-color-text
423
+ --fe-spacing-lg
424
+ --fe-radius-sm
425
+
426
+ /* ❌ 不好的命名规范 */
427
+ --primary
428
+ --text
429
+ --large-spacing
430
+ --small-radius
431
+ ```
432
+
433
+ ### 2. 主题样式组织
434
+
435
+ ```
436
+ styles/
437
+ css/
438
+ antd-themes/ # Ant Design 主题
439
+ _common/ # 通用变量
440
+ _default.css # 默认主题
441
+ dark.css # 暗色主题
442
+ pink.css # 粉色主题
443
+ menu/ # 菜单组件主题
444
+ table/ # 表格组件主题
445
+ themes/ # 自定义主题
446
+ default.css
447
+ dark.css
448
+ pink.css
449
+ ```
450
+
451
+ ### 3. 响应式主题
452
+
453
+ ```typescript
454
+ // 1. 使用 Tailwind 的响应式主题
455
+ function ResponsiveCard() {
456
+ return (
457
+ <div className="
458
+ bg-white
459
+ dark:bg-gray-800
460
+ md:p-6
461
+ lg:p-8
462
+ rounded-lg
463
+ shadow-sm
464
+ dark:shadow-gray-700
465
+ ">
466
+ {/* 卡片内容 */}
467
+ </div>
468
+ );
469
+ }
470
+
471
+ // 2. 使用媒体查询
472
+ const styles = css`
473
+ @media (prefers-color-scheme: dark) {
474
+ :root {
475
+ --fe-color-bg: #1a1a1a;
476
+ --fe-color-text: #ffffff;
477
+ }
478
+ }
479
+
480
+ @media (prefers-color-scheme: light) {
481
+ :root {
482
+ --fe-color-bg: #ffffff;
483
+ --fe-color-text: #1a1a1a;
484
+ }
485
+ }
486
+ `;
487
+ ```
488
+
489
+ ### 4. 主题切换动画
490
+
491
+ ```css
492
+ /* 添加主题切换动画 */
493
+ :root {
494
+ --transition-duration: 200ms;
495
+ }
496
+
497
+ * {
498
+ transition:
499
+ background-color var(--transition-duration) ease,
500
+ color var(--transition-duration) ease,
501
+ border-color var(--transition-duration) ease;
502
+ }
503
+
504
+ /* 禁用特定元素的过渡效果 */
505
+ .no-theme-transition {
506
+ transition: none !important;
507
+ }
508
+ ```
509
+
510
+ ## 总结
511
+
512
+ 项目的主题系统遵循以下原则:
513
+
514
+ 1. **变量系统**:
515
+ - 统一的变量命名规范
516
+ - 层次化的变量组织
517
+ - 完整的类型定义
518
+
519
+ 2. **组件支持**:
520
+ - 组件级别的主题变量
521
+ - 响应式的主题支持
522
+ - 平滑的主题切换
523
+
524
+ 3. **可扩展性**:
525
+ - 支持自定义主题
526
+ - 插件化的主题系统
527
+ - 组件级别的主题扩展
528
+
529
+ 4. **最佳实践**:
530
+ - 清晰的文件组织
531
+ - 响应式设计
532
+ - 性能优化