@logicplanes/kaeso-ui 0.2.2 → 0.3.1

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 (349) hide show
  1. package/AGENTS.md +2 -0
  2. package/NOTICE.md +1 -1
  3. package/ai/component-guides.md +223 -24
  4. package/ai/component-registry.json +985 -91
  5. package/ai/component-registry.md +219 -52
  6. package/ai/icons.md +1 -1
  7. package/ai/tokens.md +7 -3
  8. package/dist/blocks/delete-resource.js +1 -1
  9. package/dist/blocks/pages.js +5 -5
  10. package/dist/blocks/resource-list.js +4 -4
  11. package/dist/chunks/app-frame-B9vrgwaE.js +220 -0
  12. package/dist/chunks/app-frame-B9vrgwaE.js.map +1 -0
  13. package/dist/chunks/{avatar-D2nJNbtC.js → avatar-DOzOhYJr.js} +2 -2
  14. package/dist/chunks/{avatar-D2nJNbtC.js.map → avatar-DOzOhYJr.js.map} +1 -1
  15. package/dist/chunks/{badge-Dkyhs0_j.js → badge-wUHlj7m3.js} +2 -2
  16. package/dist/chunks/{badge-Dkyhs0_j.js.map → badge-wUHlj7m3.js.map} +1 -1
  17. package/dist/chunks/{banner-DxGBPQ7p.js → banner-BBlNFHd-.js} +4 -4
  18. package/dist/chunks/{banner-DxGBPQ7p.js.map → banner-BBlNFHd-.js.map} +1 -1
  19. package/dist/chunks/{button-DQvoOxVQ.js → button-CAPyW-v8.js} +8 -8
  20. package/dist/chunks/{button-DQvoOxVQ.js.map → button-CAPyW-v8.js.map} +1 -1
  21. package/dist/chunks/{calendar-CN3YJi2k.js → calendar-CBeptQFq.js} +2 -2
  22. package/dist/chunks/{calendar-CN3YJi2k.js.map → calendar-CBeptQFq.js.map} +1 -1
  23. package/dist/chunks/{checkbox-BgRdbfCE.js → checkbox-C5yvSS7O.js} +3 -3
  24. package/dist/chunks/{checkbox-BgRdbfCE.js.map → checkbox-C5yvSS7O.js.map} +1 -1
  25. package/dist/chunks/{cn-CidVUKMm.js → cn-DUDmdLpZ.js} +3 -1
  26. package/dist/chunks/cn-DUDmdLpZ.js.map +1 -0
  27. package/dist/chunks/{code-BADhvsgC.js → code-C49NzHUQ.js} +2 -2
  28. package/dist/chunks/{code-BADhvsgC.js.map → code-C49NzHUQ.js.map} +1 -1
  29. package/dist/chunks/{code-block-DxtladFW.js → code-block-DREsvJ-g.js} +24 -21
  30. package/dist/chunks/code-block-DREsvJ-g.js.map +1 -0
  31. package/dist/chunks/{collapsible-Cw_1aem5.js → collapsible-CDQq1Y9x.js} +6 -6
  32. package/dist/chunks/collapsible-CDQq1Y9x.js.map +1 -0
  33. package/dist/chunks/combobox-DqtzsAKG.js +314 -0
  34. package/dist/chunks/combobox-DqtzsAKG.js.map +1 -0
  35. package/dist/chunks/command-list-D5k0uvkR.js +417 -0
  36. package/dist/chunks/command-list-D5k0uvkR.js.map +1 -0
  37. package/dist/chunks/{copy-button-DXxn-YYZ.js → copy-button-CNpEnS04.js} +6 -6
  38. package/dist/chunks/{copy-button-DXxn-YYZ.js.map → copy-button-CNpEnS04.js.map} +1 -1
  39. package/dist/chunks/{core-K960A4OT.js → core-CqLWVMDI.js} +36 -36
  40. package/dist/chunks/core-CqLWVMDI.js.map +1 -0
  41. package/dist/chunks/{date-popup-B-6xhb-1.js → date-popup-BgDz6SUj.js} +4 -4
  42. package/dist/chunks/{date-popup-B-6xhb-1.js.map → date-popup-BgDz6SUj.js.map} +1 -1
  43. package/dist/chunks/{de-CTAo4KL7.js → de-CkXZKaBD.js} +37 -5
  44. package/dist/chunks/de-CkXZKaBD.js.map +1 -0
  45. package/dist/chunks/dialog-truWH0qe.js +353 -0
  46. package/dist/chunks/dialog-truWH0qe.js.map +1 -0
  47. package/dist/chunks/{empty-DIbBpytW.js → empty-YXmSkKzR.js} +2 -2
  48. package/dist/chunks/{empty-DIbBpytW.js.map → empty-YXmSkKzR.js.map} +1 -1
  49. package/dist/chunks/{field-d8V94bvZ.js → field-BZriODU7.js} +3 -3
  50. package/dist/chunks/field-BZriODU7.js.map +1 -0
  51. package/dist/chunks/{icon-CeNQtobn.js → icon-BqujXDUc.js} +2 -2
  52. package/dist/chunks/{icon-CeNQtobn.js.map → icon-BqujXDUc.js.map} +1 -1
  53. package/dist/chunks/{icon-button-_x1RUphC.js → icon-button-D4O4puwH.js} +3 -3
  54. package/dist/chunks/{icon-button-_x1RUphC.js.map → icon-button-D4O4puwH.js.map} +1 -1
  55. package/dist/chunks/identity-CsZvAUwu.js +361 -0
  56. package/dist/chunks/identity-CsZvAUwu.js.map +1 -0
  57. package/dist/chunks/{input-CNTfI6YE.js → input-B0wtkcNh.js} +5 -5
  58. package/dist/chunks/{input-CNTfI6YE.js.map → input-B0wtkcNh.js.map} +1 -1
  59. package/dist/chunks/{input-group-CYA1MEoZ.js → input-group-BQLw06B0.js} +33 -27
  60. package/dist/chunks/input-group-BQLw06B0.js.map +1 -0
  61. package/dist/chunks/{inset-BLMdxX4I.js → inset-BnBj8NJV.js} +12 -2
  62. package/dist/chunks/inset-BnBj8NJV.js.map +1 -0
  63. package/dist/chunks/{iso-field-1qmg7TP8.js → iso-field-BUXgY1dB.js} +5 -3
  64. package/dist/chunks/{iso-field-1qmg7TP8.js.map → iso-field-BUXgY1dB.js.map} +1 -1
  65. package/dist/chunks/{json-view-B6KHIWzh.js → json-view-BkG2hTXV.js} +11 -10
  66. package/dist/chunks/{json-view-B6KHIWzh.js.map → json-view-BkG2hTXV.js.map} +1 -1
  67. package/dist/chunks/{kbd-CBcBDvqU.js → kbd-DqWmbr_e.js} +2 -2
  68. package/dist/chunks/{kbd-CBcBDvqU.js.map → kbd-DqWmbr_e.js.map} +1 -1
  69. package/dist/chunks/{link-vz9aV8WX.js → link-YMcxM-BZ.js} +4 -4
  70. package/dist/chunks/{link-vz9aV8WX.js.map → link-YMcxM-BZ.js.map} +1 -1
  71. package/dist/chunks/{link-provider---9JdxTg.js → link-provider-BsUxhZKG.js} +2 -2
  72. package/dist/chunks/{link-provider---9JdxTg.js.map → link-provider-BsUxhZKG.js.map} +1 -1
  73. package/dist/chunks/list-wXZIZo_s.js +492 -0
  74. package/dist/chunks/list-wXZIZo_s.js.map +1 -0
  75. package/dist/chunks/{loader-CUehxvSZ.js → loader-ENBh2Fbt.js} +2 -2
  76. package/dist/chunks/{loader-CUehxvSZ.js.map → loader-ENBh2Fbt.js.map} +1 -1
  77. package/dist/chunks/{markdown-5NyaHHfN.js → markdown-DWyxjsSY.js} +10 -10
  78. package/dist/chunks/{markdown-5NyaHHfN.js.map → markdown-DWyxjsSY.js.map} +1 -1
  79. package/dist/chunks/{menu-DyVPwgfF.js → menu-Bnfi9P3t.js} +7 -7
  80. package/dist/chunks/{menu-DyVPwgfF.js.map → menu-Bnfi9P3t.js.map} +1 -1
  81. package/dist/chunks/{meter-DWhyzFGQ.js → meter-DhTnem4k.js} +2 -2
  82. package/dist/chunks/{meter-DWhyzFGQ.js.map → meter-DhTnem4k.js.map} +1 -1
  83. package/dist/chunks/nav-sheet-QqNRHo-y.js +60 -0
  84. package/dist/chunks/nav-sheet-QqNRHo-y.js.map +1 -0
  85. package/dist/chunks/{nav-wordmark-DLkItdvo.js → nav-wordmark-DmbT1Aiw.js} +2 -2
  86. package/dist/chunks/{nav-wordmark-DLkItdvo.js.map → nav-wordmark-DmbT1Aiw.js.map} +1 -1
  87. package/dist/chunks/option-checkbox-Df7WhGn4.js +25 -0
  88. package/dist/chunks/option-checkbox-Df7WhGn4.js.map +1 -0
  89. package/dist/chunks/over-sheet-B8vzr_zU.js +8 -0
  90. package/dist/chunks/over-sheet-B8vzr_zU.js.map +1 -0
  91. package/dist/chunks/{page-header-CEPZzhRp.js → page-header-Ccnrspbp.js} +5 -5
  92. package/dist/chunks/{page-header-CEPZzhRp.js.map → page-header-Ccnrspbp.js.map} +1 -1
  93. package/dist/chunks/{pagination-CCMxQ5pH.js → pagination-CEmWZNjp.js} +5 -4
  94. package/dist/chunks/{pagination-CCMxQ5pH.js.map → pagination-CEmWZNjp.js.map} +1 -1
  95. package/dist/chunks/picker-popover-C4ElNk7t.js +102 -0
  96. package/dist/chunks/picker-popover-C4ElNk7t.js.map +1 -0
  97. package/dist/chunks/{popover-BE7VO-a4.js → popover-bjxg020P.js} +3 -3
  98. package/dist/chunks/{popover-BE7VO-a4.js.map → popover-bjxg020P.js.map} +1 -1
  99. package/dist/chunks/{radio-CUxbLCvD.js → radio-DwYcXAzv.js} +2 -2
  100. package/dist/chunks/{radio-CUxbLCvD.js.map → radio-DwYcXAzv.js.map} +1 -1
  101. package/dist/chunks/range-popup-CG9Jo5B7.js +128 -0
  102. package/dist/chunks/range-popup-CG9Jo5B7.js.map +1 -0
  103. package/dist/chunks/{release-art-DEc9HNa6.js → release-art-Ogl-L1Vh.js} +189 -183
  104. package/dist/chunks/release-art-Ogl-L1Vh.js.map +1 -0
  105. package/dist/chunks/{resize-motion-CMaidkwe.js → resize-motion-BWGMchyP.js} +27 -23
  106. package/dist/chunks/resize-motion-BWGMchyP.js.map +1 -0
  107. package/dist/chunks/{rights-BbiJ0AJB.js → rights-hMoaFasn.js} +12 -12
  108. package/dist/chunks/rights-hMoaFasn.js.map +1 -0
  109. package/dist/chunks/{section-DzOLLN1p.js → section-BsET7Fo-.js} +4 -4
  110. package/dist/chunks/{section-DzOLLN1p.js.map → section-BsET7Fo-.js.map} +1 -1
  111. package/dist/chunks/{segmented-MrinfDL8.js → segmented-DXKVF-nY.js} +4 -4
  112. package/dist/chunks/{segmented-MrinfDL8.js.map → segmented-DXKVF-nY.js.map} +1 -1
  113. package/dist/chunks/{select-Bc4kRiSG.js → select-Bbv2f5F8.js} +63 -80
  114. package/dist/chunks/select-Bbv2f5F8.js.map +1 -0
  115. package/dist/chunks/{separator-D5AzVFTS.js → separator-CpAUELNs.js} +2 -2
  116. package/dist/chunks/{separator-D5AzVFTS.js.map → separator-CpAUELNs.js.map} +1 -1
  117. package/dist/chunks/{sidebar-5IA18LuP.js → sidebar-Dey1ZfGt.js} +54 -51
  118. package/dist/chunks/sidebar-Dey1ZfGt.js.map +1 -0
  119. package/dist/chunks/{sidebar-menu-DRWRxcJ3.js → sidebar-menu-ct8IiL4z.js} +2 -2
  120. package/dist/chunks/{sidebar-menu-DRWRxcJ3.js.map → sidebar-menu-ct8IiL4z.js.map} +1 -1
  121. package/dist/chunks/{skeleton-kfuqdl1a.js → skeleton-BM797MAg.js} +2 -2
  122. package/dist/chunks/{skeleton-kfuqdl1a.js.map → skeleton-BM797MAg.js.map} +1 -1
  123. package/dist/chunks/{slider-DbhjJ3ML.js → slider-Ds-tqY-1.js} +2 -2
  124. package/dist/chunks/{slider-DbhjJ3ML.js.map → slider-Ds-tqY-1.js.map} +1 -1
  125. package/dist/chunks/{status-dot-BzMlYuMe.js → status-dot-BqVOlShY.js} +3 -3
  126. package/dist/chunks/{status-dot-BzMlYuMe.js.map → status-dot-BqVOlShY.js.map} +1 -1
  127. package/dist/chunks/{styles-Btvg2DCf.js → styles-CVJU9t9v.js} +2 -2
  128. package/dist/chunks/{styles-Btvg2DCf.js.map → styles-CVJU9t9v.js.map} +1 -1
  129. package/dist/chunks/{swap-text-BhPI8DOf.js → swap-text-Cica0pUr.js} +2 -2
  130. package/dist/chunks/{swap-text-BhPI8DOf.js.map → swap-text-Cica0pUr.js.map} +1 -1
  131. package/dist/chunks/{switch-XMY_CQE-.js → switch-CSKMEomo.js} +3 -3
  132. package/dist/chunks/{switch-XMY_CQE-.js.map → switch-CSKMEomo.js.map} +1 -1
  133. package/dist/chunks/{table-DYKa86af.js → table-D-36EM7f.js} +2 -2
  134. package/dist/chunks/{table-DYKa86af.js.map → table-D-36EM7f.js.map} +1 -1
  135. package/dist/chunks/{tag-Dg89uYpV.js → tag-CwDKXVHj.js} +4 -4
  136. package/dist/chunks/{tag-Dg89uYpV.js.map → tag-CwDKXVHj.js.map} +1 -1
  137. package/dist/chunks/{text--5MKh2G4.js → text-Dvvgg5Jt.js} +3 -3
  138. package/dist/chunks/{text--5MKh2G4.js.map → text-Dvvgg5Jt.js.map} +1 -1
  139. package/dist/chunks/{textarea-Cj8iR82R.js → textarea-2d373OyU.js} +35 -31
  140. package/dist/chunks/textarea-2d373OyU.js.map +1 -0
  141. package/dist/chunks/timeseries-LRDAZHV0.js +339 -0
  142. package/dist/chunks/timeseries-LRDAZHV0.js.map +1 -0
  143. package/dist/chunks/{toolbar-Dw3uxpsE.js → toolbar-nVLFWH2i.js} +3 -3
  144. package/dist/chunks/{toolbar-Dw3uxpsE.js.map → toolbar-nVLFWH2i.js.map} +1 -1
  145. package/dist/chunks/{tooltip-DEbCCsru.js → tooltip-S1DmyLVl.js} +4 -4
  146. package/dist/chunks/{tooltip-DEbCCsru.js.map → tooltip-S1DmyLVl.js.map} +1 -1
  147. package/dist/chunks/{tooltip-root-DRd4ciUv.js → tooltip-root-vjylFUqw.js} +4 -4
  148. package/dist/chunks/{tooltip-root-DRd4ciUv.js.map → tooltip-root-vjylFUqw.js.map} +1 -1
  149. package/dist/chunks/{virtual-rows-BZe49bKi.js → virtual-rows-yAMjeAwj.js} +4 -3
  150. package/dist/chunks/virtual-rows-yAMjeAwj.js.map +1 -0
  151. package/dist/chunks/{zh-CN-C7GmVswt.js → zh-CN-CqEA4PCM.js} +37 -5
  152. package/dist/chunks/zh-CN-CqEA4PCM.js.map +1 -0
  153. package/dist/components/app-frame.js +2 -2
  154. package/dist/components/avatar.js +1 -1
  155. package/dist/components/badge.js +1 -1
  156. package/dist/components/banner.js +1 -1
  157. package/dist/components/button-group.js +33 -32
  158. package/dist/components/button-group.js.map +1 -1
  159. package/dist/components/button.js +1 -1
  160. package/dist/components/calendar.js +1 -1
  161. package/dist/components/charts/bar.js +34 -31
  162. package/dist/components/charts/bar.js.map +1 -1
  163. package/dist/components/charts/donut.js +2 -2
  164. package/dist/components/charts/gauge.js +2 -2
  165. package/dist/components/charts/heatmap.js +1 -1
  166. package/dist/components/charts/sankey.js +2 -2
  167. package/dist/components/charts/sparkline.js +1 -1
  168. package/dist/components/charts/timeseries.js +1 -255
  169. package/dist/components/charts.js +3 -3
  170. package/dist/components/checkbox.js +1 -1
  171. package/dist/components/code-block.js +2 -2
  172. package/dist/components/code.js +1 -1
  173. package/dist/components/collapsible.js +1 -1
  174. package/dist/components/combobox.js +1 -1
  175. package/dist/components/command-list.js +4 -0
  176. package/dist/components/command-palette.js +120 -171
  177. package/dist/components/command-palette.js.map +1 -1
  178. package/dist/components/copy-button.js +1 -1
  179. package/dist/components/data-table.js +251 -193
  180. package/dist/components/data-table.js.map +1 -1
  181. package/dist/components/date-picker.js +6 -6
  182. package/dist/components/dialog.js +7 -9
  183. package/dist/components/dialog.js.map +1 -1
  184. package/dist/components/display-options.js +67 -53
  185. package/dist/components/display-options.js.map +1 -1
  186. package/dist/components/empty.js +1 -1
  187. package/dist/components/field.js +1 -1
  188. package/dist/components/filter-chip.js +138 -63
  189. package/dist/components/filter-chip.js.map +1 -1
  190. package/dist/components/filter-row.js +2 -2
  191. package/dist/components/flow.js +2 -2
  192. package/dist/components/heading.js +1 -1
  193. package/dist/components/icon-button.js +1 -1
  194. package/dist/components/icon.js +1 -1
  195. package/dist/components/input.js +56 -54
  196. package/dist/components/input.js.map +1 -1
  197. package/dist/components/kaeso/conversation.js +88 -79
  198. package/dist/components/kaeso/conversation.js.map +1 -1
  199. package/dist/components/kaeso/identity.js +1 -1
  200. package/dist/components/kaeso/moments.js +8 -8
  201. package/dist/components/kaeso/moments.js.map +1 -1
  202. package/dist/components/kaeso/rights.js +1 -1
  203. package/dist/components/kaeso/usage.js +6 -6
  204. package/dist/components/kaeso/usage.js.map +1 -1
  205. package/dist/components/kaeso.js +212 -84
  206. package/dist/components/kaeso.js.map +1 -1
  207. package/dist/components/kbd.js +1 -1
  208. package/dist/components/key-value.js +3 -3
  209. package/dist/components/label.js +1 -1
  210. package/dist/components/layout.js +1 -1
  211. package/dist/components/link.js +1 -1
  212. package/dist/components/list.js +1 -1
  213. package/dist/components/loader.js +2 -2
  214. package/dist/components/logo.js +2 -2
  215. package/dist/components/markdown.js +1 -1
  216. package/dist/components/menu.js +2 -2
  217. package/dist/components/meter.js +1 -1
  218. package/dist/components/page-header.js +1 -1
  219. package/dist/components/pagination.js +1 -1
  220. package/dist/components/playground.js +654 -381
  221. package/dist/components/playground.js.map +1 -1
  222. package/dist/components/popover.js +2 -2
  223. package/dist/components/qr-code.js +1 -1
  224. package/dist/components/radio.js +1 -1
  225. package/dist/components/release-art.js +1 -1
  226. package/dist/components/scroll-area.js +1 -1
  227. package/dist/components/section.js +1 -1
  228. package/dist/components/segmented.js +1 -1
  229. package/dist/components/select.js +1 -1
  230. package/dist/components/separator.js +1 -1
  231. package/dist/components/settings.js +3 -3
  232. package/dist/components/sheet.js +69 -52
  233. package/dist/components/sheet.js.map +1 -1
  234. package/dist/components/sidebar.js +1 -1
  235. package/dist/components/skeleton.js +1 -1
  236. package/dist/components/slider.js +1 -1
  237. package/dist/components/stat.js +88 -74
  238. package/dist/components/stat.js.map +1 -1
  239. package/dist/components/status-dot.js +1 -1
  240. package/dist/components/surface.js +1 -1
  241. package/dist/components/swap-text.js +1 -1
  242. package/dist/components/switch.js +1 -1
  243. package/dist/components/table.js +1 -1
  244. package/dist/components/tabs.js +48 -49
  245. package/dist/components/tabs.js.map +1 -1
  246. package/dist/components/tag.js +1 -1
  247. package/dist/components/text.js +1 -1
  248. package/dist/components/theme-image.js +1 -1
  249. package/dist/components/theme-menu.js +2 -2
  250. package/dist/components/theme-select.js +1 -1
  251. package/dist/components/timeline.js +1 -1
  252. package/dist/components/toast.js +4 -4
  253. package/dist/components/toc.js +1 -1
  254. package/dist/components/toolbar.js +1 -1
  255. package/dist/components/tooltip.js +1 -1
  256. package/dist/components/visually-hidden.js +1 -1
  257. package/dist/format.js +87 -50
  258. package/dist/format.js.map +1 -1
  259. package/dist/i18n-provider.js +1 -1
  260. package/dist/index.js +115 -112
  261. package/dist/kaeso.css +20 -7
  262. package/dist/styles.css +1 -1
  263. package/dist/types/components/charts/bar.d.ts +6 -0
  264. package/dist/types/components/charts/core.d.ts +2 -2
  265. package/dist/types/components/charts/docs.d.ts +7 -0
  266. package/dist/types/components/charts/time-axis.d.ts +5 -0
  267. package/dist/types/components/charts/timeseries.d.ts +9 -0
  268. package/dist/types/components/code-block/highlighter.d.ts +2 -0
  269. package/dist/types/components/combobox/combobox.d.ts +2 -0
  270. package/dist/types/components/combobox/docs.d.ts +2 -4
  271. package/dist/types/components/command-list/command-list.d.ts +84 -0
  272. package/dist/types/components/command-list/docs.d.ts +52 -0
  273. package/dist/types/components/command-list/index.d.ts +3 -0
  274. package/dist/types/components/command-list/match.d.ts +1 -0
  275. package/dist/types/components/command-list/picker-popover.d.ts +44 -0
  276. package/dist/types/components/data-table/data-table.d.ts +3 -2
  277. package/dist/types/components/data-table/docs.d.ts +1 -0
  278. package/dist/types/components/date-picker/docs.d.ts +0 -6
  279. package/dist/types/components/dialog/dialog.d.ts +24 -0
  280. package/dist/types/components/dialog/docs.d.ts +4 -0
  281. package/dist/types/components/display-options/display-options.d.ts +1 -0
  282. package/dist/types/components/filter-chip/docs.d.ts +4 -0
  283. package/dist/types/components/filter-chip/filter-chip.d.ts +7 -0
  284. package/dist/types/components/input/docs.d.ts +2 -12
  285. package/dist/types/components/input/number-input.d.ts +1 -0
  286. package/dist/types/components/input/tag-input.d.ts +1 -0
  287. package/dist/types/components/kaeso/docs.d.ts +34 -0
  288. package/dist/types/components/kaeso/identity.d.ts +10 -1
  289. package/dist/types/components/kaeso/index.d.ts +1 -0
  290. package/dist/types/components/kaeso/provider-marks.d.ts +5 -1
  291. package/dist/types/components/kaeso/provider-picker.d.ts +42 -0
  292. package/dist/types/components/list/docs.d.ts +2 -0
  293. package/dist/types/components/list/list.d.ts +2 -0
  294. package/dist/types/components/menu/styles.d.ts +1 -1
  295. package/dist/types/components/playground/docs.d.ts +32 -0
  296. package/dist/types/components/playground/index.d.ts +1 -0
  297. package/dist/types/components/playground/model-picker.d.ts +39 -4
  298. package/dist/types/components/playground/reasoning.d.ts +29 -0
  299. package/dist/types/components/playground/response-view.d.ts +7 -1
  300. package/dist/types/components/release-art/docs.d.ts +1 -0
  301. package/dist/types/components/release-art/release-art.d.ts +1 -0
  302. package/dist/types/components/select/docs.d.ts +0 -2
  303. package/dist/types/components/select/option-checkbox.d.ts +1 -0
  304. package/dist/types/components/sidebar/sidebar.d.ts +1 -0
  305. package/dist/types/components/stat/docs.d.ts +1 -0
  306. package/dist/types/components/stat/stat.d.ts +1 -0
  307. package/dist/types/format/index.d.ts +6 -0
  308. package/dist/types/index.d.ts +1 -0
  309. package/dist/types/utils/index.d.ts +1 -1
  310. package/dist/types/utils/inset.d.ts +5 -0
  311. package/dist/types/utils/over-sheet.d.ts +1 -0
  312. package/dist/types/utils/restore-focus.d.ts +1 -1
  313. package/dist/utils.js +4 -4
  314. package/foundations/layout.md +45 -0
  315. package/foundations/writing.md +1 -0
  316. package/package.json +2 -2
  317. package/dist/chunks/app-frame-BXh-06HL.js +0 -214
  318. package/dist/chunks/app-frame-BXh-06HL.js.map +0 -1
  319. package/dist/chunks/cn-CidVUKMm.js.map +0 -1
  320. package/dist/chunks/code-block-DxtladFW.js.map +0 -1
  321. package/dist/chunks/collapsible-Cw_1aem5.js.map +0 -1
  322. package/dist/chunks/combobox-D30Wt11R.js +0 -291
  323. package/dist/chunks/combobox-D30Wt11R.js.map +0 -1
  324. package/dist/chunks/core-K960A4OT.js.map +0 -1
  325. package/dist/chunks/de-CTAo4KL7.js.map +0 -1
  326. package/dist/chunks/dialog-LNKgPEsV.js +0 -319
  327. package/dist/chunks/dialog-LNKgPEsV.js.map +0 -1
  328. package/dist/chunks/field-d8V94bvZ.js.map +0 -1
  329. package/dist/chunks/field-press-DwzBFafd.js +0 -10
  330. package/dist/chunks/field-press-DwzBFafd.js.map +0 -1
  331. package/dist/chunks/identity-BtZC_d_Q.js +0 -342
  332. package/dist/chunks/identity-BtZC_d_Q.js.map +0 -1
  333. package/dist/chunks/input-group-CYA1MEoZ.js.map +0 -1
  334. package/dist/chunks/inset-BLMdxX4I.js.map +0 -1
  335. package/dist/chunks/list-CzaiyNja.js +0 -483
  336. package/dist/chunks/list-CzaiyNja.js.map +0 -1
  337. package/dist/chunks/nav-sheet-BIErlV74.js +0 -58
  338. package/dist/chunks/nav-sheet-BIErlV74.js.map +0 -1
  339. package/dist/chunks/range-popup-DGOnGGag.js +0 -111
  340. package/dist/chunks/range-popup-DGOnGGag.js.map +0 -1
  341. package/dist/chunks/release-art-DEc9HNa6.js.map +0 -1
  342. package/dist/chunks/resize-motion-CMaidkwe.js.map +0 -1
  343. package/dist/chunks/rights-BbiJ0AJB.js.map +0 -1
  344. package/dist/chunks/select-Bc4kRiSG.js.map +0 -1
  345. package/dist/chunks/sidebar-5IA18LuP.js.map +0 -1
  346. package/dist/chunks/textarea-Cj8iR82R.js.map +0 -1
  347. package/dist/chunks/virtual-rows-BZe49bKi.js.map +0 -1
  348. package/dist/chunks/zh-CN-C7GmVswt.js.map +0 -1
  349. package/dist/components/charts/timeseries.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  # @logicplanes/kaeso-ui component registry
2
2
 
3
- Version 0.2.2. Generated from the component types, their descriptions and variants; do not edit.
3
+ Version 0.3.1. Generated from the component types, their descriptions and variants; do not edit.
4
4
 
5
5
  ## app-frame
6
6
 
@@ -213,6 +213,8 @@ Bars for comparing values across categories: grouped, stacked, or horizontal for
213
213
  | `layout` | `"horizontal" \| "grouped" \| "stacked"` | `grouped` | `grouped` puts each category's bars side by side (default), `stacked` stacks them, and `horizontal` draws bars across for rankings. |
214
214
  | `loading` | `boolean` | | The data is loading: the chart keeps its height and shows a quiet loading bar. |
215
215
  | `onRetry` | `(() => void)` | | Called when Try again is pressed after `error`; without it, the button doesn't show. |
216
+ | `partial` | `{ first?: boolean; last?: boolean; ongoing?: boolean \| undefined; } \| undefined` | | Marks the `first` or `last` category as covering only part of its span: its bars are drawn lighter and its tooltip says "partial". `ongoing` marks the last one as still counting, such as today, and says "so far". |
217
+ | `shares` | `boolean` | `true` | Shows each series' share of the category's total in the tooltip (on by default). Turn it off when one series is part of another, such as errors within requests. |
216
218
 
217
219
  ### ChartFrame
218
220
 
@@ -392,7 +394,8 @@ A line or area chart of values over time, such as usage, with a crosshair and to
392
394
  | `empty` | `boolean` | | Shows the empty state (`emptyText`) in place of the data. By default it shows when every value is 0. |
393
395
  | `emptyText` | `ReactNode` | | What the empty state says. Defaults to "No data for this period" in the provider's language. |
394
396
  | `error` | `ReactNode` | | The data failed to load: the chart keeps its height, says so quietly and offers Try again. Errors are toasts, so the value isn't shown; toast the message where the request fails. |
395
- | `formatTime` | `((t: Date) => string)` | | Names a point's time in the tooltip, the table and for screen readers, where a point stands for more than its instant: "Week of 3 Aug", "Aug 2026". The axis keeps its calendar ticks. |
397
+ | `formatTick` | `((t: Date) => string)` | | Names the times under the axis ("3 Aug", "2026"). Defaults to calendar ticks in `timeZone`; pass it with `tickAt="points"` for buckets. |
398
+ | `formatTime` | `((t: Date) => string)` | | Names a point's time in the tooltip, the table and for screen readers, where a point stands for more than its instant: "Week of 3 Aug", "Aug 2026". |
396
399
  | `formatValue` | `((v: number) => string)` | `(v) => formatNumber(v)` | Formats values on the axis and in the tooltip. |
397
400
  | `height` | `number` | `240` | The plot's height in px (240 by default). |
398
401
  | `hideLegend` | `boolean` | | Hide the legend (one series). |
@@ -400,7 +403,11 @@ A line or area chart of values over time, such as usage, with a crosshair and to
400
403
  | `kind` | `"stacked" \| "line" \| "area"` | `line` | `line` draws lines (default), `area` adds a light fill under each line, and `stacked` stacks the areas. |
401
404
  | `loading` | `boolean` | | The data is loading: the chart keeps its height and shows a quiet loading bar. |
402
405
  | `onRetry` | `(() => void)` | | Called when Try again is pressed after `error`; without it, the button doesn't show. |
406
+ | `partial` | `{ first?: boolean; last?: boolean; ongoing?: boolean \| undefined; } \| undefined` | | Marks the `first` or `last` point as covering only part of its span: the line to it is dashed and its tooltip says "partial". `ongoing` marks the last one as still counting, such as today, and says "so far". |
407
+ | `shares` | `boolean` | `true` | Shows each series' share of the point's total in the tooltip (on by default). Turn it off when one series is part of another, such as errors within requests. |
403
408
  | `threshold` | `{ value: number; label: string; }` | | A threshold line (a budget) in danger, dashed. |
409
+ | `tickAt` | `"time" \| "points"` | `time` | `time` labels round times, as many as fit (default). `points` sets each point in the middle of an equal step and labels every nth one, as a bar chart places and labels its categories, so a bar chart of the same days lines up with it. |
410
+ | `timeZone` | `string` | | The zone the axis and the default labels read times in, such as "UTC" for days counted in UTC. Defaults to the zone set with `setFormatTimeZone`, else the viewer's. |
404
411
 
405
412
  ## checkbox
406
413
 
@@ -600,7 +607,7 @@ Free text with suggestions.
600
607
  | `defaultValue` | `string` | | The text in the input on first render. |
601
608
  | `description` | `ReactNode` | | One sentence of help under the label. |
602
609
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
603
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
610
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
604
611
  | `id` | `string` | | The id of the control, so a label elsewhere can point to it. |
605
612
  | `label` | `ReactNode` | | The visible label. |
606
613
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -615,19 +622,20 @@ Free text with suggestions.
615
622
 
616
623
  ### Combobox
617
624
 
618
- A pill input with a filtered list: matched characters highlighted, async, chips for many, create.
625
+ A pill input with a filtered list: matched characters highlighted, async, chips for many, create. It shows the first 100 matches and says how many more there are; for lists people scroll through, use `CommandList`.
619
626
 
620
627
  | Prop | Type | Default | Description |
621
628
  |---|---|---|---|
622
629
  | `options` * | `ComboboxOption[]` | | The options to choose from. |
623
630
  | `aria-label` | `string` | | The accessible name, for when there is no visible label. |
624
631
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
632
+ | `createLabel` | `((label: string) => string)` | | The words of the offer to add what was typed; `Add “…”` by default. |
625
633
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
626
634
  | `defaultValue` | `string \| string[] \| null` | | The value on first render, when the component keeps its own value. |
627
635
  | `description` | `ReactNode` | | One sentence of help under the label. |
628
636
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
629
637
  | `emptyText` | `ReactNode` | | What the empty list says: "No models match". Defaults to "No results" in the provider's language. |
630
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
638
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
631
639
  | `id` | `string` | | The id of the control, so a label elsewhere can point to it. |
632
640
  | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
633
641
  | `label` | `ReactNode` | | The visible label. |
@@ -635,12 +643,13 @@ A pill input with a filtered list: matched characters highlighted, async, chips
635
643
  | `loading` | `boolean` | | Shows a quiet progress line at the top of the list (async results). |
636
644
  | `multiple` | `boolean` | | Allows choosing more than one option; `value` is then a list. |
637
645
  | `name` | `string` | | The field name the value is sent under in a form. |
638
- | `onCreate` | `((label: string) => void)` | | Offers "Create “…”" when nothing matches exactly. |
646
+ | `onCreate` | `((label: string) => void)` | | Offers "Add “…”" when nothing matches exactly. |
639
647
  | `onInputValueChange` | `((value: string) => void)` | | Called with the text typed into the input. |
640
648
  | `onValueChange` | `((value: string \| null) => void) \| ((value: string[]) => void)` | | Called with the chosen value, or the list of values with `multiple`. |
641
649
  | `optional` | `boolean` | | Adds “Optional” to the label, for forms where most fields are required. |
642
650
  | `placeholder` | `string` | | Text shown while there is no value. |
643
651
  | `required` | `boolean` | | Marks it as required in a form. |
652
+ | `searchDelay` | `number` | | Milliseconds of quiet typing before `onInputValueChange` is called, so a server search runs once per pause, not per keystroke. |
644
653
  | `size` | `"md" \| "sm" \| "lg" \| "xl"` | | The height of the input. |
645
654
  | `value` | `string \| string[] \| null` | | The chosen value, or a list of values with `multiple`, when you control it. |
646
655
 
@@ -653,6 +662,73 @@ Splits a label around the query: matched characters in text, the rest secondary
653
662
  | `query` * | `string` | | The part of the text to highlight, ignoring case. |
654
663
  | `text` * | `string` | | The text to show. |
655
664
 
665
+ ## command-list
666
+
667
+ `import { CommandList, PickerPopover, PickerTrigger } from "@logicplanes/kaeso-ui/command-list";`
668
+
669
+ - **height** (command_list): `popover` (default) — At most 480px or 70% of the window, shrinking to its rows: a popover (default); `inline` — Its rows' height up to 360px in a raised frame, kept while searching: a dialog step; `fill` — Fills its parent: a phone sheet or a command palette
670
+ - **size** (command_list): `md` (default) — A 44px search over 34px rows (default); `lg` — A 56px search over 40px rows: the command palette
671
+ - **width** (picker_popover): `sm` — 320px: providers and short lists; `md` (default) — 400px (default); `lg` — 560px: models with their details
672
+
673
+ ### CommandList
674
+
675
+ A search field over a long list that stays fast with thousands of rows: fuzzy matches on every row's words, groups with sticky captions, the best matches first, arrows, Home, End and Page keys, Enter to choose. The base of every picker.
676
+
677
+ | Prop | Type | Default | Description |
678
+ |---|---|---|---|
679
+ | `aria-label` * | `string` | | The list's accessible name. |
680
+ | `groups` * | `CommandListGroup[]` | | The rows, in groups; a group with a label gets a sticky caption with its mark and count, and a loading group keeps its caption while it has no rows yet. |
681
+ | `autoFocus` | `boolean` | | Focuses the search field when it appears, as in a popover or a dialog step. |
682
+ | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
683
+ | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
684
+ | `defaultQuery` | `string` | | The search text on first render. |
685
+ | `emptyText` | `ReactNode` | | What the list says when nothing matches: "No models match". |
686
+ | `escapeClears` | `boolean` | `true` | Escape first clears the search, and only an empty search lets Escape close what holds the list (true by default). |
687
+ | `footer` | `ReactNode` | | A line under the list, such as key hints. |
688
+ | `height` | `"fill" \| "popover" \| "inline"` | | How tall it is: bounded in a popover, a fixed raised frame in a dialog, or filling a phone sheet. Inside `PickerPopover` it follows the popover. |
689
+ | `inputProps` | `{ [attribute: `data-${string}`]: string; }` | | Data attributes for the search field, such as a marker other code looks for. |
690
+ | `loading` | `boolean` | | Shows a quiet progress line at the top while more rows load. |
691
+ | `match` | `((item: CommandListItem, query: string) => number)` | `(item: CommandListItem, query: string) => commandMatch(query, [item.label, ...(item.keywords ?? [])])` | Scores a row against the search: above 0 keeps it, and higher scores come first. Fuzzy matching on the label and keywords by default. |
692
+ | `multiple` | `boolean` | | Rows toggle with a checkbox instead of choosing one. |
693
+ | `onEscape` | `(() => void)` | | Called on Escape when the search field is already empty. |
694
+ | `onInputKeyDown` | `((event: KeyboardEvent<HTMLInputElement>) => void)` | | Called first with every key pressed in the search field; call `preventDefault` to replace the list's own handling. |
695
+ | `onQueryChange` | `((query: string) => void)` | | Called with the search text. |
696
+ | `onSelect` | `((value: string) => void)` | | Called with the value of the row chosen with Enter or a click. |
697
+ | `placeholder` | `string` | | The search field's placeholder and accessible name ("Search" by default). |
698
+ | `query` | `string` | | The search text, when you control it. |
699
+ | `searchPrefix` | `ReactNode` | | Something before the search text, such as the page a palette is on. |
700
+ | `size` | `"md" \| "lg"` | `md` | The search field's and the rows' height: 34px rows, or 40px in the command palette. |
701
+ | `toolbar` | `ReactNode` | | Controls under the search field: filter chips or a toggle. |
702
+ | `value` | `string \| readonly string[] \| null` | | The chosen value, or the chosen values with `multiple`. |
703
+
704
+ ### PickerPopover
705
+
706
+ The frame a picker opens in: a popover under its trigger on wider screens, a full-screen sheet with the search on top on phones.
707
+
708
+ | Prop | Type | Default | Description |
709
+ |---|---|---|---|
710
+ | `children` * | `ReactNode` | | The `CommandList`. |
711
+ | `title` * | `string` | | The popover's accessible name and the sheet's title on phones. |
712
+ | `trigger` * | `ReactElement<unknown, string \| JSXElementConstructor<any>>` | | The button that opens it, usually a `PickerTrigger`. |
713
+ | `align` | `"start" \| "end"` | `start` | Which edge of the trigger the popover lines up with. |
714
+ | `onOpenChange` | `((open: boolean) => void)` | | Called when it opens or closes. |
715
+ | `open` | `boolean` | | Whether it is open, when you control it. |
716
+ | `width` | `"md" \| "sm" \| "lg"` | `md` | The popover's width on wider screens. |
717
+
718
+ ### PickerTrigger
719
+
720
+ The pill that opens a picker and shows its value, in the same looks and sizes as `Select`.
721
+
722
+ | Prop | Type | Default | Description |
723
+ |---|---|---|---|
724
+ | `appearance` | `"ghost" \| "default" \| "header"` | `default` | A raised pill, quiet in a settings row, or transparent in a column header. |
725
+ | `children` | `ReactNode` | | The chosen value as it should read; the placeholder shows without it. |
726
+ | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
727
+ | `fullWidth` | `boolean` | | Fills the container. |
728
+ | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
729
+ | `placeholder` | `ReactNode` | | Text shown while nothing is chosen. |
730
+ | `size` | `"md" \| "sm" \| "lg" \| "xl"` | `md` | The height of the pill. |
731
+
656
732
  ## command-palette
657
733
 
658
734
  `import { CommandPalette } from "@logicplanes/kaeso-ui/command-palette";`
@@ -748,6 +824,7 @@ A table for many rows: sorting, selection, loading and empty states, more rows o
748
824
  | `loading` | `boolean` | | Shows skeleton rows while the first page loads. |
749
825
  | `loadingMore` | `boolean` | | Shows that more rows are loading. |
750
826
  | `manualSorting` | `boolean` | | Sorting happens on the server: the data arrives sorted. |
827
+ | `onHiddenColumnsChange` | `((ids: string[]) => void)` | | Called with the ids of the columns left out at the table's width, so a kept column can show what they held. |
751
828
  | `onLoadMore` | `(() => void)` | | Called to load the next rows. |
752
829
  | `onRetry` | `(() => void)` | | Shows a Retry button when loading failed. |
753
830
  | `onRowClick` | `((row: T) => void)` | | Called when a row is clicked; rows then show that they can be opened. |
@@ -782,7 +859,7 @@ A pill showing the date; a popover with the calendar and a typed ISO field.
782
859
  | `description` | `ReactNode` | | One sentence of help under the label. |
783
860
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
784
861
  | `disabledDays` | `((date: Date) => boolean)` | | Returns `true` for days that can't be chosen. |
785
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
862
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
786
863
  | `id` | `string` | | The id of the control, so a label elsewhere can point to it. |
787
864
  | `label` | `ReactNode` | | The visible label. |
788
865
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -808,7 +885,7 @@ A pill showing the range ("Oct 1 – Oct 12") or its preset ("Last 30 days"); pr
808
885
  | `description` | `ReactNode` | | One sentence of help under the label. |
809
886
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
810
887
  | `disabledDays` | `((date: Date) => boolean)` | | Returns `true` for days that can't be chosen. |
811
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
888
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
812
889
  | `id` | `string` | | The id of the control, so a label elsewhere can point to it. |
813
890
  | `label` | `ReactNode` | | The visible label. |
814
891
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -834,7 +911,7 @@ Hours and minutes as two segments in one pill; arrows step, typing advances.
834
911
  | `defaultValue` | `string` | | The time on first render, as `HH:mm`. |
835
912
  | `description` | `ReactNode` | | One sentence of help under the label. |
836
913
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
837
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
914
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
838
915
  | `id` | `string` | | The id of the control, so a label elsewhere can point to it. |
839
916
  | `label` | `ReactNode` | | The visible label. |
840
917
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -874,7 +951,9 @@ Confirms deleting a resource: names the object and the consequence, asks for its
874
951
 
875
952
  - **tone** (alert_dialog): `danger` (default) — Destructive (default); `warning` — Risky but reversible; `info` — Neutral confirmation
876
953
  - **size** (dialog): `sm` — 440px: confirmations, short forms; `md` (default) — 560px: forms (default); `lg` — 720px: two columns, previews
954
+ - **anchor** (dialog): `center` (default) — Centered on the screen (default); `top` — A fixed top edge, for content that changes height, such as the steps of a StepDialog
877
955
  - **size** (layer_dialog): `sm` — 440px: confirmations, short forms; `md` (default) — 560px: forms (default); `lg` — 720px: two columns, previews
956
+ - **anchor** (layer_dialog): `center` (default) — Centered on the screen (default); `top` — A fixed top edge, for content that changes height, such as the steps of a StepDialog
878
957
 
879
958
  ### AlertDialog
880
959
 
@@ -898,12 +977,13 @@ Confirms an irreversible action: names it, explains the consequence, optionally
898
977
 
899
978
  ### Dialog
900
979
 
901
- A modal dialog: 440 / 560 / 720, radius 20, title, description, body, actions. ⌘Enter submits. It stays centered while its content changes, growing or shrinking 200ms from the size it has; the body scrolls between the header and the footer when the content is taller than the screen. Its content unmounts once it has closed; state kept beside it, like a field, a step or a secret, goes in a component inside a DialogScope.
980
+ A modal dialog: 440 / 560 / 720, radius 20, title, description, body, actions. Enter in a single-line field and ⌘/Ctrl+Enter anywhere submit; Enter in a text area adds a line. It stays centered (or, with `anchor="top"`, keeps its top edge) while its content changes, growing or shrinking 200ms from the size it has; the body scrolls between the header and the footer when the content is taller than the screen. Its content unmounts once it has closed; state kept beside it, like a field, a step or a secret, goes in a component inside a DialogScope.
902
981
 
903
982
  | Prop | Type | Default | Description |
904
983
  |---|---|---|---|
905
984
  | `title` * | `ReactNode` | | The dialog's heading, also its accessible name. |
906
- | `busy` | `boolean` | | Keeps the dialog open while work it started is underway: Escape, a press outside, the close circle, Dialog.Close and ⌘Enter do nothing, so a request is never abandoned or sent twice. |
985
+ | `anchor` | `"center" \| "top"` | | Where it sits: centered, or with a fixed top edge for content that changes height, so the title never moves. |
986
+ | `busy` | `boolean` | | Keeps the dialog open while work it started is underway: Escape, a press outside, the close circle, Dialog.Close, Enter and ⌘Enter do nothing, so a request is never abandoned or sent twice. |
907
987
  | `children` | `ReactNode` | | The dialog's content and actions. |
908
988
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
909
989
  | `defaultOpen` | `boolean` | | Whether it starts open, when the component keeps its own state. |
@@ -913,8 +993,9 @@ A modal dialog: 440 / 560 / 720, radius 20, title, description, body, actions.
913
993
  | `hideClose` | `boolean` | | Hide the close circle (rare). |
914
994
  | `inline` | `boolean` | | Render without a portal and backdrop, for documentation and state matrices. |
915
995
  | `onOpenChange` | `((open: boolean) => void)` | | Called when it opens or closes. |
916
- | `onSubmit` | `(() => void)` | | ⌘Enter calls this (usually the primary action). |
996
+ | `onSubmit` | `(() => void)` | | Enter in a single-line field and ⌘/Ctrl+Enter anywhere call this (usually the primary action); Enter in a text area, a search field, a combobox or a picker, and the Enter that confirms an input method's text, keep their own meaning. |
917
997
  | `open` | `boolean` | | Whether it is open, when you control it. |
998
+ | `persistent` | `boolean` | | A press outside doesn't close it, for forms that would lose what was typed; Escape and the close circle still do. Every StepDialog is persistent. |
918
999
  | `size` | `"md" \| "sm" \| "lg"` | | The dialog's width. |
919
1000
  | `trigger` | `ReactElement<unknown, string \| JSXElementConstructor<any>>` | | The trigger, a single element. |
920
1001
 
@@ -929,12 +1010,13 @@ Opens a dialog's flow fresh every time: its children mount anew when `open` turn
929
1010
 
930
1011
  ### LayerDialog
931
1012
 
932
- A stacked dialog: a second layer slides over the first (add model → review values); back returns. The layers below stay as they were. Moving to a layer puts the focus on its first field, or its primary action; Back returns it to the control that opened the layer, scrolled where it was. ⌘/Ctrl+Enter calls onSubmit on every layer.
1013
+ A stacked dialog: a second layer slides over the first (add model → review values); back returns. The layers below stay as they were. Moving to a layer puts the focus on its first field, or its primary action; Back returns it to the control that opened the layer, scrolled where it was. Enter in a single-line field and ⌘/Ctrl+Enter call onSubmit on every layer.
933
1014
 
934
1015
  | Prop | Type | Default | Description |
935
1016
  |---|---|---|---|
936
1017
  | `layers` * | `DialogLayer[]` | | The layers, each with its title, content and footer; one shows at a time, and the ones below it stay mounted and hidden. |
937
- | `busy` | `boolean` | | Keeps the dialog open while work it started is underway: Escape, a press outside, the close circle, Dialog.Close and ⌘Enter do nothing, so a request is never abandoned or sent twice. |
1018
+ | `anchor` | `"center" \| "top"` | | Where it sits: centered, or with a fixed top edge for layers of different heights. |
1019
+ | `busy` | `boolean` | | Keeps the dialog open while work it started is underway: Escape, a press outside, the close circle, Dialog.Close, Enter and ⌘Enter do nothing, so a request is never abandoned or sent twice. |
938
1020
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
939
1021
  | `defaultOpen` | `boolean` | | Whether it starts open, when the component keeps its own state. |
940
1022
  | `hideClose` | `boolean` | | Hide the close circle (rare). |
@@ -942,14 +1024,15 @@ A stacked dialog: a second layer slides over the first (add model → review val
942
1024
  | `layer` | `number` | | The visible layer; layers above the first slide over it. |
943
1025
  | `onLayerChange` | `((layer: number) => void)` | | Called with the index of the layer shown. |
944
1026
  | `onOpenChange` | `((open: boolean) => void)` | | Called when it opens or closes. |
945
- | `onSubmit` | `(() => void)` | | ⌘/Ctrl+Enter calls this on every layer; pass the action of the layer shown. |
1027
+ | `onSubmit` | `(() => void)` | | Enter in a single-line field and ⌘/Ctrl+Enter call this on every layer; pass the action of the layer shown. |
946
1028
  | `open` | `boolean` | | Whether it is open, when you control it. |
1029
+ | `persistent` | `boolean` | | A press outside doesn't close it, for forms that would lose what was typed; Escape and the close circle still do. Every StepDialog is persistent. |
947
1030
  | `size` | `"md" \| "sm" \| "lg"` | | The dialog's width. |
948
1031
  | `trigger` | `ReactElement<unknown, string \| JSXElementConstructor<any>>` | | The trigger, a single element. |
949
1032
 
950
1033
  ### StepDialog
951
1034
 
952
- A form split into steps, one question at a time, like sign-in: the step's title and fields, Back and Continue, the action on the last step. Enter in a field and ⌘/Ctrl+Enter continue. The dialog takes each step's own height and stays centered: it grows or shrinks 200ms from the size it has as the step changes, and the new step drifts in from the side it comes from. With `result`, what the last step made (a key shown once) takes the steps' place in the same dialog, at its own size. Continue and Back move the focus into the step they show (its first field; without one, the primary action, or Back when the last step destroys), and a screen reader hears which step it is.
1035
+ A form split into steps, one question at a time, like sign-in: the step's title and fields, Back and Continue, the action on the last step. Enter in a single-line field and ⌘/Ctrl+Enter continue. The dialog takes each step's own height and keeps its top edge where it opened: it grows or shrinks 200ms downward from the size it has as the step changes, so the title never jumps, and the new step drifts in from the side it comes from. With `result`, what the last step made (a key shown once) takes the steps' place in the same dialog, at its own size. Continue and Back move the focus into the step they show (its first field; without one, the primary action, or Back when the last step destroys), and a screen reader hears which step it is.
953
1036
 
954
1037
  | Prop | Type | Default | Description |
955
1038
  |---|---|---|---|
@@ -980,7 +1063,7 @@ Display options: view, grouping and ordering, toggles, properties.
980
1063
  |---|---|---|---|
981
1064
  | `footer` | `ReactNode` | | Content at the bottom of the options, such as a reset button. |
982
1065
  | `inline` | `boolean` | | Render the panel inline (documentation and state matrices). |
983
- | `properties` | `{ options: { value: string; label: string; }[]; value: string[]; onChange: (v: string[]) => void; }` | | The properties shown for each item. |
1066
+ | `properties` | `{ options: { value: string; label: string; }[]; value: string[]; onChange: (v: string[]) => void; hidden?: string[]; }` | | The properties shown for each item; `hidden` names those that are on but left out because they don't fit, such as table columns at a narrow width. |
984
1067
  | `rows` | `DisplayOptionsRow[]` | | Rows of choices, such as grouping and ordering. |
985
1068
  | `toggles` | `DisplayOptionsToggle[]` | | Switches, such as showing archived items. |
986
1069
  | `trigger` | `"secondary" \| "ghost"` | `secondary` | The look of the button that opens the options. |
@@ -1018,7 +1101,7 @@ The aria wiring a control needs, whether it sits in a <Field> or wraps itself in
1018
1101
  | Prop | Type | Default | Description |
1019
1102
  |---|---|---|---|
1020
1103
  | `description` | `ReactNode` | | One sentence of help under the label. |
1021
- | `error` | `ReactNode` | | The error message: it marks the field invalid and is read out with the description, but isn't drawn under the field, so show it in a toast too. |
1104
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color: it marks the field invalid and is read out with the description. |
1022
1105
  | `id` | `string` | | The id of the control inside, so the label points to it. |
1023
1106
  | `invalid` | `boolean` | | Marks the field invalid without a message. |
1024
1107
  | `label` | `ReactNode` | | The field's label. |
@@ -1051,14 +1134,18 @@ A filter as one pill: "Status is 2xx ×", each part opening a menu.
1051
1134
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1052
1135
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
1053
1136
  | `defaultValuesOpen` | `boolean` | | Open the value menu when the chip appears: a filter just added asks for its value at once. |
1137
+ | `groups` | `CommandListGroup[]` | | Choices as ready-made searchable list groups, in place of `values`: rows with marks and details and headings with logos, such as `useModelGroups` or `useProviderGroups` build. |
1054
1138
  | `multiple` | `boolean` | | Several values may be chosen. |
1055
1139
  | `onOperatorChange` | `((operator: string) => void)` | | Called with the chosen comparison. |
1056
1140
  | `onRemove` | `(() => void)` | | Called when the filter is removed. |
1057
1141
  | `onSelectedChange` | `((selected: string[]) => void)` | | Called with the chosen values. |
1142
+ | `onValuesOpenChange` | `((open: boolean) => void)` | | Called when the value menu opens or closes, so a filter just added can go away when it closes without a value. |
1058
1143
  | `operators` | `string[]` | | The comparisons people can choose, such as “is” and “is not”. |
1059
1144
  | `propertyIcon` | `IconSvgElement` | | The icon of the property the filter applies to. |
1145
+ | `searchable` | `boolean` | | Gives the value menu a search field however few choices it has. |
1060
1146
  | `selected` | `string[]` | `[]` | The chosen values. |
1061
- | `values` | `FilterChipChoice[]` | | Choices for the value menu. |
1147
+ | `values` | `FilterChipChoice[]` | | Choices for the value menu: past 8 it gets a search field, past 50 it opens a fast searchable list grouped by each choice's `group`, such as models by provider. |
1148
+ | `width` | `"md" \| "sm" \| "lg"` | | How wide the searchable list opens: `sm` for providers, `lg` for models with their details. |
1062
1149
 
1063
1150
  ## filter-row
1064
1151
 
@@ -1175,7 +1262,7 @@ A pill text field with the secondary material and the field focus. Takes label,
1175
1262
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1176
1263
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
1177
1264
  | `description` | `ReactNode` | | One sentence of help under the label. |
1178
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
1265
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
1179
1266
  | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
1180
1267
  | `label` | `ReactNode` | | The visible label. |
1181
1268
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -1211,8 +1298,9 @@ Numbers that stay exact: right-aligned tabular digits, a unit, stepper circles o
1211
1298
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
1212
1299
  | `defaultValue` | `string` | | The number on first render, as text. |
1213
1300
  | `description` | `ReactNode` | | One sentence of help under the label. |
1214
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
1301
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
1215
1302
  | `hideStepper` | `boolean` | | Hide the stepper circles. |
1303
+ | `integer` | `boolean` | | Whole numbers only, such as a count of days: a numeric keypad on phones and no thousands separators in the field. |
1216
1304
  | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
1217
1305
  | `label` | `ReactNode` | | The visible label. |
1218
1306
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -1254,7 +1342,7 @@ Search: a leading icon, a clear circle when filled, an optional shortcut hint. E
1254
1342
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1255
1343
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
1256
1344
  | `description` | `ReactNode` | | One sentence of help under the label. |
1257
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
1345
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
1258
1346
  | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
1259
1347
  | `label` | `ReactNode` | | The visible label. |
1260
1348
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -1276,7 +1364,7 @@ Masked by default with an eye circle to reveal. Monospace when revealed, never a
1276
1364
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
1277
1365
  | `defaultRevealed` | `boolean` | `false` | Start revealed. |
1278
1366
  | `description` | `ReactNode` | | One sentence of help under the label. |
1279
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
1367
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
1280
1368
  | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
1281
1369
  | `kind` | `"password" \| "secret"` | `secret` | A password (never revealed once saved) or a secret such as an API key. |
1282
1370
  | `label` | `ReactNode` | | The visible label. |
@@ -1299,17 +1387,18 @@ Removable tags in a field: Enter, comma and paste split; Backspace removes the l
1299
1387
  | `defaultValue` | `string[]` | | The tags on first render. |
1300
1388
  | `description` | `ReactNode` | | One sentence of help under the label. |
1301
1389
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
1302
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
1390
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
1303
1391
  | `id` | `string` | | The id of the control, so a label elsewhere can point to it. |
1304
1392
  | `label` | `ReactNode` | | The visible label. |
1305
1393
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
1306
1394
  | `name` | `string` | | The field name the value is sent under in a form. |
1395
+ | `onInputValueChange` | `((draft: string) => void)` | | Called with the text typed but not added as a tag yet, so a form can count it before it is added. |
1307
1396
  | `onValueChange` | `((value: string[]) => void)` | | Called with the tags whenever one is added or removed. |
1308
1397
  | `optional` | `boolean` | | Adds “Optional” to the label, for forms where most fields are required. |
1309
1398
  | `placeholder` | `string` | | Text shown while there is no value. |
1310
1399
  | `required` | `boolean` | | Marks it as required in a form. |
1311
- | `separators` | `string[]` | | Characters that end a tag, besides Enter. |
1312
- | `validate` | `((tag: string) => string \| true)` | | Return true for a valid tag, or a message saying what is wrong. Invalid tags stay, marked with a danger ring, and show the message as their tooltip (and to a screen reader); errors are never drawn under the field, so toast it too when someone submits. |
1400
+ | `separators` | `string[]` | | Characters that end a tag, besides Enter; pasted text also splits at line breaks and tabs. |
1401
+ | `validate` | `((tag: string) => string \| true)` | | Return true for a valid tag, or a message saying what is wrong. Invalid tags stay, marked with a danger ring, and show the message as their tooltip; the first one also shows under the field. |
1313
1402
  | `value` | `string[]` | | The tags, when you control them. |
1314
1403
 
1315
1404
  ### Textarea
@@ -1320,7 +1409,7 @@ A multi-line field: radius 14 (multi-line text cannot be a pill), the same mater
1320
1409
  |---|---|---|---|
1321
1410
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
1322
1411
  | `description` | `ReactNode` | | One sentence of help under the label. |
1323
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
1412
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
1324
1413
  | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
1325
1414
  | `label` | `ReactNode` | | The visible label. |
1326
1415
  | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
@@ -1331,20 +1420,30 @@ A multi-line field: radius 14 (multi-line text cannot be a pill), the same mater
1331
1420
 
1332
1421
  ## kaeso
1333
1422
 
1334
- `import { ConversationView, EffectiveAccess, EnvironmentSnippet, KeyDisplay, LimitMeter, ModelLabel, ProviderBadge, ProviderCard, RequestTimeline, RightsMatrix, RolePicker, SecretReveal, StatusCode, UsageBreakdown } from "@logicplanes/kaeso-ui/kaeso";`
1423
+ `import { CapabilityIcons, ConversationView, EffectiveAccess, EnvironmentSnippet, KeyDisplay, LimitMeter, ModelLabel, ProviderBadge, ProviderCard, ProviderPicker, RequestTimeline, RightsMatrix, RolePicker, SecretReveal, StatusCode, UsageBreakdown } from "@logicplanes/kaeso-ui/kaeso";`
1335
1424
 
1336
1425
  - **density** (conversation): `default` (default) — 24px between turns (default); `compact` — 16px, inside sheets
1337
1426
  - **layout** (effective_access): `rows` (default) — A row per group: its name, what is granted in words, and how many (default)
1338
1427
  - **provider** (identity): `sm` — 16px, inside table cells; `md` (default) — 20px (default); `lg` — 28px; `xl` — 40px: a provider's own page or card
1339
1428
  - **secret** (moments): `md` (default) — The one-time secret on a well
1429
+ - **appearance** (provider_picker): `list` (default) — A search field over every provider, always open: a dialog step (default); `select` — A pill that opens the searchable list: forms and toolbars
1340
1430
  - **origin** (rights_matrix): `preset` — Comes from the role; `added` — Added on top of the role; `removed` — Removed from the role; `none` (default) — Not granted
1341
1431
  - **mode** (rights_matrix): `edit` (default) — Checkboxes, group toggles and requirement hints (default); `readOnly` — A mark per right and, under it, the roles that grant it
1342
1432
  - **appearance** (role_picker): `list` (default) — Every role as a row with its description, built-in then custom (default): invites and role changes; `select` — A pill that opens the roles: filters, table rows and tight forms
1343
1433
  - **limit** (usage): `hard` (default) — Requests over the limit are refused; `soft` — Over the limit only alerts
1344
1434
 
1435
+ ### CapabilityIcons
1436
+
1437
+ A model's capabilities as small icons, each named in a tooltip and read as one list by screen readers.
1438
+
1439
+ | Prop | Type | Default | Description |
1440
+ |---|---|---|---|
1441
+ | `capabilities` | `Capability[]` | `[]` | The capabilities: tools, reasoning, vision, pdf, structuredOutput. |
1442
+ | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1443
+
1345
1444
  ### ConversationView
1346
1445
 
1347
- A model conversation from a request log: role captions, prose, tool calls and results, reasoning, images, refusals.
1446
+ A model conversation from a request log: role captions, prose, tool calls and results, reasoning, images, refusals. Inline images show; remote ones are links, so viewing a log never fetches them.
1348
1447
 
1349
1448
  | Prop | Type | Default | Description |
1350
1449
  |---|---|---|---|
@@ -1388,6 +1487,7 @@ A redacted key: mono 13 with its state dot, copy of the redacted form, and its a
1388
1487
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1389
1488
  | `copy` | `boolean` | `true` | Hide the copy circle. |
1390
1489
  | `state` | `KeyState` | `active` | The key's state; disabled, expired and archived keys are shown dimmed. |
1490
+ | `stateBadge` | `boolean` | `true` | Shows the state's badge beside a key that isn't active (on by default); turn it off where a heading already names the state. |
1391
1491
 
1392
1492
  ### LimitMeter
1393
1493
 
@@ -1416,16 +1516,19 @@ A model: provider mark, display name, then its id in mono, capability icons with
1416
1516
  | `provider` * | `string` | | The provider id, such as `openai` or `anthropic`. |
1417
1517
  | `capabilities` | `Capability[]` | `[]` | What the model can do, shown as small marks after its name. |
1418
1518
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1519
+ | `mark` | `boolean` | `true` | Shows the provider's mark first (default); turn it off in a list grouped under each provider's mark. |
1419
1520
  | `name` | `string` | | The display name, first. |
1521
+ | `providerName` | `string` | | The provider's name from the gateway's provider list, which names its mark for screen readers; the id without it. |
1420
1522
 
1421
1523
  ### ProviderBadge
1422
1524
 
1423
- A provider's mark on a quiet tile, in the text color so it follows the theme; a letter for providers without one.
1525
+ A provider's mark on a quiet tile, in the provider's own one-colour version for the theme; for providers without one, the first letter of their name.
1424
1526
 
1425
1527
  | Prop | Type | Default | Description |
1426
1528
  |---|---|---|---|
1427
1529
  | `provider` * | `string` | | The provider id, such as `openai` or `anthropic`. |
1428
1530
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1531
+ | `name` | `string` | | The provider's name from the gateway's provider list: the badge's accessible name, the text `withName` writes and the source of the letter; the id without it. |
1429
1532
  | `size` | `"md" \| "sm" \| "lg" \| "xl"` | `md` | The badge's size. |
1430
1533
  | `withName` | `boolean` | | Writes the provider's name next to its mark. |
1431
1534
 
@@ -1442,6 +1545,32 @@ A provider and how this place reaches it: its mark, name and connection, the key
1442
1545
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1443
1546
  | `detail` | `ReactNode` | | A line under the provider's name, such as how many keys it has. |
1444
1547
  | `keyLabel` | `ReactNode` | | The key: its name and last four characters, and when it was last used. |
1548
+ | `name` | `string` | | The provider's name from the gateway's provider list, as the card's title; the id without it. |
1549
+
1550
+ ### ProviderPicker
1551
+
1552
+ Choosing a provider from any number of them: a search field over every provider, connected ones first with their key counts, then the rest from A to Z, each with its mark. Always open in a dialog step, or a pill that opens it in forms and toolbars.
1553
+
1554
+ | Prop | Type | Default | Description |
1555
+ |---|---|---|---|
1556
+ | `providers` * | `ProviderPickerOption[]` | | The providers: id, name, whether the organization has connected it, and a short hint such as its key count. |
1557
+ | `allLabel` | `string` | | Select only: a first option for no provider in particular, such as "All providers"; choosing it reports `null`. |
1558
+ | `appearance` | `"list" \| "select"` | | An always-open list for a dialog step, or a pill that opens it. |
1559
+ | `aria-label` | `string` | | The accessible name, for when there is no visible label. |
1560
+ | `autoFocus` | `boolean` | | List only: focuses the search field when it appears. |
1561
+ | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1562
+ | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
1563
+ | `description` | `ReactNode` | | One sentence of help under the label. |
1564
+ | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
1565
+ | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
1566
+ | `label` | `ReactNode` | | The visible label. |
1567
+ | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
1568
+ | `onValueChange` | `((id: string \| null) => void)` | | Called with the chosen provider's id, or `null` for `allLabel`. |
1569
+ | `optional` | `boolean` | | Adds “Optional” to the label, for forms where most fields are required. |
1570
+ | `placeholder` | `string` | | The search field's placeholder; in a pill without `allLabel`, also the text shown while nothing is chosen. |
1571
+ | `required` | `boolean` | | Marks it as required in a form. |
1572
+ | `size` | `"md" \| "sm"` | | Select only: the height of the pill. |
1573
+ | `value` | `string \| null` | | The chosen provider's id, when you control it. |
1445
1574
 
1446
1575
  ### RequestTimeline
1447
1576
 
@@ -1518,7 +1647,7 @@ A stacked bar of token kinds with the numbers under it, in the fixed series mapp
1518
1647
 
1519
1648
  | Prop | Type | Default | Description |
1520
1649
  |---|---|---|---|
1521
- | `tokens` * | `Partial<Record<"input" \| "output" \| "cacheRead" \| "cacheWrite" \| "reasoning", number>>` | | Tokens by kind: input, output, cache reads and writes, reasoning. |
1650
+ | `tokens` * | `Partial<Record<"input" \| "output" \| "cacheRead" \| "cacheWrite" \| "reasoning", number>>` | | Tokens by kind: input, output, cache reads and writes, reasoning. A kind left out isn't listed, for kinds that can't apply, such as output for embeddings; pass 0 to list it. |
1522
1651
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
1523
1652
 
1524
1653
  ## kbd
@@ -1593,7 +1722,7 @@ A responsive grid.
1593
1722
 
1594
1723
  | Prop | Type | Default | Description |
1595
1724
  |---|---|---|---|
1596
- | `align` | `"start" \| "end" \| "baseline" \| "stretch" \| "center"` | `center` | How items line up within their cells. |
1725
+ | `align` | `"start" \| "end" \| "center" \| "baseline" \| "stretch"` | `center` | How items line up within their cells. |
1597
1726
  | `as` | `ElementType` | | The element or component to render as, such as `section` or `ul`. |
1598
1727
  | `columns` | `4 \| 1 \| 2 \| 3 \| 6` | `2` | The number of columns. |
1599
1728
  | `gap` | `0 \| 24 \| 20 \| 32 \| 40 \| 4 \| 2 \| 6 \| 8 \| 12 \| 16 \| 48 \| 64` | `16` | The space between items, in pixels on the spacing scale. |
@@ -1604,7 +1733,7 @@ A horizontal row that wraps.
1604
1733
 
1605
1734
  | Prop | Type | Default | Description |
1606
1735
  |---|---|---|---|
1607
- | `align` | `"start" \| "end" \| "baseline" \| "stretch" \| "center"` | `center` | How items line up across the row. |
1736
+ | `align` | `"start" \| "end" \| "center" \| "baseline" \| "stretch"` | `center` | How items line up across the row. |
1608
1737
  | `as` | `ElementType` | | The element or component to render as, such as `section` or `ul`. |
1609
1738
  | `gap` | `0 \| 24 \| 20 \| 32 \| 40 \| 4 \| 2 \| 6 \| 8 \| 12 \| 16 \| 48 \| 64` | `16` | The space between items, in pixels on the spacing scale. |
1610
1739
  | `justify` | `"start" \| "end" \| "center" \| "between"` | | How items are spread along the main axis. |
@@ -1616,7 +1745,7 @@ A vertical stack.
1616
1745
 
1617
1746
  | Prop | Type | Default | Description |
1618
1747
  |---|---|---|---|
1619
- | `align` | `"start" \| "end" \| "baseline" \| "stretch" \| "center"` | `center` | How items line up across the column. |
1748
+ | `align` | `"start" \| "end" \| "center" \| "baseline" \| "stretch"` | `center` | How items line up across the column. |
1620
1749
  | `as` | `ElementType` | | The element or component to render as, such as `section` or `ul`. |
1621
1750
  | `gap` | `0 \| 24 \| 20 \| 32 \| 40 \| 4 \| 2 \| 6 \| 8 \| 12 \| 16 \| 48 \| 64` | `16` | The space between items, in pixels on the spacing scale. |
1622
1751
  | `justify` | `"start" \| "end" \| "center" \| "between"` | | How items are spread along the main axis. |
@@ -1685,6 +1814,7 @@ The console list: 44px rows on the panel, no lines, metadata on the right, keybo
1685
1814
  | `selectionActions` | `ReactNode` | | Actions in the floating selection bar. |
1686
1815
  | `selectionBar` | `boolean` | `true` | The floating selection bar; off where the host shows the count itself, as in a dialog. |
1687
1816
  | `virtualizeAbove` | `number` | `100` | Virtualize above this many rows (100). |
1817
+ | `wrapSubtitle` | `boolean` | `false` | Lets a subtitle under its title wrap instead of ending with an ellipsis, for descriptions people read in full. |
1688
1818
 
1689
1819
  ### ListRow
1690
1820
 
@@ -1707,6 +1837,7 @@ One row: checkbox, glyph, id, title, subtitle, metadata, date, avatar, hover act
1707
1837
  | `selectable` | `boolean` | | Shows the row's checkbox. |
1708
1838
  | `selected` | `boolean` | | Marks the row as selected. |
1709
1839
  | `selecting` | `boolean` | | Shows checkboxes on every row while some are selected. |
1840
+ | `wrapSubtitle` | `boolean` | `false` | Lets a subtitle under its title wrap. Set by `List`. |
1710
1841
 
1711
1842
  ### SelectionAction
1712
1843
 
@@ -1964,15 +2095,16 @@ Moves through long lists by pages, by cursor, or with a Load more button.
1964
2095
 
1965
2096
  ## playground
1966
2097
 
1967
- `import { CompareGrid, Composer, ModelPicker, ParameterPanel, ParameterPopover, PromptSuggestions, ResponseMetrics, ResponseView, Thread, UserMessage } from "@logicplanes/kaeso-ui/playground";`
2098
+ `import { CompareGrid, Composer, ModelPicker, ParameterPanel, ParameterPopover, PromptSuggestions, Reasoning, ResponseMetrics, ResponseView, Thread, UserMessage } from "@logicplanes/kaeso-ui/playground";`
1968
2099
 
1969
2100
  - **divider** (compare_grid): `hairline` (default) — Columns separated by a hairline, edge to edge (default); `none` — No line between columns: columns that sit in panels of their own
1970
2101
  - **size** (composer): `md` (default) — Text 14/20, 8px around the buttons; the outline concentric with them (16 + 8) (default); `sm` — The same box starting one line tall: a follow-up field under a thread
1971
2102
  - **appearance** (model_picker): `ghost` (default) — Transparent until hovered: a column header (default); `default` — A raised pill with a ring: a form or toolbar
1972
2103
  - **layout** (parameter_panel): `popover` (default) — Inside a 320px popover (ParameterPopover) (default); `panel` — A side panel or sheet: a little more room between groups
1973
2104
  - **align** (prompt_suggestions): `start` (default) — Rows the composer's width, their text on its text (default); `center` — Centered under an empty thread's title
2105
+ - **state** (reasoning): `done` (default) — Finished: “Thought for 4.2 s”, closed until opened (default); `live` — Still reasoning: “Thinking” pulses quietly and the latest line shows beside it
1974
2106
  - **size** (response_metrics): `sm` (default) — 12/16: a column footer or under a turn (default); `md` — 13/18: a response on its own
1975
- - **status** (response_view): `pending` — Sent, nothing back yet: an empty line where the text will start, nothing drawn; `streaming` — Arriving: the text grows, earlier lines never re-wrap; Thinking is live; `done` (default) — Complete (default); `stopped` — Stopped by the person: the text so far and “Stopped”; `error` — Failed: “No response” and Retry. The error itself is a toast
2107
+ - **status** (response_view): `pending` — Sent, nothing back yet: an empty line where the text will start, nothing drawn; `streaming` — Arriving: the text grows, earlier lines never re-wrap; Thinking is live; `done` (default) — Complete (default); `stopped` — Stopped by the person: the text so far and “Stopped”; `incomplete` — Cut off by the model: the text so far and why, such as “Stopped at the output limit”; `error` — Failed: the error in place of the response, and Retry
1976
2108
 
1977
2109
  ### CompareGrid
1978
2110
 
@@ -2020,22 +2152,36 @@ The prompt box: a text box that grows with what is written up to `maxRows`, then
2020
2152
 
2021
2153
  ### ModelPicker
2022
2154
 
2023
- A model, picked from the project's catalogue: the provider mark, name and id (ModelLabel), grouped by provider.
2155
+ A model from a catalogue of any size: a pill showing the chosen model that opens a searchable list, grouped by provider under sticky captions with marks and counts, connected providers first and recent models on top, with a Provider filter that lists only the providers whose models match the search. Each row shows the name, the id, capabilities, context and price; deprecated models wait behind a toggle.
2024
2156
 
2025
2157
  | Prop | Type | Default | Description |
2026
2158
  |---|---|---|---|
2027
- | `options` * | `ModelPickerOption[]` | | The models to choose from. |
2028
- | `appearance` | `"ghost" \| "default"` | `ghost` | A quiet button (`ghost`) or a filled one (`default`). |
2159
+ | `options` * | `ModelPickerOption[]` | | The models: value, provider, id, name, capabilities, context window, a formatted price, a short note such as why it is disabled, and whether it is deprecated. |
2160
+ | `allLabel` | `string` | | Single only: a first option for no model in particular, such as "All models"; choosing it reports an empty string. |
2161
+ | `appearance` | `"ghost" \| "default"` | | A quiet button (`ghost`) or a filled one (`default`). |
2029
2162
  | `aria-label` | `string` | | The picker's accessible name ("Model" by default). |
2030
2163
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
2031
2164
  | `data-force` | `string` | | Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`. |
2032
- | `defaultValue` | `string \| null` | | The chosen model on first render. |
2165
+ | `defaultValue` | `string \| string[] \| null` | | The chosen model, or models with `multiple`, on first render. |
2166
+ | `description` | `ReactNode` | | One sentence of help under the label. |
2033
2167
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
2168
+ | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
2169
+ | `fullWidth` | `boolean` | | Fills the container. |
2034
2170
  | `groupByProvider` | `boolean` | | Groups the list by provider (true by default when there are several). |
2035
- | `onValueChange` | `((value: string) => void)` | | Called with the chosen model. |
2171
+ | `invalid` | `boolean` | | Shows it as invalid; pair it with a message that says what to fix. |
2172
+ | `label` | `ReactNode` | | The visible label. |
2173
+ | `layout` | `"horizontal" \| "vertical"` | | The label above the control (`vertical`) or beside it (`horizontal`). |
2174
+ | `multiple` | `boolean` | | Allows choosing several models; `value` is then a list. |
2175
+ | `onOpenChange` | `((open: boolean) => void)` | | Called when the list opens or closes. |
2176
+ | `onValueChange` | `((value: string) => void) \| ((value: string[]) => void)` | | Called with the chosen model, or the list of models with `multiple`. |
2177
+ | `open` | `boolean` | | Whether the list is open, when you control it. |
2178
+ | `optional` | `boolean` | | Adds “Optional” to the label, for forms where most fields are required. |
2036
2179
  | `placeholder` | `string` | | Text shown while there is no value. |
2037
- | `size` | `"md" \| "sm"` | `sm` | The button's height. |
2038
- | `value` | `string \| null` | | The chosen model, when you control it. |
2180
+ | `providers` | `ModelPickerProvider[]` | | The providers' names and whether each is connected; connected providers come first. |
2181
+ | `recent` | `readonly string[]` | | Values of recently used models, shown first while the search is empty. |
2182
+ | `required` | `boolean` | | Marks it as required in a form. |
2183
+ | `size` | `"md" \| "sm"` | | The button's height. |
2184
+ | `value` | `string \| string[] \| null` | | The chosen model, or models with `multiple`, when you control it. |
2039
2185
 
2040
2186
  ### ParameterPanel
2041
2187
 
@@ -2088,14 +2234,31 @@ Example prompts before a thread starts: up to three lines of plain secondary tex
2088
2234
  | `aria-label` | `string` | | The list's accessible name. Defaults to "Example prompts" in the provider's language. |
2089
2235
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
2090
2236
 
2237
+ ### Reasoning
2238
+
2239
+ A model's reasoning behind a quiet disclosure, closed by default: “Thought for 4.2 s” when it is done, “Thinking” with the latest line beside it while it streams. Opened, the reasoning reads in small secondary text beside a line. The Playground and the request log show reasoning with it.
2240
+
2241
+ | Prop | Type | Default | Description |
2242
+ |---|---|---|---|
2243
+ | `children` | `ReactNode` | | What the open disclosure shows in place of `text`, such as why the reasoning can't be shown. |
2244
+ | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
2245
+ | `defaultOpen` | `boolean` | | Whether it starts open. |
2246
+ | `duration` | `number` | | How long the model reasoned, in milliseconds: “Thought for 4.2 s”. |
2247
+ | `hint` | `ReactNode` | | A short note beside the title, such as “Redacted by the provider”; while `live`, the latest line of the reasoning shows there instead. |
2248
+ | `live` | `boolean` | `false` | The reasoning is still arriving: “Thinking” pulses quietly and its latest line shows beside it. |
2249
+ | `onOpenChange` | `((open: boolean) => void)` | | Called when it opens or closes. |
2250
+ | `open` | `boolean` | | Whether it is open, when you control it. |
2251
+ | `text` | `string` | | The reasoning, as Markdown. |
2252
+ | `title` | `ReactNode` | | The title in place of “Thinking” or “Thought for …”, such as “Reasoning” in a request log. |
2253
+
2091
2254
  ### ResponseMetrics
2092
2255
 
2093
- A response's numbers on one line: time to first token, total time, tokens in → out (and reasoning), cost. Tabular figures, labels in tertiary text. While `live`, values not known yet show "—" in the room they will take; before any response the line is empty, its height kept.
2256
+ A response's numbers on one line: time to first token, total time, tokens ("412 in · 168 out", and reasoning), cost to the millionth of a dollar, as request logs show it. Tabular figures, labels in tertiary text. While `live`, values not known yet show "—" in the room they will take; before any response the line is empty, its height kept.
2094
2257
 
2095
2258
  | Prop | Type | Default | Description |
2096
2259
  |---|---|---|---|
2097
2260
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
2098
- | `cost` | `string \| null` | | USD as a decimal string: "0.004213". |
2261
+ | `cost` | `string \| null` | | USD as a decimal string: "0.004213" reads "$0.004213", and zero reads "$0". |
2099
2262
  | `duration` | `number \| null` | | Milliseconds from sending to the last token. |
2100
2263
  | `inputTokens` | `number \| null` | | The tokens sent, once known. |
2101
2264
  | `live` | `boolean` | `false` | A response is arriving: values not known yet show a quiet "—" in the room they will take. |
@@ -2108,20 +2271,22 @@ A response's numbers on one line: time to first token, total time, tokens in →
2108
2271
 
2109
2272
  ### ResponseView
2110
2273
 
2111
- A model's response as it arrives: Markdown text for reading (15/22), the reasoning summary in a "Thinking" disclosure (closed by default, live while it streams), and calm states for a stop or a failure. Errors themselves are toasts; the response says only that there is none.
2274
+ A model's response as it arrives: Markdown text for reading (15/22), the reasoning summary in a "Thinking" disclosure (closed by default, live while it streams), and calm states for a stop, a cut-off reply or a failure, which shows its error in place.
2112
2275
 
2113
2276
  | Prop | Type | Default | Description |
2114
2277
  |---|---|---|---|
2115
2278
  | `aria-label` | `string` | | The response's accessible name ("GPT-5 response" in a comparison). Defaults to "Response" in the provider's language. |
2116
2279
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
2117
2280
  | `defaultReasoningOpen` | `boolean` | | Whether the reasoning starts expanded. |
2281
+ | `error` | `string` | | Why the reply failed, shown under "No response" with status "error": the gateway's message in the reader's language; `code` spans render as code. |
2118
2282
  | `footer` | `ReactNode` | | Under the response: its metrics, actions. |
2283
+ | `incompleteReason` | `string` | | Why the model cut the reply off, with status "incomplete": `max_output_tokens` reads "Stopped at the output limit", `content_filter` names the filter. |
2119
2284
  | `onReasoningOpenChange` | `((open: boolean) => void)` | | Called when the reasoning is expanded or collapsed. |
2120
- | `onRetry` | `(() => void)` | | Sends the turn again; shown with an error or a stop. |
2285
+ | `onRetry` | `(() => void)` | | Sends the turn again; shown with an error, a stop or a cut-off reply. |
2121
2286
  | `reasoning` | `string` | | The reasoning summary so far, as Markdown. A "Thinking" disclosure shows it, closed by default. |
2122
2287
  | `reasoningDuration` | `number` | | How long the model reasoned, in milliseconds: "Thought for 4.2 s". |
2123
2288
  | `reasoningOpen` | `boolean` | | Whether the reasoning is expanded, when you control it. |
2124
- | `status` | `"done" \| "error" \| "streaming" \| "pending" \| "stopped"` | `done` | Where the reply stands: waiting, streaming, done, stopped or failed. |
2289
+ | `status` | `"done" \| "error" \| "streaming" \| "pending" \| "stopped" \| "incomplete"` | `done` | Where the reply stands: waiting, streaming, done, stopped, cut off by the model (incomplete) or failed. |
2125
2290
  | `text` | `string` | | The output text so far, as Markdown. |
2126
2291
 
2127
2292
  ### Thread
@@ -2272,12 +2437,13 @@ A release's artwork: flat geometric art in one of eight styles and Kaeso's palet
2272
2437
 
2273
2438
  | Prop | Type | Default | Description |
2274
2439
  |---|---|---|---|
2275
- | `label` * | `string` | | What the picture shows, read by screen readers: "Kaeso 0.3.0". |
2276
- | `seed` * | `string` | | What the artwork is drawn from when there is no `art`, e.g. `0.3.0`; the same seed always draws the same picture. |
2440
+ | `label` * | `string` | | What the picture shows, read by screen readers: "Kaeso 0.1.0". |
2441
+ | `seed` * | `string` | | What the artwork is drawn from when there is no `art`, e.g. `0.1.0`; the same seed always draws the same picture. |
2277
2442
  | `art` | `ReleaseArtSpec` | | The release's stored artwork, e.g. from `nextReleaseArt`; it always draws the same picture and wins over `seed`. |
2278
2443
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
2279
2444
  | `eyebrow` | `ReactNode` | | Small text above the title, e.g. “What's new in Kaeso”. |
2280
2445
  | `shape` | `"banner" \| "wide"` | `banner` | The artwork's aspect ratio. |
2446
+ | `src` | `string` | | An image of the release's stored artwork, e.g. `https://update.kaeso.app/art/0.1.0.svg`, shown in the frame instead of the drawn picture, which takes its place if the image doesn't load. |
2281
2447
  | `title` | `ReactNode` | | Large text on the artwork, e.g. the version number. |
2282
2448
 
2283
2449
  ## resource-list
@@ -2404,7 +2570,7 @@ A pill that opens a list on the menu surface: check on the selected item, groups
2404
2570
  | `defaultValue` | `string \| string[] \| null` | | The value on first render, when the component keeps its own value. |
2405
2571
  | `description` | `ReactNode` | | One sentence of help under the label. |
2406
2572
  | `disabled` | `boolean` | | Turns it off: it can't be used, and it looks dimmed. |
2407
- | `error` | `ReactNode` | | Deprecated. Errors are toasts, never text under a field: `error` marks the control invalid and stays its description for screen readers, but isn't drawn. Pass `invalid` and toast the message. |
2573
+ | `error` | `ReactNode` | | The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description. |
2408
2574
  | `fullWidth` | `boolean` | | Width of the trigger follows its content (default) or fills the container. |
2409
2575
  | `icon` | `IconSvgElement` | | Leading icon in the trigger. |
2410
2576
  | `id` | `string` | | The id of the control, so a label elsewhere can point to it. |
@@ -2494,7 +2660,7 @@ A settings section: a title-sm heading 48px above, 12px below; usually one Setti
2494
2660
 
2495
2661
  ### Sheet
2496
2662
 
2497
- A panel that slides in from the edge of the screen, for details and longer forms.
2663
+ A panel that slides in from the edge of the screen, for details and longer forms. While it slides out it keeps showing what it showed when it was open, so a page can let go of the row as soon as it closes.
2498
2664
 
2499
2665
  | Prop | Type | Default | Description |
2500
2666
  |---|---|---|---|
@@ -2640,6 +2806,7 @@ One metric of a dashboard row: its label, the number, the change against the pre
2640
2806
  | `change` | `{ value: number; better?: "up" \| "down"; }` | | The change against the previous period, as a fraction (0.12 is +12%). `better` says which direction is good: errors are better down. |
2641
2807
  | `className` | `string` | | Classes for the layout of the outer element: margin, width and placement, never its look. |
2642
2808
  | `detail` | `ReactNode` | | A quiet line under the number: "vs. the previous 30 days", "0.4% of requests". |
2809
+ | `loading` | `boolean` | | While the numbers load: the value, the change and the trend show their shape at the tile's final height. |
2643
2810
  | `trend` | `number[]` | | One value per day (or step), drawn as a sparkline across the tile. A tile without it has no room for one; pass `[]` while a trend loads to keep it. |
2644
2811
  | `trendColor` | `string` | | The trend's color; the first series color by default. |
2645
2812