@h-ai/ui 0.1.0-alpha.10

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 (237) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +500 -0
  3. package/auto-import.d.ts +96 -0
  4. package/auto-import.js +263 -0
  5. package/dist/components/compounds/Accordion.svelte +142 -0
  6. package/dist/components/compounds/Accordion.svelte.d.ts +25 -0
  7. package/dist/components/compounds/ActionSheet.svelte +116 -0
  8. package/dist/components/compounds/ActionSheet.svelte.d.ts +22 -0
  9. package/dist/components/compounds/Alert.svelte +67 -0
  10. package/dist/components/compounds/Alert.svelte.d.ts +8 -0
  11. package/dist/components/compounds/AppBar.svelte +77 -0
  12. package/dist/components/compounds/AppBar.svelte.d.ts +20 -0
  13. package/dist/components/compounds/BottomNav.svelte +75 -0
  14. package/dist/components/compounds/BottomNav.svelte.d.ts +18 -0
  15. package/dist/components/compounds/Breadcrumb.svelte +49 -0
  16. package/dist/components/compounds/Breadcrumb.svelte.d.ts +4 -0
  17. package/dist/components/compounds/Calendar.svelte +116 -0
  18. package/dist/components/compounds/Calendar.svelte.d.ts +47 -0
  19. package/dist/components/compounds/Card.svelte +77 -0
  20. package/dist/components/compounds/Card.svelte.d.ts +8 -0
  21. package/dist/components/compounds/Combobox.svelte +327 -0
  22. package/dist/components/compounds/Combobox.svelte.d.ts +69 -0
  23. package/dist/components/compounds/Confirm.svelte +90 -0
  24. package/dist/components/compounds/Confirm.svelte.d.ts +4 -0
  25. package/dist/components/compounds/DataTable.svelte +133 -0
  26. package/dist/components/compounds/DataTable.svelte.d.ts +69 -0
  27. package/dist/components/compounds/DatePicker.svelte +135 -0
  28. package/dist/components/compounds/DatePicker.svelte.d.ts +46 -0
  29. package/dist/components/compounds/Drawer.svelte +113 -0
  30. package/dist/components/compounds/Drawer.svelte.d.ts +4 -0
  31. package/dist/components/compounds/Dropdown.svelte +91 -0
  32. package/dist/components/compounds/Dropdown.svelte.d.ts +8 -0
  33. package/dist/components/compounds/Empty.svelte +83 -0
  34. package/dist/components/compounds/Empty.svelte.d.ts +4 -0
  35. package/dist/components/compounds/Form.svelte +96 -0
  36. package/dist/components/compounds/Form.svelte.d.ts +7 -0
  37. package/dist/components/compounds/FormField.svelte +56 -0
  38. package/dist/components/compounds/FormField.svelte.d.ts +4 -0
  39. package/dist/components/compounds/InfiniteScroll.svelte +82 -0
  40. package/dist/components/compounds/InfiniteScroll.svelte.d.ts +22 -0
  41. package/dist/components/compounds/Modal.svelte +123 -0
  42. package/dist/components/compounds/Modal.svelte.d.ts +8 -0
  43. package/dist/components/compounds/PageHeader.svelte +44 -0
  44. package/dist/components/compounds/PageHeader.svelte.d.ts +28 -0
  45. package/dist/components/compounds/Pagination.svelte +157 -0
  46. package/dist/components/compounds/Pagination.svelte.d.ts +4 -0
  47. package/dist/components/compounds/Popover.svelte +137 -0
  48. package/dist/components/compounds/Popover.svelte.d.ts +4 -0
  49. package/dist/components/compounds/PullRefresh.svelte +98 -0
  50. package/dist/components/compounds/PullRefresh.svelte.d.ts +16 -0
  51. package/dist/components/compounds/Result.svelte +84 -0
  52. package/dist/components/compounds/Result.svelte.d.ts +4 -0
  53. package/dist/components/compounds/SafeArea.svelte +37 -0
  54. package/dist/components/compounds/SafeArea.svelte.d.ts +12 -0
  55. package/dist/components/compounds/Skeleton.svelte +75 -0
  56. package/dist/components/compounds/Skeleton.svelte.d.ts +8 -0
  57. package/dist/components/compounds/Steps.svelte +111 -0
  58. package/dist/components/compounds/Steps.svelte.d.ts +4 -0
  59. package/dist/components/compounds/SwipeCell.svelte +115 -0
  60. package/dist/components/compounds/SwipeCell.svelte.d.ts +19 -0
  61. package/dist/components/compounds/Tabs.svelte +79 -0
  62. package/dist/components/compounds/Tabs.svelte.d.ts +8 -0
  63. package/dist/components/compounds/TagInput.svelte +108 -0
  64. package/dist/components/compounds/TagInput.svelte.d.ts +4 -0
  65. package/dist/components/compounds/Timeline.svelte +167 -0
  66. package/dist/components/compounds/Timeline.svelte.d.ts +25 -0
  67. package/dist/components/compounds/ToastContainer.svelte +59 -0
  68. package/dist/components/compounds/ToastContainer.svelte.d.ts +3 -0
  69. package/dist/components/compounds/Tooltip.svelte +41 -0
  70. package/dist/components/compounds/Tooltip.svelte.d.ts +4 -0
  71. package/dist/components/compounds/accordion-types.d.ts +16 -0
  72. package/dist/components/compounds/accordion-types.js +5 -0
  73. package/dist/components/compounds/action-sheet-types.d.ts +14 -0
  74. package/dist/components/compounds/action-sheet-types.js +5 -0
  75. package/dist/components/compounds/bottom-nav-types.d.ts +17 -0
  76. package/dist/components/compounds/bottom-nav-types.js +5 -0
  77. package/dist/components/compounds/index.d.ts +44 -0
  78. package/dist/components/compounds/index.js +54 -0
  79. package/dist/components/compounds/swipe-cell-types.d.ts +14 -0
  80. package/dist/components/compounds/swipe-cell-types.js +5 -0
  81. package/dist/components/compounds/timeline-types.d.ts +20 -0
  82. package/dist/components/compounds/timeline-types.js +5 -0
  83. package/dist/components/index.d.ts +9 -0
  84. package/dist/components/index.js +12 -0
  85. package/dist/components/primitives/Avatar.svelte +104 -0
  86. package/dist/components/primitives/Avatar.svelte.d.ts +8 -0
  87. package/dist/components/primitives/Badge.svelte +33 -0
  88. package/dist/components/primitives/Badge.svelte.d.ts +8 -0
  89. package/dist/components/primitives/BareButton.svelte +45 -0
  90. package/dist/components/primitives/BareButton.svelte.d.ts +4 -0
  91. package/dist/components/primitives/BareInput.svelte +101 -0
  92. package/dist/components/primitives/BareInput.svelte.d.ts +4 -0
  93. package/dist/components/primitives/Button.svelte +60 -0
  94. package/dist/components/primitives/Button.svelte.d.ts +8 -0
  95. package/dist/components/primitives/Checkbox.svelte +58 -0
  96. package/dist/components/primitives/Checkbox.svelte.d.ts +4 -0
  97. package/dist/components/primitives/IconButton.svelte +105 -0
  98. package/dist/components/primitives/IconButton.svelte.d.ts +4 -0
  99. package/dist/components/primitives/Input.svelte +130 -0
  100. package/dist/components/primitives/Input.svelte.d.ts +8 -0
  101. package/dist/components/primitives/Progress.svelte +58 -0
  102. package/dist/components/primitives/Progress.svelte.d.ts +4 -0
  103. package/dist/components/primitives/Radio.svelte +60 -0
  104. package/dist/components/primitives/Radio.svelte.d.ts +25 -0
  105. package/dist/components/primitives/Range.svelte +117 -0
  106. package/dist/components/primitives/Range.svelte.d.ts +27 -0
  107. package/dist/components/primitives/Rating.svelte +148 -0
  108. package/dist/components/primitives/Rating.svelte.d.ts +27 -0
  109. package/dist/components/primitives/Select.svelte +95 -0
  110. package/dist/components/primitives/Select.svelte.d.ts +25 -0
  111. package/dist/components/primitives/Spinner.svelte +54 -0
  112. package/dist/components/primitives/Spinner.svelte.d.ts +4 -0
  113. package/dist/components/primitives/Switch.svelte +53 -0
  114. package/dist/components/primitives/Switch.svelte.d.ts +4 -0
  115. package/dist/components/primitives/Tag.svelte +64 -0
  116. package/dist/components/primitives/Tag.svelte.d.ts +4 -0
  117. package/dist/components/primitives/Textarea.svelte +92 -0
  118. package/dist/components/primitives/Textarea.svelte.d.ts +4 -0
  119. package/dist/components/primitives/ToggleCheckbox.svelte +36 -0
  120. package/dist/components/primitives/ToggleCheckbox.svelte.d.ts +4 -0
  121. package/dist/components/primitives/ToggleInput.svelte +36 -0
  122. package/dist/components/primitives/ToggleInput.svelte.d.ts +4 -0
  123. package/dist/components/primitives/ToggleRadio.svelte +36 -0
  124. package/dist/components/primitives/ToggleRadio.svelte.d.ts +4 -0
  125. package/dist/components/primitives/index.d.ts +26 -0
  126. package/dist/components/primitives/index.js +30 -0
  127. package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte +387 -0
  128. package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte.d.ts +38 -0
  129. package/dist/components/scenes/ai/AiDocumentEditor.svelte +2209 -0
  130. package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +4 -0
  131. package/dist/components/scenes/ai/MarkdownRenderer.svelte +412 -0
  132. package/dist/components/scenes/ai/MarkdownRenderer.svelte.d.ts +4 -0
  133. package/dist/components/scenes/ai/document-download.d.ts +40 -0
  134. package/dist/components/scenes/ai/document-download.js +300 -0
  135. package/dist/components/scenes/ai/document-parse.d.ts +28 -0
  136. package/dist/components/scenes/ai/document-parse.js +243 -0
  137. package/dist/components/scenes/ai/document-types.d.ts +164 -0
  138. package/dist/components/scenes/ai/document-types.js +1 -0
  139. package/dist/components/scenes/ai/highlight.d.ts +26 -0
  140. package/dist/components/scenes/ai/highlight.js +151 -0
  141. package/dist/components/scenes/ai/index.d.ts +17 -0
  142. package/dist/components/scenes/ai/index.js +13 -0
  143. package/dist/components/scenes/ai/markdown-parse.d.ts +32 -0
  144. package/dist/components/scenes/ai/markdown-parse.js +164 -0
  145. package/dist/components/scenes/app/FeedbackModal.svelte +160 -0
  146. package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +47 -0
  147. package/dist/components/scenes/app/LanguageSwitch.svelte +136 -0
  148. package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +50 -0
  149. package/dist/components/scenes/app/SettingsModal.svelte +174 -0
  150. package/dist/components/scenes/app/SettingsModal.svelte.d.ts +31 -0
  151. package/dist/components/scenes/app/ThemeSelector.svelte +176 -0
  152. package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +31 -0
  153. package/dist/components/scenes/app/ThemeToggle.svelte +76 -0
  154. package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +29 -0
  155. package/dist/components/scenes/app/index.d.ts +11 -0
  156. package/dist/components/scenes/app/index.js +11 -0
  157. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +39 -0
  158. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +18 -0
  159. package/dist/components/scenes/crud/CrudDetailDrawer.svelte +155 -0
  160. package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +38 -0
  161. package/dist/components/scenes/crud/CrudEditDrawer.svelte +225 -0
  162. package/dist/components/scenes/crud/CrudEditDrawer.svelte.d.ts +48 -0
  163. package/dist/components/scenes/crud/CrudFilterBar.svelte +96 -0
  164. package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +31 -0
  165. package/dist/components/scenes/crud/CrudPage.svelte +499 -0
  166. package/dist/components/scenes/crud/CrudPage.svelte.d.ts +114 -0
  167. package/dist/components/scenes/crud/crud-types.d.ts +135 -0
  168. package/dist/components/scenes/crud/crud-types.js +7 -0
  169. package/dist/components/scenes/crud/index.d.ts +12 -0
  170. package/dist/components/scenes/crud/index.js +11 -0
  171. package/dist/components/scenes/crypto/EncryptedInput.svelte +156 -0
  172. package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +32 -0
  173. package/dist/components/scenes/crypto/HashDisplay.svelte +97 -0
  174. package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +4 -0
  175. package/dist/components/scenes/crypto/SignatureDisplay.svelte +161 -0
  176. package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +4 -0
  177. package/dist/components/scenes/crypto/index.d.ts +9 -0
  178. package/dist/components/scenes/crypto/index.js +11 -0
  179. package/dist/components/scenes/iam/ChangePasswordForm.svelte +134 -0
  180. package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +8 -0
  181. package/dist/components/scenes/iam/ForgotPasswordForm.svelte +147 -0
  182. package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +4 -0
  183. package/dist/components/scenes/iam/LoginForm.svelte +191 -0
  184. package/dist/components/scenes/iam/LoginForm.svelte.d.ts +8 -0
  185. package/dist/components/scenes/iam/PasswordInput.svelte +208 -0
  186. package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +49 -0
  187. package/dist/components/scenes/iam/PermGuard.svelte +69 -0
  188. package/dist/components/scenes/iam/PermGuard.svelte.d.ts +16 -0
  189. package/dist/components/scenes/iam/RegisterForm.svelte +269 -0
  190. package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +8 -0
  191. package/dist/components/scenes/iam/ResetPasswordForm.svelte +153 -0
  192. package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +8 -0
  193. package/dist/components/scenes/iam/UserProfile.svelte +251 -0
  194. package/dist/components/scenes/iam/UserProfile.svelte.d.ts +4 -0
  195. package/dist/components/scenes/iam/index.d.ts +16 -0
  196. package/dist/components/scenes/iam/index.js +18 -0
  197. package/dist/components/scenes/iam/password-utils.d.ts +15 -0
  198. package/dist/components/scenes/iam/password-utils.js +19 -0
  199. package/dist/components/scenes/iam/permission-context.svelte.d.ts +90 -0
  200. package/dist/components/scenes/iam/permission-context.svelte.js +114 -0
  201. package/dist/components/scenes/index.d.ts +13 -0
  202. package/dist/components/scenes/index.js +20 -0
  203. package/dist/components/scenes/storage/AvatarUpload.svelte +218 -0
  204. package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +4 -0
  205. package/dist/components/scenes/storage/FileList.svelte +260 -0
  206. package/dist/components/scenes/storage/FileList.svelte.d.ts +4 -0
  207. package/dist/components/scenes/storage/FileUpload.svelte +402 -0
  208. package/dist/components/scenes/storage/FileUpload.svelte.d.ts +7 -0
  209. package/dist/components/scenes/storage/ImageUpload.svelte +287 -0
  210. package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +4 -0
  211. package/dist/components/scenes/storage/index.d.ts +10 -0
  212. package/dist/components/scenes/storage/index.js +12 -0
  213. package/dist/components/scenes/types.d.ts +583 -0
  214. package/dist/components/scenes/types.js +7 -0
  215. package/dist/i18n.svelte.d.ts +44 -0
  216. package/dist/i18n.svelte.js +108 -0
  217. package/dist/index.d.ts +13 -0
  218. package/dist/index.js +19 -0
  219. package/dist/messages/en-US.json +242 -0
  220. package/dist/messages/zh-CN.json +242 -0
  221. package/dist/messages.d.ts +29 -0
  222. package/dist/messages.js +42 -0
  223. package/dist/styles/design-tokens.css +58 -0
  224. package/dist/styles/global.css +258 -0
  225. package/dist/styles/mobile.css +105 -0
  226. package/dist/styles/theme.css +31 -0
  227. package/dist/theme-config.d.ts +92 -0
  228. package/dist/theme-config.js +122 -0
  229. package/dist/toast.svelte.d.ts +45 -0
  230. package/dist/toast.svelte.js +77 -0
  231. package/dist/types.d.ts +944 -0
  232. package/dist/types.js +7 -0
  233. package/dist/utils/platform.svelte.d.ts +54 -0
  234. package/dist/utils/platform.svelte.js +89 -0
  235. package/dist/utils.d.ts +46 -0
  236. package/dist/utils.js +163 -0
  237. package/package.json +70 -0
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @h-ai/ui — 类型定义
3
+ *
4
+ * UI 组件相关类型
5
+ * @module types
6
+ */
7
+ export {};
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @h-ai/ui — 平台检测工具
3
+ *
4
+ * 提供运行时平台检测与 Svelte 5 响应式平台状态。
5
+ * @module platform
6
+ */
7
+ /** 运行平台 */
8
+ export type Platform = 'web' | 'h5' | 'android' | 'ios' | 'unknown';
9
+ /**
10
+ * 检测当前运行平台
11
+ *
12
+ * @returns 当前平台标识
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const platform = detectPlatform()
17
+ * if (platform === 'android') {
18
+ * // Android 特定逻辑
19
+ * }
20
+ * ```
21
+ */
22
+ export declare function detectPlatform(): Platform;
23
+ /**
24
+ * 判断是否为移动端
25
+ */
26
+ export declare function isMobile(): boolean;
27
+ /**
28
+ * 判断是否为 Capacitor App
29
+ */
30
+ export declare function isNativeApp(): boolean;
31
+ /**
32
+ * Svelte 5 Runes 响应式平台状态
33
+ *
34
+ * @returns 包含当前平台、是否移动端和是否原生应用的响应式对象
35
+ *
36
+ * @example
37
+ * ```svelte
38
+ * <script>
39
+ * import { usePlatform } from '@hai/ui'
40
+ * const platform = usePlatform()
41
+ * </script>
42
+ *
43
+ * {#if platform.isMobile}
44
+ * <BottomNav />
45
+ * {:else}
46
+ * <Sidebar />
47
+ * {/if}
48
+ * ```
49
+ */
50
+ export declare function usePlatform(): {
51
+ readonly current: Platform;
52
+ readonly isMobile: boolean;
53
+ readonly isApp: boolean;
54
+ };
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @h-ai/ui — 平台检测工具
3
+ *
4
+ * 提供运行时平台检测与 Svelte 5 响应式平台状态。
5
+ * @module platform
6
+ */
7
+ const ANDROID_UA_REGEX = /android/;
8
+ const IOS_UA_REGEX = /iphone|ipad|ipod/;
9
+ /**
10
+ * 检测当前运行平台
11
+ *
12
+ * @returns 当前平台标识
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const platform = detectPlatform()
17
+ * if (platform === 'android') {
18
+ * // Android 特定逻辑
19
+ * }
20
+ * ```
21
+ */
22
+ export function detectPlatform() {
23
+ if (typeof window === 'undefined') {
24
+ return 'unknown';
25
+ }
26
+ const ua = navigator.userAgent.toLowerCase();
27
+ // Capacitor 注入全局标识
28
+ if ('Capacitor' in window) {
29
+ const cap = window.Capacitor;
30
+ const platform = cap?.getPlatform?.();
31
+ if (platform === 'android')
32
+ return 'android';
33
+ if (platform === 'ios')
34
+ return 'ios';
35
+ }
36
+ // 移动端 UA 检测
37
+ if (ANDROID_UA_REGEX.test(ua))
38
+ return 'h5';
39
+ if (IOS_UA_REGEX.test(ua))
40
+ return 'h5';
41
+ // 移动端特征检测
42
+ if ('ontouchstart' in window && navigator.maxTouchPoints > 0 && window.innerWidth < 768) {
43
+ return 'h5';
44
+ }
45
+ return 'web';
46
+ }
47
+ /**
48
+ * 判断是否为移动端
49
+ */
50
+ export function isMobile() {
51
+ const platform = detectPlatform();
52
+ return platform === 'h5' || platform === 'android' || platform === 'ios';
53
+ }
54
+ /**
55
+ * 判断是否为 Capacitor App
56
+ */
57
+ export function isNativeApp() {
58
+ const platform = detectPlatform();
59
+ return platform === 'android' || platform === 'ios';
60
+ }
61
+ /**
62
+ * Svelte 5 Runes 响应式平台状态
63
+ *
64
+ * @returns 包含当前平台、是否移动端和是否原生应用的响应式对象
65
+ *
66
+ * @example
67
+ * ```svelte
68
+ * <script>
69
+ * import { usePlatform } from '@hai/ui'
70
+ * const platform = usePlatform()
71
+ * </script>
72
+ *
73
+ * {#if platform.isMobile}
74
+ * <BottomNav />
75
+ * {:else}
76
+ * <Sidebar />
77
+ * {/if}
78
+ * ```
79
+ */
80
+ export function usePlatform() {
81
+ const current = $state(detectPlatform());
82
+ const mobile = $derived(current === 'h5' || current === 'android' || current === 'ios');
83
+ const app = $derived(current === 'android' || current === 'ios');
84
+ return {
85
+ get current() { return current; },
86
+ get isMobile() { return mobile; },
87
+ get isApp() { return app; },
88
+ };
89
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @h-ai/ui — 样式工具
3
+ *
4
+ * CSS 类名处理工具
5
+ * @module utils
6
+ */
7
+ import type { Size, Variant } from './types.js';
8
+ /**
9
+ * 合并类名(支持 Tailwind 类冲突消解)
10
+ *
11
+ * @param classes - 类名列表
12
+ * @returns 合并后的类名字符串
13
+ */
14
+ export declare function cn(...classes: (string | boolean | undefined | null)[]): string;
15
+ /**
16
+ * 获取变体类名
17
+ */
18
+ export declare function getVariantClass(variant: Variant, prefix?: string): string;
19
+ /**
20
+ * 获取尺寸类名
21
+ */
22
+ export declare function getSizeClass(size: Size, prefix?: string): string;
23
+ /**
24
+ * 输入框尺寸类名
25
+ */
26
+ export declare function getInputSizeClass(size: Size): string;
27
+ /**
28
+ * 徽章变体类名
29
+ */
30
+ export declare function getBadgeVariantClass(variant: Variant): string;
31
+ /**
32
+ * 徽章尺寸类名
33
+ */
34
+ export declare function getBadgeSizeClass(size: Size): string;
35
+ /**
36
+ * 警告框变体类名
37
+ */
38
+ export declare function getAlertVariantClass(variant: Variant): string;
39
+ /**
40
+ * 进度条变体类名
41
+ */
42
+ export declare function getProgressVariantClass(variant: Variant): string;
43
+ /**
44
+ * 生成唯一 ID
45
+ */
46
+ export declare function generateId(prefix?: string): string;
package/dist/utils.js ADDED
@@ -0,0 +1,163 @@
1
+ /**
2
+ * @h-ai/ui — 样式工具
3
+ *
4
+ * CSS 类名处理工具
5
+ * @module utils
6
+ */
7
+ import { twMerge } from 'tailwind-merge';
8
+ /**
9
+ * 合并类名(支持 Tailwind 类冲突消解)
10
+ *
11
+ * @param classes - 类名列表
12
+ * @returns 合并后的类名字符串
13
+ */
14
+ export function cn(...classes) {
15
+ return twMerge(classes.filter(Boolean).join(' '));
16
+ }
17
+ /**
18
+ * 已知前缀的变体类名静态映射
19
+ *
20
+ * 使用静态字符串而非模板字符串拼接,确保 TailwindCSS 可静态扫描到所有类名。
21
+ */
22
+ const VARIANT_MAPS = {
23
+ btn: {
24
+ default: 'btn-neutral',
25
+ primary: 'btn-primary',
26
+ secondary: 'btn-secondary',
27
+ success: 'btn-success',
28
+ warning: 'btn-warning',
29
+ error: 'btn-error',
30
+ info: 'btn-info',
31
+ ghost: 'btn-ghost',
32
+ link: 'btn-link',
33
+ outline: 'btn-outline',
34
+ },
35
+ badge: {
36
+ default: 'badge-neutral',
37
+ primary: 'badge-primary',
38
+ secondary: 'badge-secondary',
39
+ success: 'badge-success',
40
+ warning: 'badge-warning',
41
+ error: 'badge-error',
42
+ info: 'badge-info',
43
+ ghost: 'badge-ghost',
44
+ link: 'badge-link',
45
+ outline: 'badge-outline',
46
+ },
47
+ progress: {
48
+ default: 'progress-neutral',
49
+ primary: 'progress-primary',
50
+ secondary: 'progress-secondary',
51
+ success: 'progress-success',
52
+ warning: 'progress-warning',
53
+ error: 'progress-error',
54
+ info: 'progress-info',
55
+ ghost: 'progress-ghost',
56
+ link: 'progress-link',
57
+ outline: 'progress-outline',
58
+ },
59
+ };
60
+ /**
61
+ * 已知前缀的尺寸类名静态映射
62
+ */
63
+ const SIZE_MAPS = {
64
+ btn: {
65
+ 'xs': 'btn-xs',
66
+ 'sm': 'btn-sm',
67
+ 'md': '',
68
+ 'lg': 'btn-lg',
69
+ 'xl': 'btn-xl',
70
+ '2xl': 'btn-xl',
71
+ '3xl': 'btn-xl',
72
+ '4xl': 'btn-xl',
73
+ },
74
+ badge: {
75
+ 'xs': 'badge-xs',
76
+ 'sm': 'badge-sm',
77
+ 'md': '',
78
+ 'lg': 'badge-lg',
79
+ 'xl': 'badge-xl',
80
+ '2xl': 'badge-xl',
81
+ '3xl': 'badge-xl',
82
+ '4xl': 'badge-xl',
83
+ },
84
+ };
85
+ /**
86
+ * 获取变体类名
87
+ */
88
+ export function getVariantClass(variant, prefix = 'btn') {
89
+ const map = VARIANT_MAPS[prefix];
90
+ if (map)
91
+ return map[variant] ?? map.default;
92
+ // 未预置的前缀回退为动态拼接(调用方需自行确保 Tailwind 可扫描)
93
+ return `${prefix}-${variant === 'default' ? 'neutral' : variant}`;
94
+ }
95
+ /**
96
+ * 获取尺寸类名
97
+ */
98
+ export function getSizeClass(size, prefix = 'btn') {
99
+ if (size === 'md')
100
+ return '';
101
+ const map = SIZE_MAPS[prefix];
102
+ if (map)
103
+ return map[size] ?? '';
104
+ return `${prefix}-${size}`;
105
+ }
106
+ /**
107
+ * 输入框尺寸类名
108
+ */
109
+ export function getInputSizeClass(size) {
110
+ const map = {
111
+ 'xs': 'input-xs',
112
+ 'sm': 'input-sm',
113
+ 'md': '',
114
+ 'lg': 'input-lg',
115
+ 'xl': 'input-xl',
116
+ '2xl': 'input-xl',
117
+ '3xl': 'input-xl',
118
+ '4xl': 'input-xl',
119
+ };
120
+ return map[size] ?? '';
121
+ }
122
+ /**
123
+ * 徽章变体类名
124
+ */
125
+ export function getBadgeVariantClass(variant) {
126
+ return getVariantClass(variant, 'badge');
127
+ }
128
+ /**
129
+ * 徽章尺寸类名
130
+ */
131
+ export function getBadgeSizeClass(size) {
132
+ return getSizeClass(size, 'badge');
133
+ }
134
+ /**
135
+ * 警告框变体类名
136
+ */
137
+ export function getAlertVariantClass(variant) {
138
+ const map = {
139
+ default: 'alert',
140
+ primary: 'alert-primary',
141
+ secondary: 'alert-secondary',
142
+ success: 'alert-success',
143
+ warning: 'alert-warning',
144
+ error: 'alert-error',
145
+ info: 'alert-info',
146
+ ghost: 'alert',
147
+ link: 'alert',
148
+ outline: 'alert',
149
+ };
150
+ return map[variant] ?? map.default;
151
+ }
152
+ /**
153
+ * 进度条变体类名
154
+ */
155
+ export function getProgressVariantClass(variant) {
156
+ return getVariantClass(variant, 'progress');
157
+ }
158
+ /**
159
+ * 生成唯一 ID
160
+ */
161
+ export function generateId(prefix = 'hai') {
162
+ return `${prefix}-${Math.random().toString(36).slice(2, 9)}`;
163
+ }
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@h-ai/ui",
3
+ "type": "module",
4
+ "version": "0.1.0-alpha.10",
5
+ "description": "Hai Framework UI component library for Svelte 5 Runes.",
6
+ "license": "Apache-2.0",
7
+ "svelte": "./dist/index.js",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "svelte": "./dist/index.js",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./auto-import": {
15
+ "types": "./auto-import.d.ts",
16
+ "import": "./auto-import.js"
17
+ },
18
+ "./components/*": {
19
+ "types": "./dist/components/*.d.ts",
20
+ "svelte": "./dist/components/*.js",
21
+ "import": "./dist/components/*.js"
22
+ },
23
+ "./styles/*": "./dist/styles/*"
24
+ },
25
+ "main": "./dist/index.js",
26
+ "types": "./dist/index.d.ts",
27
+ "files": [
28
+ "auto-import.d.ts",
29
+ "auto-import.js",
30
+ "dist"
31
+ ],
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "peerDependencies": {
36
+ "svelte": "^5.53.5"
37
+ },
38
+ "dependencies": {
39
+ "@internationalized/date": "^3.8.0",
40
+ "@shikijs/langs": "^4.0.2",
41
+ "bits-ui": "^2.8.0",
42
+ "marked": "^18.0.0",
43
+ "shiki": "^4.0.2",
44
+ "tailwind-merge": "^3.5.0",
45
+ "@h-ai/core": "0.1.0-alpha.10"
46
+ },
47
+ "devDependencies": {
48
+ "@sveltejs/package": "^2.5.7",
49
+ "@sveltejs/vite-plugin-svelte": "^7.0.0",
50
+ "@types/node": "^25.1.0",
51
+ "jsdom": "^29.0.2",
52
+ "rimraf": "^6.0.1",
53
+ "svelte": "^5.53.5",
54
+ "svelte-check": "^4.4.6",
55
+ "typescript": "^6.0.2",
56
+ "vite": "^8.0.0",
57
+ "vitest": "^4.0.18"
58
+ },
59
+ "scripts": {
60
+ "build": "svelte-package -i src/lib",
61
+ "dev": "svelte-package -i src/lib --watch",
62
+ "check": "svelte-check --tsconfig ./tsconfig.json",
63
+ "test": "vitest run",
64
+ "test:watch": "vitest",
65
+ "typecheck": "tsc --noEmit",
66
+ "lint": "eslint .",
67
+ "lint:fix": "eslint . --fix",
68
+ "clean": "rimraf dist .turbo"
69
+ }
70
+ }