@kitn.ai/ui 0.17.0 → 0.18.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 (494) hide show
  1. package/README.md +28 -5
  2. package/dist/components/artifact.d.ts +39 -1
  3. package/dist/components/attachment-types.d.ts +12 -0
  4. package/dist/components/attachments.d.ts +2 -10
  5. package/dist/components/card.d.ts +27 -0
  6. package/dist/components/chain-of-thought.d.ts +78 -2
  7. package/dist/components/chat-scope-picker.d.ts +7 -0
  8. package/dist/components/chat-thread.d.ts +37 -12
  9. package/dist/components/choice-card.d.ts +26 -0
  10. package/dist/components/coachmark.d.ts +49 -0
  11. package/dist/components/composer-dom.d.ts +35 -0
  12. package/dist/components/composer-highlight.d.ts +48 -0
  13. package/dist/components/composer-history.d.ts +34 -0
  14. package/dist/components/composer.d.ts +86 -0
  15. package/dist/components/confirm-card.d.ts +17 -0
  16. package/dist/components/conversation-item.d.ts +9 -0
  17. package/dist/components/conversation-list.d.ts +36 -1
  18. package/dist/components/file-tree.d.ts +15 -0
  19. package/dist/components/form.d.ts +34 -0
  20. package/dist/components/markdown.d.ts +3 -0
  21. package/dist/components/message.d.ts +12 -0
  22. package/dist/components/model-switcher.d.ts +7 -0
  23. package/dist/components/prompt-input.d.ts +13 -4
  24. package/dist/components/prompt-suggestion.d.ts +9 -1
  25. package/dist/components/reasoning.d.ts +14 -1
  26. package/dist/components/response-compare.d.ts +14 -0
  27. package/dist/components/screen.d.ts +46 -0
  28. package/dist/components/tasks-card.d.ts +49 -1
  29. package/dist/components/toast.d.ts +12 -2
  30. package/dist/components/tool-types.d.ts +10 -0
  31. package/dist/components/tool.d.ts +8 -8
  32. package/dist/components/voice-input.d.ts +27 -0
  33. package/dist/components/voice-output.d.ts +33 -0
  34. package/dist/core-C8fzo39E.js +12 -0
  35. package/dist/custom-elements.json +8392 -1860
  36. package/dist/elements/agent-card.d.ts +1 -0
  37. package/dist/elements/agent-card.js +1 -0
  38. package/dist/elements/artifact.js +1 -1
  39. package/dist/elements/attachments.js +1 -1
  40. package/dist/elements/autoloader.js +1 -1
  41. package/dist/elements/avatar.d.ts +1 -0
  42. package/dist/elements/avatar.js +1 -0
  43. package/dist/elements/badge.d.ts +1 -0
  44. package/dist/elements/badge.js +1 -0
  45. package/dist/elements/button.d.ts +1 -0
  46. package/dist/elements/button.js +1 -0
  47. package/dist/elements/card.js +1 -1
  48. package/dist/elements/cards.js +1 -1
  49. package/dist/elements/chain-of-thought.js +1 -1
  50. package/dist/elements/chat-scope-picker.js +1 -1
  51. package/dist/elements/chat-types.d.ts +47 -0
  52. package/dist/elements/chat-workspace.js +1 -1
  53. package/dist/elements/chat.js +1 -1
  54. package/dist/elements/checkpoint.js +1 -1
  55. package/dist/elements/choice.js +1 -1
  56. package/dist/elements/chunks/Icon-DLLBeLG5.js +1 -0
  57. package/dist/elements/chunks/action-icons-UB4V5FNq.js +1 -0
  58. package/dist/elements/chunks/arrow-left-C-gwlUmx.js +1 -0
  59. package/dist/elements/chunks/attachments-CgbErf1r.js +1 -0
  60. package/dist/elements/chunks/badge-DTQpgB6N.js +1 -0
  61. package/dist/elements/chunks/button-XDUM6lXs.js +1 -0
  62. package/dist/elements/chunks/card-CBlFZ-7I.js +1 -0
  63. package/dist/elements/chunks/chat-thread-BIhmqwNL.js +1 -0
  64. package/dist/elements/chunks/check-hGUoVIKb.js +1 -0
  65. package/dist/elements/chunks/chevron-down-DDoaSUtO.js +1 -0
  66. package/dist/elements/chunks/chevron-right-CdGEUakB.js +1 -0
  67. package/dist/elements/chunks/circle-BKAZdmzb.js +1 -0
  68. package/dist/elements/chunks/circle-check-CmYG-y3I.js +1 -0
  69. package/dist/elements/chunks/circle-x-DewgAEym.js +1 -0
  70. package/dist/elements/chunks/cn-CU7UAWzk.js +1 -0
  71. package/dist/elements/chunks/code-block-DedwxwFI.js +1 -0
  72. package/dist/elements/chunks/collapsible-FfgmTHtM.js +1 -0
  73. package/dist/elements/chunks/composer-Cfbw5HKT.js +65 -0
  74. package/dist/elements/chunks/context-DwJmxlRE.js +1 -0
  75. package/dist/elements/chunks/conversation-list-DsCQMfPq.js +1 -0
  76. package/dist/elements/chunks/default-input-BuqsoENC.js +1 -0
  77. package/dist/elements/chunks/define-rGsaWsLL.js +1 -0
  78. package/dist/elements/chunks/disclosure-CwoAkpMH.js +1 -0
  79. package/dist/elements/chunks/download-DJ06G3Bz.js +1 -0
  80. package/dist/elements/chunks/dropdown-BFg8ri_R.js +1 -0
  81. package/dist/elements/chunks/ellipsis-dlN6YvGw.js +1 -0
  82. package/dist/elements/chunks/external-link-DBX2lc_R.js +1 -0
  83. package/dist/elements/chunks/file-text-HfwUx4F9.js +1 -0
  84. package/dist/elements/chunks/file-tree-C6Toj71u.js +1 -0
  85. package/dist/elements/chunks/folder-MYuqa9Xp.js +1 -0
  86. package/dist/elements/chunks/hover-card-gE7iyXdW.js +1 -0
  87. package/dist/elements/chunks/icon-Vqz4ivrY.js +1 -0
  88. package/dist/elements/chunks/{index-CTBEJeo6.js → index-BCRhi84a.js} +1 -1
  89. package/dist/elements/chunks/info-B_toFS0l.js +1 -0
  90. package/dist/elements/chunks/input-gzbHYZvQ.js +1 -0
  91. package/dist/elements/chunks/kbd-n49c4KZm.js +1 -0
  92. package/dist/elements/chunks/link-CKPs9yM0.js +1 -0
  93. package/dist/elements/chunks/loader-q6MamGus.js +1 -0
  94. package/dist/elements/chunks/{markdown-CMTGx9r8.js → markdown-DBrcqq4S.js} +9 -9
  95. package/dist/elements/chunks/message-CTqaYI0s.js +1 -0
  96. package/dist/elements/chunks/message-feedback-Cvzm03w0.js +1 -0
  97. package/dist/elements/chunks/message-square-CUg9eRCi.js +1 -0
  98. package/dist/elements/chunks/minimize-2-l2klxP6K.js +1 -0
  99. package/dist/elements/chunks/model-switcher-CmyjiHO1.js +1 -0
  100. package/dist/elements/chunks/overlay-C8sOYqjT.js +1 -0
  101. package/dist/elements/chunks/paperclip-42Ia7xHD.js +1 -0
  102. package/dist/elements/chunks/progress-bar-tzKMWAwO.js +1 -0
  103. package/dist/elements/chunks/prompt-suggestion-D3F6vP_A.js +1 -0
  104. package/dist/elements/chunks/reasoning-BJNmmyov.js +1 -0
  105. package/dist/elements/chunks/resizable-BRsk19qI.js +1 -0
  106. package/dist/elements/chunks/rotate-cw-BgcggLHC.js +1 -0
  107. package/dist/elements/chunks/scroll-area-CgGbFFbT.js +1 -0
  108. package/dist/elements/chunks/separator-8hM4GdHE.js +1 -0
  109. package/dist/elements/chunks/settings-CaUIYOg-.js +1 -0
  110. package/dist/elements/chunks/settings-group-CYjOVIZQ.js +1 -0
  111. package/dist/elements/chunks/share-BTYM3Ddt.js +1 -0
  112. package/dist/elements/chunks/skeleton-DsTYrPUe.js +1 -0
  113. package/dist/elements/chunks/slots-DkZ-Cmha.js +1 -0
  114. package/dist/elements/chunks/star-9R3LBQ9n.js +1 -0
  115. package/dist/elements/chunks/store-CYl5Y0_u.js +1 -0
  116. package/dist/elements/chunks/text-shimmer-CaYGv8Se.js +1 -0
  117. package/dist/elements/chunks/textarea-NEr2SLcD.js +1 -0
  118. package/dist/elements/chunks/thumbs-up-DZYZkFfc.js +1 -0
  119. package/dist/elements/chunks/toast-store-ClxVZRcc.js +1 -0
  120. package/dist/elements/chunks/tool-CHZOmoe9.js +1 -0
  121. package/dist/elements/chunks/tooltip-WpHElELC.js +1 -0
  122. package/dist/elements/chunks/triangle-alert-BlS80PUg.js +1 -0
  123. package/dist/elements/chunks/use-card-resolution-VSVoxDeJ.js +1 -0
  124. package/dist/elements/chunks/video-DxTPZqT8.js +1 -0
  125. package/dist/elements/chunks/x-C1qtndxn.js +1 -0
  126. package/dist/elements/coachmark.d.ts +1 -0
  127. package/dist/elements/coachmark.js +1 -0
  128. package/dist/elements/code-block.js +1 -1
  129. package/dist/elements/command.d.ts +1 -0
  130. package/dist/elements/command.js +1 -0
  131. package/dist/elements/compare.js +1 -1
  132. package/dist/elements/composer.d.ts +1 -0
  133. package/dist/elements/composer.js +1 -0
  134. package/dist/elements/confirm-card.js +1 -1
  135. package/dist/elements/context-meter.js +1 -1
  136. package/dist/elements/conversation-list.js +1 -1
  137. package/dist/elements/css.d.ts +1 -0
  138. package/dist/elements/default-input.d.ts +51 -0
  139. package/dist/elements/define.d.ts +53 -0
  140. package/dist/elements/dialog.d.ts +1 -0
  141. package/dist/elements/dialog.js +1 -0
  142. package/dist/elements/disclosure.d.ts +37 -0
  143. package/dist/elements/editable-label.d.ts +1 -0
  144. package/dist/elements/editable-label.js +1 -0
  145. package/dist/elements/embed.js +1 -1
  146. package/dist/elements/empty.js +1 -1
  147. package/dist/elements/feedback-bar.js +1 -1
  148. package/dist/elements/file-tree.js +1 -1
  149. package/dist/elements/file-upload.js +1 -1
  150. package/dist/elements/form.js +1 -1
  151. package/dist/elements/hover-card.d.ts +1 -0
  152. package/dist/elements/hover-card.js +1 -0
  153. package/dist/elements/icon.d.ts +1 -0
  154. package/dist/elements/icon.js +1 -0
  155. package/dist/elements/image.js +1 -1
  156. package/dist/elements/input.d.ts +1 -0
  157. package/dist/elements/input.js +1 -0
  158. package/dist/elements/kbd.d.ts +1 -0
  159. package/dist/elements/kbd.js +1 -0
  160. package/dist/elements/link-preview.js +1 -1
  161. package/dist/elements/loader.js +1 -1
  162. package/dist/elements/markdown.js +1 -1
  163. package/dist/elements/menu.d.ts +1 -0
  164. package/dist/elements/menu.js +1 -0
  165. package/dist/elements/message-skills.js +1 -1
  166. package/dist/elements/message.js +1 -1
  167. package/dist/elements/model-switcher.js +1 -1
  168. package/dist/elements/nav.d.ts +1 -0
  169. package/dist/elements/nav.js +1 -0
  170. package/dist/elements/notice.d.ts +1 -0
  171. package/dist/elements/notice.js +1 -0
  172. package/dist/elements/pane-group.d.ts +1 -0
  173. package/dist/elements/pane-group.js +1 -0
  174. package/dist/elements/pane.d.ts +1 -0
  175. package/dist/elements/pane.js +1 -0
  176. package/dist/elements/popover.js +1 -1
  177. package/dist/elements/progress-bar.d.ts +1 -0
  178. package/dist/elements/progress-bar.js +1 -0
  179. package/dist/elements/prompt-dock.d.ts +1 -0
  180. package/dist/elements/prompt-dock.js +1 -0
  181. package/dist/elements/prompt-input.js +1 -1
  182. package/dist/elements/prompt-suggestions.js +1 -1
  183. package/dist/elements/reasoning.js +1 -1
  184. package/dist/elements/register-impl.d.ts +0 -0
  185. package/dist/elements/register.d.ts +13 -0
  186. package/dist/elements/remote.d.ts +1 -0
  187. package/dist/elements/remote.js +1 -0
  188. package/dist/elements/resizable.js +1 -1
  189. package/dist/elements/response-stream.js +2 -2
  190. package/dist/elements/screen.d.ts +1 -0
  191. package/dist/elements/screen.js +1 -0
  192. package/dist/elements/scroll-area.d.ts +1 -0
  193. package/dist/elements/scroll-area.js +1 -0
  194. package/dist/elements/scroll-button.js +1 -1
  195. package/dist/elements/search.d.ts +1 -0
  196. package/dist/elements/search.js +1 -0
  197. package/dist/elements/segmented.d.ts +1 -0
  198. package/dist/elements/segmented.js +1 -0
  199. package/dist/elements/separator.d.ts +1 -0
  200. package/dist/elements/separator.js +1 -0
  201. package/dist/elements/setting-item.d.ts +1 -0
  202. package/dist/elements/setting-item.js +1 -0
  203. package/dist/elements/settings-group.d.ts +1 -0
  204. package/dist/elements/settings-group.js +1 -0
  205. package/dist/elements/skeleton.d.ts +1 -0
  206. package/dist/elements/skeleton.js +1 -0
  207. package/dist/elements/slots.d.ts +176 -0
  208. package/dist/elements/source.js +1 -1
  209. package/dist/elements/status.d.ts +1 -0
  210. package/dist/elements/status.js +1 -0
  211. package/dist/elements/switch.js +1 -1
  212. package/dist/elements/tabs.d.ts +1 -0
  213. package/dist/elements/tabs.js +1 -0
  214. package/dist/elements/tasks.js +1 -1
  215. package/dist/elements/text-shimmer.js +1 -1
  216. package/dist/elements/thinking-bar.js +1 -1
  217. package/dist/elements/toast.js +1 -1
  218. package/dist/elements/tool.js +1 -1
  219. package/dist/elements/tooltip.d.ts +1 -0
  220. package/dist/elements/tooltip.js +1 -0
  221. package/dist/elements/voice-input.js +1 -1
  222. package/dist/elements/voice-output.d.ts +1 -0
  223. package/dist/elements/voice-output.js +1 -0
  224. package/dist/elements.d.ts +733 -58
  225. package/dist/engine-javascript-C1x7zo1_.js +141 -0
  226. package/dist/index.d.ts +3 -2
  227. package/dist/index.js +8256 -5703
  228. package/dist/kai.es.js +1 -0
  229. package/dist/llms/llms-full.txt +1146 -64
  230. package/dist/llms/llms.txt +4 -4
  231. package/dist/mcp.es.js +62 -7
  232. package/dist/primitives/composer-model.d.ts +22 -0
  233. package/dist/primitives/composer-triggers.d.ts +19 -0
  234. package/dist/primitives/create-kai-chat.d.ts +38 -0
  235. package/dist/primitives/toast-store.d.ts +32 -2
  236. package/dist/primitives/use-speech-recognition.d.ts +26 -0
  237. package/dist/react/index.d.ts +1085 -97
  238. package/dist/react/runtime.d.ts +9 -2
  239. package/dist/react/use-kai-chat.d.ts +41 -0
  240. package/dist/react.js +572 -193
  241. package/dist/register-impl-CYWGkgbI.js +141 -0
  242. package/dist/schemas/tasks.schema.json +2 -2
  243. package/dist/state/index.d.ts +4 -0
  244. package/dist/state/messages.d.ts +11 -0
  245. package/dist/state/stream.d.ts +22 -0
  246. package/dist/state/suggestions.d.ts +4 -0
  247. package/dist/state.js +117 -0
  248. package/dist/theme.tokens.css +87 -0
  249. package/dist/types.d.ts +4 -0
  250. package/dist/ui/agent-card.d.ts +61 -0
  251. package/dist/ui/button.d.ts +5 -2
  252. package/dist/ui/card.d.ts +61 -0
  253. package/dist/ui/collapsible.d.ts +15 -1
  254. package/dist/ui/command.d.ts +33 -0
  255. package/dist/ui/dialog.d.ts +42 -0
  256. package/dist/ui/dropdown.d.ts +95 -1
  257. package/dist/ui/editable-label.d.ts +26 -0
  258. package/dist/ui/hover-card.d.ts +13 -1
  259. package/dist/ui/icon.d.ts +18 -0
  260. package/dist/ui/input.d.ts +33 -0
  261. package/dist/ui/kbd.d.ts +21 -0
  262. package/dist/ui/nav.d.ts +62 -0
  263. package/dist/ui/notice.d.ts +31 -0
  264. package/dist/ui/overlay.d.ts +12 -0
  265. package/dist/ui/pane-grid.d.ts +58 -0
  266. package/dist/ui/pane-group.d.ts +75 -0
  267. package/dist/ui/pane.d.ts +78 -0
  268. package/dist/ui/popover.d.ts +11 -1
  269. package/dist/ui/progress-bar.d.ts +23 -0
  270. package/dist/ui/prompt-dock.d.ts +96 -0
  271. package/dist/ui/resizable.d.ts +12 -0
  272. package/dist/ui/scroll-area.d.ts +4 -0
  273. package/dist/ui/segmented.d.ts +28 -0
  274. package/dist/ui/settings-group.d.ts +32 -0
  275. package/dist/ui/skeleton.d.ts +12 -0
  276. package/dist/ui/stat.d.ts +16 -0
  277. package/dist/ui/status.d.ts +13 -0
  278. package/dist/ui/switch.d.ts +8 -1
  279. package/dist/ui/tabs.d.ts +35 -0
  280. package/dist/ui/tooltip.d.ts +19 -1
  281. package/frameworks/react/index.tsx +1042 -157
  282. package/frameworks/react/runtime.tsx +30 -1
  283. package/frameworks/react/use-kai-chat.tsx +87 -0
  284. package/llms-full.txt +1146 -64
  285. package/llms.txt +4 -4
  286. package/package.json +23 -8
  287. package/src/agent-tooling/mcp/manifest.ts +14 -0
  288. package/src/agent-tooling/mcp/tools/debug.ts +10 -6
  289. package/src/agent-tooling/mcp/tools/reference.ts +32 -0
  290. package/src/agent-tooling/mcp/tools/scaffold.ts +30 -1
  291. package/src/components/artifact.tsx +98 -13
  292. package/src/components/attachment-types.ts +13 -0
  293. package/src/components/attachments.tsx +4 -14
  294. package/src/components/card.tsx +109 -15
  295. package/src/components/chain-of-thought.tsx +210 -1
  296. package/src/components/chat-scope-picker.tsx +13 -3
  297. package/src/components/chat-thread.tsx +225 -116
  298. package/src/components/choice-card.tsx +103 -11
  299. package/src/components/coachmark.tsx +245 -0
  300. package/src/components/component-meta.json +691 -102
  301. package/src/components/composer-dom.ts +159 -0
  302. package/src/components/composer-highlight.ts +242 -0
  303. package/src/components/composer-history.ts +82 -0
  304. package/src/components/composer.tsx +979 -0
  305. package/src/components/confirm-card.tsx +54 -1
  306. package/src/components/conversation-item.tsx +69 -7
  307. package/src/components/conversation-list.tsx +134 -37
  308. package/src/components/file-tree.tsx +197 -47
  309. package/src/components/form-widgets.tsx +9 -7
  310. package/src/components/form.tsx +140 -17
  311. package/src/components/image.tsx +3 -5
  312. package/src/components/link-preview.tsx +5 -4
  313. package/src/components/markdown.tsx +5 -2
  314. package/src/components/message.tsx +23 -4
  315. package/src/components/model-switcher.tsx +19 -4
  316. package/src/components/prompt-input.tsx +46 -75
  317. package/src/components/prompt-suggestion.tsx +48 -16
  318. package/src/components/reasoning.tsx +29 -6
  319. package/src/components/response-compare.tsx +31 -2
  320. package/src/components/screen.tsx +176 -0
  321. package/src/components/tasks-card.tsx +342 -21
  322. package/src/components/toast.tsx +119 -31
  323. package/src/components/tool-types.ts +10 -0
  324. package/src/components/tool.tsx +22 -16
  325. package/src/components/voice-input.tsx +102 -19
  326. package/src/components/voice-output.tsx +202 -0
  327. package/src/elements/agent-card.tsx +67 -0
  328. package/src/elements/artifact.tsx +53 -4
  329. package/src/elements/attachments.tsx +1 -0
  330. package/src/elements/avatar.tsx +33 -0
  331. package/src/elements/badge.tsx +32 -0
  332. package/src/elements/button.tsx +126 -0
  333. package/src/elements/card-media.jpg +0 -0
  334. package/src/elements/card.tsx +124 -31
  335. package/src/elements/cards.tsx +81 -7
  336. package/src/elements/chain-of-thought.tsx +77 -32
  337. package/src/elements/chat-scope-picker.tsx +35 -8
  338. package/src/elements/chat-types.ts +2 -2
  339. package/src/elements/chat-workspace.tsx +153 -41
  340. package/src/elements/chat.tsx +45 -23
  341. package/src/elements/choice.tsx +71 -19
  342. package/src/elements/coachmark.tsx +90 -0
  343. package/src/elements/command.tsx +209 -0
  344. package/src/elements/compare.tsx +24 -2
  345. package/src/elements/compiled.css +1 -1
  346. package/src/elements/composer.tsx +151 -0
  347. package/src/elements/confirm-card.tsx +36 -11
  348. package/src/elements/conversation-list.tsx +80 -11
  349. package/src/elements/default-input.tsx +75 -53
  350. package/src/elements/define.tsx +47 -6
  351. package/src/elements/dialog.tsx +98 -0
  352. package/src/elements/disclosure.ts +73 -0
  353. package/src/elements/editable-label.tsx +125 -0
  354. package/src/elements/element-manifest.json +129 -1
  355. package/src/elements/element-meta.json +5562 -1336
  356. package/src/elements/element-types.d.ts +732 -57
  357. package/src/elements/file-tree.tsx +12 -2
  358. package/src/elements/file-upload.tsx +1 -1
  359. package/src/elements/form.tsx +54 -11
  360. package/src/elements/hover-card.tsx +80 -0
  361. package/src/elements/icon-names.json +48 -0
  362. package/src/elements/icon.tsx +41 -0
  363. package/src/elements/input.tsx +203 -0
  364. package/src/elements/kbd.tsx +45 -0
  365. package/src/elements/menu.tsx +217 -0
  366. package/src/elements/message.tsx +58 -11
  367. package/src/elements/model-switcher.tsx +27 -1
  368. package/src/elements/nav.tsx +87 -0
  369. package/src/elements/notice.tsx +53 -0
  370. package/src/elements/pane-group.tsx +119 -0
  371. package/src/elements/pane.tsx +129 -0
  372. package/src/elements/popover.tsx +39 -17
  373. package/src/elements/progress-bar.tsx +39 -0
  374. package/src/elements/prompt-dock.tsx +81 -0
  375. package/src/elements/prompt-input.tsx +112 -63
  376. package/src/elements/prompt-suggestions.tsx +25 -9
  377. package/src/elements/reasoning.tsx +30 -9
  378. package/src/elements/register-impl.ts +38 -3
  379. package/src/elements/register.ts +11 -3
  380. package/src/elements/resizable.tsx +48 -11
  381. package/src/elements/screen.tsx +90 -0
  382. package/src/elements/scroll-area.tsx +33 -0
  383. package/src/elements/search.tsx +180 -0
  384. package/src/elements/segmented.tsx +135 -0
  385. package/src/elements/separator.tsx +36 -0
  386. package/src/elements/setting-item.tsx +50 -0
  387. package/src/elements/settings-group.tsx +37 -0
  388. package/src/elements/skeleton.tsx +45 -0
  389. package/src/elements/slots.ts +607 -0
  390. package/src/elements/source.tsx +13 -6
  391. package/src/elements/status.tsx +42 -0
  392. package/src/elements/switch.tsx +89 -14
  393. package/src/elements/tabs.tsx +95 -0
  394. package/src/elements/tasks.tsx +70 -14
  395. package/src/elements/toast.tsx +17 -2
  396. package/src/elements/tool.tsx +43 -9
  397. package/src/elements/tooltip.tsx +85 -0
  398. package/src/elements/video-poster.jpg +0 -0
  399. package/src/elements/voice-input.tsx +66 -16
  400. package/src/elements/voice-output.tsx +69 -0
  401. package/src/index.ts +5 -2
  402. package/src/primitives/card-schemas/tasks.schema.json +2 -2
  403. package/src/primitives/composer-model.ts +49 -0
  404. package/src/primitives/composer-triggers.ts +35 -0
  405. package/src/primitives/create-kai-chat.ts +66 -0
  406. package/src/primitives/toast-store.ts +43 -2
  407. package/src/primitives/use-speech-recognition.ts +135 -0
  408. package/src/state/index.ts +6 -0
  409. package/src/state/messages.ts +36 -0
  410. package/src/state/stream.ts +92 -0
  411. package/src/state/suggestions.ts +9 -0
  412. package/src/types.ts +4 -0
  413. package/src/ui/agent-card.tsx +212 -0
  414. package/src/ui/button.tsx +16 -5
  415. package/src/ui/card.tsx +245 -0
  416. package/src/ui/collapsible.tsx +30 -4
  417. package/src/ui/command.tsx +99 -0
  418. package/src/ui/dialog.tsx +217 -0
  419. package/src/ui/dropdown.tsx +375 -13
  420. package/src/ui/editable-label.tsx +112 -0
  421. package/src/ui/hover-card.tsx +28 -5
  422. package/src/ui/icon.tsx +110 -0
  423. package/src/ui/input.tsx +132 -0
  424. package/src/ui/kbd.tsx +118 -0
  425. package/src/ui/nav.tsx +282 -0
  426. package/src/ui/notice.tsx +84 -0
  427. package/src/ui/overlay.tsx +108 -2
  428. package/src/ui/pane-grid.tsx +116 -0
  429. package/src/ui/pane-group.tsx +280 -0
  430. package/src/ui/pane.tsx +193 -0
  431. package/src/ui/popover.tsx +16 -2
  432. package/src/ui/progress-bar.tsx +83 -0
  433. package/src/ui/prompt-dock.tsx +145 -0
  434. package/src/ui/resizable.tsx +69 -1
  435. package/src/ui/scroll-area.tsx +14 -3
  436. package/src/ui/segmented.tsx +109 -0
  437. package/src/ui/settings-group.tsx +67 -0
  438. package/src/ui/skeleton.tsx +62 -5
  439. package/src/ui/stat.tsx +41 -0
  440. package/src/ui/status.tsx +48 -0
  441. package/src/ui/switch.tsx +49 -23
  442. package/src/ui/tabs.tsx +168 -0
  443. package/src/ui/tooltip.tsx +52 -8
  444. package/theme.css +113 -0
  445. package/dist/components/slash-command.d.ts +0 -15
  446. package/dist/elements/chunks/Icon-D_Zmwmwh.js +0 -1
  447. package/dist/elements/chunks/action-icons-PVfIvcuG.js +0 -1
  448. package/dist/elements/chunks/attachments-Dp6vqtrc.js +0 -1
  449. package/dist/elements/chunks/button-CKyYD9G4.js +0 -1
  450. package/dist/elements/chunks/card-Cjho-PYk.js +0 -1
  451. package/dist/elements/chunks/chat-thread-RT808iPf.js +0 -1
  452. package/dist/elements/chunks/check-CDYaMYrM.js +0 -1
  453. package/dist/elements/chunks/chevron-down-3SBiq8HF.js +0 -1
  454. package/dist/elements/chunks/chevron-right-k2UFlIVK.js +0 -1
  455. package/dist/elements/chunks/cn-Dogu6PbV.js +0 -1
  456. package/dist/elements/chunks/code-block-BYUmfFSd.js +0 -1
  457. package/dist/elements/chunks/collapsible-BiNwdOn6.js +0 -1
  458. package/dist/elements/chunks/context-18g6oi4J.js +0 -1
  459. package/dist/elements/chunks/conversation-list-D9Y0NVdo.js +0 -1
  460. package/dist/elements/chunks/default-input-CSAoYYMd.js +0 -1
  461. package/dist/elements/chunks/download-D8K0Je8r.js +0 -1
  462. package/dist/elements/chunks/dropdown-bUs2iTia.js +0 -1
  463. package/dist/elements/chunks/external-link-6mA0wxab.js +0 -1
  464. package/dist/elements/chunks/file-text-DnaYk3Dm.js +0 -1
  465. package/dist/elements/chunks/file-tree-CgtRLlxK.js +0 -1
  466. package/dist/elements/chunks/hover-card-CIGw62gP.js +0 -1
  467. package/dist/elements/chunks/link-BlGSeoPy.js +0 -1
  468. package/dist/elements/chunks/loader-DvhR4qa0.js +0 -1
  469. package/dist/elements/chunks/message-CDZwXjhL.js +0 -1
  470. package/dist/elements/chunks/message-feedback-CYx81QiA.js +0 -1
  471. package/dist/elements/chunks/model-switcher-O_tUhoOT.js +0 -1
  472. package/dist/elements/chunks/overlay-DydXYMQW.js +0 -1
  473. package/dist/elements/chunks/prompt-suggestion-ldlWV5kd.js +0 -1
  474. package/dist/elements/chunks/reasoning-2PUnHlmr.js +0 -1
  475. package/dist/elements/chunks/resizable-B5WNbSeb.js +0 -1
  476. package/dist/elements/chunks/star-t9tI-P0q.js +0 -1
  477. package/dist/elements/chunks/store-C6rIooZz.js +0 -1
  478. package/dist/elements/chunks/text-shimmer-uh9V_KUh.js +0 -1
  479. package/dist/elements/chunks/textarea-3nm6Ia9U.js +0 -1
  480. package/dist/elements/chunks/thumbs-up-BBtguGld.js +0 -1
  481. package/dist/elements/chunks/toast-store-D8cL3fWl.js +0 -1
  482. package/dist/elements/chunks/tool-GJ3vwp1U.js +0 -1
  483. package/dist/elements/chunks/tooltip-DwKAz4XR.js +0 -1
  484. package/dist/elements/chunks/triangle-alert-Ct1zt2JL.js +0 -1
  485. package/dist/elements/chunks/use-card-resolution-D-_0Alzy.js +0 -1
  486. package/dist/elements/chunks/video-mVYiM99-.js +0 -1
  487. package/dist/elements/chunks/x-CzxL27Ch.js +0 -1
  488. package/dist/kitn-chat.es.js +0 -1
  489. package/dist/register-JyTglR6m.js +0 -1
  490. package/dist/register-impl-C6wlSsts.js +0 -77
  491. package/src/components/slash-command.tsx +0 -232
  492. package/src/elements/framework-usage.json +0 -588
  493. /package/dist/{kitn-chat-provider.d.ts → kai-provider.d.ts} +0 -0
  494. /package/dist/{kitn-chat-provider.es.js → kai-provider.es.js} +0 -0
@@ -0,0 +1,180 @@
1
+ import { createEffect, createSignal, untrack, Show } from 'solid-js';
2
+ import { defineWebComponent } from './define';
3
+ import { Input } from '../ui/input';
4
+ import { Kbd } from '../ui/kbd';
5
+ import { Loader } from '../components/loader';
6
+ import { renderIcon } from '../ui/icon';
7
+
8
+ interface Props extends Record<string, unknown> {
9
+ /** Controlled query — settable and reflected to the `value` attribute. Read
10
+ * `el.value` for live state. */
11
+ value?: string;
12
+ /** Placeholder. Defaults to `Search…`. */
13
+ placeholder?: string;
14
+ /** Leading icon-NAME string (a curated name, URL, or text), resolved to a glyph
15
+ * the same way `kai-button`'s `icon` is. Defaults to `search`. */
16
+ icon?: string;
17
+ /** Debounce window for `kai-search`, in ms. Defaults to `200`. */
18
+ debounce?: number;
19
+ /** Show a spinner in place of the leading icon while results load. */
20
+ loading?: boolean;
21
+ /** Optional shortcut hint shown (as a `kai-kbd`) while the field is empty,
22
+ * e.g. `Mod+K`. Display only; it does not bind the key. */
23
+ shortcut?: string;
24
+ }
25
+
26
+ /** Events fired by `<kai-search>`. */
27
+ interface Events {
28
+ /** The query changed (debounced live, and on clear). */
29
+ 'kai-search': { value: string };
30
+ /** Enter was pressed. */
31
+ 'kai-submit': { value: string };
32
+ /** The field committed (blur). */
33
+ 'kai-change': { value: string };
34
+ }
35
+
36
+ /**
37
+ * `<kai-search>` — a debounced filter field built on `kai-input`. Type to fire a
38
+ * debounced `kai-search`, press Enter for `kai-submit`. A clear (×) button shows
39
+ * once there's a value; an optional `shortcut` renders a `kai-kbd` hint while the
40
+ * field is empty.
41
+ *
42
+ * ```html
43
+ * <kai-search placeholder="Search docs" shortcut="Mod+K"></kai-search>
44
+ * <script type="module">
45
+ * import '@kitn.ai/ui/elements';
46
+ * const s = document.querySelector('kai-search');
47
+ * s.addEventListener('kai-search', (e) => filter(e.detail.value));
48
+ * s.addEventListener('kai-submit', (e) => go(e.detail.value));
49
+ * </script>
50
+ * ```
51
+ *
52
+ * Drive/read the query with the `value` property (reflected to the attribute).
53
+ * Restyle via `::part(field)`, `::part(input)`, and `::part(clear)`.
54
+ */
55
+ defineWebComponent<Props, Events>('kai-search', {
56
+ value: undefined,
57
+ placeholder: 'Search…',
58
+ icon: 'search',
59
+ debounce: 200,
60
+ loading: false,
61
+ shortcut: undefined,
62
+ }, (props, ctx) => {
63
+ const { element, dispatch, flag, expose } = ctx;
64
+
65
+ // Lift the query into the facade and drive Input CONTROLLED so the host can read
66
+ // it (`el.value` / `:host([value])`) and set it after mount. Mirrors kai-segmented.
67
+ const [value, setValue] = createSignal(
68
+ (props.value as string | undefined) ?? element.getAttribute('value') ?? '',
69
+ );
70
+
71
+ const coerce = (v: unknown): string =>
72
+ v == null ? (element.getAttribute('value') ?? '') : String(v);
73
+
74
+ // Reads return LIVE state; host writes (`el.value = …`) drive it WITHOUT firing
75
+ // events. The equality guard kills the reflect write-back loop.
76
+ Object.defineProperty(element, 'value', {
77
+ get: () => value(),
78
+ set: (v: unknown) => { const next = coerce(v); if (untrack(value) !== next) setValue(next); },
79
+ configurable: true,
80
+ enumerable: true,
81
+ });
82
+
83
+ // Reflect internal value → `[value]` host attribute (for `:host([value])`).
84
+ createEffect(() => {
85
+ const v = value();
86
+ if (v) {
87
+ if (element.getAttribute('value') !== v) element.setAttribute('value', v);
88
+ } else if (element.hasAttribute('value')) {
89
+ element.removeAttribute('value');
90
+ }
91
+ });
92
+
93
+ // Debounced kai-search: each keystroke resets the timer; it fires once after the
94
+ // window. Clearing fires immediately (timer cancelled).
95
+ let timer: ReturnType<typeof setTimeout> | undefined;
96
+ const debounceMs = () => {
97
+ const ms = Number(props.debounce ?? 200);
98
+ return Number.isFinite(ms) && ms >= 0 ? ms : 200;
99
+ };
100
+ const scheduleSearch = (next: string) => {
101
+ if (timer) clearTimeout(timer);
102
+ timer = setTimeout(() => dispatch('kai-search', { value: next }), debounceMs());
103
+ };
104
+
105
+ const getInput = (): HTMLInputElement | null =>
106
+ element.shadowRoot?.querySelector<HTMLInputElement>('input') ?? null;
107
+
108
+ const onInput = (next: string) => {
109
+ setValue(next);
110
+ scheduleSearch(next);
111
+ };
112
+
113
+ // Empty the field, fire kai-search '' immediately (cancelling any pending), refocus.
114
+ const clear = () => {
115
+ if (timer) clearTimeout(timer);
116
+ setValue('');
117
+ dispatch('kai-search', { value: '' });
118
+ getInput()?.focus();
119
+ };
120
+
121
+ const onKeyDown = (e: KeyboardEvent) => {
122
+ if (e.key === 'Enter') dispatch('kai-submit', { value: untrack(value) });
123
+ };
124
+
125
+ expose({
126
+ focus: () => getInput()?.focus(),
127
+ clear,
128
+ });
129
+
130
+ // Leading: a spinner while loading, otherwise the resolved icon glyph.
131
+ const leading = (
132
+ <Show
133
+ when={flag('loading')}
134
+ fallback={renderIcon((props.icon as string) ?? 'search', {
135
+ class: 'size-4 shrink-0',
136
+ imgClass: 'size-4 shrink-0',
137
+ spanClass: 'inline-flex size-4 shrink-0 items-center justify-center',
138
+ ariaHidden: true,
139
+ })}
140
+ >
141
+ <Loader variant="circular" size="sm" />
142
+ </Show>
143
+ );
144
+
145
+ // Trailing: a clear button once there's a value, else a shortcut hint if set.
146
+ const trailing = (
147
+ <>
148
+ <Show when={value()}>
149
+ <button
150
+ type="button"
151
+ part="clear"
152
+ aria-label="Clear"
153
+ class="inline-flex size-5 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
154
+ onClick={clear}
155
+ >
156
+ {renderIcon('x', { class: 'size-4', imgClass: 'size-4' })}
157
+ </button>
158
+ </Show>
159
+ <Show when={!value() && props.shortcut}>
160
+ <Kbd keys={props.shortcut as string} size="sm" class="opacity-80" />
161
+ </Show>
162
+ </>
163
+ );
164
+
165
+ return (
166
+ <>
167
+ <style>{':host{display:block}'}</style>
168
+ <Input
169
+ type="search"
170
+ value={value()}
171
+ placeholder={(props.placeholder as string) ?? 'Search…'}
172
+ leading={leading}
173
+ trailing={trailing}
174
+ onValueInput={onInput}
175
+ onValueChange={(v) => dispatch('kai-change', { value: v })}
176
+ onKeyDown={onKeyDown}
177
+ />
178
+ </>
179
+ );
180
+ });
@@ -0,0 +1,135 @@
1
+ import { createEffect, createSignal, untrack } from 'solid-js';
2
+ import { defineWebComponent } from './define';
3
+ import { Segmented, type SegmentedOption } from '../ui/segmented';
4
+ import { renderIcon } from '../ui/icon';
5
+
6
+ /** A single segment. `icon` is an icon-NAME string (web-component-friendly) —
7
+ * a curated name (e.g. `"code"`), a URL/data-URI, or plain text — resolved to a
8
+ * glyph via the kit's icon renderer (the same path `kai-button`'s `icon` uses). */
9
+ interface Option {
10
+ value: string;
11
+ label: string;
12
+ icon?: string;
13
+ }
14
+
15
+ interface Props extends Record<string, unknown> {
16
+ /** The selectable segments, left to right. Set as a JS property (array). */
17
+ options: Option[];
18
+ /** Controlled selected `value` — settable and reflected to the `value`
19
+ * attribute. `el.value = 'preview'` drives it; choosing a segment updates it
20
+ * and fires `kai-change`. Read `el.value` for live state. */
21
+ value?: string;
22
+ /** Control density: `sm` or `md`. Defaults to `md`. */
23
+ size?: 'sm' | 'md';
24
+ }
25
+
26
+ /** Events fired by `<kai-segmented>`. */
27
+ interface Events {
28
+ /** A segment was chosen. */
29
+ 'kai-change': { value: string };
30
+ }
31
+
32
+ /**
33
+ * `<kai-segmented>` — a single-select pill track (segmented / toggle group).
34
+ * Feed it `options` (a JS-property array), drive/read the selection with the
35
+ * `value` property (settable + reflected to the `value` attribute, so
36
+ * `:host([value])` and `el.value` see live state), and listen for `kai-change`.
37
+ *
38
+ * ```html
39
+ * <kai-segmented value="preview"></kai-segmented>
40
+ * <script type="module">
41
+ * import '@kitn.ai/ui/elements';
42
+ * const seg = document.querySelector('kai-segmented');
43
+ * seg.options = [
44
+ * { value: 'code', label: 'Code', icon: 'code' },
45
+ * { value: 'preview', label: 'Preview', icon: 'monitor' },
46
+ * ];
47
+ * seg.addEventListener('kai-change', (e) => console.log(e.detail.value));
48
+ * seg.value = 'code'; // drive it (no kai-change — the host already knows)
49
+ * </script>
50
+ * ```
51
+ *
52
+ * Each option's `icon` is an icon-name string resolved to a glyph (curated name,
53
+ * URL, or text). Restyle via `::part(track)` and `::part(segment)`.
54
+ */
55
+ defineWebComponent<Props, Events>('kai-segmented', {
56
+ options: [],
57
+ value: undefined,
58
+ size: 'md',
59
+ }, (props, ctx) => {
60
+ const { element, dispatch } = ctx;
61
+
62
+ // Lift the selected value into the facade and drive Segmented CONTROLLED so the
63
+ // host can read it (`el.value` / `:host([value])`) and set it after mount. Seed
64
+ // from the `value` property/attribute present on mount (options usually arrive
65
+ // as a property after upgrade, so we don't auto-select the first segment here).
66
+ const [value, setValue] = createSignal(
67
+ (props.value as string | undefined) ?? element.getAttribute('value') ?? '',
68
+ );
69
+
70
+ // Coerce any value coming through the `value` setter (a JS assignment, or the
71
+ // write-back from `attributeChangedCallback`) to a string — falling back to the
72
+ // live attribute when it's nullish, so the reflect write-back equals the signal
73
+ // and the equality guards below absorb it (no attr⇄prop feedback loop; mirrors
74
+ // kai-switch's `checked`).
75
+ const coerce = (v: unknown): string =>
76
+ v == null ? (element.getAttribute('value') ?? '') : String(v);
77
+
78
+ // Apply a new value and fire kai-change once (the user-choice path).
79
+ const apply = (next: string) => {
80
+ if (untrack(value) === next) return;
81
+ setValue(next);
82
+ dispatch('kai-change', { value: next });
83
+ };
84
+
85
+ // Override the `value` property so reads return LIVE state (the signal) and host
86
+ // writes (`el.value = …`) drive it WITHOUT firing kai-change — distinct from the
87
+ // user-choice path. The equality guard kills the reflect write-back loop.
88
+ Object.defineProperty(element, 'value', {
89
+ get: () => value(),
90
+ set: (v: unknown) => { const next = coerce(v); if (untrack(value) !== next) setValue(next); },
91
+ configurable: true,
92
+ enumerable: true,
93
+ });
94
+
95
+ // Reflect internal value → the `[value]` host attribute (for `:host([value])`).
96
+ // The guard against the live attribute keeps the write-back the reflect triggers
97
+ // (attributeChangedCallback → setter) from looping.
98
+ createEffect(() => {
99
+ const v = value();
100
+ if (v) {
101
+ if (element.getAttribute('value') !== v) element.setAttribute('value', v);
102
+ } else if (element.hasAttribute('value')) {
103
+ element.removeAttribute('value');
104
+ }
105
+ });
106
+
107
+ // Resolve each option's icon-NAME string into a rendered glyph, the same path
108
+ // kai-button uses for its `icon` prop, and hand the primitive `{value,label,icon:JSX}`.
109
+ const resolved = (): SegmentedOption[] =>
110
+ (props.options ?? []).map((o) => ({
111
+ value: o.value,
112
+ label: o.label,
113
+ icon: o.icon
114
+ ? renderIcon(o.icon, {
115
+ class: 'size-4 shrink-0',
116
+ imgClass: 'size-4 shrink-0',
117
+ spanClass: 'inline-flex size-4 shrink-0 items-center justify-center',
118
+ ariaHidden: true,
119
+ })
120
+ : undefined,
121
+ }));
122
+
123
+ return (
124
+ <>
125
+ {/* Base sets `:host{display:block}`; the track flows inline like a pill. */}
126
+ <style>{':host{display:inline-flex}'}</style>
127
+ <Segmented
128
+ options={resolved()}
129
+ value={value()}
130
+ size={(props.size as 'sm' | 'md' | undefined) ?? 'md'}
131
+ onChange={(next) => apply(next)}
132
+ />
133
+ </>
134
+ );
135
+ });
@@ -0,0 +1,36 @@
1
+ import { Separator } from '../ui/separator';
2
+ import { defineWebComponent } from './define';
3
+
4
+ interface Props extends Record<string, unknown> {
5
+ /** `horizontal` (default, block + full-width) or `vertical` (a rule inside a
6
+ * flex/grid row — it stretches to the row height). */
7
+ orientation?: 'horizontal' | 'vertical';
8
+ }
9
+
10
+ /**
11
+ * `<kai-separator>` — a themed divider between groups of content (toolbar
12
+ * sections, menu groups, header/sidebar splits). Carries `role="separator"`.
13
+ * Restyle via `::part(separator)`.
14
+ *
15
+ * ```html
16
+ * <kai-separator></kai-separator>
17
+ * <div style="display:flex; gap:.5rem">
18
+ * <span>A</span><kai-separator orientation="vertical"></kai-separator><span>B</span>
19
+ * </div>
20
+ * ```
21
+ */
22
+ defineWebComponent<Props>('kai-separator', {
23
+ orientation: 'horizontal',
24
+ }, (props) => {
25
+ const vertical = () => props.orientation === 'vertical';
26
+ return (
27
+ <>
28
+ {/* The host owns its layout box: a horizontal rule is block + full-width;
29
+ a vertical rule is an inline-block flex item that stretches to the row. */}
30
+ <style>{vertical()
31
+ ? ':host{display:inline-block;align-self:stretch}'
32
+ : ':host{display:block}'}</style>
33
+ <Separator orientation={vertical() ? 'vertical' : 'horizontal'} part="separator" />
34
+ </>
35
+ );
36
+ });
@@ -0,0 +1,50 @@
1
+ import { createSignal, onCleanup, onMount } from 'solid-js';
2
+ import { SettingItem } from '../ui/settings-group';
3
+ import { defineWebComponent } from './define';
4
+
5
+ interface Props extends Record<string, unknown> {
6
+ /** Row label (primary text). Attribute: `label`. */
7
+ label?: string;
8
+ /** Optional secondary description under the label. Attribute: `description`. */
9
+ description?: string;
10
+ }
11
+
12
+ /**
13
+ * `<kai-setting-item>` — one row inside a `<kai-settings-group>`: a left
14
+ * label/description block and an optional right-aligned control. Slot the control
15
+ * (a `<kai-switch>`, segmented control, select, …) into `slot="control"`; omit it
16
+ * for a plain label row.
17
+ *
18
+ * Themeable `::part`s: `label` (the label/description block) and `control`.
19
+ *
20
+ * ```html
21
+ * <kai-setting-item label="Reduce motion" description="Minimize animations.">
22
+ * <kai-switch slot="control"></kai-switch>
23
+ * </kai-setting-item>
24
+ * ```
25
+ */
26
+ defineWebComponent<Props>('kai-setting-item', {
27
+ label: '',
28
+ description: undefined,
29
+ }, (props, { element }) => {
30
+ // The control region only renders when `slot="control"` is actually filled, so
31
+ // a plain label row has no stray right-side wrapper. An empty `<slot>` is always
32
+ // a truthy node, so we track occupancy and gate on it (the kai-card approach).
33
+ // Re-read on child/attribute mutations so a late-slotted control lights up.
34
+ const [hasControl, setHasControl] = createSignal(false);
35
+ onMount(() => {
36
+ const read = () => setHasControl(!!element.querySelector(':scope > [slot="control"]'));
37
+ read();
38
+ const observer = new MutationObserver(read);
39
+ observer.observe(element, { childList: true, attributes: true, subtree: true });
40
+ onCleanup(() => observer.disconnect());
41
+ });
42
+
43
+ return (
44
+ <SettingItem
45
+ label={props.label ?? ''}
46
+ description={props.description}
47
+ control={hasControl() ? <slot name="control" /> : undefined}
48
+ />
49
+ );
50
+ });
@@ -0,0 +1,37 @@
1
+ import { SettingsGroup } from '../ui/settings-group';
2
+ import { defineWebComponent } from './define';
3
+
4
+ interface Props extends Record<string, unknown> {
5
+ /** Small section heading shown above the card. Attribute: `heading`. */
6
+ heading?: string;
7
+ /** Optional muted description under the heading. Attribute: `description`. */
8
+ description?: string;
9
+ }
10
+
11
+ /**
12
+ * `<kai-settings-group>` — a settings section: a small heading + optional muted
13
+ * description over a bordered, rounded card that stacks `<kai-setting-item>` rows
14
+ * with hairline dividers. Put the rows as light-DOM children (the default slot).
15
+ *
16
+ * Host-agnostic chrome: the SAME group drops into a modal or a full settings
17
+ * page; only the rows change per app.
18
+ *
19
+ * Themeable `::part`s: `header` (the heading/description block) and `body` (the
20
+ * rows card).
21
+ *
22
+ * ```html
23
+ * <kai-settings-group heading="Appearance" description="How the app looks.">
24
+ * <kai-setting-item label="Theme">
25
+ * <kai-switch slot="control"></kai-switch>
26
+ * </kai-setting-item>
27
+ * </kai-settings-group>
28
+ * ```
29
+ */
30
+ defineWebComponent<Props>('kai-settings-group', {
31
+ heading: '',
32
+ description: undefined,
33
+ }, (props) => (
34
+ <SettingsGroup heading={props.heading ?? ''} description={props.description}>
35
+ <slot />
36
+ </SettingsGroup>
37
+ ));
@@ -0,0 +1,45 @@
1
+ import { Skeleton, type SkeletonVariant } from '../ui/skeleton';
2
+ import { defineWebComponent } from './define';
3
+
4
+ interface Props extends Record<string, unknown> {
5
+ /** `text` (one or more lines), `rect` (a block), or `circle` (round).
6
+ * Defaults to `text`. */
7
+ variant?: SkeletonVariant;
8
+ /** CSS width (e.g. `'12rem'`, `'60%'`). Defaults to full width (responsive);
9
+ * for `circle` it is the diameter. */
10
+ width?: string;
11
+ /** CSS height. Defaults per variant (a text line height; circle = width). */
12
+ height?: string;
13
+ /** `text` only: number of lines; the last is shorter. Defaults to 1. */
14
+ lines?: number;
15
+ }
16
+
17
+ /**
18
+ * `<kai-skeleton>` — a pulsing loading placeholder that preserves layout while
19
+ * content arrives. Responsive by default (fills its container's width). It is
20
+ * prop-driven because utility classes can't cross the shadow boundary: pick a
21
+ * `variant` and optionally set `width` / `height` / `lines`.
22
+ *
23
+ * ```html
24
+ * <kai-skeleton variant="text" lines="3"></kai-skeleton>
25
+ * <kai-skeleton variant="circle" width="2.5rem"></kai-skeleton>
26
+ * <kai-skeleton variant="rect" height="10rem"></kai-skeleton>
27
+ * ```
28
+ * Recolor by overriding the `--color-muted` token.
29
+ */
30
+ defineWebComponent<Props>('kai-skeleton', {
31
+ variant: 'text',
32
+ width: undefined,
33
+ height: undefined,
34
+ lines: undefined,
35
+ }, (props) => (
36
+ <>
37
+ <style>{':host{display:block}'}</style>
38
+ <Skeleton
39
+ variant={props.variant ?? 'text'}
40
+ width={props.width}
41
+ height={props.height}
42
+ lines={props.lines != null ? Number(props.lines) : undefined}
43
+ />
44
+ </>
45
+ ));