@skyroc/scripts 2.5.0 → 2.5.2

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 (277) hide show
  1. package/README.md +6 -3
  2. package/dist/cli.mjs +2 -2
  3. package/dist/{config-BKkdncJS.mjs → config-Cj9IzlRz.mjs} +105 -5
  4. package/dist/index.mjs +1 -1
  5. package/package.json +1 -1
  6. package/templates/admin/package.json +5 -3
  7. package/templates/admin/src/assets/svg-icon/logo.svg +2 -14
  8. package/templates/admin/src/features/router/routeTree.gen.ts +71 -1
  9. package/templates/admin/src/pages/(auth)/login/code-login.tsx +79 -0
  10. package/templates/admin/src/pages/(auth)/login/index.tsx +22 -1
  11. package/templates/admin/src/pages/(auth)/login/layout.tsx +25 -23
  12. package/templates/admin/src/pages/(auth)/login/modules/Header.tsx +25 -0
  13. package/templates/admin/src/pages/(auth)/login/register.tsx +86 -0
  14. package/templates/admin/src/pages/(auth)/login/reset-pwd.tsx +73 -0
  15. package/templates/admin/uno.config.ts +1 -1
  16. package/templates/admin-root/.agents/skills/component-doc/SKILL.md +304 -0
  17. package/templates/admin-root/.agents/skills/component-refactoring/SKILL.md +483 -0
  18. package/templates/admin-root/.agents/skills/component-refactoring/references/complexity-patterns.md +493 -0
  19. package/templates/admin-root/.agents/skills/component-refactoring/references/component-splitting.md +477 -0
  20. package/templates/admin-root/.agents/skills/component-refactoring/references/hook-extraction.md +317 -0
  21. package/templates/admin-root/.agents/skills/doc-coauthoring/SKILL.md +375 -0
  22. package/templates/admin-root/.agents/skills/feature-dev/SKILL.md +78 -0
  23. package/templates/admin-root/.agents/skills/frontend-code-review/SKILL.md +73 -0
  24. package/templates/admin-root/.agents/skills/frontend-code-review/references/business-logic.md +15 -0
  25. package/templates/admin-root/.agents/skills/frontend-code-review/references/code-quality.md +44 -0
  26. package/templates/admin-root/.agents/skills/frontend-code-review/references/performance.md +45 -0
  27. package/templates/admin-root/.agents/skills/frontend-design/LICENSE.txt +177 -0
  28. package/templates/admin-root/.agents/skills/frontend-design/SKILL.md +42 -0
  29. package/templates/admin-root/.agents/skills/frontend-testing/SKILL.md +325 -0
  30. package/templates/admin-root/.agents/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  31. package/templates/admin-root/.agents/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  32. package/templates/admin-root/.agents/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  33. package/templates/admin-root/.agents/skills/frontend-testing/references/async-testing.md +345 -0
  34. package/templates/admin-root/.agents/skills/frontend-testing/references/checklist.md +205 -0
  35. package/templates/admin-root/.agents/skills/frontend-testing/references/common-patterns.md +449 -0
  36. package/templates/admin-root/.agents/skills/frontend-testing/references/domain-components.md +523 -0
  37. package/templates/admin-root/.agents/skills/frontend-testing/references/mocking.md +512 -0
  38. package/templates/admin-root/.agents/skills/frontend-testing/references/workflow.md +269 -0
  39. package/templates/admin-root/.agents/skills/migrate-nativewind-to-uniwind/SKILL.md +734 -0
  40. package/templates/admin-root/.agents/skills/migrate-oxfmt/SKILL.md +202 -0
  41. package/templates/admin-root/.agents/skills/migrate-oxlint/SKILL.md +196 -0
  42. package/templates/admin-root/.agents/skills/native-component-doc/SKILL.md +245 -0
  43. package/templates/admin-root/.agents/skills/senior-frontend/SKILL.md +209 -0
  44. package/templates/admin-root/.agents/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  45. package/templates/admin-root/.agents/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  46. package/templates/admin-root/.agents/skills/senior-frontend/references/react_patterns.md +103 -0
  47. package/templates/admin-root/.agents/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  48. package/templates/admin-root/.agents/skills/senior-frontend/scripts/component_generator.py +114 -0
  49. package/templates/admin-root/.agents/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  50. package/templates/admin-root/.agents/skills/skill-creator/SKILL.md +355 -0
  51. package/templates/admin-root/.agents/skills/skill-creator/references/output-patterns.md +86 -0
  52. package/templates/admin-root/.agents/skills/skill-creator/references/workflows.md +28 -0
  53. package/templates/admin-root/.agents/skills/skill-creator/scripts/init_skill.py +300 -0
  54. package/templates/admin-root/.agents/skills/skill-creator/scripts/package_skill.py +110 -0
  55. package/templates/admin-root/.agents/skills/skill-creator/scripts/quick_validate.py +97 -0
  56. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/SKILL.md +163 -0
  57. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/acceptance-checklist.md +75 -0
  58. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/evidence-order.md +109 -0
  59. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prd-rules.md +103 -0
  60. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prototype-rules.md +85 -0
  61. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/scripts/verify-prototypes.mjs +144 -0
  62. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/admin-page.html +771 -0
  63. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/prd.md +182 -0
  64. package/templates/admin-root/.agents/skills/ui-ux-pro-max/SKILL.md +292 -0
  65. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/charts.csv +26 -0
  66. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/colors.csv +97 -0
  67. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/icons.csv +101 -0
  68. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/landing.csv +31 -0
  69. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/products.csv +97 -0
  70. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  71. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  72. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  73. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  74. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  75. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  76. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  77. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  78. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  79. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  80. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  81. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  82. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  83. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  84. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/styles.csv +68 -0
  85. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/typography.csv +58 -0
  86. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  87. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  88. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  89. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/core.py +253 -0
  90. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  91. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/search.py +114 -0
  92. package/templates/admin-root/.agents/skills/uniwind/SKILL.md +64 -0
  93. package/templates/admin-root/.agents/skills/uniwind/references/component-bindings.md +338 -0
  94. package/templates/admin-root/.agents/skills/uniwind/references/css-and-utilities.md +325 -0
  95. package/templates/admin-root/.agents/skills/uniwind/references/integrations.md +75 -0
  96. package/templates/admin-root/.agents/skills/uniwind/references/pro.md +354 -0
  97. package/templates/admin-root/.agents/skills/uniwind/references/setup.md +144 -0
  98. package/templates/admin-root/.agents/skills/uniwind/references/styling-patterns.md +237 -0
  99. package/templates/admin-root/.agents/skills/uniwind/references/theming.md +309 -0
  100. package/templates/admin-root/.agents/skills/uniwind/references/troubleshooting.md +179 -0
  101. package/templates/admin-root/.agents/skills/uniwind/references/variants-and-selectors.md +224 -0
  102. package/templates/admin-root/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  103. package/templates/admin-root/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
  104. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  105. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  106. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  107. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  108. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  109. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  110. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  111. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  112. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  113. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  114. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  115. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  116. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  117. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  118. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  119. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  120. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  121. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  122. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  123. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  124. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  125. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  126. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  127. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  128. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  129. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  130. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  131. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  132. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  133. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  134. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  135. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  136. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  137. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  138. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  139. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  140. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  141. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  142. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  143. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  144. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  145. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  146. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  147. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  148. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  149. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  150. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  151. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  152. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  153. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  154. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  155. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  156. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  157. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  158. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  159. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  160. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  161. package/templates/admin-root/.claude/settings.json +5 -0
  162. package/templates/admin-root/.claude/skills/component-doc/SKILL.md +304 -0
  163. package/templates/admin-root/.claude/skills/component-refactoring/SKILL.md +483 -0
  164. package/templates/admin-root/.claude/skills/component-refactoring/references/complexity-patterns.md +493 -0
  165. package/templates/admin-root/.claude/skills/component-refactoring/references/component-splitting.md +477 -0
  166. package/templates/admin-root/.claude/skills/component-refactoring/references/hook-extraction.md +317 -0
  167. package/templates/admin-root/.claude/skills/doc-coauthoring/SKILL.md +375 -0
  168. package/templates/admin-root/.claude/skills/feature-dev/SKILL.md +78 -0
  169. package/templates/admin-root/.claude/skills/frontend-code-review/SKILL.md +73 -0
  170. package/templates/admin-root/.claude/skills/frontend-code-review/references/business-logic.md +15 -0
  171. package/templates/admin-root/.claude/skills/frontend-code-review/references/code-quality.md +44 -0
  172. package/templates/admin-root/.claude/skills/frontend-code-review/references/performance.md +45 -0
  173. package/templates/admin-root/.claude/skills/frontend-design/LICENSE.txt +177 -0
  174. package/templates/admin-root/.claude/skills/frontend-design/SKILL.md +42 -0
  175. package/templates/admin-root/.claude/skills/frontend-testing/SKILL.md +325 -0
  176. package/templates/admin-root/.claude/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  177. package/templates/admin-root/.claude/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  178. package/templates/admin-root/.claude/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  179. package/templates/admin-root/.claude/skills/frontend-testing/references/async-testing.md +345 -0
  180. package/templates/admin-root/.claude/skills/frontend-testing/references/checklist.md +205 -0
  181. package/templates/admin-root/.claude/skills/frontend-testing/references/common-patterns.md +449 -0
  182. package/templates/admin-root/.claude/skills/frontend-testing/references/domain-components.md +523 -0
  183. package/templates/admin-root/.claude/skills/frontend-testing/references/mocking.md +512 -0
  184. package/templates/admin-root/.claude/skills/frontend-testing/references/workflow.md +269 -0
  185. package/templates/admin-root/.claude/skills/migrate-nativewind-to-uniwind +1 -0
  186. package/templates/admin-root/.claude/skills/native-component-doc/SKILL.md +245 -0
  187. package/templates/admin-root/.claude/skills/senior-frontend/SKILL.md +209 -0
  188. package/templates/admin-root/.claude/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  189. package/templates/admin-root/.claude/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  190. package/templates/admin-root/.claude/skills/senior-frontend/references/react_patterns.md +103 -0
  191. package/templates/admin-root/.claude/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  192. package/templates/admin-root/.claude/skills/senior-frontend/scripts/component_generator.py +114 -0
  193. package/templates/admin-root/.claude/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  194. package/templates/admin-root/.claude/skills/skill-creator/SKILL.md +355 -0
  195. package/templates/admin-root/.claude/skills/skill-creator/references/output-patterns.md +86 -0
  196. package/templates/admin-root/.claude/skills/skill-creator/references/workflows.md +28 -0
  197. package/templates/admin-root/.claude/skills/skill-creator/scripts/init_skill.py +300 -0
  198. package/templates/admin-root/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  199. package/templates/admin-root/.claude/skills/skill-creator/scripts/quick_validate.py +97 -0
  200. package/templates/admin-root/.claude/skills/ui-ux-pro-max/SKILL.md +386 -0
  201. package/templates/admin-root/.claude/skills/ui-ux-pro-max/data +1 -0
  202. package/templates/admin-root/.claude/skills/ui-ux-pro-max/scripts +1 -0
  203. package/templates/admin-root/.claude/skills/uniwind +1 -0
  204. package/templates/admin-root/.claude/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  205. package/templates/admin-root/.claude/skills/vercel-react-best-practices/SKILL.md +136 -0
  206. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  207. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  208. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  209. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  210. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  211. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  212. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  213. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  214. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  215. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  216. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  217. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  218. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  219. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  220. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  221. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  222. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  223. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  224. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  225. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  226. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  227. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  228. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  229. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  230. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  231. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  232. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  233. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  234. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  235. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  236. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  237. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  238. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  239. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  240. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  241. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  242. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  243. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  244. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  245. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  246. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  247. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  248. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  249. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  250. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  251. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  252. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  253. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  254. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  255. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  256. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  257. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  258. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  259. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  260. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  261. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  262. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  263. package/templates/admin-root/.cursor/settings.json +10 -0
  264. package/templates/admin-root/.editorconfig +19 -0
  265. package/templates/admin-root/.gitattributes +16 -0
  266. package/templates/admin-root/.oxfmtrc.json +35 -0
  267. package/templates/admin-root/AGENTS.md +297 -0
  268. package/templates/admin-root/CLAUDE.md +1 -0
  269. package/templates/admin-root/skills-lock.json +27 -0
  270. package/templates/admin-root.manifest.json +1317 -0
  271. package/templates/admin-shell/theme/antd/AntdProvider.tsx +1 -0
  272. package/templates/admin-shell/theme/antd/shared.ts +3 -3
  273. package/templates/admin-shell/theme/antd-algorithm/algorithm/dark/colors.ts +3 -3
  274. package/templates/admin-shell/theme/antd-algorithm/algorithm/default/colors.ts +1 -1
  275. package/templates/admin-shell/theme/presets/default.json +1 -1
  276. package/templates/admin.meta.json +10 -6
  277. package/LICENSE +0 -21
package/README.md CHANGED
@@ -144,10 +144,13 @@ pnpm sa create-admin my-admin --install
144
144
 
145
145
  从 `apps/admin` 生成 `packages/@core/scripts/templates/admin`。`apps/admin` 是唯一源码,模板目录是发布快照,不手工维护。
146
146
 
147
- 同步产出两样东西:
147
+ 同步产出三样东西:
148
148
 
149
- 1. `templates/admin/` —— `apps/admin` 的逐字节镜像。跳过 `node_modules`、`dist`、`.turbo`、`.tanstack`、`coverage`、`.DS_Store`、本地 `.env.*.local` `src/features/router/routeTree.gen.ts`,再根据模板自身的 `src/pages` 重新生成 `routeTree.gen.ts`。
150
- 2. `templates/admin.meta.json` —— 物化元数据。**只有在 monorepo 内才解析得出**,所以必须在同步期算好:解析后的依赖版本、展平后的 tsconfig oxlint 配置、根级 `overrides`、以及未发布的 workspace 包清单。`create-admin` 的 standalone 模式只读这份文件做替换,不需要 monorepo 在场。
149
+ 1. `templates/admin-root/` + `templates/admin-root.manifest.json` —— 仓库根级工程文件快照。包含 Git 已跟踪的根级点文件/点目录,以及 `AGENTS.md`、`CLAUDE.md`、`skills-lock.json`;排除 `.git`、缓存、构建产物、本机文件,以及 admin 模板已经自带的 `.oxlintrc.json`。manifest 用于还原 npm 固定忽略的 `.npmignore`、`.npmrc` 等点文件及符号链接。
150
+ 2. `templates/admin/` —— `apps/admin` 的逐字节镜像。跳过 `node_modules`、`dist`、`.turbo`、`.tanstack`、`coverage`、`.DS_Store`、本地 `.env.*.local` `src/features/router/routeTree.gen.ts`,再根据模板自身的 `src/pages` 重新生成 `routeTree.gen.ts`。
151
+ 3. `templates/admin.meta.json` —— 物化元数据。**只有在 monorepo 内才解析得出**,所以必须在同步期算好:解析后的依赖版本、展平后的 tsconfig 与 oxlint 配置、根级 `overrides`、以及未发布的 workspace 包清单。`create-admin` 的 standalone 模式只读这份文件做替换,不需要 monorepo 在场。
152
+
153
+ `create-admin` 会先复制 `admin-root`,再覆盖 `admin`。因此协作说明、编辑器配置、skills 和格式化配置会进入新项目;`package.json`、`README.md`、`.oxlintrc.json` 等应用已有文件只取 admin 模板版本。
151
154
 
152
155
  元数据放在 `templates/admin/` **外层**,这样快照目录仍是纯镜像,逐字节比对不需要为 sidecar 开特例。
153
156
 
package/dist/cli.mjs CHANGED
@@ -1,10 +1,10 @@
1
- import { h as genChangelog, i as release, l as createAdminTemplate, m as cleanup, n as updatePkg, o as gitCommit, r as syncAdminTemplate, s as gitCommitVerify, t as loadCliOptions } from "./config-BKkdncJS.mjs";
1
+ import { h as genChangelog, i as release, l as createAdminTemplate, m as cleanup, n as updatePkg, o as gitCommit, r as syncAdminTemplate, s as gitCommitVerify, t as loadCliOptions } from "./config-Cj9IzlRz.mjs";
2
2
  import process from "node:process";
3
3
  import { blue, lightGreen, red } from "kolorist";
4
4
  import { cac } from "cac";
5
5
 
6
6
  //#region package.json
7
- var version = "2.5.0";
7
+ var version = "2.5.1";
8
8
 
9
9
  //#endregion
10
10
  //#region src/cli.ts
@@ -2,7 +2,7 @@ import { createRequire } from "node:module";
2
2
  import { generateChangelog, generateTotalChangelog } from "@soybeanjs/changelog";
3
3
  import { rimraf } from "rimraf";
4
4
  import { existsSync, readFileSync } from "node:fs";
5
- import { cp, mkdir, mkdtemp, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
5
+ import { cp, lstat, mkdir, mkdtemp, readFile, readdir, readlink, rm, stat, symlink, writeFile } from "node:fs/promises";
6
6
  import path from "node:path";
7
7
  import process from "node:process";
8
8
  import { bgRed, cyan, green, red, yellow } from "kolorist";
@@ -249,6 +249,12 @@ function toStoragePrefix(name) {
249
249
  function getTemplateDir() {
250
250
  return path.join(getPackageRoot(), "templates", TEMPLATE_NAME$1);
251
251
  }
252
+ function getRootTemplateDir() {
253
+ return path.join(getPackageRoot(), "templates", "admin-root");
254
+ }
255
+ function getRootTemplateManifestPath() {
256
+ return path.join(getPackageRoot(), "templates", "admin-root.manifest.json");
257
+ }
252
258
  function getShellTemplateDir() {
253
259
  return path.join(getPackageRoot(), "templates", "admin-shell");
254
260
  }
@@ -288,6 +294,28 @@ async function installDependencies(cwd) {
288
294
  stdio: "inherit"
289
295
  });
290
296
  }
297
+ async function restoreRootTemplateFiles(targetDir) {
298
+ const manifestPath = getRootTemplateManifestPath();
299
+ if (!existsSync(manifestPath)) throw new Error(`Admin root template manifest is missing: ${manifestPath}`);
300
+ const entries = JSON.parse(await readFile(manifestPath, "utf8"));
301
+ await Promise.all(entries.map(async (entry) => {
302
+ const target = path.resolve(targetDir, entry.path);
303
+ const relativeTarget = path.relative(targetDir, target);
304
+ if (path.isAbsolute(entry.path) || relativeTarget.startsWith("..") || path.isAbsolute(relativeTarget)) throw new Error(`Invalid admin root template path: ${entry.path}`);
305
+ await mkdir(path.dirname(target), { recursive: true });
306
+ if (entry.type === "symlink") {
307
+ if (!entry.target) throw new Error(`Admin root template symlink target is missing: ${entry.path}`);
308
+ await rm(target, {
309
+ force: true,
310
+ recursive: true
311
+ });
312
+ await symlink(entry.target, target);
313
+ return;
314
+ }
315
+ if (entry.content === void 0) throw new Error(`Admin root template content is missing: ${entry.path}`);
316
+ await writeFile(target, Buffer.from(entry.content, "base64"));
317
+ }));
318
+ }
291
319
  /** 独立模式下把 monorepo 协议物化掉,并把物化过程中发现的隐患打印出来。 */
292
320
  async function applyStandaloneMaterialization(targetDir, packageName, description) {
293
321
  const metaPath = getTemplateMetaPath();
@@ -309,7 +337,9 @@ async function createAdminTemplate(name, options = {}) {
309
337
  const directoryName = packageName.replace(/^@[^/]+\//, "");
310
338
  const targetDir = path.resolve(process.cwd(), options.target || path.join("apps", directoryName));
311
339
  const templateDir = getTemplateDir();
340
+ const rootTemplateDir = getRootTemplateDir();
312
341
  if (!existsSync(templateDir)) throw new Error(`Admin template is missing: ${templateDir}`);
342
+ if (!existsSync(rootTemplateDir)) throw new Error(`Admin root template is missing: ${rootTemplateDir}`);
313
343
  if (existsSync(targetDir) && !await isDirectoryEmpty(targetDir)) {
314
344
  if (!options.force) throw new Error(`Target directory is not empty: ${targetDir}. Use --force to overwrite it.`);
315
345
  await rm(targetDir, {
@@ -318,6 +348,11 @@ async function createAdminTemplate(name, options = {}) {
318
348
  });
319
349
  }
320
350
  await mkdir(path.dirname(targetDir), { recursive: true });
351
+ await cp(rootTemplateDir, targetDir, {
352
+ recursive: true,
353
+ verbatimSymlinks: true
354
+ });
355
+ await restoreRootTemplateFiles(targetDir);
321
356
  await cp(templateDir, targetDir, { recursive: true });
322
357
  if (options.workspace) await updatePackageJson(targetDir, packageName, description);
323
358
  else {
@@ -698,9 +733,21 @@ async function resolveTemplateMeta(options) {
698
733
  //#endregion
699
734
  //#region src/commands/sync-admin-template.ts
700
735
  const TEMPLATE_NAME = "admin";
701
- /** shell 源码模板目录名,与 templates/admin 平级,保持 admin/ 仍是 apps/admin 的逐字节镜像。 */
736
+ /** 仓库根级工程文件模板目录;生成项目时先铺这一层,再由 admin 应用文件覆盖同名项。 */
737
+ const ROOT_TEMPLATE_NAME = "admin-root";
738
+ /** Npm 会主动忽略部分点文件,因此另存一份可完整还原根快照的清单。 */
739
+ const ROOT_TEMPLATE_MANIFEST_FILE = "admin-root.manifest.json";
740
+ /** 不以点开头、但应随新项目保留的仓库根级文件。 */
741
+ const ROOT_TEMPLATE_FILES = [
742
+ "AGENTS.md",
743
+ "CLAUDE.md",
744
+ "skills-lock.json"
745
+ ];
746
+ /** Admin 应用模板已有自己的版本,不再从仓库根重复复制。 */
747
+ const ROOT_TEMPLATE_EXCLUDED_FILES = new Set([".oxlintrc.json"]);
748
+ /** Shell 源码模板目录名,与 templates/admin 平级,保持 admin/ 仍是 apps/admin 的逐字节镜像。 */
702
749
  const SHELL_TEMPLATE_NAME = "admin-shell";
703
- /** shell 里会被复制进生成项目 src/framework 的运行时目录;配置、测试与文档不属于产物。 */
750
+ /** Shell 里会被复制进生成项目 src/framework 的运行时目录;配置、测试与文档不属于产物。 */
704
751
  const SHELL_RUNTIME_DIRS = [
705
752
  "i18n",
706
753
  "layouts",
@@ -716,6 +763,7 @@ const MAX_REPORTED_DIFFERENCES = 20;
716
763
  const TECHNICAL_DIRS = new Set([
717
764
  ".tanstack",
718
765
  ".turbo",
766
+ "__pycache__",
719
767
  "coverage",
720
768
  "dist",
721
769
  "node_modules"
@@ -731,7 +779,7 @@ function isTechnicalGeneratedPath(relativePath) {
731
779
  if (!relativePath) return false;
732
780
  const segments = relativePath.split("/");
733
781
  const basename = segments.at(-1);
734
- return basename === ".DS_Store" || basename?.endsWith(".tsbuildinfo") || basename?.endsWith(".log") || isLocalEnvFile(relativePath) || segments.some((segment) => TECHNICAL_DIRS.has(segment));
782
+ return basename === ".DS_Store" || basename?.endsWith(".pyc") || basename?.endsWith(".tsbuildinfo") || basename?.endsWith(".log") || isLocalEnvFile(relativePath) || segments.some((segment) => TECHNICAL_DIRS.has(segment));
735
783
  }
736
784
  function isRouteTreeFile(relativePath) {
737
785
  return relativePath === "src/features/router/routeTree.gen.ts";
@@ -748,6 +796,46 @@ function resolveSourceDir(workspaceRoot, source) {
748
796
  function resolveTargetDir(target) {
749
797
  return path.resolve(process.cwd(), target || path.join(getPackageRoot(), "templates", TEMPLATE_NAME));
750
798
  }
799
+ async function collectTrackedRootTemplateFiles(workspaceRoot) {
800
+ const { execa } = await import("execa");
801
+ const { stdout } = await execa("git", [
802
+ "ls-files",
803
+ "-z",
804
+ "--",
805
+ ".*",
806
+ ...ROOT_TEMPLATE_FILES
807
+ ], { cwd: workspaceRoot });
808
+ return stdout.split("\0").map(normalizeRelativePath).filter(Boolean).filter((relativePath) => !ROOT_TEMPLATE_EXCLUDED_FILES.has(relativePath)).filter((relativePath) => !isTechnicalGeneratedPath(relativePath));
809
+ }
810
+ async function copyRootSource(workspaceRoot, targetDir) {
811
+ await rm(targetDir, {
812
+ force: true,
813
+ recursive: true
814
+ });
815
+ const files = await collectTrackedRootTemplateFiles(workspaceRoot);
816
+ const manifestEntries = [];
817
+ for (const relativePath of files) {
818
+ const source = path.join(workspaceRoot, relativePath);
819
+ const target = path.join(targetDir, relativePath);
820
+ const sourceStat = await lstat(source);
821
+ await mkdir(path.dirname(target), { recursive: true });
822
+ await cp(source, target, {
823
+ recursive: true,
824
+ verbatimSymlinks: true
825
+ });
826
+ if (sourceStat.isSymbolicLink()) manifestEntries.push({
827
+ path: relativePath,
828
+ target: await readlink(source),
829
+ type: "symlink"
830
+ });
831
+ else if (sourceStat.isFile()) manifestEntries.push({
832
+ content: (await readFile(source)).toString("base64"),
833
+ path: relativePath,
834
+ type: "file"
835
+ });
836
+ }
837
+ await writeFile(path.join(path.dirname(targetDir), ROOT_TEMPLATE_MANIFEST_FILE), `${JSON.stringify(manifestEntries, null, 2)}\n`);
838
+ }
751
839
  async function copyAdminSource(sourceDir, targetDir) {
752
840
  await rm(targetDir, {
753
841
  force: true,
@@ -861,6 +949,7 @@ async function generateSnapshot(workspaceRoot, sourceDir, targetDir) {
861
949
  if (!existsSync(sourceDir)) throw new Error(`Admin source is missing: ${sourceDir}`);
862
950
  const shellSourceDir = path.join(workspaceRoot, "packages/web/admin");
863
951
  const shellTargetDir = path.join(path.dirname(targetDir), SHELL_TEMPLATE_NAME);
952
+ await copyRootSource(workspaceRoot, path.join(path.dirname(targetDir), ROOT_TEMPLATE_NAME));
864
953
  await copyAdminSource(sourceDir, targetDir);
865
954
  await copyShellSource(shellSourceDir, shellTargetDir);
866
955
  await generateRouteTree(targetDir);
@@ -891,11 +980,22 @@ async function checkAdminTemplate(workspaceRoot, sourceDir, targetDir) {
891
980
  const { metaContent } = await generateSnapshot(workspaceRoot, sourceDir, generatedDir);
892
981
  const differences = await compareDirectories(targetDir, generatedDir);
893
982
  const shellDifferences = await compareDirectories(path.join(path.dirname(targetDir), SHELL_TEMPLATE_NAME), path.join(tempDir, SHELL_TEMPLATE_NAME));
894
- differences.push(...shellDifferences.map((item) => ({
983
+ const rootDifferences = await compareDirectories(path.join(path.dirname(targetDir), ROOT_TEMPLATE_NAME), path.join(tempDir, ROOT_TEMPLATE_NAME));
984
+ differences.push(...rootDifferences.map((item) => ({
985
+ ...item,
986
+ path: `${ROOT_TEMPLATE_NAME}/${item.path}`
987
+ })), ...shellDifferences.map((item) => ({
895
988
  ...item,
896
989
  path: `${SHELL_TEMPLATE_NAME}/${item.path}`
897
990
  })));
898
991
  const currentMetaContent = await readMetaContent(path.join(path.dirname(targetDir), TEMPLATE_META_FILE));
992
+ const rootManifestPath = path.join(path.dirname(targetDir), ROOT_TEMPLATE_MANIFEST_FILE);
993
+ const generatedRootManifestPath = path.join(tempDir, ROOT_TEMPLATE_MANIFEST_FILE);
994
+ const [currentRootManifest, generatedRootManifest] = await Promise.all([readMetaContent(rootManifestPath), readMetaContent(generatedRootManifestPath)]);
995
+ if (currentRootManifest !== generatedRootManifest) differences.push({
996
+ path: ROOT_TEMPLATE_MANIFEST_FILE,
997
+ type: currentRootManifest ? "changed" : "added"
998
+ });
899
999
  if (currentMetaContent !== metaContent) differences.push({
900
1000
  path: TEMPLATE_META_FILE,
901
1001
  type: currentMetaContent ? "changed" : "added"
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { a as createCommitMessageRegExp, c as locales, d as replaceEnvValue, f as toStoragePrefix, h as genChangelog, i as release, l as createAdminTemplate, m as cleanup, n as updatePkg, o as gitCommit, p as toTitle, r as syncAdminTemplate, s as gitCommitVerify, t as loadCliOptions, u as normalizePackageName } from "./config-BKkdncJS.mjs";
1
+ import { a as createCommitMessageRegExp, c as locales, d as replaceEnvValue, f as toStoragePrefix, h as genChangelog, i as release, l as createAdminTemplate, m as cleanup, n as updatePkg, o as gitCommit, p as toTitle, r as syncAdminTemplate, s as gitCommitVerify, t as loadCliOptions, u as normalizePackageName } from "./config-Cj9IzlRz.mjs";
2
2
 
3
3
  //#region src/index.ts
4
4
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyroc/scripts",
3
- "version": "2.5.0",
3
+ "version": "2.5.2",
4
4
  "type": "module",
5
5
  "description": "Skyroc admin CLI - changelog, release, git-commit, cleanup and other project automation scripts",
6
6
  "keywords": [
@@ -39,15 +39,17 @@
39
39
  "update-pkg": "sa update-pkg"
40
40
  },
41
41
  "dependencies": {
42
+ "@better-scroll/core": "catalog:web",
43
+ "@dnd-kit/core": "^6.3.1",
44
+ "@dnd-kit/sortable": "^10.0.0",
45
+ "@dnd-kit/utilities": "^3.2.2",
42
46
  "@skyroc/axios": "workspace:*",
43
47
  "@skyroc/color": "workspace:*",
44
48
  "@skyroc/core-state": "workspace:*",
45
49
  "@skyroc/hooks": "workspace:*",
46
- "@skyroc/logger": "workspace:*",
47
50
  "@skyroc/service": "workspace:*",
48
51
  "@skyroc/utils": "workspace:*",
49
52
  "@skyroc/web-admin-devtools": "workspace:*",
50
- "@skyroc/web-admin-shell": "workspace:*",
51
53
  "@skyroc/web-ui": "workspace:*",
52
54
  "@tanstack/react-query": "catalog:core",
53
55
  "@tanstack/react-router": "catalog:web",
@@ -70,7 +72,7 @@
70
72
  "@iconify/json": "catalog:ui-shared",
71
73
  "@iconify/react": "catalog:ui-shared",
72
74
  "@iconify/types": "catalog:ui-shared",
73
- "@sa/uno-config": "workspace:*",
75
+ "@skyroc/uno-config": "workspace:*",
74
76
  "@skyroc/scripts": "workspace:*",
75
77
  "@skyroc/web-admin-vite": "workspace:*",
76
78
  "@svgr/core": "catalog:web",
@@ -1,15 +1,3 @@
1
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
2
- viewBox="0 0 160 160" >
3
- <path d="M57.8,92.8c1.8-2.1,3.5-4.4,5.4-6.4c7.2-7.8,16.8-11.2,26.8-13.6c11-2.6,22.2-4.8,33.2-7.5c4.9-1.2,9.6-3.2,15.2-5.1
4
- c-1.8,3.4-3.1,6.5-5,9.3c-7.7,11.5-19,17.4-32.4,19.6c-5.8,1-11.8,0.9-17.6,1.7c-13.3,1.8-22.4,9.1-26.8,21.5
5
- c-3,8.5-5,17.3-7.5,25.9c-0.4,1.3-0.2,2.1,1.2,2.7c21.6,9.5,42.9,8.6,63.7-2.3c0.4-0.2,0.7-0.5,1.5-1c-14.4-13.6-27-29.3-47.3-35.1
6
- c0,0.1,0-0.2,0.1-0.4c8.3-5.8,22.5-8.6,31.9-2.4c5.4,3.6,10.1,8.4,15.1,12.7c5,4.3,10,8.7,15.1,13.1c3.1-3.2,6.9-7.8,9.7-13.2
7
- c9-17,10.6-34.8,4.9-53.1c-0.6-1.8-0.5-3.2,0.8-4.9c2.1-2.7,3.8-5.8,6.1-9.4c1.8,4.5,3.7,8.6,4.9,12.8c12,42.2-10.7,84.2-51.6,97.7
8
- c-25.5,8.4-49.7,4.9-71.7-10.4c-18.1-12.6-29.3-30-32.4-51.7c-3.2-22.3,0.5-43.4,14.4-61.8c12.7-17,29.8-27.3,51-30.5
9
- c24.1-3.7,45.8,2.1,64.9,17.1c0.5,0.4,1,0.8,1.4,1.2c0.3,0.3,0.6,0.6,1.3,1.3c-3.2,2.1-6.2,4.3-9.3,6.2c-0.4,0.3-1.6-0.3-2.3-0.8
10
- c-25-17.8-59.4-19-84.6,0.2c-14.3,10.9-22.4,25.6-24.9,43c-2.6,18.2,0.8,35.2,11.8,50.3c2.4,3.3,5.4,6.3,8.5,9.9
11
- c1.5-5.9,2.8-11.2,4.2-16.4c2.8-10.4,5.2-20.9,8.5-31.1c4.8-15.1,15.2-25.5,30-31.2c9-3.5,18.5-6,27.8-8.8
12
- c11.4-3.5,22.8-6.8,32.6-13.8c5.2-3.7,9.8-7.9,13.6-13.6c0.1,3.2,0.6,6.5,0.4,9.7c-0.6,10.7-4.3,19.9-13,26.8
13
- c-7.3,5.7-15.8,8.9-24.7,11c-9.4,2.2-18.9,4-28.2,6.4c-8.9,2.3-16.9,6.6-22.3,14.3c-2.1,2.9-3.4,6.4-5.1,9.7
14
- C57.3,92.6,57.5,92.7,57.8,92.8z" fill="currentColor"/>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 160" role="img" aria-label="Skyroc 天鹏">
2
+ <path fill="currentColor" fill-rule="evenodd" d="M 8.31 49.69 Q 8.00 51.38 8.00 54.15 Q 8.00 56.92 8.46 59.08 Q 8.92 61.23 9.85 63.54 Q 10.77 65.85 12.31 68.15 Q 13.85 70.46 15.77 72.38 Q 17.69 74.31 19.85 75.85 Q 22.00 77.38 24.46 78.62 Q 26.92 79.85 30.85 81.00 Q 34.77 82.15 31.92 82.23 Q 29.08 82.31 27.38 82.00 Q 25.69 81.69 23.85 81.08 Q 22.00 80.46 19.23 78.92 Q 16.46 77.38 16.38 78.08 Q 16.31 78.77 16.77 80.15 Q 17.23 81.54 18.15 83.23 Q 19.08 84.92 22.08 87.92 Q 25.08 90.92 28.15 92.46 Q 31.23 94.00 36.00 94.77 Q 40.77 95.54 44.62 95.23 Q 48.46 94.92 53.85 93.69 Q 59.23 92.46 62.15 92.46 Q 65.08 92.46 67.38 93.38 Q 69.69 94.31 70.85 95.46 Q 72.00 96.62 72.46 97.54 Q 72.92 98.46 72.77 100.77 Q 72.62 103.08 71.54 105.38 Q 70.46 107.69 66.92 113.23 Q 63.38 118.77 62.92 120.31 Q 62.46 121.85 62.46 123.54 Q 62.46 125.23 63.08 126.92 Q 63.69 128.62 64.69 129.62 Q 65.69 130.62 69.00 123.92 Q 72.31 117.23 73.92 111.15 Q 75.54 105.08 75.62 108.38 Q 75.69 111.69 74.31 118.31 Q 72.92 124.92 72.77 126.92 Q 72.62 128.92 72.92 130.62 Q 73.23 132.31 74.15 134.31 Q 75.08 136.31 77.31 139.00 Q 79.54 141.69 80.00 141.69 Q 80.46 141.69 81.31 140.85 Q 82.15 140.00 83.85 137.69 Q 85.54 135.38 86.46 132.46 Q 87.38 129.54 87.23 127.08 Q 87.08 124.62 85.69 117.54 Q 84.31 110.46 84.38 107.62 Q 84.46 104.77 86.23 111.31 Q 88.00 117.85 91.00 124.23 Q 94.00 130.62 95.00 129.77 Q 96.00 128.92 96.77 127.23 Q 97.54 125.54 97.54 123.38 Q 97.54 121.23 97.08 119.85 Q 96.62 118.46 93.38 113.54 Q 90.15 108.62 88.77 105.54 Q 87.38 102.46 87.23 100.77 Q 87.08 99.08 88.00 97.38 Q 88.92 95.69 90.08 94.69 Q 91.23 93.69 93.23 92.92 Q 95.23 92.15 97.54 92.15 Q 99.85 92.15 107.08 93.69 Q 114.31 95.23 118.31 95.23 Q 122.31 95.23 126.31 94.15 Q 130.31 93.08 133.08 91.38 Q 135.85 89.69 138.69 86.54 Q 141.54 83.38 142.69 80.38 Q 143.85 77.38 139.08 79.54 Q 134.31 81.69 132.62 82.00 Q 130.92 82.31 128.23 82.23 Q 125.54 82.15 129.00 81.15 Q 132.46 80.15 135.54 78.62 Q 138.62 77.08 140.31 75.85 Q 142.00 74.62 144.69 71.77 Q 147.38 68.92 148.77 66.46 Q 150.15 64.00 150.92 61.54 Q 151.69 59.08 151.85 55.08 Q 152.00 51.08 151.54 49.08 Q 151.08 47.08 150.77 47.08 Q 150.46 47.08 147.85 51.08 Q 145.23 55.08 140.69 59.15 Q 136.15 63.23 131.08 66.00 Q 126.00 68.77 119.69 70.92 Q 113.38 73.08 109.69 74.77 Q 106.00 76.46 101.85 79.85 Q 97.69 83.23 97.46 83.15 Q 97.23 83.08 98.77 80.92 Q 100.31 78.77 103.62 75.92 Q 106.92 73.08 110.62 71.08 Q 114.31 69.08 119.54 67.08 Q 124.77 65.08 129.54 62.46 Q 134.31 59.85 137.31 57.15 Q 140.31 54.46 141.85 52.31 Q 143.38 50.15 144.77 46.31 Q 146.15 42.46 146.15 38.62 Q 146.15 34.77 145.38 32.00 Q 144.62 29.23 143.54 26.92 Q 142.46 24.62 139.92 21.46 Q 137.38 18.31 136.54 22.69 Q 135.69 27.08 134.62 29.85 Q 133.54 32.62 130.00 38.00 Q 126.46 43.38 121.62 48.08 Q 116.77 52.77 108.15 59.38 Q 99.54 66.00 95.08 70.77 Q 90.62 75.54 89.92 75.00 Q 89.23 74.46 88.46 73.08 Q 87.69 71.69 87.38 68.92 Q 87.08 66.15 88.15 63.69 Q 89.23 61.23 90.54 60.08 Q 91.85 58.92 93.15 58.54 Q 94.46 58.15 93.77 57.15 Q 93.08 56.15 88.92 56.31 Q 84.77 56.46 82.62 57.69 Q 80.46 58.92 78.69 60.85 Q 76.92 62.77 77.85 62.77 Q 78.77 62.77 76.62 66.77 Q 74.46 70.77 72.85 72.38 Q 71.23 74.00 70.15 74.46 Q 69.08 74.92 64.46 70.15 Q 59.85 65.38 51.23 58.77 Q 42.62 52.15 38.08 47.77 Q 33.54 43.38 31.54 40.77 Q 29.54 38.15 27.85 35.08 Q 26.15 32.00 25.08 28.92 Q 24.00 25.85 23.31 22.08 Q 22.62 18.31 20.23 21.31 Q 17.85 24.31 16.77 26.46 Q 15.69 28.62 14.77 31.85 Q 13.85 35.08 13.85 38.77 Q 13.85 42.46 15.23 46.31 Q 16.62 50.15 18.15 52.31 Q 19.69 54.46 23.62 57.77 Q 27.54 61.08 30.77 62.77 Q 34.00 64.46 40.00 66.77 Q 46.00 69.08 50.46 71.54 Q 54.92 74.00 57.77 76.69 Q 60.62 79.38 61.77 81.46 Q 62.92 83.54 60.46 81.23 Q 58.00 78.92 55.23 77.08 Q 52.46 75.23 49.69 74.00 Q 46.92 72.77 39.85 70.46 Q 32.77 68.15 27.69 65.23 Q 22.62 62.31 19.00 59.00 Q 15.38 55.69 12.38 51.31 Q 9.38 46.92 9.00 47.46 Q 8.62 48.00 8.31 49.69 Z"/>
15
3
  </svg>
@@ -18,6 +18,9 @@ import { Route as authLoginOutRouteImport } from './../../pages/(auth)/login-out
18
18
  import { Route as authLoginLayoutRouteImport } from './../../pages/(auth)/login/layout'
19
19
  import { Route as authLoginIndexRouteImport } from './../../pages/(auth)/login/index'
20
20
  import { Route as adminHomeIndexRouteImport } from './../../pages/(admin)/home/index'
21
+ import { Route as authLoginResetPwdRouteImport } from './../../pages/(auth)/login/reset-pwd'
22
+ import { Route as authLoginRegisterRouteImport } from './../../pages/(auth)/login/register'
23
+ import { Route as authLoginCodeLoginRouteImport } from './../../pages/(auth)/login/code-login'
21
24
 
22
25
  const adminLayoutRoute = adminLayoutRouteImport.update({
23
26
  id: '/(admin)',
@@ -63,6 +66,21 @@ const adminHomeIndexRoute = adminHomeIndexRouteImport.update({
63
66
  path: '/home/',
64
67
  getParentRoute: () => adminLayoutRoute,
65
68
  } as any)
69
+ const authLoginResetPwdRoute = authLoginResetPwdRouteImport.update({
70
+ id: '/reset-pwd',
71
+ path: '/reset-pwd',
72
+ getParentRoute: () => authLoginLayoutRoute,
73
+ } as any)
74
+ const authLoginRegisterRoute = authLoginRegisterRouteImport.update({
75
+ id: '/register',
76
+ path: '/register',
77
+ getParentRoute: () => authLoginLayoutRoute,
78
+ } as any)
79
+ const authLoginCodeLoginRoute = authLoginCodeLoginRouteImport.update({
80
+ id: '/code-login',
81
+ path: '/code-login',
82
+ getParentRoute: () => authLoginLayoutRoute,
83
+ } as any)
66
84
 
67
85
  export interface FileRoutesByFullPath {
68
86
  '/': typeof IndexRoute
@@ -71,6 +89,9 @@ export interface FileRoutesByFullPath {
71
89
  '/403': typeof errors403Route
72
90
  '/404': typeof errors404Route
73
91
  '/500': typeof errors500Route
92
+ '/login/code-login': typeof authLoginCodeLoginRoute
93
+ '/login/register': typeof authLoginRegisterRoute
94
+ '/login/reset-pwd': typeof authLoginResetPwdRoute
74
95
  '/home/': typeof adminHomeIndexRoute
75
96
  '/login/': typeof authLoginIndexRoute
76
97
  }
@@ -80,6 +101,9 @@ export interface FileRoutesByTo {
80
101
  '/403': typeof errors403Route
81
102
  '/404': typeof errors404Route
82
103
  '/500': typeof errors500Route
104
+ '/login/code-login': typeof authLoginCodeLoginRoute
105
+ '/login/register': typeof authLoginRegisterRoute
106
+ '/login/reset-pwd': typeof authLoginResetPwdRoute
83
107
  '/home': typeof adminHomeIndexRoute
84
108
  '/login': typeof authLoginIndexRoute
85
109
  }
@@ -92,6 +116,9 @@ export interface FileRoutesById {
92
116
  '/(errors)/403': typeof errors403Route
93
117
  '/(errors)/404': typeof errors404Route
94
118
  '/(errors)/500': typeof errors500Route
119
+ '/(auth)/login/code-login': typeof authLoginCodeLoginRoute
120
+ '/(auth)/login/register': typeof authLoginRegisterRoute
121
+ '/(auth)/login/reset-pwd': typeof authLoginResetPwdRoute
95
122
  '/(admin)/home/': typeof adminHomeIndexRoute
96
123
  '/(auth)/login/': typeof authLoginIndexRoute
97
124
  }
@@ -104,10 +131,23 @@ export interface FileRouteTypes {
104
131
  | '/403'
105
132
  | '/404'
106
133
  | '/500'
134
+ | '/login/code-login'
135
+ | '/login/register'
136
+ | '/login/reset-pwd'
107
137
  | '/home/'
108
138
  | '/login/'
109
139
  fileRoutesByTo: FileRoutesByTo
110
- to: '/' | '/login-out' | '/403' | '/404' | '/500' | '/home' | '/login'
140
+ to:
141
+ | '/'
142
+ | '/login-out'
143
+ | '/403'
144
+ | '/404'
145
+ | '/500'
146
+ | '/login/code-login'
147
+ | '/login/register'
148
+ | '/login/reset-pwd'
149
+ | '/home'
150
+ | '/login'
111
151
  id:
112
152
  | '__root__'
113
153
  | '/'
@@ -117,6 +157,9 @@ export interface FileRouteTypes {
117
157
  | '/(errors)/403'
118
158
  | '/(errors)/404'
119
159
  | '/(errors)/500'
160
+ | '/(auth)/login/code-login'
161
+ | '/(auth)/login/register'
162
+ | '/(auth)/login/reset-pwd'
120
163
  | '/(admin)/home/'
121
164
  | '/(auth)/login/'
122
165
  fileRoutesById: FileRoutesById
@@ -196,6 +239,27 @@ declare module '@tanstack/react-router' {
196
239
  preLoaderRoute: typeof adminHomeIndexRouteImport
197
240
  parentRoute: typeof adminLayoutRoute
198
241
  }
242
+ '/(auth)/login/reset-pwd': {
243
+ id: '/(auth)/login/reset-pwd'
244
+ path: '/reset-pwd'
245
+ fullPath: '/login/reset-pwd'
246
+ preLoaderRoute: typeof authLoginResetPwdRouteImport
247
+ parentRoute: typeof authLoginLayoutRoute
248
+ }
249
+ '/(auth)/login/register': {
250
+ id: '/(auth)/login/register'
251
+ path: '/register'
252
+ fullPath: '/login/register'
253
+ preLoaderRoute: typeof authLoginRegisterRouteImport
254
+ parentRoute: typeof authLoginLayoutRoute
255
+ }
256
+ '/(auth)/login/code-login': {
257
+ id: '/(auth)/login/code-login'
258
+ path: '/code-login'
259
+ fullPath: '/login/code-login'
260
+ preLoaderRoute: typeof authLoginCodeLoginRouteImport
261
+ parentRoute: typeof authLoginLayoutRoute
262
+ }
199
263
  }
200
264
  }
201
265
 
@@ -212,10 +276,16 @@ const adminLayoutRouteWithChildren = adminLayoutRoute._addFileChildren(
212
276
  )
213
277
 
214
278
  interface authLoginLayoutRouteChildren {
279
+ authLoginCodeLoginRoute: typeof authLoginCodeLoginRoute
280
+ authLoginRegisterRoute: typeof authLoginRegisterRoute
281
+ authLoginResetPwdRoute: typeof authLoginResetPwdRoute
215
282
  authLoginIndexRoute: typeof authLoginIndexRoute
216
283
  }
217
284
 
218
285
  const authLoginLayoutRouteChildren: authLoginLayoutRouteChildren = {
286
+ authLoginCodeLoginRoute: authLoginCodeLoginRoute,
287
+ authLoginRegisterRoute: authLoginRegisterRoute,
288
+ authLoginResetPwdRoute: authLoginResetPwdRoute,
219
289
  authLoginIndexRoute: authLoginIndexRoute,
220
290
  }
221
291
 
@@ -0,0 +1,79 @@
1
+ import { useCaptcha } from '@skyroc/hooks';
2
+ import { ButtonLink } from '@shell/ui/antd';
3
+ import { REG_PHONE } from '@skyroc/utils';
4
+ import { createFileRoute } from '@tanstack/react-router';
5
+
6
+ import { useAuthFormRules } from '@/features/auth/use-auth-form-rules';
7
+
8
+ type FormValues = {
9
+ code: string;
10
+ phone: string;
11
+ };
12
+
13
+ const CodeLogin = () => {
14
+ const [form] = AForm.useForm<FormValues>();
15
+
16
+ const { t } = useTranslation();
17
+
18
+ const { getCaptcha, isCounting, label, loading } = useCaptcha(t('page.login.codeLogin.getCode'), getCountingLabel);
19
+
20
+ const { formRules } = useAuthFormRules();
21
+
22
+ const phone = AForm.useWatch('phone', form);
23
+
24
+ const isValidPhone = REG_PHONE.test(phone);
25
+
26
+ function handleSubmit(_params: FormValues) {
27
+ // request to reset password
28
+ showSuccessMessage(t('page.login.common.validateSuccess'));
29
+ }
30
+
31
+ function getCountingLabel(count: number) {
32
+ return t('page.login.codeLogin.reGetCode', { time: count });
33
+ }
34
+
35
+ function sendCaptcha() {
36
+ getCaptcha(phone);
37
+ }
38
+
39
+ useKeyPress('enter', () => {
40
+ form.submit();
41
+ });
42
+
43
+ return (
44
+ <>
45
+ <h3 className="text-18px text-primary font-medium">{t('page.login.codeLogin.title')}</h3>
46
+ <AForm className="pt-24px" form={form} onFinish={handleSubmit}>
47
+ <AForm.Item name="phone" rules={formRules.phone}>
48
+ <AInput placeholder={t('page.login.common.phonePlaceholder')} />
49
+ </AForm.Item>
50
+
51
+ <AForm.Item name="code" rules={formRules.code}>
52
+ <div className="w-full flex-y-center gap-16px">
53
+ <AInput placeholder={t('page.login.common.codePlaceholder')} />
54
+ <AButton disabled={!isValidPhone || isCounting} loading={loading} size="large" onClick={sendCaptcha}>
55
+ {label}
56
+ </AButton>
57
+ </div>
58
+ </AForm.Item>
59
+ <ASpace className="w-full" orientation="vertical" size={18}>
60
+ <AButton block htmlType="submit" shape="round" size="large" type="primary">
61
+ {t('common.confirm')}
62
+ </AButton>
63
+
64
+ <ButtonLink block shape="round" size="large" to="..">
65
+ {t('page.login.common.back')}
66
+ </ButtonLink>
67
+ </ASpace>
68
+ </AForm>
69
+ </>
70
+ );
71
+ };
72
+
73
+ export const Route = createFileRoute('/(auth)/login/code-login')({
74
+ component: CodeLogin,
75
+ staticData: {
76
+ title: 'code-login',
77
+ i18nKey: 'route.login_code-login'
78
+ }
79
+ });
@@ -1,7 +1,8 @@
1
+ import { ButtonLink } from '@shell/ui/antd';
1
2
  import { createFileRoute } from '@tanstack/react-router';
2
3
 
3
- import { useAuthFormRules } from '@/features/auth/use-auth-form-rules';
4
4
  import { useInitLogin } from '@/features/auth/use-login';
5
+ import { useAuthFormRules } from '@/features/auth/use-auth-form-rules';
5
6
 
6
7
  type AccountKey = 'admin' | 'super' | 'user';
7
8
 
@@ -19,6 +20,11 @@ const INITIAL_VALUES = {
19
20
  userName: 'Soybean'
20
21
  };
21
22
 
23
+ const LOGIN_ACTION_I18N_KEYS = {
24
+ codeLogin: 'page.login.codeLogin.title',
25
+ register: 'page.login.register.title'
26
+ } as const satisfies Record<'codeLogin' | 'register', I18n.I18nKey>;
27
+
22
28
  const Login = () => {
23
29
  const { t } = useTranslation();
24
30
 
@@ -74,9 +80,24 @@ const Login = () => {
74
80
  <AInput.Password autoComplete="password" size="large" />
75
81
  </AForm.Item>
76
82
  <ASpace className="w-full" orientation="vertical" size={24}>
83
+ <div className="flex-y-center justify-between">
84
+ <ACheckbox>{t('page.login.pwdLogin.rememberMe')}</ACheckbox>
85
+
86
+ <ButtonLink btnType="text" to="/login/reset-pwd">
87
+ {t('page.login.pwdLogin.forgetPassword')}
88
+ </ButtonLink>
89
+ </div>
77
90
  <AButton block color="primary" htmlType="submit" loading={loading} shape="round" size="large" type="primary">
78
91
  {t('common.confirm')}
79
92
  </AButton>
93
+ <div className="flex-y-center justify-between gap-12px">
94
+ <ButtonLink block className="flex-1" to="/login/code-login">
95
+ {t(LOGIN_ACTION_I18N_KEYS.codeLogin) as string}
96
+ </ButtonLink>
97
+ <ButtonLink block className="flex-1" to="/login/register">
98
+ {t(LOGIN_ACTION_I18N_KEYS.register) as string}
99
+ </ButtonLink>
100
+ </div>
80
101
  <ADivider className="!m-0 !text-14px !text-#666">{t('page.login.pwdLogin.otherAccountLogin')}</ADivider>
81
102
  <div className="flex-center gap-12px">
82
103
  {accounts.map(item => {
@@ -1,20 +1,37 @@
1
- import { mixColor } from '@skyroc/color';
1
+ import { getPaletteColorByNumber, mixColor } from '@skyroc/color';
2
+ import { WaveBg } from '@shell/ui/compose';
2
3
  import { useSettingsTheme } from '@shell/theme';
3
4
  import { Outlet, createFileRoute, redirect, useLocation } from '@tanstack/react-router';
4
5
  import { AnimatePresence, motion } from 'motion/react';
5
6
  import { z } from 'zod';
6
7
 
8
+ import Header from './modules/Header';
9
+
7
10
  const COLOR_WHITE = '#ffffff';
8
11
 
9
12
  const LoginSearchSchema = z.object({
10
13
  redirect: z.string().startsWith('/').optional()
11
14
  });
12
15
 
13
- const LoginLayout = () => {
14
- const { t } = useTranslation();
16
+ export const Route = createFileRoute('/(auth)/login')({
17
+ component: LoginLayout,
18
+ validateSearch: LoginSearchSchema,
19
+ beforeLoad: async ({ context, search }) => {
20
+ if (context.isLoggedIn) {
21
+ throw redirect({ to: search.redirect || context.getHomeRoute() });
22
+ }
23
+ },
24
+ staticData: {
25
+ title: 'login',
26
+ i18nKey: 'route.login'
27
+ }
28
+ });
15
29
 
30
+ function LoginLayout() {
16
31
  const { darkMode, themeColor } = useSettingsTheme();
17
32
 
33
+ const bgThemeColor = darkMode ? getPaletteColorByNumber(themeColor, 600) : themeColor;
34
+
18
35
  const ratio = darkMode ? 0.5 : 0.2;
19
36
 
20
37
  const location = useLocation();
@@ -23,12 +40,11 @@ const LoginLayout = () => {
23
40
 
24
41
  return (
25
42
  <div className="relative size-full flex-center overflow-hidden bg-layout" style={{ backgroundColor: bgColor }}>
26
- <ACard className="relative z-4 w-auto rd-8px" variant="borderless">
43
+ <WaveBg themeColor={bgThemeColor} />
44
+
45
+ <ACard className="relative z-4 w-auto rd-12px" variant="borderless">
27
46
  <div className="w-400px lt-sm:w-300px">
28
- <div className="text-center">
29
- <h1 className="m-0 text-28px font-600 text-primary">{t('system.title')}</h1>
30
- <p className="m-0 mt-8px text-14px text-text-2">{t('page.login.common.loginOrRegister')}</p>
31
- </div>
47
+ <Header />
32
48
 
33
49
  <AnimatePresence initial={false} mode="wait">
34
50
  <motion.main
@@ -54,18 +70,4 @@ const LoginLayout = () => {
54
70
  </ACard>
55
71
  </div>
56
72
  );
57
- };
58
-
59
- export const Route = createFileRoute('/(auth)/login')({
60
- component: LoginLayout,
61
- validateSearch: LoginSearchSchema,
62
- beforeLoad: async ({ context, search }) => {
63
- if (context.isLoggedIn) {
64
- throw redirect({ to: search.redirect || context.getHomeRoute() });
65
- }
66
- },
67
- staticData: {
68
- title: 'login',
69
- i18nKey: 'route.login'
70
- }
71
- });
73
+ }