@h-ai/ui 0.1.0-alpha5

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 (234) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +488 -0
  3. package/auto-import.d.ts +96 -0
  4. package/auto-import.js +259 -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 +102 -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 +2259 -0
  130. package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +4 -0
  131. package/dist/components/scenes/ai/MarkdownRenderer.svelte +460 -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/index.d.ts +17 -0
  140. package/dist/components/scenes/ai/index.js +13 -0
  141. package/dist/components/scenes/ai/markdown-parse.d.ts +32 -0
  142. package/dist/components/scenes/ai/markdown-parse.js +161 -0
  143. package/dist/components/scenes/app/FeedbackModal.svelte +160 -0
  144. package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +47 -0
  145. package/dist/components/scenes/app/LanguageSwitch.svelte +136 -0
  146. package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +50 -0
  147. package/dist/components/scenes/app/SettingsModal.svelte +174 -0
  148. package/dist/components/scenes/app/SettingsModal.svelte.d.ts +31 -0
  149. package/dist/components/scenes/app/ThemeSelector.svelte +176 -0
  150. package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +31 -0
  151. package/dist/components/scenes/app/ThemeToggle.svelte +76 -0
  152. package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +29 -0
  153. package/dist/components/scenes/app/index.d.ts +11 -0
  154. package/dist/components/scenes/app/index.js +11 -0
  155. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +39 -0
  156. package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +18 -0
  157. package/dist/components/scenes/crud/CrudDetailDrawer.svelte +155 -0
  158. package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +38 -0
  159. package/dist/components/scenes/crud/CrudEditDrawer.svelte +222 -0
  160. package/dist/components/scenes/crud/CrudEditDrawer.svelte.d.ts +48 -0
  161. package/dist/components/scenes/crud/CrudFilterBar.svelte +96 -0
  162. package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +31 -0
  163. package/dist/components/scenes/crud/CrudPage.svelte +499 -0
  164. package/dist/components/scenes/crud/CrudPage.svelte.d.ts +114 -0
  165. package/dist/components/scenes/crud/crud-types.d.ts +135 -0
  166. package/dist/components/scenes/crud/crud-types.js +7 -0
  167. package/dist/components/scenes/crud/index.d.ts +12 -0
  168. package/dist/components/scenes/crud/index.js +11 -0
  169. package/dist/components/scenes/crypto/EncryptedInput.svelte +156 -0
  170. package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +32 -0
  171. package/dist/components/scenes/crypto/HashDisplay.svelte +97 -0
  172. package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +4 -0
  173. package/dist/components/scenes/crypto/SignatureDisplay.svelte +161 -0
  174. package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +4 -0
  175. package/dist/components/scenes/crypto/index.d.ts +9 -0
  176. package/dist/components/scenes/crypto/index.js +11 -0
  177. package/dist/components/scenes/iam/ChangePasswordForm.svelte +134 -0
  178. package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +8 -0
  179. package/dist/components/scenes/iam/ForgotPasswordForm.svelte +147 -0
  180. package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +4 -0
  181. package/dist/components/scenes/iam/LoginForm.svelte +191 -0
  182. package/dist/components/scenes/iam/LoginForm.svelte.d.ts +8 -0
  183. package/dist/components/scenes/iam/PasswordInput.svelte +203 -0
  184. package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +49 -0
  185. package/dist/components/scenes/iam/PermGuard.svelte +69 -0
  186. package/dist/components/scenes/iam/PermGuard.svelte.d.ts +16 -0
  187. package/dist/components/scenes/iam/RegisterForm.svelte +269 -0
  188. package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +8 -0
  189. package/dist/components/scenes/iam/ResetPasswordForm.svelte +153 -0
  190. package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +8 -0
  191. package/dist/components/scenes/iam/UserProfile.svelte +251 -0
  192. package/dist/components/scenes/iam/UserProfile.svelte.d.ts +4 -0
  193. package/dist/components/scenes/iam/index.d.ts +16 -0
  194. package/dist/components/scenes/iam/index.js +18 -0
  195. package/dist/components/scenes/iam/password-utils.d.ts +15 -0
  196. package/dist/components/scenes/iam/password-utils.js +19 -0
  197. package/dist/components/scenes/iam/permission-context.svelte.d.ts +90 -0
  198. package/dist/components/scenes/iam/permission-context.svelte.js +114 -0
  199. package/dist/components/scenes/index.d.ts +13 -0
  200. package/dist/components/scenes/index.js +20 -0
  201. package/dist/components/scenes/storage/AvatarUpload.svelte +218 -0
  202. package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +4 -0
  203. package/dist/components/scenes/storage/FileList.svelte +260 -0
  204. package/dist/components/scenes/storage/FileList.svelte.d.ts +4 -0
  205. package/dist/components/scenes/storage/FileUpload.svelte +400 -0
  206. package/dist/components/scenes/storage/FileUpload.svelte.d.ts +7 -0
  207. package/dist/components/scenes/storage/ImageUpload.svelte +285 -0
  208. package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +4 -0
  209. package/dist/components/scenes/storage/index.d.ts +10 -0
  210. package/dist/components/scenes/storage/index.js +12 -0
  211. package/dist/components/scenes/types.d.ts +583 -0
  212. package/dist/components/scenes/types.js +7 -0
  213. package/dist/i18n.svelte.d.ts +44 -0
  214. package/dist/i18n.svelte.js +108 -0
  215. package/dist/index.d.ts +13 -0
  216. package/dist/index.js +19 -0
  217. package/dist/messages/en-US.json +242 -0
  218. package/dist/messages/zh-CN.json +242 -0
  219. package/dist/messages.d.ts +29 -0
  220. package/dist/messages.js +42 -0
  221. package/dist/styles/design-tokens.css +58 -0
  222. package/dist/styles/global.css +218 -0
  223. package/dist/styles/mobile.css +105 -0
  224. package/dist/theme-config.d.ts +92 -0
  225. package/dist/theme-config.js +122 -0
  226. package/dist/toast.svelte.d.ts +45 -0
  227. package/dist/toast.svelte.js +77 -0
  228. package/dist/types.d.ts +944 -0
  229. package/dist/types.js +7 -0
  230. package/dist/utils/platform.svelte.d.ts +54 -0
  231. package/dist/utils/platform.svelte.js +87 -0
  232. package/dist/utils.d.ts +46 -0
  233. package/dist/utils.js +100 -0
  234. package/package.json +69 -0
@@ -0,0 +1,4 @@
1
+ import type { AiDocumentEditorProps } from './document-types.js';
2
+ declare const AiDocumentEditor: import("svelte").Component<AiDocumentEditorProps, {}, "editorScrollHost" | "previewHost">;
3
+ type AiDocumentEditor = ReturnType<typeof AiDocumentEditor>;
4
+ export default AiDocumentEditor;
@@ -0,0 +1,460 @@
1
+ <!--
2
+ =============================================================================
3
+ @h-ai/ui - MarkdownRenderer 组件
4
+ =============================================================================
5
+ 通用 Markdown 渲染器,适用于 AI 输出显示、文档预览等场景。
6
+
7
+ 功能特性:
8
+ - GFM (GitHub Flavored Markdown) 全量支持
9
+ - 代码块语法高亮(highlight.js,30+ 语言)
10
+ - 代码块一键复制
11
+ - 响应式表格
12
+ - 任务列表
13
+ - DaisyUI 主题自适应
14
+
15
+ 使用 Svelte 5 Runes ($props, $derived, $effect)
16
+ =============================================================================
17
+ -->
18
+ <script lang='ts'>
19
+ import type { MarkdownRendererProps } from '../types.js'
20
+ import { cn } from '../../../utils.js'
21
+ import { parseMarkdown } from './markdown-parse.js'
22
+
23
+ const {
24
+ content = '',
25
+ class: className = '',
26
+ showCopyButton = true,
27
+ enableHighlight = true,
28
+ breaks = true,
29
+ }: MarkdownRendererProps = $props()
30
+
31
+ /** 解析后的 HTML */
32
+ const html = $derived(
33
+ parseMarkdown(content, { enableHighlight, showCopyButton, breaks }),
34
+ )
35
+
36
+ /** 容器引用 */
37
+ let containerEl: HTMLDivElement | undefined = $state()
38
+
39
+ /**
40
+ * 事件代理:处理代码块复制按钮点击
41
+ */
42
+ function handleClick(e: MouseEvent) {
43
+ const target = e.target as HTMLElement
44
+ const btn = target.closest('[data-copy-code]') as HTMLButtonElement | null
45
+ if (!btn)
46
+ return
47
+
48
+ const codeBlock = btn.closest('.hai-md-code-block')
49
+ const codeEl = codeBlock?.querySelector('code')
50
+ if (!codeEl)
51
+ return
52
+
53
+ const text = codeEl.textContent ?? ''
54
+ navigator.clipboard.writeText(text).then(() => {
55
+ btn.classList.add('hai-md-copied')
56
+ btn.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>`
57
+
58
+ setTimeout(() => {
59
+ btn.classList.remove('hai-md-copied')
60
+ btn.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"/></svg>`
61
+ }, 2000)
62
+ }).catch(() => { /* clipboard API 可能被安全策略禁用 */ })
63
+ }
64
+ </script>
65
+
66
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
67
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
68
+ <div
69
+ bind:this={containerEl}
70
+ class={cn('hai-markdown', className)}
71
+ onclick={handleClick}
72
+ >
73
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -- Markdown HTML 渲染 -->
74
+ {@html html}
75
+ </div>
76
+
77
+ <style>
78
+ /* =========================================================================
79
+ * Markdown 渲染容器 - 基础排版
80
+ * =========================================================================
81
+ * 使用 DaisyUI CSS 变量实现主题自适应
82
+ * ========================================================================= */
83
+
84
+ .hai-markdown {
85
+ line-height: 1.75;
86
+ color: inherit;
87
+ word-wrap: break-word;
88
+ overflow-wrap: break-word;
89
+ }
90
+
91
+ /* ─── 标题 ─── */
92
+
93
+ .hai-markdown :global(h1),
94
+ .hai-markdown :global(h2),
95
+ .hai-markdown :global(h3),
96
+ .hai-markdown :global(h4),
97
+ .hai-markdown :global(h5),
98
+ .hai-markdown :global(h6) {
99
+ font-weight: 700;
100
+ line-height: 1.3;
101
+ margin-top: 1.5em;
102
+ margin-bottom: 0.75em;
103
+ }
104
+
105
+ .hai-markdown :global(h1) {
106
+ font-size: 2em;
107
+ padding-bottom: 0.3em;
108
+ border-bottom: 1px solid oklch(var(--bc) / 0.15);
109
+ }
110
+
111
+ .hai-markdown :global(h2) {
112
+ font-size: 1.5em;
113
+ padding-bottom: 0.25em;
114
+ border-bottom: 1px solid oklch(var(--bc) / 0.1);
115
+ }
116
+
117
+ .hai-markdown :global(h3) {
118
+ font-size: 1.25em;
119
+ }
120
+
121
+ .hai-markdown :global(h4) {
122
+ font-size: 1.1em;
123
+ }
124
+
125
+ .hai-markdown :global(h5) {
126
+ font-size: 1em;
127
+ }
128
+
129
+ .hai-markdown :global(h6) {
130
+ font-size: 0.875em;
131
+ color: oklch(var(--bc) / 0.7);
132
+ }
133
+
134
+ /* 第一个标题不需要上边距 */
135
+ .hai-markdown :global(:first-child) {
136
+ margin-top: 0;
137
+ }
138
+
139
+ /* ─── 段落 ─── */
140
+
141
+ .hai-markdown :global(p) {
142
+ margin-top: 0;
143
+ margin-bottom: 1em;
144
+ }
145
+
146
+ /* ─── 链接 ─── */
147
+
148
+ .hai-markdown :global(a) {
149
+ color: oklch(var(--p));
150
+ text-decoration: none;
151
+ font-weight: 500;
152
+ transition: color 0.15s ease;
153
+ }
154
+
155
+ .hai-markdown :global(a:hover) {
156
+ color: oklch(var(--p) / 0.8);
157
+ text-decoration: underline;
158
+ }
159
+
160
+ /* ─── 粗体、斜体、删除线 ─── */
161
+
162
+ .hai-markdown :global(strong) {
163
+ font-weight: 700;
164
+ }
165
+
166
+ .hai-markdown :global(em) {
167
+ font-style: italic;
168
+ }
169
+
170
+ .hai-markdown :global(del) {
171
+ text-decoration: line-through;
172
+ color: oklch(var(--bc) / 0.55);
173
+ }
174
+
175
+ /* ─── 行内代码 ─── */
176
+
177
+ .hai-markdown :global(:not(pre) > code) {
178
+ padding: 0.2em 0.4em;
179
+ margin: 0 0.1em;
180
+ font-size: 0.875em;
181
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
182
+ background: oklch(var(--bc) / 0.08);
183
+ border-radius: 0.375rem;
184
+ word-break: break-word;
185
+ }
186
+
187
+ /* ─── 代码块容器 ─── */
188
+
189
+ .hai-markdown :global(.hai-md-code-block) {
190
+ position: relative;
191
+ margin: 1em 0;
192
+ border-radius: 0.75rem;
193
+ overflow: hidden;
194
+ background: oklch(var(--n));
195
+ color: oklch(var(--nc));
196
+ }
197
+
198
+ .hai-markdown :global(.hai-md-code-header) {
199
+ display: flex;
200
+ align-items: center;
201
+ justify-content: space-between;
202
+ padding: 0.5rem 1rem;
203
+ min-height: 2.25rem;
204
+ background: oklch(var(--n) / 0.9);
205
+ border-bottom: 1px solid oklch(var(--nc) / 0.1);
206
+ }
207
+
208
+ .hai-markdown :global(.hai-md-code-lang) {
209
+ font-size: 0.75rem;
210
+ font-weight: 500;
211
+ text-transform: uppercase;
212
+ letter-spacing: 0.05em;
213
+ color: oklch(var(--nc) / 0.6);
214
+ user-select: none;
215
+ }
216
+
217
+ .hai-markdown :global(.hai-md-copy-btn) {
218
+ display: flex;
219
+ align-items: center;
220
+ justify-content: center;
221
+ width: 2rem;
222
+ height: 2rem;
223
+ border: none;
224
+ border-radius: 0.375rem;
225
+ background: transparent;
226
+ color: oklch(var(--nc) / 0.5);
227
+ cursor: pointer;
228
+ transition: all 0.15s ease;
229
+ }
230
+
231
+ .hai-markdown :global(.hai-md-copy-btn:hover) {
232
+ background: oklch(var(--nc) / 0.1);
233
+ color: oklch(var(--nc) / 0.9);
234
+ }
235
+
236
+ .hai-markdown :global(.hai-md-copy-btn.hai-md-copied) {
237
+ color: oklch(var(--su, 0.7 0.15 160));
238
+ }
239
+
240
+ .hai-markdown :global(.hai-md-code-block pre) {
241
+ margin: 0;
242
+ padding: 1rem;
243
+ overflow-x: auto;
244
+ background: transparent;
245
+ }
246
+
247
+ .hai-markdown :global(.hai-md-code-block code) {
248
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
249
+ font-size: 0.875rem;
250
+ line-height: 1.6;
251
+ tab-size: 2;
252
+ }
253
+
254
+ /* ─── 引用块 ─── */
255
+
256
+ .hai-markdown :global(blockquote) {
257
+ margin: 1em 0;
258
+ padding: 0.5em 1em;
259
+ border-left: 4px solid oklch(var(--p) / 0.4);
260
+ background: oklch(var(--bc) / 0.03);
261
+ border-radius: 0 0.5rem 0.5rem 0;
262
+ color: oklch(var(--bc) / 0.85);
263
+ }
264
+
265
+ .hai-markdown :global(blockquote p:last-child) {
266
+ margin-bottom: 0;
267
+ }
268
+
269
+ .hai-markdown :global(blockquote blockquote) {
270
+ margin-top: 0.5em;
271
+ }
272
+
273
+ /* ─── 列表 ─── */
274
+
275
+ .hai-markdown :global(ul),
276
+ .hai-markdown :global(ol) {
277
+ margin: 0.5em 0 1em;
278
+ padding-left: 2em;
279
+ }
280
+
281
+ .hai-markdown :global(ul) {
282
+ list-style-type: disc;
283
+ }
284
+
285
+ .hai-markdown :global(ol) {
286
+ list-style-type: decimal;
287
+ }
288
+
289
+ .hai-markdown :global(li) {
290
+ margin: 0.25em 0;
291
+ line-height: 1.65;
292
+ }
293
+
294
+ .hai-markdown :global(li > ul),
295
+ .hai-markdown :global(li > ol) {
296
+ margin: 0.25em 0;
297
+ }
298
+
299
+ /* 嵌套列表样式 */
300
+ .hai-markdown :global(ul ul) {
301
+ list-style-type: circle;
302
+ }
303
+
304
+ .hai-markdown :global(ul ul ul) {
305
+ list-style-type: square;
306
+ }
307
+
308
+ /* 任务列表 */
309
+ .hai-markdown :global(ul:has(> li > input[type="checkbox"])) {
310
+ list-style: none;
311
+ padding-left: 0;
312
+ }
313
+
314
+ .hai-markdown :global(li > input[type="checkbox"]) {
315
+ margin-right: 0.5em;
316
+ vertical-align: middle;
317
+ accent-color: oklch(var(--p));
318
+ }
319
+
320
+ /* ─── 表格 ─── */
321
+
322
+ .hai-markdown :global(.hai-md-table-wrap) {
323
+ margin: 1em 0;
324
+ overflow-x: auto;
325
+ border-radius: 0.5rem;
326
+ border: 1px solid oklch(var(--bc) / 0.1);
327
+ }
328
+
329
+ .hai-markdown :global(table) {
330
+ width: 100%;
331
+ border-collapse: collapse;
332
+ font-size: 0.9em;
333
+ }
334
+
335
+ .hai-markdown :global(thead) {
336
+ background: oklch(var(--bc) / 0.04);
337
+ }
338
+
339
+ .hai-markdown :global(th) {
340
+ font-weight: 600;
341
+ text-align: left;
342
+ padding: 0.75rem 1rem;
343
+ border-bottom: 2px solid oklch(var(--bc) / 0.12);
344
+ }
345
+
346
+ .hai-markdown :global(td) {
347
+ padding: 0.625rem 1rem;
348
+ border-bottom: 1px solid oklch(var(--bc) / 0.06);
349
+ }
350
+
351
+ .hai-markdown :global(tr:last-child td) {
352
+ border-bottom: none;
353
+ }
354
+
355
+ .hai-markdown :global(tbody tr:hover) {
356
+ background: oklch(var(--bc) / 0.02);
357
+ }
358
+
359
+ /* ─── 水平线 ─── */
360
+
361
+ .hai-markdown :global(hr) {
362
+ height: 0;
363
+ margin: 2em 0;
364
+ border: 0;
365
+ border-top: 1px solid oklch(var(--bc) / 0.12);
366
+ }
367
+
368
+ /* ─── 图片 ─── */
369
+
370
+ .hai-markdown :global(.hai-md-img) {
371
+ max-width: 100%;
372
+ height: auto;
373
+ border-radius: 0.5rem;
374
+ margin: 1em 0;
375
+ }
376
+
377
+ /* ─── KeyBoard 标签 ─── */
378
+
379
+ .hai-markdown :global(kbd) {
380
+ padding: 0.15em 0.4em;
381
+ font-size: 0.85em;
382
+ font-family: ui-monospace, SFMono-Regular, monospace;
383
+ background: oklch(var(--bc) / 0.06);
384
+ border: 1px solid oklch(var(--bc) / 0.15);
385
+ border-radius: 0.25rem;
386
+ box-shadow: inset 0 -1px 0 oklch(var(--bc) / 0.1);
387
+ }
388
+
389
+ /* =========================================================================
390
+ * highlight.js 语法高亮主题 (DaisyUI 自适应)
391
+ * ========================================================================= */
392
+
393
+ .hai-markdown :global(.hljs-keyword),
394
+ .hai-markdown :global(.hljs-selector-tag),
395
+ .hai-markdown :global(.hljs-literal),
396
+ .hai-markdown :global(.hljs-section),
397
+ .hai-markdown :global(.hljs-link) {
398
+ color: oklch(0.7 0.15 280);
399
+ }
400
+
401
+ .hai-markdown :global(.hljs-string),
402
+ .hai-markdown :global(.hljs-addition) {
403
+ color: oklch(0.75 0.12 150);
404
+ }
405
+
406
+ .hai-markdown :global(.hljs-number),
407
+ .hai-markdown :global(.hljs-type) {
408
+ color: oklch(0.78 0.12 70);
409
+ }
410
+
411
+ .hai-markdown :global(.hljs-comment),
412
+ .hai-markdown :global(.hljs-quote),
413
+ .hai-markdown :global(.hljs-meta) {
414
+ color: oklch(var(--nc) / 0.45);
415
+ font-style: italic;
416
+ }
417
+
418
+ .hai-markdown :global(.hljs-title),
419
+ .hai-markdown :global(.hljs-name) {
420
+ color: oklch(0.75 0.12 210);
421
+ }
422
+
423
+ .hai-markdown :global(.hljs-variable),
424
+ .hai-markdown :global(.hljs-template-variable) {
425
+ color: oklch(0.8 0.1 30);
426
+ }
427
+
428
+ .hai-markdown :global(.hljs-built_in),
429
+ .hai-markdown :global(.hljs-builtin-name) {
430
+ color: oklch(0.75 0.15 200);
431
+ }
432
+
433
+ .hai-markdown :global(.hljs-attr),
434
+ .hai-markdown :global(.hljs-attribute) {
435
+ color: oklch(0.78 0.1 80);
436
+ }
437
+
438
+ .hai-markdown :global(.hljs-symbol),
439
+ .hai-markdown :global(.hljs-bullet) {
440
+ color: oklch(0.75 0.12 320);
441
+ }
442
+
443
+ .hai-markdown :global(.hljs-deletion) {
444
+ color: oklch(0.7 0.15 25);
445
+ }
446
+
447
+ .hai-markdown :global(.hljs-regexp),
448
+ .hai-markdown :global(.hljs-selector-id),
449
+ .hai-markdown :global(.hljs-selector-class) {
450
+ color: oklch(0.7 0.15 25);
451
+ }
452
+
453
+ .hai-markdown :global(.hljs-emphasis) {
454
+ font-style: italic;
455
+ }
456
+
457
+ .hai-markdown :global(.hljs-strong) {
458
+ font-weight: 700;
459
+ }
460
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { MarkdownRendererProps } from '../types.js';
2
+ declare const MarkdownRenderer: import("svelte").Component<MarkdownRendererProps, {}, "">;
3
+ type MarkdownRenderer = ReturnType<typeof MarkdownRenderer>;
4
+ export default MarkdownRenderer;
@@ -0,0 +1,40 @@
1
+ import type { MarkdownSourceKind, MarkdownToolbarDownloadAction } from './document-types.js';
2
+ /**
3
+ * 组件内置支持的文档导出格式。
4
+ */
5
+ export type AiDocumentDownloadFormat = 'word' | 'markdown' | 'pdf';
6
+ export interface AiDocumentResolvedDownloadAction {
7
+ /** 菜单项稳定 id;内置格式直接复用格式名,自定义动作沿用上游传入值。 */
8
+ id: string;
9
+ /** 用户可见菜单文案。 */
10
+ label: string;
11
+ /** 可选短标签;保留给外层定制菜单使用。 */
12
+ badgeLabel?: string;
13
+ }
14
+ export interface AiDocumentDownloadRequest {
15
+ /** 用户当前选中的下载动作 id。 */
16
+ actionId: string;
17
+ /** 需要导出的原始 Markdown 或代码正文。 */
18
+ content: string;
19
+ /** 用于导出元信息和默认文件名的标题。 */
20
+ title?: string;
21
+ /** 显式文件名;传入时优先级高于 title。 */
22
+ filename?: string;
23
+ /** 内容来源类型;`code` 会先包装成 fenced markdown 再走统一导出链路。 */
24
+ sourceKind?: MarkdownSourceKind;
25
+ /** `sourceKind=code` 时补充 fenced block 的语言标记。 */
26
+ codeLanguage?: string;
27
+ }
28
+ /**
29
+ * code 类型产物通常只有裸代码正文。
30
+ * 下载和预览都通过同一份规范化逻辑包装成 fenced markdown,避免两边导出的结构不一致。
31
+ */
32
+ export declare function resolveDocumentMarkdownContent(value: string, kind?: MarkdownSourceKind, language?: string): string;
33
+ /**
34
+ * 把自定义动作和内置动作统一归一成统一的菜单项,保证左右两侧下载菜单展示一致。
35
+ */
36
+ export declare function resolveDocumentDownloadActions(actions?: MarkdownToolbarDownloadAction[]): AiDocumentResolvedDownloadAction[];
37
+ /**
38
+ * 执行内置下载动作;未知动作直接跳过,方便外层保留自定义回调扩展口。
39
+ */
40
+ export declare function downloadAiDocument(request: AiDocumentDownloadRequest): Promise<void>;