@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
  {
2
2
  "package": "@logicplanes/kaeso-ui",
3
- "version": "0.2.2",
3
+ "version": "0.3.1",
4
4
  "components": [
5
5
  {
6
6
  "entry": "app-frame",
@@ -832,6 +832,20 @@
832
832
  "required": false,
833
833
  "default": null,
834
834
  "description": "Called when Try again is pressed after `error`; without it, the button doesn't show."
835
+ },
836
+ {
837
+ "name": "partial",
838
+ "type": "{ first?: boolean; last?: boolean; ongoing?: boolean | undefined; } | undefined",
839
+ "required": false,
840
+ "default": null,
841
+ "description": "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\"."
842
+ },
843
+ {
844
+ "name": "shares",
845
+ "type": "boolean",
846
+ "required": false,
847
+ "default": "true",
848
+ "description": "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."
835
849
  }
836
850
  ],
837
851
  "file": "src/components/charts/bar.tsx"
@@ -1540,12 +1554,19 @@
1540
1554
  "default": null,
1541
1555
  "description": "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."
1542
1556
  },
1557
+ {
1558
+ "name": "formatTick",
1559
+ "type": "((t: Date) => string)",
1560
+ "required": false,
1561
+ "default": null,
1562
+ "description": "Names the times under the axis (\"3 Aug\", \"2026\"). Defaults to calendar ticks in `timeZone`; pass it with `tickAt=\"points\"` for buckets."
1563
+ },
1543
1564
  {
1544
1565
  "name": "formatTime",
1545
1566
  "type": "((t: Date) => string)",
1546
1567
  "required": false,
1547
1568
  "default": null,
1548
- "description": "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."
1569
+ "description": "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\"."
1549
1570
  },
1550
1571
  {
1551
1572
  "name": "formatValue",
@@ -1596,12 +1617,40 @@
1596
1617
  "default": null,
1597
1618
  "description": "Called when Try again is pressed after `error`; without it, the button doesn't show."
1598
1619
  },
1620
+ {
1621
+ "name": "partial",
1622
+ "type": "{ first?: boolean; last?: boolean; ongoing?: boolean | undefined; } | undefined",
1623
+ "required": false,
1624
+ "default": null,
1625
+ "description": "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\"."
1626
+ },
1627
+ {
1628
+ "name": "shares",
1629
+ "type": "boolean",
1630
+ "required": false,
1631
+ "default": "true",
1632
+ "description": "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."
1633
+ },
1599
1634
  {
1600
1635
  "name": "threshold",
1601
1636
  "type": "{ value: number; label: string; }",
1602
1637
  "required": false,
1603
1638
  "default": null,
1604
1639
  "description": "A threshold line (a budget) in danger, dashed."
1640
+ },
1641
+ {
1642
+ "name": "tickAt",
1643
+ "type": "\"time\" | \"points\"",
1644
+ "required": false,
1645
+ "default": "time",
1646
+ "description": "`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."
1647
+ },
1648
+ {
1649
+ "name": "timeZone",
1650
+ "type": "string",
1651
+ "required": false,
1652
+ "default": null,
1653
+ "description": "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."
1605
1654
  }
1606
1655
  ],
1607
1656
  "file": "src/components/charts/timeseries.tsx"
@@ -2560,8 +2609,7 @@
2560
2609
  "type": "ReactNode",
2561
2610
  "required": false,
2562
2611
  "default": null,
2563
- "description": "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.",
2564
- "deprecated": true
2612
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
2565
2613
  },
2566
2614
  {
2567
2615
  "name": "id",
@@ -2645,7 +2693,7 @@
2645
2693
  },
2646
2694
  {
2647
2695
  "name": "Combobox",
2648
- "description": "A pill input with a filtered list: matched characters highlighted, async, chips for many, create.",
2696
+ "description": "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`.",
2649
2697
  "props": [
2650
2698
  {
2651
2699
  "name": "options",
@@ -2668,6 +2716,13 @@
2668
2716
  "default": null,
2669
2717
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
2670
2718
  },
2719
+ {
2720
+ "name": "createLabel",
2721
+ "type": "((label: string) => string)",
2722
+ "required": false,
2723
+ "default": null,
2724
+ "description": "The words of the offer to add what was typed; `Add “…”` by default."
2725
+ },
2671
2726
  {
2672
2727
  "name": "data-force",
2673
2728
  "type": "string",
@@ -2708,8 +2763,7 @@
2708
2763
  "type": "ReactNode",
2709
2764
  "required": false,
2710
2765
  "default": null,
2711
- "description": "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.",
2712
- "deprecated": true
2766
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
2713
2767
  },
2714
2768
  {
2715
2769
  "name": "id",
@@ -2765,7 +2819,7 @@
2765
2819
  "type": "((label: string) => void)",
2766
2820
  "required": false,
2767
2821
  "default": null,
2768
- "description": "Offers \"Create “…”\" when nothing matches exactly."
2822
+ "description": "Offers \"Add “…”\" when nothing matches exactly."
2769
2823
  },
2770
2824
  {
2771
2825
  "name": "onInputValueChange",
@@ -2802,6 +2856,13 @@
2802
2856
  "default": null,
2803
2857
  "description": "Marks it as required in a form."
2804
2858
  },
2859
+ {
2860
+ "name": "searchDelay",
2861
+ "type": "number",
2862
+ "required": false,
2863
+ "default": null,
2864
+ "description": "Milliseconds of quiet typing before `onInputValueChange` is called, so a server search runs once per pause, not per keystroke."
2865
+ },
2805
2866
  {
2806
2867
  "name": "size",
2807
2868
  "type": "\"md\" | \"sm\" | \"lg\" | \"xl\"",
@@ -2857,6 +2918,331 @@
2857
2918
  }
2858
2919
  }
2859
2920
  },
2921
+ {
2922
+ "entry": "command-list",
2923
+ "kind": "components",
2924
+ "import": "@logicplanes/kaeso-ui/command-list",
2925
+ "components": [
2926
+ {
2927
+ "name": "CommandList",
2928
+ "description": "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.",
2929
+ "props": [
2930
+ {
2931
+ "name": "aria-label",
2932
+ "type": "string",
2933
+ "required": true,
2934
+ "default": null,
2935
+ "description": "The list's accessible name."
2936
+ },
2937
+ {
2938
+ "name": "groups",
2939
+ "type": "CommandListGroup[]",
2940
+ "required": true,
2941
+ "default": null,
2942
+ "description": "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."
2943
+ },
2944
+ {
2945
+ "name": "autoFocus",
2946
+ "type": "boolean",
2947
+ "required": false,
2948
+ "default": null,
2949
+ "description": "Focuses the search field when it appears, as in a popover or a dialog step."
2950
+ },
2951
+ {
2952
+ "name": "className",
2953
+ "type": "string",
2954
+ "required": false,
2955
+ "default": null,
2956
+ "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
2957
+ },
2958
+ {
2959
+ "name": "data-force",
2960
+ "type": "string",
2961
+ "required": false,
2962
+ "default": null,
2963
+ "description": "Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`."
2964
+ },
2965
+ {
2966
+ "name": "defaultQuery",
2967
+ "type": "string",
2968
+ "required": false,
2969
+ "default": "",
2970
+ "description": "The search text on first render."
2971
+ },
2972
+ {
2973
+ "name": "emptyText",
2974
+ "type": "ReactNode",
2975
+ "required": false,
2976
+ "default": null,
2977
+ "description": "What the list says when nothing matches: \"No models match\"."
2978
+ },
2979
+ {
2980
+ "name": "escapeClears",
2981
+ "type": "boolean",
2982
+ "required": false,
2983
+ "default": "true",
2984
+ "description": "Escape first clears the search, and only an empty search lets Escape close what holds the list (true by default)."
2985
+ },
2986
+ {
2987
+ "name": "footer",
2988
+ "type": "ReactNode",
2989
+ "required": false,
2990
+ "default": null,
2991
+ "description": "A line under the list, such as key hints."
2992
+ },
2993
+ {
2994
+ "name": "height",
2995
+ "type": "\"fill\" | \"popover\" | \"inline\"",
2996
+ "required": false,
2997
+ "default": null,
2998
+ "description": "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."
2999
+ },
3000
+ {
3001
+ "name": "inputProps",
3002
+ "type": "{ [attribute: `data-${string}`]: string; }",
3003
+ "required": false,
3004
+ "default": null,
3005
+ "description": "Data attributes for the search field, such as a marker other code looks for."
3006
+ },
3007
+ {
3008
+ "name": "loading",
3009
+ "type": "boolean",
3010
+ "required": false,
3011
+ "default": null,
3012
+ "description": "Shows a quiet progress line at the top while more rows load."
3013
+ },
3014
+ {
3015
+ "name": "match",
3016
+ "type": "((item: CommandListItem, query: string) => number)",
3017
+ "required": false,
3018
+ "default": "(item: CommandListItem, query: string) => commandMatch(query, [item.label, ...(item.keywords ?? [])])",
3019
+ "description": "Scores a row against the search: above 0 keeps it, and higher scores come first. Fuzzy matching on the label and keywords by default."
3020
+ },
3021
+ {
3022
+ "name": "multiple",
3023
+ "type": "boolean",
3024
+ "required": false,
3025
+ "default": null,
3026
+ "description": "Rows toggle with a checkbox instead of choosing one."
3027
+ },
3028
+ {
3029
+ "name": "onEscape",
3030
+ "type": "(() => void)",
3031
+ "required": false,
3032
+ "default": null,
3033
+ "description": "Called on Escape when the search field is already empty."
3034
+ },
3035
+ {
3036
+ "name": "onInputKeyDown",
3037
+ "type": "((event: KeyboardEvent<HTMLInputElement>) => void)",
3038
+ "required": false,
3039
+ "default": null,
3040
+ "description": "Called first with every key pressed in the search field; call `preventDefault` to replace the list's own handling."
3041
+ },
3042
+ {
3043
+ "name": "onQueryChange",
3044
+ "type": "((query: string) => void)",
3045
+ "required": false,
3046
+ "default": null,
3047
+ "description": "Called with the search text."
3048
+ },
3049
+ {
3050
+ "name": "onSelect",
3051
+ "type": "((value: string) => void)",
3052
+ "required": false,
3053
+ "default": null,
3054
+ "description": "Called with the value of the row chosen with Enter or a click."
3055
+ },
3056
+ {
3057
+ "name": "placeholder",
3058
+ "type": "string",
3059
+ "required": false,
3060
+ "default": null,
3061
+ "description": "The search field's placeholder and accessible name (\"Search\" by default)."
3062
+ },
3063
+ {
3064
+ "name": "query",
3065
+ "type": "string",
3066
+ "required": false,
3067
+ "default": null,
3068
+ "description": "The search text, when you control it."
3069
+ },
3070
+ {
3071
+ "name": "searchPrefix",
3072
+ "type": "ReactNode",
3073
+ "required": false,
3074
+ "default": null,
3075
+ "description": "Something before the search text, such as the page a palette is on."
3076
+ },
3077
+ {
3078
+ "name": "size",
3079
+ "type": "\"md\" | \"lg\"",
3080
+ "required": false,
3081
+ "default": "md",
3082
+ "description": "The search field's and the rows' height: 34px rows, or 40px in the command palette."
3083
+ },
3084
+ {
3085
+ "name": "toolbar",
3086
+ "type": "ReactNode",
3087
+ "required": false,
3088
+ "default": null,
3089
+ "description": "Controls under the search field: filter chips or a toggle."
3090
+ },
3091
+ {
3092
+ "name": "value",
3093
+ "type": "string | readonly string[] | null",
3094
+ "required": false,
3095
+ "default": null,
3096
+ "description": "The chosen value, or the chosen values with `multiple`."
3097
+ }
3098
+ ],
3099
+ "file": "src/components/command-list/command-list.tsx"
3100
+ },
3101
+ {
3102
+ "name": "PickerPopover",
3103
+ "description": "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.",
3104
+ "props": [
3105
+ {
3106
+ "name": "children",
3107
+ "type": "ReactNode",
3108
+ "required": true,
3109
+ "default": null,
3110
+ "description": "The `CommandList`."
3111
+ },
3112
+ {
3113
+ "name": "title",
3114
+ "type": "string",
3115
+ "required": true,
3116
+ "default": null,
3117
+ "description": "The popover's accessible name and the sheet's title on phones."
3118
+ },
3119
+ {
3120
+ "name": "trigger",
3121
+ "type": "ReactElement<unknown, string | JSXElementConstructor<any>>",
3122
+ "required": true,
3123
+ "default": null,
3124
+ "description": "The button that opens it, usually a `PickerTrigger`."
3125
+ },
3126
+ {
3127
+ "name": "align",
3128
+ "type": "\"start\" | \"end\"",
3129
+ "required": false,
3130
+ "default": "start",
3131
+ "description": "Which edge of the trigger the popover lines up with."
3132
+ },
3133
+ {
3134
+ "name": "onOpenChange",
3135
+ "type": "((open: boolean) => void)",
3136
+ "required": false,
3137
+ "default": null,
3138
+ "description": "Called when it opens or closes."
3139
+ },
3140
+ {
3141
+ "name": "open",
3142
+ "type": "boolean",
3143
+ "required": false,
3144
+ "default": null,
3145
+ "description": "Whether it is open, when you control it."
3146
+ },
3147
+ {
3148
+ "name": "width",
3149
+ "type": "\"md\" | \"sm\" | \"lg\"",
3150
+ "required": false,
3151
+ "default": "md",
3152
+ "description": "The popover's width on wider screens."
3153
+ }
3154
+ ],
3155
+ "file": "src/components/command-list/picker-popover.tsx"
3156
+ },
3157
+ {
3158
+ "name": "PickerTrigger",
3159
+ "description": "The pill that opens a picker and shows its value, in the same looks and sizes as `Select`.",
3160
+ "props": [
3161
+ {
3162
+ "name": "appearance",
3163
+ "type": "\"ghost\" | \"default\" | \"header\"",
3164
+ "required": false,
3165
+ "default": "default",
3166
+ "description": "A raised pill, quiet in a settings row, or transparent in a column header."
3167
+ },
3168
+ {
3169
+ "name": "children",
3170
+ "type": "ReactNode",
3171
+ "required": false,
3172
+ "default": null,
3173
+ "description": "The chosen value as it should read; the placeholder shows without it."
3174
+ },
3175
+ {
3176
+ "name": "data-force",
3177
+ "type": "string",
3178
+ "required": false,
3179
+ "default": null,
3180
+ "description": "Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`."
3181
+ },
3182
+ {
3183
+ "name": "fullWidth",
3184
+ "type": "boolean",
3185
+ "required": false,
3186
+ "default": null,
3187
+ "description": "Fills the container."
3188
+ },
3189
+ {
3190
+ "name": "invalid",
3191
+ "type": "boolean",
3192
+ "required": false,
3193
+ "default": null,
3194
+ "description": "Shows it as invalid; pair it with a message that says what to fix."
3195
+ },
3196
+ {
3197
+ "name": "placeholder",
3198
+ "type": "ReactNode",
3199
+ "required": false,
3200
+ "default": null,
3201
+ "description": "Text shown while nothing is chosen."
3202
+ },
3203
+ {
3204
+ "name": "size",
3205
+ "type": "\"md\" | \"sm\" | \"lg\" | \"xl\"",
3206
+ "required": false,
3207
+ "default": "md",
3208
+ "description": "The height of the pill."
3209
+ }
3210
+ ],
3211
+ "file": "src/components/command-list/picker-popover.tsx"
3212
+ }
3213
+ ],
3214
+ "variants": {
3215
+ "COMMAND_LIST": {
3216
+ "axes": {
3217
+ "height": {
3218
+ "popover": "At most 480px or 70% of the window, shrinking to its rows: a popover (default)",
3219
+ "inline": "Its rows' height up to 360px in a raised frame, kept while searching: a dialog step",
3220
+ "fill": "Fills its parent: a phone sheet or a command palette"
3221
+ },
3222
+ "size": {
3223
+ "md": "A 44px search over 34px rows (default)",
3224
+ "lg": "A 56px search over 40px rows: the command palette"
3225
+ }
3226
+ },
3227
+ "defaults": {
3228
+ "height": "popover",
3229
+ "size": "md"
3230
+ }
3231
+ },
3232
+ "PICKER_POPOVER": {
3233
+ "axes": {
3234
+ "width": {
3235
+ "sm": "320px: providers and short lists",
3236
+ "md": "400px (default)",
3237
+ "lg": "560px: models with their details"
3238
+ }
3239
+ },
3240
+ "defaults": {
3241
+ "width": "md"
3242
+ }
3243
+ }
3244
+ }
3245
+ },
2860
3246
  {
2861
3247
  "entry": "command-palette",
2862
3248
  "kind": "components",
@@ -3240,6 +3626,13 @@
3240
3626
  "default": null,
3241
3627
  "description": "Sorting happens on the server: the data arrives sorted."
3242
3628
  },
3629
+ {
3630
+ "name": "onHiddenColumnsChange",
3631
+ "type": "((ids: string[]) => void)",
3632
+ "required": false,
3633
+ "default": null,
3634
+ "description": "Called with the ids of the columns left out at the table's width, so a kept column can show what they held."
3635
+ },
3243
3636
  {
3244
3637
  "name": "onLoadMore",
3245
3638
  "type": "(() => void)",
@@ -3413,8 +3806,7 @@
3413
3806
  "type": "ReactNode",
3414
3807
  "required": false,
3415
3808
  "default": null,
3416
- "description": "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.",
3417
- "deprecated": true
3809
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
3418
3810
  },
3419
3811
  {
3420
3812
  "name": "id",
@@ -3554,8 +3946,7 @@
3554
3946
  "type": "ReactNode",
3555
3947
  "required": false,
3556
3948
  "default": null,
3557
- "description": "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.",
3558
- "deprecated": true
3949
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
3559
3950
  },
3560
3951
  {
3561
3952
  "name": "id",
@@ -3695,8 +4086,7 @@
3695
4086
  "type": "ReactNode",
3696
4087
  "required": false,
3697
4088
  "default": null,
3698
- "description": "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.",
3699
- "deprecated": true
4089
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
3700
4090
  },
3701
4091
  {
3702
4092
  "name": "id",
@@ -3995,7 +4385,7 @@
3995
4385
  },
3996
4386
  {
3997
4387
  "name": "Dialog",
3998
- "description": "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.",
4388
+ "description": "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.",
3999
4389
  "props": [
4000
4390
  {
4001
4391
  "name": "title",
@@ -4004,12 +4394,19 @@
4004
4394
  "default": null,
4005
4395
  "description": "The dialog's heading, also its accessible name."
4006
4396
  },
4397
+ {
4398
+ "name": "anchor",
4399
+ "type": "\"center\" | \"top\"",
4400
+ "required": false,
4401
+ "default": null,
4402
+ "description": "Where it sits: centered, or with a fixed top edge for content that changes height, so the title never moves."
4403
+ },
4007
4404
  {
4008
4405
  "name": "busy",
4009
4406
  "type": "boolean",
4010
4407
  "required": false,
4011
4408
  "default": null,
4012
- "description": "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."
4409
+ "description": "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."
4013
4410
  },
4014
4411
  {
4015
4412
  "name": "children",
@@ -4079,7 +4476,7 @@
4079
4476
  "type": "(() => void)",
4080
4477
  "required": false,
4081
4478
  "default": null,
4082
- "description": "⌘Enter calls this (usually the primary action)."
4479
+ "description": "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."
4083
4480
  },
4084
4481
  {
4085
4482
  "name": "open",
@@ -4088,6 +4485,13 @@
4088
4485
  "default": null,
4089
4486
  "description": "Whether it is open, when you control it."
4090
4487
  },
4488
+ {
4489
+ "name": "persistent",
4490
+ "type": "boolean",
4491
+ "required": false,
4492
+ "default": null,
4493
+ "description": "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."
4494
+ },
4091
4495
  {
4092
4496
  "name": "size",
4093
4497
  "type": "\"md\" | \"sm\" | \"lg\"",
@@ -4128,7 +4532,7 @@
4128
4532
  },
4129
4533
  {
4130
4534
  "name": "LayerDialog",
4131
- "description": "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.",
4535
+ "description": "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.",
4132
4536
  "props": [
4133
4537
  {
4134
4538
  "name": "layers",
@@ -4137,12 +4541,19 @@
4137
4541
  "default": null,
4138
4542
  "description": "The layers, each with its title, content and footer; one shows at a time, and the ones below it stay mounted and hidden."
4139
4543
  },
4544
+ {
4545
+ "name": "anchor",
4546
+ "type": "\"center\" | \"top\"",
4547
+ "required": false,
4548
+ "default": null,
4549
+ "description": "Where it sits: centered, or with a fixed top edge for layers of different heights."
4550
+ },
4140
4551
  {
4141
4552
  "name": "busy",
4142
4553
  "type": "boolean",
4143
4554
  "required": false,
4144
4555
  "default": null,
4145
- "description": "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."
4556
+ "description": "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."
4146
4557
  },
4147
4558
  {
4148
4559
  "name": "className",
@@ -4198,7 +4609,7 @@
4198
4609
  "type": "(() => void)",
4199
4610
  "required": false,
4200
4611
  "default": null,
4201
- "description": "⌘/Ctrl+Enter calls this on every layer; pass the action of the layer shown."
4612
+ "description": "Enter in a single-line field and ⌘/Ctrl+Enter call this on every layer; pass the action of the layer shown."
4202
4613
  },
4203
4614
  {
4204
4615
  "name": "open",
@@ -4207,6 +4618,13 @@
4207
4618
  "default": null,
4208
4619
  "description": "Whether it is open, when you control it."
4209
4620
  },
4621
+ {
4622
+ "name": "persistent",
4623
+ "type": "boolean",
4624
+ "required": false,
4625
+ "default": null,
4626
+ "description": "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."
4627
+ },
4210
4628
  {
4211
4629
  "name": "size",
4212
4630
  "type": "\"md\" | \"sm\" | \"lg\"",
@@ -4226,7 +4644,7 @@
4226
4644
  },
4227
4645
  {
4228
4646
  "name": "StepDialog",
4229
- "description": "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.",
4647
+ "description": "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.",
4230
4648
  "props": [
4231
4649
  {
4232
4650
  "name": "onSubmit",
@@ -4335,10 +4753,15 @@
4335
4753
  "sm": "440px: confirmations, short forms",
4336
4754
  "md": "560px: forms (default)",
4337
4755
  "lg": "720px: two columns, previews"
4756
+ },
4757
+ "anchor": {
4758
+ "center": "Centered on the screen (default)",
4759
+ "top": "A fixed top edge, for content that changes height, such as the steps of a StepDialog"
4338
4760
  }
4339
4761
  },
4340
4762
  "defaults": {
4341
- "size": "md"
4763
+ "size": "md",
4764
+ "anchor": "center"
4342
4765
  }
4343
4766
  },
4344
4767
  "LAYER_DIALOG": {
@@ -4347,10 +4770,15 @@
4347
4770
  "sm": "440px: confirmations, short forms",
4348
4771
  "md": "560px: forms (default)",
4349
4772
  "lg": "720px: two columns, previews"
4773
+ },
4774
+ "anchor": {
4775
+ "center": "Centered on the screen (default)",
4776
+ "top": "A fixed top edge, for content that changes height, such as the steps of a StepDialog"
4350
4777
  }
4351
4778
  },
4352
4779
  "defaults": {
4353
- "size": "md"
4780
+ "size": "md",
4781
+ "anchor": "center"
4354
4782
  }
4355
4783
  }
4356
4784
  }
@@ -4380,10 +4808,10 @@
4380
4808
  },
4381
4809
  {
4382
4810
  "name": "properties",
4383
- "type": "{ options: { value: string; label: string; }[]; value: string[]; onChange: (v: string[]) => void; }",
4811
+ "type": "{ options: { value: string; label: string; }[]; value: string[]; onChange: (v: string[]) => void; hidden?: string[]; }",
4384
4812
  "required": false,
4385
4813
  "default": null,
4386
- "description": "The properties shown for each item."
4814
+ "description": "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."
4387
4815
  },
4388
4816
  {
4389
4817
  "name": "rows",
@@ -4522,7 +4950,7 @@
4522
4950
  "type": "ReactNode",
4523
4951
  "required": false,
4524
4952
  "default": null,
4525
- "description": "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."
4953
+ "description": "The error message, shown under the control in the danger color: it marks the field invalid and is read out with the description."
4526
4954
  },
4527
4955
  {
4528
4956
  "name": "id",
@@ -4642,6 +5070,13 @@
4642
5070
  "default": null,
4643
5071
  "description": "Open the value menu when the chip appears: a filter just added asks for its value at once."
4644
5072
  },
5073
+ {
5074
+ "name": "groups",
5075
+ "type": "CommandListGroup[]",
5076
+ "required": false,
5077
+ "default": null,
5078
+ "description": "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."
5079
+ },
4645
5080
  {
4646
5081
  "name": "multiple",
4647
5082
  "type": "boolean",
@@ -4670,6 +5105,13 @@
4670
5105
  "default": null,
4671
5106
  "description": "Called with the chosen values."
4672
5107
  },
5108
+ {
5109
+ "name": "onValuesOpenChange",
5110
+ "type": "((open: boolean) => void)",
5111
+ "required": false,
5112
+ "default": null,
5113
+ "description": "Called when the value menu opens or closes, so a filter just added can go away when it closes without a value."
5114
+ },
4673
5115
  {
4674
5116
  "name": "operators",
4675
5117
  "type": "string[]",
@@ -4684,6 +5126,13 @@
4684
5126
  "default": null,
4685
5127
  "description": "The icon of the property the filter applies to."
4686
5128
  },
5129
+ {
5130
+ "name": "searchable",
5131
+ "type": "boolean",
5132
+ "required": false,
5133
+ "default": null,
5134
+ "description": "Gives the value menu a search field however few choices it has."
5135
+ },
4687
5136
  {
4688
5137
  "name": "selected",
4689
5138
  "type": "string[]",
@@ -4696,7 +5145,14 @@
4696
5145
  "type": "FilterChipChoice[]",
4697
5146
  "required": false,
4698
5147
  "default": null,
4699
- "description": "Choices for the value menu."
5148
+ "description": "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."
5149
+ },
5150
+ {
5151
+ "name": "width",
5152
+ "type": "\"md\" | \"sm\" | \"lg\"",
5153
+ "required": false,
5154
+ "default": null,
5155
+ "description": "How wide the searchable list opens: `sm` for providers, `lg` for models with their details."
4700
5156
  }
4701
5157
  ],
4702
5158
  "file": "src/components/filter-chip/filter-chip.tsx"
@@ -5099,8 +5555,7 @@
5099
5555
  "type": "ReactNode",
5100
5556
  "required": false,
5101
5557
  "default": null,
5102
- "description": "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.",
5103
- "deprecated": true
5558
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
5104
5559
  },
5105
5560
  {
5106
5561
  "name": "invalid",
@@ -5268,8 +5723,7 @@
5268
5723
  "type": "ReactNode",
5269
5724
  "required": false,
5270
5725
  "default": null,
5271
- "description": "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.",
5272
- "deprecated": true
5726
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
5273
5727
  },
5274
5728
  {
5275
5729
  "name": "hideStepper",
@@ -5278,6 +5732,13 @@
5278
5732
  "default": null,
5279
5733
  "description": "Hide the stepper circles."
5280
5734
  },
5735
+ {
5736
+ "name": "integer",
5737
+ "type": "boolean",
5738
+ "required": false,
5739
+ "default": null,
5740
+ "description": "Whole numbers only, such as a count of days: a numeric keypad on phones and no thousands separators in the field."
5741
+ },
5281
5742
  {
5282
5743
  "name": "invalid",
5283
5744
  "type": "boolean",
@@ -5486,8 +5947,7 @@
5486
5947
  "type": "ReactNode",
5487
5948
  "required": false,
5488
5949
  "default": null,
5489
- "description": "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.",
5490
- "deprecated": true
5950
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
5491
5951
  },
5492
5952
  {
5493
5953
  "name": "invalid",
@@ -5599,8 +6059,7 @@
5599
6059
  "type": "ReactNode",
5600
6060
  "required": false,
5601
6061
  "default": null,
5602
- "description": "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.",
5603
- "deprecated": true
6062
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
5604
6063
  },
5605
6064
  {
5606
6065
  "name": "invalid",
@@ -5719,8 +6178,7 @@
5719
6178
  "type": "ReactNode",
5720
6179
  "required": false,
5721
6180
  "default": null,
5722
- "description": "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.",
5723
- "deprecated": true
6181
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
5724
6182
  },
5725
6183
  {
5726
6184
  "name": "id",
@@ -5750,6 +6208,13 @@
5750
6208
  "default": null,
5751
6209
  "description": "The field name the value is sent under in a form."
5752
6210
  },
6211
+ {
6212
+ "name": "onInputValueChange",
6213
+ "type": "((draft: string) => void)",
6214
+ "required": false,
6215
+ "default": null,
6216
+ "description": "Called with the text typed but not added as a tag yet, so a form can count it before it is added."
6217
+ },
5753
6218
  {
5754
6219
  "name": "onValueChange",
5755
6220
  "type": "((value: string[]) => void)",
@@ -5783,14 +6248,14 @@
5783
6248
  "type": "string[]",
5784
6249
  "required": false,
5785
6250
  "default": null,
5786
- "description": "Characters that end a tag, besides Enter."
6251
+ "description": "Characters that end a tag, besides Enter; pasted text also splits at line breaks and tabs."
5787
6252
  },
5788
6253
  {
5789
6254
  "name": "validate",
5790
6255
  "type": "((tag: string) => string | true)",
5791
6256
  "required": false,
5792
6257
  "default": null,
5793
- "description": "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."
6258
+ "description": "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."
5794
6259
  },
5795
6260
  {
5796
6261
  "name": "value",
@@ -5825,8 +6290,7 @@
5825
6290
  "type": "ReactNode",
5826
6291
  "required": false,
5827
6292
  "default": null,
5828
- "description": "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.",
5829
- "deprecated": true
6293
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
5830
6294
  },
5831
6295
  {
5832
6296
  "name": "invalid",
@@ -5969,9 +6433,30 @@
5969
6433
  "kind": "components",
5970
6434
  "import": "@logicplanes/kaeso-ui/kaeso",
5971
6435
  "components": [
6436
+ {
6437
+ "name": "CapabilityIcons",
6438
+ "description": "A model's capabilities as small icons, each named in a tooltip and read as one list by screen readers.",
6439
+ "props": [
6440
+ {
6441
+ "name": "capabilities",
6442
+ "type": "Capability[]",
6443
+ "required": false,
6444
+ "default": "[]",
6445
+ "description": "The capabilities: tools, reasoning, vision, pdf, structuredOutput."
6446
+ },
6447
+ {
6448
+ "name": "className",
6449
+ "type": "string",
6450
+ "required": false,
6451
+ "default": null,
6452
+ "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6453
+ }
6454
+ ],
6455
+ "file": "src/components/kaeso/identity.tsx"
6456
+ },
5972
6457
  {
5973
6458
  "name": "ConversationView",
5974
- "description": "A model conversation from a request log: role captions, prose, tool calls and results, reasoning, images, refusals.",
6459
+ "description": "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.",
5975
6460
  "props": [
5976
6461
  {
5977
6462
  "name": "messages",
@@ -6126,6 +6611,13 @@
6126
6611
  "required": false,
6127
6612
  "default": "active",
6128
6613
  "description": "The key's state; disabled, expired and archived keys are shown dimmed."
6614
+ },
6615
+ {
6616
+ "name": "stateBadge",
6617
+ "type": "boolean",
6618
+ "required": false,
6619
+ "default": "true",
6620
+ "description": "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."
6129
6621
  }
6130
6622
  ],
6131
6623
  "file": "src/components/kaeso/identity.tsx"
@@ -6239,19 +6731,33 @@
6239
6731
  "default": null,
6240
6732
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6241
6733
  },
6734
+ {
6735
+ "name": "mark",
6736
+ "type": "boolean",
6737
+ "required": false,
6738
+ "default": "true",
6739
+ "description": "Shows the provider's mark first (default); turn it off in a list grouped under each provider's mark."
6740
+ },
6242
6741
  {
6243
6742
  "name": "name",
6244
6743
  "type": "string",
6245
6744
  "required": false,
6246
6745
  "default": null,
6247
6746
  "description": "The display name, first."
6747
+ },
6748
+ {
6749
+ "name": "providerName",
6750
+ "type": "string",
6751
+ "required": false,
6752
+ "default": null,
6753
+ "description": "The provider's name from the gateway's provider list, which names its mark for screen readers; the id without it."
6248
6754
  }
6249
6755
  ],
6250
6756
  "file": "src/components/kaeso/identity.tsx"
6251
6757
  },
6252
6758
  {
6253
6759
  "name": "ProviderBadge",
6254
- "description": "A provider's mark on a quiet tile, in the text color so it follows the theme; a letter for providers without one.",
6760
+ "description": "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.",
6255
6761
  "props": [
6256
6762
  {
6257
6763
  "name": "provider",
@@ -6267,6 +6773,13 @@
6267
6773
  "default": null,
6268
6774
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6269
6775
  },
6776
+ {
6777
+ "name": "name",
6778
+ "type": "string",
6779
+ "required": false,
6780
+ "default": null,
6781
+ "description": "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."
6782
+ },
6270
6783
  {
6271
6784
  "name": "size",
6272
6785
  "type": "\"md\" | \"sm\" | \"lg\" | \"xl\"",
@@ -6293,52 +6806,193 @@
6293
6806
  "type": "boolean",
6294
6807
  "required": true,
6295
6808
  "default": null,
6296
- "description": "Whether requests can reach the provider."
6809
+ "description": "Whether requests can reach the provider."
6810
+ },
6811
+ {
6812
+ "name": "provider",
6813
+ "type": "string",
6814
+ "required": true,
6815
+ "default": null,
6816
+ "description": "The provider id, such as `openai` or `anthropic`."
6817
+ },
6818
+ {
6819
+ "name": "status",
6820
+ "type": "ReactNode",
6821
+ "required": true,
6822
+ "default": null,
6823
+ "description": "Where the key comes from, or what's missing: \"The organization's key\", \"No key yet\"."
6824
+ },
6825
+ {
6826
+ "name": "actions",
6827
+ "type": "ReactNode",
6828
+ "required": false,
6829
+ "default": null,
6830
+ "description": "Buttons: one primary at most."
6831
+ },
6832
+ {
6833
+ "name": "className",
6834
+ "type": "string",
6835
+ "required": false,
6836
+ "default": null,
6837
+ "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6838
+ },
6839
+ {
6840
+ "name": "detail",
6841
+ "type": "ReactNode",
6842
+ "required": false,
6843
+ "default": null,
6844
+ "description": "A line under the provider's name, such as how many keys it has."
6845
+ },
6846
+ {
6847
+ "name": "keyLabel",
6848
+ "type": "ReactNode",
6849
+ "required": false,
6850
+ "default": null,
6851
+ "description": "The key: its name and last four characters, and when it was last used."
6852
+ },
6853
+ {
6854
+ "name": "name",
6855
+ "type": "string",
6856
+ "required": false,
6857
+ "default": null,
6858
+ "description": "The provider's name from the gateway's provider list, as the card's title; the id without it."
6859
+ }
6860
+ ],
6861
+ "file": "src/components/kaeso/identity.tsx"
6862
+ },
6863
+ {
6864
+ "name": "ProviderPicker",
6865
+ "description": "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.",
6866
+ "props": [
6867
+ {
6868
+ "name": "providers",
6869
+ "type": "ProviderPickerOption[]",
6870
+ "required": true,
6871
+ "default": null,
6872
+ "description": "The providers: id, name, whether the organization has connected it, and a short hint such as its key count."
6873
+ },
6874
+ {
6875
+ "name": "allLabel",
6876
+ "type": "string",
6877
+ "required": false,
6878
+ "default": null,
6879
+ "description": "Select only: a first option for no provider in particular, such as \"All providers\"; choosing it reports `null`."
6880
+ },
6881
+ {
6882
+ "name": "appearance",
6883
+ "type": "\"list\" | \"select\"",
6884
+ "required": false,
6885
+ "default": null,
6886
+ "description": "An always-open list for a dialog step, or a pill that opens it."
6887
+ },
6888
+ {
6889
+ "name": "aria-label",
6890
+ "type": "string",
6891
+ "required": false,
6892
+ "default": null,
6893
+ "description": "The accessible name, for when there is no visible label."
6894
+ },
6895
+ {
6896
+ "name": "autoFocus",
6897
+ "type": "boolean",
6898
+ "required": false,
6899
+ "default": null,
6900
+ "description": "List only: focuses the search field when it appears."
6901
+ },
6902
+ {
6903
+ "name": "className",
6904
+ "type": "string",
6905
+ "required": false,
6906
+ "default": null,
6907
+ "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6908
+ },
6909
+ {
6910
+ "name": "data-force",
6911
+ "type": "string",
6912
+ "required": false,
6913
+ "default": null,
6914
+ "description": "Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`."
6915
+ },
6916
+ {
6917
+ "name": "description",
6918
+ "type": "ReactNode",
6919
+ "required": false,
6920
+ "default": null,
6921
+ "description": "One sentence of help under the label."
6922
+ },
6923
+ {
6924
+ "name": "disabled",
6925
+ "type": "boolean",
6926
+ "required": false,
6927
+ "default": null,
6928
+ "description": "Turns it off: it can't be used, and it looks dimmed."
6929
+ },
6930
+ {
6931
+ "name": "error",
6932
+ "type": "ReactNode",
6933
+ "required": false,
6934
+ "default": null,
6935
+ "description": "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.",
6936
+ "deprecated": true
6937
+ },
6938
+ {
6939
+ "name": "label",
6940
+ "type": "ReactNode",
6941
+ "required": false,
6942
+ "default": null,
6943
+ "description": "The visible label."
6944
+ },
6945
+ {
6946
+ "name": "layout",
6947
+ "type": "\"horizontal\" | \"vertical\"",
6948
+ "required": false,
6949
+ "default": null,
6950
+ "description": "The label above the control (`vertical`) or beside it (`horizontal`)."
6297
6951
  },
6298
6952
  {
6299
- "name": "provider",
6300
- "type": "string",
6301
- "required": true,
6953
+ "name": "onValueChange",
6954
+ "type": "((id: string | null) => void)",
6955
+ "required": false,
6302
6956
  "default": null,
6303
- "description": "The provider id, such as `openai` or `anthropic`."
6957
+ "description": "Called with the chosen provider's id, or `null` for `allLabel`."
6304
6958
  },
6305
6959
  {
6306
- "name": "status",
6307
- "type": "ReactNode",
6308
- "required": true,
6960
+ "name": "optional",
6961
+ "type": "boolean",
6962
+ "required": false,
6309
6963
  "default": null,
6310
- "description": "Where the key comes from, or what's missing: \"The organization's key\", \"No key yet\"."
6964
+ "description": "Adds “Optional” to the label, for forms where most fields are required."
6311
6965
  },
6312
6966
  {
6313
- "name": "actions",
6314
- "type": "ReactNode",
6967
+ "name": "placeholder",
6968
+ "type": "string",
6315
6969
  "required": false,
6316
6970
  "default": null,
6317
- "description": "Buttons: one primary at most."
6971
+ "description": "The search field's placeholder; in a pill without `allLabel`, also the text shown while nothing is chosen."
6318
6972
  },
6319
6973
  {
6320
- "name": "className",
6321
- "type": "string",
6974
+ "name": "required",
6975
+ "type": "boolean",
6322
6976
  "required": false,
6323
6977
  "default": null,
6324
- "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6978
+ "description": "Marks it as required in a form."
6325
6979
  },
6326
6980
  {
6327
- "name": "detail",
6328
- "type": "ReactNode",
6981
+ "name": "size",
6982
+ "type": "\"md\" | \"sm\"",
6329
6983
  "required": false,
6330
6984
  "default": null,
6331
- "description": "A line under the provider's name, such as how many keys it has."
6985
+ "description": "Select only: the height of the pill."
6332
6986
  },
6333
6987
  {
6334
- "name": "keyLabel",
6335
- "type": "ReactNode",
6988
+ "name": "value",
6989
+ "type": "string | null",
6336
6990
  "required": false,
6337
6991
  "default": null,
6338
- "description": "The key: its name and last four characters, and when it was last used."
6992
+ "description": "The chosen provider's id, when you control it."
6339
6993
  }
6340
6994
  ],
6341
- "file": "src/components/kaeso/identity.tsx"
6995
+ "file": "src/components/kaeso/provider-picker.tsx"
6342
6996
  },
6343
6997
  {
6344
6998
  "name": "RequestTimeline",
@@ -6622,7 +7276,7 @@
6622
7276
  "type": "Partial<Record<\"input\" | \"output\" | \"cacheRead\" | \"cacheWrite\" | \"reasoning\", number>>",
6623
7277
  "required": true,
6624
7278
  "default": null,
6625
- "description": "Tokens by kind: input, output, cache reads and writes, reasoning."
7279
+ "description": "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."
6626
7280
  },
6627
7281
  {
6628
7282
  "name": "className",
@@ -6680,6 +7334,17 @@
6680
7334
  "secret": "md"
6681
7335
  }
6682
7336
  },
7337
+ "PROVIDER_PICKER": {
7338
+ "axes": {
7339
+ "appearance": {
7340
+ "list": "A search field over every provider, always open: a dialog step (default)",
7341
+ "select": "A pill that opens the searchable list: forms and toolbars"
7342
+ }
7343
+ },
7344
+ "defaults": {
7345
+ "appearance": "list"
7346
+ }
7347
+ },
6683
7348
  "RIGHTS_MATRIX": {
6684
7349
  "axes": {
6685
7350
  "origin": {
@@ -6905,7 +7570,7 @@
6905
7570
  "props": [
6906
7571
  {
6907
7572
  "name": "align",
6908
- "type": "\"start\" | \"end\" | \"baseline\" | \"stretch\" | \"center\"",
7573
+ "type": "\"start\" | \"end\" | \"center\" | \"baseline\" | \"stretch\"",
6909
7574
  "required": false,
6910
7575
  "default": "center",
6911
7576
  "description": "How items line up within their cells."
@@ -6940,7 +7605,7 @@
6940
7605
  "props": [
6941
7606
  {
6942
7607
  "name": "align",
6943
- "type": "\"start\" | \"end\" | \"baseline\" | \"stretch\" | \"center\"",
7608
+ "type": "\"start\" | \"end\" | \"center\" | \"baseline\" | \"stretch\"",
6944
7609
  "required": false,
6945
7610
  "default": "center",
6946
7611
  "description": "How items line up across the row."
@@ -6982,7 +7647,7 @@
6982
7647
  "props": [
6983
7648
  {
6984
7649
  "name": "align",
6985
- "type": "\"start\" | \"end\" | \"baseline\" | \"stretch\" | \"center\"",
7650
+ "type": "\"start\" | \"end\" | \"center\" | \"baseline\" | \"stretch\"",
6986
7651
  "required": false,
6987
7652
  "default": "center",
6988
7653
  "description": "How items line up across the column."
@@ -7313,6 +7978,13 @@
7313
7978
  "required": false,
7314
7979
  "default": "100",
7315
7980
  "description": "Virtualize above this many rows (100)."
7981
+ },
7982
+ {
7983
+ "name": "wrapSubtitle",
7984
+ "type": "boolean",
7985
+ "required": false,
7986
+ "default": "false",
7987
+ "description": "Lets a subtitle under its title wrap instead of ending with an ellipsis, for descriptions people read in full."
7316
7988
  }
7317
7989
  ],
7318
7990
  "file": "src/components/list/list.tsx"
@@ -7425,6 +8097,13 @@
7425
8097
  "required": false,
7426
8098
  "default": null,
7427
8099
  "description": "Shows checkboxes on every row while some are selected."
8100
+ },
8101
+ {
8102
+ "name": "wrapSubtitle",
8103
+ "type": "boolean",
8104
+ "required": false,
8105
+ "default": "false",
8106
+ "description": "Lets a subtitle under its title wrap. Set by `List`."
7428
8107
  }
7429
8108
  ],
7430
8109
  "file": "src/components/list/list.tsx"
@@ -8617,20 +9296,27 @@
8617
9296
  },
8618
9297
  {
8619
9298
  "name": "ModelPicker",
8620
- "description": "A model, picked from the project's catalogue: the provider mark, name and id (ModelLabel), grouped by provider.",
9299
+ "description": "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.",
8621
9300
  "props": [
8622
9301
  {
8623
9302
  "name": "options",
8624
9303
  "type": "ModelPickerOption[]",
8625
9304
  "required": true,
8626
9305
  "default": null,
8627
- "description": "The models to choose from."
9306
+ "description": "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."
9307
+ },
9308
+ {
9309
+ "name": "allLabel",
9310
+ "type": "string",
9311
+ "required": false,
9312
+ "default": null,
9313
+ "description": "Single only: a first option for no model in particular, such as \"All models\"; choosing it reports an empty string."
8628
9314
  },
8629
9315
  {
8630
9316
  "name": "appearance",
8631
9317
  "type": "\"ghost\" | \"default\"",
8632
9318
  "required": false,
8633
- "default": "ghost",
9319
+ "default": null,
8634
9320
  "description": "A quiet button (`ghost`) or a filled one (`default`)."
8635
9321
  },
8636
9322
  {
@@ -8656,10 +9342,17 @@
8656
9342
  },
8657
9343
  {
8658
9344
  "name": "defaultValue",
8659
- "type": "string | null",
9345
+ "type": "string | string[] | null",
9346
+ "required": false,
9347
+ "default": null,
9348
+ "description": "The chosen model, or models with `multiple`, on first render."
9349
+ },
9350
+ {
9351
+ "name": "description",
9352
+ "type": "ReactNode",
8660
9353
  "required": false,
8661
9354
  "default": null,
8662
- "description": "The chosen model on first render."
9355
+ "description": "One sentence of help under the label."
8663
9356
  },
8664
9357
  {
8665
9358
  "name": "disabled",
@@ -8668,6 +9361,21 @@
8668
9361
  "default": null,
8669
9362
  "description": "Turns it off: it can't be used, and it looks dimmed."
8670
9363
  },
9364
+ {
9365
+ "name": "error",
9366
+ "type": "ReactNode",
9367
+ "required": false,
9368
+ "default": null,
9369
+ "description": "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.",
9370
+ "deprecated": true
9371
+ },
9372
+ {
9373
+ "name": "fullWidth",
9374
+ "type": "boolean",
9375
+ "required": false,
9376
+ "default": null,
9377
+ "description": "Fills the container."
9378
+ },
8671
9379
  {
8672
9380
  "name": "groupByProvider",
8673
9381
  "type": "boolean",
@@ -8675,12 +9383,61 @@
8675
9383
  "default": null,
8676
9384
  "description": "Groups the list by provider (true by default when there are several)."
8677
9385
  },
9386
+ {
9387
+ "name": "invalid",
9388
+ "type": "boolean",
9389
+ "required": false,
9390
+ "default": null,
9391
+ "description": "Shows it as invalid; pair it with a message that says what to fix."
9392
+ },
9393
+ {
9394
+ "name": "label",
9395
+ "type": "ReactNode",
9396
+ "required": false,
9397
+ "default": null,
9398
+ "description": "The visible label."
9399
+ },
9400
+ {
9401
+ "name": "layout",
9402
+ "type": "\"horizontal\" | \"vertical\"",
9403
+ "required": false,
9404
+ "default": null,
9405
+ "description": "The label above the control (`vertical`) or beside it (`horizontal`)."
9406
+ },
9407
+ {
9408
+ "name": "multiple",
9409
+ "type": "boolean",
9410
+ "required": false,
9411
+ "default": null,
9412
+ "description": "Allows choosing several models; `value` is then a list."
9413
+ },
9414
+ {
9415
+ "name": "onOpenChange",
9416
+ "type": "((open: boolean) => void)",
9417
+ "required": false,
9418
+ "default": null,
9419
+ "description": "Called when the list opens or closes."
9420
+ },
8678
9421
  {
8679
9422
  "name": "onValueChange",
8680
- "type": "((value: string) => void)",
9423
+ "type": "((value: string) => void) | ((value: string[]) => void)",
9424
+ "required": false,
9425
+ "default": null,
9426
+ "description": "Called with the chosen model, or the list of models with `multiple`."
9427
+ },
9428
+ {
9429
+ "name": "open",
9430
+ "type": "boolean",
9431
+ "required": false,
9432
+ "default": null,
9433
+ "description": "Whether the list is open, when you control it."
9434
+ },
9435
+ {
9436
+ "name": "optional",
9437
+ "type": "boolean",
8681
9438
  "required": false,
8682
9439
  "default": null,
8683
- "description": "Called with the chosen model."
9440
+ "description": "Adds “Optional” to the label, for forms where most fields are required."
8684
9441
  },
8685
9442
  {
8686
9443
  "name": "placeholder",
@@ -8689,19 +9446,40 @@
8689
9446
  "default": null,
8690
9447
  "description": "Text shown while there is no value."
8691
9448
  },
9449
+ {
9450
+ "name": "providers",
9451
+ "type": "ModelPickerProvider[]",
9452
+ "required": false,
9453
+ "default": null,
9454
+ "description": "The providers' names and whether each is connected; connected providers come first."
9455
+ },
9456
+ {
9457
+ "name": "recent",
9458
+ "type": "readonly string[]",
9459
+ "required": false,
9460
+ "default": null,
9461
+ "description": "Values of recently used models, shown first while the search is empty."
9462
+ },
9463
+ {
9464
+ "name": "required",
9465
+ "type": "boolean",
9466
+ "required": false,
9467
+ "default": null,
9468
+ "description": "Marks it as required in a form."
9469
+ },
8692
9470
  {
8693
9471
  "name": "size",
8694
9472
  "type": "\"md\" | \"sm\"",
8695
9473
  "required": false,
8696
- "default": "sm",
9474
+ "default": null,
8697
9475
  "description": "The button's height."
8698
9476
  },
8699
9477
  {
8700
9478
  "name": "value",
8701
- "type": "string | null",
9479
+ "type": "string | string[] | null",
8702
9480
  "required": false,
8703
9481
  "default": null,
8704
- "description": "The chosen model, when you control it."
9482
+ "description": "The chosen model, or models with `multiple`, when you control it."
8705
9483
  }
8706
9484
  ],
8707
9485
  "file": "src/components/playground/model-picker.tsx"
@@ -8937,9 +9715,86 @@
8937
9715
  ],
8938
9716
  "file": "src/components/playground/prompt-suggestions.tsx"
8939
9717
  },
9718
+ {
9719
+ "name": "Reasoning",
9720
+ "description": "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.",
9721
+ "props": [
9722
+ {
9723
+ "name": "children",
9724
+ "type": "ReactNode",
9725
+ "required": false,
9726
+ "default": null,
9727
+ "description": "What the open disclosure shows in place of `text`, such as why the reasoning can't be shown."
9728
+ },
9729
+ {
9730
+ "name": "className",
9731
+ "type": "string",
9732
+ "required": false,
9733
+ "default": null,
9734
+ "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
9735
+ },
9736
+ {
9737
+ "name": "defaultOpen",
9738
+ "type": "boolean",
9739
+ "required": false,
9740
+ "default": null,
9741
+ "description": "Whether it starts open."
9742
+ },
9743
+ {
9744
+ "name": "duration",
9745
+ "type": "number",
9746
+ "required": false,
9747
+ "default": null,
9748
+ "description": "How long the model reasoned, in milliseconds: “Thought for 4.2 s”."
9749
+ },
9750
+ {
9751
+ "name": "hint",
9752
+ "type": "ReactNode",
9753
+ "required": false,
9754
+ "default": null,
9755
+ "description": "A short note beside the title, such as “Redacted by the provider”; while `live`, the latest line of the reasoning shows there instead."
9756
+ },
9757
+ {
9758
+ "name": "live",
9759
+ "type": "boolean",
9760
+ "required": false,
9761
+ "default": "false",
9762
+ "description": "The reasoning is still arriving: “Thinking” pulses quietly and its latest line shows beside it."
9763
+ },
9764
+ {
9765
+ "name": "onOpenChange",
9766
+ "type": "((open: boolean) => void)",
9767
+ "required": false,
9768
+ "default": null,
9769
+ "description": "Called when it opens or closes."
9770
+ },
9771
+ {
9772
+ "name": "open",
9773
+ "type": "boolean",
9774
+ "required": false,
9775
+ "default": null,
9776
+ "description": "Whether it is open, when you control it."
9777
+ },
9778
+ {
9779
+ "name": "text",
9780
+ "type": "string",
9781
+ "required": false,
9782
+ "default": "",
9783
+ "description": "The reasoning, as Markdown."
9784
+ },
9785
+ {
9786
+ "name": "title",
9787
+ "type": "ReactNode",
9788
+ "required": false,
9789
+ "default": null,
9790
+ "description": "The title in place of “Thinking” or “Thought for …”, such as “Reasoning” in a request log."
9791
+ }
9792
+ ],
9793
+ "file": "src/components/playground/reasoning.tsx"
9794
+ },
8940
9795
  {
8941
9796
  "name": "ResponseMetrics",
8942
- "description": "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.",
9797
+ "description": "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.",
8943
9798
  "props": [
8944
9799
  {
8945
9800
  "name": "className",
@@ -8953,7 +9808,7 @@
8953
9808
  "type": "string | null",
8954
9809
  "required": false,
8955
9810
  "default": null,
8956
- "description": "USD as a decimal string: \"0.004213\"."
9811
+ "description": "USD as a decimal string: \"0.004213\" reads \"$0.004213\", and zero reads \"$0\"."
8957
9812
  },
8958
9813
  {
8959
9814
  "name": "duration",
@@ -9023,7 +9878,7 @@
9023
9878
  },
9024
9879
  {
9025
9880
  "name": "ResponseView",
9026
- "description": "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.",
9881
+ "description": "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.",
9027
9882
  "props": [
9028
9883
  {
9029
9884
  "name": "aria-label",
@@ -9046,6 +9901,13 @@
9046
9901
  "default": null,
9047
9902
  "description": "Whether the reasoning starts expanded."
9048
9903
  },
9904
+ {
9905
+ "name": "error",
9906
+ "type": "string",
9907
+ "required": false,
9908
+ "default": null,
9909
+ "description": "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."
9910
+ },
9049
9911
  {
9050
9912
  "name": "footer",
9051
9913
  "type": "ReactNode",
@@ -9053,6 +9915,13 @@
9053
9915
  "default": null,
9054
9916
  "description": "Under the response: its metrics, actions."
9055
9917
  },
9918
+ {
9919
+ "name": "incompleteReason",
9920
+ "type": "string",
9921
+ "required": false,
9922
+ "default": null,
9923
+ "description": "Why the model cut the reply off, with status \"incomplete\": `max_output_tokens` reads \"Stopped at the output limit\", `content_filter` names the filter."
9924
+ },
9056
9925
  {
9057
9926
  "name": "onReasoningOpenChange",
9058
9927
  "type": "((open: boolean) => void)",
@@ -9065,7 +9934,7 @@
9065
9934
  "type": "(() => void)",
9066
9935
  "required": false,
9067
9936
  "default": null,
9068
- "description": "Sends the turn again; shown with an error or a stop."
9937
+ "description": "Sends the turn again; shown with an error, a stop or a cut-off reply."
9069
9938
  },
9070
9939
  {
9071
9940
  "name": "reasoning",
@@ -9090,10 +9959,10 @@
9090
9959
  },
9091
9960
  {
9092
9961
  "name": "status",
9093
- "type": "\"done\" | \"error\" | \"streaming\" | \"pending\" | \"stopped\"",
9962
+ "type": "\"done\" | \"error\" | \"streaming\" | \"pending\" | \"stopped\" | \"incomplete\"",
9094
9963
  "required": false,
9095
9964
  "default": "done",
9096
- "description": "Where the reply stands: waiting, streaming, done, stopped or failed."
9965
+ "description": "Where the reply stands: waiting, streaming, done, stopped, cut off by the model (incomplete) or failed."
9097
9966
  },
9098
9967
  {
9099
9968
  "name": "text",
@@ -9218,6 +10087,17 @@
9218
10087
  "align": "start"
9219
10088
  }
9220
10089
  },
10090
+ "REASONING": {
10091
+ "axes": {
10092
+ "state": {
10093
+ "done": "Finished: “Thought for 4.2 s”, closed until opened (default)",
10094
+ "live": "Still reasoning: “Thinking” pulses quietly and the latest line shows beside it"
10095
+ }
10096
+ },
10097
+ "defaults": {
10098
+ "state": "done"
10099
+ }
10100
+ },
9221
10101
  "RESPONSE_METRICS": {
9222
10102
  "axes": {
9223
10103
  "size": {
@@ -9236,7 +10116,8 @@
9236
10116
  "streaming": "Arriving: the text grows, earlier lines never re-wrap; Thinking is live",
9237
10117
  "done": "Complete (default)",
9238
10118
  "stopped": "Stopped by the person: the text so far and “Stopped”",
9239
- "error": "Failed: “No response” and Retry. The error itself is a toast"
10119
+ "incomplete": "Cut off by the model: the text so far and why, such as “Stopped at the output limit”",
10120
+ "error": "Failed: the error in place of the response, and Retry"
9240
10121
  }
9241
10122
  },
9242
10123
  "defaults": {
@@ -9697,14 +10578,14 @@
9697
10578
  "type": "string",
9698
10579
  "required": true,
9699
10580
  "default": null,
9700
- "description": "What the picture shows, read by screen readers: \"Kaeso 0.3.0\"."
10581
+ "description": "What the picture shows, read by screen readers: \"Kaeso 0.1.0\"."
9701
10582
  },
9702
10583
  {
9703
10584
  "name": "seed",
9704
10585
  "type": "string",
9705
10586
  "required": true,
9706
10587
  "default": null,
9707
- "description": "What the artwork is drawn from when there is no `art`, e.g. `0.3.0`; the same seed always draws the same picture."
10588
+ "description": "What the artwork is drawn from when there is no `art`, e.g. `0.1.0`; the same seed always draws the same picture."
9708
10589
  },
9709
10590
  {
9710
10591
  "name": "art",
@@ -9734,6 +10615,13 @@
9734
10615
  "default": "banner",
9735
10616
  "description": "The artwork's aspect ratio."
9736
10617
  },
10618
+ {
10619
+ "name": "src",
10620
+ "type": "string",
10621
+ "required": false,
10622
+ "default": null,
10623
+ "description": "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."
10624
+ },
9737
10625
  {
9738
10626
  "name": "title",
9739
10627
  "type": "ReactNode",
@@ -10211,8 +11099,7 @@
10211
11099
  "type": "ReactNode",
10212
11100
  "required": false,
10213
11101
  "default": null,
10214
- "description": "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.",
10215
- "deprecated": true
11102
+ "description": "The error message, shown under the control in the danger color; it marks the control invalid and is read out with its description."
10216
11103
  },
10217
11104
  {
10218
11105
  "name": "fullWidth",
@@ -10586,7 +11473,7 @@
10586
11473
  "components": [
10587
11474
  {
10588
11475
  "name": "Sheet",
10589
- "description": "A panel that slides in from the edge of the screen, for details and longer forms.",
11476
+ "description": "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.",
10590
11477
  "props": [
10591
11478
  {
10592
11479
  "name": "children",
@@ -11098,6 +11985,13 @@
11098
11985
  "default": null,
11099
11986
  "description": "A quiet line under the number: \"vs. the previous 30 days\", \"0.4% of requests\"."
11100
11987
  },
11988
+ {
11989
+ "name": "loading",
11990
+ "type": "boolean",
11991
+ "required": false,
11992
+ "default": null,
11993
+ "description": "While the numbers load: the value, the change and the trend show their shape at the tile's final height."
11994
+ },
11101
11995
  {
11102
11996
  "name": "trend",
11103
11997
  "type": "number[]",