@h-ai/ui 0.1.0-alpha.66 → 0.1.0-alpha.68
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 +106 -55
- package/README.ja.md +106 -55
- package/README.md +137 -87
- package/dist/components/compounds/Accordion.svelte +24 -0
- package/dist/components/compounds/Accordion.svelte.d.ts +34 -0
- package/dist/components/compounds/ActionSheet.svelte +24 -0
- package/dist/components/compounds/ActionSheet.svelte.d.ts +38 -0
- package/dist/components/compounds/Alert.svelte +15 -4
- package/dist/components/compounds/Alert.svelte.d.ts +10 -0
- package/dist/components/compounds/AppBar.svelte +24 -0
- package/dist/components/compounds/AppBar.svelte.d.ts +33 -0
- package/dist/components/compounds/BottomNav.svelte +37 -0
- package/dist/components/compounds/BottomNav.svelte.d.ts +43 -0
- package/dist/components/compounds/Breadcrumb.svelte +11 -0
- package/dist/components/compounds/Breadcrumb.svelte.d.ts +20 -0
- package/dist/components/compounds/Calendar.svelte +20 -6
- package/dist/components/compounds/Calendar.svelte.d.ts +20 -6
- package/dist/components/compounds/Card.svelte +10 -0
- package/dist/components/compounds/Card.svelte.d.ts +10 -0
- package/dist/components/compounds/Combobox.svelte +35 -18
- package/dist/components/compounds/Combobox.svelte.d.ts +35 -18
- package/dist/components/compounds/Confirm.svelte +11 -0
- package/dist/components/compounds/Confirm.svelte.d.ts +21 -0
- package/dist/components/compounds/DataTable.svelte +40 -17
- package/dist/components/compounds/DataTable.svelte.d.ts +9 -13
- package/dist/components/compounds/DatePicker.svelte +20 -6
- package/dist/components/compounds/DatePicker.svelte.d.ts +20 -6
- package/dist/components/compounds/Drawer.svelte +11 -0
- package/dist/components/compounds/Drawer.svelte.d.ts +21 -0
- package/dist/components/compounds/Dropdown.svelte +10 -0
- package/dist/components/compounds/Dropdown.svelte.d.ts +10 -0
- package/dist/components/compounds/Empty.svelte +16 -5
- package/dist/components/compounds/Empty.svelte.d.ts +20 -0
- package/dist/components/compounds/Form.svelte +37 -2
- package/dist/components/compounds/Form.svelte.d.ts +20 -0
- package/dist/components/compounds/FormField.svelte +11 -0
- package/dist/components/compounds/FormField.svelte.d.ts +20 -0
- package/dist/components/compounds/FormLayout.svelte +13 -1
- package/dist/components/compounds/FormLayout.svelte.d.ts +13 -0
- package/dist/components/compounds/InfiniteScroll.svelte +24 -0
- package/dist/components/compounds/InfiniteScroll.svelte.d.ts +34 -0
- package/dist/components/compounds/MessageBoxContainer.svelte +11 -0
- package/dist/components/compounds/MessageBoxContainer.svelte.d.ts +21 -0
- package/dist/components/compounds/MessageBoxDialog.svelte +14 -0
- package/dist/components/compounds/MessageBoxDialog.svelte.d.ts +21 -0
- package/dist/components/compounds/MessageContainer.svelte +11 -0
- package/dist/components/compounds/MessageContainer.svelte.d.ts +21 -0
- package/dist/components/compounds/Modal.svelte +10 -0
- package/dist/components/compounds/Modal.svelte.d.ts +10 -0
- package/dist/components/compounds/PageHeader.svelte +21 -8
- package/dist/components/compounds/PageHeader.svelte.d.ts +21 -8
- package/dist/components/compounds/Pagination.svelte +34 -8
- package/dist/components/compounds/Pagination.svelte.d.ts +20 -0
- package/dist/components/compounds/Popover.svelte +11 -0
- package/dist/components/compounds/Popover.svelte.d.ts +20 -0
- package/dist/components/compounds/PullRefresh.svelte +24 -0
- package/dist/components/compounds/PullRefresh.svelte.d.ts +32 -0
- package/dist/components/compounds/Result.svelte +11 -0
- package/dist/components/compounds/Result.svelte.d.ts +20 -0
- package/dist/components/compounds/SafeArea.svelte +24 -0
- package/dist/components/compounds/SafeArea.svelte.d.ts +32 -0
- package/dist/components/compounds/Skeleton.svelte +10 -0
- package/dist/components/compounds/Skeleton.svelte.d.ts +10 -0
- package/dist/components/compounds/Steps.svelte +11 -0
- package/dist/components/compounds/Steps.svelte.d.ts +20 -0
- package/dist/components/compounds/SwipeCell.svelte +24 -0
- package/dist/components/compounds/SwipeCell.svelte.d.ts +37 -0
- package/dist/components/compounds/TableToolbar.svelte +66 -28
- package/dist/components/compounds/TableToolbar.svelte.d.ts +29 -19
- package/dist/components/compounds/Tabs.svelte +58 -10
- package/dist/components/compounds/Tabs.svelte.d.ts +10 -0
- package/dist/components/compounds/TagInput.svelte +11 -0
- package/dist/components/compounds/TagInput.svelte.d.ts +20 -0
- package/dist/components/compounds/Timeline.svelte +24 -0
- package/dist/components/compounds/Timeline.svelte.d.ts +34 -0
- package/dist/components/compounds/ToastContainer.svelte +11 -0
- package/dist/components/compounds/ToastContainer.svelte.d.ts +26 -0
- package/dist/components/compounds/Tooltip.svelte +11 -0
- package/dist/components/compounds/Tooltip.svelte.d.ts +22 -0
- package/dist/components/compounds/accordion-types.d.ts +10 -1
- package/dist/components/compounds/action-sheet-types.d.ts +9 -0
- package/dist/components/compounds/bottom-nav-types.d.ts +9 -0
- package/dist/components/compounds/swipe-cell-types.d.ts +9 -0
- package/dist/components/compounds/timeline-types.d.ts +9 -0
- package/dist/components/control-size.d.ts +17 -0
- package/dist/components/control-size.js +8 -0
- package/dist/components/primitives/Avatar.svelte +10 -0
- package/dist/components/primitives/Avatar.svelte.d.ts +10 -0
- package/dist/components/primitives/Badge.svelte +10 -0
- package/dist/components/primitives/Badge.svelte.d.ts +10 -0
- package/dist/components/primitives/BareButton.svelte +11 -0
- package/dist/components/primitives/BareButton.svelte.d.ts +20 -0
- package/dist/components/primitives/BareInput.svelte +11 -0
- package/dist/components/primitives/BareInput.svelte.d.ts +20 -0
- package/dist/components/primitives/Button.svelte +10 -0
- package/dist/components/primitives/Button.svelte.d.ts +10 -0
- package/dist/components/primitives/Checkbox.svelte +11 -0
- package/dist/components/primitives/Checkbox.svelte.d.ts +20 -0
- package/dist/components/primitives/IconButton.svelte +11 -0
- package/dist/components/primitives/IconButton.svelte.d.ts +20 -0
- package/dist/components/primitives/Input.svelte +10 -0
- package/dist/components/primitives/Input.svelte.d.ts +10 -0
- package/dist/components/primitives/Progress.svelte +11 -0
- package/dist/components/primitives/Progress.svelte.d.ts +20 -0
- package/dist/components/primitives/Radio.svelte +11 -0
- package/dist/components/primitives/Radio.svelte.d.ts +20 -0
- package/dist/components/primitives/Range.svelte +24 -0
- package/dist/components/primitives/Range.svelte.d.ts +34 -0
- package/dist/components/primitives/Rating.svelte +24 -0
- package/dist/components/primitives/Rating.svelte.d.ts +34 -0
- package/dist/components/primitives/Select.svelte +11 -0
- package/dist/components/primitives/Select.svelte.d.ts +21 -0
- package/dist/components/primitives/Spinner.svelte +11 -0
- package/dist/components/primitives/Spinner.svelte.d.ts +20 -0
- package/dist/components/primitives/Switch.svelte +11 -0
- package/dist/components/primitives/Switch.svelte.d.ts +20 -0
- package/dist/components/primitives/Tag.svelte +11 -0
- package/dist/components/primitives/Tag.svelte.d.ts +20 -0
- package/dist/components/primitives/Textarea.svelte +11 -0
- package/dist/components/primitives/Textarea.svelte.d.ts +21 -0
- package/dist/components/primitives/ToggleCheckbox.svelte +11 -0
- package/dist/components/primitives/ToggleCheckbox.svelte.d.ts +20 -0
- package/dist/components/primitives/ToggleInput.svelte +11 -0
- package/dist/components/primitives/ToggleInput.svelte.d.ts +20 -0
- package/dist/components/primitives/ToggleRadio.svelte +11 -0
- package/dist/components/primitives/ToggleRadio.svelte.d.ts +20 -0
- package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte +27 -0
- package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte.d.ts +27 -0
- package/dist/components/scenes/ai/AiDocumentEditor.svelte +79 -0
- package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +23 -0
- package/dist/components/scenes/ai/MarkdownRenderer.svelte +11 -0
- package/dist/components/scenes/ai/MarkdownRenderer.svelte.d.ts +28 -0
- package/dist/components/scenes/ai/code-preview.d.ts +28 -0
- package/dist/components/scenes/ai/code-preview.js +20 -0
- package/dist/components/scenes/ai/document-download.d.ts +52 -0
- package/dist/components/scenes/ai/document-download.js +30 -2
- package/dist/components/scenes/ai/document-parse.d.ts +71 -14
- package/dist/components/scenes/ai/document-parse.js +19 -9
- package/dist/components/scenes/ai/document-types.d.ts +222 -88
- package/dist/components/scenes/ai/editor-markdown-extensions.d.ts +16 -0
- package/dist/components/scenes/ai/editor-markdown-extensions.js +16 -0
- package/dist/components/scenes/ai/highlight.d.ts +11 -0
- package/dist/components/scenes/ai/highlight.js +11 -0
- package/dist/components/scenes/ai/markdown-parse.d.ts +8 -2
- package/dist/components/scenes/ai/markdown-parse.js +2 -2
- package/dist/components/scenes/ai/mermaid-host-sync.d.ts +38 -0
- package/dist/components/scenes/ai/mermaid-host-sync.js +30 -0
- package/dist/components/scenes/ai/mermaid-render.d.ts +23 -0
- package/dist/components/scenes/ai/mermaid-render.js +23 -0
- package/dist/components/scenes/ai/safe-html.d.ts +54 -6
- package/dist/components/scenes/ai/safe-html.js +54 -6
- package/dist/components/scenes/ai/table/AiTableEditor.svelte +48 -0
- package/dist/components/scenes/ai/table/AiTableEditor.svelte.d.ts +24 -0
- package/dist/components/scenes/ai/table/table-types.d.ts +79 -0
- package/dist/components/scenes/app/FeedbackModal.svelte +45 -5
- package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +45 -5
- package/dist/components/scenes/app/LanguageSwitch.svelte +29 -19
- package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +28 -19
- package/dist/components/scenes/app/SettingsLayout.svelte +21 -9
- package/dist/components/scenes/app/SettingsLayout.svelte.d.ts +21 -9
- package/dist/components/scenes/app/SettingsModal.svelte +23 -0
- package/dist/components/scenes/app/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/scenes/app/ThemeColorPicker.svelte +31 -0
- package/dist/components/scenes/app/ThemeColorPicker.svelte.d.ts +31 -0
- package/dist/components/scenes/app/ThemeSelector.svelte +21 -6
- package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +21 -6
- package/dist/components/scenes/app/ThemeToggle.svelte +21 -4
- package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +21 -4
- package/dist/components/scenes/app/index.d.ts +1 -1
- package/dist/components/scenes/app/index.js +1 -1
- package/dist/components/scenes/charts/Chart.svelte +11 -0
- package/dist/components/scenes/charts/Chart.svelte.d.ts +20 -0
- package/dist/components/scenes/charts/chart-theme.d.ts +25 -1
- package/dist/components/scenes/charts/chart-theme.js +25 -1
- package/dist/components/scenes/charts/chart-types.d.ts +83 -7
- package/dist/components/scenes/charts/renderers/LineChart.svelte +53 -0
- package/dist/components/scenes/charts/renderers/LineChart.svelte.d.ts +13 -0
- package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +10 -0
- package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +10 -0
- package/dist/components/scenes/crud/CrudDetailDrawer.svelte +8 -0
- package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +8 -0
- package/dist/components/scenes/crud/CrudDetailPanel.svelte +18 -0
- package/dist/components/scenes/crud/CrudDetailPanel.svelte.d.ts +18 -0
- package/dist/components/scenes/crud/CrudEditPanel.svelte +10 -0
- package/dist/components/scenes/crud/CrudEditPanel.svelte.d.ts +10 -0
- package/dist/components/scenes/crud/CrudFilterBar.svelte +18 -0
- package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +18 -0
- package/dist/components/scenes/crud/CrudPage.svelte +37 -5
- package/dist/components/scenes/crud/CrudPage.svelte.d.ts +35 -3
- package/dist/components/scenes/crud/crud-controller.svelte.d.ts +142 -23
- package/dist/components/scenes/crud/crud-controller.svelte.js +22 -11
- package/dist/components/scenes/crud/crud-form-validation.d.ts +12 -0
- package/dist/components/scenes/crud/crud-form-validation.js +12 -0
- package/dist/components/scenes/crud/crud-types.d.ts +79 -8
- package/dist/components/scenes/crud/nav-adapter.d.ts +14 -0
- package/dist/components/scenes/crud/nav-adapter.js +8 -0
- package/dist/components/scenes/crypto/EncryptedInput.svelte +24 -0
- package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +34 -0
- package/dist/components/scenes/crypto/HashDisplay.svelte +11 -0
- package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +21 -0
- package/dist/components/scenes/crypto/SignatureDisplay.svelte +11 -0
- package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +21 -0
- package/dist/components/scenes/error/ErrorPage.svelte +8 -1
- package/dist/components/scenes/error/ErrorPage.svelte.d.ts +8 -1
- package/dist/components/scenes/error/error-presets.d.ts +40 -4
- package/dist/components/scenes/error/error-presets.js +22 -2
- package/dist/components/scenes/guide/GuideHost.svelte +27 -0
- package/dist/components/scenes/guide/GuideHost.svelte.d.ts +27 -0
- package/dist/components/scenes/guide/HelpCenter.svelte +27 -0
- package/dist/components/scenes/guide/HelpCenter.svelte.d.ts +27 -0
- package/dist/components/scenes/iam/AuthPanel.svelte +26 -2
- package/dist/components/scenes/iam/AuthPanel.svelte.d.ts +25 -0
- package/dist/components/scenes/iam/AuthShell.svelte +8 -3
- package/dist/components/scenes/iam/AuthShell.svelte.d.ts +8 -3
- package/dist/components/scenes/iam/ChangePasswordForm.svelte +10 -0
- package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/ForgotPasswordForm.svelte +11 -0
- package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +21 -0
- package/dist/components/scenes/iam/LoginForm.svelte +24 -31
- package/dist/components/scenes/iam/LoginForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/PasswordInput.svelte +23 -0
- package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +23 -0
- package/dist/components/scenes/iam/PermGuard.svelte +21 -11
- package/dist/components/scenes/iam/PermGuard.svelte.d.ts +30 -0
- package/dist/components/scenes/iam/RegisterForm.svelte +10 -0
- package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/ResetPasswordForm.svelte +10 -0
- package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/UserProfile.svelte +11 -0
- package/dist/components/scenes/iam/UserProfile.svelte.d.ts +21 -0
- package/dist/components/scenes/iam/auth-error-message.d.ts +10 -0
- package/dist/components/scenes/iam/auth-error-message.js +10 -0
- package/dist/components/scenes/iam/password-utils.d.ts +39 -1
- package/dist/components/scenes/iam/password-utils.js +39 -1
- package/dist/components/scenes/iam/permission-context.svelte.d.ts +33 -23
- package/dist/components/scenes/iam/permission-context.svelte.js +20 -22
- package/dist/components/scenes/storage/AvatarUpload.svelte +11 -0
- package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +20 -0
- package/dist/components/scenes/storage/FileList.svelte +13 -2
- package/dist/components/scenes/storage/FileList.svelte.d.ts +20 -0
- package/dist/components/scenes/storage/FileUpload.svelte +37 -2
- package/dist/components/scenes/storage/FileUpload.svelte.d.ts +21 -0
- package/dist/components/scenes/storage/ImageUpload.svelte +11 -0
- package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +21 -0
- package/dist/components/scenes/types.d.ts +352 -11
- package/dist/guide-storage.d.ts +13 -1
- package/dist/guide-storage.js +13 -1
- package/dist/guide-types.d.ts +67 -2
- package/dist/guide.svelte.d.ts +22 -1
- package/dist/guide.svelte.js +22 -1
- package/dist/i18n.svelte.d.ts +64 -3
- package/dist/i18n.svelte.js +99 -18
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -2
- package/dist/internal/browser-safety.d.ts +51 -2
- package/dist/internal/browser-safety.js +45 -7
- package/dist/internal/form-context.d.ts +73 -0
- package/dist/internal/form-context.js +57 -0
- package/dist/internal/form-validation.svelte.d.ts +42 -0
- package/dist/internal/form-validation.svelte.js +26 -0
- package/dist/internal/icon-safety.d.ts +7 -0
- package/dist/internal/icon-safety.js +7 -0
- package/dist/internal/locale.d.ts +19 -0
- package/dist/internal/locale.js +21 -0
- package/dist/message.svelte.d.ts +90 -0
- package/dist/message.svelte.js +84 -0
- package/dist/messagebox.svelte.d.ts +61 -13
- package/dist/messagebox.svelte.js +55 -13
- package/dist/messages/en-US.json +6 -1
- package/dist/messages/ja-JP.json +389 -0
- package/dist/messages/zh-CN.json +6 -1
- package/dist/messages.d.ts +24 -3
- package/dist/messages.js +18 -3
- package/dist/styles/design-tokens.css +4 -2
- package/dist/styles/global.css +28 -8
- package/dist/styles/theme.css +2 -0
- package/dist/theme-config.d.ts +173 -0
- package/dist/theme-config.js +143 -0
- package/dist/toast.svelte.d.ts +114 -4
- package/dist/toast.svelte.js +108 -4
- package/dist/types.d.ts +526 -9
- package/dist/utils/platform.svelte.d.ts +28 -15
- package/dist/utils/platform.svelte.js +19 -14
- package/dist/utils.d.ts +102 -0
- package/dist/utils.js +93 -0
- package/package.json +66 -6
package/README.md
CHANGED
|
@@ -4,19 +4,31 @@
|
|
|
4
4
|
|
|
5
5
|
[框架首页](../../README.md) · 相关模块:[@h-ai/core](../core/README.md)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 简介
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
内置中英日文消息(`zh-CN` / `en-US` / `ja-JP`),语言选择器默认提供三种语言。
|
|
10
|
+
|
|
11
|
+
基于 Svelte 5 Runes 的多端 UI 组件库,采用 DaisyUI v5 + Tailwind CSS v4 样式 + Bits UI v2 headless 交互,内置 i18n(zh-CN / en-US),内置 15 个精选 DaisyUI 主题。
|
|
12
|
+
|
|
13
|
+
## 核心功能清单
|
|
14
|
+
|
|
15
|
+
- 表单、表格、弹窗、导航、图表与业务场景组件。
|
|
16
|
+
- 认证、CRUD、AI 内容展示、新手引导和帮助中心。
|
|
17
|
+
- Svelte 5、主题切换、响应式布局及中英日文组件文案。
|
|
18
|
+
|
|
19
|
+
## 使用入门
|
|
20
|
+
|
|
21
|
+
### 安装
|
|
10
22
|
|
|
11
23
|
```bash
|
|
12
|
-
npm install @h-ai/ui
|
|
24
|
+
npm install @h-ai/ui @h-ai/core
|
|
13
25
|
```
|
|
14
26
|
|
|
15
|
-
|
|
27
|
+
Node 服务端工程将 UI 与 core 都列为生产依赖,确保适配器保留 core 的日志和原生依赖加载。
|
|
16
28
|
|
|
17
|
-
|
|
29
|
+
### 快速开始
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
#### 1. 配置 svelte.config.js
|
|
20
32
|
|
|
21
33
|
```js
|
|
22
34
|
import { autoImportHaiUi } from '@h-ai/ui/auto-import'
|
|
@@ -33,7 +45,7 @@ const config = {
|
|
|
33
45
|
export default config
|
|
34
46
|
```
|
|
35
47
|
|
|
36
|
-
|
|
48
|
+
#### 2. 配置 vite.config.ts
|
|
37
49
|
|
|
38
50
|
```ts
|
|
39
51
|
import { haiOptimizeExclude, haiPrebundledDeps } from '@h-ai/ui/vite'
|
|
@@ -51,11 +63,13 @@ export default defineConfig({
|
|
|
51
63
|
// 避免首次进入业务路由时触发依赖再优化与整页刷新
|
|
52
64
|
include: [...haiPrebundledDeps],
|
|
53
65
|
},
|
|
54
|
-
ssr: { noExternal: [
|
|
66
|
+
ssr: { noExternal: ['@h-ai/ui', '@h-ai/kit'], external: ['@h-ai/core', 'sm-crypto'] },
|
|
55
67
|
})
|
|
56
68
|
```
|
|
57
69
|
|
|
58
|
-
|
|
70
|
+
使用 Crypto 或依赖它的 Kit/IAM 时,应用生产依赖需包含 `sm-crypto@0.5.7`。CLI 已配好这一项;手工接入时运行 `pnpm add sm-crypto@0.5.7`。仅设置 external 不够,adapter-node 还需要这项直接依赖声明才能保留原包加载。
|
|
71
|
+
|
|
72
|
+
#### 3. 配置 src/app.css
|
|
59
73
|
|
|
60
74
|
```css
|
|
61
75
|
@import 'tailwindcss';
|
|
@@ -76,7 +90,7 @@ export default defineConfig({
|
|
|
76
90
|
|
|
77
91
|
> `@source` 让 TailwindCSS 扫描 `@h-ai/ui` 组件中使用的 class 名,否则组件样式会丢失。嵌套应用位于 monorepo 中时,依赖包可能被提升到工作区根 `node_modules`,所以建议同时保留两条路径。
|
|
78
92
|
|
|
79
|
-
|
|
93
|
+
#### 4. 使用组件
|
|
80
94
|
|
|
81
95
|
```svelte
|
|
82
96
|
<script>
|
|
@@ -108,7 +122,7 @@ import { Button } from '@h-ai/ui/components/primitives/index'
|
|
|
108
122
|
import { getThemeInfo, THEMES } from '@h-ai/ui/theme'
|
|
109
123
|
```
|
|
110
124
|
|
|
111
|
-
|
|
125
|
+
#### data-* 属性透传
|
|
112
126
|
|
|
113
127
|
公开 Svelte 组件支持把调用方传入的 `data-*` 属性透传到组件根节点或主交互节点,便于测试选择器、埋点和自动化标记。普通未知属性不会被透传。
|
|
114
128
|
|
|
@@ -120,7 +134,7 @@ import { getThemeInfo, THEMES } from '@h-ai/ui/theme'
|
|
|
120
134
|
|
|
121
135
|
无需再为了 `data-testid` 单独封装按钮、输入框或弹层组件。
|
|
122
136
|
|
|
123
|
-
|
|
137
|
+
### 组件架构
|
|
124
138
|
|
|
125
139
|
组件按三层划分(primitives → compounds → scenes):
|
|
126
140
|
|
|
@@ -137,9 +151,9 @@ components/
|
|
|
137
151
|
└── crypto/ # 加密展示
|
|
138
152
|
```
|
|
139
153
|
|
|
140
|
-
|
|
154
|
+
### 组件清单
|
|
141
155
|
|
|
142
|
-
|
|
156
|
+
#### 原子组件 Primitives(20 个)
|
|
143
157
|
|
|
144
158
|
| 组件 | 描述 | 主要属性 |
|
|
145
159
|
| ---------------- | ------------ | ------------------------------------------------------------------ |
|
|
@@ -166,9 +180,9 @@ components/
|
|
|
166
180
|
|
|
167
181
|
`BareInput` 的 `file` 类型通过 `onchange` 读取 `event.currentTarget.files`,不绑定文件路径 `value`;其他输入类型可使用 `bind:value`。
|
|
168
182
|
|
|
169
|
-
|
|
183
|
+
#### 组合组件 Compounds(37 个)
|
|
170
184
|
|
|
171
|
-
|
|
185
|
+
##### 表单
|
|
172
186
|
|
|
173
187
|
| 组件 | 描述 | 主要属性 |
|
|
174
188
|
| ----------- | -------- | -------------------------------------------- |
|
|
@@ -177,7 +191,7 @@ components/
|
|
|
177
191
|
| `FormLayout` | 表单布局 | `columns`, `labelPosition`, `labelWidth` |
|
|
178
192
|
| `TagInput` | 标签输入 | `tags`, `maxTags`, `allowDuplicates`, `size` |
|
|
179
193
|
|
|
180
|
-
|
|
194
|
+
##### 表单布局与校验
|
|
181
195
|
|
|
182
196
|
`Form` 和可嵌入原生 `<form>` 的 `FormLayout` 共用 `columns={1 | 2}`、`labelPosition="top" | "left"`、`labelWidth`(默认 `8rem`)。默认单列、标签独立成行;双列在容器不足 `36rem` 时收为单列,同行标签在容器不足 `28rem` 时改为上下排列。
|
|
183
197
|
|
|
@@ -185,7 +199,7 @@ components/
|
|
|
185
199
|
|
|
186
200
|
标签自动关联内部 UI 控件;已有控件 ID 或原生控件使用 `<FormField for="control-id">`。错误/提示通过 `aria-describedby` 关联,错误控件带 `aria-invalid`,只显示一份字段提示。`label` / `error` / `hint` 支持字符串或延迟翻译函数。
|
|
187
201
|
|
|
188
|
-
`Input`、`Textarea`、`Select` 和 `PasswordInput`
|
|
202
|
+
`Input`、`Textarea`、`Select` 和 `PasswordInput` 的原生校验使用内置中英日文提示;`validationMessage` 只覆盖失败提示,不让有效输入一直无效。应用通过 UI 的 `setGlobalLocale` / `createLocaleStore` 同步语言,已显示的校验错误即时更新。`Textarea` 支持 `minlength` / `maxlength`,`Select` 支持 `name`、必填校验和 FormData 序列化。
|
|
189
203
|
|
|
190
204
|
字段首次失焦后显示前端校验错误,修正输入时即时更新;未访问的字段在提交时统一校验。CRUD 新增/编辑复用该行为,支持自定义校验文案,关闭重开清空校验状态。`Select` 在焦点离开触发器和选项后校验。`PasswordInput.minLength` 同时约束长度并用于强度计算;省略时不限制登录密码长度,强度计算仍以 8 位为基准。
|
|
191
205
|
|
|
@@ -206,14 +220,14 @@ components/
|
|
|
206
220
|
</Form>
|
|
207
221
|
```
|
|
208
222
|
|
|
209
|
-
|
|
223
|
+
##### 反馈
|
|
210
224
|
|
|
211
225
|
| 组件 | 描述 | 主要属性 |
|
|
212
226
|
| ---------------- | -------- | --------------------------------- |
|
|
213
227
|
| `Alert` | 警告框 | `variant`, `title`, `dismissible` |
|
|
214
228
|
| `ToastContainer` | 通知容器 | 全局放置,配合 `toast` 单例使用 |
|
|
215
229
|
|
|
216
|
-
|
|
230
|
+
##### 弹层
|
|
217
231
|
|
|
218
232
|
| 组件 | 描述 | 主要属性 |
|
|
219
233
|
| --------- | ------ | ------------------------------------------------------- |
|
|
@@ -222,7 +236,7 @@ components/
|
|
|
222
236
|
| `Confirm` | 确认框 | `open`, `title`, `message`, `variant`, `onconfirm` |
|
|
223
237
|
| `Popover` | 弹出层 | `open`, `position`, `trigger`, `offset`, `portal` |
|
|
224
238
|
|
|
225
|
-
|
|
239
|
+
##### 数据展示
|
|
226
240
|
|
|
227
241
|
| 组件 | 描述 | 主要属性 |
|
|
228
242
|
| ----------- | -------- | ---------------------------------------- |
|
|
@@ -231,7 +245,7 @@ components/
|
|
|
231
245
|
| `Accordion` | 手风琴 | `items: AccordionItem[]` |
|
|
232
246
|
| `Timeline` | 时间线 | `items: TimelineItem[]` |
|
|
233
247
|
|
|
234
|
-
|
|
248
|
+
##### Bits UI headless 交互
|
|
235
249
|
|
|
236
250
|
| 组件 | 描述 | 主要属性 |
|
|
237
251
|
| ------------ | --------------------------- | ----------------------------------------------------------- |
|
|
@@ -241,7 +255,7 @@ components/
|
|
|
241
255
|
|
|
242
256
|
> 日期值使用 `@internationalized/date` 的 `DateValue` / `CalendarDate` 类型。
|
|
243
257
|
|
|
244
|
-
|
|
258
|
+
##### 移动端 / 增强交互
|
|
245
259
|
|
|
246
260
|
| 组件 | 描述 | 主要属性 |
|
|
247
261
|
| ---------------- | ------------ | --------------------------------------------------- |
|
|
@@ -253,7 +267,7 @@ components/
|
|
|
253
267
|
| `SafeArea` | 安全区域容器 | `top`, `bottom`, `left`, `right` |
|
|
254
268
|
| `SwipeCell` | 滑动操作单元 | `leftActions`, `rightActions`, `threshold`, `onaction` |
|
|
255
269
|
|
|
256
|
-
|
|
270
|
+
##### 导航
|
|
257
271
|
|
|
258
272
|
| 组件 | 描述 | 主要属性 |
|
|
259
273
|
| ------------ | -------- | -------------------------------------------- |
|
|
@@ -264,7 +278,7 @@ components/
|
|
|
264
278
|
| `Dropdown` | 下拉菜单 | `items`, `trigger`, `triggerClass`, `position` |
|
|
265
279
|
| `Tooltip` | 提示 | `content`, `position`, `delay` |
|
|
266
280
|
|
|
267
|
-
|
|
281
|
+
##### 状态占位
|
|
268
282
|
|
|
269
283
|
| 组件 | 描述 | 主要属性 |
|
|
270
284
|
| ---------- | ------ | ------------------------------------- |
|
|
@@ -272,22 +286,22 @@ components/
|
|
|
272
286
|
| `Empty` | 空状态 | `title`, `description`, `icon` |
|
|
273
287
|
| `Result` | 结果页 | `status`, `title`, `description` |
|
|
274
288
|
|
|
275
|
-
|
|
289
|
+
##### 页面级
|
|
276
290
|
|
|
277
291
|
| 组件 | 描述 | 主要属性 |
|
|
278
292
|
| ------------ | -------- | ------------------------------------------- |
|
|
279
293
|
| `PageHeader` | 页面头部 | `title`, `description`,支持 `actions` 插槽 |
|
|
280
294
|
|
|
281
|
-
|
|
295
|
+
#### 场景组件 Scenes(36 个)
|
|
282
296
|
|
|
283
|
-
|
|
297
|
+
##### Guide 引导与帮助(2 个)
|
|
284
298
|
|
|
285
299
|
| 组件 | 描述 | 主要属性 |
|
|
286
300
|
| --- | --- | --- |
|
|
287
301
|
| `GuideHost` | 首次邀请、页面导览与帮助弹窗宿主 | `guide`, `locale`, `scope`, `autoStart` |
|
|
288
302
|
| `HelpCenter` | 可独立使用的帮助中心 | `articles`, `tours`, `locale`, `selectedId`, `onstart` |
|
|
289
303
|
|
|
290
|
-
|
|
304
|
+
##### App 应用级(7 个)
|
|
291
305
|
|
|
292
306
|
| 组件 | 描述 | 主要属性 |
|
|
293
307
|
| ---------------- | ---------------- | ------------------ |
|
|
@@ -299,13 +313,13 @@ components/
|
|
|
299
313
|
| `ThemeSelector` | 完整主题选择面板 | 无需 Props |
|
|
300
314
|
| `ThemeToggle` | 明/暗主题切换 | 无需 Props |
|
|
301
315
|
|
|
302
|
-
|
|
316
|
+
##### IAM 身份认证(10 个)
|
|
303
317
|
|
|
304
318
|
| 组件 | 描述 | 主要属性 |
|
|
305
319
|
| -------------------- | ---------- | ----------------------------------------------------- |
|
|
306
320
|
| `AuthPanel` | 配置驱动认证页 | `config`, `actions`, `loginHeader/loginFields/loginFooter`, `registerHeader/registerFields/registerFooter` |
|
|
307
321
|
| `AuthShell` | 认证页布局(居中卡片 / 左右分栏) | `variant`, `title`, `subtitle`, `brandTitle`, `brandText`, `illustration`, `description`, `highlights` |
|
|
308
|
-
| `LoginForm` | 登录表单 | `loading`, `errors`, `
|
|
322
|
+
| `LoginForm` | 登录表单 | `loading`, `errors`, `showForgotPassword`, `onsubmit` |
|
|
309
323
|
| `RegisterForm` | 注册表单 | `loading`, `errors`, `fields`, `onsubmit` |
|
|
310
324
|
| `ForgotPasswordForm` | 忘记密码 | `mode`, `loading`, `errors`, `onsubmit` |
|
|
311
325
|
| `ResetPasswordForm` | 重置密码 | `loading`, `errors`, `showCode`, `onsubmit` |
|
|
@@ -314,7 +328,7 @@ components/
|
|
|
314
328
|
| `PermGuard` | 权限守卫 | `permissions`, `mode`, `fallback` |
|
|
315
329
|
| `UserProfile` | 用户资料 | `user`, `editable`, `fields`, `avatarAccept`, `avatarHint`, `onsubmit` |
|
|
316
330
|
|
|
317
|
-
|
|
331
|
+
##### Storage 存储(4 个)
|
|
318
332
|
|
|
319
333
|
| 组件 | 描述 | 主要属性 |
|
|
320
334
|
| -------------- | -------- | -------------------------------------------------------- |
|
|
@@ -325,7 +339,7 @@ components/
|
|
|
325
339
|
|
|
326
340
|
上传组件不内置 presign、请求头或 PUT/POST 协议。应用层通过 `uploadHandler(file, { signal, onProgress })` 调用自己的 service,并返回 `{ url?, response? }`;图片和头像上传需要返回可展示的 `url`。未提供 handler 时,`FileUpload` 只选择文件,图片/头像组件只生成本地预览。
|
|
327
341
|
|
|
328
|
-
|
|
342
|
+
##### Crypto 加密展示(3 个)
|
|
329
343
|
|
|
330
344
|
输入变化立即清空 `encryptedValue`,只有当前输入的成功结果会回填;清空、回调替换和卸载均使旧请求失效。失败显示内置错误提示且密文保持为空;表单应仅在当前密文非空时提交需要加密的输入。
|
|
331
345
|
|
|
@@ -339,7 +353,7 @@ components/
|
|
|
339
353
|
|
|
340
354
|
默认算法与 `@h-ai/crypto` 对齐:加密输入使用 `SM4`,哈希展示使用 `SM3`,签名展示使用 `SM2`。
|
|
341
355
|
|
|
342
|
-
|
|
356
|
+
##### AI 文档与表格(4 个)
|
|
343
357
|
|
|
344
358
|
| 组件 | 描述 | 主要属性 / 能力 |
|
|
345
359
|
| ------------------------ | ---------------- | ---------------- |
|
|
@@ -369,7 +383,7 @@ components/
|
|
|
369
383
|
/>
|
|
370
384
|
```
|
|
371
385
|
|
|
372
|
-
|
|
386
|
+
##### Charts 图表
|
|
373
387
|
|
|
374
388
|
`Chart type='line'` 默认透传 LayerChart 原生折线图;需要监控看板常见的“分段线 + 圆点 + 最近点 hover + 竖向参考线”时,使用 `lineVariant='segmented-point'`:
|
|
375
389
|
|
|
@@ -388,7 +402,7 @@ components/
|
|
|
388
402
|
/>
|
|
389
403
|
```
|
|
390
404
|
|
|
391
|
-
|
|
405
|
+
##### CRUD 场景(5 个)
|
|
392
406
|
|
|
393
407
|
| 组件 | 描述 | 主要属性 / 能力 |
|
|
394
408
|
| -------------------- | ------------ | ---------------- |
|
|
@@ -401,10 +415,11 @@ components/
|
|
|
401
415
|
> `CrudPage` 默认使用 `TableToolbar` 图标弹层工具栏,也可通过 `toolbarStyle='filter-bar'` 切回平铺筛选栏;`detailColumns={['title']}` 可把标题等指定列绑定为详情入口;`toolbarLeading` 用于注入左侧标题或说明,配合 `showHeader={false}` 可避免重复标题;`toolbarActions` 注入右侧业务操作,`card` 插槽可将列表项替换为卡片视图,`tableCell` 可按行和列 key 渲染交互式单元格内容(例如 Tooltip),`sortableColumns` 控制服务端排序字段。过滤工具栏支持 `select`、`boolean`、`number`、`date`、`date-range`、`text`。
|
|
402
416
|
>
|
|
403
417
|
> 页面根容器会占满父级可用高度。表格无论是否有数据都会撑满剩余空间,仅数据区域滚动;表头固定在数据区顶部,分页栏固定在列表卡片底部。
|
|
418
|
+
> 宿主从视口外壳到内容区须逐层传递剩余高度(例如 `flex flex-1 min-h-0 flex-col`),中间包装层不能仅按内容自动计算高度。空表、少量数据和长列表均沿用底部分页。
|
|
404
419
|
>
|
|
405
420
|
> 表格列会优先压缩到 7rem 并截断超长文本;列总宽度仍超过容器时才显示横向滚动条。操作列固定在右侧,横向滚动时保持可见。
|
|
406
421
|
|
|
407
|
-
|
|
422
|
+
##### 错误页场景(1 个)
|
|
408
423
|
|
|
409
424
|
| 组件 | 描述 | 主要属性 / 能力 |
|
|
410
425
|
| ----------- | ------------ | ---------------- |
|
|
@@ -435,9 +450,9 @@ components/
|
|
|
435
450
|
>
|
|
436
451
|
> `Tabs` 支持惰性页签:`lazy` 开启后未激活过的页签内容不渲染(`children` 提供 `isActivated(key)` 判断),`onactivate(key)` 在页签首次激活时触发一次,适合配合 `createCrudController({ autoLoad: false })` 在首次可见时才加载。
|
|
437
452
|
|
|
438
|
-
|
|
453
|
+
### 使用示例
|
|
439
454
|
|
|
440
|
-
|
|
455
|
+
#### Toast 通知
|
|
441
456
|
|
|
442
457
|
```svelte
|
|
443
458
|
<script>
|
|
@@ -457,7 +472,7 @@ components/
|
|
|
457
472
|
|
|
458
473
|
> 已内置 `notifySuccess` / `notifyError` / `notifyInfo` / `notifyWarning` 封装,业务应用无需自建 toast 工具文件:`notifyError(err, fallback?)` 接受 `Error` 或字符串并内置兑底文案,默认成功 3s / 失败 5s。
|
|
459
474
|
|
|
460
|
-
|
|
475
|
+
#### Message 消息提示
|
|
461
476
|
|
|
462
477
|
```svelte
|
|
463
478
|
<script>
|
|
@@ -475,7 +490,7 @@ components/
|
|
|
475
490
|
<MessageContainer />
|
|
476
491
|
```
|
|
477
492
|
|
|
478
|
-
|
|
493
|
+
#### 典型 CRUD 页面
|
|
479
494
|
|
|
480
495
|
```svelte
|
|
481
496
|
<script>
|
|
@@ -545,7 +560,7 @@ components/
|
|
|
545
560
|
|
|
546
561
|
`Modal` 不传 `title` / `header` 时会保留右上角关闭按钮,但不额外渲染整条头部。需要调整圆角时可传 `radius="1.4rem"`,内部下拉等浮层需要越界显示时可传 `bodyOverflow="visible"`。
|
|
547
562
|
|
|
548
|
-
|
|
563
|
+
#### 声明式 CRUD 页面(CrudPage)
|
|
549
564
|
|
|
550
565
|
```svelte
|
|
551
566
|
<script lang='ts'>
|
|
@@ -571,7 +586,7 @@ components/
|
|
|
571
586
|
|
|
572
587
|
> 抽屉形式可改用 `form={{ variant: 'drawer', drawerWidth: '40rem' }}`;用户拖动后的宽度会覆盖初始宽度并按资源记忆。
|
|
573
588
|
|
|
574
|
-
|
|
589
|
+
#### 登录页面
|
|
575
590
|
|
|
576
591
|
```svelte
|
|
577
592
|
<script>
|
|
@@ -597,7 +612,7 @@ components/
|
|
|
597
612
|
<LoginForm {loading} {errors} onsubmit={handleLogin} showRegisterLink />
|
|
598
613
|
```
|
|
599
614
|
|
|
600
|
-
|
|
615
|
+
#### PasswordInput 受控模式
|
|
601
616
|
|
|
602
617
|
```svelte
|
|
603
618
|
<script>
|
|
@@ -614,7 +629,7 @@ components/
|
|
|
614
629
|
/>
|
|
615
630
|
```
|
|
616
631
|
|
|
617
|
-
|
|
632
|
+
### 样式依赖
|
|
618
633
|
|
|
619
634
|
组件基于 TailwindCSS v4 + DaisyUI。应用层 `app.css` 需要以下配置:
|
|
620
635
|
|
|
@@ -653,7 +668,7 @@ components/
|
|
|
653
668
|
</div>
|
|
654
669
|
```
|
|
655
670
|
|
|
656
|
-
|
|
671
|
+
#### 图标
|
|
657
672
|
|
|
658
673
|
组件使用 Iconify (Tabler Icons):
|
|
659
674
|
|
|
@@ -668,7 +683,7 @@ npm install -D @iconify/tailwind4 @iconify-json/tabler
|
|
|
668
683
|
}
|
|
669
684
|
```
|
|
670
685
|
|
|
671
|
-
|
|
686
|
+
#### 主题切换
|
|
672
687
|
|
|
673
688
|
使用内置的主题工具函数管理 15 个精选 DaisyUI 主题:
|
|
674
689
|
|
|
@@ -712,49 +727,16 @@ const themeBootstrapScript = createThemeBootstrapScript({
|
|
|
712
727
|
transformPageChunk: ({ html }) => html.replace('%theme_bootstrap%', themeBootstrapScript)
|
|
713
728
|
```
|
|
714
729
|
|
|
715
|
-
|
|
730
|
+
### 国际化 (i18n)
|
|
716
731
|
|
|
717
732
|
@h-ai/ui 采用**组件内置翻译**模式:
|
|
718
733
|
|
|
719
|
-
- 场景组件(`scenes
|
|
734
|
+
- 场景组件(`scenes/`)内置中英日文翻译(zh-CN / en-US / ja-JP),开箱即用
|
|
720
735
|
- 组件自动响应全局 locale 变化(通过 `@h-ai/core` 同步)
|
|
721
736
|
- 应用层只需处理**页面级文本**,组件内部文本由 @h-ai/ui 统一管理
|
|
722
737
|
- 如需覆盖特定文本,通过 `submitText`、`labels` 等 props 传入
|
|
723
738
|
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
协议支持 `agreements.userAgreementMarkdown` 与 `privacyPolicyMarkdown` 直接从配置加载;YAML 的 `|` 保留 Markdown 段落和换行。弹窗复用安全 MarkdownRenderer,关闭原始 HTML、脚本和代码复制工具。同主题同时提供正文与 URL 时优先正文,URL 可作为额外查看入口;只有 URL 时使用隔离 iframe。
|
|
727
|
-
|
|
728
|
-
```yaml
|
|
729
|
-
agreements:
|
|
730
|
-
showOnRegister: true
|
|
731
|
-
showOnLogin: false
|
|
732
|
-
userAgreementMarkdown: |
|
|
733
|
-
# 用户协议
|
|
734
|
-
|
|
735
|
-
**账户使用条款**
|
|
736
|
-
|
|
737
|
-
- 请妥善保管账户凭据。
|
|
738
|
-
privacyPolicyMarkdown: |
|
|
739
|
-
# 隐私政策
|
|
740
|
-
|
|
741
|
-
注册资料用于账户管理,会话信息用于身份认证。
|
|
742
|
-
# 可选 URL;同主题同时配置 Markdown 和 URL 时,弹窗优先显示 Markdown。
|
|
743
|
-
# userAgreementUrl: https://example.com/terms
|
|
744
|
-
# privacyPolicyUrl: https://example.com/privacy
|
|
745
|
-
```
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
AuthPanel 直接接收 IAM 白名单配置和 actions,内置登录(密码/LDAP/邮件/短信)、注册、找回、重置及协议展示。使用 `config.ui` 配置卡片/分栏、标题、品牌、Logo 和配图。`LoginForm` 提供 methods、onsendotp、otpLength、resendInterval;密码表单接受 passwordPolicy。组件只渲染与交互,网络和 Token 存储通过 actions 注入。认证场景按公开 IAM 错误码显示当前 UI 语言的提示,应用自定义错误保留原文。
|
|
750
|
-
|
|
751
|
-
AuthPanel 在 SSR 阶段禁用原生表单控件,客户端挂载并绑定事件后自动开放输入,避免接管时丢失早到的输入。应用无需额外的就绪适配;E2E 等待控件可编辑,并覆盖客户端脚本延迟加载的场景。
|
|
752
|
-
|
|
753
|
-
认证链接指向当前完整 URL 时,AuthPanel 只切换场景并阻止重复导航,返回登录后可立即输入。路径、查询串或 hash 不同时交给应用路由处理;Ctrl/Cmd 等修改键点击保留浏览器行为。
|
|
754
|
-
|
|
755
|
-
[完整 IAM 配置 / IAM configuration](../iam/README.md)
|
|
756
|
-
|
|
757
|
-
### createLocaleStore
|
|
739
|
+
#### createLocaleStore
|
|
758
740
|
|
|
759
741
|
用于客户端 locale 状态管理,自动同步到 `@h-ai/core` 全局 locale 管理器:
|
|
760
742
|
|
|
@@ -778,7 +760,9 @@ AuthPanel 在 SSR 阶段禁用原生表单控件,客户端挂载并绑定事
|
|
|
778
760
|
</select>
|
|
779
761
|
```
|
|
780
762
|
|
|
781
|
-
|
|
763
|
+
`@h-ai/ui/i18n` 的 `createLocaleStore` 按“可解析的持久化值 → 完整 navigator.languages(再检查 navigator.language)→ defaultLocale → 支持列表首项”选择语言;首个不支持的候选不触发默认回退。匹配大小写、语言简写及逐级区域/脚本回退,返回 supportedLocales 中的配置代码;同语言多个变体按列表顺序选择。detectBrowserLocale 无实际命中返回 null,不插入框架默认值;空支持列表最终保留调用方默认值。SSR 不读取浏览器候选或修改全局语言。应用若使用 Paraglide,仍需用该项目的 setLocale 同步应用翻译;内置 UI 字典的覆盖范围不因自定义 store 列表而自动增加。
|
|
764
|
+
|
|
765
|
+
#### 导出的 i18n 工具
|
|
782
766
|
|
|
783
767
|
```ts
|
|
784
768
|
import {
|
|
@@ -811,10 +795,44 @@ import {
|
|
|
811
795
|
|
|
812
796
|
上例的 subscribe 为应用自身的 $state,应用包装 register 动作校验/提交扩展业务数据;如需单独组合表单,使用 `<RegisterForm> {#snippet extraFields()}...{/snippet} </RegisterForm>`。扩展里的按钮须为 `type="button"`,避免误提交。
|
|
813
797
|
|
|
798
|
+
### 配置驱动认证页面
|
|
799
|
+
|
|
800
|
+
密码登录只提交 `identifier` 和 `password`;`AuthPanel` 将 `LoginForm` 的 `username` 映射为 `identifier`。会话有效期由服务端 `session.maxAge` / `session.refreshTokenMaxAge` 配置决定,登录表单不提供按次登录的持久会话选项。
|
|
801
|
+
|
|
802
|
+
协议支持 `agreements.userAgreementMarkdown` 与 `privacyPolicyMarkdown` 直接从配置加载;YAML 的 `|` 保留 Markdown 段落和换行。弹窗复用安全 MarkdownRenderer,关闭原始 HTML、脚本和代码复制工具。同主题同时提供正文与 URL 时优先正文,URL 可作为额外查看入口;只有 URL 时使用隔离 iframe。
|
|
803
|
+
|
|
804
|
+
```yaml
|
|
805
|
+
agreements:
|
|
806
|
+
showOnRegister: true
|
|
807
|
+
showOnLogin: false
|
|
808
|
+
userAgreementMarkdown: |
|
|
809
|
+
# 用户协议
|
|
810
|
+
|
|
811
|
+
**账户使用条款**
|
|
812
|
+
|
|
813
|
+
- 请妥善保管账户凭据。
|
|
814
|
+
privacyPolicyMarkdown: |
|
|
815
|
+
# 隐私政策
|
|
814
816
|
|
|
815
|
-
|
|
817
|
+
注册资料用于账户管理,会话信息用于身份认证。
|
|
818
|
+
# 可选 URL;同主题同时配置 Markdown 和 URL 时,弹窗优先显示 Markdown。
|
|
819
|
+
# userAgreementUrl: https://example.com/terms
|
|
820
|
+
# privacyPolicyUrl: https://example.com/privacy
|
|
821
|
+
```
|
|
816
822
|
|
|
817
|
-
|
|
823
|
+
|
|
824
|
+
|
|
825
|
+
AuthPanel 直接接收 IAM 白名单配置和 actions,内置登录(密码/LDAP/邮件/短信)、注册、找回、重置及协议展示。使用 `config.ui` 配置卡片/分栏、标题、品牌、Logo 和配图。`LoginForm` 提供 methods、onsendotp、otpLength、resendInterval;密码表单接受 passwordPolicy。组件只渲染与交互,网络和 Token 存储通过 actions 注入。认证场景按公开 IAM 错误码显示当前 UI 语言的提示,应用自定义错误保留原文。
|
|
826
|
+
|
|
827
|
+
AuthPanel 在 SSR 阶段禁用原生表单控件,客户端挂载并绑定事件后自动开放输入,避免接管时丢失早到的输入。应用无需额外的就绪适配;E2E 等待控件可编辑,并覆盖客户端脚本延迟加载的场景。
|
|
828
|
+
|
|
829
|
+
认证链接指向当前完整 URL 时,AuthPanel 只切换场景并阻止重复导航,返回登录后可立即输入。路径、查询串或 hash 不同时交给应用路由处理;Ctrl/Cmd 等修改键点击保留浏览器行为。
|
|
830
|
+
|
|
831
|
+
[完整 IAM 配置 / IAM configuration](../iam/README.md)
|
|
832
|
+
|
|
833
|
+
### 新手引导与帮助中心
|
|
834
|
+
|
|
835
|
+
`@h-ai/ui/guide` 提供 `createGuide`、`GuideHost`、`HelpCenter` 和相关类型。无需 init/close;引擎在开始导览时按需加载,浮层复用当前主题。组件内置中英日文按钮、进度和错误提示,业务内容使用应用 i18n。
|
|
818
836
|
|
|
819
837
|
同一入口的 `resolveGuideText(text?)` 可解析字符串或 i18n 回调;宿主组件已自动解析文案。
|
|
820
838
|
|
|
@@ -865,7 +883,7 @@ import {
|
|
|
865
883
|
|
|
866
884
|
admin-console 示例和 CLI fullstack Web/App/Desktop 默认包含帮助入口、首次邀请及个人资料导览。完整配置和验证场景见 [引导指南](../cli/templates/skills/hai-ui/guide.md)。
|
|
867
885
|
|
|
868
|
-
|
|
886
|
+
### 其他导出
|
|
869
887
|
|
|
870
888
|
```ts
|
|
871
889
|
// 类型
|
|
@@ -881,3 +899,35 @@ import { cn, generateId, getSizeClass, getVariantClass } from '@h-ai/ui'
|
|
|
881
899
|
// Toast 单例
|
|
882
900
|
import { toast } from '@h-ai/ui'
|
|
883
901
|
```
|
|
902
|
+
|
|
903
|
+
|
|
904
|
+
组件子路径只开放 package.exports 明确列出的 barrel,例如 `@h-ai/ui/components/primitives/index`;不开放任意组件实现或内部存储辅助函数。宿主剪贴板注册仍是公开能力。
|
|
905
|
+
|
|
906
|
+
### 请求语言隔离
|
|
907
|
+
|
|
908
|
+
Node 请求与 SSR 使用 `core.i18n.runWithLocale(locale, () => handleRequest())`;SvelteKit 可使用 `kit.i18n.runWithLocale(locale, () => resolve(event))`,serv 自动按请求头建立上下文。异步子任务继承请求语言,优先级为显式 `MessageOptions.locale`、请求语言、进程启动默认语言。`setGlobalLocale` 在请求上下文中只更新当前请求;上下文外仅用于启动默认值,不能在请求 hook 中调用它修改默认值。
|
|
909
|
+
|
|
910
|
+
浏览器继续使用应用级 `setGlobalLocale` / `createLocaleStore`。SSR 的 UI store 初始化和 setter 只修改自身状态,不写全局语言;UI 消息从请求上下文读取。`runWithLocale` 仅支持 Node 入口,浏览器通过显式 locale 或应用状态翻译。
|
|
911
|
+
|
|
912
|
+
## 输入约束与 HTTP 能力
|
|
913
|
+
|
|
914
|
+
存储 key 按 UTF-8 最多 1024 字节,并拒绝绝对路径、反斜线、控制字符及点路径段;公开 HTTP 批量删除每次 1–1000 项。`@h-ai/storage/schemas` 提供浏览器安全的共同规则。预签名有效期为整数 1–604800 秒(Node 默认 3600,HTTP 默认 900);HTTP 上传仅接受 key/contentType/expiresIn,不支持 contentLength/maxSize/metadata/checksum。无效输入返回 HTTP 400,typed client 映射 VALIDATION_FAILED。FileUpload 的大小/类型限制仅为前端体验,实际对象须由应用服务端复核。Node 流式读写/checksum/条件写等没有默认 HTTP 端点。完整映射与授权边界见 [存储 API 能力](../storage/README.md#存储输入约束与跨端能力)。
|
|
915
|
+
|
|
916
|
+
## 开发测试
|
|
917
|
+
|
|
918
|
+
```sh
|
|
919
|
+
pnpm --filter @h-ai/ui typecheck
|
|
920
|
+
pnpm --filter @h-ai/ui lint
|
|
921
|
+
pnpm --filter @h-ai/ui build
|
|
922
|
+
pnpm --filter @h-ai/ui test
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
## 设计与交互验收
|
|
926
|
+
|
|
927
|
+
页面设计使用 [hai-ui-design](../cli/templates/skills/hai-ui-design/SKILL.md),组件实现使用 [hai-ui](../cli/templates/skills/hai-ui/SKILL.md),真实界面走查使用 [hai-ui-review](../cli/templates/skills/hai-ui-review/SKILL.md)。[设计约定](../../.agents/instructions/ui-design.md) 说明布局、状态和示例。
|
|
928
|
+
|
|
929
|
+
Tabs 支持方向键/Home/End、禁用项跳过和单一 Tab 入口;表格提供排序与加载状态和行键盘操作;分页导航/输入名称跟随语言,外部页码同步跳页输入;工具栏弹层管理焦点,视图按钮提供选中状态。Empty/Alert 支持长内容换行。theme.css 引入共享 tokens,焦点跟随当前主题,global.css 响应减少动态效果。应用仍需接入实际筛选、排序、分页与失败恢复。
|
|
930
|
+
|
|
931
|
+
## 许可证
|
|
932
|
+
|
|
933
|
+
Apache-2.0
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<!--
|
|
2
|
+
@component Accordion
|
|
2
3
|
=============================================================================
|
|
3
4
|
@h-ai/ui - Accordion 组件
|
|
4
5
|
=============================================================================
|
|
@@ -7,6 +8,16 @@
|
|
|
7
8
|
使用 Svelte 5 Runes ($props, $state, $derived)
|
|
8
9
|
使用 DaisyUI collapse 类
|
|
9
10
|
=============================================================================
|
|
11
|
+
|
|
12
|
+
@example
|
|
13
|
+
```ts
|
|
14
|
+
import { mount, unmount } from 'svelte'
|
|
15
|
+
import type { ComponentProps } from 'svelte'
|
|
16
|
+
import { Accordion } from '@h-ai/ui'
|
|
17
|
+
const props: ComponentProps<typeof Accordion> = { items: [{ id: 'intro', title: '简介', content: '操作说明' }], value: 'intro' }
|
|
18
|
+
const component = mount(Accordion, { target: document.body, props })
|
|
19
|
+
await unmount(component)
|
|
20
|
+
```
|
|
10
21
|
-->
|
|
11
22
|
|
|
12
23
|
<script lang='ts'>
|
|
@@ -17,6 +28,19 @@
|
|
|
17
28
|
import ToggleCheckbox from '../primitives/ToggleCheckbox.svelte'
|
|
18
29
|
import ToggleRadio from '../primitives/ToggleRadio.svelte'
|
|
19
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Accordion 组件的属性契约;通过公开组件配置使用。
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { mount, unmount } from 'svelte'
|
|
37
|
+
* import type { ComponentProps } from 'svelte'
|
|
38
|
+
* import { Accordion } from '@h-ai/ui'
|
|
39
|
+
* const props: ComponentProps<typeof Accordion> = { items: [{ id: 'intro', title: '简介', content: '操作说明' }], value: 'intro' }
|
|
40
|
+
* const component = mount(Accordion, { target: document.body, props })
|
|
41
|
+
* await unmount(component)
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
20
44
|
interface Props {
|
|
21
45
|
/** 折叠项数据 */
|
|
22
46
|
items: AccordionItem[]
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import type { Snippet } from 'svelte';
|
|
2
2
|
import type { DataAttributes } from '../../types.js';
|
|
3
3
|
import type { AccordionItem } from './accordion-types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Accordion 组件的属性契约;通过公开组件配置使用。
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { mount, unmount } from 'svelte'
|
|
10
|
+
* import type { ComponentProps } from 'svelte'
|
|
11
|
+
* import { Accordion } from '@h-ai/ui'
|
|
12
|
+
* const props: ComponentProps<typeof Accordion> = { items: [{ id: 'intro', title: '简介', content: '操作说明' }], value: 'intro' }
|
|
13
|
+
* const component = mount(Accordion, { target: document.body, props })
|
|
14
|
+
* await unmount(component)
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
4
17
|
interface Props {
|
|
5
18
|
/** 折叠项数据 */
|
|
6
19
|
items: AccordionItem[];
|
|
@@ -22,6 +35,27 @@ interface Props {
|
|
|
22
35
|
children?: Snippet<[AccordionItem]>;
|
|
23
36
|
}
|
|
24
37
|
type $$ComponentProps = Props & DataAttributes;
|
|
38
|
+
/**
|
|
39
|
+
* Accordion
|
|
40
|
+
* =============================================================================
|
|
41
|
+
* @h-ai/ui - Accordion 组件
|
|
42
|
+
* =============================================================================
|
|
43
|
+
* 手风琴/折叠面板组件,支持单选/多选模式、多种样式变体
|
|
44
|
+
*
|
|
45
|
+
* 使用 Svelte 5 Runes ($props, $state, $derived)
|
|
46
|
+
* 使用 DaisyUI collapse 类
|
|
47
|
+
* =============================================================================
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* import { mount, unmount } from 'svelte'
|
|
52
|
+
* import type { ComponentProps } from 'svelte'
|
|
53
|
+
* import { Accordion } from '@h-ai/ui'
|
|
54
|
+
* const props: ComponentProps<typeof Accordion> = { items: [{ id: 'intro', title: '简介', content: '操作说明' }], value: 'intro' }
|
|
55
|
+
* const component = mount(Accordion, { target: document.body, props })
|
|
56
|
+
* await unmount(component)
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
25
59
|
declare const Accordion: import("svelte").Component<$$ComponentProps, {}, "value">;
|
|
26
60
|
type Accordion = ReturnType<typeof Accordion>;
|
|
27
61
|
export default Accordion;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<!--
|
|
2
|
+
@component ActionSheet
|
|
2
3
|
@h-ai/ui — ActionSheet(底部操作菜单)
|
|
3
4
|
|
|
4
5
|
用法:
|
|
@@ -11,6 +12,16 @@
|
|
|
11
12
|
onselect={(id) => handleAction(id)}
|
|
12
13
|
onclose={() => showActions = false}
|
|
13
14
|
/>
|
|
15
|
+
|
|
16
|
+
@example
|
|
17
|
+
```ts
|
|
18
|
+
import { mount, unmount } from 'svelte'
|
|
19
|
+
import type { ComponentProps } from 'svelte'
|
|
20
|
+
import { ActionSheet } from '@h-ai/ui'
|
|
21
|
+
const props: ComponentProps<typeof ActionSheet> = { open: true, items: [{ id: 'remove', label: '删除', destructive: true }] }
|
|
22
|
+
const component = mount(ActionSheet, { target: document.body, props })
|
|
23
|
+
await unmount(component)
|
|
24
|
+
```
|
|
14
25
|
-->
|
|
15
26
|
<script lang='ts'>
|
|
16
27
|
import type { DataAttributes } from '../../types.js'
|
|
@@ -20,6 +31,19 @@
|
|
|
20
31
|
// eslint-disable-next-line no-import-assign -- type re-export
|
|
21
32
|
export type { ActionSheetItem }
|
|
22
33
|
|
|
34
|
+
/**
|
|
35
|
+
* ActionSheet 组件的属性契约;通过公开组件配置使用。
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* import { mount, unmount } from 'svelte'
|
|
40
|
+
* import type { ComponentProps } from 'svelte'
|
|
41
|
+
* import { ActionSheet } from '@h-ai/ui'
|
|
42
|
+
* const props: ComponentProps<typeof ActionSheet> = { open: true, items: [{ id: 'remove', label: '删除', destructive: true }] }
|
|
43
|
+
* const component = mount(ActionSheet, { target: document.body, props })
|
|
44
|
+
* await unmount(component)
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
23
47
|
interface Props {
|
|
24
48
|
/** 是否显示 */
|
|
25
49
|
open?: boolean
|