sparkdesign 0.0.1 → 0.2.6

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 (403) hide show
  1. package/README.md +279 -5
  2. package/cli/dist/commands/add.js +84 -0
  3. package/cli/dist/commands/diff.js +54 -0
  4. package/cli/dist/commands/init.js +96 -0
  5. package/cli/dist/commands/list.js +25 -0
  6. package/cli/dist/index.js +37 -0
  7. package/cli/dist/utils/config.js +53 -0
  8. package/cli/dist/utils/registry.js +34 -0
  9. package/cli/dist/utils/tokens.js +90 -0
  10. package/cli/dist/utils/transform.js +19 -0
  11. package/cli/registry/basic/alert-dialog.tsx +180 -0
  12. package/cli/registry/basic/avatar.tsx +120 -0
  13. package/cli/registry/basic/button.tsx +100 -0
  14. package/cli/registry/basic/collapse.tsx +94 -0
  15. package/cli/registry/basic/collapsible-card.tsx +230 -0
  16. package/cli/registry/basic/collapsible.tsx +21 -0
  17. package/cli/registry/basic/dropdown-menu.tsx +254 -0
  18. package/cli/registry/basic/icon-button.tsx +66 -0
  19. package/cli/registry/basic/icons-inline.tsx +206 -0
  20. package/cli/registry/basic/kbd.tsx +50 -0
  21. package/cli/registry/basic/option-list.tsx +125 -0
  22. package/cli/registry/basic/pagination.tsx +132 -0
  23. package/cli/registry/basic/progress.tsx +42 -0
  24. package/cli/registry/basic/radio-group.tsx +69 -0
  25. package/cli/registry/basic/resizable.tsx +67 -0
  26. package/cli/registry/basic/scrollbar.tsx +114 -0
  27. package/cli/registry/basic/select.tsx +177 -0
  28. package/cli/registry/basic/skeleton.tsx +33 -0
  29. package/cli/registry/basic/slider.tsx +55 -0
  30. package/cli/registry/basic/sonner.tsx +104 -0
  31. package/cli/registry/basic/spinner.tsx +17 -0
  32. package/cli/registry/basic/switch.tsx +49 -0
  33. package/cli/registry/basic/table.tsx +117 -0
  34. package/cli/registry/basic/tabs.tsx +85 -0
  35. package/cli/registry/basic/tag.tsx +161 -0
  36. package/cli/registry/basic/theme-from-document.ts +10 -0
  37. package/cli/registry/basic/toggle.tsx +223 -0
  38. package/cli/registry/basic/tooltip.tsx +80 -0
  39. package/cli/registry/basic/typography.tsx +201 -0
  40. package/cli/registry/chat/browser-use-part.tsx +166 -0
  41. package/cli/registry/chat/chat-input/chat-input-folder-selector.tsx +185 -0
  42. package/cli/registry/chat/chat-input/chat-input-model-switcher.tsx +131 -0
  43. package/cli/registry/chat/chat-input/chat-input-textarea.tsx +67 -0
  44. package/cli/registry/chat/chat-input/compound.tsx +334 -0
  45. package/cli/registry/chat/chat-input/context.tsx +189 -0
  46. package/cli/registry/chat/chat-input/folder-permission-dialog.tsx +61 -0
  47. package/cli/registry/chat/chat-input/index.tsx +123 -0
  48. package/cli/registry/chat/chat-input/types.ts +77 -0
  49. package/cli/registry/chat/chat-input/useAutoResizeTextarea.ts +20 -0
  50. package/cli/registry/chat/code-block-part.tsx +151 -0
  51. package/cli/registry/chat/file-attachment.tsx +44 -0
  52. package/cli/registry/chat/file-card.tsx +68 -0
  53. package/cli/registry/chat/file-review-part.tsx +259 -0
  54. package/cli/registry/chat/folder-button.tsx +169 -0
  55. package/cli/registry/chat/generated-images-grid.tsx +56 -0
  56. package/cli/registry/chat/generation-status-bar.tsx +72 -0
  57. package/cli/registry/chat/image-attachment.tsx +166 -0
  58. package/cli/registry/chat/image-generating.tsx +281 -0
  59. package/cli/registry/chat/markdown.tsx +146 -0
  60. package/cli/registry/chat/mermaid-part.tsx +90 -0
  61. package/cli/registry/chat/permission-card.tsx +178 -0
  62. package/cli/registry/chat/plan-part.tsx +168 -0
  63. package/cli/registry/chat/question-part.tsx +70 -0
  64. package/cli/registry/chat/queue-indicator.tsx +234 -0
  65. package/cli/registry/chat/reasoning-step.tsx +358 -0
  66. package/cli/registry/chat/related-prompts.tsx +91 -0
  67. package/cli/registry/chat/request.tsx +38 -0
  68. package/cli/registry/chat/response.tsx +271 -0
  69. package/cli/registry/chat/send-button.tsx +94 -0
  70. package/cli/registry/chat/sidebar-menu.tsx +177 -0
  71. package/cli/registry/chat/streaming-markdown-block.tsx +111 -0
  72. package/cli/registry/chat/suggestion-part.tsx +165 -0
  73. package/cli/registry/chat/task-part.tsx +109 -0
  74. package/cli/registry/chat/terminal-code-block-part.tsx +69 -0
  75. package/cli/registry/chat/thinking-indicator.tsx +91 -0
  76. package/cli/registry/chat/tool-invocation-card.tsx +132 -0
  77. package/cli/registry/chat/user-question/UserQuestionCard.tsx +198 -0
  78. package/cli/registry/chat/user-question/UserQuestionFooter.tsx +66 -0
  79. package/cli/registry/chat/user-question/UserQuestionHeader.tsx +64 -0
  80. package/cli/registry/chat/user-question/index.tsx +340 -0
  81. package/cli/registry/chat/user-question/types.ts +61 -0
  82. package/cli/registry/chat/user-question/useUserQuestionKeyboard.ts +127 -0
  83. package/cli/registry/chat/user-question/useUserQuestionState.ts +165 -0
  84. package/cli/registry/chat/user-question-answer.tsx +62 -0
  85. package/cli/registry/lib/file-icon-maps.ts +150 -0
  86. package/cli/registry/lib/use-mermaid-render.ts +76 -0
  87. package/cli/registry/lib/utils.ts +6 -0
  88. package/cli/registry/meta.json +1 -0
  89. package/cli/registry/tokens/scale.css +299 -0
  90. package/cli/registry/tokens/theme.css +633 -0
  91. package/dist/_basePickBy-DnQN8w3y.js +151 -0
  92. package/dist/_basePickBy-a-kPMlkg.cjs +1 -0
  93. package/dist/_baseUniq-B-N2NQ50.js +614 -0
  94. package/dist/_baseUniq-Cc_zbSif.cjs +1 -0
  95. package/dist/arc-BQBhijZ6.js +83 -0
  96. package/dist/arc-mWQt0Yph.cjs +1 -0
  97. package/dist/architectureDiagram-VXUJARFQ-BMZEucno.cjs +36 -0
  98. package/dist/architectureDiagram-VXUJARFQ-DTdjD3Bp.js +4661 -0
  99. package/dist/blockDiagram-VD42YOAC-CzHn0yob.js +2256 -0
  100. package/dist/blockDiagram-VD42YOAC-DDxdHAlz.cjs +122 -0
  101. package/dist/c4Diagram-YG6GDRKO-4Gz0I4gj.cjs +10 -0
  102. package/dist/c4Diagram-YG6GDRKO-BIy--yVN.js +1580 -0
  103. package/dist/channel-BQn0o8bs.js +5 -0
  104. package/dist/channel-DaN7XniJ.cjs +1 -0
  105. package/dist/chunk-4BX2VUAB-BlQFTQqz.cjs +1 -0
  106. package/dist/chunk-4BX2VUAB-Czitj3Kc.js +8 -0
  107. package/dist/chunk-55IACEB6-DXacNZbO.js +8 -0
  108. package/dist/chunk-55IACEB6-DnDxpye9.cjs +1 -0
  109. package/dist/chunk-B4BG7PRW-CBdN0q_V.js +1375 -0
  110. package/dist/chunk-B4BG7PRW-DbGvUkGO.cjs +165 -0
  111. package/dist/chunk-DI55MBZ5-D1YJMs6x.cjs +220 -0
  112. package/dist/chunk-DI55MBZ5-NCQTvayw.js +1370 -0
  113. package/dist/chunk-FMBD7UC4-CsGMbrtr.js +19 -0
  114. package/dist/chunk-FMBD7UC4-Di7cUUh5.cjs +15 -0
  115. package/dist/chunk-QN33PNHL-0j5LC8Lm.cjs +1 -0
  116. package/dist/chunk-QN33PNHL-3GERZBRm.js +19 -0
  117. package/dist/chunk-QZHKN3VN-AVEY9ImQ.js +15 -0
  118. package/dist/chunk-QZHKN3VN-s8Z0a8mc.cjs +1 -0
  119. package/dist/chunk-TZMSLE5B-CAf87HPt.cjs +1 -0
  120. package/dist/chunk-TZMSLE5B-sbiflal0.js +64 -0
  121. package/dist/classDiagram-2ON5EDUG-Ct9JLIN2.cjs +1 -0
  122. package/dist/classDiagram-2ON5EDUG-Dzfrft3a.js +16 -0
  123. package/dist/classDiagram-v2-WZHVMYZB-Ct9JLIN2.cjs +1 -0
  124. package/dist/classDiagram-v2-WZHVMYZB-Dzfrft3a.js +16 -0
  125. package/dist/clone-Cde_NQ8V.js +8 -0
  126. package/dist/clone-DCNjWuM2.cjs +1 -0
  127. package/dist/cose-bilkent-S5V4N54A-0uLijMro.cjs +1 -0
  128. package/dist/cose-bilkent-S5V4N54A-Bb08N431.js +2608 -0
  129. package/dist/cytoscape.esm-CNUX3VTg.cjs +321 -0
  130. package/dist/cytoscape.esm-Cvf3sx9F.js +18704 -0
  131. package/dist/dagre-6UL2VRFP-CY_Wz5Zd.js +444 -0
  132. package/dist/dagre-6UL2VRFP-Dxe7_qZc.cjs +4 -0
  133. package/dist/defaultLocale-BgPVtth8.js +171 -0
  134. package/dist/defaultLocale-C4wbwF1n.cjs +1 -0
  135. package/dist/diagram-PSM6KHXK-D2bdb7MT.js +531 -0
  136. package/dist/diagram-PSM6KHXK-YF69SUjY.cjs +24 -0
  137. package/dist/diagram-QEK2KX5R-BpUSoh0-.js +217 -0
  138. package/dist/diagram-QEK2KX5R-DZPGteon.cjs +43 -0
  139. package/dist/diagram-S2PKOQOG-ht-zdvFG.cjs +24 -0
  140. package/dist/diagram-S2PKOQOG-zFeLJ50Z.js +142 -0
  141. package/dist/erDiagram-Q2GNP2WA-B38iJ6ts.js +841 -0
  142. package/dist/erDiagram-Q2GNP2WA-RgS80DDU.cjs +60 -0
  143. package/dist/flowDiagram-NV44I4VS-BHilOs2p.cjs +162 -0
  144. package/dist/flowDiagram-NV44I4VS-BrBJcoce.js +1620 -0
  145. package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  146. package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  147. package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  148. package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  149. package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  150. package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  151. package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  152. package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  153. package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  154. package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  155. package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  156. package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  157. package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  158. package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  159. package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  160. package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  161. package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
  162. package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  163. package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  164. package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  165. package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  166. package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  167. package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
  168. package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  169. package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  170. package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
  171. package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  172. package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  173. package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  174. package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  175. package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  176. package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
  177. package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  178. package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  179. package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  180. package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  181. package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  182. package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  183. package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  184. package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  185. package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  186. package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  187. package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  188. package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
  189. package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  190. package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  191. package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  192. package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  193. package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  194. package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  195. package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  196. package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  197. package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  198. package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  199. package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  200. package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  201. package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  202. package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  203. package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  204. package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  205. package/dist/ganttDiagram-JELNMOA3-pZiJeFio.cjs +267 -0
  206. package/dist/ganttDiagram-JELNMOA3-tw6FhkWJ.js +2670 -0
  207. package/dist/gitGraphDiagram-V2S2FVAM-BWn5uIK5.js +699 -0
  208. package/dist/gitGraphDiagram-V2S2FVAM-DKKeG-9R.cjs +65 -0
  209. package/dist/graph-DIbblrZP.cjs +1 -0
  210. package/dist/graph-DPcK91G3.js +247 -0
  211. package/dist/infoDiagram-HS3SLOUP-B8gwwhct.cjs +2 -0
  212. package/dist/infoDiagram-HS3SLOUP-D47PNcP_.js +24 -0
  213. package/dist/init-CHZsXQcr.cjs +1 -0
  214. package/dist/init-DjUOC4st.js +16 -0
  215. package/dist/journeyDiagram-XKPGCS4Q-BG3cfhyU.js +834 -0
  216. package/dist/journeyDiagram-XKPGCS4Q-D8DVLJof.cjs +139 -0
  217. package/dist/kanban-definition-3W4ZIXB7-4OCnEouP.cjs +89 -0
  218. package/dist/kanban-definition-3W4ZIXB7-CWi_ssF9.js +719 -0
  219. package/dist/katex.css +1 -0
  220. package/dist/layout-Byuh8f-J.cjs +1 -0
  221. package/dist/layout-CdLdvj1j.js +1335 -0
  222. package/dist/linear-C2Q_PI9B.js +259 -0
  223. package/dist/linear-C69aPBW1.cjs +1 -0
  224. package/dist/mermaid.core-DBwAx_jp.cjs +249 -0
  225. package/dist/mermaid.core-gFR0XUlD.js +15300 -0
  226. package/dist/mindmap-definition-VGOIOE7T-8P7obVV4.cjs +68 -0
  227. package/dist/mindmap-definition-VGOIOE7T-DnOa7WJ9.js +784 -0
  228. package/dist/ordinal-B6-f3MAq.js +61 -0
  229. package/dist/ordinal-CagbB1m8.cjs +1 -0
  230. package/dist/pieDiagram-ADFJNKIX-5NAlvhMo.js +161 -0
  231. package/dist/pieDiagram-ADFJNKIX-CQBG4yR9.cjs +30 -0
  232. package/dist/qoder-design.css +2 -0
  233. package/dist/quadrantDiagram-AYHSOK5B-Oe4y7RZ0.cjs +7 -0
  234. package/dist/quadrantDiagram-AYHSOK5B-rh2DPEP1.js +1022 -0
  235. package/dist/registry/basic/alert-dialog.d.ts +40 -0
  236. package/dist/registry/basic/avatar.d.ts +30 -0
  237. package/dist/registry/basic/button.d.ts +16 -0
  238. package/dist/registry/basic/collapse.d.ts +22 -0
  239. package/dist/registry/basic/collapsible-card.d.ts +34 -0
  240. package/dist/registry/basic/collapsible.d.ts +15 -0
  241. package/dist/registry/basic/dropdown-menu.d.ts +52 -0
  242. package/dist/registry/basic/icon-button.d.ts +12 -0
  243. package/dist/registry/basic/icons-inline.d.ts +51 -0
  244. package/dist/registry/basic/kbd.d.ts +23 -0
  245. package/dist/registry/basic/option-list.d.ts +16 -0
  246. package/dist/registry/basic/pagination.d.ts +33 -0
  247. package/dist/registry/basic/progress.d.ts +18 -0
  248. package/dist/registry/basic/radio-group.d.ts +25 -0
  249. package/dist/registry/basic/resizable.d.ts +318 -0
  250. package/dist/registry/basic/scrollbar.d.ts +12 -0
  251. package/dist/registry/basic/select.d.ts +35 -0
  252. package/dist/registry/basic/skeleton.d.ts +10 -0
  253. package/dist/registry/basic/slider.d.ts +16 -0
  254. package/dist/registry/basic/sonner.d.ts +23 -0
  255. package/dist/registry/basic/spinner.d.ts +5 -0
  256. package/dist/registry/basic/switch.d.ts +20 -0
  257. package/dist/registry/basic/table.d.ts +18 -0
  258. package/dist/registry/basic/tabs.d.ts +29 -0
  259. package/dist/registry/basic/tag.d.ts +23 -0
  260. package/dist/registry/basic/theme-from-document.d.ts +10 -0
  261. package/dist/registry/basic/toggle.d.ts +29 -0
  262. package/dist/registry/basic/tooltip.d.ts +34 -0
  263. package/dist/registry/basic/typography.d.ts +76 -0
  264. package/dist/registry/chat/browser-use-part.d.ts +28 -0
  265. package/dist/registry/chat/chat-input/chat-input-folder-selector.d.ts +22 -0
  266. package/dist/registry/chat/chat-input/chat-input-model-switcher.d.ts +12 -0
  267. package/dist/registry/chat/chat-input/chat-input-textarea.d.ts +9 -0
  268. package/dist/registry/chat/chat-input/compound.d.ts +97 -0
  269. package/dist/registry/chat/chat-input/context.d.ts +64 -0
  270. package/dist/registry/chat/chat-input/folder-permission-dialog.d.ts +11 -0
  271. package/dist/registry/chat/chat-input/index.d.ts +34 -0
  272. package/dist/registry/chat/chat-input/types.d.ts +79 -0
  273. package/dist/registry/chat/chat-input/useAutoResizeTextarea.d.ts +7 -0
  274. package/dist/registry/chat/code-block-part.d.ts +23 -0
  275. package/dist/registry/chat/file-attachment.d.ts +19 -0
  276. package/dist/registry/chat/file-card.d.ts +10 -0
  277. package/dist/registry/chat/file-review-part.d.ts +30 -0
  278. package/dist/registry/chat/folder-button.d.ts +20 -0
  279. package/dist/registry/chat/generated-images-grid.d.ts +15 -0
  280. package/dist/registry/chat/generation-status-bar.d.ts +19 -0
  281. package/dist/registry/chat/image-attachment.d.ts +19 -0
  282. package/dist/registry/chat/image-generating.d.ts +15 -0
  283. package/dist/registry/chat/markdown.d.ts +8 -0
  284. package/dist/registry/chat/mermaid-part.d.ts +17 -0
  285. package/dist/registry/chat/permission-card.d.ts +24 -0
  286. package/dist/registry/chat/plan-part.d.ts +30 -0
  287. package/dist/registry/chat/question-part.d.ts +24 -0
  288. package/dist/registry/chat/queue-indicator.d.ts +27 -0
  289. package/dist/registry/chat/reasoning-step.d.ts +35 -0
  290. package/dist/registry/chat/related-prompts.d.ts +23 -0
  291. package/dist/registry/chat/request.d.ts +6 -0
  292. package/dist/registry/chat/response.d.ts +28 -0
  293. package/dist/registry/chat/send-button.d.ts +17 -0
  294. package/dist/registry/chat/sidebar-menu.d.ts +23 -0
  295. package/dist/registry/chat/streaming-markdown-block.d.ts +8 -0
  296. package/dist/registry/chat/suggestion-part.d.ts +28 -0
  297. package/dist/registry/chat/task-part.d.ts +28 -0
  298. package/dist/registry/chat/terminal-code-block-part.d.ts +18 -0
  299. package/dist/registry/chat/thinking-indicator.d.ts +14 -0
  300. package/dist/registry/chat/tool-invocation-card.d.ts +20 -0
  301. package/dist/registry/chat/user-question/UserQuestionCard.d.ts +30 -0
  302. package/dist/registry/chat/user-question/UserQuestionFooter.d.ts +18 -0
  303. package/dist/registry/chat/user-question/UserQuestionHeader.d.ts +20 -0
  304. package/dist/registry/chat/user-question/index.d.ts +7 -0
  305. package/dist/registry/chat/user-question/types.d.ts +52 -0
  306. package/dist/registry/chat/user-question/useUserQuestionKeyboard.d.ts +18 -0
  307. package/dist/registry/chat/user-question/useUserQuestionState.d.ts +26 -0
  308. package/dist/registry/chat/user-question-answer.d.ts +13 -0
  309. package/dist/registry/lib/file-icon-maps.d.ts +20 -0
  310. package/dist/registry/lib/use-mermaid-render.d.ts +5 -0
  311. package/dist/registry/lib/utils.d.ts +11 -0
  312. package/dist/requirementDiagram-UZGBJVZJ-DcWaCuXr.js +850 -0
  313. package/dist/requirementDiagram-UZGBJVZJ-gfdlrFiq.cjs +64 -0
  314. package/dist/sankeyDiagram-TZEHDZUN-CQIKFwD0.js +810 -0
  315. package/dist/sankeyDiagram-TZEHDZUN-DvPtzQvC.cjs +10 -0
  316. package/dist/scale.css +307 -0
  317. package/dist/sequenceDiagram-WL72ISMW-BNrsMagL.cjs +145 -0
  318. package/dist/sequenceDiagram-WL72ISMW-iCX3ckKx.js +2511 -0
  319. package/dist/spark-design.cjs.js +265 -0
  320. package/dist/spark-design.es.js +13207 -0
  321. package/dist/src/components/chat/BrowserUsePart/index.d.ts +7 -0
  322. package/dist/src/components/chat/ChatInput/index.d.ts +29 -0
  323. package/dist/src/components/chat/CodeBlockPart/index.d.ts +7 -0
  324. package/dist/src/components/chat/CollapsibleCard/index.d.ts +7 -0
  325. package/dist/src/components/chat/FileAttachment/index.d.ts +3 -0
  326. package/dist/src/components/chat/FileCard/index.d.ts +3 -0
  327. package/dist/src/components/chat/FileReviewPart/index.d.ts +7 -0
  328. package/dist/src/components/chat/FolderButton/index.d.ts +5 -0
  329. package/dist/src/components/chat/GeneratedImagesGrid/index.d.ts +7 -0
  330. package/dist/src/components/chat/GenerationStatusBar/index.d.ts +7 -0
  331. package/dist/src/components/chat/ImageAttachment/index.d.ts +3 -0
  332. package/dist/src/components/chat/ImageGenerating/index.d.ts +6 -0
  333. package/dist/src/components/chat/Markdown/demo-content.d.ts +1 -0
  334. package/dist/src/components/chat/Markdown/index.d.ts +7 -0
  335. package/dist/src/components/chat/MermaidPart/index.d.ts +6 -0
  336. package/dist/src/components/chat/PermissionCard/index.d.ts +4 -0
  337. package/dist/src/components/chat/PlanPart/index.d.ts +6 -0
  338. package/dist/src/components/chat/QuestionPart/index.d.ts +6 -0
  339. package/dist/src/components/chat/QueueIndicator/index.d.ts +4 -0
  340. package/dist/src/components/chat/ReasoningStep/index.d.ts +7 -0
  341. package/dist/src/components/chat/RelatedPrompts/index.d.ts +6 -0
  342. package/dist/src/components/chat/Request/index.d.ts +7 -0
  343. package/dist/src/components/chat/Response/StreamingMarkdownBlock.d.ts +6 -0
  344. package/dist/src/components/chat/Response/index.d.ts +6 -0
  345. package/dist/src/components/chat/SendButton/index.d.ts +5 -0
  346. package/dist/src/components/chat/SidebarMenu/index.d.ts +4 -0
  347. package/dist/src/components/chat/SuggestionPart/index.d.ts +6 -0
  348. package/dist/src/components/chat/TaskPart/index.d.ts +7 -0
  349. package/dist/src/components/chat/TerminalCodeBlockPart/index.d.ts +6 -0
  350. package/dist/src/components/chat/ThinkingIndicator/index.d.ts +6 -0
  351. package/dist/src/components/chat/ToolInvocationCard/index.d.ts +4 -0
  352. package/dist/src/components/chat/UserQuestion/index.d.ts +5 -0
  353. package/dist/src/components/chat/UserQuestionAnswer/index.d.ts +3 -0
  354. package/dist/src/components/foundation/AlertDialog/index.d.ts +20 -0
  355. package/dist/src/components/foundation/Avatar/index.d.ts +7 -0
  356. package/dist/src/components/foundation/Button/index.d.ts +7 -0
  357. package/dist/src/components/foundation/Collapse/index.d.ts +15 -0
  358. package/dist/src/components/foundation/Collapsible/index.d.ts +7 -0
  359. package/dist/src/components/foundation/CollapsibleSection/index.d.ts +43 -0
  360. package/dist/src/components/foundation/DropdownMenu/index.d.ts +19 -0
  361. package/dist/src/components/foundation/EllipsisText/index.d.ts +53 -0
  362. package/dist/src/components/foundation/IconButton/index.d.ts +7 -0
  363. package/dist/src/components/foundation/Kbd/index.d.ts +7 -0
  364. package/dist/src/components/foundation/OptionList/index.d.ts +7 -0
  365. package/dist/src/components/foundation/Pagination/index.d.ts +7 -0
  366. package/dist/src/components/foundation/Progress/index.d.ts +7 -0
  367. package/dist/src/components/foundation/RadioGroup/index.d.ts +7 -0
  368. package/dist/src/components/foundation/Resizable/index.d.ts +7 -0
  369. package/dist/src/components/foundation/Scrollbar/index.d.ts +7 -0
  370. package/dist/src/components/foundation/Select/index.d.ts +17 -0
  371. package/dist/src/components/foundation/Skeleton/index.d.ts +7 -0
  372. package/dist/src/components/foundation/Slider/index.d.ts +7 -0
  373. package/dist/src/components/foundation/Spinner/index.d.ts +7 -0
  374. package/dist/src/components/foundation/Switch/index.d.ts +38 -0
  375. package/dist/src/components/foundation/Table/index.d.ts +7 -0
  376. package/dist/src/components/foundation/Tabs/index.d.ts +7 -0
  377. package/dist/src/components/foundation/Tag/index.d.ts +10 -0
  378. package/dist/src/components/foundation/Toast/index.d.ts +12 -0
  379. package/dist/src/components/foundation/Toggle/index.d.ts +7 -0
  380. package/dist/src/components/foundation/Tooltip/index.d.ts +21 -0
  381. package/dist/src/components/foundation/Typography/index.d.ts +7 -0
  382. package/dist/src/components/index.d.ts +136 -0
  383. package/dist/src/icons/context.d.ts +26 -0
  384. package/dist/src/icons/types.d.ts +18 -0
  385. package/dist/src/lib/ThemeStyleContext.d.ts +21 -0
  386. package/dist/src/lib/file-icon.d.ts +16 -0
  387. package/dist/src/lib/i18n.d.ts +12 -0
  388. package/dist/src/lib/index.d.ts +10 -0
  389. package/dist/src/lib/motion.d.ts +22 -0
  390. package/dist/src/lib/utils.d.ts +11 -0
  391. package/dist/stateDiagram-FKZM4ZOC-DBvJ_eeL.cjs +1 -0
  392. package/dist/stateDiagram-FKZM4ZOC-ZVsJlaHJ.js +263 -0
  393. package/dist/stateDiagram-v2-4FDKWEC3-CB_nTHcE.js +16 -0
  394. package/dist/stateDiagram-v2-4FDKWEC3-Xkx17v6T.cjs +1 -0
  395. package/dist/theme.css +804 -0
  396. package/dist/timeline-definition-IT6M3QCI-BmGkYQiz.cjs +61 -0
  397. package/dist/timeline-definition-IT6M3QCI-Ck8zTt6w.js +795 -0
  398. package/dist/treemap-GDKQZRPO-B9sfERx8.js +17922 -0
  399. package/dist/treemap-GDKQZRPO-BVfJRs0Z.cjs +160 -0
  400. package/dist/xychartDiagram-PRI3JC2R-By_S8NzN.js +1340 -0
  401. package/dist/xychartDiagram-PRI3JC2R-CNfDrGxM.cjs +7 -0
  402. package/package.json +111 -9
  403. package/index.js +0 -5
@@ -0,0 +1,123 @@
1
+ import React, { forwardRef } from 'react'
2
+ import type { ReactNode } from 'react'
3
+ import { ChatInputRootProvider } from './context'
4
+ import {
5
+ ChatInputAbove,
6
+ ChatInputBox,
7
+ ChatInputAttachments,
8
+ ChatInputInput,
9
+ ChatInputActions,
10
+ ChatInputActionsLeft,
11
+ ChatInputActionsRight,
12
+ ChatInputExpandButton,
13
+ ChatInputFolderButton,
14
+ ChatInputMoreButton,
15
+ ChatInputSendButton,
16
+ ChatInputFooterLeft,
17
+ ChatInputDefaultLayout,
18
+ } from './compound'
19
+ import type { ChatInputProps } from './types'
20
+
21
+ export type {
22
+ ChatInputProps,
23
+ FolderPermissionConfig,
24
+ GenerationStatusConfig,
25
+ FooterLeftModelSwitchConfig,
26
+ FooterLeftModelSwitchItem,
27
+ } from './types'
28
+
29
+ function hasAttachmentsValue(attachments: ChatInputProps['attachments']): boolean {
30
+ if (attachments == null || attachments === false) return false
31
+ if (typeof attachments === 'object' && !React.isValidElement(attachments)) {
32
+ return !!(attachments as { files?: ReactNode }).files || !!(attachments as { images?: ReactNode }).images
33
+ }
34
+ return true
35
+ }
36
+
37
+ export interface ChatInputCompound {
38
+ Root: typeof ChatInputRootProvider
39
+ Above: typeof ChatInputAbove
40
+ Box: typeof ChatInputBox
41
+ Attachments: typeof ChatInputAttachments
42
+ Input: typeof ChatInputInput
43
+ Actions: typeof ChatInputActions
44
+ ActionsLeft: typeof ChatInputActionsLeft
45
+ ActionsRight: typeof ChatInputActionsRight
46
+ ExpandButton: typeof ChatInputExpandButton
47
+ FolderButton: typeof ChatInputFolderButton
48
+ MoreButton: typeof ChatInputMoreButton
49
+ SendButton: typeof ChatInputSendButton
50
+ FooterLeft: typeof ChatInputFooterLeft
51
+ }
52
+
53
+ const ChatInputBase = forwardRef<HTMLTextAreaElement, ChatInputProps>(function ChatInput(props, ref) {
54
+ // ChatInput = 复合组件的默认组合(Root + DefaultLayout),便捷导出;主 API 为复合组件
55
+ const hasAttachments = hasAttachmentsValue(props.attachments)
56
+ return (
57
+ <ChatInputRootProvider {...props}>
58
+ <ChatInputDefaultLayout
59
+ ref={ref}
60
+ className={props.className}
61
+ hasAbove={props.showGenerationStatus}
62
+ hasAttachments={hasAttachments}
63
+ hasFooter={props.showFooter}
64
+ aboveOverlap
65
+ />
66
+ </ChatInputRootProvider>
67
+ )
68
+ })
69
+
70
+ // 挂载复合组件后断言为带命名空间的类型,便于赋值时通过类型检查
71
+ type ChatInputBaseType = React.ForwardRefExoticComponent<
72
+ ChatInputProps & React.RefAttributes<HTMLTextAreaElement>
73
+ > &
74
+ Partial<ChatInputCompound>
75
+
76
+ const ChatInputBaseWithSlots = ChatInputBase as ChatInputBaseType
77
+ ChatInputBaseWithSlots.displayName = 'ChatInput'
78
+ ChatInputBaseWithSlots.Root = ChatInputRootProvider
79
+ ChatInputBaseWithSlots.Above = ChatInputAbove
80
+ ChatInputBaseWithSlots.Box = ChatInputBox
81
+ ChatInputBaseWithSlots.Attachments = ChatInputAttachments
82
+ ChatInputBaseWithSlots.Input = ChatInputInput
83
+ ChatInputBaseWithSlots.Actions = ChatInputActions
84
+ ChatInputBaseWithSlots.ActionsLeft = ChatInputActionsLeft
85
+ ChatInputBaseWithSlots.ActionsRight = ChatInputActionsRight
86
+ ChatInputBaseWithSlots.ExpandButton = ChatInputExpandButton
87
+ ChatInputBaseWithSlots.FolderButton = ChatInputFolderButton
88
+ ChatInputBaseWithSlots.MoreButton = ChatInputMoreButton
89
+ ChatInputBaseWithSlots.SendButton = ChatInputSendButton
90
+ ChatInputBaseWithSlots.FooterLeft = ChatInputFooterLeft
91
+
92
+ export const ChatInput = ChatInputBaseWithSlots as React.ForwardRefExoticComponent<
93
+ ChatInputProps & React.RefAttributes<HTMLTextAreaElement>
94
+ > &
95
+ ChatInputCompound
96
+
97
+ // 扁平命名导出(Root、Above、Box、Attachments、Input、Actions 等)
98
+ export { ChatInputRootProvider as ChatInputRoot } from './context'
99
+ export {
100
+ ChatInputAbove,
101
+ ChatInputBox,
102
+ ChatInputAttachments,
103
+ ChatInputInput,
104
+ ChatInputActions,
105
+ ChatInputActionsLeft,
106
+ ChatInputActionsRight,
107
+ ChatInputExpandButton,
108
+ ChatInputFolderButton,
109
+ ChatInputMoreButton,
110
+ ChatInputSendButton,
111
+ ChatInputFooterLeft,
112
+ } from './compound'
113
+ export type { ChatInputRootProps } from './context'
114
+ export type {
115
+ ChatInputAboveProps,
116
+ ChatInputBoxProps,
117
+ ChatInputAttachmentsProps,
118
+ ChatInputInputProps,
119
+ ChatInputActionsProps,
120
+ ChatInputActionsLeftProps,
121
+ ChatInputActionsRightProps,
122
+ ChatInputExpandButtonProps,
123
+ } from './compound'
@@ -0,0 +1,77 @@
1
+ import type { TextareaHTMLAttributes, ReactNode } from 'react'
2
+
3
+ export type InputPropsWithWebkitDirectory = React.InputHTMLAttributes<HTMLInputElement> & {
4
+ webkitdirectory?: string
5
+ }
6
+
7
+ export interface FolderPermissionConfig {
8
+ enable?: boolean
9
+ projectName?: string
10
+ }
11
+
12
+ export interface GenerationStatusConfig {
13
+ content?: ReactNode
14
+ icon?: ReactNode
15
+ time?: string
16
+ }
17
+
18
+ export interface FooterLeftModelSwitchItem {
19
+ value: string
20
+ label: string
21
+ icon?: ReactNode
22
+ }
23
+
24
+ export interface FooterLeftModelSwitchConfig {
25
+ modeSwitch: {
26
+ icon?: ReactNode
27
+ label: string
28
+ value: string
29
+ options: FooterLeftModelSwitchItem[]
30
+ onChange: (value: string) => void
31
+ }
32
+ modelSwitch: {
33
+ label: string
34
+ value: string
35
+ options: FooterLeftModelSwitchItem[]
36
+ onChange: (value: string) => void
37
+ }
38
+ consumptionMultiplier: {
39
+ value: string
40
+ options?: FooterLeftModelSwitchItem[]
41
+ onChange?: (value: string) => void
42
+ }
43
+ }
44
+
45
+ export interface ChatInputProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange' | 'value'> {
46
+ value?: string
47
+ onChange?: (value: string) => void
48
+ onSend?: (value: string) => void
49
+ placeholder?: string
50
+ disabled?: boolean
51
+ maxRows?: number
52
+ form?: string
53
+ attachments?: { files?: ReactNode; images?: ReactNode } | ReactNode
54
+ showFooter?: boolean
55
+ showFolderButton?: boolean
56
+ folderButtonLabel?: string
57
+ onFolderButtonClick?: () => void
58
+ onFolderClear?: () => void
59
+ folderPermission?: FolderPermissionConfig
60
+ showMoreButton?: boolean
61
+ onMoreButtonClick?: () => void
62
+ footerLeftConfig?: FooterLeftModelSwitchConfig
63
+ sendButtonStatus?: 'normal' | 'generating'
64
+ showGenerationStatus?: boolean
65
+ generationStatus?: GenerationStatusConfig
66
+ addLargeIcon?: ReactNode
67
+ folderIcon?: ReactNode
68
+ folderOpenIcon?: ReactNode
69
+ historyIcon?: ReactNode
70
+ arrowDownIcon?: ReactNode
71
+ subMenuArrowIcon?: ReactNode
72
+ folderFillIcon?: ReactNode
73
+ closeIcon?: ReactNode
74
+ /** 供 Portal 浮层继承(Showcase 预览区等场景),不传则由 dropdown-menu 使用 getThemeFromDocument() 兜底 */
75
+ dataStyle?: string
76
+ dataTheme?: string
77
+ }
@@ -0,0 +1,20 @@
1
+ import { useEffect, type RefObject } from 'react'
2
+
3
+ export function useAutoResizeTextarea(
4
+ textareaRef: RefObject<HTMLTextAreaElement | null>,
5
+ value: string,
6
+ maxRows: number
7
+ ): void {
8
+ useEffect(() => {
9
+ const textarea = textareaRef.current
10
+ if (!textarea) return
11
+ textarea.style.height = 'auto'
12
+ const lineHeight = parseFloat(getComputedStyle(textarea).lineHeight) || 24
13
+ const maxHeight = lineHeight * maxRows
14
+ if (textarea.scrollHeight <= maxHeight) {
15
+ textarea.style.height = `${textarea.scrollHeight}px`
16
+ } else {
17
+ textarea.style.height = `${maxHeight}px`
18
+ }
19
+ }, [textareaRef, value, maxRows])
20
+ }
@@ -0,0 +1,151 @@
1
+ import { useMemo, type ReactNode } from 'react'
2
+ import { motion } from 'framer-motion'
3
+ import { cn } from '@/lib/utils'
4
+ import { Highlight, Prism } from 'prism-react-renderer'
5
+ import { CollapsibleCard } from '../basic/collapsible-card'
6
+ import { FileLine, LoaderLine } from '../basic/icons-inline'
7
+ import { getFileIconColorClass } from '../lib/file-icon-maps'
8
+
9
+ const ICON_CLASS = 'w-[var(--font-size-sm)] h-[var(--font-size-sm)] shrink-0'
10
+
11
+ /** Prism 主题:使用设计令牌,随 data-theme 生效 */
12
+ const codeBlockTheme = {
13
+ plain: { color: 'var(--color-text)' },
14
+ styles: [
15
+ { types: ['comment', 'prolog', 'cdata'], style: { color: 'var(--color-text-tertiary)' } },
16
+ { types: ['keyword', 'atrule'], style: { color: 'var(--color-blue)' } },
17
+ { types: ['string', 'attr-value', 'inserted'], style: { color: 'var(--color-success)' } },
18
+ { types: ['number', 'constant', 'boolean'], style: { color: 'var(--color-success)' } },
19
+ { types: ['function', 'function-variable'], style: { color: 'var(--color-purple)' } },
20
+ { types: ['punctuation', 'operator', 'deleted'], style: { color: 'var(--color-text-tertiary)' } },
21
+ { types: ['property', 'tag', 'selector'], style: { color: 'var(--color-pink)' } },
22
+ { types: ['regex', 'important', 'variable'], style: { color: 'var(--color-text)' } },
23
+ ],
24
+ }
25
+
26
+ const LANG_EXT: Record<string, string> = {
27
+ javascript: 'js', typescript: 'ts', jsx: 'jsx', tsx: 'tsx',
28
+ python: 'py', java: 'java', go: 'go', rust: 'rs', html: 'html', css: 'css',
29
+ json: 'json', yaml: 'yml', markdown: 'md', shell: 'sh', bash: 'sh',
30
+ }
31
+
32
+ export type CodeBlockDiffType = 'add' | 'remove'
33
+
34
+ export interface CodeBlockPartProps {
35
+ language?: string
36
+ code?: string
37
+ filename?: string
38
+ diffType?: CodeBlockDiffType | null
39
+ diffLines?: number | null
40
+ isGenerating?: boolean
41
+ defaultExpanded?: boolean
42
+ className?: string
43
+ headerIcon?: ReactNode
44
+ getFileIcon?: (fileType?: string, filename?: string) => ReactNode
45
+ }
46
+
47
+ function getDisplayFilename(filename?: string, language?: string): string {
48
+ if (filename && filename.trim()) return filename
49
+ const lang = (language ?? 'text').toLowerCase()
50
+ const ext = LANG_EXT[lang] ?? 'txt'
51
+ return `${lang}.${ext}`
52
+ }
53
+
54
+ export function CodeBlockPart({
55
+ language = 'javascript',
56
+ code = '',
57
+ filename,
58
+ diffType = null,
59
+ diffLines = null,
60
+ isGenerating = false,
61
+ defaultExpanded = true,
62
+ className,
63
+ headerIcon,
64
+ getFileIcon,
65
+ }: CodeBlockPartProps) {
66
+ const displayName = useMemo(
67
+ () => getDisplayFilename(filename, language),
68
+ [filename, language]
69
+ )
70
+
71
+ const calculatedDiffLines = useMemo(() => {
72
+ if (diffType && code) {
73
+ const lines = code.split('\n')
74
+ return lines.length
75
+ }
76
+ return diffLines ?? null
77
+ }, [code, diffType, diffLines])
78
+
79
+ const fileType = language?.toLowerCase()
80
+ const defaultHeaderIcon = isGenerating ? (
81
+ <motion.div
82
+ animate={{ rotate: 360 }}
83
+ transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}
84
+ >
85
+ <LoaderLine className={cn(ICON_CLASS, 'text-text-secondary')} />
86
+ </motion.div>
87
+ ) : getFileIcon ? (
88
+ getFileIcon(fileType, displayName)
89
+ ) : (
90
+ <span className={cn(getFileIconColorClass(fileType, displayName))}>
91
+ <FileLine className={ICON_CLASS} />
92
+ </span>
93
+ )
94
+
95
+ const headerRight =
96
+ diffType && calculatedDiffLines != null ? (
97
+ <span
98
+ className={cn(
99
+ 'font-normal text-xs leading-xs',
100
+ diffType === 'add' ? 'text-success' : 'text-error'
101
+ )}
102
+ >
103
+ {diffType === 'add' ? '+' : '-'}{calculatedDiffLines}
104
+ </span>
105
+ ) : null
106
+
107
+ const contentClass = cn(
108
+ 'overflow-x-auto text-left scrollbar-auto',
109
+ diffType === 'add' &&
110
+ 'bg-success-bg border-l-[3px] border-l-[var(--color-success-border)] -ml-5 pl-5',
111
+ diffType === 'remove' &&
112
+ 'bg-error-bg border-l-[3px] border-l-[var(--color-error-border)] -ml-5 pl-5'
113
+ )
114
+
115
+ const lang = (language ?? 'text').toLowerCase()
116
+
117
+ return (
118
+ <CollapsibleCard
119
+ headerIcon={headerIcon ?? defaultHeaderIcon}
120
+ headerTitle={<span className="font-normal">{displayName}</span>}
121
+ headerRight={headerRight}
122
+ defaultExpanded={defaultExpanded}
123
+ contentPadding="var(--spacing-2) 0 var(--spacing-2) var(--spacing-5)"
124
+ titleShimmer={isGenerating}
125
+ className={className}
126
+ >
127
+ <div className={contentClass}>
128
+ <Highlight theme={codeBlockTheme} code={code} language={lang}>
129
+ {({ className: preClassName, style, tokens, getLineProps, getTokenProps }) => (
130
+ <pre
131
+ className={cn(preClassName, 'm-0 text-left bg-transparent font-mono text-xs font-normal leading-xs whitespace-pre')}
132
+ style={style}
133
+ >
134
+ <code className="text-left block">
135
+ {tokens.map((line, i) => (
136
+ <div key={i} {...getLineProps({ line })}>
137
+ {line.map((token, k) => (
138
+ <span key={k} {...getTokenProps({ token })} />
139
+ ))}
140
+ </div>
141
+ ))}
142
+ </code>
143
+ </pre>
144
+ )}
145
+ </Highlight>
146
+ </div>
147
+ </CollapsibleCard>
148
+ )
149
+ }
150
+
151
+ CodeBlockPart.displayName = 'CodeBlockPart'
@@ -0,0 +1,44 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react'
2
+ import { forwardRef } from 'react'
3
+ import { Tag } from '../basic/tag'
4
+ import { FileLine } from '../basic/icons-inline'
5
+
6
+ const ICON_CLASS = 'h-3.5 w-3.5 shrink-0 text-current'
7
+
8
+ export interface FileAttachmentProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'children'> {
9
+ filename: string
10
+ iconFilename?: string
11
+ onRemove?: (e: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>) => void
12
+ icon?: ReactNode
13
+ /** 主库可注入 useIcons().getFileIcon;不传则用 registry 内联 FileLine */
14
+ getFileIcon?: (filename: string, className?: string) => ReactNode
15
+ }
16
+
17
+ export const FileAttachment = forwardRef<HTMLSpanElement, FileAttachmentProps>(
18
+ ({ filename, iconFilename, onRemove, icon, getFileIcon, className, ...props }, ref) => {
19
+ const lookup = iconFilename ?? filename
20
+ const resolvedIcon: ReactNode =
21
+ icon ?? (getFileIcon ? getFileIcon(lookup, ICON_CLASS) : <FileLine className={ICON_CLASS} />)
22
+
23
+ const { color: _omitColor, ...restProps } = props
24
+ return (
25
+ <Tag
26
+ ref={ref}
27
+ appearance="filled"
28
+ color="mauve"
29
+ closable={typeof onRemove === 'function'}
30
+ onClose={onRemove}
31
+ closeAriaLabel="移除"
32
+ className={className}
33
+ {...restProps}
34
+ >
35
+ <span className="inline-flex items-center gap-1.5 shrink-0">
36
+ {resolvedIcon}
37
+ {filename}
38
+ </span>
39
+ </Tag>
40
+ )
41
+ }
42
+ )
43
+
44
+ FileAttachment.displayName = 'FileAttachment'
@@ -0,0 +1,68 @@
1
+ import { forwardRef } from 'react'
2
+ import type { HTMLAttributes, ReactNode } from 'react'
3
+ import { cn } from '@/lib/utils'
4
+ import { FileLine } from '../basic/icons-inline'
5
+
6
+ const ICON_CLASS = 'w-5 h-5 text-text-secondary'
7
+
8
+ export interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
9
+ filename: string
10
+ iconFilename?: string
11
+ size?: string
12
+ icon?: ReactNode
13
+ getFileIcon?: (filename: string, className?: string) => ReactNode
14
+ onClick?: () => void
15
+ }
16
+
17
+ export const FileCard = forwardRef<HTMLDivElement, FileCardProps>(
18
+ ({ filename, iconFilename, size, icon, getFileIcon, onClick, className, ...props }, ref) => {
19
+ const iconLookup = iconFilename ?? filename
20
+ const resolvedIcon: ReactNode =
21
+ icon ?? (getFileIcon ? getFileIcon(iconLookup, ICON_CLASS) : <FileLine className={ICON_CLASS} />)
22
+
23
+ return (
24
+ <div
25
+ ref={ref}
26
+ role={onClick ? 'button' : undefined}
27
+ tabIndex={onClick ? 0 : undefined}
28
+ onClick={onClick}
29
+ onKeyDown={
30
+ onClick
31
+ ? (e) => {
32
+ if (e.key === 'Enter' || e.key === ' ') {
33
+ e.preventDefault()
34
+ onClick()
35
+ }
36
+ }
37
+ : undefined
38
+ }
39
+ className={cn(
40
+ 'flex flex-row items-center gap-4 w-full max-w-96',
41
+ 'py-5 px-5 rounded-lg',
42
+ 'bg-bg-base border border-border-tertiary',
43
+ 'text-sm leading-sm',
44
+ 'transition-colors cursor-pointer hover:border-border-secondary',
45
+ className
46
+ )}
47
+ {...props}
48
+ >
49
+ <div
50
+ className={cn(
51
+ 'flex items-center justify-center w-10 h-10 shrink-0 rounded-md',
52
+ 'bg-fill-tertiary'
53
+ )}
54
+ >
55
+ {resolvedIcon}
56
+ </div>
57
+ <div className="flex flex-row items-center gap-3 min-w-0">
58
+ <span className="font-medium text-text truncate">{filename}</span>
59
+ {size != null && size !== '' && (
60
+ <span className="shrink-0 text-text-tertiary">({size})</span>
61
+ )}
62
+ </div>
63
+ </div>
64
+ )
65
+ }
66
+ )
67
+
68
+ FileCard.displayName = 'FileCard'