@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.
- package/README.en.md +229 -0
- package/README.ja.md +229 -0
- package/README.md +175 -113
- package/dist/chunk-AKV2CQZV.js +1497 -0
- package/dist/chunk-AKV2CQZV.js.map +1 -0
- package/dist/chunk-EF7WOFWZ.js +7557 -0
- package/dist/chunk-EF7WOFWZ.js.map +1 -0
- package/dist/chunk-MUHRBJSW.js +29272 -0
- package/dist/chunk-MUHRBJSW.js.map +1 -0
- package/dist/chunk-ZSDEVXZ7.js +38 -0
- package/dist/{chunk-2H7UOFLK.js.map → chunk-ZSDEVXZ7.js.map} +1 -1
- package/dist/cli-config-templates-HHFHNXBN.js +5 -0
- package/dist/cli-config-templates-HHFHNXBN.js.map +1 -0
- package/dist/cli-skill-templates-PN4FLGBC.js +5 -0
- package/dist/cli-skill-templates-PN4FLGBC.js.map +1 -0
- package/dist/index.js +4444 -554
- package/dist/index.js.map +1 -1
- package/dist/metafile-esm.json +1 -0
- package/dist/src-TEBHR5I5.js +5 -0
- package/dist/src-TEBHR5I5.js.map +1 -0
- package/package.json +35 -15
- package/templates/README.md +56 -114
- package/templates/apps/admin/messages/en-US.json +7 -0
- package/templates/apps/admin/messages/ja-JP.json +40 -0
- package/templates/apps/admin/messages/zh-CN.json +7 -0
- package/templates/apps/admin/src/routes/+layout.svelte.hbs +65 -8
- package/templates/apps/admin/src/routes/+page.svelte.hbs +35 -14
- package/templates/apps/admin/src/routes/admin/+layout.svelte.hbs +54 -22
- package/templates/apps/admin/src/routes/admin/+page.svelte.hbs +33 -24
- package/templates/apps/admin/src/routes/admin/settings/+page.svelte.hbs +16 -13
- package/templates/apps/api/.dockerignore.hbs +25 -0
- package/templates/apps/api/.gitignore.hbs +22 -0
- package/templates/apps/api/.npmrc.hbs +1 -0
- package/templates/apps/api/apps/{{projectName}}-contract/README.md.hbs +39 -0
- package/templates/apps/api/apps/{{projectName}}-contract/package.json.hbs +41 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-contract.ts.hbs +27 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/app-schemas.ts.hbs +28 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/index.ts.hbs +5 -0
- package/templates/apps/api/apps/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +16 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tests/contract.test.ts.hbs +18 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsconfig.json.hbs +12 -0
- package/templates/apps/api/apps/{{projectName}}-contract/tsup.config.ts.hbs +11 -0
- package/templates/apps/api/apps/{{projectName}}-contract/vitest.config.ts.hbs +9 -0
- package/templates/apps/api/apps/{{projectName}}-serv/README.md.hbs +60 -0
- package/templates/apps/api/apps/{{projectName}}-serv/config/_core.yml.hbs +17 -0
- package/templates/apps/api/apps/{{projectName}}-serv/config/_serv.yml.hbs +54 -0
- package/templates/apps/api/apps/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
- package/templates/apps/api/apps/{{projectName}}-serv/package.json.hbs +66 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/app.ts.hbs +119 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/index.ts.hbs +41 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/lib/server/init.ts.hbs +165 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +57 -0
- package/templates/apps/api/apps/{{projectName}}-serv/src/server/procedures/index.ts.hbs +41 -0
- package/templates/apps/api/apps/{{projectName}}-serv/tests/service.test.ts.hbs +176 -0
- package/templates/apps/api/apps/{{projectName}}-serv/tsconfig.json.hbs +16 -0
- package/templates/apps/api/apps/{{projectName}}-serv/tsup.config.ts.hbs +20 -0
- package/templates/apps/api/apps/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
- package/templates/apps/api/e2e/api-serv.spec.ts.hbs +113 -0
- package/templates/apps/api/e2e/capture-evidence.ts.hbs +23 -0
- package/templates/apps/api/eslint.config.js.hbs +30 -0
- package/templates/apps/api/hai.json.hbs +4 -0
- package/templates/apps/api/images/serv.Dockerfile.hbs +37 -0
- package/templates/apps/api/package.json.hbs +53 -0
- package/templates/apps/api/playwright.config.ts.hbs +67 -0
- package/templates/apps/api/pnpm-workspace.yaml.hbs +40 -0
- package/templates/apps/api/tsconfig.base.json +14 -0
- package/templates/apps/fullstack/.dockerignore.hbs +25 -0
- package/templates/apps/fullstack/.gitignore.hbs +38 -0
- package/templates/apps/fullstack/.npmrc.hbs +1 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/.env.example.hbs +10 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/README.md.hbs +67 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/capacitor.config.ts.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/eslint.config.js.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/index.html.hbs +22 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/en-US.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/ja-JP.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/messages/zh-CN.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/package.json.hbs +86 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/public/runtime-config.js.hbs +4 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/App.svelte.hbs +59 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.css.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/app.d.ts.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/build-metadata.ts.hbs +9 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/lib/capacitor.ts.hbs +19 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/src/main.ts.hbs +21 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/svelte.config.js.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/tsconfig.json.hbs +23 -0
- package/templates/apps/fullstack/apps/{{projectName}}-app/vite.config.ts.hbs +74 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/.env.example.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/README.md.hbs +64 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/eslint.config.js.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/index.html.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/en-US.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/ja-JP.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/messages/zh-CN.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/package.json.hbs +66 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/App.svelte.hbs +25 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.css.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/app.d.ts.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/build-metadata.ts.hbs +9 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src/main.ts.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/Cargo.toml.hbs +33 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/build.rs.hbs +6 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/capabilities/default.json.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/128x128@2x.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/32x32.png +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.icns +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/icons/icon.ico +0 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/lib.rs.hbs +91 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/src/main.rs.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/src-tauri/tauri.conf.json.hbs +46 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/svelte.config.js.hbs +14 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/tsconfig.json.hbs +22 -0
- package/templates/apps/fullstack/apps/{{projectName}}-desktop/vite.config.ts.hbs +89 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/README.md.hbs +25 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/en-US.json.hbs +12 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/ja-JP.json.hbs +12 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/messages/zh-CN.json.hbs +12 -0
- package/templates/apps/fullstack/apps/{{projectName}}-miniapp/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/README.md.hbs +54 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/eslint.config.js.hbs +20 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/index.html.hbs +21 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/en-US.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/ja-JP.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/messages/zh-CN.json.hbs +7 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/package.json.hbs +53 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/project.inlang/settings.json.hbs +17 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/public/runtime-config.js.hbs +1 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/App.svelte.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.css.hbs +18 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/app.d.ts.hbs +8 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/build-metadata.ts.hbs +9 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/src/main.ts.hbs +14 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/svelte.config.js.hbs +16 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/tsconfig.json.hbs +23 -0
- package/templates/apps/fullstack/apps/{{projectName}}-web/vite.config.ts.hbs +76 -0
- package/templates/apps/fullstack/docs/security-configuration.md.hbs +349 -0
- package/templates/apps/fullstack/e2e/fullstack.spec.ts.hbs +988 -0
- package/templates/apps/fullstack/e2e/session-close.spec.ts.hbs +119 -0
- package/templates/apps/fullstack/eslint.config.js.hbs +41 -0
- package/templates/apps/fullstack/hai.json.hbs +11 -0
- package/templates/apps/fullstack/images/serv.Dockerfile.hbs +38 -0
- package/templates/apps/fullstack/images/web/19-runtime-config.envsh.hbs +5 -0
- package/templates/apps/fullstack/images/web/nginx.conf.hbs +24 -0
- package/templates/apps/fullstack/images/web/runtime-config.js.template.hbs +3 -0
- package/templates/apps/fullstack/images/web.Dockerfile.hbs +37 -0
- package/templates/apps/fullstack/package.json.hbs +61 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/README.md.hbs +40 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/package.json.hbs +30 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-contract.ts.hbs +78 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/admin-schemas.ts.hbs +134 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-contract.ts.hbs +20 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/app-schemas.ts.hbs +35 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/index.ts.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/src/{{projectName}}-contract.ts.hbs +23 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tests/contract.test.ts.hbs +31 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsconfig.json.hbs +9 -0
- package/templates/apps/fullstack/packages/{{projectName}}-contract/tsup.config.ts.hbs +9 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/README.md.hbs +84 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_ai.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_audit.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_cache.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_core.yml.hbs +22 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_db.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_feedback.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_iam.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_payment.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_reach.yml.hbs +60 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_scheduler.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_serv.yml.hbs +64 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_storage.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/config/_vecdb.yml.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/data/.gitkeep.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/package.json.hbs +62 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/app-server.ts.hbs +115 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/build-metadata.ts.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/index.ts.hbs +40 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/admin-service.ts.hbs +294 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/audit-jobs.ts.hbs +28 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/business-settings.ts.hbs +50 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/messages.ts.hbs +50 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/admin-procedures.ts.hbs +106 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/app-procedures.ts.hbs +49 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/procedures/index.ts.hbs +34 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/runtime.ts.hbs +159 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/src/server/security-roles.ts.hbs +73 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/app-server.test.ts.hbs +505 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/runtime.test.ts.hbs +72 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tests/security.test.ts.hbs +183 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsconfig.json.hbs +10 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/tsup.config.ts.hbs +18 -0
- package/templates/apps/fullstack/packages/{{projectName}}-serv/vitest.config.ts.hbs +12 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/.gitignore.hbs +10 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/README.md.hbs +97 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/en-US.json.hbs +164 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/ja-JP.json.hbs +164 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/messages/zh-CN.json.hbs +164 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/package.json.hbs +55 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/project.inlang/settings.json.hbs +11 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/index.ts.hbs +7 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/api-client.ts.hbs +94 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/feedback-client.ts.hbs +36 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/sensitive-actions.svelte.ts.hbs +16 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/api/session-recovery.svelte.ts.hbs +4 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AdminWorkspace.svelte.hbs +122 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/AppShell.svelte.hbs +90 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/components/FeedbackEntry.svelte.hbs +86 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/audit.svelte.hbs +94 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/configuration.svelte.hbs +25 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/feedback.svelte.hbs +157 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/roles.svelte.hbs +77 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/settings.svelte.hbs +44 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/pages/users.svelte.hbs +216 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/security/role-label.ts.hbs +12 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/guide-store.ts.hbs +55 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/management-store.svelte.ts.hbs +614 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/src/lib/stores/theme-store.svelte.ts.hbs +23 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/svelte.config.js.hbs +1 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/api-client.test.ts.hbs +150 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tests/management-store.test.ts.hbs +253 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/tsconfig.json.hbs +17 -0
- package/templates/apps/fullstack/packages/{{projectName}}-shared/vitest.config.ts.hbs +7 -0
- package/templates/apps/fullstack/playwright.config.ts.hbs +114 -0
- package/templates/apps/fullstack/playwright.session-close.config.ts.hbs +18 -0
- package/templates/apps/fullstack/pnpm-workspace.yaml.hbs +38 -0
- package/templates/apps/fullstack/tsconfig.base.json +14 -0
- package/templates/apps/h5/messages/en-US.json +3 -0
- package/templates/apps/h5/messages/ja-JP.json +40 -0
- package/templates/apps/h5/messages/zh-CN.json +3 -0
- package/templates/apps/h5/src/routes/+layout.svelte.hbs +85 -30
- package/templates/apps/h5/src/routes/+page.svelte.hbs +20 -8
- package/templates/apps/h5/src/routes/discover/+page.svelte.hbs +17 -6
- package/templates/apps/h5/src/routes/profile/+page.svelte.hbs +17 -6
- package/templates/apps/mobile-app/.env.hbs +3 -0
- package/templates/apps/{android-app → mobile-app}/capacitor.config.ts.hbs +2 -2
- package/templates/apps/mobile-app/index.html.hbs +14 -0
- package/templates/apps/mobile-app/messages/en-US.json +36 -0
- package/templates/apps/mobile-app/messages/ja-JP.json +36 -0
- package/templates/apps/mobile-app/messages/zh-CN.json +36 -0
- package/templates/apps/mobile-app/public/runtime-config.js +1 -0
- package/templates/apps/mobile-app/src/App.svelte.hbs +153 -0
- package/templates/apps/mobile-app/src/lib/api.ts.hbs +213 -0
- package/templates/apps/mobile-app/src/lib/app-config.ts.hbs +14 -0
- package/templates/apps/{android-app → mobile-app}/src/lib/capacitor.ts +6 -7
- package/templates/apps/mobile-app/src/lib/pages/home.svelte.hbs +58 -0
- package/templates/apps/mobile-app/src/lib/pages/profile.svelte.hbs +13 -0
- package/templates/apps/mobile-app/src/lib/pages/tasks.svelte.hbs +16 -0
- package/templates/apps/mobile-app/src/main.ts.hbs +11 -0
- package/templates/apps/website/messages/en-US.json +4 -2
- package/templates/apps/website/messages/ja-JP.json +34 -0
- package/templates/apps/website/messages/zh-CN.json +4 -2
- package/templates/apps/website/scripts/static-website.mjs.hbs +67 -0
- package/templates/apps/website/src/routes/+layout.svelte.hbs +77 -26
- package/templates/apps/website/src/routes/+layout.ts +3 -0
- package/templates/apps/website/src/routes/+page.svelte.hbs +31 -12
- package/templates/apps/website/src/routes/about/+page.svelte.hbs +11 -6
- package/templates/apps/website/src/routes/api/health/+server.ts +3 -0
- package/templates/apps/website/src/routes/contact/+page.svelte.hbs +44 -34
- package/templates/apps/website/src/routes/services/+page.svelte.hbs +27 -40
- package/templates/base/.dockerignore.hbs +27 -0
- package/templates/base/.gitignore.hbs +41 -0
- package/templates/base/.npmrc.hbs +1 -0
- package/templates/base/e2e/app.spec.ts.hbs +213 -0
- package/templates/base/e2e/helpers.ts +1 -1
- package/templates/base/eslint-rules.js +45 -0
- package/templates/base/eslint.config.js.hbs +34 -0
- package/templates/base/hai.json.hbs +4 -0
- package/templates/base/images/web/nginx.conf.hbs +24 -0
- package/templates/base/images/web.Dockerfile.hbs +72 -0
- package/templates/base/package.json.hbs +125 -49
- package/templates/base/playwright.config.ts +44 -6
- package/templates/base/pnpm-workspace.yaml.hbs +40 -0
- package/templates/base/src/app.css.hbs +40 -0
- package/templates/base/src/app.d.ts.hbs +14 -1
- package/templates/base/src/app.html.hbs +13 -0
- package/templates/base/src/hooks.server.ts.hbs +115 -43
- package/templates/base/src/lib/build-metadata.ts.hbs +7 -0
- package/templates/base/src/lib/server/init.ts.hbs +125 -152
- package/templates/base/src/lib/server/kit-config.ts.hbs +40 -0
- package/templates/base/src/routes/+layout.server.ts.hbs +35 -0
- package/templates/base/static/favicon.png +0 -0
- package/templates/base/svelte.config.js.hbs +84 -5
- package/templates/base/tests/scaffold.test.ts.hbs +102 -0
- package/templates/base/tsconfig.json.hbs +50 -0
- package/templates/base/vite.config.ts.hbs +117 -12
- package/templates/base/vitest.config.ts.hbs +19 -0
- package/templates/features/ai/routes/api/chat/+server.ts +6 -7
- package/templates/features/iam/routes-admin/(auth)/+layout.svelte.hbs +3 -17
- package/templates/features/iam/routes-admin/(auth)/auth/forgot-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-admin/(auth)/auth/login/+page.svelte.hbs +9 -96
- package/templates/features/iam/routes-admin/(auth)/auth/register/+page.svelte.hbs +9 -122
- package/templates/features/iam/routes-admin/(auth)/auth/reset-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-h5/auth/forgot-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-h5/auth/login/+page.svelte.hbs +9 -96
- package/templates/features/iam/routes-h5/auth/register/+page.svelte.hbs +9 -112
- package/templates/features/iam/routes-h5/auth/reset-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-shared/api/auth/captcha/+server.ts.hbs +4 -0
- package/templates/features/iam/routes-shared/api/auth/config/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/login/+server.ts +1 -29
- package/templates/features/iam/routes-shared/api/auth/login/ldap/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/login/otp/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/logout/+server.ts +13 -6
- package/templates/features/iam/routes-shared/api/auth/otp/send/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/password/renew/+server.ts +5 -0
- package/templates/features/iam/routes-shared/api/auth/password-reset/confirm/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/password-reset/request/+server.ts +4 -0
- package/templates/features/iam/routes-shared/api/auth/reauthenticate/+server.ts +5 -0
- package/templates/features/iam/routes-shared/api/auth/register/+server.ts +1 -23
- package/templates/features/iam/routes-shared/api/auth/session/close/+server.ts.hbs +4 -0
- package/templates/features/iam/routes-website/auth/forgot-password/+page.svelte.hbs +10 -0
- package/templates/features/iam/routes-website/auth/login/+page.svelte.hbs +11 -0
- package/templates/features/iam/routes-website/auth/register/+page.svelte.hbs +11 -0
- package/templates/features/iam/routes-website/auth/reset-password/+page.svelte.hbs +10 -0
- package/templates/features/payment/routes/api/v1/payment/create/+server.ts +25 -23
- package/templates/features/payment/routes/api/v1/payment/notify/[provider]/+server.ts +5 -2
- package/templates/features/storage/routes/api/upload/+server.ts +10 -8
- package/templates/i18n/project.inlang/settings.json +2 -2
- package/templates/shared/.gitattributes +11 -0
- package/templates/shared/build-metadata.ts +42 -0
- package/templates/shared/container-runtime-config.sh +30 -0
- package/templates/shared/e2e-env.ts +98 -0
- package/templates/shared/hash-router.svelte.ts +83 -0
- package/templates/shared/public-base-path.mjs +19 -0
- package/templates/shared/run-e2e.mjs +104 -0
- package/templates/shared/vite-runtime-config.ts +56 -0
- package/templates/skills/AGENTS.md +75 -16
- package/templates/skills/CLAUDE.md +0 -11
- package/templates/skills/bridges/admin/AGENTS.md +89 -0
- package/templates/skills/bridges/api/AGENTS.md +83 -0
- package/templates/skills/bridges/fullstack/AGENTS.md.hbs +102 -0
- package/templates/skills/bridges/h5/AGENTS.md +88 -0
- package/templates/skills/bridges/mobile-app/AGENTS.md +100 -0
- package/templates/skills/bridges/website/AGENTS.md +88 -0
- package/templates/skills/copilot-instructions.md +3 -59
- package/templates/skills/hai-ai/SKILL.md +44 -715
- package/templates/skills/hai-ai/guide.md +457 -0
- package/templates/skills/hai-ai/reference.md +292 -0
- package/templates/skills/hai-api-client/SKILL.md +26 -339
- package/templates/skills/hai-api-client/reference.md +180 -0
- package/templates/skills/hai-api-contract/SKILL.md +36 -0
- package/templates/skills/hai-api-contract/reference.md +280 -0
- package/templates/skills/hai-app-create/SKILL.md +38 -351
- package/templates/skills/hai-app-create/collaboration.md +52 -0
- package/templates/skills/hai-app-create/development.md +243 -0
- package/templates/skills/hai-app-create/reference.md +376 -0
- package/templates/skills/hai-app-review/SKILL.md +57 -126
- package/templates/skills/hai-app-review/differential.md +34 -0
- package/templates/skills/hai-app-tests/SKILL.md +34 -454
- package/templates/skills/hai-app-tests/reference.md +462 -0
- package/templates/skills/hai-app-tests/validation.md +42 -0
- package/templates/skills/hai-audit/SKILL.md +37 -122
- package/templates/skills/hai-audit/reference.md +184 -0
- package/templates/skills/hai-build/SKILL.md +62 -315
- package/templates/skills/hai-build/paths.md +30 -0
- package/templates/skills/hai-build/reference.md +353 -0
- package/templates/skills/hai-cache/SKILL.md +26 -175
- package/templates/skills/hai-cache/reference.md +229 -0
- package/templates/skills/hai-capacitor/SKILL.md +24 -364
- package/templates/skills/hai-capacitor/reference.md +358 -0
- package/templates/skills/hai-change-plan/SKILL.md +46 -0
- package/templates/skills/hai-ci/SKILL.md +114 -0
- package/templates/skills/hai-core/SKILL.md +31 -469
- package/templates/skills/hai-core/reference.md +557 -0
- package/templates/skills/hai-core/request-access.md +65 -0
- package/templates/skills/hai-crypto/SKILL.md +29 -180
- package/templates/skills/hai-crypto/reference.md +317 -0
- package/templates/skills/hai-datapipe/SKILL.md +24 -207
- package/templates/skills/hai-datapipe/reference.md +204 -0
- package/templates/skills/hai-deploy/SKILL.md +53 -178
- package/templates/skills/hai-deploy/credentials.md +19 -0
- package/templates/skills/hai-deploy/middleware.md +129 -0
- package/templates/skills/hai-feedback/SKILL.md +85 -0
- package/templates/skills/hai-framework-sync/SKILL.md +105 -0
- package/templates/skills/hai-framework-sync/sync.md +49 -0
- package/templates/skills/hai-iam/SKILL.md +53 -325
- package/templates/skills/hai-iam/reference.md +535 -0
- package/templates/skills/hai-kit/SKILL.md +33 -329
- package/templates/skills/hai-kit/reference.md +202 -0
- package/templates/skills/hai-payment/SKILL.md +28 -262
- package/templates/skills/hai-payment/reference.md +295 -0
- package/templates/skills/hai-pr-review/SKILL.md +41 -0
- package/templates/skills/hai-reach/SKILL.md +28 -300
- package/templates/skills/hai-reach/reference.md +363 -0
- package/templates/skills/hai-reldb/SKILL.md +28 -449
- package/templates/skills/hai-reldb/reference.md +500 -0
- package/templates/skills/hai-scheduler/SKILL.md +26 -174
- package/templates/skills/hai-scheduler/reference.md +216 -0
- package/templates/skills/hai-serv/SKILL.md +60 -0
- package/templates/skills/hai-serv/reference.md +792 -0
- package/templates/skills/hai-spec-implement/SKILL.md +50 -0
- package/templates/skills/hai-spec-implement/changes.md +67 -0
- package/templates/skills/hai-spec-implement/evaluation.md +18 -0
- package/templates/skills/hai-spec-implement/handoff.md +47 -0
- package/templates/skills/hai-spec-implement/templates.md +117 -0
- package/templates/skills/hai-spec-implement/workflow.md +56 -0
- package/templates/skills/hai-spec-review/SKILL.md +57 -0
- package/templates/skills/hai-spec-review/checklist.md +71 -0
- package/templates/skills/hai-storage/SKILL.md +31 -262
- package/templates/skills/hai-storage/reference.md +284 -0
- package/templates/skills/hai-ui/SKILL.md +62 -238
- package/templates/skills/hai-ui/guide.md +81 -0
- package/templates/skills/hai-ui/reference.md +705 -0
- package/templates/skills/hai-ui-design/SKILL.md +31 -0
- package/templates/skills/hai-ui-design/patterns.md +31 -0
- package/templates/skills/hai-ui-review/SKILL.md +32 -0
- package/templates/skills/hai-ui-review/checklist.md +29 -0
- package/templates/skills/hai-vecdb/SKILL.md +25 -267
- package/templates/skills/hai-vecdb/reference.md +325 -0
- package/templates/skills/opencode.json +0 -5
- package/dist/chunk-2H7UOFLK.js +0 -10
- package/dist/chunk-LANIDJC7.js +0 -659
- package/dist/chunk-LANIDJC7.js.map +0 -1
- package/dist/chunk-YV7WPUI6.js +0 -206
- package/dist/chunk-YV7WPUI6.js.map +0 -1
- package/dist/config-templates-S5RI2MC6.js +0 -5
- package/dist/config-templates-S5RI2MC6.js.map +0 -1
- package/dist/skill-templates-N5DU5FNX.js +0 -5
- package/dist/skill-templates-N5DU5FNX.js.map +0 -1
- package/dist/src-XJ6YXNAF.js +0 -15030
- package/dist/src-XJ6YXNAF.js.map +0 -1
- package/templates/apps/android-app/.env.hbs +0 -3
- package/templates/apps/android-app/messages/en-US.json +0 -24
- package/templates/apps/android-app/messages/zh-CN.json +0 -24
- package/templates/apps/android-app/src/lib/api.ts.hbs +0 -30
- package/templates/apps/android-app/src/routes/+layout.svelte.hbs +0 -42
- package/templates/apps/android-app/src/routes/+layout.ts +0 -7
- package/templates/apps/android-app/src/routes/+page.svelte.hbs +0 -27
- package/templates/apps/api/src/routes/+layout.svelte +0 -14
- package/templates/apps/api/src/routes/+page.svelte +0 -11
- package/templates/apps/api/src/routes/api/v1/health/+server.ts +0 -14
- package/templates/apps/api/src/routes/api/v1/items/+server.ts +0 -37
- package/templates/apps/api/src/routes/api/v1/items/[id]/+server.ts +0 -30
- package/templates/base/src/app.css +0 -2
- package/templates/base/tsconfig.json +0 -8
|
@@ -1,278 +1,102 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hai-ui
|
|
3
|
-
description: 使用 @h-ai/ui
|
|
3
|
+
description: "使用 @h-ai/ui 构建 Svelte 5 表单、表格、弹窗、新手引导、帮助中心、主题与 AI 内容展示。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# hai-ui
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
## 能力契约
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
## 运行环境
|
|
10
|
+
主题 DOM 与安全缓存复用 `@h-ai/ui/theme` 的 `applyTheme` / `getSavedTheme(fallbackTheme?)`;默认主题取应用配置,选择范围与已编译 CSS 主题一致。共享 theme.css 已包含 high-contrast 高对比及 formal 直角商务主题;新应用默认提供该选项,显式主题白名单尊重宿主配置。不能通过淡化正文/占位符抵消其对比度,验收实际文字、边框、焦点、缩放及偏好持久化。
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
| 项目 | 契约 |
|
|
13
|
+
| --- | --- |
|
|
14
|
+
| 能力 | 使用 @h-ai/ui 构建 Svelte 5 表单、表格、弹窗、移动界面、主题与 AI 内容展示 |
|
|
15
|
+
| 适用场景 | 已有 Svelte 项目中的组件选择与交互实现 |
|
|
16
|
+
| 输入 | 现有 Svelte 页面、组件 Props、Tailwind 扫描路径与主题 |
|
|
17
|
+
| 输出 | 复用原子/组合/场景组件的界面及交互验证 |
|
|
18
|
+
| 限制 | 无 init/close;按公开导出使用组件。复用内置翻译;SSR 不直接访问浏览器全局,高风险代码预览须显式启用。 |
|
|
17
19
|
|
|
18
|
-
## 适用场景
|
|
19
20
|
|
|
20
|
-
-
|
|
21
|
-
- 移动端/App 界面开发(SafeArea、BottomNav、PullRefresh 等)
|
|
22
|
-
- 使用 Bits UI headless 交互组件(Combobox、DatePicker、Calendar)
|
|
23
|
-
- 使用 IAM 场景组件(登录/注册/密码/用户资料表单)
|
|
24
|
-
- 使用 Storage 场景组件(文件上传/图片上传/文件列表)
|
|
25
|
-
- 配置主题切换与 i18n 多语言
|
|
26
|
-
- 多端平台检测与适配
|
|
21
|
+
所有警告、错误和即时操作结果统一使用 `toast` / `notifyError` 等,根布局只挂载一次 `ToastContainer`;默认右下角,使用主题语义色、浅色底、细色边及类型图标,可手工关闭,默认 3 秒消失(notifyError/notifyWarning 默认 5 秒)。FIFO 队列逐条展示,等待期间不计时;`toast.add({ message, position, traceId })` 支持六个方位,`duration: 0` 需手动移除。traceId 无默认,正文不显示编号,容器自动分离已有格式;有编号才显示排查图标,展开可查看和复制。悬停、聚焦和展开时暂停,结束后继续剩余时间。状态层使用轻量 `@h-ai/ui/toast`。响应式安全文案使用 `useToastFeedback`,同类、同文案、同编号合并,来源更新/清空时替换/移除其旧提示,卸载不撤销已发通知。字段保留错误标记与读屏关联,恢复动作留在原位;Alert 仅支持 info/success 持续信息。迁移旧 warning/error Alert 时改用 Toast,不新增行内错误段落。
|
|
27
22
|
|
|
28
|
-
|
|
23
|
+
- 后台与工作台优先使用 WorkspaceLayout 统一紧凑顶栏、内容内边距和可选页脚,不叠加大段上下 padding。导航已显示页面标题时,内容区不再重复;PageHeader 与 SettingsLayout 保留说明/操作,CrudPage 将操作放入工具栏。独立页面或真实子区域保留必要标题。
|
|
24
|
+
- 列表统一使用卡片内查询栏、独立滚动表格和底部分页。多条件筛选使用 FilterBar / TableToolbar / CrudFilterBar,默认收起扩展条件,搜索/查询/重置保持可用;Query 或 Enter 一次提交搜索和全部条件,草稿变化不自动请求,折叠保留值。翻页和排序沿用已提交条件,重置清空条件并回第一页。TableToolbar 与 CrudFilterBar 共用原生查询表单,onfilterchange 仅通知草稿变化,onsearch 读取绑定草稿并提交;实际 onreset/onclearfilters 必须重新查询。排序只在后端支持的 DataTable 列头提供,不新增图标筛选/排序弹层或页面私有折叠状态机。 扩展筛选使用自适应网格,字段横向间距 20px、纵向间距 16px,标签与控件分别对齐且控件等高;窄屏改为单列,避免定宽输入框贴边挤压。
|
|
29
25
|
|
|
30
|
-
|
|
26
|
+
- 查询/登录采用原生表单 Enter 提交;提示使用 Button submitHint(仅 submit),不注册占用浏览器按键的全局监听。输入法确认不得触发搜索;保留 Tab、Enter/Space、Esc、菜单方向键和清晰焦点。弹窗默认聚焦首个可编辑项,危险确认优先聚焦取消;关闭恢复触发控件,忙碌/禁用时不得继续提交。
|
|
31
27
|
|
|
32
|
-
|
|
28
|
+
## 使用路径
|
|
33
29
|
|
|
34
|
-
|
|
35
|
-
// svelte.config.js
|
|
36
|
-
import { autoImportHaiUi } from '@h-ai/ui/auto-import'
|
|
30
|
+
Toast 支持 F8 聚焦/返回、Escape 关闭可关闭提示并恢复焦点;Modal 内也要验证键盘路径。`notifyError` 接收完整错误对象或安全本地化字符串;Promise 组件需抛异常时用 `new Error(result.error.message, { cause: result.error })` 保留安全业务原因和 traceId。普通 Error 和 5xx 使用兜底,不传未知 `err.message`。修改及交付遵循[沟通与同步维护](../hai-app-create/collaboration.md)。
|
|
37
31
|
|
|
38
|
-
|
|
39
|
-
preprocess: [autoImportHaiUi(), vitePreprocess()],
|
|
40
|
-
}
|
|
41
|
-
```
|
|
32
|
+
状态层可从轻量 `@h-ai/ui/i18n` 导入同一个 `authErrorMessage`,避免加载场景组件;管理台、移动/桌面示例与模板保持一致。
|
|
42
33
|
|
|
43
|
-
|
|
34
|
+
认证错误复用公开 `authErrorMessage(error)`(从 `@h-ai/ui/components/scenes/iam/index` 导入):凭据错误统一,不显示未知原文,保留有效 traceId 供排查图标展开;首次/到期改密、密码复用 034 和会话上限有明确指引。AuthPanel 与敏感操作确认已内置;自定义改密复用此映射。确认密码按原始字符串比较,不裁剪或 Unicode 归一化;字段错误、操作成功和认证错误均使用统一 Toast,字段保留定位与无障碍关联。
|
|
44
35
|
|
|
45
|
-
|
|
46
|
-
/* src/app.css */
|
|
47
|
-
@import '@h-ai/ui/styles/design-tokens.css'; /* Design Token */
|
|
48
|
-
@import '@h-ai/ui/styles/mobile.css'; /* 移动端触摸/安全区域优化 */
|
|
49
|
-
@import 'tailwindcss';
|
|
50
|
-
```
|
|
36
|
+
新页面或较大改版先使用 [hai-ui-design](../hai-ui-design/SKILL.md) 确定任务、布局、状态和组件映射;本 skill 负责正确实现。完成后按 [hai-ui-review](../hai-ui-review/SKILL.md) 查看真实页面,小范围修复沿用已有设计。
|
|
51
37
|
|
|
52
|
-
|
|
38
|
+
- 密码登录只接收 identifier/password;AuthPanel 将 LoginForm 的 username 映射为 identifier。会话期限来自服务端 session.maxAge/refreshTokenMaxAge,不增加未实现的登录偏好字段或持久会话选择框。
|
|
53
39
|
|
|
54
|
-
|
|
55
|
-
|
|
40
|
+
- 先检查组件导入、Tailwind @source 和主题 CSS,再选场景 → 组合 → 原子组件,缺能力才自定义。
|
|
41
|
+
- 管理列表和工作台随可用宽度展开;flex/grid 子项设 min-width: 0,表格在自身容器滚动。阅读页与登录表单按内容约束宽度。实际检查 390、1440、1920、2560、3840px,避免宽屏仍挤在中央窄列,手机出现整页横向滚动。
|
|
42
|
+
- 按安装版本的 exports 选择明确列出的 components barrel 入口(不开放任意内部文件);主题工具使用 `@h-ai/ui/theme`,避免仅为主题加载根入口的 AI/图表组件。禁止导入内部 src/dist;例如原子组件使用 `@h-ai/ui/components/primitives/index`。
|
|
43
|
+
- 自动导入识别无分号、跨行及别名的运行时 import;已绑定的本地组件名称不会重复注入。
|
|
44
|
+
- 应用只提供页面级文案;组件内部中英日文由 @h-ai/ui 维护。
|
|
45
|
+
- `UserProfile` 用 `avatarAccept` / `avatarHint` 对齐业务的头像格式与大小限制;文件最终校验和上传由业务回调完成。
|
|
46
|
+
- `BareInput type="file"` 通过 `onchange` 的 `currentTarget.files` 读取文件,不绑定文件路径 `value`;其他输入类型可 `bind:value`。
|
|
47
|
+
- AI 文本视为不可信;Markdown/Mermaid 预览与允许执行 HTML/JS 的预览有不同边界。
|
|
56
48
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
49
|
+
- Tabs 支持方向键、Home/End、跳过禁用项与单一 Tab 入口,children 内容关联当前页签;DataTable 通过 aria-sort/aria-busy 和加载文字提供状态,有 onrowclick 时支持行 Enter/Space,单元格操作不重复触发行操作。
|
|
50
|
+
- Pagination 导航和输入名称跟随 UI locale,外部 page 变化同步跳页草稿,触摸设备扩大导航按钮;TableToolbar 展开筛选遵循文档焦点顺序,视图按钮带选中状态。应用仍需接入排序、筛选、分页和视图对应的数据行为。
|
|
51
|
+
- CrudPage 占满宿主剩余高度,空数据和少量数据时分页保留在底部;宿主从视口外壳到内容区逐层使用 flex/grid 的剩余空间约束与 min-height: 0,避免自动高度包装层截断布局。数据区独立滚动,分页不覆盖数据。
|
|
52
|
+
- theme.css 自动引入 design-tokens.css;全局样式的焦点使用 --hai-focus-color(缺省跟随当前 primary),减少动态效果时保留最终状态并缩短动画。长内容在 Empty/Alert 中换行;业务自定义 snippet 也要能收缩。
|
|
61
53
|
|
|
62
|
-
// Svelte 5 响应式(组件中使用)
|
|
63
|
-
const p = usePlatform()
|
|
64
|
-
// p.platform / p.isMobile / p.isNative
|
|
65
|
-
```
|
|
66
54
|
|
|
67
|
-
|
|
55
|
+
敏感操作复用 createSensitiveActions(Kit/API client 标准 actions) + ReauthenticationDialog,不在业务项目复制弹窗状态机。每个根布局创建一份,configure(公开策略),卸载时 cancel();authorize 返回 undefined 无需验证、null 取消/忙、有字符串才是本次证明。取消不发业务请求;会话恢复/证明失效后通过本次 reauthorize 回调重新 authorize,取消不续发;Kit 回调放 apiFetch 第三参数,typed client 放本次 options.context。typed client 只给本次 options.context.reauthentication,不放全局 header/持久存储。服务端仍检查授权并消费用途凭据。Input 的 datetime-local 值需按本地时区转换为明确时间戳。
|
|
68
56
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
### 原子组件(Primitives,21 个)
|
|
72
|
-
|
|
73
|
-
| 组件 | Props 要点 | 说明 |
|
|
74
|
-
| ------------ | ------------------------------------------------------------- | -------- |
|
|
75
|
-
| `Button` | `variant`, `size`, `loading`, `disabled`, `outline`, `circle` | 按钮 |
|
|
76
|
-
| `IconButton` | `icon: string \| Snippet`, `tooltip`, `variant`, `size` | 图标按钮 |
|
|
77
|
-
| `Input` | `value`, `type`, `size`, `error`, `placeholder` | 输入框 |
|
|
78
|
-
| `Textarea` | `value`, `rows`, `autoResize`, `error` | 文本域 |
|
|
79
|
-
| `Select` | `value`, `options: SelectOption[]`, `placeholder` | 下拉选择 |
|
|
80
|
-
| `Checkbox` | `checked`, `label`, `indeterminate` | 复选框 |
|
|
81
|
-
| `Switch` | `checked`, `label`, `size` | 开关 |
|
|
82
|
-
| `Radio` | `value`, `options`, `direction` | 单选组 |
|
|
83
|
-
| `Range` | `value`, `min`, `max`, `step`, `variant`, `size` | 滑块 |
|
|
84
|
-
| `Rating` | `value`, `max` | 评分 |
|
|
85
|
-
| `Badge` | `variant`, `size`, `outline` | 徽标 |
|
|
86
|
-
| `Avatar` | `src`, `name`, `size`, `shape` | 头像 |
|
|
87
|
-
| `Tag` | `text`, `variant`, `closable` | 标签 |
|
|
88
|
-
| `Spinner` | `size`, `variant` | 加载动画 |
|
|
89
|
-
| `Progress` | `value`, `max`, `striped`, `animated` | 进度条 |
|
|
90
|
-
|
|
91
|
-
### 组合组件(Compounds,25 + 7 移动端)
|
|
92
|
-
|
|
93
|
-
由原子组件 + Bits UI headless 交互组合。
|
|
94
|
-
|
|
95
|
-
#### 桌面端组合组件
|
|
96
|
-
|
|
97
|
-
| 组件 | Props 要点 | 说明 |
|
|
98
|
-
| ------------ | ------------------------------------------------------------------ | ------------- |
|
|
99
|
-
| `Form` | `loading`, `disabled`, `onsubmit` | 表单容器 |
|
|
100
|
-
| `FormField` | `label`, `name`, `error`, `hint`, `required` | 表单字段 |
|
|
101
|
-
| `Modal` | `open`, `title`, `size`, `closeOnBackdrop` | 模态框 |
|
|
102
|
-
| `Drawer` | `open`, `position`, `size` | 抽屉 |
|
|
103
|
-
| `DataTable` | `data`, `columns`, `keyField`, snippet slots | 数据表格 |
|
|
104
|
-
| `Combobox` | `options`, `value`, `multiple`, `placeholder`, `error`, `onchange` | 可搜索选择 |
|
|
105
|
-
| `Calendar` | `value`, `minValue`, `maxValue` | 独立日历 |
|
|
106
|
-
| `DatePicker` | `value`, `minValue`, `maxValue`, `error` | 日期输入+弹出 |
|
|
107
|
-
| `Tabs` | `items: TabItem[]`, `active`, `type` | 标签页 |
|
|
108
|
-
| `Pagination` | `page`, `total`, `pageSize`, `onchange` | 分页 |
|
|
109
|
-
| `Dropdown` | `items: DropdownItem[]`, `trigger` | 下拉菜单 |
|
|
110
|
-
| `Accordion` | `items: AccordionItem[]` | 折叠面板 |
|
|
111
|
-
| `Skeleton` | `variant`, `count`, `animation` | 骨架屏 |
|
|
112
|
-
| `Empty` | `title`, `description`, `icon` | 空状态 |
|
|
113
|
-
|
|
114
|
-
#### 移动端组合组件(新增 7 个)
|
|
115
|
-
|
|
116
|
-
| 组件 | Props 要点 | 说明 |
|
|
117
|
-
| ---------------- | ----------------------------------------------------------------------------- | ---------------- |
|
|
118
|
-
| `SafeArea` | `top`, `bottom`, `left`, `right` | 安全区域容器 |
|
|
119
|
-
| `AppBar` | `title`, `backHref`, `onback`, `fixed`, `transparent`, snippet `left`/`right` | 顶部导航栏 |
|
|
120
|
-
| `BottomNav` | `items: BottomNavItem[]`, `active` | 底部导航栏 |
|
|
121
|
-
| `ActionSheet` | `open`, `title`, `items: ActionSheetItem[]`, `cancelText`, `onselect` | 底部弹出操作面板 |
|
|
122
|
-
| `PullRefresh` | `refreshing`, `onrefresh`, `threshold`, `pullText`, `releaseText` | 下拉刷新 |
|
|
123
|
-
| `InfiniteScroll` | `loading`, `finished`, `threshold`, `onload`, `loadingText`, `finishedText` | 无限滚动加载 |
|
|
124
|
-
| `SwipeCell` | `leftActions`, `rightActions: SwipeCellAction[]`, `threshold` | 滑动操作单元格 |
|
|
125
|
-
|
|
126
|
-
**移动端组件用法示例**:
|
|
127
|
-
|
|
128
|
-
```svelte
|
|
129
|
-
<script lang="ts">
|
|
130
|
-
import type { BottomNavItem } from '@h-ai/ui'
|
|
131
|
-
|
|
132
|
-
const navItems: BottomNavItem[] = [
|
|
133
|
-
{ key: 'home', label: '首页', icon: 'tabler:home', href: '/' },
|
|
134
|
-
{ key: 'discover', label: '发现', icon: 'tabler:compass', href: '/discover' },
|
|
135
|
-
{ key: 'profile', label: '我的', icon: 'tabler:user', href: '/profile' },
|
|
136
|
-
]
|
|
137
|
-
</script>
|
|
138
|
-
|
|
139
|
-
<SafeArea top bottom>
|
|
140
|
-
<AppBar title="首页" />
|
|
141
|
-
<PullRefresh bind:refreshing onrefresh={loadData}>
|
|
142
|
-
<main class="p-4">
|
|
143
|
-
<!-- 页面内容 -->
|
|
144
|
-
</main>
|
|
145
|
-
</PullRefresh>
|
|
146
|
-
<BottomNav items={navItems} active="home" />
|
|
147
|
-
</SafeArea>
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
**ActionSheet 用法**:
|
|
151
|
-
|
|
152
|
-
```svelte
|
|
153
|
-
<script lang="ts">
|
|
154
|
-
import type { ActionSheetItem } from '@h-ai/ui'
|
|
155
|
-
|
|
156
|
-
let showActions = $state(false)
|
|
157
|
-
const actions: ActionSheetItem[] = [
|
|
158
|
-
{ key: 'camera', label: '拍照' },
|
|
159
|
-
{ key: 'album', label: '从相册选择' },
|
|
160
|
-
{ key: 'delete', label: '删除', destructive: true },
|
|
161
|
-
]
|
|
162
|
-
</script>
|
|
163
|
-
|
|
164
|
-
<ActionSheet bind:open={showActions} title="选择操作" items={actions} onselect={handleAction} />
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
**SwipeCell 用法**:
|
|
168
|
-
|
|
169
|
-
```svelte
|
|
170
|
-
<script lang="ts">
|
|
171
|
-
import type { SwipeCellAction } from '@h-ai/ui'
|
|
172
|
-
|
|
173
|
-
const rightActions: SwipeCellAction[] = [
|
|
174
|
-
{ key: 'edit', label: '编辑', color: '#3b82f6' },
|
|
175
|
-
{ key: 'delete', label: '删除', color: '#ef4444' },
|
|
176
|
-
]
|
|
177
|
-
</script>
|
|
178
|
-
|
|
179
|
-
<SwipeCell {rightActions} onaction={handleSwipeAction}>
|
|
180
|
-
<div class="p-4">列表项内容</div>
|
|
181
|
-
</SwipeCell>
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
### 场景组件(Scenes)
|
|
185
|
-
|
|
186
|
-
内置中英文翻译的业务场景组件。
|
|
187
|
-
|
|
188
|
-
#### IAM 场景组件
|
|
189
|
-
|
|
190
|
-
| 组件 | Props 要点 | 说明 |
|
|
191
|
-
| -------------- | ----------------------------------------------- | -------- |
|
|
192
|
-
| `LoginForm` | `showRememberMe`, `showRegisterLink`, `errors` | 登录表单 |
|
|
193
|
-
| `RegisterForm` | `fields`, `minPasswordLength`, `errors` | 注册表单 |
|
|
194
|
-
| `UserProfile` | `user`, `editable`, `fields`, `avatarUploadUrl` | 用户资料 |
|
|
195
|
-
|
|
196
|
-
#### Storage 场景组件
|
|
197
|
-
|
|
198
|
-
| 组件 | Props 要点 | 说明 |
|
|
199
|
-
| ------------- | ---------------------------------------------- | -------- |
|
|
200
|
-
| `FileUpload` | `accept`, `maxSize`, `uploadUrl`, `autoUpload` | 文件上传 |
|
|
201
|
-
| `ImageUpload` | `value`, `uploadUrl`, `aspectRatio` | 图片上传 |
|
|
202
|
-
| `FileList` | `files: FileItem[]`, `layout`, `showPreview` | 文件列表 |
|
|
57
|
+
AuthPanel 的 config.captcha.enabled 开启后,复用 createAuthActions 提供的 createCaptcha 自动完成自托管计算挑战。自定义认证动作保留 captcha 字段及 sendOtp/resetrequest 的可选 options;不要只在界面验证或持久化证明。关闭时不加载求解器,取消/卸载停止后续鉴别。
|
|
203
58
|
|
|
204
|
-
|
|
59
|
+
## 按需参考
|
|
205
60
|
|
|
206
|
-
|
|
61
|
+
新手引导、首次 Cookie 提示、操作导览和帮助中心见 [guide.md](guide.md)。fullstack 默认在共享管理界面接入,新增业务只补内容与 data-guide 锚点。
|
|
207
62
|
|
|
208
|
-
|
|
63
|
+
按任务读取 [reference.md](reference.md) 的对应小节;签名以当前源码或安装版本的公开类型为准,不默认加载全部资料。示例中的业务变量由应用提供。
|
|
209
64
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
65
|
+
- 运行环境
|
|
66
|
+
- 适用场景
|
|
67
|
+
- 使用边界
|
|
68
|
+
- AI 使用顺序(先判断,再落地)
|
|
69
|
+
- 项目配置(从 npm 安装)
|
|
70
|
+
- 三层组件架构
|
|
71
|
+
- Design Token 系统
|
|
72
|
+
- 主题系统
|
|
73
|
+
- 代码高亮(Shiki)
|
|
74
|
+
- 重要约定
|
|
75
|
+
- 导出路径
|
|
76
|
+
- 相关 Skills
|
|
216
77
|
|
|
217
|
-
|
|
218
|
-
--hai-radius-md: 8px;
|
|
219
|
-
--hai-radius-lg: 12px;
|
|
78
|
+
## 表单布局与错误提示
|
|
220
79
|
|
|
221
|
-
|
|
222
|
-
--hai-font-size-sm: 14px;
|
|
223
|
-
--hai-font-size-base: 16px;
|
|
80
|
+
问题反馈使用 `FeedbackModal/FeedbackForm` 收集、`FeedbackList/FeedbackDetail` 管理、`FeedbackScreenshot` 标注。组件只负责交互,先固定现场再打开弹窗;跨页截图用 oncapture,实际脱敏材料用 evidence,短录屏随 onfileschange 接入,详情 onreplay 按需读取完整操作记录;可靠受理、上传、通知、权限和离线包按 [hai-feedback](../hai-feedback/SKILL.md) 接入,不把表单回调完成当作持久化成功。
|
|
224
81
|
|
|
225
|
-
|
|
226
|
-
--hai-safe-area-top: env(safe-area-inset-top);
|
|
227
|
-
--hai-safe-area-bottom: env(safe-area-inset-bottom);
|
|
82
|
+
文本控件输入后失焦显示前端错误,修正输入时即时更新;未输入空字段留到提交校验,避免默认焦点离开时挤动操作。CRUD 新增/编辑同样在输入后失焦或提交时校验。Select 在焦点离开触发器及选项后校验。应用无需逐项绑定 blur;业务异步校验仍由应用提供。PasswordInput 的 minLength 提供时执行长度校验;登录现有密码时省略该属性。
|
|
228
83
|
|
|
229
|
-
|
|
230
|
-
--hai-z-modal: 2000;
|
|
231
|
-
--hai-z-toast: 3000;
|
|
84
|
+
UserProfile 的 `fieldConstraints` 按字段声明 `required/minlength/maxlength/pattern/validationMessage`;单行控件支持 pattern,业务文案可用翻译函数。不要只在保存回调内放前端校验,服务端仍须执行 schema 校验。
|
|
232
85
|
|
|
233
|
-
|
|
234
|
-
--hai-transition-normal: 250ms ease;
|
|
235
|
-
```
|
|
86
|
+
CrudEditPanel 的 onsubmit 只提交表单声明的可写字段;编辑时不回传 readonly 字段,新建仍可填写。主键、关联展示值和审计时间不自动提交,空值、false 和 0 保留。自定义保存逻辑也应遵守输入白名单,服务端继续严格 schema 校验,不通过放宽校验接收整行记录。
|
|
236
87
|
|
|
237
|
-
|
|
88
|
+
状态层通过轻量入口 `@h-ai/ui/i18n` 导入 `setGlobalLocale` / `createLocaleStore`,不加载组件或引导 CSS。
|
|
238
89
|
|
|
239
|
-
|
|
240
|
-
| ----------------------- | ------------------------------- |
|
|
241
|
-
| `.hai-safe-top` | 上方安全区域 padding |
|
|
242
|
-
| `.hai-safe-bottom` | 下方安全区域 padding |
|
|
243
|
-
| `.hai-safe-all` | 四周安全区域 padding |
|
|
244
|
-
| `.hai-scroll-container` | 优化的滚动容器(momentum 滚动) |
|
|
245
|
-
| `.hai-keyboard-aware` | 虚拟键盘弹起时自动调整内容 |
|
|
90
|
+
应用业务文案使用项目自己的 Paraglide 消息。`uiM` 为 UI 包内部函数,不能从 `@h-ai/ui/i18n` 导入或复制内部字典。
|
|
246
91
|
|
|
247
|
-
|
|
92
|
+
数据新增/修改统一使用 `Form`(托管提交)或原生 `<form>` + `FormLayout`,不要在应用复制字段 grid。两者支持 `columns={1 | 2}`、`labelPosition='top' | 'left'`、`labelWidth`;默认单列/标签在上,窄容器自动收拢。`FormField.colSpan='auto'` 自动让多行文本、上传和多选占两列,`1` / `2` 可覆盖;自定义宽控件标注 `data-form-wide`。已有控件 ID 或原生控件给 FormField 配 `for`,避免重复或失效的标签。
|
|
248
93
|
|
|
249
|
-
|
|
94
|
+
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,避免父子重复;修正或关闭宿主后清除过期通知,读屏关联说明仍保留在控件旁。
|
|
250
95
|
|
|
251
|
-
|
|
96
|
+
验证一列/双列与两种标签位置、自动/显式跨列、窄抽屉/手机、无效提交与修正、切换语言后的错误、按钮和回车提交,以及关闭重开后的状态。字段 Toast 关闭或超时后,再次提交相同无效输入仍须显示提示,修正后清除旧通知。
|
|
252
97
|
|
|
253
|
-
|
|
254
|
-
import { applyTheme, getCurrentTheme } from '@h-ai/ui'
|
|
255
|
-
|
|
256
|
-
applyTheme('dark')
|
|
257
|
-
const theme = getCurrentTheme()
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## 重要约定
|
|
263
|
-
|
|
264
|
-
1. **Svelte 5 Runes**:使用 `$state`、`$derived`、`$effect`
|
|
265
|
-
2. **Snippet 插槽**:使用 `{#snippet name()}...{/snippet}` 语法
|
|
266
|
-
3. **自动导入例外**:`toast`、类型导入、`Range`/`FileList` 必须显式 `import`
|
|
267
|
-
4. **Combobox 统一单选/多选**:`MultiSelect` 已删除
|
|
268
|
-
5. **移动端样式**:务必引入 `design-tokens.css` + `mobile.css`,使用 SafeArea 包裹原生 App 页面
|
|
269
|
-
|
|
270
|
-
---
|
|
98
|
+
Node 请求/SSR 必须用 `core.i18n.runWithLocale(locale, callback)`(kit 同名方法)包裹实际异步 resolve;serv 自动建立请求语言上下文。浏览器 setGlobalLocale/createLocaleStore 继续管理应用语言,SSR 的 UI setter/store 不写全局值。显式 MessageOptions.locale 优先;进程默认语言仅在启动时设置。
|
|
271
99
|
|
|
272
|
-
|
|
100
|
+
`@h-ai/ui/i18n` 的 `createLocaleStore` 按“可解析的持久化值 → 完整 navigator.languages(再检查 navigator.language)→ defaultLocale → 支持列表首项”选择语言;首个不支持的候选不触发默认回退。匹配大小写、语言简写及逐级区域/脚本回退,返回 supportedLocales 中的配置代码;同语言多个变体按列表顺序选择。detectBrowserLocale 无实际命中返回 null,不插入框架默认值;空支持列表最终保留调用方默认值。SSR 不读取浏览器候选或修改全局语言。应用若使用 Paraglide,仍需用该项目的 setLocale 同步应用翻译;内置 UI 字典的覆盖范围不因自定义 store 列表而自动增加。
|
|
273
101
|
|
|
274
|
-
|
|
275
|
-
- `hai-kit`:SvelteKit 集成
|
|
276
|
-
- `hai-iam`:IAM 模块 API(与 LoginForm/RegisterForm 配合)
|
|
277
|
-
- `hai-capacitor`:原生 App 开发(与 SafeArea/AppBar 配合)
|
|
278
|
-
- `hai-api-client`:客户端数据获取
|
|
102
|
+
会话失效时复用 createSessionRecovery + SessionRecoveryDialog,configure(公开配置, 原用户),recover 传给 Kit/API client recoverSession;卸载 cancel。标准登录携带 expectedUserId 限制原主体,明确认证拒绝可续接一次,结果不明的写入不重放。SensitiveOperationsForm 编辑权限的 sensitiveOperations;文件和数据库取并集,可信 API 授权与操作守卫仍必须执行。
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# 新手引导与帮助中心
|
|
2
|
+
|
|
3
|
+
`@h-ai/ui/guide` 提供 `createGuide`、`GuideHost`、`HelpCenter` 和相关类型。无需 init/close;driver.js 引擎在开始导览时动态加载,样式由 GuideHost 导入并跟随现有 DaisyUI 主题。
|
|
4
|
+
|
|
5
|
+
## 最小接入
|
|
6
|
+
|
|
7
|
+
下面的 `m`、`locale`、`currentUser`、`createUser` 来自应用。翻译 key 需要在应用中英日文消息文件定义;`nav` 使用当前宿主的公开导航适配器。
|
|
8
|
+
|
|
9
|
+
```svelte
|
|
10
|
+
<script lang='ts'>
|
|
11
|
+
import { createGuide, GuideHost } from '@h-ai/ui/guide'
|
|
12
|
+
import { createSvelteKitNavAdapter } from '@h-ai/kit/client'
|
|
13
|
+
import * as m from '$lib/paraglide/messages.js'
|
|
14
|
+
|
|
15
|
+
const guide = createGuide({
|
|
16
|
+
nav: createSvelteKitNavAdapter(),
|
|
17
|
+
persistKey: 'my-app-guide',
|
|
18
|
+
tours: [{
|
|
19
|
+
id: 'users',
|
|
20
|
+
version: 1,
|
|
21
|
+
route: '/users',
|
|
22
|
+
title: () => m.guide_users_title(),
|
|
23
|
+
description: () => m.guide_users_description(),
|
|
24
|
+
steps: [{
|
|
25
|
+
target: 'users-create',
|
|
26
|
+
title: () => m.guide_create_title(),
|
|
27
|
+
description: () => m.guide_create_description(),
|
|
28
|
+
}],
|
|
29
|
+
}],
|
|
30
|
+
articles: [{
|
|
31
|
+
id: 'users-help',
|
|
32
|
+
title: () => m.guide_users_title(),
|
|
33
|
+
content: () => m.guide_users_markdown(),
|
|
34
|
+
tourId: 'users',
|
|
35
|
+
}],
|
|
36
|
+
})
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<GuideHost {guide} {locale} scope={currentUser.id} autoStart='users' />
|
|
40
|
+
<Button onclick={() => guide.openHelp()}>{m.help()}</Button>
|
|
41
|
+
<Button data-guide='users-create' onclick={createUser}>{m.create_user()}</Button>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
每个布局只放一个宿主;实际目标按钮位于 `route` 对应的页面,跨页面调用时先导航再定位。SPA、Capacitor、Tauri 使用已有 `NavAdapter`;默认导航通过 location.assign 完整加载页面,GuideHost 用短期 sessionStorage 记录在目标页继续启动。
|
|
45
|
+
|
|
46
|
+
## 行为契约
|
|
47
|
+
|
|
48
|
+
| API / 配置 | 契约 |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| `resolveGuideText(text?)` | 将字符串或 i18n 回调解析为当前文本;宿主组件已自动调用,通常无需手动解析 |
|
|
51
|
+
| `guide.start(id)` | 手动启动或重看;返回 `Promise<boolean>`。失败返回 false,`guide.error` 为当前 UI 语言提示 |
|
|
52
|
+
| `guide.startIfNeeded(id)` | 尚未看过时提供首次邀请;返回 boolean,不直接跳转。通常由 GuideHost 的 autoStart 代劳 |
|
|
53
|
+
| `guide.openHelp(articleId?)` | 打开帮助中心,可直接定位文章;开始导览时自动关闭帮助弹窗 |
|
|
54
|
+
| `guide.stop()` | 取消等待并释放浮层,不记为完成;关闭按钮、Escape 和遮罩点击在首帧定位期间也会清除 busy,启动中的 start 返回 false |
|
|
55
|
+
| `guide.reset(id)` | 删除当前 scope 的偏好,使首次邀请可以再次显示 |
|
|
56
|
+
| `persistence` | `'cookie'`(默认)、`'localStorage'` 或 `'memory'`;受限存储在实例内回退到内存 |
|
|
57
|
+
| `persistKey` / `scope` / `version` | 应用、用户、引导版本独立记录;使用非敏感标识,不能用于权限校验 |
|
|
58
|
+
| `waitTimeout` | 元素等待上限,默认 3000ms;异步操作取消后不得回填旧状态 |
|
|
59
|
+
| `step.before(signal)` | 展开页签或抽屉等 UI 准备,返回 void 或 Promise;不得自动提交业务表单 |
|
|
60
|
+
| `step.optional` | 可选元素缺失可跳过;必要元素缺失必须停止,不能误记为完成 |
|
|
61
|
+
| `tour.enabled` / `article.enabled` | 依据现有权限或功能开关提供内容,不能代替业务授权 |
|
|
62
|
+
|
|
63
|
+
首次邀请提供开始、稍后、不再提醒。稍后暂缓一天;完成和不再提醒默认保存一年(Cookie)。关闭导览不等于完成;手动重看始终可用。切换账号或离开当前导览页面会清理交互。
|
|
64
|
+
|
|
65
|
+
## i18n、样式与边界
|
|
66
|
+
|
|
67
|
+
- 通用按钮、进度和错误由 UI 内置中英日文维护。业务文案使用 `() => m.key()` 延迟求值;GuideHost 的 locale 接入应用已有语言状态,不另建语言体系。
|
|
68
|
+
- 语言变化时宿主重新解析文案并刷新当前浮层。应用若采用整页重载或销毁组件切换语言,应按自身生命周期重新挂载宿主。
|
|
69
|
+
- 目标优先使用 `data-guide`,不依赖 Tailwind 类名或 DOM 顺序;现有 UI 组件支持 data 属性透传。复杂目标可用 `target: () => document.querySelector(...)`。
|
|
70
|
+
- 步骤标题和说明按纯文本显示;帮助正文使用现有安全 MarkdownRenderer,原始 HTML 关闭。
|
|
71
|
+
- 控制器在组件内创建,不能在 SSR 模块级共享用户状态。GuideHost 挂载前不读取浏览器记录,卸载时清理。
|
|
72
|
+
- 保留 Tailwind 对 UI 包的 `@source` 扫描。只改变应用局部 data-theme 时,body 浮层需要同步相同主题;标准 applyTheme 设置 html 的 data-theme,浮层会自动继承。
|
|
73
|
+
- HelpCenter 可独立作为帮助页面:提供 articles、可选 tours、locale、selectedId 和 onstart,无需自己实现搜索与安全 Markdown 渲染。
|
|
74
|
+
|
|
75
|
+
## 默认应用
|
|
76
|
+
|
|
77
|
+
fullstack 的 Web/App/Desktop 在共享 AdminWorkspace 中启用帮助入口、首次邀请和个人设置导览;Web 使用 Cookie,App/Desktop 使用 localStorage,按当前用户 ID 隔离。新增业务功能时,在共享 guide-store 和中英日文消息中补充文章、导览和稳定锚点。
|
|
78
|
+
|
|
79
|
+
验证首次提示、完成后刷新、手动重看、跳转后等待、缺失目标、账号/版本隔离、语言与主题、移动宽度、键盘和卸载取消。
|
|
80
|
+
|
|
81
|
+
帮助/导览是可选辅助区域。GuideHost 使用局部渲染边界,坏文章回调仅显示失败并释放遮罩/焦点,不能卸载业务兄弟区域;异步 before/target/引擎回调也须由控制器自行收敛。独立 HelpCenter 跳过失败文章并保留可用文章。
|