@h-ai/ui 0.1.0-alpha.28 → 0.1.0-alpha.30

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 (187) hide show
  1. package/README.md +12 -0
  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 +6 -2
  43. package/dist/components/compounds/MessageContainer.svelte.d.ts +2 -1
  44. package/dist/components/compounds/Modal.svelte +9 -7
  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 +6 -4
  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 +6 -4
  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 +6 -3
  117. package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +3 -1
  118. package/dist/components/scenes/ai/MarkdownRenderer.svelte +8 -7
  119. package/dist/components/scenes/ai/MarkdownRenderer.svelte.d.ts +3 -1
  120. package/dist/components/scenes/ai/document-types.d.ts +2 -1
  121. package/dist/components/scenes/ai/table/AiTableEditor.svelte +6 -3
  122. package/dist/components/scenes/ai/table/AiTableEditor.svelte.d.ts +3 -1
  123. package/dist/components/scenes/ai/table/table-types.d.ts +2 -1
  124. package/dist/components/scenes/app/FeedbackModal.svelte +5 -2
  125. package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +3 -1
  126. package/dist/components/scenes/app/LanguageSwitch.svelte +6 -2
  127. package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +3 -1
  128. package/dist/components/scenes/app/SettingsLayout.svelte +6 -3
  129. package/dist/components/scenes/app/SettingsLayout.svelte.d.ts +2 -1
  130. package/dist/components/scenes/app/SettingsModal.svelte +6 -3
  131. package/dist/components/scenes/app/SettingsModal.svelte.d.ts +3 -1
  132. package/dist/components/scenes/app/ThemeColorPicker.svelte +6 -3
  133. package/dist/components/scenes/app/ThemeColorPicker.svelte.d.ts +3 -1
  134. package/dist/components/scenes/app/ThemeSelector.svelte +6 -3
  135. package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +3 -1
  136. package/dist/components/scenes/app/ThemeToggle.svelte +6 -2
  137. package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +3 -1
  138. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +16 -11
  139. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +2 -1
  140. package/dist/components/scenes/crud/CrudDetailDrawer.svelte +6 -3
  141. package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +2 -2
  142. package/dist/components/scenes/crud/CrudDetailPanel.svelte +6 -3
  143. package/dist/components/scenes/crud/CrudDetailPanel.svelte.d.ts +2 -2
  144. package/dist/components/scenes/crud/CrudEditPanel.svelte +6 -3
  145. package/dist/components/scenes/crud/CrudEditPanel.svelte.d.ts +2 -2
  146. package/dist/components/scenes/crud/CrudFilterBar.svelte +6 -2
  147. package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +2 -1
  148. package/dist/components/scenes/crud/CrudPage.svelte +6 -2
  149. package/dist/components/scenes/crud/CrudPage.svelte.d.ts +2 -1
  150. package/dist/components/scenes/crud/crud-types.d.ts +2 -2
  151. package/dist/components/scenes/crypto/EncryptedInput.svelte +6 -3
  152. package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +3 -2
  153. package/dist/components/scenes/crypto/HashDisplay.svelte +6 -3
  154. package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +3 -1
  155. package/dist/components/scenes/crypto/SignatureDisplay.svelte +6 -3
  156. package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +3 -1
  157. package/dist/components/scenes/error/ErrorPage.svelte +6 -3
  158. package/dist/components/scenes/error/ErrorPage.svelte.d.ts +2 -1
  159. package/dist/components/scenes/iam/AuthShell.svelte +6 -3
  160. package/dist/components/scenes/iam/AuthShell.svelte.d.ts +2 -1
  161. package/dist/components/scenes/iam/ChangePasswordForm.svelte +6 -3
  162. package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +3 -1
  163. package/dist/components/scenes/iam/ForgotPasswordForm.svelte +6 -3
  164. package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +3 -1
  165. package/dist/components/scenes/iam/LoginForm.svelte +6 -3
  166. package/dist/components/scenes/iam/LoginForm.svelte.d.ts +3 -1
  167. package/dist/components/scenes/iam/PasswordInput.svelte +6 -4
  168. package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +3 -2
  169. package/dist/components/scenes/iam/RegisterForm.svelte +6 -4
  170. package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +3 -1
  171. package/dist/components/scenes/iam/ResetPasswordForm.svelte +6 -3
  172. package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +3 -1
  173. package/dist/components/scenes/iam/UserProfile.svelte +6 -3
  174. package/dist/components/scenes/iam/UserProfile.svelte.d.ts +3 -1
  175. package/dist/components/scenes/storage/AvatarUpload.svelte +11 -8
  176. package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +3 -1
  177. package/dist/components/scenes/storage/FileList.svelte +6 -3
  178. package/dist/components/scenes/storage/FileList.svelte.d.ts +3 -1
  179. package/dist/components/scenes/storage/FileUpload.svelte +6 -3
  180. package/dist/components/scenes/storage/FileUpload.svelte.d.ts +3 -1
  181. package/dist/components/scenes/storage/ImageUpload.svelte +12 -9
  182. package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +3 -1
  183. package/dist/components/scenes/types.d.ts +16 -16
  184. package/dist/types.d.ts +43 -36
  185. package/dist/utils.d.ts +6 -1
  186. package/dist/utils.js +15 -0
  187. package/package.json +2 -2
@@ -1,4 +1,5 @@
1
- import type { ToggleCheckboxProps } from '../../types.js';
2
- declare const ToggleInput: import("svelte").Component<ToggleCheckboxProps, {}, "checked">;
1
+ import type { DataAttributes, ToggleCheckboxProps } from '../../types.js';
2
+ type $$ComponentProps = ToggleCheckboxProps & DataAttributes;
3
+ declare const ToggleInput: import("svelte").Component<$$ComponentProps, {}, "checked">;
3
4
  type ToggleInput = ReturnType<typeof ToggleInput>;
4
5
  export default ToggleInput;
@@ -8,7 +8,8 @@
8
8
  =============================================================================
9
9
  -->
10
10
  <script lang='ts'>
11
- import type { ToggleRadioProps } from '../../types.js'
11
+ import type { DataAttributes, ToggleRadioProps } from '../../types.js'
12
+ import { getDataAttributes } from '../../utils.js'
12
13
 
13
14
  let {
14
15
  checked = $bindable(false),
@@ -17,20 +18,22 @@
17
18
  disabled = false,
18
19
  class: className = '',
19
20
  onchange,
20
- }: ToggleRadioProps = $props()
21
+ ...restProps
22
+ }: ToggleRadioProps & DataAttributes = $props()
21
23
 
24
+ const dataAttributes = $derived(getDataAttributes(restProps))
22
25
  function handleChange(e: Event & { currentTarget: HTMLInputElement }) {
23
26
  checked = e.currentTarget.checked
24
27
  onchange?.(checked)
25
28
  }
26
29
  </script>
27
30
 
28
- <input
29
- {id}
30
- {name}
31
- type='radio'
32
- class={className}
33
- {disabled}
34
- checked={checked}
35
- onchange={handleChange}
31
+ <input {...dataAttributes}
32
+ {id}
33
+ {name}
34
+ type='radio'
35
+ class={className}
36
+ {disabled}
37
+ checked={checked}
38
+ onchange={handleChange}
36
39
  />
@@ -1,4 +1,5 @@
1
- import type { ToggleRadioProps } from '../../types.js';
2
- declare const ToggleRadio: import("svelte").Component<ToggleRadioProps, {}, "checked">;
1
+ import type { DataAttributes, ToggleRadioProps } from '../../types.js';
2
+ type $$ComponentProps = ToggleRadioProps & DataAttributes;
3
+ declare const ToggleRadio: import("svelte").Component<$$ComponentProps, {}, "checked">;
3
4
  type ToggleRadio = ReturnType<typeof ToggleRadio>;
4
5
  export default ToggleRadio;
@@ -1,10 +1,11 @@
1
1
  <script lang='ts'>
2
+ import type { DataAttributes } from '../../../types.js'
2
3
  import type {
3
4
  MarkdownSourceKind,
4
5
  MarkdownToolbarDownloadAction,
5
6
  } from './document-types.js'
6
7
  import { uiM } from '../../../messages.js'
7
- import { cn } from '../../../utils.js'
8
+ import { cn, getDataAttributes } from '../../../utils.js'
8
9
  import {
9
10
  downloadAiDocument,
10
11
  resolveDocumentDownloadActions,
@@ -62,8 +63,10 @@
62
63
  triggerClass = '',
63
64
  menuClass = '',
64
65
  itemClass = '',
65
- }: AiDocumentDownloadMenuProps = $props()
66
+ ...restProps
67
+ }: AiDocumentDownloadMenuProps & DataAttributes = $props()
66
68
 
69
+ const dataAttributes = $derived(getDataAttributes(restProps))
67
70
  // menuWrapEl 只负责识别外部点击,以便菜单展开后能自然收起。
68
71
  let menuWrapEl: HTMLDivElement | undefined = $state()
69
72
  // open 由组件内部维护,左右两侧可以直接复用,不需要额外再托管弹层状态。
@@ -118,9 +121,9 @@
118
121
  }
119
122
  </script>
120
123
 
121
- <div
122
- bind:this={menuWrapEl}
123
- class={cn('hai-ai-download-menu', className)}
124
+ <div {...dataAttributes}
125
+ bind:this={menuWrapEl}
126
+ class={cn('hai-ai-download-menu', className)}
124
127
  >
125
128
  <button
126
129
  type='button'
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  import type { MarkdownSourceKind, MarkdownToolbarDownloadAction } from './document-types.js';
2
3
  interface AiDocumentDownloadMenuProps {
3
4
  /** 触发下载时导出的原始内容。 */
@@ -33,6 +34,7 @@ interface AiDocumentDownloadMenuProps {
33
34
  /** 菜单项自定义类名。 */
34
35
  itemClass?: string;
35
36
  }
36
- declare const AiDocumentDownloadMenu: import("svelte").Component<AiDocumentDownloadMenuProps, {}, "">;
37
+ type $$ComponentProps = AiDocumentDownloadMenuProps & DataAttributes;
38
+ declare const AiDocumentDownloadMenu: import("svelte").Component<$$ComponentProps, {}, "">;
37
39
  type AiDocumentDownloadMenu = ReturnType<typeof AiDocumentDownloadMenu>;
38
40
  export default AiDocumentDownloadMenu;
@@ -11,6 +11,7 @@
11
11
  =============================================================================
12
12
  -->
13
13
  <script lang='ts'>
14
+ import type { DataAttributes } from '../../../types.js'
14
15
  import type {
15
16
  AiDocumentEditorProps,
16
17
  MarkdownBlockFormatKind,
@@ -27,7 +28,7 @@
27
28
  import { tick } from 'svelte'
28
29
  import { writeTextToClipboard } from '../../../internal/browser-safety.js'
29
30
  import { uiM } from '../../../messages.js'
30
- import { cn } from '../../../utils.js'
31
+ import { cn, getDataAttributes } from '../../../utils.js'
31
32
  import AiDocumentDownloadMenu from './AiDocumentDownloadMenu.svelte'
32
33
  import {
33
34
  createBuiltInCodePreview,
@@ -319,8 +320,10 @@
319
320
  oncopyselection,
320
321
  // 选区注释回调。
321
322
  onannotation,
322
- }: AiDocumentEditorProps = $props()
323
+ ...restProps
324
+ }: AiDocumentEditorProps & DataAttributes = $props()
323
325
 
326
+ const dataAttributes = $derived(getDataAttributes(restProps))
324
327
  // outlineCollapsedInitialized 用来把 `initialOutlineCollapsed` 只消费一次,避免用户手动展开后又被 props 回写覆盖。
325
328
  let outlineCollapsedInitialized = $state(false)
326
329
  // 当前目录是否折叠。
@@ -2340,7 +2343,7 @@
2340
2343
  }
2341
2344
  </script>
2342
2345
 
2343
- <section class={cn('hai-ai-doc-pane', className)}>
2346
+ <section {...dataAttributes} class={cn('hai-ai-doc-pane', className)}>
2344
2347
  <div class='hai-ai-doc-shell'>
2345
2348
  {#if showToolbar}
2346
2349
  <header class='hai-ai-doc-topbar'>
@@ -1,4 +1,6 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  import type { AiDocumentEditorProps } from './document-types.js';
2
- declare const AiDocumentEditor: import("svelte").Component<AiDocumentEditorProps, {}, "editorScrollHost" | "previewHost">;
3
+ type $$ComponentProps = AiDocumentEditorProps & DataAttributes;
4
+ declare const AiDocumentEditor: import("svelte").Component<$$ComponentProps, {}, "editorScrollHost" | "previewHost">;
3
5
  type AiDocumentEditor = ReturnType<typeof AiDocumentEditor>;
4
6
  export default AiDocumentEditor;
@@ -16,9 +16,10 @@
16
16
  =============================================================================
17
17
  -->
18
18
  <script lang='ts'>
19
+ import type { DataAttributes } from '../../../types.js'
19
20
  import type { MarkdownRendererProps } from '../types.js'
20
21
  import { writeTextToClipboard } from '../../../internal/browser-safety.js'
21
- import { cn } from '../../../utils.js'
22
+ import { cn, getDataAttributes } from '../../../utils.js'
22
23
  import { parseMarkdown } from './markdown-parse.js'
23
24
 
24
25
  const {
@@ -27,8 +28,10 @@
27
28
  showCopyButton = true,
28
29
  enableHighlight = true,
29
30
  breaks = true,
30
- }: MarkdownRendererProps = $props()
31
+ ...restProps
32
+ }: MarkdownRendererProps & DataAttributes = $props()
31
33
 
34
+ const dataAttributes = $derived(getDataAttributes(restProps))
32
35
  /** 解析后的 HTML */
33
36
  const html = $derived(
34
37
  parseMarkdown(content, { enableHighlight, showCopyButton, breaks }),
@@ -62,11 +65,9 @@
62
65
  }
63
66
  </script>
64
67
 
65
- <!-- svelte-ignore a11y_click_events_have_key_events -->
66
- <!-- svelte-ignore a11y_no_static_element_interactions -->
67
- <div
68
- class={cn('hai-markdown', className)}
69
- onclick={handleClick}
68
+ <div {...dataAttributes}
69
+ class={cn('hai-markdown', className)}
70
+ onclick={handleClick}
70
71
  >
71
72
  <!-- eslint-disable-next-line svelte/no-at-html-tags -- Markdown HTML 渲染 -->
72
73
  {@html html}
@@ -1,4 +1,6 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  import type { MarkdownRendererProps } from '../types.js';
2
- declare const MarkdownRenderer: import("svelte").Component<MarkdownRendererProps, {}, "">;
3
+ type $$ComponentProps = MarkdownRendererProps & DataAttributes;
4
+ declare const MarkdownRenderer: import("svelte").Component<$$ComponentProps, {}, "">;
3
5
  type MarkdownRenderer = ReturnType<typeof MarkdownRenderer>;
4
6
  export default MarkdownRenderer;
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  /**
2
3
  * Markdown source type, used to distinguish plain markdown, document panel, or code-only rendering.
3
4
  */
@@ -126,7 +127,7 @@ export interface MarkdownToolbarDownloadAction {
126
127
  type BivariantCallback<Args extends unknown[], Return = void> = {
127
128
  bivarianceHack: (...args: Args) => Return;
128
129
  }['bivarianceHack'];
129
- export interface AiDocumentEditorProps {
130
+ export interface AiDocumentEditorProps extends DataAttributes {
130
131
  /** Markdown source content. */
131
132
  content?: string;
132
133
  /** Document title displayed in the header. */
@@ -12,6 +12,7 @@
12
12
  =============================================================================
13
13
  -->
14
14
  <script lang='ts'>
15
+ import type { DataAttributes } from '../../../../types.js'
15
16
  import type { MarkdownToolbarDownloadAction } from '../document-types.js'
16
17
  import type {
17
18
  AiTableColumn,
@@ -23,7 +24,7 @@
23
24
  } from './table-types.js'
24
25
  import { SvelteSet } from 'svelte/reactivity'
25
26
  import { uiM } from '../../../../messages.js'
26
- import { cn } from '../../../../utils.js'
27
+ import { cn, getDataAttributes } from '../../../../utils.js'
27
28
  import AiDocumentDownloadMenu from '../AiDocumentDownloadMenu.svelte'
28
29
 
29
30
  interface ExtractedArrayChunk {
@@ -92,8 +93,10 @@
92
93
  oncopytable,
93
94
  // 表格下载回调。
94
95
  ondownloadtable,
95
- }: AiTableEditorProps = $props()
96
+ ...restProps
97
+ }: AiTableEditorProps & DataAttributes = $props()
96
98
 
99
+ const dataAttributes = $derived(getDataAttributes(restProps))
97
100
  // 复制反馈只影响右上角复制按钮,不和业务数据混用。
98
101
  let copied = $state(false)
99
102
  // 连续复制时按最后一次点击重新计时。
@@ -1029,7 +1032,7 @@
1029
1032
  }
1030
1033
  </script>
1031
1034
 
1032
- <section class={tablePaneClass}>
1035
+ <section {...dataAttributes} class={tablePaneClass}>
1033
1036
  <header class='hai-ai-table-header'>
1034
1037
  <div class='hai-ai-table-heading'>
1035
1038
  <div class='hai-ai-table-eyebrow'>
@@ -1,5 +1,7 @@
1
+ import type { DataAttributes } from '../../../../types.js';
1
2
  import type { AiTableEditorProps } from './table-types.js';
2
- declare const AiTableEditor: import("svelte").Component<AiTableEditorProps, {
3
+ type $$ComponentProps = AiTableEditorProps & DataAttributes;
4
+ declare const AiTableEditor: import("svelte").Component<$$ComponentProps, {
3
5
  flushPendingTableChange: () => void;
4
6
  }, "editorScrollHost">;
5
7
  type AiTableEditor = ReturnType<typeof AiTableEditor>;
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../../types.js';
1
2
  /**
2
3
  * 表格列支持的数据类型。
3
4
  * - `text`: 普通文本输入
@@ -67,7 +68,7 @@ export interface AiTableDownloadPayload {
67
68
  /** 推荐文件名(已带 `.csv` 后缀)。 */
68
69
  filename: string;
69
70
  }
70
- export interface AiTableEditorProps {
71
+ export interface AiTableEditorProps extends DataAttributes {
71
72
  /** 原始表格内容字符串,通常是 JSON 文本,支持流式残缺片段。 */
72
73
  content?: string;
73
74
  /** 结构化表格数据;有值时优先于 `content`。 */
@@ -47,7 +47,9 @@
47
47
  }
48
48
  }
49
49
 
50
+ import type { DataAttributes } from '../../../types.js'
50
51
  import { uiM } from '../../../messages.js'
52
+ import { getDataAttributes } from '../../../utils.js'
51
53
 
52
54
  interface Props {
53
55
  open?: boolean
@@ -55,8 +57,9 @@
55
57
  onsubmit?: (data: FeedbackData) => Promise<void>
56
58
  }
57
59
 
58
- let { open = $bindable(false), labels = {}, onsubmit }: Props = $props()
60
+ let { open = $bindable(false), labels = {}, onsubmit, ...restProps }: Props & DataAttributes = $props()
59
61
 
62
+ const dataAttributes = $derived(getDataAttributes(restProps))
60
63
  // 文案优先使用传入的 labels,缺省回退到内置消息 uiM(...)
61
64
 
62
65
  let feedbackType = $state<FeedbackType>('bug')
@@ -106,7 +109,7 @@
106
109
  }
107
110
  </script>
108
111
 
109
- <Modal bind:open title={labels.title ?? uiM('feedback_title')}>
112
+ <Modal {...dataAttributes} bind:open title={labels.title ?? uiM('feedback_title')}>
110
113
  <p class='text-base-content/70 mb-4'>{labels.description ?? uiM('feedback_description')}</p>
111
114
 
112
115
  {#if error}
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  type FeedbackType = 'bug' | 'feature' | 'question' | 'other';
2
3
  interface FeedbackData {
3
4
  type: FeedbackType;
@@ -29,6 +30,7 @@ interface Props {
29
30
  labels?: FeedbackLabels;
30
31
  onsubmit?: (data: FeedbackData) => Promise<void>;
31
32
  }
33
+ type $$ComponentProps = Props & DataAttributes;
32
34
  /**
33
35
  * FeedbackModal
34
36
  * 用户反馈模态框,支持 Bug 报告、功能建议等多种反馈类型。
@@ -42,6 +44,6 @@ interface Props {
42
44
  * onsubmit={async (data) => { await submitFeedback(data) }}
43
45
  * />
44
46
  */
45
- declare const FeedbackModal: import("svelte").Component<Props, {}, "open">;
47
+ declare const FeedbackModal: import("svelte").Component<$$ComponentProps, {}, "open">;
46
48
  type FeedbackModal = ReturnType<typeof FeedbackModal>;
47
49
  export default FeedbackModal;
@@ -29,7 +29,9 @@
29
29
  ```
30
30
  -->
31
31
  <script lang='ts'>
32
+ import type { DataAttributes } from '../../../types.js'
32
33
  import { uiM } from '../../../messages.js'
34
+ import { getDataAttributes } from '../../../utils.js'
33
35
  import BareButton from '../../primitives/BareButton.svelte'
34
36
 
35
37
  interface Language {
@@ -63,8 +65,10 @@
63
65
  align = 'end',
64
66
  compact = false,
65
67
  class: className = '',
66
- }: Props = $props()
68
+ ...restProps
69
+ }: Props & DataAttributes = $props()
67
70
 
71
+ const dataAttributes = $derived(getDataAttributes(restProps))
68
72
  let open = $state(false)
69
73
  let containerRef = $state<HTMLDivElement | null>(null)
70
74
 
@@ -94,7 +98,7 @@
94
98
  })
95
99
  </script>
96
100
 
97
- <div bind:this={containerRef} class='dropdown {align === 'end' ? 'dropdown-end' : ''} {open ? 'dropdown-open' : ''} {className}'>
101
+ <div {...dataAttributes} bind:this={containerRef} class='dropdown {align === 'end' ? 'dropdown-end' : ''} {open ? 'dropdown-open' : ''} {className}'>
98
102
  <BareButton
99
103
  type='button'
100
104
  class='btn btn-ghost {compact ? 'btn-sm btn-square' : 'btn-sm gap-2 min-w-fit'}'
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  interface Language {
2
3
  value: string;
3
4
  label: string;
@@ -17,6 +18,7 @@ interface Props {
17
18
  /** 自定义类名 */
18
19
  class?: string;
19
20
  }
21
+ type $$ComponentProps = Props & DataAttributes;
20
22
  /**
21
23
  * LanguageSwitch
22
24
  * 语言切换下拉组件,支持多语言切换。
@@ -47,6 +49,6 @@ interface Props {
47
49
  * />
48
50
  * ```
49
51
  */
50
- declare const LanguageSwitch: import("svelte").Component<Props, {}, "">;
52
+ declare const LanguageSwitch: import("svelte").Component<$$ComponentProps, {}, "">;
51
53
  type LanguageSwitch = ReturnType<typeof LanguageSwitch>;
52
54
  export default LanguageSwitch;
@@ -20,7 +20,8 @@
20
20
  -->
21
21
  <script lang='ts'>
22
22
  import type { Snippet } from 'svelte'
23
- import { cn } from '../../../utils.js'
23
+ import type { DataAttributes } from '../../../types.js'
24
+ import { cn, getDataAttributes } from '../../../utils.js'
24
25
  import BareButton from '../../primitives/BareButton.svelte'
25
26
 
26
27
  type SettingsSection = {
@@ -40,6 +41,7 @@
40
41
  children,
41
42
  headerActions,
42
43
  class: className = '',
44
+ ...restProps
43
45
  }: {
44
46
  title?: string
45
47
  description?: string
@@ -49,8 +51,9 @@
49
51
  children?: Snippet
50
52
  headerActions?: Snippet
51
53
  class?: string
52
- } = $props()
54
+ } & DataAttributes = $props()
53
55
 
56
+ const dataAttributes = $derived(getDataAttributes(restProps))
54
57
  function navItemClass(id: string): string {
55
58
  return cn(
56
59
  'flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-sm font-medium transition-colors',
@@ -61,7 +64,7 @@
61
64
  }
62
65
  </script>
63
66
 
64
- <div class={cn('space-y-5', className)}>
67
+ <div {...dataAttributes} class={cn('space-y-5', className)}>
65
68
  <!-- 标题区 -->
66
69
  {#if title || description || headerActions}
67
70
  <div class='flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between'>
@@ -1,4 +1,5 @@
1
1
  import type { Snippet } from 'svelte';
2
+ import type { DataAttributes } from '../../../types.js';
2
3
  type SettingsSection = {
3
4
  id: string;
4
5
  label: string;
@@ -15,7 +16,7 @@ type $$ComponentProps = {
15
16
  children?: Snippet;
16
17
  headerActions?: Snippet;
17
18
  class?: string;
18
- };
19
+ } & DataAttributes;
19
20
  /**
20
21
  * SettingsLayout
21
22
  * 设置页布局场景组件
@@ -10,7 +10,9 @@
10
10
  @prop {function} onthemechange - 主题变更回调
11
11
  -->
12
12
  <script lang='ts'>
13
+ import type { DataAttributes } from '../../../types.js'
13
14
  import { uiM } from '../../../messages.js'
15
+ import { getDataAttributes } from '../../../utils.js'
14
16
  import BareButton from '../../primitives/BareButton.svelte'
15
17
  import IconButton from '../../primitives/IconButton.svelte'
16
18
 
@@ -43,8 +45,10 @@
43
45
  onlanguagechange,
44
46
  onthemechange,
45
47
  onclose,
46
- }: Props = $props()
48
+ ...restProps
49
+ }: Props & DataAttributes = $props()
47
50
 
51
+ const dataAttributes = $derived(getDataAttributes(restProps))
48
52
  function handleClose() {
49
53
  open = false
50
54
  onclose?.()
@@ -66,9 +70,8 @@
66
70
  <svelte:window onkeydown={handleKeydown} />
67
71
 
68
72
  {#if open}
69
- <!-- svelte-ignore a11y_click_events_have_key_events -->
70
- <!-- svelte-ignore a11y_no_static_element_interactions -->
71
73
  <div
74
+ {...dataAttributes}
72
75
  class='fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm transition-opacity'
73
76
  onclick={handleBackdropClick}
74
77
  >
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  interface Props {
2
3
  open?: boolean;
3
4
  currentLanguage?: string;
@@ -15,6 +16,7 @@ interface Props {
15
16
  onthemechange?: (theme: string) => void;
16
17
  onclose?: () => void;
17
18
  }
19
+ type $$ComponentProps = Props & DataAttributes;
18
20
  /**
19
21
  * SettingsModal
20
22
  * 应用设置模态框,包含语言和主题切换功能。
@@ -26,6 +28,6 @@ interface Props {
26
28
  * @prop {function} onlanguagechange - 语言变更回调
27
29
  * @prop {function} onthemechange - 主题变更回调
28
30
  */
29
- declare const SettingsModal: import("svelte").Component<Props, {}, "open">;
31
+ declare const SettingsModal: import("svelte").Component<$$ComponentProps, {}, "open">;
30
32
  type SettingsModal = ReturnType<typeof SettingsModal>;
31
33
  export default SettingsModal;
@@ -7,9 +7,10 @@
7
7
  @prop {function} onchange - 颜色变更回调
8
8
  -->
9
9
  <script lang='ts'>
10
+ import type { DataAttributes } from '../../../types.js'
10
11
  import { uiM } from '../../../messages.js'
11
12
  import { DEFAULT_THEME_COLOR, THEME_COLOR_PRESETS } from '../../../theme-config.js'
12
- import { cn } from '../../../utils.js'
13
+ import { cn, getDataAttributes } from '../../../utils.js'
13
14
 
14
15
  const HEX_COLOR_REGEX = /^#[0-9a-f]{6}$/
15
16
  const SHORT_HEX_COLOR_REGEX = /^#[0-9a-f]{3}$/
@@ -37,8 +38,10 @@
37
38
  pickerLabel,
38
39
  customLabel,
39
40
  class: className = '',
40
- }: Props = $props()
41
+ ...restProps
42
+ }: Props & DataAttributes = $props()
41
43
 
44
+ const dataAttributes = $derived(getDataAttributes(restProps))
42
45
  let colorInputRef = $state<HTMLInputElement | null>(null)
43
46
 
44
47
  const defaultPresets = $derived(
@@ -97,7 +100,7 @@
97
100
  }
98
101
  </script>
99
102
 
100
- <div class={cn('theme-color-picker', className)}>
103
+ <div {...dataAttributes} class={cn('theme-color-picker', className)}>
101
104
  <div class='flex flex-wrap items-center gap-2'>
102
105
  {#each normalizedPresets as preset (preset.value)}
103
106
  <button
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  interface ThemeColorPreset {
2
3
  value: string;
3
4
  label: string;
@@ -11,6 +12,7 @@ interface Props {
11
12
  customLabel?: string;
12
13
  class?: string;
13
14
  }
15
+ type $$ComponentProps = Props & DataAttributes;
14
16
  /**
15
17
  * ThemeColorPicker
16
18
  * 主题色选择器,提供预置主题色与原生取色盘能力。
@@ -19,6 +21,6 @@ interface Props {
19
21
  * @prop {Array<{ value: string, label: string }>} presets - 预置主题色列表
20
22
  * @prop {function} onchange - 颜色变更回调
21
23
  */
22
- declare const ThemeColorPicker: import("svelte").Component<Props, {}, "">;
24
+ declare const ThemeColorPicker: import("svelte").Component<$$ComponentProps, {}, "">;
23
25
  type ThemeColorPicker = ReturnType<typeof ThemeColorPicker>;
24
26
  export default ThemeColorPicker;
@@ -17,9 +17,10 @@
17
17
  -->
18
18
  <script lang='ts'>
19
19
  import type { ThemeInfo } from '../../../theme-config.js'
20
+ import type { DataAttributes } from '../../../types.js'
20
21
  import { uiM } from '../../../messages.js'
21
22
  import { THEME_GROUPS, THEMES } from '../../../theme-config.js'
22
- import { cn } from '../../../utils.js'
23
+ import { cn, getDataAttributes } from '../../../utils.js'
23
24
  import BareButton from '../../primitives/BareButton.svelte'
24
25
 
25
26
  interface Props {
@@ -45,8 +46,10 @@
45
46
  compact = false,
46
47
  grouped = true,
47
48
  class: className = '',
48
- }: Props = $props()
49
+ ...restProps
50
+ }: Props & DataAttributes = $props()
49
51
 
52
+ const dataAttributes = $derived(getDataAttributes(restProps))
50
53
  const displaySelectLabel = $derived(selectLabel ?? uiM('theme_selector_label'))
51
54
 
52
55
  let open = $state(false)
@@ -83,7 +86,7 @@
83
86
  })
84
87
  </script>
85
88
 
86
- <div bind:this={containerRef} class={cn('dropdown', align === 'end' ? 'dropdown-end' : '', open ? 'dropdown-open' : '', className)}>
89
+ <div {...dataAttributes} bind:this={containerRef} class={cn('dropdown', align === 'end' ? 'dropdown-end' : '', open ? 'dropdown-open' : '', className)}>
87
90
  <BareButton
88
91
  type='button'
89
92
  class='btn btn-ghost {compact ? 'btn-sm btn-square' : 'gap-2'}'
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  interface Props {
2
3
  currentTheme?: string;
3
4
  /** 选择主题按钮的 aria-label */
@@ -11,6 +12,7 @@ interface Props {
11
12
  grouped?: boolean;
12
13
  class?: string;
13
14
  }
15
+ type $$ComponentProps = Props & DataAttributes;
14
16
  /**
15
17
  * ThemeSelector
16
18
  * 主题选择器组件,支持内置主题集合的选择和预览。
@@ -28,6 +30,6 @@ interface Props {
28
30
  * grouped
29
31
  * />
30
32
  */
31
- declare const ThemeSelector: import("svelte").Component<Props, {}, "">;
33
+ declare const ThemeSelector: import("svelte").Component<$$ComponentProps, {}, "">;
32
34
  type ThemeSelector = ReturnType<typeof ThemeSelector>;
33
35
  export default ThemeSelector;
@@ -14,8 +14,10 @@
14
14
  />
15
15
  -->
16
16
  <script lang='ts'>
17
+ import type { DataAttributes } from '../../../types.js'
17
18
  import { uiM } from '../../../messages.js'
18
19
  import { isDarkTheme } from '../../../theme-config.js'
20
+ import { getDataAttributes } from '../../../utils.js'
19
21
  import IconButton from '../../primitives/IconButton.svelte'
20
22
 
21
23
  interface Props {
@@ -37,8 +39,10 @@
37
39
  darkTheme = 'dark',
38
40
  labels = {},
39
41
  class: className = '',
40
- }: Props = $props()
42
+ ...restProps
43
+ }: Props & DataAttributes = $props()
41
44
 
45
+ const dataAttributes = $derived(getDataAttributes(restProps))
42
46
  // labels 优先,缺省回退到内置文案
43
47
  const isDark = $derived(isDarkTheme(currentTheme))
44
48
 
@@ -48,7 +52,7 @@
48
52
  }
49
53
  </script>
50
54
 
51
- <div class='tooltip tooltip-bottom {className}' data-tip={isDark ? (labels.switchToLight ?? uiM('theme_switch_to_light')) : (labels.switchToDark ?? uiM('theme_switch_to_dark'))}>
55
+ <div {...dataAttributes} class='tooltip tooltip-bottom {className}' data-tip={isDark ? (labels.switchToLight ?? uiM('theme_switch_to_light')) : (labels.switchToDark ?? uiM('theme_switch_to_dark'))}>
52
56
  <IconButton
53
57
  variant='ghost'
54
58
  size='sm'
@@ -1,3 +1,4 @@
1
+ import type { DataAttributes } from '../../../types.js';
1
2
  interface Props {
2
3
  currentTheme?: string;
3
4
  onchange?: (theme: string) => void;
@@ -9,6 +10,7 @@ interface Props {
9
10
  };
10
11
  class?: string;
11
12
  }
13
+ type $$ComponentProps = Props & DataAttributes;
12
14
  /**
13
15
  * ThemeToggle
14
16
  * 主题切换按钮组件,支持明/暗主题快速切换。
@@ -24,6 +26,6 @@ interface Props {
24
26
  * onchange={(theme) => themeStore.set(theme)}
25
27
  * />
26
28
  */
27
- declare const ThemeToggle: import("svelte").Component<Props, {}, "">;
29
+ declare const ThemeToggle: import("svelte").Component<$$ComponentProps, {}, "">;
28
30
  type ThemeToggle = ReturnType<typeof ThemeToggle>;
29
31
  export default ThemeToggle;