@kitn.ai/ui 0.15.0 → 0.16.0

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 (366) hide show
  1. package/README.md +9 -0
  2. package/bin/mcp.js +22 -0
  3. package/dist/bash-InADTalH.js +6 -1
  4. package/dist/components/artifact.d.ts +58 -0
  5. package/dist/components/attachments.d.ts +67 -0
  6. package/dist/components/card-fallback.d.ts +10 -0
  7. package/dist/components/card-renderer.d.ts +13 -0
  8. package/dist/components/card.d.ts +28 -0
  9. package/dist/components/chain-of-thought.d.ts +29 -0
  10. package/dist/components/chat-container.d.ts +19 -0
  11. package/dist/components/chat-scope-picker.d.ts +9 -0
  12. package/dist/components/chat-thread.d.ts +93 -0
  13. package/dist/components/checkpoint.d.ts +20 -0
  14. package/dist/components/choice-card.d.ts +77 -0
  15. package/dist/components/code-block.d.ts +16 -0
  16. package/dist/components/confirm-card.d.ts +57 -0
  17. package/dist/components/context.d.ts +65 -0
  18. package/dist/components/conversation-item.d.ts +8 -0
  19. package/dist/components/conversation-list.d.ts +11 -0
  20. package/dist/components/embed.d.ts +21 -0
  21. package/dist/components/empty.d.ts +43 -0
  22. package/dist/components/feedback-bar.d.ts +45 -0
  23. package/dist/components/file-tree.d.ts +57 -0
  24. package/dist/components/file-upload.d.ts +16 -0
  25. package/dist/components/form-widgets.d.ts +31 -0
  26. package/dist/components/form.d.ts +103 -0
  27. package/dist/components/image.d.ts +12 -0
  28. package/dist/components/link-preview.d.ts +23 -0
  29. package/dist/components/loader.d.ts +60 -0
  30. package/dist/components/markdown.d.ts +8 -0
  31. package/dist/components/message-skills.d.ts +15 -0
  32. package/dist/components/message.d.ts +54 -0
  33. package/dist/components/model-switcher.d.ts +8 -0
  34. package/dist/components/prompt-input.d.ts +38 -0
  35. package/dist/components/prompt-suggestion.d.ts +13 -0
  36. package/dist/components/reasoning.d.ts +20 -0
  37. package/dist/components/response-stream.d.ts +14 -0
  38. package/dist/components/scroll-button.d.ts +7 -0
  39. package/dist/components/slash-command.d.ts +15 -0
  40. package/dist/components/source.d.ts +23 -0
  41. package/dist/components/tasks-card.d.ts +71 -0
  42. package/dist/components/text-shimmer.d.ts +9 -0
  43. package/dist/components/thinking-bar.d.ts +10 -0
  44. package/dist/components/tool.d.ts +16 -0
  45. package/dist/components/use-card-resolution.d.ts +12 -0
  46. package/dist/components/voice-input.d.ts +7 -0
  47. package/dist/core-AYMC6_lb.js +5874 -12
  48. package/dist/css-M7EaDHN_.js +6 -1
  49. package/dist/elements/artifact.d.ts +1 -0
  50. package/dist/elements/attachments.d.ts +1 -0
  51. package/dist/elements/card.d.ts +1 -0
  52. package/dist/elements/cards.d.ts +0 -0
  53. package/dist/elements/chain-of-thought.d.ts +13 -0
  54. package/dist/elements/chat-scope-picker.d.ts +1 -0
  55. package/dist/elements/chat-types.d.ts +41 -0
  56. package/dist/elements/chat-workspace.d.ts +1 -0
  57. package/dist/elements/chat.d.ts +1 -0
  58. package/dist/elements/checkpoint.d.ts +1 -0
  59. package/dist/elements/choice.d.ts +1 -0
  60. package/dist/elements/code-block.d.ts +1 -0
  61. package/dist/elements/confirm-card.d.ts +1 -0
  62. package/dist/elements/context-meter.d.ts +1 -0
  63. package/dist/elements/conversation-list.d.ts +11 -0
  64. package/dist/elements/css.d.ts +1 -0
  65. package/dist/elements/default-input.d.ts +40 -0
  66. package/dist/elements/define.d.ts +42 -0
  67. package/dist/elements/embed.d.ts +1 -0
  68. package/dist/elements/empty.d.ts +1 -0
  69. package/dist/elements/feedback-bar.d.ts +1 -0
  70. package/dist/elements/file-tree.d.ts +1 -0
  71. package/dist/elements/file-upload.d.ts +1 -0
  72. package/dist/elements/form.d.ts +1 -0
  73. package/dist/elements/image.d.ts +1 -0
  74. package/dist/elements/link-preview.d.ts +1 -0
  75. package/dist/elements/loader.d.ts +1 -0
  76. package/dist/elements/markdown.d.ts +1 -0
  77. package/dist/elements/message-skills.d.ts +17 -0
  78. package/dist/elements/message.d.ts +1 -0
  79. package/dist/elements/model-switcher.d.ts +11 -0
  80. package/dist/elements/popover.d.ts +1 -0
  81. package/dist/elements/prompt-input.d.ts +9 -0
  82. package/dist/elements/prompt-suggestions.d.ts +7 -0
  83. package/dist/elements/reasoning.d.ts +1 -0
  84. package/dist/elements/register-impl.d.ts +0 -0
  85. package/dist/elements/register.d.ts +3 -0
  86. package/dist/elements/remote.d.ts +1 -0
  87. package/dist/elements/resizable.d.ts +17 -0
  88. package/dist/elements/response-stream.d.ts +1 -0
  89. package/dist/elements/scroll-button.d.ts +1 -0
  90. package/dist/elements/source.d.ts +18 -0
  91. package/dist/elements/switch.d.ts +1 -0
  92. package/dist/elements/tasks.d.ts +1 -0
  93. package/dist/elements/text-shimmer.d.ts +1 -0
  94. package/dist/elements/thinking-bar.d.ts +1 -0
  95. package/dist/elements/tool.d.ts +1 -0
  96. package/dist/elements/voice-input.d.ts +1 -0
  97. package/dist/elements.d.ts +732 -0
  98. package/dist/engine-javascript-vq0WuIJl.js +2516 -14
  99. package/dist/github-dark-dimmed-DUshB20C.js +4 -1
  100. package/dist/github-light-JYsPkUQd.js +4 -1
  101. package/dist/html-CPZ3oZQ7.js +10 -1
  102. package/dist/index.d.ts +112 -2
  103. package/dist/index.js +13551 -0
  104. package/dist/javascript-C25yR2R2.js +6 -1
  105. package/dist/json-DxJze_jm.js +6 -1
  106. package/dist/kitn-chat.es.js +1 -77
  107. package/dist/llms/llms-full.txt +1 -1
  108. package/dist/llms/llms.txt +1 -1
  109. package/dist/mcp.es.js +2140 -0
  110. package/dist/primitives/card-contract.d.ts +103 -0
  111. package/dist/primitives/card-host.d.ts +12 -0
  112. package/dist/primitives/card-registry.d.ts +17 -0
  113. package/dist/primitives/card-resolution.d.ts +8 -0
  114. package/dist/primitives/card-routing.d.ts +12 -0
  115. package/dist/primitives/card-validate.d.ts +25 -0
  116. package/dist/primitives/chat-config.d.ts +31 -0
  117. package/dist/primitives/controllable.d.ts +13 -0
  118. package/dist/primitives/embed-providers.d.ts +65 -0
  119. package/dist/primitives/highlighter.d.ts +23 -0
  120. package/dist/primitives/link-preview.d.ts +47 -0
  121. package/dist/primitives/pdf-preview.d.ts +50 -0
  122. package/dist/primitives/use-auto-resize.d.ts +8 -0
  123. package/dist/primitives/use-resize-observer.d.ts +1 -0
  124. package/dist/primitives/use-stick-to-bottom.d.ts +5 -0
  125. package/dist/primitives/use-text-stream.d.ts +19 -0
  126. package/dist/primitives/use-voice-recorder.d.ts +9 -0
  127. package/dist/react/index.d.ts +1118 -0
  128. package/dist/react/runtime.d.ts +15 -0
  129. package/dist/react.js +265 -0
  130. package/dist/register-impl-wCsFPoh9.js +77 -0
  131. package/dist/register-ujhr1nBS.js +1 -0
  132. package/dist/remote/host-embed.d.ts +33 -0
  133. package/dist/remote/index.d.ts +2 -0
  134. package/dist/remote/origin.d.ts +5 -0
  135. package/dist/remote/provider-runtime.d.ts +27 -0
  136. package/dist/remote/provider.d.ts +2 -0
  137. package/dist/remote/validate.d.ts +4 -0
  138. package/dist/remote/version.d.ts +4 -0
  139. package/dist/remote/wire.d.ts +53 -0
  140. package/dist/svelte--5p79yCD.js +15 -1
  141. package/dist/tsx-B8rCNbgL.js +6 -1
  142. package/dist/types.d.ts +42 -0
  143. package/dist/typescript-RycA9KXf.js +6 -1
  144. package/dist/ui/action-icons.d.ts +11 -0
  145. package/dist/ui/avatar.d.ts +8 -0
  146. package/dist/ui/badge.d.ts +9 -0
  147. package/dist/ui/button.d.ts +10 -0
  148. package/dist/ui/collapsible.d.ts +27 -0
  149. package/dist/ui/dropdown.d.ts +20 -0
  150. package/dist/ui/hover-card.d.ts +28 -0
  151. package/dist/ui/overlay.d.ts +67 -0
  152. package/dist/ui/popover.d.ts +32 -0
  153. package/dist/ui/resizable.d.ts +76 -0
  154. package/dist/ui/scroll-area.d.ts +5 -0
  155. package/dist/ui/separator.d.ts +5 -0
  156. package/dist/ui/skeleton.d.ts +5 -0
  157. package/dist/ui/switch.d.ts +19 -0
  158. package/dist/ui/textarea.d.ts +6 -0
  159. package/dist/ui/tooltip.d.ts +8 -0
  160. package/dist/utils/cn.d.ts +2 -0
  161. package/dist/vue-BmIZj4XD.js +33 -1
  162. package/frameworks/react/index.tsx +4 -0
  163. package/frameworks/react/runtime.tsx +16 -2
  164. package/llms-full.txt +1 -1
  165. package/llms.txt +1 -1
  166. package/package.json +29 -11
  167. package/src/agent-tooling/archetypes.ts +46 -0
  168. package/src/agent-tooling/integrations/cloudflare.ts +88 -0
  169. package/src/agent-tooling/integrations/langgraph.ts +60 -0
  170. package/src/agent-tooling/integrations/mastra.ts +27 -0
  171. package/src/agent-tooling/integrations/mock.ts +34 -0
  172. package/src/agent-tooling/integrations/ollama.ts +47 -0
  173. package/src/agent-tooling/integrations/openrouter.ts +26 -0
  174. package/src/agent-tooling/integrations/pi.ts +40 -0
  175. package/src/agent-tooling/integrations/pydantic-ai.ts +52 -0
  176. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +44 -0
  177. package/src/agent-tooling/mcp/manifest.ts +128 -0
  178. package/src/agent-tooling/mcp/server.ts +59 -0
  179. package/src/agent-tooling/mcp/stdio.ts +18 -0
  180. package/src/agent-tooling/mcp/tools/debug.ts +305 -0
  181. package/src/agent-tooling/mcp/tools/reference.ts +132 -0
  182. package/src/agent-tooling/mcp/tools/scaffold.ts +1627 -0
  183. package/src/agent-tooling/mcp/tools/theme.ts +340 -0
  184. package/src/agent-tooling/mcp/tools/types.ts +14 -0
  185. package/src/agent-tooling/registry.ts +41 -0
  186. package/src/agent-tooling/types.ts +30 -0
  187. package/src/elements/compiled.css +1 -1
  188. package/src/elements/define.tsx +7 -1
  189. package/src/elements/element-types.d.ts +2 -1
  190. package/src/elements/register-impl.ts +55 -0
  191. package/src/elements/register.ts +17 -51
  192. package/theme.css +4 -2
  193. package/src/components/artifact.stories.tsx +0 -138
  194. package/src/components/attachments.stories.tsx +0 -303
  195. package/src/components/attachments.test.tsx +0 -64
  196. package/src/components/chain-of-thought.stories.tsx +0 -211
  197. package/src/components/chat-container.stories.tsx +0 -187
  198. package/src/components/chat-thread.test.tsx +0 -58
  199. package/src/components/checkpoint.stories.tsx +0 -102
  200. package/src/components/code-block.stories.tsx +0 -150
  201. package/src/components/confirm-card.stories.tsx +0 -74
  202. package/src/components/context.stories.tsx +0 -229
  203. package/src/components/context.test.tsx +0 -133
  204. package/src/components/conversation-item.stories.tsx +0 -125
  205. package/src/components/conversation-list.stories.tsx +0 -133
  206. package/src/components/default-input.test.tsx +0 -111
  207. package/src/components/empty.stories.tsx +0 -434
  208. package/src/components/feedback-bar.stories.tsx +0 -138
  209. package/src/components/feedback-bar.test.tsx +0 -103
  210. package/src/components/file-tree.stories.tsx +0 -73
  211. package/src/components/file-upload.stories.tsx +0 -156
  212. package/src/components/image.stories.tsx +0 -89
  213. package/src/components/loader.stories.tsx +0 -181
  214. package/src/components/markdown.stories.tsx +0 -180
  215. package/src/components/message-action-bar.test.tsx +0 -128
  216. package/src/components/message-narrow.stories.tsx +0 -329
  217. package/src/components/message-skills.stories.tsx +0 -211
  218. package/src/components/message.stories.tsx +0 -281
  219. package/src/components/model-switcher.stories.tsx +0 -123
  220. package/src/components/model-switcher.test.tsx +0 -65
  221. package/src/components/prompt-input.stories.tsx +0 -222
  222. package/src/components/prompt-suggestion.stories.tsx +0 -142
  223. package/src/components/reasoning.stories.tsx +0 -140
  224. package/src/components/resizable.test.tsx +0 -226
  225. package/src/components/scroll-button.stories.tsx +0 -100
  226. package/src/components/slash-command.stories.tsx +0 -163
  227. package/src/components/source-list.test.tsx +0 -152
  228. package/src/components/source.stories.tsx +0 -124
  229. package/src/components/tasks-card.stories.tsx +0 -78
  230. package/src/components/text-shimmer.stories.tsx +0 -87
  231. package/src/components/thinking-bar.stories.tsx +0 -87
  232. package/src/components/tool.stories.tsx +0 -153
  233. package/src/components/voice-input.stories.tsx +0 -83
  234. package/src/elements/artifact.stories.tsx +0 -506
  235. package/src/elements/attachments.stories.tsx +0 -190
  236. package/src/elements/card.stories.tsx +0 -113
  237. package/src/elements/cards.stories.tsx +0 -59
  238. package/src/elements/catalog.stories.tsx +0 -491
  239. package/src/elements/chain-of-thought.declarative.test.tsx +0 -153
  240. package/src/elements/chain-of-thought.stories.tsx +0 -113
  241. package/src/elements/chat-scope-picker.stories.tsx +0 -73
  242. package/src/elements/chat-workspace.stories.tsx +0 -288
  243. package/src/elements/chat.stories.tsx +0 -151
  244. package/src/elements/checkpoint.stories.tsx +0 -72
  245. package/src/elements/choice.stories.tsx +0 -240
  246. package/src/elements/code-block.stories.tsx +0 -83
  247. package/src/elements/composed-shell.stories.tsx +0 -316
  248. package/src/elements/confirm-card.stories.tsx +0 -227
  249. package/src/elements/context-meter.stories.tsx +0 -151
  250. package/src/elements/conversation-list.declarative.test.tsx +0 -137
  251. package/src/elements/conversation-list.stories.tsx +0 -243
  252. package/src/elements/embed.stories.tsx +0 -213
  253. package/src/elements/empty.stories.tsx +0 -111
  254. package/src/elements/feedback-bar.stories.tsx +0 -114
  255. package/src/elements/file-tree.stories.tsx +0 -134
  256. package/src/elements/file-upload.stories.tsx +0 -82
  257. package/src/elements/form.stories.tsx +0 -248
  258. package/src/elements/image.stories.tsx +0 -71
  259. package/src/elements/link-preview.stories.tsx +0 -209
  260. package/src/elements/loader.stories.tsx +0 -88
  261. package/src/elements/markdown.stories.tsx +0 -76
  262. package/src/elements/message-skills.declarative.test.tsx +0 -104
  263. package/src/elements/message-skills.stories.tsx +0 -114
  264. package/src/elements/message.stories.tsx +0 -218
  265. package/src/elements/model-switcher.declarative.test.tsx +0 -130
  266. package/src/elements/model-switcher.stories.tsx +0 -198
  267. package/src/elements/popover.stories.tsx +0 -80
  268. package/src/elements/prompt-input-slash-command.test.tsx +0 -128
  269. package/src/elements/prompt-input-stoppable.test.tsx +0 -88
  270. package/src/elements/prompt-input-toolbar-actions.test.tsx +0 -120
  271. package/src/elements/prompt-input.stories.tsx +0 -331
  272. package/src/elements/prompt-suggestions.declarative.test.tsx +0 -164
  273. package/src/elements/prompt-suggestions.stories.tsx +0 -213
  274. package/src/elements/reasoning.stories.tsx +0 -77
  275. package/src/elements/remote.stories.tsx +0 -314
  276. package/src/elements/resizable.stories.tsx +0 -426
  277. package/src/elements/response-stream.stories.tsx +0 -79
  278. package/src/elements/scroll-button.stories.tsx +0 -202
  279. package/src/elements/scroll-button.test.tsx +0 -148
  280. package/src/elements/source-list.stories.tsx +0 -143
  281. package/src/elements/source.stories.tsx +0 -88
  282. package/src/elements/switch.stories.tsx +0 -56
  283. package/src/elements/tasks.stories.tsx +0 -237
  284. package/src/elements/text-shimmer.stories.tsx +0 -64
  285. package/src/elements/thinking-bar.stories.tsx +0 -72
  286. package/src/elements/tool.stories.tsx +0 -89
  287. package/src/elements/voice-input.stories.tsx +0 -88
  288. package/src/primitives/controllable.test.ts +0 -47
  289. package/src/stories/chat-panel-layout.stories.tsx +0 -145
  290. package/src/stories/chat-scene.tsx +0 -571
  291. package/src/stories/checkpoint-restore.stories.tsx +0 -256
  292. package/src/stories/context-usage.stories.tsx +0 -212
  293. package/src/stories/conversation-with-reasoning.stories.tsx +0 -182
  294. package/src/stories/conversation-with-sources.stories.tsx +0 -471
  295. package/src/stories/docs/Accessibility.mdx +0 -119
  296. package/src/stories/docs/ChildElements.mdx +0 -269
  297. package/src/stories/docs/ForAIAgents.mdx +0 -162
  298. package/src/stories/docs/GettingStarted.mdx +0 -65
  299. package/src/stories/docs/Installation.mdx +0 -83
  300. package/src/stories/docs/Introduction.mdx +0 -50
  301. package/src/stories/docs/SolidJsAdvanced.mdx +0 -17
  302. package/src/stories/docs/Theming.mdx +0 -85
  303. package/src/stories/docs/element-controls.ts +0 -121
  304. package/src/stories/docs/frameworks/Angular.mdx +0 -245
  305. package/src/stories/docs/frameworks/Html.mdx +0 -227
  306. package/src/stories/docs/frameworks/Overview.mdx +0 -47
  307. package/src/stories/docs/frameworks/React.mdx +0 -227
  308. package/src/stories/docs/frameworks/Solid.mdx +0 -173
  309. package/src/stories/docs/frameworks/Svelte.mdx +0 -194
  310. package/src/stories/docs/frameworks/Vue.mdx +0 -238
  311. package/src/stories/docs/generative-ui-overview.mdx +0 -186
  312. package/src/stories/docs/recipes/SpeechToText.mdx +0 -7
  313. package/src/stories/docs/recipes/Streaming.mdx +0 -68
  314. package/src/stories/docs/recipes/TextToSpeech.mdx +0 -35
  315. package/src/stories/docs/theme-editor/canvas.tsx +0 -32
  316. package/src/stories/docs/theme-editor/inspector.tsx +0 -66
  317. package/src/stories/docs/theme-editor/presets.test.ts +0 -32
  318. package/src/stories/docs/theme-editor/presets.ts +0 -64
  319. package/src/stories/docs/theme-editor/theme-css.test.ts +0 -19
  320. package/src/stories/docs/theme-editor/theme-css.ts +0 -15
  321. package/src/stories/docs/theme-editor/theme-editor.tsx +0 -146
  322. package/src/stories/docs/theme-tokens.tsx +0 -174
  323. package/src/stories/examples/ChoosingComponents.mdx +0 -106
  324. package/src/stories/examples/sample-data.ts +0 -79
  325. package/src/stories/examples/usage/checkpoint-restore.ts +0 -156
  326. package/src/stories/examples/usage/context-usage.ts +0 -591
  327. package/src/stories/examples/usage/conversation-with-reasoning.ts +0 -224
  328. package/src/stories/examples/usage/conversation-with-sources.ts +0 -589
  329. package/src/stories/examples/usage/empty-state.ts +0 -144
  330. package/src/stories/examples/usage/full-chat-app.ts +0 -277
  331. package/src/stories/examples/usage/index.ts +0 -63
  332. package/src/stories/examples/usage/message-actions.ts +0 -704
  333. package/src/stories/examples/usage/pattern-centered-conversation.ts +0 -446
  334. package/src/stories/examples/usage/pattern-chat-panel-layout.ts +0 -442
  335. package/src/stories/examples/usage/pattern-docked-widget.ts +0 -479
  336. package/src/stories/examples/usage/prompt-input-variants.ts +0 -1356
  337. package/src/stories/examples/usage/streaming-response.ts +0 -687
  338. package/src/stories/examples/usage/types.ts +0 -33
  339. package/src/stories/full-chat.stories.tsx +0 -18
  340. package/src/stories/message-actions.stories.tsx +0 -230
  341. package/src/stories/pattern-centered-conversation.stories.tsx +0 -93
  342. package/src/stories/pattern-docked-widget.stories.tsx +0 -93
  343. package/src/stories/pattern-empty-state.stories.tsx +0 -76
  344. package/src/stories/prompt-input-variants.stories.tsx +0 -456
  345. package/src/stories/streaming-response.stories.tsx +0 -438
  346. package/src/stories/theme-editor.stories.tsx +0 -16
  347. package/src/stories/token-reference.stories.tsx +0 -18
  348. package/src/stories/typography.stories.tsx +0 -78
  349. package/src/ui/avatar.stories.tsx +0 -103
  350. package/src/ui/badge.stories.tsx +0 -86
  351. package/src/ui/button.stories.tsx +0 -145
  352. package/src/ui/collapsible.stories.tsx +0 -69
  353. package/src/ui/dropdown.stories.tsx +0 -59
  354. package/src/ui/hover-card.stories.tsx +0 -77
  355. package/src/ui/hover-card.test.tsx +0 -30
  356. package/src/ui/overlay.stories.tsx +0 -115
  357. package/src/ui/popover.stories.tsx +0 -81
  358. package/src/ui/popover.test.tsx +0 -99
  359. package/src/ui/resizable.stories.tsx +0 -236
  360. package/src/ui/scroll-area.stories.tsx +0 -50
  361. package/src/ui/separator.stories.tsx +0 -81
  362. package/src/ui/skeleton.stories.tsx +0 -337
  363. package/src/ui/switch.stories.tsx +0 -51
  364. package/src/ui/switch.test.tsx +0 -59
  365. package/src/ui/textarea.stories.tsx +0 -76
  366. package/src/ui/tooltip.stories.tsx +0 -74
@@ -1,55 +1,21 @@
1
1
  // Single entry that registers all kitn custom elements. Importing this file
2
- // (or the built bundle) defines the elements as a side effect.
3
- import './conversation-list';
4
- import './prompt-input';
5
- import './chat';
6
- import './chat-workspace';
7
- // Composable leaf elements (spike see docs/handoff + examples/composable)
8
- import './thinking-bar';
9
- import './model-switcher';
10
- import './attachments';
11
- // Phase 1 message-rendering core
12
- import './message';
13
- import './markdown';
14
- import './code-block';
15
- import './reasoning';
16
- import './tool';
17
- // Phase 2 — header / meta
18
- import './context-meter';
19
- import './feedback-bar';
20
- import './chat-scope-picker';
21
- // Phase 3 — input ecosystem
22
- // (NB: SlashCommand is context-bound to PromptInput — it observes the input
23
- // value via usePromptInput() — so it is NOT a standalone element. It will fold
24
- // into <kai-prompt-input> as a `slash-commands` property in a later pass.)
25
- import './prompt-suggestions';
26
- import './file-upload';
27
- import './voice-input';
28
- // Phase 4 — indicators & leaves
29
- import './loader';
30
- import './text-shimmer';
31
- import './image';
32
- import './checkpoint';
33
- import './message-skills';
34
- import './source';
35
- import './response-stream';
36
- import './empty';
37
- import './chain-of-thought';
38
- import './resizable';
39
- import './file-tree';
40
- import './artifact';
41
- import './scroll-button';
42
- import './popover';
43
- import './switch';
44
- // Generative-UI cards (Card Contract)
45
- import './card';
46
- import './form';
47
- import './link-preview';
48
- import './embed';
49
- import './confirm-card';
50
- import './tasks';
51
- import './choice';
52
- import './cards';
2
+ // (or the built bundle) defines the elements as a side effect — but ONLY in a
3
+ // browser/DOM context.
4
+ //
5
+ // SSR-safe: the kai-* elements bundle Solid's client runtime, which touches
6
+ // `window` at module-eval (delegateEvents(events, doc = window.document)). With
7
+ // no `window`, a static import would throw. So the actual component registration
8
+ // lives in ./register-impl and is loaded behind a browser check + dynamic
9
+ // import() — static ESM imports hoist + evaluate unconditionally, so a bare `if`
10
+ // cannot gate them; a dynamic import() can. On the server this module is inert
11
+ // (no DOM no registration → no throw); in the browser it registers as before.
12
+ //
13
+ // Registration is async (a microtask after this module loads). Consumers that
14
+ // need the upgraded element (e.g. the React runtime) guard with
15
+ // customElements.whenDefined(), which resolves once the impl chunk has run.
16
+ if (typeof window !== 'undefined' && typeof customElements !== 'undefined') {
17
+ void import('./register-impl');
18
+ }
53
19
 
54
20
  export type { ChatMessage, ChatMessageAction } from './chat-types';
55
21
  export { configureCodeHighlighting, isCodeHighlightingEnabled } from '../primitives/highlighter';
package/theme.css CHANGED
@@ -3,8 +3,10 @@
3
3
  utilities, and the .chat-markdown styles. Contains NO global base/reset rules,
4
4
  so importing it restyles nothing on its own — a host opts in via the kit's
5
5
  components + classes. Rebrand by overriding the --color-* values (optionally
6
- scoped to a subtree). */
7
- @import "tw-animate-css";
6
+ scoped to a subtree).
7
+ NOTE: This file is Tailwind-v4 source (requires tailwindcss as a peer). For
8
+ bundler-based apps that don't use Tailwind, import @kitn.ai/ui/theme.tokens.css
9
+ instead — it is plain compiled CSS with no toolchain requirements. */
8
10
 
9
11
  @custom-variant dark (&:is(.dark *));
10
12
 
@@ -1,138 +0,0 @@
1
- import type { Meta, StoryObj } from 'storybook-solidjs-vite';
2
- import { createSignal } from 'solid-js';
3
- import { Artifact, type ArtifactFile, type ArtifactTab } from './artifact';
4
- import { componentDescription } from '../stories/docs/element-controls';
5
-
6
- // Storybook serves examples/artifact-fixtures at /artifact-fixtures.
7
- const BASE = new URL('artifact-fixtures', document.baseURI).href;
8
-
9
- const FILES: ArtifactFile[] = [
10
- {
11
- path: 'index.html',
12
- url: `${BASE}/index.html`,
13
- type: 'html',
14
- language: 'html',
15
- code: `<!DOCTYPE html>\n<html lang="en">\n <head><link rel="stylesheet" href="css/site.css" /></head>\n <body><h1>Starboard</h1><a href="about.html">About</a></body>\n</html>`,
16
- },
17
- {
18
- path: 'about.html',
19
- url: `${BASE}/about.html`,
20
- type: 'html',
21
- language: 'html',
22
- code: `<!DOCTYPE html>\n<html lang="en">\n <body data-page="about"><h1>About</h1><a href="index.html">Home</a></body>\n</html>`,
23
- },
24
- {
25
- path: 'css/site.css',
26
- url: `${BASE}/css/site.css`,
27
- type: 'other',
28
- language: 'css',
29
- code: `:root { --accent: #6ea8fe; }\nbody { font-family: system-ui, sans-serif; }`,
30
- },
31
- { path: 'assets/logo.svg', url: `${BASE}/assets/logo.svg`, type: 'image' },
32
- { path: 'assets/report.pdf', url: `${BASE}/assets/report.pdf`, type: 'pdf' },
33
- ];
34
-
35
- const meta = {
36
- title: 'Solid (Advanced)/Elements/Artifact',
37
- component: Artifact,
38
- tags: ['autodocs'],
39
- parameters: {
40
- layout: 'padded',
41
- docs: {
42
- description: componentDescription([
43
- 'A framed, switchable **generated-artifact viewer** — the "canvas / artifacts" pattern. A sandboxed `<iframe>` with a functional nav toolbar (back · forward · reload · home + editable path field) and a **Preview | Code** toggle; the Code tab shows a `FileTree` + the active file source via `CodeBlock`.',
44
- '**When to use:** to show an AI-generated artifact your backend hosts (page, doc, image, PDF) beside the conversation. The component frames; your backend serves — so relative links, back/forward and multi-format work natively.',
45
- '**How to use:** set `src` to the hosted URL and `files` (`{ path, url?, code?, language?, type? }[]`) for the Code tree. The iframe `sandbox` defaults to `allow-scripts allow-forms` (not `allow-same-origin`). Handle `onNavigate(url)`, `onTabChange(tab)`, `onFileSelect(path)`.',
46
- '**Placement:** the preview/canvas panel of a chat shell (e.g. `list | chat | artifact`). It **fills** its container — give the parent a height.',
47
- ]),
48
- },
49
- },
50
- argTypes: {
51
- files: { control: false },
52
- src: { control: 'text' },
53
- tab: { control: 'select', options: ['preview', 'code'] },
54
- sandbox: { control: 'text' },
55
- },
56
- args: { src: `${BASE}/index.html`, files: FILES, tab: 'preview' as ArtifactTab },
57
- render: (args) => (
58
- <div class="h-[520px] w-full max-w-[900px]">
59
- <Artifact
60
- src={args.src}
61
- files={args.files}
62
- tab={args.tab}
63
- sandbox={args.sandbox}
64
- iframeTitle="Starboard artifact preview"
65
- />
66
- </div>
67
- ),
68
- } satisfies Meta<typeof Artifact>;
69
-
70
- export default meta;
71
- type Story = StoryObj<typeof meta>;
72
-
73
- const IMPORT = `import { Artifact } from '@kitn.ai/ui';`;
74
- const src = (code: string) => ({
75
- parameters: { docs: { source: { code: `${IMPORT}\n\n${code}`, language: 'tsx' } } },
76
- });
77
-
78
- export const Playground: Story = {
79
- ...src(`<Artifact src={src} files={files} tab="preview" />`),
80
- };
81
-
82
- export const CodeTab: Story = {
83
- name: 'Code tab',
84
- args: { tab: 'code' as ArtifactTab },
85
- render: (args: { src?: string; files: ArtifactFile[] }) => (
86
- <div class="h-[520px] w-full max-w-[900px]">
87
- <Artifact src={args.src} files={args.files} tab="code" activeFile="index.html" iframeTitle="Starboard artifact preview" />
88
- </div>
89
- ),
90
- ...src(`<Artifact src={src} files={files} tab="code" activeFile="index.html" />`),
91
- };
92
-
93
- /** Controlled — observe the emitted nav model. */
94
- export const Controlled: Story = {
95
- render: () => {
96
- const [log, setLog] = createSignal<string[]>([]);
97
- const push = (s: string) => setLog((l) => [s, ...l].slice(0, 6));
98
- return (
99
- <div class="flex flex-col gap-2">
100
- <div class="h-[420px] w-full max-w-[900px]">
101
- <Artifact
102
- src={`${BASE}/index.html`}
103
- files={FILES}
104
- iframeTitle="Starboard artifact preview"
105
- onNavigate={(url) => push(`navigate → ${url}`)}
106
- onTabChange={(t) => push(`kai-tab-change → ${t}`)}
107
- onFileSelect={(p) => push(`kai-file-select → ${p}`)}
108
- />
109
- </div>
110
- <pre class="m-0 min-h-24 max-w-[900px] rounded-lg bg-muted px-3 py-2.5 text-xs text-muted-foreground">
111
- {log().length ? log().join('\n') : '(navigate the preview / switch tabs / pick a file…)'}
112
- </pre>
113
- </div>
114
- );
115
- },
116
- ...src(`<Artifact src={src} files={files}
117
- onNavigate={(url) => …} onTabChange={(t) => …} onFileSelect={(p) => …} />`),
118
- };
119
-
120
- /** PDFs render inline via pdf.js (loaded on demand from a CDN). */
121
- export const PdfPreview: Story = {
122
- name: 'PDF (inline)',
123
- render: () => (
124
- <div class="h-[520px] w-full max-w-[900px]">
125
- <Artifact src={`${BASE}/assets/report.pdf`} files={FILES} />
126
- </div>
127
- ),
128
- };
129
-
130
- /** Fallback card when inline rendering can't work (here the src 404s). */
131
- export const PdfFallback: Story = {
132
- name: 'PDF (fallback card)',
133
- render: () => (
134
- <div class="h-[520px] w-full max-w-[900px]">
135
- <Artifact src={`${BASE}/assets/does-not-exist.pdf`} />
136
- </div>
137
- ),
138
- };
@@ -1,303 +0,0 @@
1
- import type { Meta, StoryObj } from 'storybook-solidjs-vite';
2
- import { createSignal, For } from 'solid-js';
3
- import {
4
- Attachments,
5
- Attachment,
6
- AttachmentPreview,
7
- AttachmentInfo,
8
- AttachmentRemove,
9
- AttachmentHoverCard,
10
- AttachmentHoverCardTrigger,
11
- AttachmentHoverCardContent,
12
- AttachmentEmpty,
13
- } from './attachments';
14
- import type { AttachmentData } from './attachments';
15
- import { componentDescription } from '../stories/docs/element-controls';
16
-
17
- const sampleAttachments: AttachmentData[] = [
18
- {
19
- id: '1',
20
- type: 'file',
21
- filename: 'mountain-landscape.jpg',
22
- mediaType: 'image/jpeg',
23
- url: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=400&fit=crop',
24
- },
25
- {
26
- id: '2',
27
- type: 'file',
28
- filename: 'sunset-beach.png',
29
- mediaType: 'image/png',
30
- url: 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?w=400&h=400&fit=crop',
31
- },
32
- {
33
- id: '3',
34
- type: 'file',
35
- filename: 'architecture-report.pdf',
36
- mediaType: 'application/pdf',
37
- },
38
- {
39
- id: '4',
40
- type: 'file',
41
- filename: 'demo-recording.mp4',
42
- mediaType: 'video/mp4',
43
- },
44
- {
45
- id: '5',
46
- type: 'file',
47
- filename: 'podcast-episode.mp3',
48
- mediaType: 'audio/mpeg',
49
- },
50
- {
51
- id: '6',
52
- type: 'source-document',
53
- filename: 'SolidJS Documentation',
54
- title: 'SolidJS Reactivity Guide',
55
- url: 'https://solidjs.com/docs',
56
- },
57
- ];
58
-
59
- const meta = {
60
- title: 'Solid (Advanced)/Elements/Attachments',
61
- component: Attachments,
62
- tags: ['autodocs'],
63
- parameters: {
64
- layout: 'padded',
65
- docs: {
66
- description: componentDescription([
67
- 'A composable container for displaying file and source-document attachments as thumbnails, inline chips, or a vertical list. Built from `Attachments` + per-item `Attachment` with `AttachmentPreview`, `AttachmentInfo`, and `AttachmentRemove` parts.',
68
- '**When to use:** to show files a user attached to a prompt, or documents/sources referenced by a message. Choose `grid` for thumbnails, `inline` for compact chips, `list` for a detailed rows view.',
69
- '**How to use:** set `variant` on `Attachments`, then map your data to `Attachment` (passing each item via `data` and an `onRemove` handler) and compose the preview/info/remove parts inside.',
70
- '**Placement:** prompt input area (pending uploads), message bodies (attached or cited files), and document panels.',
71
- ]),
72
- controls: { exclude: ['use:eventListener'] },
73
- },
74
- },
75
- argTypes: {
76
- variant: {
77
- control: 'select',
78
- options: ['grid', 'inline', 'list'],
79
- description: 'Layout of the attachment items.',
80
- table: { defaultValue: { summary: 'grid' } },
81
- },
82
- children: {
83
- control: false,
84
- description: 'The `Attachment` items to render inside the container.',
85
- },
86
- class: {
87
- control: 'text',
88
- description: 'Extra classes for the container element.',
89
- },
90
- },
91
- args: {
92
- variant: 'grid',
93
- },
94
- render: (args) => {
95
- const [items, setItems] = createSignal([...sampleAttachments]);
96
- const remove = (id: string) => setItems((prev) => prev.filter((a) => a.id !== id));
97
- return (
98
- <Attachments {...args}>
99
- <For each={items()}>
100
- {(item) => (
101
- <Attachment data={item} onRemove={() => remove(item.id)}>
102
- <AttachmentPreview />
103
- <AttachmentInfo />
104
- <AttachmentRemove />
105
- </Attachment>
106
- )}
107
- </For>
108
- </Attachments>
109
- );
110
- },
111
- } satisfies Meta<typeof Attachments>;
112
-
113
- export default meta;
114
- type Story = StoryObj<typeof meta>;
115
-
116
- const IMPORT = `import {
117
- Attachments, Attachment, AttachmentPreview, AttachmentInfo, AttachmentRemove,
118
- } from '@kitn.ai/ui';`;
119
- const src = (code: string) => ({
120
- parameters: { docs: { source: { code: `${IMPORT}\n\n${code}`, language: 'tsx' } } },
121
- });
122
-
123
- /** Interactive playground — switch `variant` to compare grid / inline / list. */
124
- export const Playground: Story = {
125
- ...src(`<Attachments variant="grid">
126
- <For each={items()}>
127
- {(item) => (
128
- <Attachment data={item} onRemove={() => remove(item.id)}>
129
- <AttachmentPreview />
130
- <AttachmentInfo />
131
- <AttachmentRemove />
132
- </Attachment>
133
- )}
134
- </For>
135
- </Attachments>`),
136
- };
137
-
138
- export const Grid: Story = {
139
- render: () => {
140
- const [items, setItems] = createSignal([...sampleAttachments]);
141
- const remove = (id: string) => setItems((prev) => prev.filter((a) => a.id !== id));
142
- return (
143
- <div class="space-y-4">
144
- <Attachments variant="grid">
145
- <For each={items()}>
146
- {(item) => (
147
- <Attachment data={item} onRemove={() => remove(item.id)}>
148
- <AttachmentPreview />
149
- <AttachmentRemove />
150
- </Attachment>
151
- )}
152
- </For>
153
- </Attachments>
154
- <button
155
- class="text-sm text-muted-foreground hover:text-foreground transition-colors"
156
- onClick={() => setItems([...sampleAttachments])}
157
- >
158
- Reset
159
- </button>
160
- </div>
161
- );
162
- },
163
- ...src(`<Attachments variant="grid">
164
- <For each={items()}>
165
- {(item) => (
166
- <Attachment data={item} onRemove={() => remove(item.id)}>
167
- <AttachmentPreview />
168
- <AttachmentRemove />
169
- </Attachment>
170
- )}
171
- </For>
172
- </Attachments>`),
173
- };
174
-
175
- export const Inline: Story = {
176
- render: () => {
177
- const [items, setItems] = createSignal([...sampleAttachments]);
178
- const remove = (id: string) => setItems((prev) => prev.filter((a) => a.id !== id));
179
- return (
180
- <div class="space-y-4">
181
- <Attachments variant="inline">
182
- <For each={items()}>
183
- {(item) => (
184
- <Attachment data={item} onRemove={() => remove(item.id)}>
185
- <AttachmentPreview />
186
- <AttachmentInfo />
187
- <AttachmentRemove />
188
- </Attachment>
189
- )}
190
- </For>
191
- </Attachments>
192
- <button
193
- class="text-sm text-muted-foreground hover:text-foreground transition-colors"
194
- onClick={() => setItems([...sampleAttachments])}
195
- >
196
- Reset
197
- </button>
198
- </div>
199
- );
200
- },
201
- ...src(`<Attachments variant="inline">
202
- <For each={items()}>
203
- {(item) => (
204
- <Attachment data={item} onRemove={() => remove(item.id)}>
205
- <AttachmentPreview />
206
- <AttachmentInfo />
207
- <AttachmentRemove />
208
- </Attachment>
209
- )}
210
- </For>
211
- </Attachments>`),
212
- };
213
-
214
- export const List: Story = {
215
- render: () => {
216
- const [items, setItems] = createSignal([...sampleAttachments]);
217
- const remove = (id: string) => setItems((prev) => prev.filter((a) => a.id !== id));
218
- return (
219
- <div class="w-96 space-y-4">
220
- <Attachments variant="list">
221
- <For each={items()}>
222
- {(item) => (
223
- <Attachment data={item} onRemove={() => remove(item.id)}>
224
- <AttachmentPreview />
225
- <AttachmentInfo showMediaType />
226
- <AttachmentRemove />
227
- </Attachment>
228
- )}
229
- </For>
230
- </Attachments>
231
- <button
232
- class="text-sm text-muted-foreground hover:text-foreground transition-colors"
233
- onClick={() => setItems([...sampleAttachments])}
234
- >
235
- Reset
236
- </button>
237
- </div>
238
- );
239
- },
240
- ...src(`<Attachments variant="list">
241
- <For each={items()}>
242
- {(item) => (
243
- <Attachment data={item} onRemove={() => remove(item.id)}>
244
- <AttachmentPreview />
245
- <AttachmentInfo showMediaType />
246
- <AttachmentRemove />
247
- </Attachment>
248
- )}
249
- </For>
250
- </Attachments>`),
251
- };
252
-
253
- export const WithHoverCard: Story = {
254
- render: () => (
255
- <Attachments variant="grid">
256
- <AttachmentHoverCard>
257
- <AttachmentHoverCardTrigger>
258
- <Attachment
259
- data={{
260
- id: '1',
261
- type: 'file',
262
- filename: 'mountain-landscape.jpg',
263
- mediaType: 'image/jpeg',
264
- url: 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400&h=400&fit=crop',
265
- }}
266
- >
267
- <AttachmentPreview />
268
- </Attachment>
269
- </AttachmentHoverCardTrigger>
270
- <AttachmentHoverCardContent>
271
- <img
272
- src="https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=600&h=400&fit=crop"
273
- alt="Mountain landscape"
274
- class="max-w-xs rounded"
275
- />
276
- </AttachmentHoverCardContent>
277
- </AttachmentHoverCard>
278
- </Attachments>
279
- ),
280
- ...src(`<Attachments variant="grid">
281
- <AttachmentHoverCard>
282
- <AttachmentHoverCardTrigger>
283
- <Attachment data={item}>
284
- <AttachmentPreview />
285
- </Attachment>
286
- </AttachmentHoverCardTrigger>
287
- <AttachmentHoverCardContent>
288
- <img src={item.url} alt={item.filename} class="max-w-xs rounded" />
289
- </AttachmentHoverCardContent>
290
- </AttachmentHoverCard>
291
- </Attachments>`),
292
- };
293
-
294
- export const Empty: Story = {
295
- render: () => (
296
- <Attachments variant="grid">
297
- <AttachmentEmpty />
298
- </Attachments>
299
- ),
300
- ...src(`<Attachments variant="grid">
301
- <AttachmentEmpty />
302
- </Attachments>`),
303
- };
@@ -1,64 +0,0 @@
1
- /**
2
- * Unit tests for the Attachments SolidJS primitives.
3
- *
4
- * Covers two bugs found while dogfooding `kai-attachments` in the docs site:
5
- * 1. The per-item layout was not reactive to a post-render variant change —
6
- * `Attachment` destructured `variant` from context, capturing it once.
7
- * 2. `AttachmentHoverCardTrigger` could not carry layout, so the hover trigger
8
- * collapsed inline/list rows (it forwards a class now).
9
- */
10
- import { describe, it, expect, afterEach } from 'vitest';
11
- import '@testing-library/jest-dom/vitest';
12
- import { render, cleanup } from '@solidjs/testing-library';
13
- import { createSignal } from 'solid-js';
14
- import {
15
- Attachments,
16
- Attachment,
17
- AttachmentHoverCard,
18
- AttachmentHoverCardTrigger,
19
- type AttachmentData,
20
- type AttachmentVariant,
21
- } from './attachments';
22
-
23
- afterEach(cleanup);
24
-
25
- const fileData: AttachmentData = {
26
- id: '1',
27
- type: 'file',
28
- filename: 'spec.pdf',
29
- mediaType: 'application/pdf',
30
- };
31
-
32
- describe('Attachment item layout', () => {
33
- it('re-lays out items when the container variant changes after first render', () => {
34
- const [variant, setVariant] = createSignal<AttachmentVariant>('grid');
35
- const { container } = render(() => (
36
- <Attachments variant={variant()}>
37
- <Attachment data={fileData} />
38
- </Attachments>
39
- ));
40
-
41
- const item = () => container.querySelector('.group') as HTMLElement;
42
- expect(item().className).toMatch(/size-24/); // grid tile
43
-
44
- setVariant('inline');
45
- expect(item().className).not.toMatch(/size-24/); // no longer a grid tile
46
- expect(item().className).toMatch(/\bh-8\b/); // inline chip height
47
- });
48
- });
49
-
50
- describe('AttachmentHoverCardTrigger', () => {
51
- it('forwards a class to the underlying hover trigger so it can carry the row layout', () => {
52
- const { container } = render(() => (
53
- <AttachmentHoverCard>
54
- <AttachmentHoverCardTrigger class="flex items-center gap-1.5">
55
- <span>preview</span>
56
- </AttachmentHoverCardTrigger>
57
- </AttachmentHoverCard>
58
- ));
59
-
60
- const trigger = container.querySelector('span');
61
- expect(trigger).toBeTruthy();
62
- expect(trigger!.className).toContain('flex');
63
- });
64
- });