@skyroc/scripts 2.5.1 → 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 (265) hide show
  1. package/README.md +6 -3
  2. package/dist/cli.mjs +1 -1
  3. package/dist/{config-BKkdncJS.mjs → config-Cj9IzlRz.mjs} +105 -5
  4. package/dist/index.mjs +1 -1
  5. package/package.json +3 -3
  6. package/templates/admin/package.json +5 -1
  7. package/templates/admin/src/assets/svg-icon/logo.svg +1 -1
  8. package/templates/admin/uno.config.ts +1 -1
  9. package/templates/admin-root/.agents/skills/component-doc/SKILL.md +304 -0
  10. package/templates/admin-root/.agents/skills/component-refactoring/SKILL.md +483 -0
  11. package/templates/admin-root/.agents/skills/component-refactoring/references/complexity-patterns.md +493 -0
  12. package/templates/admin-root/.agents/skills/component-refactoring/references/component-splitting.md +477 -0
  13. package/templates/admin-root/.agents/skills/component-refactoring/references/hook-extraction.md +317 -0
  14. package/templates/admin-root/.agents/skills/doc-coauthoring/SKILL.md +375 -0
  15. package/templates/admin-root/.agents/skills/feature-dev/SKILL.md +78 -0
  16. package/templates/admin-root/.agents/skills/frontend-code-review/SKILL.md +73 -0
  17. package/templates/admin-root/.agents/skills/frontend-code-review/references/business-logic.md +15 -0
  18. package/templates/admin-root/.agents/skills/frontend-code-review/references/code-quality.md +44 -0
  19. package/templates/admin-root/.agents/skills/frontend-code-review/references/performance.md +45 -0
  20. package/templates/admin-root/.agents/skills/frontend-design/LICENSE.txt +177 -0
  21. package/templates/admin-root/.agents/skills/frontend-design/SKILL.md +42 -0
  22. package/templates/admin-root/.agents/skills/frontend-testing/SKILL.md +325 -0
  23. package/templates/admin-root/.agents/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  24. package/templates/admin-root/.agents/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  25. package/templates/admin-root/.agents/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  26. package/templates/admin-root/.agents/skills/frontend-testing/references/async-testing.md +345 -0
  27. package/templates/admin-root/.agents/skills/frontend-testing/references/checklist.md +205 -0
  28. package/templates/admin-root/.agents/skills/frontend-testing/references/common-patterns.md +449 -0
  29. package/templates/admin-root/.agents/skills/frontend-testing/references/domain-components.md +523 -0
  30. package/templates/admin-root/.agents/skills/frontend-testing/references/mocking.md +512 -0
  31. package/templates/admin-root/.agents/skills/frontend-testing/references/workflow.md +269 -0
  32. package/templates/admin-root/.agents/skills/migrate-nativewind-to-uniwind/SKILL.md +734 -0
  33. package/templates/admin-root/.agents/skills/migrate-oxfmt/SKILL.md +202 -0
  34. package/templates/admin-root/.agents/skills/migrate-oxlint/SKILL.md +196 -0
  35. package/templates/admin-root/.agents/skills/native-component-doc/SKILL.md +245 -0
  36. package/templates/admin-root/.agents/skills/senior-frontend/SKILL.md +209 -0
  37. package/templates/admin-root/.agents/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  38. package/templates/admin-root/.agents/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  39. package/templates/admin-root/.agents/skills/senior-frontend/references/react_patterns.md +103 -0
  40. package/templates/admin-root/.agents/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  41. package/templates/admin-root/.agents/skills/senior-frontend/scripts/component_generator.py +114 -0
  42. package/templates/admin-root/.agents/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  43. package/templates/admin-root/.agents/skills/skill-creator/SKILL.md +355 -0
  44. package/templates/admin-root/.agents/skills/skill-creator/references/output-patterns.md +86 -0
  45. package/templates/admin-root/.agents/skills/skill-creator/references/workflows.md +28 -0
  46. package/templates/admin-root/.agents/skills/skill-creator/scripts/init_skill.py +300 -0
  47. package/templates/admin-root/.agents/skills/skill-creator/scripts/package_skill.py +110 -0
  48. package/templates/admin-root/.agents/skills/skill-creator/scripts/quick_validate.py +97 -0
  49. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/SKILL.md +163 -0
  50. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/acceptance-checklist.md +75 -0
  51. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/evidence-order.md +109 -0
  52. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prd-rules.md +103 -0
  53. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/references/prototype-rules.md +85 -0
  54. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/scripts/verify-prototypes.mjs +144 -0
  55. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/admin-page.html +771 -0
  56. package/templates/admin-root/.agents/skills/skyroc-admin-prd-prototype/templates/prd.md +182 -0
  57. package/templates/admin-root/.agents/skills/ui-ux-pro-max/SKILL.md +292 -0
  58. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/charts.csv +26 -0
  59. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/colors.csv +97 -0
  60. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/icons.csv +101 -0
  61. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/landing.csv +31 -0
  62. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/products.csv +97 -0
  63. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  64. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  65. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  66. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  67. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  68. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  69. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  70. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  71. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  72. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  73. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  74. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  75. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  76. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  77. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/styles.csv +68 -0
  78. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/typography.csv +58 -0
  79. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  80. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  81. package/templates/admin-root/.agents/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
  82. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/core.py +253 -0
  83. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
  84. package/templates/admin-root/.agents/skills/ui-ux-pro-max/scripts/search.py +114 -0
  85. package/templates/admin-root/.agents/skills/uniwind/SKILL.md +64 -0
  86. package/templates/admin-root/.agents/skills/uniwind/references/component-bindings.md +338 -0
  87. package/templates/admin-root/.agents/skills/uniwind/references/css-and-utilities.md +325 -0
  88. package/templates/admin-root/.agents/skills/uniwind/references/integrations.md +75 -0
  89. package/templates/admin-root/.agents/skills/uniwind/references/pro.md +354 -0
  90. package/templates/admin-root/.agents/skills/uniwind/references/setup.md +144 -0
  91. package/templates/admin-root/.agents/skills/uniwind/references/styling-patterns.md +237 -0
  92. package/templates/admin-root/.agents/skills/uniwind/references/theming.md +309 -0
  93. package/templates/admin-root/.agents/skills/uniwind/references/troubleshooting.md +179 -0
  94. package/templates/admin-root/.agents/skills/uniwind/references/variants-and-selectors.md +224 -0
  95. package/templates/admin-root/.agents/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  96. package/templates/admin-root/.agents/skills/vercel-react-best-practices/SKILL.md +136 -0
  97. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  98. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  99. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  100. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  101. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  102. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  103. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  104. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  105. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  106. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  107. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  108. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  109. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  110. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  111. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  112. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  113. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  114. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  115. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  116. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  117. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  118. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  119. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  120. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  121. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  122. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  123. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  124. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  125. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  126. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  127. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  128. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  129. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  130. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  131. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  132. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  133. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  134. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  135. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  136. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  137. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  138. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  139. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  140. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  141. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  142. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  143. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  144. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  145. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  146. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  147. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  148. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  149. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  150. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  151. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  152. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  153. package/templates/admin-root/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  154. package/templates/admin-root/.claude/settings.json +5 -0
  155. package/templates/admin-root/.claude/skills/component-doc/SKILL.md +304 -0
  156. package/templates/admin-root/.claude/skills/component-refactoring/SKILL.md +483 -0
  157. package/templates/admin-root/.claude/skills/component-refactoring/references/complexity-patterns.md +493 -0
  158. package/templates/admin-root/.claude/skills/component-refactoring/references/component-splitting.md +477 -0
  159. package/templates/admin-root/.claude/skills/component-refactoring/references/hook-extraction.md +317 -0
  160. package/templates/admin-root/.claude/skills/doc-coauthoring/SKILL.md +375 -0
  161. package/templates/admin-root/.claude/skills/feature-dev/SKILL.md +78 -0
  162. package/templates/admin-root/.claude/skills/frontend-code-review/SKILL.md +73 -0
  163. package/templates/admin-root/.claude/skills/frontend-code-review/references/business-logic.md +15 -0
  164. package/templates/admin-root/.claude/skills/frontend-code-review/references/code-quality.md +44 -0
  165. package/templates/admin-root/.claude/skills/frontend-code-review/references/performance.md +45 -0
  166. package/templates/admin-root/.claude/skills/frontend-design/LICENSE.txt +177 -0
  167. package/templates/admin-root/.claude/skills/frontend-design/SKILL.md +42 -0
  168. package/templates/admin-root/.claude/skills/frontend-testing/SKILL.md +325 -0
  169. package/templates/admin-root/.claude/skills/frontend-testing/assets/component-test.template.tsx +293 -0
  170. package/templates/admin-root/.claude/skills/frontend-testing/assets/hook-test.template.ts +207 -0
  171. package/templates/admin-root/.claude/skills/frontend-testing/assets/utility-test.template.ts +154 -0
  172. package/templates/admin-root/.claude/skills/frontend-testing/references/async-testing.md +345 -0
  173. package/templates/admin-root/.claude/skills/frontend-testing/references/checklist.md +205 -0
  174. package/templates/admin-root/.claude/skills/frontend-testing/references/common-patterns.md +449 -0
  175. package/templates/admin-root/.claude/skills/frontend-testing/references/domain-components.md +523 -0
  176. package/templates/admin-root/.claude/skills/frontend-testing/references/mocking.md +512 -0
  177. package/templates/admin-root/.claude/skills/frontend-testing/references/workflow.md +269 -0
  178. package/templates/admin-root/.claude/skills/migrate-nativewind-to-uniwind +1 -0
  179. package/templates/admin-root/.claude/skills/native-component-doc/SKILL.md +245 -0
  180. package/templates/admin-root/.claude/skills/senior-frontend/SKILL.md +209 -0
  181. package/templates/admin-root/.claude/skills/senior-frontend/references/frontend_best_practices.md +103 -0
  182. package/templates/admin-root/.claude/skills/senior-frontend/references/nextjs_optimization_guide.md +103 -0
  183. package/templates/admin-root/.claude/skills/senior-frontend/references/react_patterns.md +103 -0
  184. package/templates/admin-root/.claude/skills/senior-frontend/scripts/bundle_analyzer.py +114 -0
  185. package/templates/admin-root/.claude/skills/senior-frontend/scripts/component_generator.py +114 -0
  186. package/templates/admin-root/.claude/skills/senior-frontend/scripts/frontend_scaffolder.py +114 -0
  187. package/templates/admin-root/.claude/skills/skill-creator/SKILL.md +355 -0
  188. package/templates/admin-root/.claude/skills/skill-creator/references/output-patterns.md +86 -0
  189. package/templates/admin-root/.claude/skills/skill-creator/references/workflows.md +28 -0
  190. package/templates/admin-root/.claude/skills/skill-creator/scripts/init_skill.py +300 -0
  191. package/templates/admin-root/.claude/skills/skill-creator/scripts/package_skill.py +110 -0
  192. package/templates/admin-root/.claude/skills/skill-creator/scripts/quick_validate.py +97 -0
  193. package/templates/admin-root/.claude/skills/ui-ux-pro-max/SKILL.md +386 -0
  194. package/templates/admin-root/.claude/skills/ui-ux-pro-max/data +1 -0
  195. package/templates/admin-root/.claude/skills/ui-ux-pro-max/scripts +1 -0
  196. package/templates/admin-root/.claude/skills/uniwind +1 -0
  197. package/templates/admin-root/.claude/skills/vercel-react-best-practices/AGENTS.md +2934 -0
  198. package/templates/admin-root/.claude/skills/vercel-react-best-practices/SKILL.md +136 -0
  199. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  200. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
  201. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
  202. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
  203. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
  204. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
  205. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
  206. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
  207. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
  208. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
  209. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
  210. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  211. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
  212. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
  213. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
  214. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
  215. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
  216. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
  217. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
  218. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
  219. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
  220. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
  221. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
  222. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
  223. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
  224. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
  225. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
  226. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
  227. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
  228. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
  229. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  230. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
  231. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
  232. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  233. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  234. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  235. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
  236. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  237. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
  238. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
  239. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  240. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
  241. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
  242. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  243. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  244. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
  245. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  246. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  247. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
  248. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  249. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
  250. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
  251. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
  252. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
  253. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
  254. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
  255. package/templates/admin-root/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
  256. package/templates/admin-root/.cursor/settings.json +10 -0
  257. package/templates/admin-root/.editorconfig +19 -0
  258. package/templates/admin-root/.gitattributes +16 -0
  259. package/templates/admin-root/.oxfmtrc.json +35 -0
  260. package/templates/admin-root/AGENTS.md +297 -0
  261. package/templates/admin-root/CLAUDE.md +1 -0
  262. package/templates/admin-root/skills-lock.json +27 -0
  263. package/templates/admin-root.manifest.json +1317 -0
  264. package/templates/admin.meta.json +9 -4
  265. package/LICENSE +0 -21
@@ -0,0 +1,771 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN" data-theme="light">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <meta name="color-scheme" content="light dark" />
7
+ <title>Skyroc Admin - 页面原型骨架</title>
8
+ <style>
9
+ :root {
10
+ color-scheme: light;
11
+ --primary: #6366f1;
12
+ --primary-hover: #514fda;
13
+ --primary-soft: #e5eaff;
14
+ --page: #f7f7f7;
15
+ --surface: #ffffff;
16
+ --surface-raised: #ffffff;
17
+ --sidebar: #171922;
18
+ --sidebar-hover: #242733;
19
+ --text: #353535;
20
+ --text-secondary: #656565;
21
+ --text-tertiary: #919191;
22
+ --border: #f0f0f0;
23
+ --border-strong: #c6c6c8;
24
+ --hover: #f5f5f5;
25
+ --success: #10b981;
26
+ --warning: #f59e0b;
27
+ --danger: #f43f5e;
28
+ --mask: rgb(0 0 0 / 45%);
29
+ --shadow: 0 16px 44px rgb(26 30 48 / 11%);
30
+ }
31
+
32
+ :root[data-theme="dark"] {
33
+ color-scheme: dark;
34
+ --primary: #7c7fff;
35
+ --primary-hover: #9496ff;
36
+ --primary-soft: #292b50;
37
+ --page: #121212;
38
+ --surface: #1c1c1c;
39
+ --surface-raised: #252525;
40
+ --sidebar: #0d0f14;
41
+ --sidebar-hover: #1d2029;
42
+ --text: #e0e0e0;
43
+ --text-secondary: #b2b5bf;
44
+ --text-tertiary: #7f8491;
45
+ --border: #30333b;
46
+ --border-strong: #4a4d57;
47
+ --hover: #24272e;
48
+ --mask: rgb(0 0 0 / 62%);
49
+ --shadow: 0 18px 50px rgb(0 0 0 / 36%);
50
+ }
51
+
52
+ * {
53
+ box-sizing: border-box;
54
+ }
55
+
56
+ html,
57
+ body {
58
+ min-width: 320px;
59
+ min-height: 100%;
60
+ margin: 0;
61
+ background: var(--page);
62
+ color: var(--text);
63
+ font-family:
64
+ -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial,
65
+ "Noto Sans", "PingFang SC", "Microsoft YaHei", sans-serif;
66
+ font-size: 14px;
67
+ }
68
+
69
+ button,
70
+ input,
71
+ select,
72
+ textarea {
73
+ font: inherit;
74
+ }
75
+
76
+ button {
77
+ color: inherit;
78
+ }
79
+
80
+ button:focus-visible,
81
+ input:focus-visible,
82
+ select:focus-visible,
83
+ textarea:focus-visible,
84
+ a:focus-visible {
85
+ outline: 2px solid var(--primary);
86
+ outline-offset: 2px;
87
+ }
88
+
89
+ .app {
90
+ min-height: 100vh;
91
+ display: grid;
92
+ grid-template-columns: 224px minmax(0, 1fr);
93
+ }
94
+
95
+ .sidebar {
96
+ position: sticky;
97
+ top: 0;
98
+ height: 100vh;
99
+ padding: 18px 12px;
100
+ overflow-y: auto;
101
+ background: var(--sidebar);
102
+ color: #f4f5f8;
103
+ }
104
+
105
+ .brand {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: 10px;
109
+ height: 42px;
110
+ padding: 0 8px;
111
+ margin-bottom: 22px;
112
+ font-size: 17px;
113
+ font-weight: 650;
114
+ }
115
+
116
+ .brand-mark {
117
+ width: 30px;
118
+ height: 30px;
119
+ display: grid;
120
+ place-items: center;
121
+ border-radius: 9px;
122
+ background: linear-gradient(145deg, #777aff, #4b4fe0);
123
+ box-shadow: 0 7px 18px rgb(58 62 211 / 35%);
124
+ font-size: 13px;
125
+ font-weight: 800;
126
+ }
127
+
128
+ .nav-label {
129
+ padding: 0 10px 8px;
130
+ color: #9296a5;
131
+ font-size: 12px;
132
+ }
133
+
134
+ .nav-item {
135
+ width: 100%;
136
+ min-height: 42px;
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 10px;
140
+ padding: 0 12px;
141
+ border: 0;
142
+ border-radius: 8px;
143
+ background: transparent;
144
+ color: #c9cbd4;
145
+ cursor: pointer;
146
+ text-align: left;
147
+ }
148
+
149
+ .nav-item:hover {
150
+ background: var(--sidebar-hover);
151
+ }
152
+
153
+ .nav-item.active {
154
+ background: rgb(99 102 241 / 22%);
155
+ color: #ffffff;
156
+ }
157
+
158
+ .workspace {
159
+ min-width: 0;
160
+ }
161
+
162
+ .topbar {
163
+ height: 58px;
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: space-between;
167
+ padding: 0 22px;
168
+ border-bottom: 1px solid var(--border);
169
+ background: var(--surface);
170
+ }
171
+
172
+ .topbar-actions,
173
+ .inline-actions {
174
+ display: flex;
175
+ align-items: center;
176
+ gap: 8px;
177
+ }
178
+
179
+ .tabs {
180
+ height: 38px;
181
+ display: flex;
182
+ align-items: end;
183
+ gap: 4px;
184
+ padding: 0 18px;
185
+ overflow-x: auto;
186
+ border-bottom: 1px solid var(--border);
187
+ background: var(--surface);
188
+ }
189
+
190
+ .tab {
191
+ height: 32px;
192
+ display: flex;
193
+ align-items: center;
194
+ padding: 0 12px;
195
+ border: 1px solid var(--border);
196
+ border-bottom: 0;
197
+ border-radius: 7px 7px 0 0;
198
+ color: var(--text-secondary);
199
+ white-space: nowrap;
200
+ }
201
+
202
+ .tab.active {
203
+ color: var(--primary);
204
+ background: var(--page);
205
+ }
206
+
207
+ .page {
208
+ width: min(100%, 1600px);
209
+ padding: 22px;
210
+ margin: 0 auto;
211
+ }
212
+
213
+ .page-header {
214
+ display: flex;
215
+ align-items: start;
216
+ justify-content: space-between;
217
+ gap: 20px;
218
+ margin-bottom: 18px;
219
+ }
220
+
221
+ h1,
222
+ h2,
223
+ p {
224
+ margin: 0;
225
+ }
226
+
227
+ h1 {
228
+ margin-bottom: 5px;
229
+ font-size: 24px;
230
+ line-height: 1.35;
231
+ }
232
+
233
+ h2 {
234
+ font-size: 16px;
235
+ }
236
+
237
+ .muted {
238
+ color: var(--text-secondary);
239
+ }
240
+
241
+ .card {
242
+ border: 1px solid var(--border);
243
+ border-radius: 10px;
244
+ background: var(--surface);
245
+ box-shadow: 0 1px 2px rgb(22 24 35 / 3%);
246
+ }
247
+
248
+ .filters {
249
+ display: grid;
250
+ grid-template-columns: repeat(3, minmax(160px, 1fr)) auto;
251
+ gap: 12px;
252
+ padding: 16px;
253
+ margin-bottom: 14px;
254
+ }
255
+
256
+ .field {
257
+ display: grid;
258
+ gap: 6px;
259
+ }
260
+
261
+ .field label {
262
+ color: var(--text-secondary);
263
+ font-size: 12px;
264
+ font-weight: 600;
265
+ }
266
+
267
+ .control {
268
+ width: 100%;
269
+ height: 36px;
270
+ padding: 0 11px;
271
+ border: 1px solid var(--border-strong);
272
+ border-radius: 7px;
273
+ background: var(--surface);
274
+ color: var(--text);
275
+ }
276
+
277
+ .button {
278
+ min-height: 36px;
279
+ display: inline-flex;
280
+ align-items: center;
281
+ justify-content: center;
282
+ gap: 7px;
283
+ padding: 0 13px;
284
+ border: 1px solid var(--border-strong);
285
+ border-radius: 7px;
286
+ background: var(--surface);
287
+ cursor: pointer;
288
+ white-space: nowrap;
289
+ }
290
+
291
+ .button:hover {
292
+ background: var(--hover);
293
+ }
294
+
295
+ .button.primary {
296
+ border-color: var(--primary);
297
+ background: var(--primary);
298
+ color: #ffffff;
299
+ }
300
+
301
+ .button.primary:hover {
302
+ background: var(--primary-hover);
303
+ }
304
+
305
+ .button.danger {
306
+ border-color: var(--danger);
307
+ color: var(--danger);
308
+ }
309
+
310
+ .filter-actions {
311
+ align-self: end;
312
+ }
313
+
314
+ .table-card {
315
+ overflow: hidden;
316
+ }
317
+
318
+ .card-toolbar {
319
+ min-height: 58px;
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: space-between;
323
+ gap: 12px;
324
+ padding: 12px 16px;
325
+ border-bottom: 1px solid var(--border);
326
+ }
327
+
328
+ .table-scroll {
329
+ overflow-x: auto;
330
+ }
331
+
332
+ table {
333
+ width: 100%;
334
+ min-width: 820px;
335
+ border-collapse: collapse;
336
+ }
337
+
338
+ th,
339
+ td {
340
+ padding: 12px 16px;
341
+ border-bottom: 1px solid var(--border);
342
+ text-align: left;
343
+ white-space: nowrap;
344
+ }
345
+
346
+ th {
347
+ background: color-mix(in srgb, var(--surface) 92%, var(--page));
348
+ color: var(--text-secondary);
349
+ font-size: 12px;
350
+ font-weight: 650;
351
+ }
352
+
353
+ tbody tr:hover {
354
+ background: var(--hover);
355
+ }
356
+
357
+ .tag {
358
+ display: inline-flex;
359
+ align-items: center;
360
+ gap: 6px;
361
+ min-height: 24px;
362
+ padding: 0 8px;
363
+ border-radius: 999px;
364
+ background: color-mix(in srgb, var(--success) 12%, transparent);
365
+ color: var(--success);
366
+ font-size: 12px;
367
+ }
368
+
369
+ .dot {
370
+ width: 6px;
371
+ height: 6px;
372
+ border-radius: 50%;
373
+ background: currentColor;
374
+ }
375
+
376
+ .pagination {
377
+ display: flex;
378
+ align-items: center;
379
+ justify-content: flex-end;
380
+ gap: 8px;
381
+ padding: 14px 16px;
382
+ color: var(--text-secondary);
383
+ }
384
+
385
+ .mask {
386
+ position: fixed;
387
+ inset: 0;
388
+ z-index: 50;
389
+ display: none;
390
+ background: var(--mask);
391
+ }
392
+
393
+ .mask.open {
394
+ display: block;
395
+ }
396
+
397
+ .drawer {
398
+ width: min(560px, 100%);
399
+ height: 100%;
400
+ display: grid;
401
+ grid-template-rows: auto 1fr auto;
402
+ margin-left: auto;
403
+ background: var(--surface-raised);
404
+ box-shadow: var(--shadow);
405
+ }
406
+
407
+ .drawer-header,
408
+ .drawer-footer {
409
+ display: flex;
410
+ align-items: center;
411
+ justify-content: space-between;
412
+ gap: 12px;
413
+ padding: 16px 20px;
414
+ border-bottom: 1px solid var(--border);
415
+ }
416
+
417
+ .drawer-footer {
418
+ justify-content: flex-end;
419
+ border-top: 1px solid var(--border);
420
+ border-bottom: 0;
421
+ }
422
+
423
+ .drawer-body {
424
+ padding: 20px;
425
+ overflow-y: auto;
426
+ }
427
+
428
+ .drawer-form {
429
+ display: grid;
430
+ gap: 16px;
431
+ }
432
+
433
+ .icon-button {
434
+ width: 36px;
435
+ height: 36px;
436
+ display: grid;
437
+ place-items: center;
438
+ border: 1px solid var(--border);
439
+ border-radius: 7px;
440
+ background: var(--surface);
441
+ cursor: pointer;
442
+ }
443
+
444
+ .toast {
445
+ position: fixed;
446
+ right: 22px;
447
+ bottom: 22px;
448
+ z-index: 80;
449
+ display: none;
450
+ align-items: center;
451
+ gap: 8px;
452
+ max-width: min(380px, calc(100vw - 32px));
453
+ padding: 12px 15px;
454
+ border: 1px solid var(--border);
455
+ border-radius: 9px;
456
+ background: var(--surface-raised);
457
+ box-shadow: var(--shadow);
458
+ }
459
+
460
+ .toast.open {
461
+ display: flex;
462
+ }
463
+
464
+ @media (max-width: 1100px) {
465
+ .app {
466
+ grid-template-columns: 72px minmax(0, 1fr);
467
+ }
468
+
469
+ .brand-name,
470
+ .nav-label,
471
+ .nav-text {
472
+ display: none;
473
+ }
474
+
475
+ .brand,
476
+ .nav-item {
477
+ justify-content: center;
478
+ }
479
+
480
+ .filters {
481
+ grid-template-columns: repeat(2, minmax(160px, 1fr));
482
+ }
483
+ }
484
+
485
+ @media (max-width: 680px) {
486
+ .app {
487
+ display: block;
488
+ }
489
+
490
+ .sidebar {
491
+ display: none;
492
+ }
493
+
494
+ .topbar {
495
+ height: 52px;
496
+ padding: 0 14px;
497
+ }
498
+
499
+ .tabs {
500
+ padding: 0 12px;
501
+ }
502
+
503
+ .page {
504
+ padding: 14px;
505
+ }
506
+
507
+ .page-header,
508
+ .card-toolbar {
509
+ align-items: stretch;
510
+ flex-direction: column;
511
+ }
512
+
513
+ .filters {
514
+ grid-template-columns: 1fr;
515
+ }
516
+
517
+ .filter-actions,
518
+ .inline-actions {
519
+ width: 100%;
520
+ flex-wrap: wrap;
521
+ }
522
+
523
+ .filter-actions .button,
524
+ .page-header > .button {
525
+ flex: 1;
526
+ }
527
+
528
+ .drawer {
529
+ width: 100%;
530
+ }
531
+
532
+ .toast {
533
+ right: 16px;
534
+ bottom: 16px;
535
+ left: 16px;
536
+ }
537
+ }
538
+
539
+ @media (prefers-reduced-motion: reduce) {
540
+ *,
541
+ *::before,
542
+ *::after {
543
+ scroll-behavior: auto !important;
544
+ animation-duration: 0.01ms !important;
545
+ animation-iteration-count: 1 !important;
546
+ transition-duration: 0.01ms !important;
547
+ }
548
+ }
549
+ </style>
550
+ </head>
551
+ <body>
552
+ <!-- 这是页面骨架。使用时必须替换演示文案、字段、数据和导航。 -->
553
+ <div class="app">
554
+ <aside class="sidebar" aria-label="主导航">
555
+ <div class="brand">
556
+ <span class="brand-mark">S</span><span class="brand-name">Skyroc Admin</span>
557
+ </div>
558
+ <div class="nav-label">当前模块</div>
559
+ <button class="nav-item active" type="button" aria-current="page">
560
+ <span aria-hidden="true">◆</span><span class="nav-text">页面名称</span>
561
+ </button>
562
+ </aside>
563
+
564
+ <div class="workspace">
565
+ <header class="topbar">
566
+ <strong>系统管理</strong>
567
+ <div class="topbar-actions">
568
+ <button class="icon-button" id="themeButton" type="button" aria-label="切换明暗主题">
569
+
570
+ </button>
571
+ <span class="muted">管理员</span>
572
+ </div>
573
+ </header>
574
+
575
+ <nav class="tabs" aria-label="已打开页面">
576
+ <span class="tab">首页</span>
577
+ <span class="tab active" aria-current="page">页面名称</span>
578
+ </nav>
579
+
580
+ <main class="page">
581
+ <header class="page-header">
582
+ <div>
583
+ <h1>页面名称</h1>
584
+ <p class="muted">一句话说明这个页面帮助用户完成什么任务。</p>
585
+ </div>
586
+ <button class="button primary" id="openDrawer" type="button">新增记录</button>
587
+ </header>
588
+
589
+ <section class="card filters" aria-label="查询条件">
590
+ <div class="field">
591
+ <label for="keyword">关键词</label>
592
+ <input class="control" id="keyword" placeholder="请输入关键词" />
593
+ </div>
594
+ <div class="field">
595
+ <label for="status">状态</label>
596
+ <select class="control" id="status">
597
+ <option>全部</option>
598
+ <option>正常</option>
599
+ <option>停用</option>
600
+ </select>
601
+ </div>
602
+ <div class="field">
603
+ <label for="createdAt">创建时间</label>
604
+ <input class="control" id="createdAt" type="date" />
605
+ </div>
606
+ <div class="inline-actions filter-actions">
607
+ <button class="button primary" id="searchButton" type="button">查询</button>
608
+ <button class="button" id="resetButton" type="button">重置</button>
609
+ </div>
610
+ </section>
611
+
612
+ <section class="card table-card">
613
+ <header class="card-toolbar">
614
+ <div>
615
+ <strong>记录列表</strong> <span class="muted" id="resultSummary">共 2 条</span>
616
+ </div>
617
+ <div class="inline-actions">
618
+ <button class="button danger" type="button">批量删除</button>
619
+ <button class="button" id="refreshButton" type="button">刷新</button>
620
+ </div>
621
+ </header>
622
+ <div class="table-scroll">
623
+ <table aria-label="记录列表">
624
+ <thead>
625
+ <tr>
626
+ <th><input type="checkbox" aria-label="选择当前页记录" /></th>
627
+ <th>名称</th>
628
+ <th>状态</th>
629
+ <th>更新时间</th>
630
+ <th>操作</th>
631
+ </tr>
632
+ </thead>
633
+ <tbody>
634
+ <tr>
635
+ <td><input type="checkbox" aria-label="选择示例记录一" /></td>
636
+ <td>示例记录一</td>
637
+ <td>
638
+ <span class="tag"><span class="dot"></span>正常</span>
639
+ </td>
640
+ <td>2026-08-11 10:30</td>
641
+ <td>
642
+ <div class="inline-actions">
643
+ <button class="button editButton" type="button">编辑</button>
644
+ <button class="button" type="button">详情</button>
645
+ </div>
646
+ </td>
647
+ </tr>
648
+ <tr>
649
+ <td><input type="checkbox" aria-label="选择示例记录二" /></td>
650
+ <td>示例记录二</td>
651
+ <td>
652
+ <span class="tag"><span class="dot"></span>正常</span>
653
+ </td>
654
+ <td>2026-08-10 16:20</td>
655
+ <td>
656
+ <div class="inline-actions">
657
+ <button class="button editButton" type="button">编辑</button>
658
+ <button class="button" type="button">详情</button>
659
+ </div>
660
+ </td>
661
+ </tr>
662
+ </tbody>
663
+ </table>
664
+ </div>
665
+ <footer class="pagination">
666
+ <span>共 2 条</span><button class="button" type="button">1</button>
667
+ </footer>
668
+ </section>
669
+ </main>
670
+ </div>
671
+ </div>
672
+
673
+ <div class="mask" id="drawerMask">
674
+ <aside class="drawer" role="dialog" aria-modal="true" aria-labelledby="drawerTitle">
675
+ <header class="drawer-header">
676
+ <div>
677
+ <h2 id="drawerTitle">新增记录</h2>
678
+ <p class="muted">原型不会提交真实数据</p>
679
+ </div>
680
+ <button class="icon-button closeDrawer" type="button" aria-label="关闭">×</button>
681
+ </header>
682
+ <div class="drawer-body">
683
+ <form class="drawer-form" id="recordForm">
684
+ <div class="field">
685
+ <label for="recordName">名称</label>
686
+ <input class="control" id="recordName" required />
687
+ </div>
688
+ <div class="field">
689
+ <label for="recordRemark">备注</label>
690
+ <textarea class="control" id="recordRemark" rows="4"></textarea>
691
+ </div>
692
+ </form>
693
+ </div>
694
+ <footer class="drawer-footer">
695
+ <button class="button closeDrawer" type="button">取消</button>
696
+ <button class="button primary" type="submit" form="recordForm">保存</button>
697
+ </footer>
698
+ </aside>
699
+ </div>
700
+
701
+ <div class="toast" id="toast" role="status" aria-live="polite">演示操作已完成</div>
702
+
703
+ <script>
704
+ const root = document.documentElement;
705
+ const drawerMask = document.querySelector("#drawerMask");
706
+ const drawerTitle = document.querySelector("#drawerTitle");
707
+ const recordForm = document.querySelector("#recordForm");
708
+ const recordName = document.querySelector("#recordName");
709
+ const toast = document.querySelector("#toast");
710
+ let toastTimer;
711
+
712
+ function openDrawer(mode) {
713
+ drawerTitle.textContent = mode === "edit" ? "编辑记录" : "新增记录";
714
+ recordName.value = mode === "edit" ? "示例记录一" : "";
715
+ drawerMask.classList.add("open");
716
+ window.setTimeout(() => recordName.focus(), 0);
717
+ }
718
+
719
+ function closeDrawer() {
720
+ drawerMask.classList.remove("open");
721
+ }
722
+
723
+ function showToast(message) {
724
+ toast.textContent = message;
725
+ toast.classList.add("open");
726
+ window.clearTimeout(toastTimer);
727
+ toastTimer = window.setTimeout(() => toast.classList.remove("open"), 2200);
728
+ }
729
+
730
+ document.querySelector("#themeButton").addEventListener("click", () => {
731
+ root.dataset.theme = root.dataset.theme === "dark" ? "light" : "dark";
732
+ });
733
+
734
+ document.querySelector("#openDrawer").addEventListener("click", () => openDrawer("create"));
735
+ document.querySelectorAll(".editButton").forEach((button) => {
736
+ button.addEventListener("click", () => openDrawer("edit"));
737
+ });
738
+ document
739
+ .querySelectorAll(".closeDrawer")
740
+ .forEach((button) => button.addEventListener("click", closeDrawer));
741
+
742
+ drawerMask.addEventListener("click", (event) => {
743
+ if (event.target === drawerMask) closeDrawer();
744
+ });
745
+
746
+ document.addEventListener("keydown", (event) => {
747
+ if (event.key === "Escape" && drawerMask.classList.contains("open")) closeDrawer();
748
+ });
749
+
750
+ recordForm.addEventListener("submit", (event) => {
751
+ event.preventDefault();
752
+ if (!recordForm.reportValidity()) return;
753
+ closeDrawer();
754
+ showToast("演示保存成功,未提交真实数据");
755
+ });
756
+
757
+ document
758
+ .querySelector("#searchButton")
759
+ .addEventListener("click", () => showToast("已按当前条件更新演示结果"));
760
+ document.querySelector("#resetButton").addEventListener("click", () => {
761
+ document.querySelector("#keyword").value = "";
762
+ document.querySelector("#status").selectedIndex = 0;
763
+ document.querySelector("#createdAt").value = "";
764
+ showToast("已重置查询条件");
765
+ });
766
+ document
767
+ .querySelector("#refreshButton")
768
+ .addEventListener("click", () => showToast("演示数据已刷新"));
769
+ </script>
770
+ </body>
771
+ </html>