@h-ai/ui 0.1.0-alpha.29 → 0.1.0-alpha.31

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 (194) hide show
  1. package/README.md +50 -3
  2. package/dist/components/compounds/Accordion.svelte +6 -3
  3. package/dist/components/compounds/Accordion.svelte.d.ts +3 -1
  4. package/dist/components/compounds/ActionSheet.svelte +11 -8
  5. package/dist/components/compounds/ActionSheet.svelte.d.ts +3 -1
  6. package/dist/components/compounds/Alert.svelte +6 -4
  7. package/dist/components/compounds/Alert.svelte.d.ts +3 -2
  8. package/dist/components/compounds/AppBar.svelte +13 -9
  9. package/dist/components/compounds/AppBar.svelte.d.ts +3 -1
  10. package/dist/components/compounds/BottomNav.svelte +13 -10
  11. package/dist/components/compounds/BottomNav.svelte.d.ts +3 -1
  12. package/dist/components/compounds/Breadcrumb.svelte +6 -4
  13. package/dist/components/compounds/Breadcrumb.svelte.d.ts +3 -2
  14. package/dist/components/compounds/Calendar.svelte +7 -2
  15. package/dist/components/compounds/Calendar.svelte.d.ts +3 -1
  16. package/dist/components/compounds/Card.svelte +6 -4
  17. package/dist/components/compounds/Card.svelte.d.ts +3 -2
  18. package/dist/components/compounds/Combobox.svelte +6 -2
  19. package/dist/components/compounds/Combobox.svelte.d.ts +3 -1
  20. package/dist/components/compounds/Confirm.svelte +9 -7
  21. package/dist/components/compounds/Confirm.svelte.d.ts +3 -2
  22. package/dist/components/compounds/DataTable.svelte +6 -2
  23. package/dist/components/compounds/DataTable.svelte.d.ts +2 -1
  24. package/dist/components/compounds/DatePicker.svelte +7 -2
  25. package/dist/components/compounds/DatePicker.svelte.d.ts +3 -1
  26. package/dist/components/compounds/Drawer.svelte +6 -4
  27. package/dist/components/compounds/Drawer.svelte.d.ts +3 -2
  28. package/dist/components/compounds/Dropdown.svelte +6 -4
  29. package/dist/components/compounds/Dropdown.svelte.d.ts +3 -2
  30. package/dist/components/compounds/Empty.svelte +6 -4
  31. package/dist/components/compounds/Empty.svelte.d.ts +3 -2
  32. package/dist/components/compounds/Form.svelte +11 -9
  33. package/dist/components/compounds/Form.svelte.d.ts +3 -2
  34. package/dist/components/compounds/FormField.svelte +6 -4
  35. package/dist/components/compounds/FormField.svelte.d.ts +3 -2
  36. package/dist/components/compounds/InfiniteScroll.svelte +10 -7
  37. package/dist/components/compounds/InfiniteScroll.svelte.d.ts +3 -1
  38. package/dist/components/compounds/MessageBoxContainer.svelte +6 -1
  39. package/dist/components/compounds/MessageBoxContainer.svelte.d.ts +3 -17
  40. package/dist/components/compounds/MessageBoxDialog.svelte +9 -7
  41. package/dist/components/compounds/MessageBoxDialog.svelte.d.ts +2 -1
  42. package/dist/components/compounds/MessageContainer.svelte +43 -66
  43. package/dist/components/compounds/MessageContainer.svelte.d.ts +2 -1
  44. package/dist/components/compounds/Modal.svelte +29 -43
  45. package/dist/components/compounds/Modal.svelte.d.ts +3 -2
  46. package/dist/components/compounds/PageHeader.svelte +6 -2
  47. package/dist/components/compounds/PageHeader.svelte.d.ts +3 -1
  48. package/dist/components/compounds/Pagination.svelte +6 -4
  49. package/dist/components/compounds/Pagination.svelte.d.ts +3 -2
  50. package/dist/components/compounds/Popover.svelte +10 -8
  51. package/dist/components/compounds/Popover.svelte.d.ts +3 -2
  52. package/dist/components/compounds/PullRefresh.svelte +11 -8
  53. package/dist/components/compounds/PullRefresh.svelte.d.ts +3 -1
  54. package/dist/components/compounds/Result.svelte +6 -4
  55. package/dist/components/compounds/Result.svelte.d.ts +3 -2
  56. package/dist/components/compounds/SafeArea.svelte +6 -3
  57. package/dist/components/compounds/SafeArea.svelte.d.ts +3 -1
  58. package/dist/components/compounds/Skeleton.svelte +6 -4
  59. package/dist/components/compounds/Skeleton.svelte.d.ts +3 -2
  60. package/dist/components/compounds/Steps.svelte +6 -4
  61. package/dist/components/compounds/Steps.svelte.d.ts +3 -2
  62. package/dist/components/compounds/SwipeCell.svelte +6 -3
  63. package/dist/components/compounds/SwipeCell.svelte.d.ts +3 -1
  64. package/dist/components/compounds/Tabs.svelte +6 -4
  65. package/dist/components/compounds/Tabs.svelte.d.ts +3 -2
  66. package/dist/components/compounds/TagInput.svelte +11 -9
  67. package/dist/components/compounds/TagInput.svelte.d.ts +3 -2
  68. package/dist/components/compounds/Timeline.svelte +6 -3
  69. package/dist/components/compounds/Timeline.svelte.d.ts +3 -1
  70. package/dist/components/compounds/ToastContainer.svelte +6 -2
  71. package/dist/components/compounds/ToastContainer.svelte.d.ts +2 -1
  72. package/dist/components/compounds/Tooltip.svelte +6 -4
  73. package/dist/components/compounds/Tooltip.svelte.d.ts +3 -2
  74. package/dist/components/primitives/Avatar.svelte +6 -4
  75. package/dist/components/primitives/Avatar.svelte.d.ts +3 -2
  76. package/dist/components/primitives/Badge.svelte +6 -4
  77. package/dist/components/primitives/Badge.svelte.d.ts +3 -2
  78. package/dist/components/primitives/BareButton.svelte +15 -12
  79. package/dist/components/primitives/BareButton.svelte.d.ts +3 -2
  80. package/dist/components/primitives/BareInput.svelte +37 -34
  81. package/dist/components/primitives/BareInput.svelte.d.ts +3 -2
  82. package/dist/components/primitives/Button.svelte +12 -10
  83. package/dist/components/primitives/Button.svelte.d.ts +3 -2
  84. package/dist/components/primitives/Checkbox.svelte +6 -4
  85. package/dist/components/primitives/Checkbox.svelte.d.ts +3 -2
  86. package/dist/components/primitives/IconButton.svelte +6 -4
  87. package/dist/components/primitives/IconButton.svelte.d.ts +3 -2
  88. package/dist/components/primitives/Input.svelte +6 -4
  89. package/dist/components/primitives/Input.svelte.d.ts +3 -2
  90. package/dist/components/primitives/Progress.svelte +6 -4
  91. package/dist/components/primitives/Progress.svelte.d.ts +3 -2
  92. package/dist/components/primitives/Radio.svelte +6 -4
  93. package/dist/components/primitives/Radio.svelte.d.ts +2 -2
  94. package/dist/components/primitives/Range.svelte +6 -3
  95. package/dist/components/primitives/Range.svelte.d.ts +3 -1
  96. package/dist/components/primitives/Rating.svelte +6 -3
  97. package/dist/components/primitives/Rating.svelte.d.ts +3 -1
  98. package/dist/components/primitives/Select.svelte +255 -48
  99. package/dist/components/primitives/Select.svelte.d.ts +2 -2
  100. package/dist/components/primitives/Spinner.svelte +6 -4
  101. package/dist/components/primitives/Spinner.svelte.d.ts +3 -2
  102. package/dist/components/primitives/Switch.svelte +6 -4
  103. package/dist/components/primitives/Switch.svelte.d.ts +3 -2
  104. package/dist/components/primitives/Tag.svelte +6 -4
  105. package/dist/components/primitives/Tag.svelte.d.ts +3 -2
  106. package/dist/components/primitives/Textarea.svelte +34 -19
  107. package/dist/components/primitives/Textarea.svelte.d.ts +3 -2
  108. package/dist/components/primitives/ToggleCheckbox.svelte +13 -10
  109. package/dist/components/primitives/ToggleCheckbox.svelte.d.ts +3 -2
  110. package/dist/components/primitives/ToggleInput.svelte +13 -10
  111. package/dist/components/primitives/ToggleInput.svelte.d.ts +3 -2
  112. package/dist/components/primitives/ToggleRadio.svelte +13 -10
  113. package/dist/components/primitives/ToggleRadio.svelte.d.ts +3 -2
  114. package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte +8 -5
  115. package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte.d.ts +3 -1
  116. package/dist/components/scenes/ai/AiDocumentEditor.svelte +40 -10
  117. package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +3 -1
  118. package/dist/components/scenes/ai/MarkdownRenderer.svelte +49 -7
  119. package/dist/components/scenes/ai/MarkdownRenderer.svelte.d.ts +3 -1
  120. package/dist/components/scenes/ai/document-parse.d.ts +2 -0
  121. package/dist/components/scenes/ai/document-parse.js +16 -17
  122. package/dist/components/scenes/ai/document-types.d.ts +6 -1
  123. package/dist/components/scenes/ai/markdown-parse.d.ts +2 -0
  124. package/dist/components/scenes/ai/markdown-parse.js +17 -20
  125. package/dist/components/scenes/ai/safe-html.d.ts +16 -0
  126. package/dist/components/scenes/ai/safe-html.js +284 -0
  127. package/dist/components/scenes/ai/table/AiTableEditor.svelte +6 -3
  128. package/dist/components/scenes/ai/table/AiTableEditor.svelte.d.ts +3 -1
  129. package/dist/components/scenes/ai/table/table-types.d.ts +2 -1
  130. package/dist/components/scenes/app/FeedbackModal.svelte +5 -2
  131. package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +3 -1
  132. package/dist/components/scenes/app/LanguageSwitch.svelte +6 -2
  133. package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +3 -1
  134. package/dist/components/scenes/app/SettingsLayout.svelte +6 -3
  135. package/dist/components/scenes/app/SettingsLayout.svelte.d.ts +2 -1
  136. package/dist/components/scenes/app/SettingsModal.svelte +6 -3
  137. package/dist/components/scenes/app/SettingsModal.svelte.d.ts +3 -1
  138. package/dist/components/scenes/app/ThemeColorPicker.svelte +6 -3
  139. package/dist/components/scenes/app/ThemeColorPicker.svelte.d.ts +3 -1
  140. package/dist/components/scenes/app/ThemeSelector.svelte +6 -3
  141. package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +3 -1
  142. package/dist/components/scenes/app/ThemeToggle.svelte +6 -2
  143. package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +3 -1
  144. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +16 -11
  145. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +2 -1
  146. package/dist/components/scenes/crud/CrudDetailDrawer.svelte +6 -3
  147. package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +2 -2
  148. package/dist/components/scenes/crud/CrudDetailPanel.svelte +6 -3
  149. package/dist/components/scenes/crud/CrudDetailPanel.svelte.d.ts +2 -2
  150. package/dist/components/scenes/crud/CrudEditPanel.svelte +6 -3
  151. package/dist/components/scenes/crud/CrudEditPanel.svelte.d.ts +2 -2
  152. package/dist/components/scenes/crud/CrudFilterBar.svelte +6 -2
  153. package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +2 -1
  154. package/dist/components/scenes/crud/CrudPage.svelte +6 -2
  155. package/dist/components/scenes/crud/CrudPage.svelte.d.ts +2 -1
  156. package/dist/components/scenes/crud/crud-types.d.ts +2 -2
  157. package/dist/components/scenes/crypto/EncryptedInput.svelte +6 -3
  158. package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +3 -2
  159. package/dist/components/scenes/crypto/HashDisplay.svelte +6 -3
  160. package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +3 -1
  161. package/dist/components/scenes/crypto/SignatureDisplay.svelte +6 -3
  162. package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +3 -1
  163. package/dist/components/scenes/error/ErrorPage.svelte +6 -3
  164. package/dist/components/scenes/error/ErrorPage.svelte.d.ts +2 -1
  165. package/dist/components/scenes/iam/AuthShell.svelte +6 -3
  166. package/dist/components/scenes/iam/AuthShell.svelte.d.ts +2 -1
  167. package/dist/components/scenes/iam/ChangePasswordForm.svelte +6 -3
  168. package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +3 -1
  169. package/dist/components/scenes/iam/ForgotPasswordForm.svelte +6 -3
  170. package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +3 -1
  171. package/dist/components/scenes/iam/LoginForm.svelte +6 -3
  172. package/dist/components/scenes/iam/LoginForm.svelte.d.ts +3 -1
  173. package/dist/components/scenes/iam/PasswordInput.svelte +6 -4
  174. package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +3 -2
  175. package/dist/components/scenes/iam/RegisterForm.svelte +6 -4
  176. package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +3 -1
  177. package/dist/components/scenes/iam/ResetPasswordForm.svelte +6 -3
  178. package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +3 -1
  179. package/dist/components/scenes/iam/UserProfile.svelte +6 -3
  180. package/dist/components/scenes/iam/UserProfile.svelte.d.ts +3 -1
  181. package/dist/components/scenes/storage/AvatarUpload.svelte +11 -8
  182. package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +3 -1
  183. package/dist/components/scenes/storage/FileList.svelte +6 -3
  184. package/dist/components/scenes/storage/FileList.svelte.d.ts +3 -1
  185. package/dist/components/scenes/storage/FileUpload.svelte +6 -3
  186. package/dist/components/scenes/storage/FileUpload.svelte.d.ts +3 -1
  187. package/dist/components/scenes/storage/ImageUpload.svelte +12 -9
  188. package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +3 -1
  189. package/dist/components/scenes/types.d.ts +20 -16
  190. package/dist/styles/global.css +5 -0
  191. package/dist/types.d.ts +48 -41
  192. package/dist/utils.d.ts +6 -1
  193. package/dist/utils.js +16 -1
  194. package/package.json +2 -2
@@ -3,9 +3,9 @@
3
3
  模态框组件,支持 backdrop-blur 和 scale-in 动画。
4
4
  -->
5
5
  <script lang='ts'>
6
- import type { ModalProps } from '../../types.js'
6
+ import type { DataAttributes, ModalProps } from '../../types.js'
7
7
  import { uiM } from '../../messages.js'
8
- import { cn } from '../../utils.js'
8
+ import { cn, getDataAttributes } from '../../utils.js'
9
9
 
10
10
  let {
11
11
  open = $bindable(false),
@@ -24,11 +24,12 @@
24
24
  header,
25
25
  footer,
26
26
  children,
27
- }: ModalProps = $props()
27
+ ...restProps
28
+ }: ModalProps & DataAttributes = $props()
28
29
 
29
- // modalElement 持有原生 dialog 引用;
30
- // 只有调用 `showModal()` 进入 top-layer 后,弹框才不会被父级布局和 overflow 裁剪。
31
- let modalElement: HTMLDialogElement | undefined = $state()
30
+ const dataAttributes = $derived(getDataAttributes(restProps))
31
+ // modalElement 持有 overlay 容器引用;不再依赖原生 `<dialog>`,改用 fixed + z-index 叠加。
32
+ let modalElement: HTMLDivElement | undefined = $state()
32
33
 
33
34
  // 标题区仅在显式提供标题或自定义 header 时出现;
34
35
  // 仅需关闭按钮的场景改为右上角悬浮按钮,避免业务侧额外占一整行头部。
@@ -109,37 +110,17 @@
109
110
  }
110
111
  }
111
112
 
112
- function handleDialogCancel(event: Event) {
113
- // 原生 dialog 在按下 Escape 时会先触发 cancel;
114
- // 这里统一接管关闭逻辑,避免浏览器直接 close 后跳过组件自己的 onclose 回调。
115
- event.preventDefault()
116
- if (closeOnEscape) {
117
- handleClose()
118
- }
119
- }
120
-
121
- $effect(() => {
122
- if (!modalElement) {
123
- return
124
- }
125
-
126
- if (open) {
127
- if (!modalElement.open) {
128
- modalElement.showModal()
129
- }
130
- return
131
- }
132
-
133
- if (modalElement.open) {
134
- modalElement.close()
135
- }
136
- })
137
113
  </script>
138
114
 
139
- <dialog
140
- bind:this={modalElement}
141
- class='hai-modal'
142
- oncancel={handleDialogCancel}
115
+ <div {...dataAttributes}
116
+ bind:this={modalElement}
117
+ class='hai-modal'
118
+ style:display={open ? '' : 'none'}
119
+ aria-hidden={open ? undefined : 'true'}
120
+ onkeydown={(e) => {
121
+ if (closeOnEscape && e.key === 'Escape')
122
+ handleClose()
123
+ }}
143
124
  >
144
125
  <div
145
126
  class='hai-modal__viewport'
@@ -221,11 +202,10 @@
221
202
  {/if}
222
203
  </div>
223
204
  </div>
224
- </dialog>
205
+ </div>
225
206
 
226
207
  <style>
227
- dialog.hai-modal,
228
- dialog.hai-modal:modal {
208
+ .hai-modal {
229
209
  margin: 0;
230
210
  padding: 0;
231
211
  border: 0;
@@ -235,17 +215,23 @@
235
215
  box-sizing: border-box;
236
216
  }
237
217
 
218
+ .hai-modal {
219
+ position: fixed;
220
+ inset: 0;
221
+ z-index: var(--hai-z-modal, 1100);
222
+ display: block;
223
+ pointer-events: none;
224
+ }
225
+
238
226
  .hai-modal__viewport {
239
227
  position: fixed;
240
228
  inset: 0;
241
229
  display: grid;
242
230
  place-items: center;
243
231
  padding: clamp(1rem, 2.6vw, 2rem);
244
- }
245
-
246
- dialog.hai-modal::backdrop {
232
+ pointer-events: auto;
247
233
  background: rgb(15 23 42 / 0.26);
248
- background: color-mix(in srgb, var(--color-base-content) 22%, transparent);
234
+ background: color-mix(in srgb, var(--color-base-content) 15%, transparent);
249
235
  backdrop-filter: blur(2px);
250
236
  }
251
237
 
@@ -371,7 +357,7 @@
371
357
  }
372
358
 
373
359
  @media (max-width: 768px) {
374
- dialog.hai-modal {
360
+ .hai-modal {
375
361
  padding: 0.85rem;
376
362
  }
377
363
 
@@ -1,8 +1,9 @@
1
- import type { ModalProps } from '../../types.js';
1
+ import type { DataAttributes, ModalProps } from '../../types.js';
2
+ type $$ComponentProps = ModalProps & DataAttributes;
2
3
  /**
3
4
  * Modal
4
5
  * 模态框组件,支持 backdrop-blur 和 scale-in 动画。
5
6
  */
6
- declare const Modal: import("svelte").Component<ModalProps, {}, "open">;
7
+ declare const Modal: import("svelte").Component<$$ComponentProps, {}, "open">;
7
8
  type Modal = ReturnType<typeof Modal>;
8
9
  export default Modal;
@@ -18,6 +18,8 @@
18
18
  -->
19
19
  <script lang='ts'>
20
20
  import type { Snippet } from 'svelte'
21
+ import type { DataAttributes } from '../../types.js'
22
+ import { getDataAttributes } from '../../utils.js'
21
23
 
22
24
  interface Props {
23
25
  title: string
@@ -26,10 +28,12 @@
26
28
  class?: string
27
29
  }
28
30
 
29
- const { title, description, actions, class: className = '' }: Props = $props()
31
+ const { title, description, actions, class: className = '', ...restProps }: Props & DataAttributes = $props()
32
+
33
+ const dataAttributes = $derived(getDataAttributes(restProps))
30
34
  </script>
31
35
 
32
- <div class='flex flex-col sm:flex-row sm:items-center justify-between gap-3 mb-5 {className}'>
36
+ <div {...dataAttributes} class='flex flex-col sm:flex-row sm:items-center justify-between gap-3 mb-5 {className}'>
33
37
  <div>
34
38
  <h1 class='text-xl font-semibold tracking-tight'>{title}</h1>
35
39
  {#if description}
@@ -1,10 +1,12 @@
1
1
  import type { Snippet } from 'svelte';
2
+ import type { DataAttributes } from '../../types.js';
2
3
  interface Props {
3
4
  title: string;
4
5
  description?: string;
5
6
  actions?: Snippet;
6
7
  class?: string;
7
8
  }
9
+ type $$ComponentProps = Props & DataAttributes;
8
10
  /**
9
11
  * PageHeader
10
12
  * 页面头部组件,包含标题、描述和操作按钮区域。
@@ -23,6 +25,6 @@ interface Props {
23
25
  * {/snippet}
24
26
  * </PageHeader>
25
27
  */
26
- declare const PageHeader: import("svelte").Component<Props, {}, "">;
28
+ declare const PageHeader: import("svelte").Component<$$ComponentProps, {}, "">;
27
29
  type PageHeader = ReturnType<typeof PageHeader>;
28
30
  export default PageHeader;
@@ -8,9 +8,9 @@
8
8
  =============================================================================
9
9
  -->
10
10
  <script lang='ts'>
11
- import type { PaginationProps } from '../../types.js'
11
+ import type { DataAttributes, PaginationProps } from '../../types.js'
12
12
  import { uiM } from '../../messages.js'
13
- import { cn } from '../../utils.js'
13
+ import { cn, getDataAttributes } from '../../utils.js'
14
14
  import BareButton from '../primitives/BareButton.svelte'
15
15
 
16
16
  import Input from '../primitives/Input.svelte'
@@ -29,8 +29,10 @@
29
29
  class: className = '',
30
30
  onchange,
31
31
  onpagesizechange,
32
- }: PaginationProps = $props()
32
+ ...restProps
33
+ }: PaginationProps & DataAttributes = $props()
33
34
 
35
+ const dataAttributes = $derived(getDataAttributes(restProps))
34
36
  // labels 优先,缺省回退到内置消息 uiM(...)
35
37
 
36
38
  // 计算总页数(至少 1 页,保证分页栏在空数据时仍可渲染)
@@ -86,7 +88,7 @@
86
88
  )
87
89
  </script>
88
90
 
89
- <div class={cn('flex flex-wrap items-center justify-between gap-4', className)}>
91
+ <div {...dataAttributes} class={cn('flex flex-wrap items-center justify-between gap-4', className)}>
90
92
  {#if showTotal}
91
93
  <span class={tableTextClass}>
92
94
  {(labels.total ?? uiM('pagination_total')).replace('{count}', String(total))}
@@ -1,4 +1,5 @@
1
- import type { PaginationProps } from '../../types.js';
2
- declare const Pagination: import("svelte").Component<PaginationProps, {}, "page">;
1
+ import type { DataAttributes, PaginationProps } from '../../types.js';
2
+ type $$ComponentProps = PaginationProps & DataAttributes;
3
+ declare const Pagination: import("svelte").Component<$$ComponentProps, {}, "page">;
3
4
  type Pagination = ReturnType<typeof Pagination>;
4
5
  export default Pagination;
@@ -8,8 +8,8 @@
8
8
  =============================================================================
9
9
  -->
10
10
  <script lang='ts'>
11
- import type { PopoverProps } from '../../types.js'
12
- import { cn } from '../../utils.js'
11
+ import type { DataAttributes, PopoverProps } from '../../types.js'
12
+ import { cn, getDataAttributes } from '../../utils.js'
13
13
 
14
14
  let {
15
15
  open = $bindable(false),
@@ -21,8 +21,10 @@
21
21
  onclose,
22
22
  triggerContent,
23
23
  children,
24
- }: PopoverProps = $props()
24
+ ...restProps
25
+ }: PopoverProps & DataAttributes = $props()
25
26
 
27
+ const dataAttributes = $derived(getDataAttributes(restProps))
26
28
  let triggerElement = $state<HTMLDivElement | null>(null)
27
29
  let popoverElement = $state<HTMLDivElement | null>(null)
28
30
 
@@ -95,11 +97,11 @@
95
97
  })
96
98
  </script>
97
99
 
98
- <div
99
- class={cn('relative inline-block', className)}
100
- role='group'
101
- onmouseenter={handleMouseEnter}
102
- onmouseleave={handleMouseLeave}
100
+ <div {...dataAttributes}
101
+ class={cn('relative inline-block', className)}
102
+ role='group'
103
+ onmouseenter={handleMouseEnter}
104
+ onmouseleave={handleMouseLeave}
103
105
  >
104
106
  <!-- 触发器 -->
105
107
  <div
@@ -1,4 +1,5 @@
1
- import type { PopoverProps } from '../../types.js';
2
- declare const Popover: import("svelte").Component<PopoverProps, {}, "open">;
1
+ import type { DataAttributes, PopoverProps } from '../../types.js';
2
+ type $$ComponentProps = PopoverProps & DataAttributes;
3
+ declare const Popover: import("svelte").Component<$$ComponentProps, {}, "open">;
3
4
  type Popover = ReturnType<typeof Popover>;
4
5
  export default Popover;
@@ -8,7 +8,8 @@
8
8
  -->
9
9
  <script lang='ts'>
10
10
  import type { Snippet } from 'svelte'
11
- import { cn } from '../../utils.js'
11
+ import type { DataAttributes } from '../../types.js'
12
+ import { cn, getDataAttributes } from '../../utils.js'
12
13
 
13
14
  interface Props {
14
15
  /** 刷新回调(需返回 Promise) */
@@ -29,8 +30,10 @@
29
30
  disabled = false,
30
31
  class: className,
31
32
  children,
32
- }: Props = $props()
33
+ ...restProps
34
+ }: Props & DataAttributes = $props()
33
35
 
36
+ const dataAttributes = $derived(getDataAttributes(restProps))
34
37
  let pulling = $state(false)
35
38
  let refreshing = $state(false)
36
39
  let pullDistance = $state(0)
@@ -71,12 +74,12 @@
71
74
  }
72
75
  </script>
73
76
 
74
- <div
75
- class={cn('relative overflow-hidden', className)}
76
- ontouchstart={handleTouchStart}
77
- ontouchmove={handleTouchMove}
78
- ontouchend={handleTouchEnd}
79
- role='region'
77
+ <div {...dataAttributes}
78
+ class={cn('relative overflow-hidden', className)}
79
+ ontouchstart={handleTouchStart}
80
+ ontouchmove={handleTouchMove}
81
+ ontouchend={handleTouchEnd}
82
+ role='region'
80
83
  >
81
84
  <!-- 刷新指示器 -->
82
85
  <div
@@ -1,4 +1,5 @@
1
1
  import type { Snippet } from 'svelte';
2
+ import type { DataAttributes } from '../../types.js';
2
3
  interface Props {
3
4
  /** 刷新回调(需返回 Promise) */
4
5
  onrefresh?: () => Promise<void>;
@@ -11,6 +12,7 @@ interface Props {
11
12
  /** 内容 */
12
13
  children: Snippet;
13
14
  }
14
- declare const PullRefresh: import("svelte").Component<Props, {}, "">;
15
+ type $$ComponentProps = Props & DataAttributes;
16
+ declare const PullRefresh: import("svelte").Component<$$ComponentProps, {}, "">;
15
17
  type PullRefresh = ReturnType<typeof PullRefresh>;
16
18
  export default PullRefresh;
@@ -8,8 +8,8 @@
8
8
  =============================================================================
9
9
  -->
10
10
  <script lang='ts'>
11
- import type { ResultProps } from '../../types.js'
12
- import { cn } from '../../utils.js'
11
+ import type { DataAttributes, ResultProps } from '../../types.js'
12
+ import { cn, getDataAttributes } from '../../utils.js'
13
13
 
14
14
  const {
15
15
  status = 'info',
@@ -19,8 +19,10 @@
19
19
  icon,
20
20
  actions,
21
21
  children,
22
- }: ResultProps = $props()
22
+ ...restProps
23
+ }: ResultProps & DataAttributes = $props()
23
24
 
25
+ const dataAttributes = $derived(getDataAttributes(restProps))
24
26
  const containerClass = $derived(
25
27
  cn(
26
28
  'flex flex-col items-center justify-center py-12 text-center',
@@ -36,7 +38,7 @@
36
38
  }[status])
37
39
  </script>
38
40
 
39
- <div class={containerClass}>
41
+ <div {...dataAttributes} class={containerClass}>
40
42
  <!-- 图标区域 -->
41
43
  <div class='w-20 h-20 mb-6 {iconColor}'>
42
44
  {#if icon}
@@ -1,4 +1,5 @@
1
- import type { ResultProps } from '../../types.js';
2
- declare const Result: import("svelte").Component<ResultProps, {}, "">;
1
+ import type { DataAttributes, ResultProps } from '../../types.js';
2
+ type $$ComponentProps = ResultProps & DataAttributes;
3
+ declare const Result: import("svelte").Component<$$ComponentProps, {}, "">;
3
4
  type Result = ReturnType<typeof Result>;
4
5
  export default Result;
@@ -8,7 +8,8 @@
8
8
  -->
9
9
  <script lang='ts'>
10
10
  import type { Snippet } from 'svelte'
11
- import { cn } from '../../utils.js'
11
+ import type { DataAttributes } from '../../types.js'
12
+ import { cn, getDataAttributes } from '../../utils.js'
12
13
 
13
14
  interface Props {
14
15
  /** 安全区域位置 */
@@ -23,8 +24,10 @@
23
24
  position = 'all',
24
25
  class: className,
25
26
  children,
26
- }: Props = $props()
27
+ ...restProps
28
+ }: Props & DataAttributes = $props()
27
29
 
30
+ const dataAttributes = $derived(getDataAttributes(restProps))
28
31
  const positionClasses = $derived({
29
32
  top: 'hai-safe-top',
30
33
  bottom: 'hai-safe-bottom',
@@ -32,6 +35,6 @@
32
35
  }[position])
33
36
  </script>
34
37
 
35
- <div class={cn(positionClasses, className)}>
38
+ <div {...dataAttributes} class={cn(positionClasses, className)}>
36
39
  {@render children()}
37
40
  </div>
@@ -1,4 +1,5 @@
1
1
  import type { Snippet } from 'svelte';
2
+ import type { DataAttributes } from '../../types.js';
2
3
  interface Props {
3
4
  /** 安全区域位置 */
4
5
  position?: 'top' | 'bottom' | 'all';
@@ -7,6 +8,7 @@ interface Props {
7
8
  /** 内容 */
8
9
  children: Snippet;
9
10
  }
10
- declare const SafeArea: import("svelte").Component<Props, {}, "">;
11
+ type $$ComponentProps = Props & DataAttributes;
12
+ declare const SafeArea: import("svelte").Component<$$ComponentProps, {}, "">;
11
13
  type SafeArea = ReturnType<typeof SafeArea>;
12
14
  export default SafeArea;
@@ -3,8 +3,8 @@
3
3
  骨架屏占位组件,用于加载状态展示。
4
4
  -->
5
5
  <script lang='ts'>
6
- import type { SkeletonProps } from '../../types.js'
7
- import { cn } from '../../utils.js'
6
+ import type { DataAttributes, SkeletonProps } from '../../types.js'
7
+ import { cn, getDataAttributes } from '../../utils.js'
8
8
 
9
9
  const {
10
10
  variant = 'text',
@@ -14,8 +14,10 @@
14
14
  animation = true,
15
15
  count = 1,
16
16
  class: className = '',
17
- }: SkeletonProps = $props()
17
+ ...restProps
18
+ }: SkeletonProps & DataAttributes = $props()
18
19
 
20
+ const dataAttributes = $derived(getDataAttributes(restProps))
19
21
  const baseClass = $derived(
20
22
  cn(
21
23
  'skeleton',
@@ -40,7 +42,7 @@
40
42
  </script>
41
43
 
42
44
  {#if count > 1}
43
- <div class='space-y-2'>
45
+ <div {...dataAttributes} class='space-y-2'>
44
46
  {#each Array.from({ length: count }) as _, i (i)}
45
47
  <div class={baseClass} {style}></div>
46
48
  {/each}
@@ -1,8 +1,9 @@
1
- import type { SkeletonProps } from '../../types.js';
1
+ import type { DataAttributes, SkeletonProps } from '../../types.js';
2
+ type $$ComponentProps = SkeletonProps & DataAttributes;
2
3
  /**
3
4
  * Skeleton
4
5
  * 骨架屏占位组件,用于加载状态展示。
5
6
  */
6
- declare const Skeleton: import("svelte").Component<SkeletonProps, {}, "">;
7
+ declare const Skeleton: import("svelte").Component<$$ComponentProps, {}, "">;
7
8
  type Skeleton = ReturnType<typeof Skeleton>;
8
9
  export default Skeleton;
@@ -8,8 +8,8 @@
8
8
  =============================================================================
9
9
  -->
10
10
  <script lang='ts'>
11
- import type { StepsProps } from '../../types.js'
12
- import { cn } from '../../utils.js'
11
+ import type { DataAttributes, StepsProps } from '../../types.js'
12
+ import { cn, getDataAttributes } from '../../utils.js'
13
13
 
14
14
  const {
15
15
  items = [],
@@ -19,8 +19,10 @@
19
19
  clickable = false,
20
20
  class: className = '',
21
21
  onchange,
22
- }: StepsProps = $props()
22
+ ...restProps
23
+ }: StepsProps & DataAttributes = $props()
23
24
 
25
+ const dataAttributes = $derived(getDataAttributes(restProps))
24
26
  const containerClass = $derived(
25
27
  cn(
26
28
  'steps',
@@ -62,7 +64,7 @@
62
64
  }
63
65
  </script>
64
66
 
65
- <ul class={containerClass}>
67
+ <ul {...dataAttributes} class={containerClass}>
66
68
  {#each items as item, index (index)}
67
69
  {#if clickable}
68
70
  <!-- svelte-ignore a11y_no_noninteractive_element_to_interactive_role -->
@@ -1,4 +1,5 @@
1
- import type { StepsProps } from '../../types.js';
2
- declare const Steps: import("svelte").Component<StepsProps, {}, "">;
1
+ import type { DataAttributes, StepsProps } from '../../types.js';
2
+ type $$ComponentProps = StepsProps & DataAttributes;
3
+ declare const Steps: import("svelte").Component<$$ComponentProps, {}, "">;
3
4
  type Steps = ReturnType<typeof Steps>;
4
5
  export default Steps;
@@ -13,8 +13,9 @@
13
13
  -->
14
14
  <script lang='ts'>
15
15
  import type { Snippet } from 'svelte'
16
+ import type { DataAttributes } from '../../types.js'
16
17
  import type { SwipeCellAction } from './swipe-cell-types.js'
17
- import { cn } from '../../utils.js'
18
+ import { cn, getDataAttributes } from '../../utils.js'
18
19
 
19
20
  // eslint-disable-next-line no-import-assign -- type re-export
20
21
  export type { SwipeCellAction }
@@ -38,8 +39,10 @@
38
39
  disabled = false,
39
40
  class: className,
40
41
  children,
41
- }: Props = $props()
42
+ ...restProps
43
+ }: Props & DataAttributes = $props()
42
44
 
45
+ const dataAttributes = $derived(getDataAttributes(restProps))
43
46
  let offsetX = $state(0)
44
47
  let startX = 0
45
48
  let swiping = false
@@ -82,7 +85,7 @@
82
85
  }
83
86
  </script>
84
87
 
85
- <div class={cn('relative overflow-hidden', className)}>
88
+ <div {...dataAttributes} class={cn('relative overflow-hidden', className)}>
86
89
  <!-- 内容层 -->
87
90
  <div
88
91
  class='relative transition-transform'
@@ -1,4 +1,5 @@
1
1
  import type { Snippet } from 'svelte';
2
+ import type { DataAttributes } from '../../types.js';
2
3
  import type { SwipeCellAction } from './swipe-cell-types.js';
3
4
  interface Props {
4
5
  /** 右侧操作列表 */
@@ -12,7 +13,8 @@ interface Props {
12
13
  /** 内容 */
13
14
  children: Snippet;
14
15
  }
15
- declare const SwipeCell: import("svelte").Component<Props, {
16
+ type $$ComponentProps = Props & DataAttributes;
17
+ declare const SwipeCell: import("svelte").Component<$$ComponentProps, {
16
18
  SwipeCellAction: typeof SwipeCellAction;
17
19
  }, "">;
18
20
  type SwipeCell = ReturnType<typeof SwipeCell>;
@@ -3,8 +3,8 @@
3
3
  标签页组件,支持 line/card/pills 三种样式。
4
4
  -->
5
5
  <script lang='ts'>
6
- import type { TabsProps } from '../../types.js'
7
- import { cn } from '../../utils.js'
6
+ import type { DataAttributes, TabsProps } from '../../types.js'
7
+ import { cn, getDataAttributes } from '../../utils.js'
8
8
  import BareButton from '../primitives/BareButton.svelte'
9
9
 
10
10
  let {
@@ -15,8 +15,10 @@
15
15
  class: className = '',
16
16
  onchange,
17
17
  children,
18
- }: TabsProps = $props()
18
+ ...restProps
19
+ }: TabsProps & DataAttributes = $props()
19
20
 
21
+ const dataAttributes = $derived(getDataAttributes(restProps))
20
22
  // 默认选中第一个
21
23
  $effect(() => {
22
24
  if (!active && items.length > 0) {
@@ -56,7 +58,7 @@
56
58
  }
57
59
  </script>
58
60
 
59
- <div role='tablist' class={tabsClass}>
61
+ <div {...dataAttributes} role='tablist' class={tabsClass}>
60
62
  {#each items as item (item.key)}
61
63
  <BareButton
62
64
  role='tab'
@@ -1,8 +1,9 @@
1
- import type { TabsProps } from '../../types.js';
1
+ import type { DataAttributes, TabsProps } from '../../types.js';
2
+ type $$ComponentProps = TabsProps & DataAttributes;
2
3
  /**
3
4
  * Tabs
4
5
  * 标签页组件,支持 line/card/pills 三种样式。
5
6
  */
6
- declare const Tabs: import("svelte").Component<TabsProps, {}, "active">;
7
+ declare const Tabs: import("svelte").Component<$$ComponentProps, {}, "active">;
7
8
  type Tabs = ReturnType<typeof Tabs>;
8
9
  export default Tabs;
@@ -8,9 +8,9 @@
8
8
  =============================================================================
9
9
  -->
10
10
  <script lang='ts'>
11
- import type { TagInputProps } from '../../types.js'
11
+ import type { DataAttributes, TagInputProps } from '../../types.js'
12
12
  import { uiM } from '../../messages.js'
13
- import { cn, getInputSizeClass } from '../../utils.js'
13
+ import { cn, getDataAttributes, getInputSizeClass } from '../../utils.js'
14
14
  import BareInput from '../primitives/BareInput.svelte'
15
15
  import Tag from '../primitives/Tag.svelte'
16
16
 
@@ -23,8 +23,10 @@
23
23
  size = 'md',
24
24
  class: className = '',
25
25
  onchange,
26
- }: TagInputProps = $props()
26
+ ...restProps
27
+ }: TagInputProps & DataAttributes = $props()
27
28
 
29
+ const dataAttributes = $derived(getDataAttributes(restProps))
28
30
  let inputValue = $state('')
29
31
  let inputElement = $state<HTMLInputElement | undefined>(undefined)
30
32
 
@@ -77,12 +79,12 @@
77
79
  }
78
80
  </script>
79
81
 
80
- <div
81
- class={containerClass}
82
- onclick={() => inputElement?.focus()}
83
- onkeydown={e => e.key === 'Enter' && inputElement?.focus()}
84
- role='textbox'
85
- tabindex='-1'
82
+ <div {...dataAttributes}
83
+ class={containerClass}
84
+ onclick={() => inputElement?.focus()}
85
+ onkeydown={e => e.key === 'Enter' && inputElement?.focus()}
86
+ role='textbox'
87
+ tabindex='-1'
86
88
  >
87
89
  {#each tags as tag, index (index)}
88
90
  <Tag
@@ -1,4 +1,5 @@
1
- import type { TagInputProps } from '../../types.js';
2
- declare const TagInput: import("svelte").Component<TagInputProps, {}, "tags">;
1
+ import type { DataAttributes, TagInputProps } from '../../types.js';
2
+ type $$ComponentProps = TagInputProps & DataAttributes;
3
+ declare const TagInput: import("svelte").Component<$$ComponentProps, {}, "tags">;
3
4
  type TagInput = ReturnType<typeof TagInput>;
4
5
  export default TagInput;