@h-ai/cli 0.1.0-alpha9 → 1.0.0-beta.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 (438) hide show
  1. package/README.en.md +229 -0
  2. package/README.ja.md +229 -0
  3. package/README.md +175 -113
  4. package/dist/chunk-AKV2CQZV.js +1497 -0
  5. package/dist/chunk-AKV2CQZV.js.map +1 -0
  6. package/dist/chunk-EF7WOFWZ.js +7557 -0
  7. package/dist/chunk-EF7WOFWZ.js.map +1 -0
  8. package/dist/chunk-MUHRBJSW.js +29272 -0
  9. package/dist/chunk-MUHRBJSW.js.map +1 -0
  10. package/dist/chunk-ZSDEVXZ7.js +38 -0
  11. package/dist/{chunk-2H7UOFLK.js.map → chunk-ZSDEVXZ7.js.map} +1 -1
  12. package/dist/cli-config-templates-HHFHNXBN.js +5 -0
  13. package/dist/cli-config-templates-HHFHNXBN.js.map +1 -0
  14. package/dist/cli-skill-templates-PN4FLGBC.js +5 -0
  15. package/dist/cli-skill-templates-PN4FLGBC.js.map +1 -0
  16. package/dist/index.js +4444 -554
  17. package/dist/index.js.map +1 -1
  18. package/dist/metafile-esm.json +1 -0
  19. package/dist/src-TEBHR5I5.js +5 -0
  20. package/dist/src-TEBHR5I5.js.map +1 -0
  21. package/package.json +35 -15
  22. package/templates/README.md +56 -114
  23. package/templates/apps/admin/messages/en-US.json +7 -0
  24. package/templates/apps/admin/messages/ja-JP.json +40 -0
  25. package/templates/apps/admin/messages/zh-CN.json +7 -0
  26. package/templates/apps/admin/src/routes/+layout.svelte.hbs +65 -8
  27. package/templates/apps/admin/src/routes/+page.svelte.hbs +35 -14
  28. package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +54 -22
  29. package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +33 -24
  30. package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +16 -13
  31. package/templates/apps/api/.dockerignore.hbs +25 -0
  32. package/templates/apps/api/.gitignore.hbs +22 -0
  33. package/templates/apps/api/.npmrc.hbs +1 -0
  34. package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +39 -0
  35. package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +41 -0
  36. package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
  37. package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +28 -0
  38. package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +5 -0
  39. package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +16 -0
  40. package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
  41. package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
  42. package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
  43. package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
  44. package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +60 -0
  45. package/templates/apps/api/apps/{{projectName}}-serv/config/_core.yml.hbs +17 -0
  46. package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +54 -0
  47. package/templates/apps/api/apps/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
  48. package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +66 -0
  49. package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +119 -0
  50. package/templates/apps/api/apps/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
  51. package/templates/apps/api/apps/{{projectName}}-serv/src/index.ts.hbs +41 -0
  52. package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +165 -0
  53. package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +57 -0
  54. package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/index.ts.hbs +41 -0
  55. package/templates/apps/api/apps/{{projectName}}-serv/tests/service.test.ts.hbs +176 -0
  56. package/templates/apps/api/apps/{{projectName}}-serv/tsconfig.json.hbs +16 -0
  57. package/templates/apps/api/apps/{{projectName}}-serv/tsup.config.ts.hbs +20 -0
  58. package/templates/apps/api/apps/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
  59. package/templates/apps/api/e2e/api-serv.spec.ts.hbs +113 -0
  60. package/templates/apps/api/e2e/capture-evidence.ts.hbs +23 -0
  61. package/templates/apps/api/eslint.config.js.hbs +30 -0
  62. package/templates/apps/api/hai.json.hbs +4 -0
  63. package/templates/apps/api/images/serv.Dockerfile.hbs +37 -0
  64. package/templates/apps/api/package.json.hbs +53 -0
  65. package/templates/apps/api/playwright.config.ts.hbs +67 -0
  66. package/templates/apps/api/pnpm-workspace.yaml.hbs +40 -0
  67. package/templates/apps/api/tsconfig.base.json +14 -0
  68. package/templates/apps/fullstack/.dockerignore.hbs +25 -0
  69. package/templates/apps/fullstack/.gitignore.hbs +38 -0
  70. package/templates/apps/fullstack/.npmrc.hbs +1 -0
  71. package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
  72. package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +67 -0
  73. package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +20 -0
  74. package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +20 -0
  75. package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +22 -0
  76. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +7 -0
  77. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/ja-JP.json.hbs +7 -0
  78. package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +7 -0
  79. package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +86 -0
  80. package/templates/apps/fullstack/apps/{{projectName}}-app/project.inlang/settings.json.hbs +17 -0
  81. package/templates/apps/fullstack/apps/{{projectName}}-app/public/runtime-config.js.hbs +4 -0
  82. package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +59 -0
  83. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +20 -0
  84. package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +8 -0
  85. package/templates/apps/fullstack/apps/{{projectName}}-app/src/build-metadata.ts.hbs +9 -0
  86. package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +19 -0
  87. package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +21 -0
  88. package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +16 -0
  89. package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +23 -0
  90. package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +74 -0
  91. package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
  92. package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +64 -0
  93. package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +20 -0
  94. package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +20 -0
  95. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +7 -0
  96. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/ja-JP.json.hbs +7 -0
  97. package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +7 -0
  98. package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +66 -0
  99. package/templates/apps/fullstack/apps/{{projectName}}-desktop/project.inlang/settings.json.hbs +17 -0
  100. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +25 -0
  101. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.css.hbs +18 -0
  102. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +8 -0
  103. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/build-metadata.ts.hbs +9 -0
  104. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +20 -0
  105. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +33 -0
  106. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
  107. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +16 -0
  108. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
  109. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
  110. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
  111. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
  112. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
  113. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +91 -0
  114. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
  115. package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +46 -0
  116. package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +14 -0
  117. package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +22 -0
  118. package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +89 -0
  119. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +25 -0
  120. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/en-US.json.hbs +12 -0
  121. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/ja-JP.json.hbs +12 -0
  122. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/zh-CN.json.hbs +12 -0
  123. package/templates/apps/fullstack/apps/{{projectName}}-miniapp/project.inlang/settings.json.hbs +17 -0
  124. package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +54 -0
  125. package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +20 -0
  126. package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +21 -0
  127. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +7 -0
  128. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/ja-JP.json.hbs +7 -0
  129. package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +7 -0
  130. package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +53 -0
  131. package/templates/apps/fullstack/apps/{{projectName}}-web/project.inlang/settings.json.hbs +17 -0
  132. package/templates/apps/fullstack/apps/{{projectName}}-web/public/runtime-config.js.hbs +1 -0
  133. package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +18 -0
  134. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.css.hbs +18 -0
  135. package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +8 -0
  136. package/templates/apps/fullstack/apps/{{projectName}}-web/src/build-metadata.ts.hbs +9 -0
  137. package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
  138. package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +16 -0
  139. package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +23 -0
  140. package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +76 -0
  141. package/templates/apps/fullstack/docs/security-configuration.md.hbs +349 -0
  142. package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +988 -0
  143. package/templates/apps/fullstack/e2e/session-close.spec.ts.hbs +119 -0
  144. package/templates/apps/fullstack/eslint.config.js.hbs +41 -0
  145. package/templates/apps/fullstack/hai.json.hbs +11 -0
  146. package/templates/apps/fullstack/images/serv.Dockerfile.hbs +38 -0
  147. package/templates/apps/fullstack/images/web/19-runtime-config.envsh.hbs +5 -0
  148. package/templates/apps/fullstack/images/web/nginx.conf.hbs +24 -0
  149. package/templates/apps/fullstack/images/web/runtime-config.js.template.hbs +3 -0
  150. package/templates/apps/fullstack/images/web.Dockerfile.hbs +37 -0
  151. package/templates/apps/fullstack/package.json.hbs +61 -0
  152. package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +40 -0
  153. package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +30 -0
  154. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +78 -0
  155. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +134 -0
  156. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-contract.ts.hbs +20 -0
  157. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +35 -0
  158. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +7 -0
  159. package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +23 -0
  160. package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +31 -0
  161. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsconfig.json.hbs +9 -0
  162. package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +9 -0
  163. package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +84 -0
  164. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_ai.yml.hbs +1 -0
  165. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +1 -0
  166. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +1 -0
  167. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +22 -0
  168. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +1 -0
  169. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_feedback.yml.hbs +1 -0
  170. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +1 -0
  171. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_payment.yml.hbs +1 -0
  172. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +60 -0
  173. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_scheduler.yml.hbs +1 -0
  174. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +64 -0
  175. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +1 -0
  176. package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_vecdb.yml.hbs +1 -0
  177. package/templates/apps/fullstack/packages/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
  178. package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +62 -0
  179. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +115 -0
  180. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
  181. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +40 -0
  182. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +294 -0
  183. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/audit-jobs.ts.hbs +28 -0
  184. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/business-settings.ts.hbs +50 -0
  185. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +50 -0
  186. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +106 -0
  187. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +49 -0
  188. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +34 -0
  189. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +159 -0
  190. package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/security-roles.ts.hbs +73 -0
  191. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +505 -0
  192. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +72 -0
  193. package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +183 -0
  194. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsconfig.json.hbs +10 -0
  195. package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +18 -0
  196. package/templates/apps/fullstack/packages/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
  197. package/templates/apps/fullstack/packages/{{projectName}}-shared/.gitignore.hbs +10 -0
  198. package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +97 -0
  199. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +164 -0
  200. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +164 -0
  201. package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +164 -0
  202. package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +55 -0
  203. package/templates/apps/fullstack/packages/{{projectName}}-shared/project.inlang/settings.json.hbs +11 -0
  204. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +7 -0
  205. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +94 -0
  206. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/feedback-client.ts.hbs +36 -0
  207. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/sensitive-actions.svelte.ts.hbs +16 -0
  208. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/session-recovery.svelte.ts.hbs +4 -0
  209. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +122 -0
  210. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +90 -0
  211. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/FeedbackEntry.svelte.hbs +86 -0
  212. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +94 -0
  213. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/configuration.svelte.hbs +25 -0
  214. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/feedback.svelte.hbs +157 -0
  215. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/roles.svelte.hbs +77 -0
  216. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +44 -0
  217. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +216 -0
  218. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/security/role-label.ts.hbs +12 -0
  219. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/guide-store.ts.hbs +55 -0
  220. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +614 -0
  221. package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +23 -0
  222. package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
  223. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +150 -0
  224. package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +253 -0
  225. package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +17 -0
  226. package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
  227. package/templates/apps/fullstack/playwright.config.ts.hbs +114 -0
  228. package/templates/apps/fullstack/playwright.session-close.config.ts.hbs +18 -0
  229. package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +38 -0
  230. package/templates/apps/fullstack/tsconfig.base.json +14 -0
  231. package/templates/apps/h5/messages/en-US.json +3 -0
  232. package/templates/apps/h5/messages/ja-JP.json +40 -0
  233. package/templates/apps/h5/messages/zh-CN.json +3 -0
  234. package/templates/apps/h5/src/routes/+layout.svelte.hbs +85 -30
  235. package/templates/apps/h5/src/routes/+page.svelte.hbs +20 -8
  236. package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +17 -6
  237. package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +17 -6
  238. package/templates/apps/mobile-app/.env.hbs +3 -0
  239. package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
  240. package/templates/apps/mobile-app/index.html.hbs +14 -0
  241. package/templates/apps/mobile-app/messages/en-US.json +36 -0
  242. package/templates/apps/mobile-app/messages/ja-JP.json +36 -0
  243. package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
  244. package/templates/apps/mobile-app/public/runtime-config.js +1 -0
  245. package/templates/apps/mobile-app/src/App.svelte.hbs +153 -0
  246. package/templates/apps/mobile-app/src/lib/api.ts.hbs +213 -0
  247. package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +14 -0
  248. package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +6 -7
  249. package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +58 -0
  250. package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -0
  251. package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +16 -0
  252. package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
  253. package/templates/apps/website/messages/en-US.json +4 -2
  254. package/templates/apps/website/messages/ja-JP.json +34 -0
  255. package/templates/apps/website/messages/zh-CN.json +4 -2
  256. package/templates/apps/website/scripts/static-website.mjs.hbs +67 -0
  257. package/templates/apps/website/src/routes/+layout.svelte.hbs +77 -26
  258. package/templates/apps/website/src/routes/+layout.ts +3 -0
  259. package/templates/apps/website/src/routes/+page.svelte.hbs +31 -12
  260. package/templates/apps/website/src/routes/about/+page.svelte.hbs +11 -6
  261. package/templates/apps/website/src/routes/api/health/+server.ts +3 -0
  262. package/templates/apps/website/src/routes/contact/+page.svelte.hbs +44 -34
  263. package/templates/apps/website/src/routes/services/+page.svelte.hbs +27 -40
  264. package/templates/base/.dockerignore.hbs +27 -0
  265. package/templates/base/.gitignore.hbs +41 -0
  266. package/templates/base/.npmrc.hbs +1 -0
  267. package/templates/base/e2e/app.spec.ts.hbs +213 -0
  268. package/templates/base/e2e/helpers.ts +1 -1
  269. package/templates/base/eslint-rules.js +45 -0
  270. package/templates/base/eslint.config.js.hbs +34 -0
  271. package/templates/base/hai.json.hbs +4 -0
  272. package/templates/base/images/web/nginx.conf.hbs +24 -0
  273. package/templates/base/images/web.Dockerfile.hbs +72 -0
  274. package/templates/base/package.json.hbs +125 -49
  275. package/templates/base/playwright.config.ts +44 -6
  276. package/templates/base/pnpm-workspace.yaml.hbs +40 -0
  277. package/templates/base/src/app.css.hbs +40 -0
  278. package/templates/base/src/app.d.ts.hbs +14 -1
  279. package/templates/base/src/app.html.hbs +13 -0
  280. package/templates/base/src/hooks.server.ts.hbs +115 -43
  281. package/templates/base/src/lib/build-metadata.ts.hbs +7 -0
  282. package/templates/base/src/lib/server/init.ts.hbs +125 -152
  283. package/templates/base/src/lib/server/kit-config.ts.hbs +40 -0
  284. package/templates/base/src/routes/+layout.server.ts.hbs +35 -0
  285. package/templates/base/static/favicon.png +0 -0
  286. package/templates/base/svelte.config.js.hbs +84 -5
  287. package/templates/base/tests/scaffold.test.ts.hbs +102 -0
  288. package/templates/base/tsconfig.json.hbs +50 -0
  289. package/templates/base/vite.config.ts.hbs +117 -12
  290. package/templates/base/vitest.config.ts.hbs +19 -0
  291. package/templates/features/ai/routes/api/chat/+server.ts +6 -7
  292. package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +3 -17
  293. package/templates/features/iam/routes-admin/(auth)/auth/forgot-password/+page.svelte.hbs +10 -0
  294. package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +9 -96
  295. package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +9 -122
  296. package/templates/features/iam/routes-admin/(auth)/auth/reset-password/+page.svelte.hbs +10 -0
  297. package/templates/features/iam/routes-h5/auth/forgot-password/+page.svelte.hbs +10 -0
  298. package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +9 -96
  299. package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +9 -112
  300. package/templates/features/iam/routes-h5/auth/reset-password/+page.svelte.hbs +10 -0
  301. package/templates/features/iam/routes-shared/api/auth/captcha/+server.ts.hbs +4 -0
  302. package/templates/features/iam/routes-shared/api/auth/config/+server.ts +4 -0
  303. package/templates/features/iam/routes-shared/api/auth/login/+server.ts +1 -29
  304. package/templates/features/iam/routes-shared/api/auth/login/ldap/+server.ts +4 -0
  305. package/templates/features/iam/routes-shared/api/auth/login/otp/+server.ts +4 -0
  306. package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +13 -6
  307. package/templates/features/iam/routes-shared/api/auth/otp/send/+server.ts +4 -0
  308. package/templates/features/iam/routes-shared/api/auth/password/renew/+server.ts +5 -0
  309. package/templates/features/iam/routes-shared/api/auth/password-reset/confirm/+server.ts +4 -0
  310. package/templates/features/iam/routes-shared/api/auth/password-reset/request/+server.ts +4 -0
  311. package/templates/features/iam/routes-shared/api/auth/reauthenticate/+server.ts +5 -0
  312. package/templates/features/iam/routes-shared/api/auth/register/+server.ts +1 -23
  313. package/templates/features/iam/routes-shared/api/auth/session/close/+server.ts.hbs +4 -0
  314. package/templates/features/iam/routes-website/auth/forgot-password/+page.svelte.hbs +10 -0
  315. package/templates/features/iam/routes-website/auth/login/+page.svelte.hbs +11 -0
  316. package/templates/features/iam/routes-website/auth/register/+page.svelte.hbs +11 -0
  317. package/templates/features/iam/routes-website/auth/reset-password/+page.svelte.hbs +10 -0
  318. package/templates/features/payment/routes/api/v1/payment/create/+server.ts +25 -23
  319. package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +5 -2
  320. package/templates/features/storage/routes/api/upload/+server.ts +10 -8
  321. package/templates/i18n/project.inlang/settings.json +2 -2
  322. package/templates/shared/.gitattributes +11 -0
  323. package/templates/shared/build-metadata.ts +42 -0
  324. package/templates/shared/container-runtime-config.sh +30 -0
  325. package/templates/shared/e2e-env.ts +98 -0
  326. package/templates/shared/hash-router.svelte.ts +83 -0
  327. package/templates/shared/public-base-path.mjs +19 -0
  328. package/templates/shared/run-e2e.mjs +104 -0
  329. package/templates/shared/vite-runtime-config.ts +56 -0
  330. package/templates/skills/AGENTS.md +75 -16
  331. package/templates/skills/CLAUDE.md +0 -11
  332. package/templates/skills/bridges/admin/AGENTS.md +89 -0
  333. package/templates/skills/bridges/api/AGENTS.md +83 -0
  334. package/templates/skills/bridges/fullstack/AGENTS.md.hbs +102 -0
  335. package/templates/skills/bridges/h5/AGENTS.md +88 -0
  336. package/templates/skills/bridges/mobile-app/AGENTS.md +100 -0
  337. package/templates/skills/bridges/website/AGENTS.md +88 -0
  338. package/templates/skills/copilot-instructions.md +3 -59
  339. package/templates/skills/hai-ai/SKILL.md +44 -715
  340. package/templates/skills/hai-ai/guide.md +457 -0
  341. package/templates/skills/hai-ai/reference.md +292 -0
  342. package/templates/skills/hai-api-client/SKILL.md +26 -339
  343. package/templates/skills/hai-api-client/reference.md +180 -0
  344. package/templates/skills/hai-api-contract/SKILL.md +36 -0
  345. package/templates/skills/hai-api-contract/reference.md +280 -0
  346. package/templates/skills/hai-app-create/SKILL.md +38 -351
  347. package/templates/skills/hai-app-create/collaboration.md +52 -0
  348. package/templates/skills/hai-app-create/development.md +243 -0
  349. package/templates/skills/hai-app-create/reference.md +376 -0
  350. package/templates/skills/hai-app-review/SKILL.md +57 -126
  351. package/templates/skills/hai-app-review/differential.md +34 -0
  352. package/templates/skills/hai-app-tests/SKILL.md +34 -454
  353. package/templates/skills/hai-app-tests/reference.md +462 -0
  354. package/templates/skills/hai-app-tests/validation.md +42 -0
  355. package/templates/skills/hai-audit/SKILL.md +37 -122
  356. package/templates/skills/hai-audit/reference.md +184 -0
  357. package/templates/skills/hai-build/SKILL.md +62 -315
  358. package/templates/skills/hai-build/paths.md +30 -0
  359. package/templates/skills/hai-build/reference.md +353 -0
  360. package/templates/skills/hai-cache/SKILL.md +26 -175
  361. package/templates/skills/hai-cache/reference.md +229 -0
  362. package/templates/skills/hai-capacitor/SKILL.md +24 -364
  363. package/templates/skills/hai-capacitor/reference.md +358 -0
  364. package/templates/skills/hai-change-plan/SKILL.md +46 -0
  365. package/templates/skills/hai-ci/SKILL.md +114 -0
  366. package/templates/skills/hai-core/SKILL.md +31 -469
  367. package/templates/skills/hai-core/reference.md +557 -0
  368. package/templates/skills/hai-core/request-access.md +65 -0
  369. package/templates/skills/hai-crypto/SKILL.md +29 -180
  370. package/templates/skills/hai-crypto/reference.md +317 -0
  371. package/templates/skills/hai-datapipe/SKILL.md +24 -207
  372. package/templates/skills/hai-datapipe/reference.md +204 -0
  373. package/templates/skills/hai-deploy/SKILL.md +53 -178
  374. package/templates/skills/hai-deploy/credentials.md +19 -0
  375. package/templates/skills/hai-deploy/middleware.md +129 -0
  376. package/templates/skills/hai-feedback/SKILL.md +85 -0
  377. package/templates/skills/hai-framework-sync/SKILL.md +105 -0
  378. package/templates/skills/hai-framework-sync/sync.md +49 -0
  379. package/templates/skills/hai-iam/SKILL.md +53 -325
  380. package/templates/skills/hai-iam/reference.md +535 -0
  381. package/templates/skills/hai-kit/SKILL.md +33 -329
  382. package/templates/skills/hai-kit/reference.md +202 -0
  383. package/templates/skills/hai-payment/SKILL.md +28 -262
  384. package/templates/skills/hai-payment/reference.md +295 -0
  385. package/templates/skills/hai-pr-review/SKILL.md +41 -0
  386. package/templates/skills/hai-reach/SKILL.md +28 -300
  387. package/templates/skills/hai-reach/reference.md +363 -0
  388. package/templates/skills/hai-reldb/SKILL.md +28 -449
  389. package/templates/skills/hai-reldb/reference.md +500 -0
  390. package/templates/skills/hai-scheduler/SKILL.md +26 -174
  391. package/templates/skills/hai-scheduler/reference.md +216 -0
  392. package/templates/skills/hai-serv/SKILL.md +60 -0
  393. package/templates/skills/hai-serv/reference.md +792 -0
  394. package/templates/skills/hai-spec-implement/SKILL.md +50 -0
  395. package/templates/skills/hai-spec-implement/changes.md +67 -0
  396. package/templates/skills/hai-spec-implement/evaluation.md +18 -0
  397. package/templates/skills/hai-spec-implement/handoff.md +47 -0
  398. package/templates/skills/hai-spec-implement/templates.md +117 -0
  399. package/templates/skills/hai-spec-implement/workflow.md +56 -0
  400. package/templates/skills/hai-spec-review/SKILL.md +57 -0
  401. package/templates/skills/hai-spec-review/checklist.md +71 -0
  402. package/templates/skills/hai-storage/SKILL.md +31 -262
  403. package/templates/skills/hai-storage/reference.md +284 -0
  404. package/templates/skills/hai-ui/SKILL.md +62 -238
  405. package/templates/skills/hai-ui/guide.md +81 -0
  406. package/templates/skills/hai-ui/reference.md +705 -0
  407. package/templates/skills/hai-ui-design/SKILL.md +31 -0
  408. package/templates/skills/hai-ui-design/patterns.md +31 -0
  409. package/templates/skills/hai-ui-review/SKILL.md +32 -0
  410. package/templates/skills/hai-ui-review/checklist.md +29 -0
  411. package/templates/skills/hai-vecdb/SKILL.md +25 -267
  412. package/templates/skills/hai-vecdb/reference.md +325 -0
  413. package/templates/skills/opencode.json +0 -5
  414. package/dist/chunk-2H7UOFLK.js +0 -10
  415. package/dist/chunk-LANIDJC7.js +0 -659
  416. package/dist/chunk-LANIDJC7.js.map +0 -1
  417. package/dist/chunk-YV7WPUI6.js +0 -206
  418. package/dist/chunk-YV7WPUI6.js.map +0 -1
  419. package/dist/config-templates-S5RI2MC6.js +0 -5
  420. package/dist/config-templates-S5RI2MC6.js.map +0 -1
  421. package/dist/skill-templates-N5DU5FNX.js +0 -5
  422. package/dist/skill-templates-N5DU5FNX.js.map +0 -1
  423. package/dist/src-XJ6YXNAF.js +0 -15030
  424. package/dist/src-XJ6YXNAF.js.map +0 -1
  425. package/templates/apps/android-app/.env.hbs +0 -3
  426. package/templates/apps/android-app/messages/en-US.json +0 -24
  427. package/templates/apps/android-app/messages/zh-CN.json +0 -24
  428. package/templates/apps/android-app/src/lib/api.ts.hbs +0 -30
  429. package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -42
  430. package/templates/apps/android-app/src/routes/+layout.ts +0 -7
  431. package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -27
  432. package/templates/apps/api/src/routes/+layout.svelte +0 -14
  433. package/templates/apps/api/src/routes/+page.svelte +0 -11
  434. package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
  435. package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
  436. package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
  437. package/templates/base/src/app.css +0 -2
  438. package/templates/base/tsconfig.json +0 -8
@@ -0,0 +1,705 @@
1
+ # hai-ui — 详细用法
2
+
3
+ 从 [SKILL.md](SKILL.md) 选择主题后读取对应小节。代码片段展示 API 用法;省略的业务变量、schema、依赖与 return 上下文需由应用补齐。
4
+
5
+ > `@h-ai/ui` 是基于 Svelte 5 Runes 的多端 UI 组件库,采用 DaisyUI v5 + Tailwind CSS v4 + Bits UI v2,内置 15 个精选 DaisyUI 主题及 high-contrast 高对比、formal 直角商务主题、内置中英日文 i18n、自动导入。内置 Shiki 代码高亮、Mermaid 图表渲染、Design Token 系统和 7 个移动端组件。
6
+
7
+ ## 运行环境
8
+
9
+ > **面向 Svelte / SvelteKit 界面层。** 组件可用于 SvelteKit 的 SSR + CSR 页面,也可用于纯客户端 SPA / 原生壳 App;不要在纯 Node 服务模块里直接引用 UI 组件。
10
+
11
+ ## 适用场景
12
+
13
+ - 构建管理后台页面(表单、表格、弹窗、导航等)
14
+ - 移动端/App 界面开发(SafeArea、BottomNav、PullRefresh 等)
15
+ - 使用 Bits UI headless 交互组件(Combobox、DatePicker、Calendar)
16
+ - 使用 IAM 场景组件(登录/注册/密码/权限守卫/用户资料表单)
17
+ - 使用 Storage 场景组件(文件上传/图片上传/头像上传/文件列表)
18
+ - 使用 CRUD 场景组件(列表过滤、详情/编辑面板、删除确认)
19
+ - 使用反馈收集、图片标注、分页管理与诊断详情;持久化闭环见 [hai-feedback](../hai-feedback/SKILL.md)
20
+ - 渲染 AI 输出(Markdown / Mermaid 文档、代码产物预览)
21
+ - 配置主题切换与 i18n 多语言
22
+ - 多端平台检测与适配
23
+
24
+ ## 使用边界
25
+
26
+ - 加密输入变更会清空密文,乱序/清空/卸载后的旧结果不会回填;失败显示错误。提交前确认当前密文非空,不缓存上次密文。
27
+
28
+ - `EncryptedInput` 的 `onencrypt` 必须接入真实加密服务;`algorithm` 仅标注算法。缺少回调时显示不可用,不生成密文,不允许用编码代替加密。
29
+
30
+ - **优先复用 `@h-ai/ui` 现有组件**,不要在 app 中重复实现同类按钮、表格、表单、弹层或场景页面。
31
+ - **页面级文案与业务逻辑放在应用层**;`@h-ai/ui` 负责展示与交互,不承接业务服务、数据库访问或页面级 i18n 管理。
32
+ - **场景组件自带内置中英日文文案**(如 IAM / CRUD / AI / Storage 场景),除非组件显式提供覆盖 prop,否则不要把页面翻译样板再传进去。
33
+ - **自动导入不是全能魔法**:`toast`、类型导入和 `Range` 仍需显式 `import`;其它公开 Svelte 组件可交给 `autoImportHaiUi()`。
34
+ - **移动端组件不是样式糖**:使用 `SafeArea` / `BottomNav` / `PullRefresh` / `ActionSheet` 时,务必同步引入 `design-tokens.css` 与 `mobile.css`。
35
+
36
+ ## AI 使用顺序(先判断,再落地)
37
+
38
+ ### 1. 先确认项目集成是否完整
39
+
40
+ 至少检查以下四项:
41
+
42
+ - `svelte.config.*`:`autoImportHaiUi()` 在 `vitePreprocess()` 前。
43
+ - `vite.config.*`:`ssr.noExternal` 包含 `@h-ai/ui` 和 `@h-ai/kit`,`optimizeDeps.exclude` 包含 `bits-ui`。
44
+ - `app.css`:已导入 `global.css` / `theme.css`;移动端还要导入 `design-tokens.css` / `mobile.css`。
45
+ - Tailwind:已配置 `@source` 扫描 `@h-ai/ui/dist/**/*.{svelte,js,ts}`。
46
+
47
+ 如果这四项不完整,优先先补集成,再写页面;否则组件很容易出现“能编译但没样式 / SSR 报错 / 自动导入失效”。
48
+
49
+ ### 2. 再选组件层级
50
+
51
+ 按复杂度从低到高选:
52
+
53
+ - **primitives**:单个交互单元,例如 `Button`、`Input`、`Select`、`Badge`。
54
+ - **compounds**:通用业务骨架,例如 `Form`、`Modal`、`Drawer`、`DataTable`、`Pagination`。
55
+ - **scenes**:完整业务流,例如 `LoginForm`、`FileUpload`、`CrudPage`、`AiDocumentEditor`。
56
+ 经验法则:
57
+
58
+ - 只是做一个输入控件或按钮行 → 先看 primitives。
59
+ - 需要通用弹层/表格/分页/表单布局 → 先看 compounds。
60
+ - 已经是“登录页 / CRUD 页 / 文件上传页 / AI 文档页”这类完整场景 → 先看 scenes,**不要手搓一遍**。
61
+
62
+ ### 3. 常见任务 → 首选组件
63
+
64
+ | 任务 | 首选组件 | 使用要点 |
65
+ | --- | --- | --- |
66
+ | 后台列表页 | `WorkspaceLayout` + `CrudPage`,自定义列表用 `FilterBar` / `TableToolbar` + `DataTable` + `Pagination` | 导航标题只出现一次;紧凑留白、条件可收起并保留值,分页固定在数据区外 |
67
+ | 表单页/弹层表单 | `Form` + `FormField` + `Input/Select/...` | 表单字段布局统一交给 `FormField` |
68
+ | 简单确认/详情弹层 | `Modal` / `Drawer` / `Confirm` | 根据桌面/移动端交互选择弹窗或抽屉 |
69
+ | 完整 CRUD 页面 | `CrudPage` | 优先通过 `form` / `pagination` / `density` 配置,不要拆开重写;仅显式配置后端支持的排序列、筛选栏自带「重置」 |
70
+ | 错误页(401/403/404/500/503) | `ErrorPage` | SvelteKit `+error.svelte` 中按 `page.status` 使用,`onhome`/`onback` 接管跳转 |
71
+ | 设置页 | `SettingsLayout` | 分区导航 + 内容区;`sections` + `active` + `onselect`,内容放入 children |
72
+ | 登录/注册页布局 | `AuthShell` + `LoginForm` / `RegisterForm` | `variant='card'` 或 `'split'`;split 可通过 `illustration`/`description`/`highlights` 放大图与重点说明 |
73
+ | 登录/注册/资料页 | `LoginForm` / `RegisterForm` / `UserProfile` | 页面只负责路由和提交逻辑 |
74
+ | 文件/图片上传 | `FileUpload` / `ImageUpload` / `AvatarUpload` | 上传 URL、限制和业务状态由应用层提供 |
75
+ | 移动端页面骨架 | `SafeArea` + `AppBar` + `BottomNav` | 原生壳页面优先这一套 |
76
+ | AI 文档/Markdown 展示 | `MarkdownRenderer` / `AiDocumentEditor` | Mermaid、代码高亮、复制/下载已内置 |
77
+
78
+ ### 4. 最后再决定是否自定义样式
79
+
80
+ - 优先通过组件已有 props(`variant` / `size` / `outline` / `class` / snippet slot)调整。
81
+ - 需要统一视觉规范时,优先改 `theme.css` / `design-tokens.css` 对应 token,而不是在页面里散落 magic class。
82
+ - 只有当 `@h-ai/ui` 现有抽象确实不覆盖时,才在应用层补专属组件。
83
+
84
+ ## 项目配置(从 npm 安装)
85
+
86
+ > 以下示例面向通过 `npm install @h-ai/ui` 引用发布包的项目。monorepo 内部使用 `workspace:*` 时路径略有不同。
87
+
88
+ ### 1. 安装依赖
89
+
90
+ ```bash
91
+ # 核心包
92
+ npm install @h-ai/ui @h-ai/core
93
+
94
+ # 必须的对等依赖与构建工具
95
+ npm install -D svelte @sveltejs/kit @sveltejs/vite-plugin-svelte
96
+ npm install -D tailwindcss @tailwindcss/vite daisyui
97
+
98
+ # 图标(可选但推荐)
99
+ npm install -D @iconify/tailwind4 @iconify-json/tabler
100
+ ```
101
+
102
+ Node adapter 使用 Crypto、Kit 或 IAM 时,还需将 `sm-crypto@0.5.7` 作为直接生产依赖安装,保留 Node 原生模块解析。
103
+
104
+ ### 2. svelte.config.js
105
+
106
+ ```js
107
+ import { autoImportHaiUi } from '@h-ai/ui/auto-import'
108
+ import adapter from '@sveltejs/adapter-node'
109
+ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'
110
+
111
+ /** @type {import('@sveltejs/kit').Config} */
112
+ const config = {
113
+ // autoImportHaiUi 必须在 vitePreprocess 之前
114
+ preprocess: [autoImportHaiUi(), vitePreprocess()],
115
+ compilerOptions: {
116
+ runes: true, // 强制 Svelte 5 Runes 模式
117
+ },
118
+ kit: {
119
+ adapter: adapter(),
120
+ alias: {
121
+ $components: './src/lib/components',
122
+ $stores: './src/lib/stores',
123
+ },
124
+ },
125
+ }
126
+
127
+ export default config
128
+ ```
129
+
130
+ ### 3. vite.config.ts
131
+
132
+ ```ts
133
+ import { sveltekit } from '@sveltejs/kit/vite'
134
+ import tailwindcss from '@tailwindcss/vite'
135
+ import { defineConfig } from 'vite'
136
+
137
+ export default defineConfig({
138
+ plugins: [
139
+ sveltekit(),
140
+ tailwindcss(),
141
+ ],
142
+ optimizeDeps: {
143
+ // bits-ui 使用 Svelte 虚拟模块,需排除预构建
144
+ exclude: ['bits-ui'],
145
+ },
146
+ ssr: {
147
+ // @h-ai 包为 ESM + Svelte 组件,需 Vite 在 SSR 时处理
148
+ noExternal: ['@h-ai/ui', '@h-ai/kit'],
149
+ external: ['@h-ai/core', 'sm-crypto'],
150
+ },
151
+ })
152
+ ```
153
+
154
+ ### 4. src/app.css
155
+
156
+ ```css
157
+ /* ─── Tailwind CSS v4 ─── */
158
+ @import 'tailwindcss';
159
+
160
+ /* ─── @h-ai/ui 共享样式 ─── */
161
+ @import '@h-ai/ui/styles/global.css'; /* 基础重置、滚动条、焦点样式 */
162
+ @import '@h-ai/ui/styles/theme.css'; /* Tailwind v4 @theme Token(品牌色/阴影/动效) */
163
+
164
+ /* ─── 移动端项目追加(可选) ─── */
165
+ @import '@h-ai/ui/styles/design-tokens.css'; /* CSS 自定义属性:间距/圆角/z-index */
166
+ @import '@h-ai/ui/styles/mobile.css'; /* 安全区域/触摸优化/键盘适配 */
167
+
168
+ /* ─── 扫描 @h-ai/ui 组件中使用的 Tailwind 类名 ─── */
169
+ @source "../node_modules/@h-ai/ui/dist/**/*.{svelte,js,ts}";
170
+ @source "../../../node_modules/@h-ai/ui/dist/**/*.{svelte,js,ts}";
171
+
172
+ /* ─── DaisyUI 主题 ─── */
173
+ @plugin "daisyui" {
174
+ themes:
175
+ light --default,
176
+ dark --prefersdark,
177
+ cupcake,
178
+ emerald,
179
+ corporate,
180
+ nord,
181
+ dracula,
182
+ night,
183
+ dim,
184
+ business,
185
+ sunset;
186
+ }
187
+
188
+ /* ─── 图标(可选) ─── */
189
+ @plugin "@iconify/tailwind4" {
190
+ prefixes: tabler;
191
+ }
192
+ ```
193
+
194
+ > **关键**:`@source` 行让 TailwindCSS 扫描 `@h-ai/ui` 组件中使用的 class 名,否则组件样式会丢失。路径指向 npm 安装目录下的 `dist/`。
195
+
196
+ ### 5. app.html 防闪烁脚本
197
+
198
+ ```html
199
+ <!doctype html>
200
+ <html lang="%lang%">
201
+ <head>
202
+ <meta charset="utf-8" />
203
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
204
+ <script>
205
+ // 防止主题切换闪烁:在 DOM 渲染前应用已保存的主题
206
+ (function(){var t='light';try{var s=localStorage.getItem('theme');if(s)t=s}catch{}document.documentElement.setAttribute('data-theme',t)})()
207
+ </script>
208
+ %sveltekit.head%
209
+ </head>
210
+ <body data-sveltekit-preload-data="hover">
211
+ <div style="display: contents">%sveltekit.body%</div>
212
+ </body>
213
+ </html>
214
+ ```
215
+
216
+ ### 6. 平台检测
217
+
218
+ ```typescript
219
+ import { detectPlatform, isMobile, isNativeApp, usePlatform } from '@h-ai/ui'
220
+
221
+ // 一次性检测
222
+ const platform = detectPlatform() // 'ios' | 'android' | 'web'
223
+ const mobile = isMobile() // boolean
224
+ const native = isNativeApp() // boolean(Capacitor 环境)
225
+
226
+ // Svelte 5 响应式(组件中使用)
227
+ const p = usePlatform()
228
+ // p.platform / p.isMobile / p.isNative
229
+ ```
230
+
231
+ ## 三层组件架构
232
+
233
+ ### 原子组件(Primitives,20 个)
234
+
235
+ | 组件 | Props 要点 | 说明 |
236
+ | ------------ | ------------------------------------------------------------- | -------- |
237
+ | `Button` | `variant`, `size`, `loading`, `disabled`, `outline`, `circle` | 按钮 |
238
+ | `IconButton` | `icon: trusted SVG string \| Snippet`, `tooltip`, `variant`, `size` | 图标按钮 |
239
+ | `Input` | `value`, `type`, `size`, `error`, `placeholder` | 输入框 |
240
+ | `Textarea` | `value`, `rows`, `autoResize`, `error` | 文本域 |
241
+ | `Select` | `value`, `options: SelectOption[]`, `placeholder` | 下拉选择 |
242
+ | `Checkbox` | `checked`, `label`, `indeterminate` | 复选框 |
243
+ | `Switch` | `checked`, `label`, `size` | 开关 |
244
+ | `Radio` | `value`, `options`, `direction` | 单选组 |
245
+ | `Range` | `value`, `min`, `max`, `step`, `variant`, `size` | 滑块 |
246
+ | `Rating` | `value`, `max` | 评分 |
247
+ | `Badge` | `variant`, `size`, `outline` | 徽标 |
248
+ | `Avatar` | `src`, `name`, `size`, `shape` | 头像 |
249
+ | `Tag` | `text`, `variant`, `closable` | 标签 |
250
+ | `Spinner` | `size`, `variant` | 加载动画 |
251
+ | `Progress` | `value`, `max`, `striped`, `animated` | 进度条 |
252
+
253
+ ### 组合组件(Compounds,36 个)
254
+
255
+ 由原子组件 + Bits UI headless 交互组合。
256
+
257
+ #### 桌面端组合组件
258
+
259
+ | 组件 | Props 要点 | 说明 |
260
+ | ------------ | ------------------------------------------------------------------ | ------------- |
261
+ | `Form` | `columns`, `labelPosition`, `labelWidth`, `loading`, `disabled`, `onsubmit` | 表单容器 |
262
+ | `FormField` | `label`, `for`, `colSpan`, `labelPosition`, `error`, `hint`, `required` | 表单字段 |
263
+ | `Modal` | `open`, `title`, `size`, `closeOnBackdrop` | 模态框,内置对话框语义、焦点约束和关闭后焦点恢复 |
264
+ | `Drawer` | `open`, `position`, `size`, `width`, `resizable`, `widthStorageKey` | 可选拖动并记忆宽度的抽屉 |
265
+ | `DataTable` | `data`, `columns`, `keyField`, `sortKey`, `sortDir`, `onsort`, snippet slots | 数据表格(列定义 `sortable` 可排序) |
266
+ | `Combobox` | `options`, `value`, `multiple`, `placeholder`, `error`, `onchange` | 可搜索选择 |
267
+ | `Calendar` | `value`, `minValue`, `maxValue` | 独立日历 |
268
+ | `DatePicker` | `value`, `minValue`, `maxValue`, `error` | 日期输入+弹出 |
269
+ | `Tabs` | `items: TabItem[]`, `active`, `type` | 标签页 |
270
+ | `Pagination` | `page`, `total`, `pageSize`, `showTotal`, `showJumper`, `showSizeChanger`, `showPageInfo`, `showFirstLast`, `onchange` | 分页(统一为 shadcn table 风格) |
271
+ | `Dropdown` | `items: DropdownItem[]`, `trigger` | 下拉菜单 |
272
+ | `Accordion` | `items: AccordionItem[]` | 折叠面板 |
273
+ | `Skeleton` | `variant`, `count`, `animation` | 骨架屏 |
274
+ | `Empty` | `title`, `description`, `icon` | 空状态 |
275
+
276
+ #### 移动端组合组件(7 个)
277
+
278
+ | 组件 | Props 要点 | 说明 |
279
+ | ---------------- | ----------------------------------------------------------------------------- | ---------------- |
280
+ | `SafeArea` | `top`, `bottom`, `left`, `right` | 安全区域容器 |
281
+ | `AppBar` | `title`, `backHref`, `onback`, `fixed`, `transparent`, snippet `left`/`right` | 顶部导航栏 |
282
+ | `BottomNav` | `items: BottomNavItem[]`, `active` | 底部导航栏 |
283
+ | `ActionSheet` | `open`, `title`, `items: ActionSheetItem[]`, `cancelText`, `onselect` | 底部弹出操作面板 |
284
+ | `PullRefresh` | `refreshing`, `onrefresh`, `threshold`, `pullText`, `releaseText` | 下拉刷新 |
285
+ | `InfiniteScroll` | `loading`, `finished`, `threshold`, `onload`, `loadingText`, `finishedText` | 无限滚动加载 |
286
+ | `SwipeCell` | `leftActions`, `rightActions: SwipeCellAction[]`, `threshold` | 滑动操作单元格 |
287
+
288
+ **移动端组件用法示例**:
289
+
290
+ ```svelte
291
+ <script lang="ts">
292
+ import type { BottomNavItem } from '@h-ai/ui'
293
+
294
+ const navItems: BottomNavItem[] = [
295
+ { key: 'home', label: '首页', icon: 'tabler:home', href: '/' },
296
+ { key: 'discover', label: '发现', icon: 'tabler:compass', href: '/discover' },
297
+ { key: 'profile', label: '我的', icon: 'tabler:user', href: '/profile' },
298
+ ]
299
+ </script>
300
+
301
+ <SafeArea top bottom>
302
+ <AppBar title="首页" />
303
+ <PullRefresh bind:refreshing onrefresh={loadData}>
304
+ <main class="p-4">
305
+ <!-- 页面内容 -->
306
+ </main>
307
+ </PullRefresh>
308
+ <BottomNav items={navItems} active="home" />
309
+ </SafeArea>
310
+ ```
311
+
312
+ **ActionSheet 用法**:
313
+
314
+ ```svelte
315
+ <script lang="ts">
316
+ import type { ActionSheetItem } from '@h-ai/ui'
317
+
318
+ let showActions = $state(false)
319
+ const actions: ActionSheetItem[] = [
320
+ { key: 'camera', label: '拍照' },
321
+ { key: 'album', label: '从相册选择' },
322
+ { key: 'delete', label: '删除', destructive: true },
323
+ ]
324
+ </script>
325
+
326
+ <ActionSheet bind:open={showActions} title="选择操作" items={actions} onselect={handleAction} />
327
+ ```
328
+
329
+ **SwipeCell 用法**:
330
+
331
+ ```svelte
332
+ <script lang="ts">
333
+ import type { SwipeCellAction } from '@h-ai/ui'
334
+
335
+ const rightActions: SwipeCellAction[] = [
336
+ { key: 'edit', label: '编辑', color: '#3b82f6' },
337
+ { key: 'delete', label: '删除', color: '#ef4444' },
338
+ ]
339
+ </script>
340
+
341
+ <SwipeCell {rightActions} onaction={handleSwipeAction}>
342
+ <div class="p-4">列表项内容</div>
343
+ </SwipeCell>
344
+ ```
345
+
346
+ ### 场景组件(Scenes)
347
+
348
+ 内置中英日文翻译的业务场景组件。
349
+
350
+ #### 引导与帮助场景组件
351
+
352
+ | 组件 | Props 要点 | 说明 |
353
+ | --- | --- | --- |
354
+ | `GuideHost` | `guide`, `locale`, `scope`, `autoStart` | 首次邀请、操作导览和帮助弹窗 |
355
+ | `HelpCenter` | `articles`, `tours`, `locale`, `selectedId`, `onstart` | 可独立使用的搜索帮助中心 |
356
+
357
+ 控制器与导航、偏好和业务 i18n 契约见 [guide.md](guide.md)。
358
+
359
+ #### IAM 场景组件
360
+
361
+ | 组件 | Props 要点 | 说明 |
362
+ | -------------- | ----------------------------------------------- | -------- |
363
+ | `AuthShell` | `variant`('card'/'split'), `title`, `brandTitle`, `brandText`, `illustration`, `description`, `highlights` | 认证页布局(包裹登录/注册表单) |
364
+ | `LoginForm` | `showForgotPassword`, `showRegisterLink`, `errors` | 登录表单 |
365
+ | `RegisterForm` | `fields`, `minPasswordLength`, `errors` | 注册表单 |
366
+ | `UserProfile` | `user`, `editable`, `fields`, `avatarAccept`, `avatarHint` | 用户资料,选择器和提示对齐业务校验;最终验证和上传仍由回调负责 |
367
+
368
+ #### 错误页 / 设置场景组件
369
+
370
+ | 组件 | Props 要点 | 说明 |
371
+ | ---------------- | ------------------------------------------- | -------- |
372
+ | `ErrorPage` | `status`, `code`, `title`, `description`, `homeUrl`, `onhome`, `onback` | 通用错误页(内置 401/403/404/500/503) |
373
+ | `SettingsLayout` | `title`, `description`, `sections`, `active`, `onselect` | 设置页分区导航布局 |
374
+
375
+ #### Storage 场景组件
376
+
377
+ | 组件 | Props 要点 | 说明 |
378
+ | ------------- | ---------------------------------------------- | -------- |
379
+ | `FileUpload` | `accept`, `maxSize`, `uploadHandler`, `autoUpload` | 文件上传 |
380
+ | `ImageUpload` | `value`, `uploadHandler`, `aspectRatio` | 图片上传 |
381
+ | `AvatarUpload` | `value`, `uploadHandler`, `size`, `fallback` | 头像上传 |
382
+ | `FileList` | `files: FileItem[]`, `layout`, `showPreview` | 文件列表 |
383
+
384
+ 上传协议属于应用 service:组件通过 `uploadHandler(file, { signal, onProgress })` 注入实现,并接收 `{ url?, response? }`。不要把 presign、认证头或 PUT/POST 细节塞进 UI 组件;图片与头像 handler 必须返回安全的 `url`。未提供 handler 时组件只负责文件选择或本地预览。
385
+
386
+ #### AI 场景组件
387
+
388
+ | 组件 | 说明 |
389
+ | -------------------- | --------------------------------- |
390
+ | `MarkdownRenderer` | Markdown 渲染(内置 Shiki 高亮,支持 `fontSize` / `allowHtmlTags`) |
391
+ | `AiDocumentDownloadMenu` | AI 文档下载菜单 |
392
+ | `AiDocumentEditor` | AI 文档编辑器(支持 Mermaid、受控代码预览,以及 `fontSize` / `allowHtmlTags`) |
393
+ | `AiTableEditor` | AI 表格编辑器 |
394
+
395
+ > AI 场景组件使用 Shiki(纯 ESM)进行代码高亮,支持 27 种语言,通过 CSS 变量 `--hai-hl-*` 自定义颜色。无需额外安装 Shiki,已内置。`AiDocumentEditor` 默认只允许 Markdown 内置预览;HTML / JS / CSS 等高风险预览需要显式启用 `allowUnsafeCodePreview`,或通过 `oncoderun` 返回受控的预览结果。
396
+ >
397
+ > Mermaid 开箱即用:
398
+ > - `sourceKind='document'` 时,文档中的 ```` ```mermaid ```` 代码块会在阅读态自动渲染为图表;
399
+ > - `sourceKind='code'` + `showCodePreviewToggle` 时,可在「代码 / 预览」之间切换查看 Mermaid 图表;
400
+ > - Mermaid 以 `securityLevel: 'strict'` 渲染为消毒后的 SVG,无需开启 `allowUnsafeCodePreview`。
401
+ >
402
+ > 展示层还支持:
403
+ > - `fontSize`:支持 `number`(按 px)或 CSS 长度字符串(如 `1.125rem`)
404
+ > - `allowHtmlTags`:默认关闭;开启后按安全白名单解析 `<b>` / `<i>` / `<u>` / `<mark>` 等标签,危险标签与属性仍会被消毒
405
+ > - 原始 `<img>` 的 `width` / `height` 仅接受 1–99999 的正整数像素值;为延迟加载图片预留空间,避免文档锚点和布局跳变。百分比、负数、小数、事件属性及任意 `style` 仍被移除。
406
+
407
+ ```svelte
408
+ <MarkdownRenderer content={markdown} fontSize='1.125rem' allowHtmlTags />
409
+
410
+ <AiDocumentEditor
411
+ title="方案文档"
412
+ content={documentMarkdown}
413
+ fontSize={18}
414
+ allowHtmlTags
415
+ showToolbar
416
+ showOutline={false}
417
+ />
418
+ ```
419
+
420
+ #### Charts 图表
421
+
422
+ `Chart type='line'` 默认使用 LayerChart 原生折线图;监控看板类场景需要“分段线 + 圆点 + 最近点 hover + 竖向参考线”时,使用 `lineVariant='segmented-point'`:
423
+
424
+ ```svelte
425
+ <Chart
426
+ type='line'
427
+ data={trendData}
428
+ x='label'
429
+ y={['rateLimit', 'circuitBreak']}
430
+ series={trendSeries}
431
+ lineVariant='segmented-point'
432
+ tooltipMode='nearest'
433
+ showCrosshair
434
+ legend
435
+ grid
436
+ />
437
+ ```
438
+
439
+ #### CRUD 场景组件
440
+
441
+ | 组件 | 说明 |
442
+ | ------------------- | ---- |
443
+ | `CrudPage` | CRUD 主页面 |
444
+ | `CrudFilterBar` | 过滤工具栏 |
445
+ | `CrudDetailPanel` | 详情面板(抽屉/弹窗) |
446
+ | `CrudEditPanel` | 编辑面板(抽屉/弹窗) |
447
+ | `CrudDeleteConfirm` | 删除确认框 |
448
+
449
+ `WorkspaceLayout` 的 title 为导航标题,leading/actions/footer 为 snippet;data-* 透传 main,没有页脚时不占位。PageHeader/SettingsLayout 自动省略同名标题;CrudPage 默认跟随工作区,showHeader 可覆盖,headerActions 不因隐藏标题而丢失。FilterBar 的 leading/actions 常驻、children 默认收起,支持 bind:expanded、activeCount 和 onreset;重置须由宿主清空所有查询条件并重新查询。TableToolbar / CrudFilterBar 修改草稿不自动请求,Query 或 Enter 一次提交当前绑定搜索与全部条件;onfilterchange 仅通知草稿变化。CrudPage 与 FeedbackList 将查询栏、数据区、底部分页放入同一卡片;排序通过支持的 DataTable 列头触发,翻页/排序不提交未查询草稿。扩展筛选横向间距 20px、纵向间距 16px,标签和等高控件分别对齐;根据容器宽度切换列数,窄屏单列。
450
+
451
+ `CrudPage` 是首选入口;只有在你明确要自定义组合方式时,才直接使用 `CrudFilterBar` / `CrudDetailPanel` / `CrudEditPanel`。
452
+
453
+ ### CrudPage 配置重点
454
+
455
+ | 配置项 | 说明 |
456
+ | --- | --- |
457
+ | `form.variant` | `'drawer'`(抽屉,默认)或 `'modal'`(弹出窗口) |
458
+ | `form.drawerSize` / `form.drawerWidth` / `form.drawerResizable` | 抽屉尺寸预设 / 自定义 CSS 宽度 / 是否允许拖动并按资源记忆宽度(默认允许) |
459
+ | `form.modalSize` / `form.modalWidth` / `form.modalHeight` | 弹窗尺寸预设 / 自定义宽高 |
460
+ | `pagination.showSizeChanger` | 每页条数选择器(默认开启) |
461
+ | `pagination.pageSizeOptions` | 每页条数候选项(默认 `[10, 20, 50, 100]`) |
462
+ | `pagination.showJumper` / `pagination.showTotal` | 跳页输入 / 总数(默认开启) |
463
+ | `pagination.showPageInfo` / `pagination.showFirstLast` | 页码文案 / 首页末页按钮(默认开启;紧凑视图可关闭) |
464
+ | `density` | 列表密度:`'normal'`(默认)或 `'compact'`;仅影响列表行、行内操作、分页与创建/编辑/详情表单 |
465
+ | `showHeader` / `toolbarLeading` | 关闭默认页头并在卡片上方放置标题或说明 |
466
+ | `toolbarActions` | 工具栏业务操作 snippet |
467
+ | `card` | 卡片列表项渲染 snippet;仍复用分页和独立滚动容器 |
468
+ | `detailColumns` | 点击后打开详情抽屉的列 key,例如 `['title']` |
469
+ | `sortableColumns` | 可执行服务端排序的列;为空时使用全部列表列 |
470
+ | `loading` / `loaded` / `error` / `onRetry` / `keepPreviousData` | 受控加载态:仅 `loaded && total===0` 显示空状态;首次显示查询中;失败显示错误+重试;`keepPreviousData`(默认 true)失败保留旧数据 |
471
+
472
+ 注意:`CrudPage` 会占满父级可用高度;表格无论是否有数据都会撑满剩余空间,仅数据区滚动,表头和分页栏固定。
473
+
474
+ ### CrudPage 推荐用法
475
+
476
+ ```svelte
477
+ <CrudPage
478
+ crud={roleCrud}
479
+ {data}
480
+ permissions={{ create: true, update: true, delete: true }}
481
+ form={{ variant: 'modal', modalSize: 'lg' }}
482
+ pagination={{ showSizeChanger: true, showJumper: true, pageSizeOptions: [10, 20, 50] }}
483
+ density='compact'
484
+ detailColumns={['name']}
485
+ sortableColumns={[{ key: 'createdAt', label: '创建时间' }]}
486
+ {nav}
487
+ />
488
+ ```
489
+
490
+ 如果想维持侧边编辑体验,可改成:
491
+
492
+ ```svelte
493
+ form={{ variant: 'drawer', drawerWidth: '40rem' }}
494
+ ```
495
+
496
+ 抽屉默认可拖动左侧边缘调整宽度,并按 `crud.resource.name` 记忆;传 `drawerResizable: false` 可关闭。
497
+
498
+ ### 纯客户端控制器与惰性页签
499
+
500
+ - 无 SvelteKit SSR 时用 `defineCrud` + `createCrudController` 托管 `data` / `nav`:latest-wins(seq + AbortSignal)、失败保留旧数据、并发去重、查询串回填地址栏。`<CrudPage data={c.data} nav={c.nav} loading={c.loading} loaded={c.loaded} error={c.error} onRetry={c.reload} />`。
501
+ - `Tabs` 传 `lazy` 后未激活页签不渲染(`children` 提供 `isActivated(key)`),`onactivate(key)` 首次激活触发一次;配合 `createCrudController({ autoLoad: false })` 在页签首次可见时才 `load()`。
502
+ - Toast 默认右下角浮动,由 UI 模块统一用主题语义色区分提示、成功、警告、错误,使用浅色底、细色边及类型图标,不占布局且可关闭,FIFO 队列逐条展示并从展示时计时;根布局只挂载一次 ToastContainer。六方位通过 toast.add 的 position 指定;登录、改密、保存、删除和上传等成功或失败结果均不使用行内 Alert。
503
+ - 状态层从轻量 @h-ai/ui/toast 入口导入 toast/notify*/errorMessage/useToastFeedback,不加载组件及引导 CSS;ToastContainer 在根布局单次挂载。
504
+ - Toast 已内置 `notifySuccess` / `notifyError(err, fallback?)` / `notifyInfo` / `notifyWarning`,业务应用无需自建 toast 工具文件。
505
+ - `message` API 也使用 Toast 的队列和样式,`MessageContainer` 复用 `ToastContainer`,根布局只能选一个。响应式组件使用 `useToastFeedback`,同类型、同内容、同编号合并;更新/清空时替换/移除该来源旧通知。所有警告和错误均交给 ToastContainer,字段只保留错误标记、读屏关联与恢复操作。默认隐藏 traceId,排查图标展开后显示编号、复制和联系支持的说明;悬停、聚焦或展开时暂停计时。普通 Error 即使自带 traceId 也使用兜底文案,编号不能证明原文可公开。
506
+
507
+ ## Design Token 系统
508
+
509
+ ### theme.css — Tailwind v4 `@theme` Token
510
+
511
+ 通过 `@import '@h-ai/ui/styles/theme.css'` 导入,提供全局设计 Token:
512
+
513
+ ```css
514
+ @theme {
515
+ --color-brand: oklch(0.6 0.2 275);
516
+ --shadow-xs / --shadow-soft / --shadow-lifted / --shadow-float / --shadow-overlay
517
+ --ease-out-expo / --ease-in-out
518
+ --font-feature-tabular: 'tnum';
519
+ }
520
+ ```
521
+
522
+ 应用可在导入后追加自己的 `@theme` 块覆盖或扩展。
523
+
524
+ ### design-tokens.css — CSS 自定义属性
525
+
526
+ ```css
527
+ --hai-spacing-xs: 4px; --hai-spacing-sm: 8px;
528
+ --hai-spacing-md: 16px; --hai-spacing-lg: 24px;
529
+ --hai-radius-sm: 4px; --hai-radius-md: 8px;
530
+ --hai-touch-target-min: 44px;
531
+ --hai-safe-area-top: env(safe-area-inset-top);
532
+ --hai-z-dropdown: 1000; --hai-z-modal: 2000; --hai-z-toast: 3000;
533
+ --hai-transition-fast: 150ms ease;
534
+ --hai-transition-normal: 250ms ease;
535
+ ```
536
+
537
+ ### mobile.css 提供的全局类
538
+
539
+ | 类名 | 用途 |
540
+ | ----------------------- | ------------------------------- |
541
+ | `.hai-safe-top` | 上方安全区域 padding |
542
+ | `.hai-safe-bottom` | 下方安全区域 padding |
543
+ | `.hai-safe-all` | 四周安全区域 padding |
544
+ | `.hai-scroll-container` | 优化的滚动容器(momentum 滚动) |
545
+ | `.hai-keyboard-aware` | 虚拟键盘弹起时自动调整内容 |
546
+
547
+ ## 主题系统
548
+
549
+ 支持 15 个精选 DaisyUI 主题及 high-contrast 高对比、formal 直角商务主题。
550
+
551
+ ```typescript
552
+ import { applyTheme, getCurrentTheme, getSavedTheme, isDarkTheme, THEMES, THEME_GROUPS } from '@h-ai/ui/theme'
553
+
554
+ applyTheme('dark') // 应用主题(自动持久化 localStorage)
555
+ getCurrentTheme() // 获取当前主题名
556
+ getSavedTheme('corporate') // 存储为空或不可用时使用应用默认主题
557
+ isDarkTheme('dracula') // 检查是否暗色主题
558
+ ```
559
+
560
+ ## 代码高亮(Shiki)
561
+
562
+ AI 场景组件(`MarkdownRenderer`、`AiDocumentEditor`)内置 Shiki 代码高亮(纯 ESM,支持 Vite SSR/Client 双模式)。
563
+
564
+ ### 支持语言(27 种)
565
+
566
+ typescript, javascript, python, java, go, rust, c, cpp, csharp, ruby, php, swift, kotlin, sql, html, css, json, yaml, toml, markdown, bash, shell, powershell, dockerfile, xml, graphql, plaintext
567
+
568
+ ### 自定义高亮颜色
569
+
570
+ 通过 CSS 变量覆盖(在 `app.css` 或组件作用域内):
571
+
572
+ ```css
573
+ :root {
574
+ --hai-hl-keyword: #c586c0;
575
+ --hai-hl-string: #ce9178;
576
+ --hai-hl-comment: #6a9955;
577
+ --hai-hl-function: #dcdcaa;
578
+ --hai-hl-variable: #9cdcfe;
579
+ --hai-hl-type: #4ec9b0;
580
+ --hai-hl-number: #b5cea8;
581
+ --hai-hl-operator: #d4d4d4;
582
+ --hai-hl-punctuation: #808080;
583
+ --hai-hl-foreground: #d4d4d4;
584
+ --hai-hl-background: #1e1e1e;
585
+ }
586
+ ```
587
+
588
+ ## 配置驱动认证页面
589
+
590
+ 密码登录只接收 identifier/password;AuthPanel 将 LoginForm 的 username 映射为 identifier。会话期限来自服务端 session.maxAge/refreshTokenMaxAge,不增加未实现的登录偏好字段或持久会话选择框。
591
+
592
+ 协议支持 `agreements.userAgreementMarkdown` 与 `privacyPolicyMarkdown` 直接从配置加载;YAML 的 `|` 保留 Markdown 段落和换行。弹窗复用安全 MarkdownRenderer,关闭原始 HTML、脚本和代码复制工具。同主题同时提供正文与 URL 时优先正文,URL 可作为额外查看入口;只有 URL 时使用隔离 iframe。
593
+
594
+ ```yaml
595
+ agreements:
596
+ showOnRegister: true
597
+ showOnLogin: false
598
+ userAgreementMarkdown: |
599
+ # 用户协议
600
+
601
+ **账户使用条款**
602
+
603
+ - 请妥善保管账户凭据。
604
+ privacyPolicyMarkdown: |
605
+ # 隐私政策
606
+
607
+ 注册资料用于账户管理,会话信息用于身份认证。
608
+ # 可选 URL;同主题同时配置 Markdown 和 URL 时,弹窗优先显示 Markdown。
609
+ # userAgreementUrl: https://example.com/terms
610
+ # privacyPolicyUrl: https://example.com/privacy
611
+ ```
612
+
613
+
614
+
615
+ AuthPanel 直接接收 IAM 白名单配置和 actions,内置登录(密码/LDAP/邮件/短信)、注册、找回、重置及协议展示。使用 `config.ui` 配置卡片/分栏、标题、品牌、Logo 和配图。`LoginForm` 提供 methods、onsendotp、otpLength、resendInterval;密码表单接受 passwordPolicy。组件只渲染与交互,网络和 Token 存储通过 actions 注入。认证场景按公开 IAM 错误码显示当前 UI 语言的提示,应用自定义错误保留原文。
616
+
617
+ AuthPanel 在 SSR 阶段禁用原生表单控件,客户端挂载并绑定事件后自动开放输入,避免接管时丢失早到的输入。应用无需额外的就绪适配;E2E 等待控件可编辑,并覆盖客户端脚本延迟加载的场景。
618
+
619
+ 认证链接指向当前完整 URL 时,AuthPanel 只切换场景并阻止重复导航,返回登录后可立即输入。路径、查询串或 hash 不同时交给应用路由处理;Ctrl/Cmd 等修改键点击保留浏览器行为。不要为切换场景额外调用 goto 或 location.reload。
620
+
621
+
622
+ 协议在 Modal 内显示并保留表单输入;使用 URL 时,协议页面须允许 iframe 嵌入,组件禁用其脚本,另提供新窗口查看入口。登录/注册表单使用 `header/extraFields/footer` snippet,AuthPanel 透传 `loginHeader/loginFields/loginFooter` 和 `registerHeader/registerFields/registerFooter`,底部保留内置导航。自定义字段由应用绑定状态和提交,不会隐式写入 IAM 用户模型。
623
+
624
+ ```svelte
625
+ <!-- config 来自 IAM 公开配置,actions 来自 Kit/API client;m 为应用翻译。 -->
626
+ <AuthPanel {config} {actions}>
627
+ {#snippet loginHeader()}
628
+ <p>{m.loginHelp()}</p>
629
+ {/snippet}
630
+ {#snippet registerFields()}
631
+ <label><input type='checkbox' bind:checked={subscribe} />{m.subscribe()}</label>
632
+ {/snippet}
633
+ </AuthPanel>
634
+ ```
635
+
636
+ 上例的 subscribe 为应用自身的 $state,应用包装 register 动作校验/提交扩展业务数据;如需单独组合表单,使用 `<RegisterForm> {#snippet extraFields()}...{/snippet} </RegisterForm>`。扩展里的按钮须为 `type="button"`,避免误提交。
637
+
638
+
639
+ ## 重要约定
640
+
641
+ 1. **Svelte 5 Runes**:使用 `$state`、`$derived`、`$effect`
642
+ 2. **Snippet 插槽**:使用 `{#snippet name()}...{/snippet}` 语法
643
+ 3. **自动导入例外**:`toast`、类型导入与 `Range` 必须显式 `import`;其余公开 Svelte 组件可自动导入
644
+ 4. **Combobox 统一单选/多选**:`MultiSelect` 已删除
645
+ 5. **移动端样式**:务必引入 `design-tokens.css` + `mobile.css`,使用 SafeArea 包裹原生 App 页面
646
+ 6. **`@source` 必须配置**:未配置则 TailwindCSS 无法扫描 `@h-ai/ui` 组件中的 class,样式会丢失
647
+ 7. **响应式布局**:后台工作区和数据列表使用可用宽度,避免外壳固定 max-width 造成宽屏两侧留白。flex/grid 子项设 min-width: 0,表格在自身容器滚动;正文和登录框保留阅读宽度。至少验证 390、1440、1920、2560、3840px 的内容占宽、导航与全页溢出。
648
+ 8. **`ssr.noExternal`**:Svelte 组件及 `@h-ai/kit/client` 的 `$app/*` 路由别名需要 Vite 编译,UI 和 Kit 保持 noExternal,core 及其他纯服务端包保留原生加载;本地链接的框架包也要显式 external,避免日志、数据库等原生依赖被重复打包。sm-crypto 使用动态 CommonJS require,应放入 `ssr.external`,并以明确版本列入应用 dependencies;adapter-node 只根据直接生产依赖排除二次打包,不能仅依赖它作为框架的传递依赖。
649
+ 9. **data-* 属性透传**:公开 Svelte 组件会把调用方传入的 `data-*` 属性透传到根节点或主交互节点;测试和自动化优先直接使用 `data-testid`、`data-analytics-id`,不要为测试 ID 重复封装组件
650
+
651
+ ## 导出路径
652
+
653
+ 新手引导与帮助中心使用公开 `@h-ai/ui/guide` 入口;`createGuide` 控制器、`GuideHost` 和独立 `HelpCenter` 的接入、首次偏好和导航契约见 [guide.md](guide.md)。
654
+
655
+ | 路径 | 用途 |
656
+ | --------------------------- | -------------------------------------- |
657
+ | `@h-ai/ui` | 主入口:所有组件、工具函数、类型 |
658
+ | `@h-ai/ui/theme` | 轻量主题元数据与工具,不经过组件根入口 |
659
+ | `@h-ai/ui/i18n` | 轻量语言工具,供状态层使用,不加载组件或引导 CSS |
660
+ | `@h-ai/ui/auto-import` | Svelte 预处理器:组件自动导入 |
661
+ | `@h-ai/ui/components/primitives/index` 等明确 barrel | 仅 package.exports 列出的组件目录;组件默认导出经 barrel 转发 |
662
+ | `@h-ai/ui/components/primitives/index` | 公开原子组件目录入口,如 Button/Input |
663
+ | `@h-ai/ui/styles/global.css` | 全局基础样式(重置/滚动条/焦点) |
664
+ | `@h-ai/ui/styles/theme.css` | Tailwind v4 `@theme` Token |
665
+ | `@h-ai/ui/styles/design-tokens.css`| CSS 自定义属性(间距/圆角/z-index) |
666
+ | `@h-ai/ui/styles/mobile.css` | 移动端优化(安全区域/触摸/键盘) |
667
+
668
+ ## 相关 Skills
669
+
670
+ - `hai-kit`:SvelteKit 集成(hooks.server.ts、API 端点、认证守卫)
671
+ - `hai-iam`:IAM 模块 API(与 LoginForm/RegisterForm 配合)
672
+ - `hai-capacitor`:原生 App 开发(与 SafeArea/AppBar 配合)
673
+ - `hai-api-client`:客户端数据获取
674
+
675
+ ## 表单布局与错误提示
676
+
677
+ 数据新增/修改统一使用 `Form`(托管提交)或原生 `<form>` + `FormLayout`,不要在应用复制字段 grid。两者支持 `columns={1 | 2}`、`labelPosition='top' | 'left'`、`labelWidth`;默认单列/标签在上,窄容器自动收拢。`FormField.colSpan='auto'` 自动让多行文本、上传和多选占两列,`1` / `2` 可覆盖;自定义宽控件标注 `data-form-wide`。已有控件 ID 或原生控件给 FormField 配 `for`,避免重复或失效的标签。
678
+
679
+ IAM 表单、AuthPanel、UserProfile、FeedbackModal 直接接收同组参数;CRUD 使用 `form={{ columns: 2, labelPosition: 'left', labelWidth: '6rem' }}`,字段支持 `colSpan` 和延迟翻译的 `validation.message: () => m.required()`。通用字段的 `label/error/hint`、Input/Textarea/Select 的 `validationMessage` 支持翻译函数。内置必填、类型、长度和范围错误由 UI 提供;应用只提供业务文案。通过 UI 的 `setGlobalLocale` / `createLocaleStore` 同步语言,已显示的错误随之更新;自定义提示只用于失败,不能把固定提示直接设成持续的 customValidity。FormField 或控件发送含字段名的 Toast,避免父子重复;修正后移除旧通知,关联说明以读屏可读文本保留。
680
+
681
+ 验证一列/双列与两种标签位置、自动/显式跨列、窄抽屉/手机、无效提交与修正、切换语言后的错误、按钮和回车提交,以及关闭重开后的状态。
682
+
683
+
684
+ ```svelte
685
+ <!-- m、save、name、notes 为应用自己的翻译、提交回调和状态 -->
686
+ <Form columns={2} labelPosition="left" labelWidth="6rem" onsubmit={save}>
687
+ <FormField label={() => m.name()} required>
688
+ <Input name="name" bind:value={name} required />
689
+ </FormField>
690
+ <FormField label={() => m.notes()}>
691
+ <Textarea name="notes" bind:value={notes} />
692
+ </FormField>
693
+ <Button type="submit">{m.save()}</Button>
694
+ </Form>
695
+ ```
696
+
697
+ Node 请求/SSR 必须用 `core.i18n.runWithLocale(locale, callback)`(kit 同名方法)包裹实际异步 resolve;serv 自动建立请求语言上下文。浏览器 setGlobalLocale/createLocaleStore 继续管理应用语言,SSR 的 UI setter/store 不写全局值。显式 MessageOptions.locale 优先;进程默认语言仅在启动时设置。
698
+
699
+ `@h-ai/ui/i18n` 的 `createLocaleStore` 按“可解析的持久化值 → 完整 navigator.languages(再检查 navigator.language)→ defaultLocale → 支持列表首项”选择语言;首个不支持的候选不触发默认回退。匹配大小写、语言简写及逐级区域/脚本回退,返回 supportedLocales 中的配置代码;同语言多个变体按列表顺序选择。detectBrowserLocale 无实际命中返回 null,不插入框架默认值;空支持列表最终保留调用方默认值。SSR 不读取浏览器候选或修改全局语言。应用若使用 Paraglide,仍需用该项目的 setLocale 同步应用翻译;内置 UI 字典的覆盖范围不因自定义 store 列表而自动增加。
700
+
701
+ ## 设计、实现与审查交接
702
+
703
+ 新页面/较大改版由 [hai-ui-design](../hai-ui-design/SKILL.md) 记录任务、信息结构、状态与组件映射;本参考负责公开用法;[hai-ui-review](../hai-ui-review/SKILL.md) 查看真实页面。theme.css 已引入 design-tokens.css;--hai-focus-color 缺省跟随主题 primary。
704
+
705
+ Tabs 提供单一 Tab 入口、方向键/Home/End、跳过禁用项和 children 内容关联。DataTable 提供 aria-sort、aria-busy、加载文字及行键盘激活。Pagination 导航与输入名称走 UI i18n,外部 page 同步跳页草稿,触摸设备扩大按钮。TableToolbar 与 CrudFilterBar 共用原生查询表单,查询/重置常驻,展开条件遵循文档焦点顺序,视图按钮带 aria-pressed;业务回调仍须实际更新对应数据和视图。Empty/Alert 可容纳长内容与恢复操作;全局样式响应减少动态效果。