@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
@@ -16,19 +16,15 @@
16
16
  @prop {'normal' | 'compact'} density - 显示密度,compact 为紧凑布局
17
17
 
18
18
  @example
19
- <DataTable
20
- data={users}
21
- columns={[
22
- { key: 'name', label: '姓名' },
23
- { key: 'email', label: '邮箱' },
24
- { key: 'createdAt', label: '创建时间', render: (item) => formatDate(item.createdAt) }
25
- ]}
26
- keyField="id"
27
- >
28
- {#snippet actions(item)}
29
- <Button size="xs" onclick={() => edit(item)}>编辑</Button>
30
- {/snippet}
31
- </DataTable>
19
+ ```ts
20
+ import { mount, unmount } from 'svelte'
21
+ import type { ComponentProps } from 'svelte'
22
+ import { DataTable } from '@h-ai/ui'
23
+ const Table = DataTable<{ id: string, name: string }>
24
+ const props: ComponentProps<typeof Table> = { data: [{ id: 'u1', name: 'Ada' }], keyField: 'id', columns: [{ key: 'name', label: '姓名', sortable: true }] }
25
+ const component = mount(Table, { target: document.body, props })
26
+ await unmount(component)
27
+ ```
32
28
  -->
33
29
  <script lang='ts' generics='T'>
34
30
  import type { Snippet } from 'svelte'
@@ -78,7 +74,20 @@
78
74
 
79
75
  /** 透传到根节点的 data-* 属性。 */
80
76
  const dataAttributes = $derived(getDataAttributes(restProps))
81
- /** DataTable 内部使用的列定义。 */
77
+ /**
78
+ * DataTable 内部使用的列定义。
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * import { mount, unmount } from 'svelte'
83
+ * import type { ComponentProps } from 'svelte'
84
+ * import { DataTable } from '@h-ai/ui'
85
+ * const Table = DataTable<{ id: string, name: string }>
86
+ * const props: ComponentProps<typeof Table> = { data: [{ id: 'u1', name: 'Ada' }], keyField: 'id', columns: [{ key: 'name', label: '姓名', sortable: true }] }
87
+ * const component = mount(Table, { target: document.body, props })
88
+ * await unmount(component)
89
+ * ```
90
+ */
82
91
  type Column = {
83
92
  /** 列对应的数据字段。 */
84
93
  key: keyof T | string
@@ -287,12 +296,14 @@
287
296
  </script>
288
297
 
289
298
  <div {...dataAttributes} bind:this={scrollContainer} class='overflow-x-auto {className}' onscroll={syncActionColumnShadow}>
290
- <table bind:this={tableElement} class={tableClass}>
299
+ <table bind:this={tableElement} class={tableClass} aria-busy={loading}>
291
300
  <thead>
292
301
  <tr class={headerRowClass}>
293
302
  {#each columns as col (String(col.key))}
294
303
  {@const isSorted = activeSortKey === String(col.key)}
295
304
  <th
305
+ scope='col'
306
+ aria-sort={col.sortable ? (isSorted ? (activeSortDir === 'asc' ? 'ascending' : 'descending') : 'none') : undefined}
296
307
  style={getColumnStyle(col)}
297
308
  class='{getAlignClass(col.align)} {headerCellDividerClass} relative font-medium'
298
309
  >
@@ -326,7 +337,10 @@
326
337
  {#if loading}
327
338
  <tr>
328
339
  <td colspan={columns.length + (actions ? 1 : 0)} class={placeholderCellClass}>
329
- <span class='loading loading-spinner loading-sm'></span>
340
+ <span role='status' class='inline-flex items-center gap-2'>
341
+ <span class='loading loading-spinner loading-sm' aria-hidden='true'></span>
342
+ <span>{uiM('common_loading')}</span>
343
+ </span>
330
344
  </td>
331
345
  </tr>
332
346
  {:else if data.length === 0}
@@ -341,7 +355,16 @@
341
355
  </tr>
342
356
  {:else}
343
357
  {#each sortedData as item (item[keyField])}
344
- <tr class='{rowClass} {onrowclick ? 'cursor-pointer' : ''}' onclick={() => onrowclick?.(item)}>
358
+ <tr class='{rowClass} {onrowclick ? 'cursor-pointer focus-visible:outline-2 focus-visible:outline-primary focus-visible:-outline-offset-2' : ''}'
359
+ tabindex={onrowclick ? 0 : undefined}
360
+ onclick={() => onrowclick?.(item)}
361
+ onkeydown={(event) => {
362
+ if (onrowclick && event.target === event.currentTarget && (event.key === 'Enter' || event.key === ' ')) {
363
+ event.preventDefault()
364
+ onrowclick(item)
365
+ }
366
+ }}
367
+ >
345
368
  {#each columns as col (String(col.key))}
346
369
  <td style={getColumnStyle(col)} class={getAlignClass(col.align)}>
347
370
  {#if col.onclick}
@@ -68,19 +68,15 @@ interface $$IsomorphicComponent {
68
68
  * @prop {'normal' | 'compact'} density - 显示密度,compact 为紧凑布局
69
69
  *
70
70
  * @example
71
- * <DataTable
72
- * data={users}
73
- * columns={[
74
- * { key: 'name', label: '姓名' },
75
- * { key: 'email', label: '邮箱' },
76
- * { key: 'createdAt', label: '创建时间', render: (item) => formatDate(item.createdAt) }
77
- * ]}
78
- * keyField="id"
79
- * >
80
- * {#snippet actions(item)}
81
- * <Button size="xs" onclick={() => edit(item)}>编辑</Button>
82
- * {/snippet}
83
- * </DataTable>
71
+ * ```ts
72
+ * import { mount, unmount } from 'svelte'
73
+ * import type { ComponentProps } from 'svelte'
74
+ * import { DataTable } from '@h-ai/ui'
75
+ * const Table = DataTable<{ id: string, name: string }>
76
+ * const props: ComponentProps<typeof Table> = { data: [{ id: 'u1', name: 'Ada' }], keyField: 'id', columns: [{ key: 'name', label: '姓名', sortable: true }] }
77
+ * const component = mount(Table, { target: document.body, props })
78
+ * await unmount(component)
79
+ * ```
84
80
  */
85
81
  declare const DataTable: $$IsomorphicComponent;
86
82
  type DataTable<T> = InstanceType<typeof DataTable<T>>;
@@ -13,12 +13,13 @@
13
13
  @prop {function} onchange - 日期变更回调
14
14
 
15
15
  @example
16
- ```svelte
17
- <script>
18
- import { CalendarDate } from '@internationalized/date'
19
- let date = $state(new CalendarDate(2024, 6, 15))
20
- </script>
21
- <DatePicker bind:value={date} />
16
+ ```ts
17
+ import { mount, unmount } from 'svelte'
18
+ import type { ComponentProps } from 'svelte'
19
+ import { DatePicker } from '@h-ai/ui'
20
+ const props: ComponentProps<typeof DatePicker> = { weekStartsOn: 1, size: 'md' }
21
+ const component = mount(DatePicker, { target: document.body, props })
22
+ await unmount(component)
22
23
  ```
23
24
  -->
24
25
  <script lang='ts'>
@@ -30,6 +31,19 @@
30
31
  import { cn, getDataAttributes } from '../../utils.js'
31
32
  import { getFormControlSizeClasses } from '../control-size.js'
32
33
 
34
+ /**
35
+ * DatePicker 组件的属性契约;通过公开组件配置使用。
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { mount, unmount } from 'svelte'
40
+ * import type { ComponentProps } from 'svelte'
41
+ * import { DatePicker } from '@h-ai/ui'
42
+ * const props: ComponentProps<typeof DatePicker> = { weekStartsOn: 1, size: 'md' }
43
+ * const component = mount(DatePicker, { target: document.body, props })
44
+ * await unmount(component)
45
+ * ```
46
+ */
33
47
  interface Props {
34
48
  /** 选中日期(双向绑定) */
35
49
  value?: DateValue
@@ -1,5 +1,18 @@
1
1
  import type { DateValue } from '@internationalized/date';
2
2
  import type { DataAttributes, FormText, Size } from '../../types.js';
3
+ /**
4
+ * DatePicker 组件的属性契约;通过公开组件配置使用。
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { mount, unmount } from 'svelte'
9
+ * import type { ComponentProps } from 'svelte'
10
+ * import { DatePicker } from '@h-ai/ui'
11
+ * const props: ComponentProps<typeof DatePicker> = { weekStartsOn: 1, size: 'md' }
12
+ * const component = mount(DatePicker, { target: document.body, props })
13
+ * await unmount(component)
14
+ * ```
15
+ */
3
16
  interface Props {
4
17
  /** 选中日期(双向绑定) */
5
18
  value?: DateValue;
@@ -38,12 +51,13 @@ type $$ComponentProps = Props & DataAttributes;
38
51
  * @prop {function} onchange - 日期变更回调
39
52
  *
40
53
  * @example
41
- * ```svelte
42
- * <script>
43
- * import { CalendarDate } from '@internationalized/date'
44
- * let date = $state(new CalendarDate(2024, 6, 15))
45
- * </script>
46
- * <DatePicker bind:value={date} />
54
+ * ```ts
55
+ * import { mount, unmount } from 'svelte'
56
+ * import type { ComponentProps } from 'svelte'
57
+ * import { DatePicker } from '@h-ai/ui'
58
+ * const props: ComponentProps<typeof DatePicker> = { weekStartsOn: 1, size: 'md' }
59
+ * const component = mount(DatePicker, { target: document.body, props })
60
+ * await unmount(component)
47
61
  * ```
48
62
  */
49
63
  declare const DatePicker: import("svelte").Component<$$ComponentProps, {}, "value">;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component Drawer
2
3
  =============================================================================
3
4
  @h-ai/ui - Drawer 组件
4
5
  =============================================================================
@@ -7,6 +8,16 @@
7
8
  使用 Svelte 5 Runes ($props, $derived, $effect, $bindable)
8
9
  使用 primitives 组件:IconButton
9
10
  =============================================================================
11
+
12
+ @example
13
+ ```ts
14
+ import { mount, unmount, createRawSnippet } from 'svelte'
15
+ import type { ComponentProps } from 'svelte'
16
+ import { Drawer } from '@h-ai/ui'
17
+ const props: ComponentProps<typeof Drawer> = { open: true, title: '详情', position: 'right', width: '28rem', children: createRawSnippet(() => ({ render: () => "<span>详情内容</span>" })) }
18
+ const component = mount(Drawer, { target: document.body, props })
19
+ await unmount(component)
20
+ ```
10
21
  -->
11
22
  <script lang='ts'>
12
23
  import type { DataAttributes, DrawerProps } from '../../types.js'
@@ -1,5 +1,26 @@
1
1
  import type { DataAttributes, DrawerProps } from '../../types.js';
2
2
  type $$ComponentProps = DrawerProps & DataAttributes;
3
+ /**
4
+ * Drawer
5
+ * =============================================================================
6
+ * @h-ai/ui - Drawer 组件
7
+ * =============================================================================
8
+ * 抽屉组件
9
+ *
10
+ * 使用 Svelte 5 Runes ($props, $derived, $effect, $bindable)
11
+ * 使用 primitives 组件:IconButton
12
+ * =============================================================================
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * import { mount, unmount, createRawSnippet } from 'svelte'
17
+ * import type { ComponentProps } from 'svelte'
18
+ * import { Drawer } from '@h-ai/ui'
19
+ * const props: ComponentProps<typeof Drawer> = { open: true, title: '详情', position: 'right', width: '28rem', children: createRawSnippet(() => ({ render: () => "<span>详情内容</span>" })) }
20
+ * const component = mount(Drawer, { target: document.body, props })
21
+ * await unmount(component)
22
+ * ```
23
+ */
3
24
  declare const Drawer: import("svelte").Component<$$ComponentProps, {}, "open">;
4
25
  type Drawer = ReturnType<typeof Drawer>;
5
26
  export default Drawer;
@@ -1,6 +1,16 @@
1
1
  <!--
2
2
  @component Dropdown
3
3
  下拉菜单组件,支持 click/hover 触发。
4
+
5
+ @example
6
+ ```ts
7
+ import { mount, unmount } from 'svelte'
8
+ import type { ComponentProps } from 'svelte'
9
+ import { Dropdown } from '@h-ai/ui'
10
+ const props: ComponentProps<typeof Dropdown> = { items: [{ key: 'edit', label: '编辑' }], position: 'bottom' }
11
+ const component = mount(Dropdown, { target: document.body, props })
12
+ await unmount(component)
13
+ ```
4
14
  -->
5
15
  <script lang='ts'>
6
16
  import type { DataAttributes, DropdownProps } from '../../types.js'
@@ -3,6 +3,16 @@ type $$ComponentProps = DropdownProps & DataAttributes;
3
3
  /**
4
4
  * Dropdown
5
5
  * 下拉菜单组件,支持 click/hover 触发。
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { mount, unmount } from 'svelte'
10
+ * import type { ComponentProps } from 'svelte'
11
+ * import { Dropdown } from '@h-ai/ui'
12
+ * const props: ComponentProps<typeof Dropdown> = { items: [{ key: 'edit', label: '编辑' }], position: 'bottom' }
13
+ * const component = mount(Dropdown, { target: document.body, props })
14
+ * await unmount(component)
15
+ * ```
6
16
  */
7
17
  declare const Dropdown: import("svelte").Component<$$ComponentProps, {}, "">;
8
18
  type Dropdown = ReturnType<typeof Dropdown>;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component Empty
2
3
  =============================================================================
3
4
  @h-ai/ui - Empty 组件
4
5
  =============================================================================
@@ -6,6 +7,16 @@
6
7
 
7
8
  使用 Svelte 5 Runes ($props, $derived)
8
9
  =============================================================================
10
+
11
+ @example
12
+ ```ts
13
+ import { mount, unmount } from 'svelte'
14
+ import type { ComponentProps } from 'svelte'
15
+ import { Empty } from '@h-ai/ui'
16
+ const props: ComponentProps<typeof Empty> = { title: '暂无记录', icon: 'inbox' }
17
+ const component = mount(Empty, { target: document.body, props })
18
+ await unmount(component)
19
+ ```
9
20
  -->
10
21
  <script lang='ts'>
11
22
  import type { DataAttributes, EmptyProps } from '../../types.js'
@@ -28,7 +39,7 @@
28
39
 
29
40
  const containerClass = $derived(
30
41
  cn(
31
- 'flex flex-col items-center justify-center py-8 text-center',
42
+ 'flex min-w-0 flex-col items-center justify-center px-4 py-8 text-center',
32
43
  size === 'sm' && 'py-4',
33
44
  size === 'lg' && 'py-12',
34
45
  className,
@@ -46,7 +57,7 @@
46
57
 
47
58
  <div {...dataAttributes} class={containerClass}>
48
59
  <!-- 图标区域 -->
49
- <div class='text-base-content/30 mb-4 {iconSize}'>
60
+ <div class='text-base-content/40 mb-4 shrink-0 {iconSize}' aria-hidden='true'>
50
61
  {#if children}
51
62
  {@render children()}
52
63
  {:else if icon === 'inbox'}
@@ -69,16 +80,16 @@
69
80
  </div>
70
81
 
71
82
  <!-- 标题 -->
72
- <h3 class='font-medium text-base-content/70 {titleSize}'>{displayTitle}</h3>
83
+ <h3 class='max-w-full font-medium text-base-content/80 [overflow-wrap:anywhere] {titleSize}'>{displayTitle}</h3>
73
84
 
74
85
  <!-- 描述 -->
75
86
  {#if description}
76
- <p class='mt-1 text-sm text-base-content/50 max-w-sm'>{description}</p>
87
+ <p class='mt-2 max-w-prose text-sm text-base-content/70 leading-relaxed [overflow-wrap:anywhere]'>{description}</p>
77
88
  {/if}
78
89
 
79
90
  <!-- 操作按钮插槽 -->
80
91
  {#if action}
81
- <div class='mt-4'>
92
+ <div class='mt-5 flex max-w-full flex-wrap justify-center gap-2'>
82
93
  {@render action()}
83
94
  </div>
84
95
  {/if}
@@ -1,5 +1,25 @@
1
1
  import type { DataAttributes, EmptyProps } from '../../types.js';
2
2
  type $$ComponentProps = EmptyProps & DataAttributes;
3
+ /**
4
+ * Empty
5
+ * =============================================================================
6
+ * @h-ai/ui - Empty 组件
7
+ * =============================================================================
8
+ * 空状态展示组件
9
+ *
10
+ * 使用 Svelte 5 Runes ($props, $derived)
11
+ * =============================================================================
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { mount, unmount } from 'svelte'
16
+ * import type { ComponentProps } from 'svelte'
17
+ * import { Empty } from '@h-ai/ui'
18
+ * const props: ComponentProps<typeof Empty> = { title: '暂无记录', icon: 'inbox' }
19
+ * const component = mount(Empty, { target: document.body, props })
20
+ * await unmount(component)
21
+ * ```
22
+ */
3
23
  declare const Empty: import("svelte").Component<$$ComponentProps, {}, "">;
4
24
  type Empty = ReturnType<typeof Empty>;
5
25
  export default Empty;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component Form
2
3
  =============================================================================
3
4
  @h-ai/ui - Form 组件
4
5
  =============================================================================
@@ -6,6 +7,16 @@
6
7
 
7
8
  使用 Svelte 5 Runes ($props, $state)
8
9
  =============================================================================
10
+
11
+ @example
12
+ ```ts
13
+ import { mount, unmount, createRawSnippet } from 'svelte'
14
+ import type { ComponentProps } from 'svelte'
15
+ import { Form } from '@h-ai/ui'
16
+ const props: ComponentProps<typeof Form> = { id: 'profile-form', columns: 2, children: createRawSnippet(() => ({ render: () => "<input name=\"email\" type=\"email\" value=\"ada@example.com\" />" })) }
17
+ const component = mount(Form, { target: document.body, props })
18
+ await unmount(component)
19
+ ```
9
20
  -->
10
21
  <script lang='ts'>
11
22
  import type { DataAttributes, FormProps } from '../../types.js'
@@ -73,12 +84,36 @@
73
84
  onreset?.()
74
85
  }
75
86
 
76
- /** 重置表单 */
87
+ /**
88
+ * 重置表单
89
+ * @returns 无返回值;调用原生 form.reset()。
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * import { mount, unmount } from 'svelte'
94
+ * import { Form } from '@h-ai/ui'
95
+ * const form = mount(Form, { target: document.body, props: { id: 'profile' } })
96
+ * form.reset()
97
+ * await unmount(form)
98
+ * ```
99
+ */
77
100
  export function reset() {
78
101
  formElement?.reset()
79
102
  }
80
103
 
81
- /** 获取表单数据 */
104
+ /**
105
+ * 获取表单数据
106
+ * @returns 当前 form 的字段值记录。
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * import { mount, unmount } from 'svelte'
111
+ * import { Form } from '@h-ai/ui'
112
+ * const form = mount(Form, { target: document.body, props: { id: 'profile' } })
113
+ * const data = form.getData()
114
+ * await unmount(form)
115
+ * ```
116
+ */
82
117
  export function getData(): Record<string, unknown> {
83
118
  const formData = new FormData(formElement)
84
119
  const data: Record<string, unknown> = {}
@@ -1,5 +1,25 @@
1
1
  import type { DataAttributes, FormProps } from '../../types.js';
2
2
  type $$ComponentProps = FormProps & DataAttributes;
3
+ /**
4
+ * Form
5
+ * =============================================================================
6
+ * @h-ai/ui - Form 组件
7
+ * =============================================================================
8
+ * 表单容器组件,提供统一的表单提交、验证和重置功能
9
+ *
10
+ * 使用 Svelte 5 Runes ($props, $state)
11
+ * =============================================================================
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { mount, unmount, createRawSnippet } from 'svelte'
16
+ * import type { ComponentProps } from 'svelte'
17
+ * import { Form } from '@h-ai/ui'
18
+ * const props: ComponentProps<typeof Form> = { id: 'profile-form', columns: 2, children: createRawSnippet(() => ({ render: () => "<input name=\"email\" type=\"email\" value=\"ada@example.com\" />" })) }
19
+ * const component = mount(Form, { target: document.body, props })
20
+ * await unmount(component)
21
+ * ```
22
+ */
3
23
  declare const Form: import("svelte").Component<$$ComponentProps, {
4
24
  reset: () => void;
5
25
  getData: () => Record<string, unknown>;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component FormField
2
3
  =============================================================================
3
4
  @h-ai/ui - FormField 组件
4
5
  =============================================================================
@@ -6,6 +7,16 @@
6
7
 
7
8
  使用 Svelte 5 Runes ($props, $derived)
8
9
  =============================================================================
10
+
11
+ @example
12
+ ```ts
13
+ import { mount, unmount, createRawSnippet } from 'svelte'
14
+ import type { ComponentProps } from 'svelte'
15
+ import { FormField } from '@h-ai/ui'
16
+ const props: ComponentProps<typeof FormField> = { label: '邮箱', name: 'email', required: true, children: createRawSnippet(() => ({ render: () => "<input name=\"email\" type=\"email\" />" })) }
17
+ const component = mount(FormField, { target: document.body, props })
18
+ await unmount(component)
19
+ ```
9
20
  -->
10
21
  <script lang='ts'>
11
22
  import type { DataAttributes, FormFieldProps } from '../../types.js'
@@ -1,5 +1,25 @@
1
1
  import type { DataAttributes, FormFieldProps } from '../../types.js';
2
2
  type $$ComponentProps = FormFieldProps & DataAttributes;
3
+ /**
4
+ * FormField
5
+ * =============================================================================
6
+ * @h-ai/ui - FormField 组件
7
+ * =============================================================================
8
+ * 表单字段包装器,统一 label/error/hint 展示
9
+ *
10
+ * 使用 Svelte 5 Runes ($props, $derived)
11
+ * =============================================================================
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * import { mount, unmount, createRawSnippet } from 'svelte'
16
+ * import type { ComponentProps } from 'svelte'
17
+ * import { FormField } from '@h-ai/ui'
18
+ * const props: ComponentProps<typeof FormField> = { label: '邮箱', name: 'email', required: true, children: createRawSnippet(() => ({ render: () => "<input name=\"email\" type=\"email\" />" })) }
19
+ * const component = mount(FormField, { target: document.body, props })
20
+ * await unmount(component)
21
+ * ```
22
+ */
3
23
  declare const FormField: import("svelte").Component<$$ComponentProps, {}, "">;
4
24
  type FormField = ReturnType<typeof FormField>;
5
25
  export default FormField;
@@ -1,4 +1,16 @@
1
- <!-- 表单字段布局,供 Form 和原生表单/场景组件共同复用。 -->
1
+ <!--
2
+ @component FormLayout 表单字段布局,供 Form 和原生表单/场景组件共同复用。
3
+
4
+ @example
5
+ ```ts
6
+ import { mount, unmount, createRawSnippet } from 'svelte'
7
+ import type { ComponentProps } from 'svelte'
8
+ import { FormLayout } from '@h-ai/ui'
9
+ const props: ComponentProps<typeof FormLayout> = { columns: 2, labelPosition: 'top', children: createRawSnippet(() => ({ render: () => "<span>表单字段</span>" })) }
10
+ const component = mount(FormLayout, { target: document.body, props })
11
+ await unmount(component)
12
+ ```
13
+ -->
2
14
  <script lang='ts'>
3
15
  import type { FormLayoutProps } from '../../types.js'
4
16
  import { setContext } from 'svelte'
@@ -1,4 +1,17 @@
1
1
  import type { FormLayoutProps } from '../../types.js';
2
+ /**
3
+ * FormLayout 表单字段布局,供 Form 和原生表单/场景组件共同复用。
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { mount, unmount, createRawSnippet } from 'svelte'
8
+ * import type { ComponentProps } from 'svelte'
9
+ * import { FormLayout } from '@h-ai/ui'
10
+ * const props: ComponentProps<typeof FormLayout> = { columns: 2, labelPosition: 'top', children: createRawSnippet(() => ({ render: () => "<span>表单字段</span>" })) }
11
+ * const component = mount(FormLayout, { target: document.body, props })
12
+ * await unmount(component)
13
+ * ```
14
+ */
2
15
  declare const FormLayout: import("svelte").Component<FormLayoutProps, {}, "">;
3
16
  type FormLayout = ReturnType<typeof FormLayout>;
4
17
  export default FormLayout;
@@ -1,4 +1,5 @@
1
1
  <!--
2
+ @component InfiniteScroll
2
3
  @h-ai/ui — InfiniteScroll(无限滚动 / 上拉加载更多)
3
4
 
4
5
  用法:
@@ -7,12 +8,35 @@
7
8
  <div>{item.name}</div>
8
9
  {/each}
9
10
  </InfiniteScroll>
11
+
12
+ @example
13
+ ```ts
14
+ import { mount, unmount, createRawSnippet } from 'svelte'
15
+ import type { ComponentProps } from 'svelte'
16
+ import { InfiniteScroll } from '@h-ai/ui'
17
+ const props: ComponentProps<typeof InfiniteScroll> = { hasMore: false, children: createRawSnippet(() => ({ render: () => "<p>已经加载全部记录。</p>" })) }
18
+ const component = mount(InfiniteScroll, { target: document.body, props })
19
+ await unmount(component)
20
+ ```
10
21
  -->
11
22
  <script lang='ts'>
12
23
  import type { Snippet } from 'svelte'
13
24
  import type { DataAttributes } from '../../types.js'
14
25
  import { cn, getDataAttributes } from '../../utils.js'
15
26
 
27
+ /**
28
+ * InfiniteScroll 组件的属性契约;通过公开组件配置使用。
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { mount, unmount, createRawSnippet } from 'svelte'
33
+ * import type { ComponentProps } from 'svelte'
34
+ * import { InfiniteScroll } from '@h-ai/ui'
35
+ * const props: ComponentProps<typeof InfiniteScroll> = { hasMore: false, children: createRawSnippet(() => ({ render: () => "<p>已经加载全部记录。</p>" })) }
36
+ * const component = mount(InfiniteScroll, { target: document.body, props })
37
+ * await unmount(component)
38
+ * ```
39
+ */
16
40
  interface Props {
17
41
  /** 加载更多回调 */
18
42
  onloadmore?: () => Promise<void>
@@ -1,5 +1,18 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  import type { DataAttributes } from '../../types.js';
3
+ /**
4
+ * InfiniteScroll 组件的属性契约;通过公开组件配置使用。
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { mount, unmount, createRawSnippet } from 'svelte'
9
+ * import type { ComponentProps } from 'svelte'
10
+ * import { InfiniteScroll } from '@h-ai/ui'
11
+ * const props: ComponentProps<typeof InfiniteScroll> = { hasMore: false, children: createRawSnippet(() => ({ render: () => "<p>已经加载全部记录。</p>" })) }
12
+ * const component = mount(InfiniteScroll, { target: document.body, props })
13
+ * await unmount(component)
14
+ * ```
15
+ */
3
16
  interface Props {
4
17
  /** 加载更多回调 */
5
18
  onloadmore?: () => Promise<void>;
@@ -19,6 +32,27 @@ interface Props {
19
32
  children: Snippet;
20
33
  }
21
34
  type $$ComponentProps = Props & DataAttributes;
35
+ /**
36
+ * InfiniteScroll
37
+ * @h-ai/ui — InfiniteScroll(无限滚动 / 上拉加载更多)
38
+ *
39
+ * 用法:
40
+ * <InfiniteScroll onloadmore={async () => await loadNextPage()} hasMore={hasMoreData}>
41
+ * {#each items as item}
42
+ * <div>{item.name}</div>
43
+ * {/each}
44
+ * </InfiniteScroll>
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * import { mount, unmount, createRawSnippet } from 'svelte'
49
+ * import type { ComponentProps } from 'svelte'
50
+ * import { InfiniteScroll } from '@h-ai/ui'
51
+ * const props: ComponentProps<typeof InfiniteScroll> = { hasMore: false, children: createRawSnippet(() => ({ render: () => "<p>已经加载全部记录。</p>" })) }
52
+ * const component = mount(InfiniteScroll, { target: document.body, props })
53
+ * await unmount(component)
54
+ * ```
55
+ */
22
56
  declare const InfiniteScroll: import("svelte").Component<$$ComponentProps, {}, "">;
23
57
  type InfiniteScroll = ReturnType<typeof InfiniteScroll>;
24
58
  export default InfiniteScroll;