@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.
- package/README.md +6 -3
- package/dist/cli.mjs +2 -2
- package/dist/{config-BKkdncJS.mjs → config-Cj9IzlRz.mjs} +105 -5
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
- package/templates/admin/package.json +5 -3
- package/templates/admin/src/assets/svg-icon/logo.svg +2 -14
- package/templates/admin/src/features/router/routeTree.gen.ts +71 -1
- package/templates/admin/src/pages/(auth)/login/code-login.tsx +79 -0
- package/templates/admin/src/pages/(auth)/login/index.tsx +22 -1
- package/templates/admin/src/pages/(auth)/login/layout.tsx +25 -23
- package/templates/admin/src/pages/(auth)/login/modules/Header.tsx +25 -0
- package/templates/admin/src/pages/(auth)/login/register.tsx +86 -0
- package/templates/admin/src/pages/(auth)/login/reset-pwd.tsx +73 -0
- package/templates/admin/uno.config.ts +1 -1
- package/templates/admin-root/.agents/skills/component-doc/SKILL.md +304 -0
- package/templates/admin-root/.agents/skills/component-refactoring/SKILL.md +483 -0
- package/templates/admin-root/.agents/skills/component-refactoring/references/complexity-patterns.md +493 -0
- package/templates/admin-root/.agents/skills/component-refactoring/references/component-splitting.md +477 -0
- package/templates/admin-root/.agents/skills/component-refactoring/references/hook-extraction.md +317 -0
- package/templates/admin-root/.agents/skills/doc-coauthoring/SKILL.md +375 -0
- package/templates/admin-root/.agents/skills/feature-dev/SKILL.md +78 -0
- package/templates/admin-root/.agents/skills/frontend-code-review/SKILL.md +73 -0
- package/templates/admin-root/.agents/skills/frontend-code-review/references/business-logic.md +15 -0
- package/templates/admin-root/.agents/skills/frontend-code-review/references/code-quality.md +44 -0
- package/templates/admin-root/.agents/skills/frontend-code-review/references/performance.md +45 -0
- package/templates/admin-root/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/templates/admin-root/.agents/skills/frontend-design/SKILL.md +42 -0
- package/templates/admin-root/.agents/skills/frontend-testing/SKILL.md +325 -0
- package/templates/admin-root/.agents/skills/frontend-testing/assets/component-test.template.tsx +293 -0
- package/templates/admin-root/.agents/skills/frontend-testing/assets/hook-test.template.ts +207 -0
- package/templates/admin-root/.agents/skills/frontend-testing/assets/utility-test.template.ts +154 -0
- package/templates/admin-root/.agents/skills/frontend-testing/references/async-testing.md +345 -0
- package/templates/admin-root/.agents/skills/frontend-testing/references/checklist.md +205 -0
- package/templates/admin-root/.agents/skills/frontend-testing/references/common-patterns.md +449 -0
- package/templates/admin-root/.agents/skills/frontend-testing/references/domain-components.md +523 -0
- package/templates/admin-root/.agents/skills/frontend-testing/references/mocking.md +512 -0
- package/templates/admin-root/.agents/skills/frontend-testing/references/workflow.md +269 -0
- package/templates/admin-root/.agents/skills/migrate-nativewind-to-uniwind/SKILL.md +734 -0
- package/templates/admin-root/.agents/skills/migrate-oxfmt/SKILL.md +202 -0
- package/templates/admin-root/.agents/skills/migrate-oxlint/SKILL.md +196 -0
- package/templates/admin-root/.agents/skills/native-component-doc/SKILL.md +245 -0
- package/templates/admin-root/.agents/skills/senior-frontend/SKILL.md +209 -0
- package/templates/admin-root/.agents/skills/senior-frontend/references/frontend_best_practices.md +103 -0
- package/templates/admin-root/.agents/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
- package/templates/admin-root/.agents/skills/senior-frontend/references/react_patterns.md +103 -0
- package/templates/admin-root/.agents/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
- package/templates/admin-root/.agents/skills/senior-frontend/scripts/component_generator.py +114 -0
- package/templates/admin-root/.agents/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
- package/templates/admin-root/.agents/skills/skill-creator/SKILL.md +355 -0
- package/templates/admin-root/.agents/skills/skill-creator/references/output-patterns.md +86 -0
- package/templates/admin-root/.agents/skills/skill-creator/references/workflows.md +28 -0
- package/templates/admin-root/.agents/skills/skill-creator/scripts/init_skill.py +300 -0
- package/templates/admin-root/.agents/skills/skill-creator/scripts/package_skill.py +110 -0
- package/templates/admin-root/.agents/skills/skill-creator/scripts/quick_validate.py +97 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/SKILL.md +163 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/acceptance-checklist.md +75 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/evidence-order.md +109 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prd-rules.md +103 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prototype-rules.md +85 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/scripts/verify-prototypes.mjs +144 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/admin-page.html +771 -0
- package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/prd.md +182 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/SKILL.md +292 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/templates/admin-root/.agents/skills/uniwind/SKILL.md +64 -0
- package/templates/admin-root/.agents/skills/uniwind/references/component-bindings.md +338 -0
- package/templates/admin-root/.agents/skills/uniwind/references/css-and-utilities.md +325 -0
- package/templates/admin-root/.agents/skills/uniwind/references/integrations.md +75 -0
- package/templates/admin-root/.agents/skills/uniwind/references/pro.md +354 -0
- package/templates/admin-root/.agents/skills/uniwind/references/setup.md +144 -0
- package/templates/admin-root/.agents/skills/uniwind/references/styling-patterns.md +237 -0
- package/templates/admin-root/.agents/skills/uniwind/references/theming.md +309 -0
- package/templates/admin-root/.agents/skills/uniwind/references/troubleshooting.md +179 -0
- package/templates/admin-root/.agents/skills/uniwind/references/variants-and-selectors.md +224 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/templates/admin-root/.claude/settings.json +5 -0
- package/templates/admin-root/.claude/skills/component-doc/SKILL.md +304 -0
- package/templates/admin-root/.claude/skills/component-refactoring/SKILL.md +483 -0
- package/templates/admin-root/.claude/skills/component-refactoring/references/complexity-patterns.md +493 -0
- package/templates/admin-root/.claude/skills/component-refactoring/references/component-splitting.md +477 -0
- package/templates/admin-root/.claude/skills/component-refactoring/references/hook-extraction.md +317 -0
- package/templates/admin-root/.claude/skills/doc-coauthoring/SKILL.md +375 -0
- package/templates/admin-root/.claude/skills/feature-dev/SKILL.md +78 -0
- package/templates/admin-root/.claude/skills/frontend-code-review/SKILL.md +73 -0
- package/templates/admin-root/.claude/skills/frontend-code-review/references/business-logic.md +15 -0
- package/templates/admin-root/.claude/skills/frontend-code-review/references/code-quality.md +44 -0
- package/templates/admin-root/.claude/skills/frontend-code-review/references/performance.md +45 -0
- package/templates/admin-root/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/templates/admin-root/.claude/skills/frontend-design/SKILL.md +42 -0
- package/templates/admin-root/.claude/skills/frontend-testing/SKILL.md +325 -0
- package/templates/admin-root/.claude/skills/frontend-testing/assets/component-test.template.tsx +293 -0
- package/templates/admin-root/.claude/skills/frontend-testing/assets/hook-test.template.ts +207 -0
- package/templates/admin-root/.claude/skills/frontend-testing/assets/utility-test.template.ts +154 -0
- package/templates/admin-root/.claude/skills/frontend-testing/references/async-testing.md +345 -0
- package/templates/admin-root/.claude/skills/frontend-testing/references/checklist.md +205 -0
- package/templates/admin-root/.claude/skills/frontend-testing/references/common-patterns.md +449 -0
- package/templates/admin-root/.claude/skills/frontend-testing/references/domain-components.md +523 -0
- package/templates/admin-root/.claude/skills/frontend-testing/references/mocking.md +512 -0
- package/templates/admin-root/.claude/skills/frontend-testing/references/workflow.md +269 -0
- package/templates/admin-root/.claude/skills/migrate-nativewind-to-uniwind +1 -0
- package/templates/admin-root/.claude/skills/native-component-doc/SKILL.md +245 -0
- package/templates/admin-root/.claude/skills/senior-frontend/SKILL.md +209 -0
- package/templates/admin-root/.claude/skills/senior-frontend/references/frontend_best_practices.md +103 -0
- package/templates/admin-root/.claude/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
- package/templates/admin-root/.claude/skills/senior-frontend/references/react_patterns.md +103 -0
- package/templates/admin-root/.claude/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
- package/templates/admin-root/.claude/skills/senior-frontend/scripts/component_generator.py +114 -0
- package/templates/admin-root/.claude/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
- package/templates/admin-root/.claude/skills/skill-creator/SKILL.md +355 -0
- package/templates/admin-root/.claude/skills/skill-creator/references/output-patterns.md +86 -0
- package/templates/admin-root/.claude/skills/skill-creator/references/workflows.md +28 -0
- package/templates/admin-root/.claude/skills/skill-creator/scripts/init_skill.py +300 -0
- package/templates/admin-root/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/templates/admin-root/.claude/skills/skill-creator/scripts/quick_validate.py +97 -0
- package/templates/admin-root/.claude/skills/ui-ux-pro-max/SKILL.md +386 -0
- package/templates/admin-root/.claude/skills/ui-ux-pro-max/data +1 -0
- package/templates/admin-root/.claude/skills/ui-ux-pro-max/scripts +1 -0
- package/templates/admin-root/.claude/skills/uniwind +1 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/AGENTS.md +2934 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/SKILL.md +136 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/templates/admin-root/.cursor/settings.json +10 -0
- package/templates/admin-root/.editorconfig +19 -0
- package/templates/admin-root/.gitattributes +16 -0
- package/templates/admin-root/.oxfmtrc.json +35 -0
- package/templates/admin-root/AGENTS.md +297 -0
- package/templates/admin-root/CLAUDE.md +1 -0
- package/templates/admin-root/skills-lock.json +27 -0
- package/templates/admin-root.manifest.json +1317 -0
- package/templates/admin-shell/theme/antd/AntdProvider.tsx +1 -0
- package/templates/admin-shell/theme/antd/shared.ts +3 -3
- package/templates/admin-shell/theme/antd-algorithm/algorithm/dark/colors.ts +3 -3
- package/templates/admin-shell/theme/antd-algorithm/algorithm/default/colors.ts +1 -1
- package/templates/admin-shell/theme/presets/default.json +1 -1
- package/templates/admin.meta.json +10 -6
- 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/`
|
|
150
|
-
2. `templates/admin
|
|
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-
|
|
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.
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
-
|
|
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-
|
|
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
|
@@ -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
|
-
"@
|
|
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
|
|
2
|
-
|
|
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:
|
|
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
|
|
14
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
+
}
|