@h-ai/ui 0.1.0-alpha.67 → 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.
Files changed (286) hide show
  1. package/README.en.md +31 -5
  2. package/README.ja.md +31 -5
  3. package/README.md +64 -38
  4. package/dist/components/compounds/Accordion.svelte +24 -0
  5. package/dist/components/compounds/Accordion.svelte.d.ts +34 -0
  6. package/dist/components/compounds/ActionSheet.svelte +24 -0
  7. package/dist/components/compounds/ActionSheet.svelte.d.ts +38 -0
  8. package/dist/components/compounds/Alert.svelte +15 -4
  9. package/dist/components/compounds/Alert.svelte.d.ts +10 -0
  10. package/dist/components/compounds/AppBar.svelte +24 -0
  11. package/dist/components/compounds/AppBar.svelte.d.ts +33 -0
  12. package/dist/components/compounds/BottomNav.svelte +37 -0
  13. package/dist/components/compounds/BottomNav.svelte.d.ts +43 -0
  14. package/dist/components/compounds/Breadcrumb.svelte +11 -0
  15. package/dist/components/compounds/Breadcrumb.svelte.d.ts +20 -0
  16. package/dist/components/compounds/Calendar.svelte +20 -6
  17. package/dist/components/compounds/Calendar.svelte.d.ts +20 -6
  18. package/dist/components/compounds/Card.svelte +10 -0
  19. package/dist/components/compounds/Card.svelte.d.ts +10 -0
  20. package/dist/components/compounds/Combobox.svelte +35 -18
  21. package/dist/components/compounds/Combobox.svelte.d.ts +35 -18
  22. package/dist/components/compounds/Confirm.svelte +11 -0
  23. package/dist/components/compounds/Confirm.svelte.d.ts +21 -0
  24. package/dist/components/compounds/DataTable.svelte +40 -17
  25. package/dist/components/compounds/DataTable.svelte.d.ts +9 -13
  26. package/dist/components/compounds/DatePicker.svelte +20 -6
  27. package/dist/components/compounds/DatePicker.svelte.d.ts +20 -6
  28. package/dist/components/compounds/Drawer.svelte +11 -0
  29. package/dist/components/compounds/Drawer.svelte.d.ts +21 -0
  30. package/dist/components/compounds/Dropdown.svelte +10 -0
  31. package/dist/components/compounds/Dropdown.svelte.d.ts +10 -0
  32. package/dist/components/compounds/Empty.svelte +16 -5
  33. package/dist/components/compounds/Empty.svelte.d.ts +20 -0
  34. package/dist/components/compounds/Form.svelte +37 -2
  35. package/dist/components/compounds/Form.svelte.d.ts +20 -0
  36. package/dist/components/compounds/FormField.svelte +11 -0
  37. package/dist/components/compounds/FormField.svelte.d.ts +20 -0
  38. package/dist/components/compounds/FormLayout.svelte +13 -1
  39. package/dist/components/compounds/FormLayout.svelte.d.ts +13 -0
  40. package/dist/components/compounds/InfiniteScroll.svelte +24 -0
  41. package/dist/components/compounds/InfiniteScroll.svelte.d.ts +34 -0
  42. package/dist/components/compounds/MessageBoxContainer.svelte +11 -0
  43. package/dist/components/compounds/MessageBoxContainer.svelte.d.ts +21 -0
  44. package/dist/components/compounds/MessageBoxDialog.svelte +14 -0
  45. package/dist/components/compounds/MessageBoxDialog.svelte.d.ts +21 -0
  46. package/dist/components/compounds/MessageContainer.svelte +11 -0
  47. package/dist/components/compounds/MessageContainer.svelte.d.ts +21 -0
  48. package/dist/components/compounds/Modal.svelte +10 -0
  49. package/dist/components/compounds/Modal.svelte.d.ts +10 -0
  50. package/dist/components/compounds/PageHeader.svelte +21 -8
  51. package/dist/components/compounds/PageHeader.svelte.d.ts +21 -8
  52. package/dist/components/compounds/Pagination.svelte +34 -8
  53. package/dist/components/compounds/Pagination.svelte.d.ts +20 -0
  54. package/dist/components/compounds/Popover.svelte +11 -0
  55. package/dist/components/compounds/Popover.svelte.d.ts +20 -0
  56. package/dist/components/compounds/PullRefresh.svelte +24 -0
  57. package/dist/components/compounds/PullRefresh.svelte.d.ts +32 -0
  58. package/dist/components/compounds/Result.svelte +11 -0
  59. package/dist/components/compounds/Result.svelte.d.ts +20 -0
  60. package/dist/components/compounds/SafeArea.svelte +24 -0
  61. package/dist/components/compounds/SafeArea.svelte.d.ts +32 -0
  62. package/dist/components/compounds/Skeleton.svelte +10 -0
  63. package/dist/components/compounds/Skeleton.svelte.d.ts +10 -0
  64. package/dist/components/compounds/Steps.svelte +11 -0
  65. package/dist/components/compounds/Steps.svelte.d.ts +20 -0
  66. package/dist/components/compounds/SwipeCell.svelte +24 -0
  67. package/dist/components/compounds/SwipeCell.svelte.d.ts +37 -0
  68. package/dist/components/compounds/TableToolbar.svelte +66 -28
  69. package/dist/components/compounds/TableToolbar.svelte.d.ts +29 -19
  70. package/dist/components/compounds/Tabs.svelte +58 -10
  71. package/dist/components/compounds/Tabs.svelte.d.ts +10 -0
  72. package/dist/components/compounds/TagInput.svelte +11 -0
  73. package/dist/components/compounds/TagInput.svelte.d.ts +20 -0
  74. package/dist/components/compounds/Timeline.svelte +24 -0
  75. package/dist/components/compounds/Timeline.svelte.d.ts +34 -0
  76. package/dist/components/compounds/ToastContainer.svelte +11 -0
  77. package/dist/components/compounds/ToastContainer.svelte.d.ts +26 -0
  78. package/dist/components/compounds/Tooltip.svelte +11 -0
  79. package/dist/components/compounds/Tooltip.svelte.d.ts +22 -0
  80. package/dist/components/compounds/accordion-types.d.ts +10 -1
  81. package/dist/components/compounds/action-sheet-types.d.ts +9 -0
  82. package/dist/components/compounds/bottom-nav-types.d.ts +9 -0
  83. package/dist/components/compounds/swipe-cell-types.d.ts +9 -0
  84. package/dist/components/compounds/timeline-types.d.ts +9 -0
  85. package/dist/components/control-size.d.ts +17 -0
  86. package/dist/components/control-size.js +8 -0
  87. package/dist/components/primitives/Avatar.svelte +10 -0
  88. package/dist/components/primitives/Avatar.svelte.d.ts +10 -0
  89. package/dist/components/primitives/Badge.svelte +10 -0
  90. package/dist/components/primitives/Badge.svelte.d.ts +10 -0
  91. package/dist/components/primitives/BareButton.svelte +11 -0
  92. package/dist/components/primitives/BareButton.svelte.d.ts +20 -0
  93. package/dist/components/primitives/BareInput.svelte +11 -0
  94. package/dist/components/primitives/BareInput.svelte.d.ts +20 -0
  95. package/dist/components/primitives/Button.svelte +10 -0
  96. package/dist/components/primitives/Button.svelte.d.ts +10 -0
  97. package/dist/components/primitives/Checkbox.svelte +11 -0
  98. package/dist/components/primitives/Checkbox.svelte.d.ts +20 -0
  99. package/dist/components/primitives/IconButton.svelte +11 -0
  100. package/dist/components/primitives/IconButton.svelte.d.ts +20 -0
  101. package/dist/components/primitives/Input.svelte +10 -0
  102. package/dist/components/primitives/Input.svelte.d.ts +10 -0
  103. package/dist/components/primitives/Progress.svelte +11 -0
  104. package/dist/components/primitives/Progress.svelte.d.ts +20 -0
  105. package/dist/components/primitives/Radio.svelte +11 -0
  106. package/dist/components/primitives/Radio.svelte.d.ts +20 -0
  107. package/dist/components/primitives/Range.svelte +24 -0
  108. package/dist/components/primitives/Range.svelte.d.ts +34 -0
  109. package/dist/components/primitives/Rating.svelte +24 -0
  110. package/dist/components/primitives/Rating.svelte.d.ts +34 -0
  111. package/dist/components/primitives/Select.svelte +11 -0
  112. package/dist/components/primitives/Select.svelte.d.ts +21 -0
  113. package/dist/components/primitives/Spinner.svelte +11 -0
  114. package/dist/components/primitives/Spinner.svelte.d.ts +20 -0
  115. package/dist/components/primitives/Switch.svelte +11 -0
  116. package/dist/components/primitives/Switch.svelte.d.ts +20 -0
  117. package/dist/components/primitives/Tag.svelte +11 -0
  118. package/dist/components/primitives/Tag.svelte.d.ts +20 -0
  119. package/dist/components/primitives/Textarea.svelte +11 -0
  120. package/dist/components/primitives/Textarea.svelte.d.ts +21 -0
  121. package/dist/components/primitives/ToggleCheckbox.svelte +11 -0
  122. package/dist/components/primitives/ToggleCheckbox.svelte.d.ts +20 -0
  123. package/dist/components/primitives/ToggleInput.svelte +11 -0
  124. package/dist/components/primitives/ToggleInput.svelte.d.ts +20 -0
  125. package/dist/components/primitives/ToggleRadio.svelte +11 -0
  126. package/dist/components/primitives/ToggleRadio.svelte.d.ts +20 -0
  127. package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte +27 -0
  128. package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte.d.ts +27 -0
  129. package/dist/components/scenes/ai/AiDocumentEditor.svelte +79 -0
  130. package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +23 -0
  131. package/dist/components/scenes/ai/MarkdownRenderer.svelte +11 -0
  132. package/dist/components/scenes/ai/MarkdownRenderer.svelte.d.ts +28 -0
  133. package/dist/components/scenes/ai/code-preview.d.ts +28 -0
  134. package/dist/components/scenes/ai/code-preview.js +20 -0
  135. package/dist/components/scenes/ai/document-download.d.ts +52 -0
  136. package/dist/components/scenes/ai/document-download.js +30 -2
  137. package/dist/components/scenes/ai/document-parse.d.ts +71 -14
  138. package/dist/components/scenes/ai/document-parse.js +19 -9
  139. package/dist/components/scenes/ai/document-types.d.ts +222 -88
  140. package/dist/components/scenes/ai/editor-markdown-extensions.d.ts +16 -0
  141. package/dist/components/scenes/ai/editor-markdown-extensions.js +16 -0
  142. package/dist/components/scenes/ai/highlight.d.ts +11 -0
  143. package/dist/components/scenes/ai/highlight.js +11 -0
  144. package/dist/components/scenes/ai/markdown-parse.d.ts +8 -2
  145. package/dist/components/scenes/ai/markdown-parse.js +2 -2
  146. package/dist/components/scenes/ai/mermaid-host-sync.d.ts +38 -0
  147. package/dist/components/scenes/ai/mermaid-host-sync.js +30 -0
  148. package/dist/components/scenes/ai/mermaid-render.d.ts +23 -0
  149. package/dist/components/scenes/ai/mermaid-render.js +23 -0
  150. package/dist/components/scenes/ai/safe-html.d.ts +54 -6
  151. package/dist/components/scenes/ai/safe-html.js +54 -6
  152. package/dist/components/scenes/ai/table/AiTableEditor.svelte +48 -0
  153. package/dist/components/scenes/ai/table/AiTableEditor.svelte.d.ts +24 -0
  154. package/dist/components/scenes/ai/table/table-types.d.ts +79 -0
  155. package/dist/components/scenes/app/FeedbackModal.svelte +45 -5
  156. package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +45 -5
  157. package/dist/components/scenes/app/LanguageSwitch.svelte +29 -19
  158. package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +28 -19
  159. package/dist/components/scenes/app/SettingsLayout.svelte +21 -9
  160. package/dist/components/scenes/app/SettingsLayout.svelte.d.ts +21 -9
  161. package/dist/components/scenes/app/SettingsModal.svelte +23 -0
  162. package/dist/components/scenes/app/SettingsModal.svelte.d.ts +23 -0
  163. package/dist/components/scenes/app/ThemeColorPicker.svelte +31 -0
  164. package/dist/components/scenes/app/ThemeColorPicker.svelte.d.ts +31 -0
  165. package/dist/components/scenes/app/ThemeSelector.svelte +21 -6
  166. package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +21 -6
  167. package/dist/components/scenes/app/ThemeToggle.svelte +21 -4
  168. package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +21 -4
  169. package/dist/components/scenes/app/index.d.ts +1 -1
  170. package/dist/components/scenes/app/index.js +1 -1
  171. package/dist/components/scenes/charts/Chart.svelte +11 -0
  172. package/dist/components/scenes/charts/Chart.svelte.d.ts +20 -0
  173. package/dist/components/scenes/charts/chart-theme.d.ts +25 -1
  174. package/dist/components/scenes/charts/chart-theme.js +25 -1
  175. package/dist/components/scenes/charts/chart-types.d.ts +83 -7
  176. package/dist/components/scenes/charts/renderers/LineChart.svelte +53 -0
  177. package/dist/components/scenes/charts/renderers/LineChart.svelte.d.ts +13 -0
  178. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +10 -0
  179. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +10 -0
  180. package/dist/components/scenes/crud/CrudDetailDrawer.svelte +8 -0
  181. package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +8 -0
  182. package/dist/components/scenes/crud/CrudDetailPanel.svelte +18 -0
  183. package/dist/components/scenes/crud/CrudDetailPanel.svelte.d.ts +18 -0
  184. package/dist/components/scenes/crud/CrudEditPanel.svelte +10 -0
  185. package/dist/components/scenes/crud/CrudEditPanel.svelte.d.ts +10 -0
  186. package/dist/components/scenes/crud/CrudFilterBar.svelte +18 -0
  187. package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +18 -0
  188. package/dist/components/scenes/crud/CrudPage.svelte +37 -5
  189. package/dist/components/scenes/crud/CrudPage.svelte.d.ts +35 -3
  190. package/dist/components/scenes/crud/crud-controller.svelte.d.ts +142 -23
  191. package/dist/components/scenes/crud/crud-controller.svelte.js +22 -11
  192. package/dist/components/scenes/crud/crud-form-validation.d.ts +12 -0
  193. package/dist/components/scenes/crud/crud-form-validation.js +12 -0
  194. package/dist/components/scenes/crud/crud-types.d.ts +79 -8
  195. package/dist/components/scenes/crud/nav-adapter.d.ts +14 -0
  196. package/dist/components/scenes/crud/nav-adapter.js +8 -0
  197. package/dist/components/scenes/crypto/EncryptedInput.svelte +24 -0
  198. package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +34 -0
  199. package/dist/components/scenes/crypto/HashDisplay.svelte +11 -0
  200. package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +21 -0
  201. package/dist/components/scenes/crypto/SignatureDisplay.svelte +11 -0
  202. package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +21 -0
  203. package/dist/components/scenes/error/ErrorPage.svelte +8 -1
  204. package/dist/components/scenes/error/ErrorPage.svelte.d.ts +8 -1
  205. package/dist/components/scenes/error/error-presets.d.ts +40 -4
  206. package/dist/components/scenes/error/error-presets.js +22 -2
  207. package/dist/components/scenes/guide/GuideHost.svelte +27 -0
  208. package/dist/components/scenes/guide/GuideHost.svelte.d.ts +27 -0
  209. package/dist/components/scenes/guide/HelpCenter.svelte +27 -0
  210. package/dist/components/scenes/guide/HelpCenter.svelte.d.ts +27 -0
  211. package/dist/components/scenes/iam/AuthPanel.svelte +26 -2
  212. package/dist/components/scenes/iam/AuthPanel.svelte.d.ts +25 -0
  213. package/dist/components/scenes/iam/AuthShell.svelte +8 -3
  214. package/dist/components/scenes/iam/AuthShell.svelte.d.ts +8 -3
  215. package/dist/components/scenes/iam/ChangePasswordForm.svelte +10 -0
  216. package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +10 -0
  217. package/dist/components/scenes/iam/ForgotPasswordForm.svelte +11 -0
  218. package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +21 -0
  219. package/dist/components/scenes/iam/LoginForm.svelte +24 -31
  220. package/dist/components/scenes/iam/LoginForm.svelte.d.ts +10 -0
  221. package/dist/components/scenes/iam/PasswordInput.svelte +23 -0
  222. package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +23 -0
  223. package/dist/components/scenes/iam/PermGuard.svelte +21 -11
  224. package/dist/components/scenes/iam/PermGuard.svelte.d.ts +30 -0
  225. package/dist/components/scenes/iam/RegisterForm.svelte +10 -0
  226. package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +10 -0
  227. package/dist/components/scenes/iam/ResetPasswordForm.svelte +10 -0
  228. package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +10 -0
  229. package/dist/components/scenes/iam/UserProfile.svelte +11 -0
  230. package/dist/components/scenes/iam/UserProfile.svelte.d.ts +21 -0
  231. package/dist/components/scenes/iam/auth-error-message.d.ts +10 -0
  232. package/dist/components/scenes/iam/auth-error-message.js +10 -0
  233. package/dist/components/scenes/iam/password-utils.d.ts +39 -1
  234. package/dist/components/scenes/iam/password-utils.js +39 -1
  235. package/dist/components/scenes/iam/permission-context.svelte.d.ts +33 -23
  236. package/dist/components/scenes/iam/permission-context.svelte.js +20 -22
  237. package/dist/components/scenes/storage/AvatarUpload.svelte +11 -0
  238. package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +20 -0
  239. package/dist/components/scenes/storage/FileList.svelte +13 -2
  240. package/dist/components/scenes/storage/FileList.svelte.d.ts +20 -0
  241. package/dist/components/scenes/storage/FileUpload.svelte +37 -2
  242. package/dist/components/scenes/storage/FileUpload.svelte.d.ts +21 -0
  243. package/dist/components/scenes/storage/ImageUpload.svelte +11 -0
  244. package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +21 -0
  245. package/dist/components/scenes/types.d.ts +352 -11
  246. package/dist/guide-storage.d.ts +13 -1
  247. package/dist/guide-storage.js +13 -1
  248. package/dist/guide-types.d.ts +67 -2
  249. package/dist/guide.svelte.d.ts +22 -1
  250. package/dist/guide.svelte.js +22 -1
  251. package/dist/i18n.svelte.d.ts +64 -3
  252. package/dist/i18n.svelte.js +99 -18
  253. package/dist/index.d.ts +2 -1
  254. package/dist/index.js +1 -2
  255. package/dist/internal/browser-safety.d.ts +51 -2
  256. package/dist/internal/browser-safety.js +45 -7
  257. package/dist/internal/form-context.d.ts +73 -0
  258. package/dist/internal/form-context.js +57 -0
  259. package/dist/internal/form-validation.svelte.d.ts +42 -0
  260. package/dist/internal/form-validation.svelte.js +26 -0
  261. package/dist/internal/icon-safety.d.ts +7 -0
  262. package/dist/internal/icon-safety.js +7 -0
  263. package/dist/internal/locale.d.ts +19 -0
  264. package/dist/internal/locale.js +21 -0
  265. package/dist/message.svelte.d.ts +90 -0
  266. package/dist/message.svelte.js +84 -0
  267. package/dist/messagebox.svelte.d.ts +61 -13
  268. package/dist/messagebox.svelte.js +55 -13
  269. package/dist/messages/en-US.json +6 -1
  270. package/dist/messages/ja-JP.json +389 -0
  271. package/dist/messages/zh-CN.json +6 -1
  272. package/dist/messages.d.ts +24 -3
  273. package/dist/messages.js +18 -3
  274. package/dist/styles/design-tokens.css +4 -2
  275. package/dist/styles/global.css +28 -8
  276. package/dist/styles/theme.css +2 -0
  277. package/dist/theme-config.d.ts +173 -0
  278. package/dist/theme-config.js +143 -0
  279. package/dist/toast.svelte.d.ts +114 -4
  280. package/dist/toast.svelte.js +108 -4
  281. package/dist/types.d.ts +526 -9
  282. package/dist/utils/platform.svelte.d.ts +28 -15
  283. package/dist/utils/platform.svelte.js +19 -14
  284. package/dist/utils.d.ts +102 -0
  285. package/dist/utils.js +93 -0
  286. package/package.json +66 -6
@@ -9,11 +9,49 @@
9
9
  * - 使用 NFKC 统一兼容字符
10
10
  */
11
11
  import type { PasswordPolicy } from '../types.js';
12
+ /**
13
+ * 按约定进行 Unicode 归一化,保留用户密码的空白字符。
14
+ * @param value - 待处理或校验的值。
15
+ * @returns 按约定 Unicode 形式归一化的密码,保留空白字符。
16
+ *
17
+ * @example 模块内部上下文
18
+ * ```ts
19
+ * const normalized = normalizePassword('Abcd1234!')
20
+ * ```
21
+ */
12
22
  export declare function normalizePassword(value: string): string;
13
23
  /**
14
24
  * 比较两次密码是否一致
25
+ * @param password - 用户输入的密码,不能持久化为 UI 偏好。
26
+ * @param confirmPassword - 再次输入的确认密码。
27
+ * @returns 归一化后两次密码输入是否一致。
28
+ *
29
+ * @example 模块内部上下文
30
+ * ```ts
31
+ * const same = arePasswordsEqual('Abcd1234!', 'Abcd1234!')
32
+ * ```
15
33
  */
16
34
  export declare function arePasswordsEqual(password: string, confirmPassword: string): boolean;
17
- /** 与 IAM 密码策略一致的前端提示;服务端仍执行最终校验。 */
35
+ /**
36
+ * 与 IAM 密码策略一致的前端提示;服务端仍执行最终校验。
37
+ * @param password - 用户输入的密码,不能持久化为 UI 偏好。
38
+ * @param policy - 服务端公开的密码策略。
39
+ * @returns 第一项未满足策略的提示,全部满足时为空字符串。
40
+ *
41
+ * @example 模块内部上下文
42
+ * ```ts
43
+ * const message = passwordPolicyError('Example-pass-42!', { minLength: 12, maxLength: 128, requireUppercase: true, requireLowercase: true, requireNumber: true, requireSpecialChar: true })
44
+ * ```
45
+ */
18
46
  export declare function passwordPolicyError(password: string, policy: PasswordPolicy): string;
47
+ /**
48
+ * 按当前 UI 语言说明服务端公开的密码策略。
49
+ * @param policy - 服务端公开的密码策略。
50
+ * @returns 按当前 UI 语言拼接的密码策略说明。
51
+ *
52
+ * @example 模块内部上下文
53
+ * ```ts
54
+ * const hint = passwordPolicyHint({ minLength: 12, maxLength: 128, requireUppercase: true, requireLowercase: true, requireNumber: true, requireSpecialChar: true })
55
+ * ```
56
+ */
19
57
  export declare function passwordPolicyHint(policy: PasswordPolicy): string;
@@ -5,16 +5,44 @@
5
5
  * @module password-utils
6
6
  */
7
7
  import { uiM } from '../../../messages.js';
8
+ /**
9
+ * 按约定进行 Unicode 归一化,保留用户密码的空白字符。
10
+ * @param value - 待处理或校验的值。
11
+ * @returns 按约定 Unicode 形式归一化的密码,保留空白字符。
12
+ *
13
+ * @example 模块内部上下文
14
+ * ```ts
15
+ * const normalized = normalizePassword('Abcd1234!')
16
+ * ```
17
+ */
8
18
  export function normalizePassword(value) {
9
19
  return value.normalize('NFKC');
10
20
  }
11
21
  /**
12
22
  * 比较两次密码是否一致
23
+ * @param password - 用户输入的密码,不能持久化为 UI 偏好。
24
+ * @param confirmPassword - 再次输入的确认密码。
25
+ * @returns 归一化后两次密码输入是否一致。
26
+ *
27
+ * @example 模块内部上下文
28
+ * ```ts
29
+ * const same = arePasswordsEqual('Abcd1234!', 'Abcd1234!')
30
+ * ```
13
31
  */
14
32
  export function arePasswordsEqual(password, confirmPassword) {
15
33
  return normalizePassword(password) === normalizePassword(confirmPassword);
16
34
  }
17
- /** 与 IAM 密码策略一致的前端提示;服务端仍执行最终校验。 */
35
+ /**
36
+ * 与 IAM 密码策略一致的前端提示;服务端仍执行最终校验。
37
+ * @param password - 用户输入的密码,不能持久化为 UI 偏好。
38
+ * @param policy - 服务端公开的密码策略。
39
+ * @returns 第一项未满足策略的提示,全部满足时为空字符串。
40
+ *
41
+ * @example 模块内部上下文
42
+ * ```ts
43
+ * const message = passwordPolicyError('Example-pass-42!', { minLength: 12, maxLength: 128, requireUppercase: true, requireLowercase: true, requireNumber: true, requireSpecialChar: true })
44
+ * ```
45
+ */
18
46
  export function passwordPolicyError(password, policy) {
19
47
  if (password.length < policy.minLength || password.length > policy.maxLength)
20
48
  return uiM('password_policy_length', { min: policy.minLength, max: policy.maxLength });
@@ -28,6 +56,16 @@ export function passwordPolicyError(password, policy) {
28
56
  return uiM('password_policy_special');
29
57
  return '';
30
58
  }
59
+ /**
60
+ * 按当前 UI 语言说明服务端公开的密码策略。
61
+ * @param policy - 服务端公开的密码策略。
62
+ * @returns 按当前 UI 语言拼接的密码策略说明。
63
+ *
64
+ * @example 模块内部上下文
65
+ * ```ts
66
+ * const hint = passwordPolicyHint({ minLength: 12, maxLength: 128, requireUppercase: true, requireLowercase: true, requireNumber: true, requireSpecialChar: true })
67
+ * ```
68
+ */
31
69
  export function passwordPolicyHint(policy) {
32
70
  const requirements = [uiM('password_policy_length', { min: policy.minLength, max: policy.maxLength })];
33
71
  if (policy.requireUppercase)
@@ -6,20 +6,12 @@
6
6
  *
7
7
  * @example
8
8
  * ```svelte
9
- * <!-- +layout.svelte -->
10
- * <script>
11
- * import { setPermissionContext } from '@h-ai/ui'
12
- * setPermissionContext(() => data.user?.permissions ?? [])
13
- * </script>
14
- *
15
- * <!-- 子组件 -->
16
- * <script>
17
- * import { usePermission } from '@h-ai/ui'
18
- * const { hasPerm, hasAnyPerm, hasAllPerms } = usePermission()
9
+ * <script lang="ts">
10
+ * import { setPermissionContext, PermGuard } from '@h-ai/ui'
11
+ * const permissions = ['user:create']
12
+ * setPermissionContext(() => permissions)
19
13
  * </script>
20
- * {#if hasPerm('user:create')}
21
- * <button>新建用户</button>
22
- * {/if}
14
+ * <PermGuard permission="user:create"><button type="button">新建用户</button></PermGuard>
23
15
  * ```
24
16
  *
25
17
  * @module permission-context.svelte
@@ -35,9 +27,28 @@
35
27
  * @param required - 需要检查的权限码
36
28
  * @param userPermissions - 用户拥有的权限列表
37
29
  * @returns 是否匹配
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * import { matchPermission } from '@h-ai/ui'
34
+ * const canRead = matchPermission('user:read', ['user:*'])
35
+ * const canDelete = matchPermission('user:delete', ['user:read'])
36
+ * ```
38
37
  */
39
38
  export declare function matchPermission(required: string, userPermissions: string[]): boolean;
40
- /** 权限上下文消费接口 */
39
+ /**
40
+ * 权限上下文消费接口
41
+ *
42
+ * @example
43
+ * ```svelte
44
+ * <script lang="ts">
45
+ * import { usePermission } from '@h-ai/ui'
46
+ * import type { PermissionContext } from '@h-ai/ui'
47
+ * const permission: PermissionContext = usePermission()
48
+ * </script>
49
+ * {#if permission.hasPerm('user:read')}<span>用户列表</span>{/if}
50
+ * ```
51
+ */
41
52
  export interface PermissionContext {
42
53
  /** 当前用户权限列表(响应式) */
43
54
  readonly permissions: string[];
@@ -56,15 +67,16 @@ export interface PermissionContext {
56
67
  * 以便权限变化时自动触发子组件更新。
57
68
  *
58
69
  * @param getPermissions - 返回当前用户权限列表的函数
70
+ * @returns {void} 无返回值;注册当前组件树的权限读取函数。
59
71
  *
60
72
  * @example
61
73
  * ```svelte
62
- * <script>
74
+ * <script lang="ts">
63
75
  * import { setPermissionContext } from '@h-ai/ui'
64
- * let { data } = $props()
65
- * const userPermissions = $derived(data.user?.permissions ?? [])
66
- * setPermissionContext(() => userPermissions)
76
+ * let permissions = $state(['user:read'])
77
+ * setPermissionContext(() => permissions)
67
78
  * </script>
79
+ * <main>在此渲染需要权限上下文的子组件。</main>
68
80
  * ```
69
81
  */
70
82
  export declare function setPermissionContext(getPermissions: () => string[]): void;
@@ -78,13 +90,11 @@ export declare function setPermissionContext(getPermissions: () => string[]): vo
78
90
  *
79
91
  * @example
80
92
  * ```svelte
81
- * <script>
93
+ * <script lang="ts">
82
94
  * import { usePermission } from '@h-ai/ui'
83
- * const { hasPerm } = usePermission()
95
+ * const permission = usePermission()
84
96
  * </script>
85
- * {#if hasPerm('role:create')}
86
- * <button>创建角色</button>
87
- * {/if}
97
+ * {#if permission.hasAnyPerm('user:read', 'user:update')}<span>用户管理</span>{/if}
88
98
  * ```
89
99
  */
90
100
  export declare function usePermission(): PermissionContext;
@@ -6,20 +6,12 @@
6
6
  *
7
7
  * @example
8
8
  * ```svelte
9
- * <!-- +layout.svelte -->
10
- * <script>
11
- * import { setPermissionContext } from '@h-ai/ui'
12
- * setPermissionContext(() => data.user?.permissions ?? [])
13
- * </script>
14
- *
15
- * <!-- 子组件 -->
16
- * <script>
17
- * import { usePermission } from '@h-ai/ui'
18
- * const { hasPerm, hasAnyPerm, hasAllPerms } = usePermission()
9
+ * <script lang="ts">
10
+ * import { setPermissionContext, PermGuard } from '@h-ai/ui'
11
+ * const permissions = ['user:create']
12
+ * setPermissionContext(() => permissions)
19
13
  * </script>
20
- * {#if hasPerm('user:create')}
21
- * <button>新建用户</button>
22
- * {/if}
14
+ * <PermGuard permission="user:create"><button type="button">新建用户</button></PermGuard>
23
15
  * ```
24
16
  *
25
17
  * @module permission-context.svelte
@@ -39,6 +31,13 @@ const PERMISSION_CONTEXT_KEY = Symbol('hai-permission-context');
39
31
  * @param required - 需要检查的权限码
40
32
  * @param userPermissions - 用户拥有的权限列表
41
33
  * @returns 是否匹配
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * import { matchPermission } from '@h-ai/ui'
38
+ * const canRead = matchPermission('user:read', ['user:*'])
39
+ * const canDelete = matchPermission('user:delete', ['user:read'])
40
+ * ```
42
41
  */
43
42
  export function matchPermission(required, userPermissions) {
44
43
  for (const userPerm of userPermissions) {
@@ -58,15 +57,16 @@ export function matchPermission(required, userPermissions) {
58
57
  * 以便权限变化时自动触发子组件更新。
59
58
  *
60
59
  * @param getPermissions - 返回当前用户权限列表的函数
60
+ * @returns {void} 无返回值;注册当前组件树的权限读取函数。
61
61
  *
62
62
  * @example
63
63
  * ```svelte
64
- * <script>
64
+ * <script lang="ts">
65
65
  * import { setPermissionContext } from '@h-ai/ui'
66
- * let { data } = $props()
67
- * const userPermissions = $derived(data.user?.permissions ?? [])
68
- * setPermissionContext(() => userPermissions)
66
+ * let permissions = $state(['user:read'])
67
+ * setPermissionContext(() => permissions)
69
68
  * </script>
69
+ * <main>在此渲染需要权限上下文的子组件。</main>
70
70
  * ```
71
71
  */
72
72
  export function setPermissionContext(getPermissions) {
@@ -82,13 +82,11 @@ export function setPermissionContext(getPermissions) {
82
82
  *
83
83
  * @example
84
84
  * ```svelte
85
- * <script>
85
+ * <script lang="ts">
86
86
  * import { usePermission } from '@h-ai/ui'
87
- * const { hasPerm } = usePermission()
87
+ * const permission = usePermission()
88
88
  * </script>
89
- * {#if hasPerm('role:create')}
90
- * <button>创建角色</button>
91
- * {/if}
89
+ * {#if permission.hasAnyPerm('user:read', 'user:update')}<span>用户管理</span>{/if}
92
90
  * ```
93
91
  */
94
92
  export function usePermission() {
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component AvatarUpload
2
3
  =============================================================================
3
4
  @h-ai/ui - AvatarUpload 组件
4
5
  =============================================================================
@@ -6,6 +7,16 @@
6
7
 
7
8
  使用 Svelte 5 Runes ($props, $state, $derived)
8
9
  =============================================================================
10
+
11
+ @example
12
+ ```ts
13
+ import { mount, unmount } from 'svelte'
14
+ import type { ComponentProps } from 'svelte'
15
+ import { AvatarUpload } from '@h-ai/ui'
16
+ const props: ComponentProps<typeof AvatarUpload> = { fallback: 'A', size: 'lg' }
17
+ const component = mount(AvatarUpload, { target: document.body, props })
18
+ await unmount(component)
19
+ ```
9
20
  -->
10
21
  <script lang='ts'>
11
22
  import type { DataAttributes } from '../../../types.js'
@@ -1,6 +1,26 @@
1
1
  import type { DataAttributes } from '../../../types.js';
2
2
  import type { AvatarUploadProps } from '../types.js';
3
3
  type $$ComponentProps = AvatarUploadProps & DataAttributes;
4
+ /**
5
+ * AvatarUpload
6
+ * =============================================================================
7
+ * @h-ai/ui - AvatarUpload 组件
8
+ * =============================================================================
9
+ * 头像上传组件(圆形)
10
+ *
11
+ * 使用 Svelte 5 Runes ($props, $state, $derived)
12
+ * =============================================================================
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { mount, unmount } from 'svelte'
17
+ * import type { ComponentProps } from 'svelte'
18
+ * import { AvatarUpload } from '@h-ai/ui'
19
+ * const props: ComponentProps<typeof AvatarUpload> = { fallback: 'A', size: 'lg' }
20
+ * const component = mount(AvatarUpload, { target: document.body, props })
21
+ * await unmount(component)
22
+ * ```
23
+ */
4
24
  declare const AvatarUpload: import("svelte").Component<$$ComponentProps, {}, "value">;
5
25
  type AvatarUpload = ReturnType<typeof AvatarUpload>;
6
26
  export default AvatarUpload;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component FileList
2
3
  =============================================================================
3
4
  @h-ai/ui - FileList 组件
4
5
  =============================================================================
@@ -6,11 +7,21 @@
6
7
 
7
8
  使用 Svelte 5 Runes ($props, $state, $derived)
8
9
  =============================================================================
10
+
11
+ @example
12
+ ```ts
13
+ import { mount, unmount } from 'svelte'
14
+ import type { ComponentProps } from 'svelte'
15
+ import { FileList } from '@h-ai/ui'
16
+ const props: ComponentProps<typeof FileList> = { files: [{ id: 'f1', name: 'report.pdf', size: 1024, type: 'application/pdf' }], showSize: true }
17
+ const component = mount(FileList, { target: document.body, props })
18
+ await unmount(component)
19
+ ```
9
20
  -->
10
21
  <script lang='ts'>
11
22
  import type { DataAttributes } from '../../../types.js'
12
23
  import type { FileItem, FileListProps } from '../types.js'
13
- import { uiM } from '../../../messages.js'
24
+ import { getUILocale, uiM } from '../../../messages.js'
14
25
  import { cn, getDataAttributes } from '../../../utils.js'
15
26
  import Button from '../../primitives/Button.svelte'
16
27
  import IconButton from '../../primitives/IconButton.svelte'
@@ -56,7 +67,7 @@
56
67
  // 格式化日期
57
68
  function formatDate(date: Date | string): string {
58
69
  const d = typeof date === 'string' ? new Date(date) : date
59
- return d.toLocaleDateString('zh-CN', {
70
+ return d.toLocaleDateString(getUILocale(), {
60
71
  year: 'numeric',
61
72
  month: '2-digit',
62
73
  day: '2-digit',
@@ -1,6 +1,26 @@
1
1
  import type { DataAttributes } from '../../../types.js';
2
2
  import type { FileListProps } from '../types.js';
3
3
  type $$ComponentProps = FileListProps & DataAttributes;
4
+ /**
5
+ * FileList
6
+ * =============================================================================
7
+ * @h-ai/ui - FileList 组件
8
+ * =============================================================================
9
+ * 文件列表展示组件
10
+ *
11
+ * 使用 Svelte 5 Runes ($props, $state, $derived)
12
+ * =============================================================================
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { mount, unmount } from 'svelte'
17
+ * import type { ComponentProps } from 'svelte'
18
+ * import { FileList } from '@h-ai/ui'
19
+ * const props: ComponentProps<typeof FileList> = { files: [{ id: 'f1', name: 'report.pdf', size: 1024, type: 'application/pdf' }], showSize: true }
20
+ * const component = mount(FileList, { target: document.body, props })
21
+ * await unmount(component)
22
+ * ```
23
+ */
4
24
  declare const FileList: import("svelte").Component<$$ComponentProps, {}, "">;
5
25
  type FileList = ReturnType<typeof FileList>;
6
26
  export default FileList;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component FileUpload
2
3
  =============================================================================
3
4
  @h-ai/ui - FileUpload 组件
4
5
  =============================================================================
@@ -7,6 +8,16 @@
7
8
  使用 Svelte 5 Runes ($props, $state, $derived)
8
9
  使用 primitives 组件:Progress, IconButton
9
10
  =============================================================================
11
+
12
+ @example
13
+ ```ts
14
+ import { mount, unmount } from 'svelte'
15
+ import type { ComponentProps } from 'svelte'
16
+ import { FileUpload } from '@h-ai/ui'
17
+ const props: ComponentProps<typeof FileUpload> = { accept: '.pdf', maxFiles: 3, autoUpload: false }
18
+ const component = mount(FileUpload, { target: document.body, props })
19
+ await unmount(component)
20
+ ```
10
21
  -->
11
22
  <script lang='ts'>
12
23
  import type { DataAttributes } from '../../../types.js'
@@ -287,12 +298,36 @@
287
298
  e.currentTarget.value = ''
288
299
  }
289
300
 
290
- /** 手动触发上传 */
301
+ /**
302
+ * 手动触发上传
303
+ * @returns 当前待上传文件的上传 Promise;组件通过错误回调报告上传失败。
304
+ *
305
+ * @example
306
+ * ```ts
307
+ * import { mount, unmount } from 'svelte'
308
+ * import { FileUpload } from '@h-ai/ui'
309
+ * const uploader = mount(FileUpload, { target: document.body, props: { autoUpload: false } })
310
+ * await uploader.upload()
311
+ * await unmount(uploader)
312
+ * ```
313
+ */
291
314
  export async function upload() {
292
315
  await uploadPendingFiles(files.filter(f => f.state === 'pending'))
293
316
  }
294
317
 
295
- /** 清空文件列表 */
318
+ /**
319
+ * 清空文件列表
320
+ * @returns 无返回值;取消本组件请求并清空文件列表。
321
+ *
322
+ * @example
323
+ * ```ts
324
+ * import { mount, unmount } from 'svelte'
325
+ * import { FileUpload } from '@h-ai/ui'
326
+ * const uploader = mount(FileUpload, { target: document.body, props: { autoUpload: false } })
327
+ * uploader.clear()
328
+ * await unmount(uploader)
329
+ * ```
330
+ */
296
331
  export function clear() {
297
332
  abortAllActiveRequests()
298
333
  files = []
@@ -1,6 +1,27 @@
1
1
  import type { DataAttributes } from '../../../types.js';
2
2
  import type { FileUploadProps } from '../types.js';
3
3
  type $$ComponentProps = FileUploadProps & DataAttributes;
4
+ /**
5
+ * FileUpload
6
+ * =============================================================================
7
+ * @h-ai/ui - FileUpload 组件
8
+ * =============================================================================
9
+ * 文件上传组件,负责文件选择、校验、进度与列表展示
10
+ *
11
+ * 使用 Svelte 5 Runes ($props, $state, $derived)
12
+ * 使用 primitives 组件:Progress, IconButton
13
+ * =============================================================================
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { mount, unmount } from 'svelte'
18
+ * import type { ComponentProps } from 'svelte'
19
+ * import { FileUpload } from '@h-ai/ui'
20
+ * const props: ComponentProps<typeof FileUpload> = { accept: '.pdf', maxFiles: 3, autoUpload: false }
21
+ * const component = mount(FileUpload, { target: document.body, props })
22
+ * await unmount(component)
23
+ * ```
24
+ */
4
25
  declare const FileUpload: import("svelte").Component<$$ComponentProps, {
5
26
  upload: () => Promise<void>;
6
27
  clear: () => void;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component ImageUpload
2
3
  =============================================================================
3
4
  @h-ai/ui - ImageUpload 组件
4
5
  =============================================================================
@@ -7,6 +8,16 @@
7
8
  使用 Svelte 5 Runes ($props, $state, $derived)
8
9
  使用 primitives 组件:IconButton, Spinner
9
10
  =============================================================================
11
+
12
+ @example
13
+ ```ts
14
+ import { mount, unmount } from 'svelte'
15
+ import type { ComponentProps } from 'svelte'
16
+ import { ImageUpload } from '@h-ai/ui'
17
+ const props: ComponentProps<typeof ImageUpload> = { accept: 'image/png,image/jpeg', maxSize: 5 * 1024 * 1024 }
18
+ const component = mount(ImageUpload, { target: document.body, props })
19
+ await unmount(component)
20
+ ```
10
21
  -->
11
22
  <script lang='ts'>
12
23
  import type { DataAttributes } from '../../../types.js'
@@ -1,6 +1,27 @@
1
1
  import type { DataAttributes } from '../../../types.js';
2
2
  import type { ImageUploadProps } from '../types.js';
3
3
  type $$ComponentProps = ImageUploadProps & DataAttributes;
4
+ /**
5
+ * ImageUpload
6
+ * =============================================================================
7
+ * @h-ai/ui - ImageUpload 组件
8
+ * =============================================================================
9
+ * 图片上传组件,支持预览
10
+ *
11
+ * 使用 Svelte 5 Runes ($props, $state, $derived)
12
+ * 使用 primitives 组件:IconButton, Spinner
13
+ * =============================================================================
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { mount, unmount } from 'svelte'
18
+ * import type { ComponentProps } from 'svelte'
19
+ * import { ImageUpload } from '@h-ai/ui'
20
+ * const props: ComponentProps<typeof ImageUpload> = { accept: 'image/png,image/jpeg', maxSize: 5 * 1024 * 1024 }
21
+ * const component = mount(ImageUpload, { target: document.body, props })
22
+ * await unmount(component)
23
+ * ```
24
+ */
4
25
  declare const ImageUpload: import("svelte").Component<$$ComponentProps, {}, "value">;
5
26
  type ImageUpload = ReturnType<typeof ImageUpload>;
6
27
  export default ImageUpload;