@logicplanes/kaeso-ui 0.4.4 → 0.4.5

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 (482) hide show
  1. package/ai/component-guides.md +250 -98
  2. package/ai/component-registry.json +264 -236
  3. package/ai/component-registry.md +222 -218
  4. package/ai/icons.md +1 -1
  5. package/ai/tokens.md +18 -14
  6. package/dist/blocks/delete-resource.js +3 -3
  7. package/dist/blocks/delete-resource.js.map +1 -1
  8. package/dist/blocks/pages.js +47 -42
  9. package/dist/blocks/pages.js.map +1 -1
  10. package/dist/blocks/resource-list.js +68 -55
  11. package/dist/blocks/resource-list.js.map +1 -1
  12. package/dist/chunks/agent-avatar-DHieggHK.js +188 -0
  13. package/dist/chunks/agent-avatar-DHieggHK.js.map +1 -0
  14. package/dist/chunks/app-frame-DysOel2X.js +232 -0
  15. package/dist/chunks/app-frame-DysOel2X.js.map +1 -0
  16. package/dist/chunks/arrow-focus-B0KdRFX8.js +20 -0
  17. package/dist/chunks/arrow-focus-B0KdRFX8.js.map +1 -0
  18. package/dist/chunks/avatar-CYNMK7uY.js +110 -0
  19. package/dist/chunks/avatar-CYNMK7uY.js.map +1 -0
  20. package/dist/chunks/badge-C0GC3B9X.js +27 -0
  21. package/dist/chunks/badge-C0GC3B9X.js.map +1 -0
  22. package/dist/chunks/banner-B3DGLTBu.js +88 -0
  23. package/dist/chunks/banner-B3DGLTBu.js.map +1 -0
  24. package/dist/chunks/button-IblhXUyZ.js +202 -0
  25. package/dist/chunks/button-IblhXUyZ.js.map +1 -0
  26. package/dist/chunks/{calendar-BWaf2MXc.js → calendar-Dc6_dl0f.js} +4 -4
  27. package/dist/chunks/calendar-Dc6_dl0f.js.map +1 -0
  28. package/dist/chunks/checkbox-9tbimmF3.js +141 -0
  29. package/dist/chunks/checkbox-9tbimmF3.js.map +1 -0
  30. package/dist/chunks/{cn-Dj6sRgkF.js → cn-BjnOAUrA.js} +45 -4
  31. package/dist/chunks/cn-BjnOAUrA.js.map +1 -0
  32. package/dist/chunks/code-block-64e-Cy1S.js +346 -0
  33. package/dist/chunks/code-block-64e-Cy1S.js.map +1 -0
  34. package/dist/chunks/{code-block-DdNPHEzI.js → code-block-KIvuE8jg.js} +122 -114
  35. package/dist/chunks/code-block-KIvuE8jg.js.map +1 -0
  36. package/dist/chunks/{code-tqj0uhBL.js → code-xqjww4Pv.js} +5 -6
  37. package/dist/chunks/code-xqjww4Pv.js.map +1 -0
  38. package/dist/chunks/combobox-DkcjkWc6.js +352 -0
  39. package/dist/chunks/combobox-DkcjkWc6.js.map +1 -0
  40. package/dist/chunks/command-list-CypqsC4T.js +456 -0
  41. package/dist/chunks/command-list-CypqsC4T.js.map +1 -0
  42. package/dist/chunks/{copy-button-FJvPJn72.js → copy-button-CwU8t_9_.js} +22 -15
  43. package/dist/chunks/copy-button-CwU8t_9_.js.map +1 -0
  44. package/dist/chunks/core-CmK-8ObW.js +505 -0
  45. package/dist/chunks/core-CmK-8ObW.js.map +1 -0
  46. package/dist/chunks/data-table-CqY8_6IS.js +581 -0
  47. package/dist/chunks/data-table-CqY8_6IS.js.map +1 -0
  48. package/dist/chunks/date-popup-DAnjptFt.js +58 -0
  49. package/dist/chunks/date-popup-DAnjptFt.js.map +1 -0
  50. package/dist/chunks/{de-D_0mmG-k.js → de-CqC4aSIV.js} +74 -40
  51. package/dist/chunks/de-CqC4aSIV.js.map +1 -0
  52. package/dist/chunks/{dialog-Cg9A_6SF.js → dialog-2zb6ClNR.js} +156 -134
  53. package/dist/chunks/dialog-2zb6ClNR.js.map +1 -0
  54. package/dist/chunks/disclosure-BtYRTDO3.js +22 -0
  55. package/dist/chunks/disclosure-BtYRTDO3.js.map +1 -0
  56. package/dist/chunks/domain-obd_w9xk.js +28 -0
  57. package/dist/chunks/domain-obd_w9xk.js.map +1 -0
  58. package/dist/chunks/{empty-DvhyMXQq.js → empty-BpiUgGzm.js} +2 -2
  59. package/dist/chunks/{empty-DvhyMXQq.js.map → empty-BpiUgGzm.js.map} +1 -1
  60. package/dist/chunks/{field-TviMvYa2.js → field-D7m-yl-D.js} +37 -34
  61. package/dist/chunks/field-D7m-yl-D.js.map +1 -0
  62. package/dist/chunks/{icon-D7ja-_Yk.js → icon-CBzOwqrX.js} +7 -6
  63. package/dist/chunks/{icon-D7ja-_Yk.js.map → icon-CBzOwqrX.js.map} +1 -1
  64. package/dist/chunks/{icon-button-CrdF_eMG.js → icon-button-Dfwpvmav.js} +7 -6
  65. package/dist/chunks/icon-button-Dfwpvmav.js.map +1 -0
  66. package/dist/chunks/{identity-BmhQ6BQ-.js → identity-3Foi5F8w.js} +7 -7
  67. package/dist/chunks/{identity-BmhQ6BQ-.js.map → identity-3Foi5F8w.js.map} +1 -1
  68. package/dist/chunks/{input-2VJuj_M4.js → input-Bo5-UZg2.js} +15 -9
  69. package/dist/chunks/input-Bo5-UZg2.js.map +1 -0
  70. package/dist/chunks/{input-group-DQ_4DoXg.js → input-group-jPcK9T_a.js} +42 -29
  71. package/dist/chunks/input-group-jPcK9T_a.js.map +1 -0
  72. package/dist/chunks/iso-field-DoqHBg8n.js +52 -0
  73. package/dist/chunks/iso-field-DoqHBg8n.js.map +1 -0
  74. package/dist/chunks/json-view-DZ2nL2Ir.js +253 -0
  75. package/dist/chunks/json-view-DZ2nL2Ir.js.map +1 -0
  76. package/dist/chunks/{kbd-BF1vKXJf.js → kbd-8A0ML_up.js} +30 -28
  77. package/dist/chunks/kbd-8A0ML_up.js.map +1 -0
  78. package/dist/chunks/label-DW24Aj0Z.js +26 -0
  79. package/dist/chunks/label-DW24Aj0Z.js.map +1 -0
  80. package/dist/chunks/{link-KWI7PevW.js → link-CMjkcLQK.js} +14 -14
  81. package/dist/chunks/link-CMjkcLQK.js.map +1 -0
  82. package/dist/chunks/list-B4G-sWwV.js +540 -0
  83. package/dist/chunks/list-B4G-sWwV.js.map +1 -0
  84. package/dist/chunks/{loader-DCfPndXa.js → loader-zo8CCIGJ.js} +2 -2
  85. package/dist/chunks/{loader-DCfPndXa.js.map → loader-zo8CCIGJ.js.map} +1 -1
  86. package/dist/chunks/markdown-C565aBR7.js +338 -0
  87. package/dist/chunks/markdown-C565aBR7.js.map +1 -0
  88. package/dist/chunks/menu-Clvv6ftq.js +485 -0
  89. package/dist/chunks/menu-Clvv6ftq.js.map +1 -0
  90. package/dist/chunks/merge-refs-BN1FyQt9.js +20 -0
  91. package/dist/chunks/merge-refs-BN1FyQt9.js.map +1 -0
  92. package/dist/chunks/meter-CASMHlxl.js +100 -0
  93. package/dist/chunks/meter-CASMHlxl.js.map +1 -0
  94. package/dist/chunks/nav-sheet-Dt6JSvzX.js +67 -0
  95. package/dist/chunks/nav-sheet-Dt6JSvzX.js.map +1 -0
  96. package/dist/chunks/{nav-wordmark-_pjheAsZ.js → nav-wordmark-J4pB_vjr.js} +4 -8
  97. package/dist/chunks/nav-wordmark-J4pB_vjr.js.map +1 -0
  98. package/dist/chunks/page-header-kS5tdmvb.js +45 -0
  99. package/dist/chunks/page-header-kS5tdmvb.js.map +1 -0
  100. package/dist/chunks/pagination-D7fAm8qg.js +147 -0
  101. package/dist/chunks/pagination-D7fAm8qg.js.map +1 -0
  102. package/dist/chunks/picker-popover-1FHb1LQG.js +119 -0
  103. package/dist/chunks/picker-popover-1FHb1LQG.js.map +1 -0
  104. package/dist/chunks/popover-Bl5QYqnh.js +51 -0
  105. package/dist/chunks/popover-Bl5QYqnh.js.map +1 -0
  106. package/dist/chunks/{portal-context-BBbzDKmY.js → portal-context-CTatR2Z8.js} +14 -4
  107. package/dist/chunks/portal-context-CTatR2Z8.js.map +1 -0
  108. package/dist/chunks/{radio-CDDFpdtL.js → radio-C6GtzF_t.js} +38 -23
  109. package/dist/chunks/radio-C6GtzF_t.js.map +1 -0
  110. package/dist/chunks/range-popup-lGiZsG3s.js +160 -0
  111. package/dist/chunks/range-popup-lGiZsG3s.js.map +1 -0
  112. package/dist/chunks/reasoning-frame-C3HdQRRS.js +51 -0
  113. package/dist/chunks/reasoning-frame-C3HdQRRS.js.map +1 -0
  114. package/dist/chunks/release-art-ChiT4T2S.js +582 -0
  115. package/dist/chunks/release-art-ChiT4T2S.js.map +1 -0
  116. package/dist/chunks/rights-B68ocZuq.js +312 -0
  117. package/dist/chunks/rights-B68ocZuq.js.map +1 -0
  118. package/dist/chunks/{scroll-area-D8MD7Vpo.js → scroll-area-_Ljh4-bG.js} +11 -6
  119. package/dist/chunks/scroll-area-_Ljh4-bG.js.map +1 -0
  120. package/dist/chunks/section-CFBYhsUi.js +77 -0
  121. package/dist/chunks/section-CFBYhsUi.js.map +1 -0
  122. package/dist/chunks/section-header-DU1Q4Tdf.js +28 -0
  123. package/dist/chunks/section-header-DU1Q4Tdf.js.map +1 -0
  124. package/dist/chunks/segmented-D9i1avik.js +119 -0
  125. package/dist/chunks/segmented-D9i1avik.js.map +1 -0
  126. package/dist/chunks/select-BqjmQOqx.js +222 -0
  127. package/dist/chunks/select-BqjmQOqx.js.map +1 -0
  128. package/dist/chunks/{separator-D7TzNHmX.js → separator-BNWf6BBj.js} +13 -8
  129. package/dist/chunks/separator-BNWf6BBj.js.map +1 -0
  130. package/dist/chunks/sidebar-Dq7oGOje.js +664 -0
  131. package/dist/chunks/sidebar-Dq7oGOje.js.map +1 -0
  132. package/dist/chunks/{sidebar-menu-BN3jkTlK.js → sidebar-menu-QSSNu1jJ.js} +2 -2
  133. package/dist/chunks/{sidebar-menu-BN3jkTlK.js.map → sidebar-menu-QSSNu1jJ.js.map} +1 -1
  134. package/dist/chunks/{skeleton-Dcz57Zyp.js → skeleton-D-qk3mes.js} +3 -3
  135. package/dist/chunks/skeleton-D-qk3mes.js.map +1 -0
  136. package/dist/chunks/slider-CcE8GtuV.js +58 -0
  137. package/dist/chunks/slider-CcE8GtuV.js.map +1 -0
  138. package/dist/chunks/{status-dot-QJTF0Yv4.js → status-dot-CP6runiC.js} +4 -4
  139. package/dist/chunks/{status-dot-QJTF0Yv4.js.map → status-dot-CP6runiC.js.map} +1 -1
  140. package/dist/chunks/{styles-CVJU9t9v.js → styles-hkFkoBbi.js} +2 -2
  141. package/dist/chunks/{styles-CVJU9t9v.js.map → styles-hkFkoBbi.js.map} +1 -1
  142. package/dist/chunks/{swap-text-Dr0Irxz6.js → swap-text-SlUjrTlG.js} +3 -3
  143. package/dist/chunks/swap-text-SlUjrTlG.js.map +1 -0
  144. package/dist/chunks/switch-ngywMQdl.js +76 -0
  145. package/dist/chunks/switch-ngywMQdl.js.map +1 -0
  146. package/dist/chunks/table-CTK5E0J7.js +102 -0
  147. package/dist/chunks/table-CTK5E0J7.js.map +1 -0
  148. package/dist/chunks/tag-BGr6lTSV.js +100 -0
  149. package/dist/chunks/tag-BGr6lTSV.js.map +1 -0
  150. package/dist/chunks/{text-CIXH8rmT.js → text-DkKdTVUf.js} +9 -9
  151. package/dist/chunks/text-DkKdTVUf.js.map +1 -0
  152. package/dist/chunks/{textarea--4FRL3Pb.js → textarea-CO0HP6fK.js} +47 -36
  153. package/dist/chunks/textarea-CO0HP6fK.js.map +1 -0
  154. package/dist/chunks/timeseries-Ck-q0wWn.js +381 -0
  155. package/dist/chunks/timeseries-Ck-q0wWn.js.map +1 -0
  156. package/dist/chunks/toolbar-u0Gm7Q7-.js +61 -0
  157. package/dist/chunks/toolbar-u0Gm7Q7-.js.map +1 -0
  158. package/dist/chunks/tooltip-Tkm-urbi.js +202 -0
  159. package/dist/chunks/tooltip-Tkm-urbi.js.map +1 -0
  160. package/dist/chunks/tooltip-root-BC_RNNiP.js +70 -0
  161. package/dist/chunks/tooltip-root-BC_RNNiP.js.map +1 -0
  162. package/dist/chunks/truncated-d1afmUJT.js +33 -0
  163. package/dist/chunks/truncated-d1afmUJT.js.map +1 -0
  164. package/dist/chunks/use-coarse-pointer-Ml5oE6oX.js +28 -0
  165. package/dist/chunks/use-coarse-pointer-Ml5oE6oX.js.map +1 -0
  166. package/dist/chunks/use-hydrating-COtYVRo4.js +8 -0
  167. package/dist/chunks/use-hydrating-COtYVRo4.js.map +1 -0
  168. package/dist/chunks/use-scroll-fade-uc8mWSDX.js +30 -0
  169. package/dist/chunks/use-scroll-fade-uc8mWSDX.js.map +1 -0
  170. package/dist/chunks/{zh-CN-Bm6UPIbW.js → zh-CN-BlpsT6d_.js} +73 -39
  171. package/dist/chunks/zh-CN-BlpsT6d_.js.map +1 -0
  172. package/dist/components/agent-avatar.js +1 -1
  173. package/dist/components/app-frame.js +2 -2
  174. package/dist/components/avatar.js +1 -1
  175. package/dist/components/badge.js +1 -1
  176. package/dist/components/banner.js +1 -1
  177. package/dist/components/button-group.js +22 -22
  178. package/dist/components/button-group.js.map +1 -1
  179. package/dist/components/button.js +1 -1
  180. package/dist/components/calendar.js +1 -1
  181. package/dist/components/charts/bar.js +235 -160
  182. package/dist/components/charts/bar.js.map +1 -1
  183. package/dist/components/charts/donut.js +144 -99
  184. package/dist/components/charts/donut.js.map +1 -1
  185. package/dist/components/charts/gauge.js +61 -49
  186. package/dist/components/charts/gauge.js.map +1 -1
  187. package/dist/components/charts/heatmap.js +179 -70
  188. package/dist/components/charts/heatmap.js.map +1 -1
  189. package/dist/components/charts/sankey.js +144 -77
  190. package/dist/components/charts/sankey.js.map +1 -1
  191. package/dist/components/charts/sparkline.js +54 -38
  192. package/dist/components/charts/sparkline.js.map +1 -1
  193. package/dist/components/charts/timeseries.js +1 -1
  194. package/dist/components/charts.js +2 -2
  195. package/dist/components/checkbox.js +1 -1
  196. package/dist/components/code-block.js +3 -3
  197. package/dist/components/code.js +1 -1
  198. package/dist/components/collapsible.js +77 -1
  199. package/dist/components/collapsible.js.map +1 -0
  200. package/dist/components/combobox.js +1 -1
  201. package/dist/components/command-list.js +2 -2
  202. package/dist/components/command-palette.js +89 -66
  203. package/dist/components/command-palette.js.map +1 -1
  204. package/dist/components/copy-button.js +1 -1
  205. package/dist/components/data-table.js +1 -459
  206. package/dist/components/date-picker.js +162 -151
  207. package/dist/components/date-picker.js.map +1 -1
  208. package/dist/components/dialog.js +74 -63
  209. package/dist/components/dialog.js.map +1 -1
  210. package/dist/components/display-options.js +76 -64
  211. package/dist/components/display-options.js.map +1 -1
  212. package/dist/components/empty.js +1 -1
  213. package/dist/components/field.js +1 -1
  214. package/dist/components/figure.js +2 -2
  215. package/dist/components/filter-chip.js +36 -27
  216. package/dist/components/filter-chip.js.map +1 -1
  217. package/dist/components/filter-row.js +4 -4
  218. package/dist/components/filter-row.js.map +1 -1
  219. package/dist/components/flow.js +94 -63
  220. package/dist/components/flow.js.map +1 -1
  221. package/dist/components/heading.js +1 -1
  222. package/dist/components/icon-button.js +1 -1
  223. package/dist/components/icon.js +1 -1
  224. package/dist/components/input.js +176 -98
  225. package/dist/components/input.js.map +1 -1
  226. package/dist/components/kaeso/conversation.js +51 -46
  227. package/dist/components/kaeso/conversation.js.map +1 -1
  228. package/dist/components/kaeso/identity.js +1 -1
  229. package/dist/components/kaeso/moments.js +23 -20
  230. package/dist/components/kaeso/moments.js.map +1 -1
  231. package/dist/components/kaeso/rights.js +1 -1
  232. package/dist/components/kaeso/usage.js +90 -74
  233. package/dist/components/kaeso/usage.js.map +1 -1
  234. package/dist/components/kaeso.js +200 -187
  235. package/dist/components/kaeso.js.map +1 -1
  236. package/dist/components/kbd.js +1 -1
  237. package/dist/components/key-value.js +32 -47
  238. package/dist/components/key-value.js.map +1 -1
  239. package/dist/components/label.js +1 -25
  240. package/dist/components/layout.js +2 -2
  241. package/dist/components/layout.js.map +1 -1
  242. package/dist/components/link.js +1 -1
  243. package/dist/components/list.js +1 -1
  244. package/dist/components/loader.js +11 -10
  245. package/dist/components/loader.js.map +1 -1
  246. package/dist/components/logo.js +2 -2
  247. package/dist/components/markdown.js +1 -1
  248. package/dist/components/menu.js +2 -2
  249. package/dist/components/meter.js +1 -1
  250. package/dist/components/page-header.js +1 -1
  251. package/dist/components/pagination.js +1 -1
  252. package/dist/components/playground.js +644 -529
  253. package/dist/components/playground.js.map +1 -1
  254. package/dist/components/popover.js +4 -4
  255. package/dist/components/popover.js.map +1 -1
  256. package/dist/components/portal.js +1 -1
  257. package/dist/components/qr-code.js +2 -2
  258. package/dist/components/qr-code.js.map +1 -1
  259. package/dist/components/radio.js +1 -1
  260. package/dist/components/release-art.js +1 -1
  261. package/dist/components/scroll-area.js +1 -1
  262. package/dist/components/section.js +1 -1
  263. package/dist/components/segmented.js +1 -1
  264. package/dist/components/select.js +1 -1
  265. package/dist/components/separator.js +1 -1
  266. package/dist/components/settings.js +39 -46
  267. package/dist/components/settings.js.map +1 -1
  268. package/dist/components/sheet.js +10 -9
  269. package/dist/components/sheet.js.map +1 -1
  270. package/dist/components/sidebar.js +1 -1
  271. package/dist/components/skeleton.js +1 -1
  272. package/dist/components/slider.js +1 -1
  273. package/dist/components/stat.js +98 -84
  274. package/dist/components/stat.js.map +1 -1
  275. package/dist/components/status-dot.js +1 -1
  276. package/dist/components/surface.js +1 -1
  277. package/dist/components/swap-text.js +1 -1
  278. package/dist/components/switch.js +1 -1
  279. package/dist/components/table.js +1 -1
  280. package/dist/components/tabs.js +73 -55
  281. package/dist/components/tabs.js.map +1 -1
  282. package/dist/components/tag.js +1 -1
  283. package/dist/components/text.js +1 -1
  284. package/dist/components/theme-image.js +1 -1
  285. package/dist/components/theme-menu.js +5 -2
  286. package/dist/components/theme-menu.js.map +1 -1
  287. package/dist/components/theme-select.js +1 -1
  288. package/dist/components/thumbnail.js +35 -24
  289. package/dist/components/thumbnail.js.map +1 -1
  290. package/dist/components/timeline.js +51 -35
  291. package/dist/components/timeline.js.map +1 -1
  292. package/dist/components/toast.js +76 -66
  293. package/dist/components/toast.js.map +1 -1
  294. package/dist/components/toc.js +14 -8
  295. package/dist/components/toc.js.map +1 -1
  296. package/dist/components/toolbar.js +1 -1
  297. package/dist/components/tooltip.js +1 -1
  298. package/dist/components/visually-hidden.js +1 -1
  299. package/dist/i18n-provider.js +1 -1
  300. package/dist/index.js +100 -100
  301. package/dist/kaeso.css +605 -67
  302. package/dist/styles.css +1 -1
  303. package/dist/tailwind.css +1 -1
  304. package/dist/types/blocks/delete-resource/delete-resource.d.ts +2 -2
  305. package/dist/types/components/agent-avatar/agent-avatar.d.ts +24 -19
  306. package/dist/types/components/badge/badge.d.ts +3 -3
  307. package/dist/types/components/banner/banner.d.ts +3 -3
  308. package/dist/types/components/button/button.d.ts +2 -2
  309. package/dist/types/components/button-group/button-group.d.ts +1 -1
  310. package/dist/types/components/charts/domain.d.ts +11 -0
  311. package/dist/types/components/charts/marks.d.ts +1 -0
  312. package/dist/types/components/code/code.d.ts +3 -3
  313. package/dist/types/components/code-block/json-view.d.ts +2 -1
  314. package/dist/types/components/code-block/numbers.d.ts +1 -0
  315. package/dist/types/components/collapsible/collapsible.d.ts +2 -2
  316. package/dist/types/components/collapsible/disclosure.d.ts +2 -0
  317. package/dist/types/components/data-table/data-table.d.ts +6 -5
  318. package/dist/types/components/data-table/docs.d.ts +1 -0
  319. package/dist/types/components/data-table/time-columns.d.ts +1 -0
  320. package/dist/types/components/date-picker/focus-day.d.ts +1 -0
  321. package/dist/types/components/date-picker/iso-field.d.ts +8 -1
  322. package/dist/types/components/dialog/dialog.d.ts +7 -7
  323. package/dist/types/components/field/field.d.ts +1 -1
  324. package/dist/types/components/flow/flow.d.ts +1 -1
  325. package/dist/types/components/icon-button/icon-button.d.ts +1 -1
  326. package/dist/types/components/input/input-group.d.ts +2 -0
  327. package/dist/types/components/input/number-input.d.ts +4 -4
  328. package/dist/types/components/input/otp-input.d.ts +3 -3
  329. package/dist/types/components/kaeso/client-button.d.ts +2 -1
  330. package/dist/types/components/kaeso/provider-picker.d.ts +1 -0
  331. package/dist/types/components/kaeso/rights.d.ts +1 -1
  332. package/dist/types/components/kaeso/role-picker.d.ts +1 -0
  333. package/dist/types/components/key-value/key-value.d.ts +2 -2
  334. package/dist/types/components/layout/layout.d.ts +2 -2
  335. package/dist/types/components/link/link.d.ts +4 -4
  336. package/dist/types/components/list/list.d.ts +2 -2
  337. package/dist/types/components/menu/menu.d.ts +2 -1
  338. package/dist/types/components/menu/styles.d.ts +3 -3
  339. package/dist/types/components/meter/meter.d.ts +3 -3
  340. package/dist/types/components/page-header/page-header.d.ts +1 -1
  341. package/dist/types/components/pagination/pagination.d.ts +2 -2
  342. package/dist/types/components/playground/prompt-suggestions.d.ts +1 -0
  343. package/dist/types/components/playground/reasoning-frame.d.ts +14 -0
  344. package/dist/types/components/playground/reasoning.d.ts +1 -0
  345. package/dist/types/components/popover/popover.d.ts +1 -1
  346. package/dist/types/components/scroll-area/scroll-area.d.ts +2 -2
  347. package/dist/types/components/section/section-header.d.ts +6 -0
  348. package/dist/types/components/segmented/segmented.d.ts +1 -0
  349. package/dist/types/components/select/select.d.ts +1 -1
  350. package/dist/types/components/sheet/sheet.d.ts +3 -3
  351. package/dist/types/components/sidebar/sidebar.d.ts +1 -0
  352. package/dist/types/components/slider/slider.d.ts +2 -2
  353. package/dist/types/components/stat/stat.d.ts +1 -1
  354. package/dist/types/components/tabs/tabs.d.ts +6 -4
  355. package/dist/types/components/text/truncated.d.ts +7 -0
  356. package/dist/types/components/timeline/timeline.d.ts +5 -5
  357. package/dist/types/components/toc/toc.d.ts +1 -1
  358. package/dist/types/components/toolbar/toolbar.d.ts +1 -1
  359. package/dist/types/components/tooltip/tooltip.d.ts +2 -2
  360. package/dist/types/components/tooltip/trigger-props.d.ts +1 -0
  361. package/dist/types/hooks/use-coarse-pointer.d.ts +1 -0
  362. package/dist/types/hooks/use-hydrating.d.ts +1 -0
  363. package/dist/types/utils/arrow-focus.d.ts +4 -1
  364. package/dist/types/utils/cn.d.ts +33 -0
  365. package/dist/types/utils/portal-context.d.ts +7 -1
  366. package/dist/utils.js +2 -2
  367. package/foundations/accessibility.md +3 -2
  368. package/foundations/color.md +5 -1
  369. package/foundations/elevation.md +1 -0
  370. package/foundations/motion.md +1 -1
  371. package/foundations/shape.md +2 -2
  372. package/foundations/typography.md +12 -12
  373. package/package.json +2 -2
  374. package/dist/chunks/agent-avatar-0pdBTWkR.js +0 -171
  375. package/dist/chunks/agent-avatar-0pdBTWkR.js.map +0 -1
  376. package/dist/chunks/app-frame-DogGRmsu.js +0 -221
  377. package/dist/chunks/app-frame-DogGRmsu.js.map +0 -1
  378. package/dist/chunks/arrow-focus-BcySmwwU.js +0 -11
  379. package/dist/chunks/arrow-focus-BcySmwwU.js.map +0 -1
  380. package/dist/chunks/avatar-CWbdwbJv.js +0 -83
  381. package/dist/chunks/avatar-CWbdwbJv.js.map +0 -1
  382. package/dist/chunks/badge-C2KtxCLB.js +0 -26
  383. package/dist/chunks/badge-C2KtxCLB.js.map +0 -1
  384. package/dist/chunks/banner-BA2ALw9M.js +0 -85
  385. package/dist/chunks/banner-BA2ALw9M.js.map +0 -1
  386. package/dist/chunks/button-CzuxqawA.js +0 -164
  387. package/dist/chunks/button-CzuxqawA.js.map +0 -1
  388. package/dist/chunks/calendar-BWaf2MXc.js.map +0 -1
  389. package/dist/chunks/checkbox-CQjwCPkc.js +0 -126
  390. package/dist/chunks/checkbox-CQjwCPkc.js.map +0 -1
  391. package/dist/chunks/cn-Dj6sRgkF.js.map +0 -1
  392. package/dist/chunks/code-block-BZIe_B9l.js +0 -334
  393. package/dist/chunks/code-block-BZIe_B9l.js.map +0 -1
  394. package/dist/chunks/code-block-DdNPHEzI.js.map +0 -1
  395. package/dist/chunks/code-tqj0uhBL.js.map +0 -1
  396. package/dist/chunks/collapsible-CKrCX_T9.js +0 -87
  397. package/dist/chunks/collapsible-CKrCX_T9.js.map +0 -1
  398. package/dist/chunks/combobox-DjDI7SUC.js +0 -319
  399. package/dist/chunks/combobox-DjDI7SUC.js.map +0 -1
  400. package/dist/chunks/command-list-C2Y7V_lt.js +0 -418
  401. package/dist/chunks/command-list-C2Y7V_lt.js.map +0 -1
  402. package/dist/chunks/copy-button-FJvPJn72.js.map +0 -1
  403. package/dist/chunks/core-BYns5ytV.js +0 -472
  404. package/dist/chunks/core-BYns5ytV.js.map +0 -1
  405. package/dist/chunks/date-popup-CPA_zt6o.js +0 -35
  406. package/dist/chunks/date-popup-CPA_zt6o.js.map +0 -1
  407. package/dist/chunks/de-D_0mmG-k.js.map +0 -1
  408. package/dist/chunks/dialog-Cg9A_6SF.js.map +0 -1
  409. package/dist/chunks/field-TviMvYa2.js.map +0 -1
  410. package/dist/chunks/hidden-description-B2zSmLcn.js +0 -23
  411. package/dist/chunks/hidden-description-B2zSmLcn.js.map +0 -1
  412. package/dist/chunks/icon-button-CrdF_eMG.js.map +0 -1
  413. package/dist/chunks/input-2VJuj_M4.js.map +0 -1
  414. package/dist/chunks/input-group-DQ_4DoXg.js.map +0 -1
  415. package/dist/chunks/iso-field-B2rTwiBo.js +0 -33
  416. package/dist/chunks/iso-field-B2rTwiBo.js.map +0 -1
  417. package/dist/chunks/json-view-Dqd2TDkc.js +0 -175
  418. package/dist/chunks/json-view-Dqd2TDkc.js.map +0 -1
  419. package/dist/chunks/kbd-BF1vKXJf.js.map +0 -1
  420. package/dist/chunks/link-KWI7PevW.js.map +0 -1
  421. package/dist/chunks/list-M1csq-d4.js +0 -494
  422. package/dist/chunks/list-M1csq-d4.js.map +0 -1
  423. package/dist/chunks/markdown-BupwFOae.js +0 -313
  424. package/dist/chunks/markdown-BupwFOae.js.map +0 -1
  425. package/dist/chunks/menu-DEmBfdPm.js +0 -450
  426. package/dist/chunks/menu-DEmBfdPm.js.map +0 -1
  427. package/dist/chunks/meter-Bj4N3Xuh.js +0 -84
  428. package/dist/chunks/meter-Bj4N3Xuh.js.map +0 -1
  429. package/dist/chunks/nav-sheet-CzgIwgAm.js +0 -60
  430. package/dist/chunks/nav-sheet-CzgIwgAm.js.map +0 -1
  431. package/dist/chunks/nav-wordmark-_pjheAsZ.js.map +0 -1
  432. package/dist/chunks/page-header-DL2y2iZp.js +0 -41
  433. package/dist/chunks/page-header-DL2y2iZp.js.map +0 -1
  434. package/dist/chunks/pagination-Cn_qF4cg.js +0 -86
  435. package/dist/chunks/pagination-Cn_qF4cg.js.map +0 -1
  436. package/dist/chunks/picker-popover-BxyU1U9F.js +0 -106
  437. package/dist/chunks/picker-popover-BxyU1U9F.js.map +0 -1
  438. package/dist/chunks/popover-DNN4S47w.js +0 -50
  439. package/dist/chunks/popover-DNN4S47w.js.map +0 -1
  440. package/dist/chunks/portal-context-BBbzDKmY.js.map +0 -1
  441. package/dist/chunks/radio-CDDFpdtL.js.map +0 -1
  442. package/dist/chunks/range-popup-CRyWYUB1.js +0 -128
  443. package/dist/chunks/range-popup-CRyWYUB1.js.map +0 -1
  444. package/dist/chunks/release-art-ZwfFQImt.js +0 -561
  445. package/dist/chunks/release-art-ZwfFQImt.js.map +0 -1
  446. package/dist/chunks/rights-Cyp0Pzp-.js +0 -279
  447. package/dist/chunks/rights-Cyp0Pzp-.js.map +0 -1
  448. package/dist/chunks/scroll-area-D8MD7Vpo.js.map +0 -1
  449. package/dist/chunks/scroll-parent-WXvzQcUo.js +0 -14
  450. package/dist/chunks/scroll-parent-WXvzQcUo.js.map +0 -1
  451. package/dist/chunks/section-Ce1efbsP.js +0 -87
  452. package/dist/chunks/section-Ce1efbsP.js.map +0 -1
  453. package/dist/chunks/segmented-CErcoxwi.js +0 -114
  454. package/dist/chunks/segmented-CErcoxwi.js.map +0 -1
  455. package/dist/chunks/select-x4XVsdCI.js +0 -210
  456. package/dist/chunks/select-x4XVsdCI.js.map +0 -1
  457. package/dist/chunks/separator-D7TzNHmX.js.map +0 -1
  458. package/dist/chunks/sidebar-3r1ZRXlN.js +0 -621
  459. package/dist/chunks/sidebar-3r1ZRXlN.js.map +0 -1
  460. package/dist/chunks/skeleton-Dcz57Zyp.js.map +0 -1
  461. package/dist/chunks/slider-Ci83PGtj.js +0 -57
  462. package/dist/chunks/slider-Ci83PGtj.js.map +0 -1
  463. package/dist/chunks/swap-text-Dr0Irxz6.js.map +0 -1
  464. package/dist/chunks/switch-BNMq_kGt.js +0 -59
  465. package/dist/chunks/switch-BNMq_kGt.js.map +0 -1
  466. package/dist/chunks/table-BeOSKl_3.js +0 -84
  467. package/dist/chunks/table-BeOSKl_3.js.map +0 -1
  468. package/dist/chunks/tag-D_M1s2qS.js +0 -87
  469. package/dist/chunks/tag-D_M1s2qS.js.map +0 -1
  470. package/dist/chunks/text-CIXH8rmT.js.map +0 -1
  471. package/dist/chunks/textarea--4FRL3Pb.js.map +0 -1
  472. package/dist/chunks/timeseries-D1xjRXfk.js +0 -339
  473. package/dist/chunks/timeseries-D1xjRXfk.js.map +0 -1
  474. package/dist/chunks/toolbar-WA_oZgu-.js +0 -37
  475. package/dist/chunks/toolbar-WA_oZgu-.js.map +0 -1
  476. package/dist/chunks/tooltip-OcwO0VUT.js +0 -154
  477. package/dist/chunks/tooltip-OcwO0VUT.js.map +0 -1
  478. package/dist/chunks/tooltip-root-DzahJDVj.js +0 -60
  479. package/dist/chunks/tooltip-root-DzahJDVj.js.map +0 -1
  480. package/dist/chunks/zh-CN-Bm6UPIbW.js.map +0 -1
  481. package/dist/components/data-table.js.map +0 -1
  482. package/dist/components/label.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  # @logicplanes/kaeso-ui component guides
2
2
 
3
- Version 0.4.4. Generated from the showcase's demo modules (apps/showcase/src/demos); do not edit. For each component: what it is for, its import, keyboard, accessibility, do and don't, and every example's code. Props and variants: `component-registry.md`.
3
+ Version 0.4.5. Generated from the showcase's demo modules (apps/showcase/src/demos); do not edit. For each component: what it is for, its import, keyboard, accessibility, do and don't, and every example's code. Props and variants: `component-registry.md`.
4
4
 
5
5
  ## AgentAttribution
6
6
 
7
- A person's avatar with the agent that acted for them as a badge on its corner, for audit rows and activity.
7
+ A person's avatar with the agent that acted for them as a small round badge on its corner, for audit rows and activity.
8
8
 
9
9
  `import { AgentAttribution } from "@logicplanes/kaeso-ui";`
10
10
 
@@ -39,7 +39,7 @@ A person's avatar with the agent that acted for them as a badge on its corner, f
39
39
 
40
40
  ## AgentAvatar
41
41
 
42
- An agent acting for a person: one bot face on an ink square, the same for every agent.
42
+ An agent acting for a person: one bot face on a square, the same for every agent.
43
43
 
44
44
  `import { AgentAvatar, useModelName } from "@logicplanes/kaeso-ui";`
45
45
 
@@ -96,8 +96,9 @@ Confirms an irreversible action: names it, says the consequence, can ask for typ
96
96
 
97
97
  ### Accessibility
98
98
 
99
- - role=alertdialog; focus starts on Cancel.
99
+ - role=alertdialog. The focus starts on the typed field when there is one; otherwise on Cancel, or on the confirm for an info confirmation.
100
100
  - The confirm names the verb and object (“Delete key”).
101
+ - The Enter that finishes typing in an input method never confirms.
101
102
 
102
103
  ### Examples
103
104
 
@@ -136,8 +137,9 @@ The console frame: the sidebar on the grey chrome, content in an inset rounded p
136
137
 
137
138
  - The sidebar is a nav landmark and the panel is main.
138
139
  - The first Tab stop is Skip to content, shown only while it has focus; it moves the focus to the panel, so the next Tab reaches the page's first control without passing the navigation.
139
- - Below 1024px a bar above the panel shows the wordmark alone at the top left, 28px in and 28px down, and the navigation toggle at the right; the toggle is named Open navigation, says whether the sheet is open (aria-expanded), and takes the focus back when the sheet closes.
140
- - A collapsed sidebar peeks when its expand button is held under the pointer for 750ms.
140
+ - Below 1024px a bar above the panel shows the wordmark alone at the top left, on the page's 24px gutter and 28px down, and the navigation toggle at the right; the toggle is named Open navigation, says whether the sheet is open (aria-expanded), and takes the focus back when the sheet closes.
141
+ - A collapsed sidebar peeks when its expand button is held under the pointer for 750ms; the peek closes when the pointer leaves for the page, never dims it, and stays inside an embedded frame.
142
+ - Expanding the sidebar with the button or [ gives the focus back to the item that collapsed it, or to its collapse button.
141
143
 
142
144
  ### Examples
143
145
 
@@ -602,11 +604,14 @@ Related actions side by side: connected pills, or spaced.
602
604
  | Key | Action |
603
605
  |---|---|
604
606
  | Tab | Moves between the buttons |
607
+ | Enter | Activates the focused button |
608
+ | Space | Activates the focused button |
605
609
 
606
610
  ### Accessibility
607
611
 
608
612
  - The group has role=group; give it an aria-label when the buttons alone do not explain it.
609
613
  - Icon-only items need an aria-label and show it as a tooltip.
614
+ - Items with pressed are toggles: aria-pressed says which is selected, and the selected item turns ink, well above 3:1 in both themes, so the choice never rests on a faint fill.
610
615
 
611
616
  ### Examples
612
617
 
@@ -639,6 +644,29 @@ Related actions side by side: connected pills, or spaced.
639
644
  </ButtonGroup>
640
645
  ```
641
646
 
647
+ #### Toggle
648
+
649
+ Pass pressed to make items toggles, such as display options in a log view; selected items turn ink. Choosing one view among a few is Segmented.
650
+
651
+ ```tsx
652
+ function Toggle() {
653
+ const [on, setOn] = useState<Record<string, boolean>>({ wrap: true, time: false, ids: true });
654
+ return (
655
+ <ButtonGroup size="sm" aria-label="Log display">
656
+ {[
657
+ ["wrap", "Wrap lines"],
658
+ ["time", "Timestamps"],
659
+ ["ids", "Request IDs"],
660
+ ].map(([id = "", label]) => (
661
+ <ButtonGroup.Item key={id} pressed={!!on[id]} onClick={() => setOn((o) => ({ ...o, [id]: !o[id] }))}>
662
+ {label}
663
+ </ButtonGroup.Item>
664
+ ))}
665
+ </ButtonGroup>
666
+ );
667
+ }
668
+ ```
669
+
642
670
  ## Checkbox
643
671
 
644
672
  An 18px box: raised and ringed, ink when checked, with a check that draws itself.
@@ -676,13 +704,14 @@ An 18px box: raised and ringed, ink when checked, with a check that draws itself
676
704
 
677
705
  ## ClientButton
678
706
 
679
- An agent client's mark on a raised tile, such as Claude, Cursor or GitHub Copilot, that opens how to connect it.
707
+ An agent client's mark in a raised circle, such as Claude, Cursor or GitHub Copilot, that opens how to connect it.
680
708
 
681
709
  `import { ClientButton } from "@logicplanes/kaeso-ui";`
682
710
 
683
711
  ### Accessibility
684
712
 
685
713
  - A button named by `aria-label`, which is also its tooltip; the mark is decorative.
714
+ - A 32px circle with a 44px hit area on touch screens.
686
715
 
687
716
  ### Examples
688
717
 
@@ -712,6 +741,7 @@ Copy a value: a read-only pill field, a copy circle, or inline text that copies
712
741
  ### Accessibility
713
742
 
714
743
  - The copy circle's name changes to “Copied” for 1.2 seconds and the tooltip says it.
744
+ - A value too long for its pill ends in an ellipsis; the text then becomes focusable and shows the whole value in a tooltip.
715
745
  - InlineCopyText announces “Copied” through a polite live region.
716
746
  - Nothing changes size when the state changes.
717
747
 
@@ -746,7 +776,7 @@ A read-only pill with the value in mono and a copy circle inside.
746
776
 
747
777
  ## Code
748
778
 
749
- Inline code: Geist Mono 13 on a soft fill. A pill for one word.
779
+ Inline code: Geist Mono 13 on a soft fill, radius 6 in running text.
750
780
 
751
781
  `import { Code } from "@logicplanes/kaeso-ui";`
752
782
 
@@ -766,13 +796,14 @@ Inline code: Geist Mono 13 on a soft fill. A pill for one word.
766
796
 
767
797
  ## CodeBlock
768
798
 
769
- Highlighted code on a well in Kaeso's monochrome theme: copy on hover, tabs, line numbers, collapse.
799
+ Highlighted code on a well in Kaeso's monochrome theme: copy in the header or on hover, tabs, line numbers, collapse.
770
800
 
771
801
  `import { CodeBlock } from "@logicplanes/kaeso-ui";`
772
802
 
773
803
  ### Accessibility
774
804
 
775
- - The copy circle is named “Copy code” and confirms with “Copied”.
805
+ - The copy circle is named “Copy code” and confirms with “Copied”; with a title or tabs it stays in the header.
806
+ - The code is one tab stop, named after its title, and scrolls sideways with the arrow keys.
776
807
 
777
808
  ### Examples
778
809
 
@@ -808,7 +839,7 @@ Highlighted code on a well in Kaeso's monochrome theme: copy on hover, tabs, lin
808
839
 
809
840
  ## Collapsible
810
841
 
811
- Disclosure rows with a chevron that turns in 180ms and a measured height animation; Accordion groups them.
842
+ Disclosure rows: a pill row with the title 12px in, a chevron at its end that turns in 200ms, and a measured height animation; Accordion groups them.
812
843
 
813
844
  `import { Collapsible, Accordion } from "@logicplanes/kaeso-ui";`
814
845
 
@@ -818,6 +849,11 @@ Disclosure rows with a chevron that turns in 180ms and a measured height animati
818
849
  |---|---|
819
850
  | Enter Space | Opens and closes |
820
851
 
852
+ ### Accessibility
853
+
854
+ - The title is a button with aria-expanded; its content follows it in the reading order.
855
+ - The same row recipe as the sidebar's groups: a pill that fills on hover, a focus ring inside it, 44px tall with a coarse pointer.
856
+
821
857
  ### Examples
822
858
 
823
859
  #### Collapsible
@@ -914,6 +950,7 @@ A search field over a long list that stays fast with thousands of rows, grouped
914
950
 
915
951
  ### Accessibility
916
952
 
953
+ - After typing pauses, a screen reader hears how many rows match, or that none do.
917
954
  - The search field is a combobox that points at the active row; the list is a listbox with one group per caption.
918
955
  - Each row says its position in the whole list, so a screen reader counts every row, not just those drawn.
919
956
 
@@ -993,11 +1030,14 @@ function Thousands() {
993
1030
  | Up Down | Moves |
994
1031
  | Enter | Opens the item or its page |
995
1032
  | Backspace | Goes back a page when the search is empty |
996
- | Escape | Closes |
1033
+ | Escape | Closes; on a nested page, clears the search, then goes back a page |
997
1034
 
998
1035
  ### Accessibility
999
1036
 
1000
1037
  - The input is a combobox controlling the results listbox; the active result is announced.
1038
+ - A result is named by its label, with its hint and shortcut after a pause.
1039
+ - On a nested page, the chip before the search goes back a page.
1040
+ - After typing pauses, a screen reader hears how many results match.
1001
1041
 
1002
1042
  ### Examples
1003
1043
 
@@ -1032,7 +1072,8 @@ Models side by side: one to four equal columns, each with a header, a thread tha
1032
1072
  ### Accessibility
1033
1073
 
1034
1074
  - The grid is a named group; each column is a region named after its model, and its thread a region of its own.
1035
- - On a phone, Previous column and Next column move between columns, and “2 of 3” is announced.
1075
+ - On a phone, or when the columns don't fit, Previous column and Next column move between columns, and “Claude Sonnet 4.5, 2 of 3” is announced.
1076
+ - Adding a column moves the focus to its header; removing one moves it to the column that takes its place.
1036
1077
  - A thread stays at its end while a response grows, unless the person scrolled up to read.
1037
1078
 
1038
1079
  ### Examples
@@ -1073,6 +1114,8 @@ The prompt box: grows with what is written, then scrolls; Send, which becomes St
1073
1114
  - Enter never sends while an input method is composing (Chinese, Japanese, Korean): the Enter that picks a candidate stays the input method's.
1074
1115
  - On a touch screen Enter adds a line and the Send button sends, as in the messaging apps there; elsewhere the on-screen keyboard's Enter key reads Send (enterkeyhint).
1075
1116
  - Send and Stop are one button that keeps its place and width, so the focus stays on it when a response starts or ends.
1117
+ - While a response arrives, the text box's description says to stop it to send the next prompt.
1118
+ - A click anywhere in the box, the button row included, puts the cursor in the text box.
1076
1119
 
1077
1120
  ### Examples
1078
1121
 
@@ -1130,11 +1173,13 @@ The same menu on right-click and the context-menu key.
1130
1173
 
1131
1174
  | Key | Action |
1132
1175
  |---|---|
1133
- | Shift F10 | Opens the menu for the focused element |
1176
+ | Shift F10 | Opens the menu for the focused row |
1177
+ | Escape | Closes and returns focus to the row |
1134
1178
 
1135
1179
  ### Accessibility
1136
1180
 
1137
1181
  - Every action in a context menu must also be reachable another way.
1182
+ - An area with nothing focusable in it becomes a focus stop, so the keyboard can open its menu.
1138
1183
 
1139
1184
  ### Examples
1140
1185
 
@@ -1142,9 +1187,7 @@ The same menu on right-click and the context-menu key.
1142
1187
 
1143
1188
  ```tsx
1144
1189
  <ContextMenu>
1145
- <ContextMenu.Trigger className="flex h-44 w-400 items-center rounded-item bg-fill-1 px-16 text-body text-fg">
1146
- Right-click this request
1147
- </ContextMenu.Trigger>
1190
+ <ContextMenu.Trigger className={ROW}>Right-click this request</ContextMenu.Trigger>
1148
1191
  <ContextMenu.Content>
1149
1192
  <ContextMenu.Item icon={icons.openExternal}>Open in a sheet</ContextMenu.Item>
1150
1193
  <ContextMenu.Item icon={icons.copy}>Copy request id</ContextMenu.Item>
@@ -1196,18 +1239,24 @@ The console's table: a 36px header, 40px rows without lines, numbers right, sort
1196
1239
 
1197
1240
  | Key | Action |
1198
1241
  |---|---|
1199
- | Tab | Moves into the table, to the row last in focus, and out again |
1200
- | Up Down | Move between rows |
1201
- | Home End | First and last row |
1242
+ | Tab | Moves into the table, to the row or header last in focus, and out again: the table is one tab stop |
1243
+ | Up Down | Move between rows; Up from the first row reaches the header |
1244
+ | Left Right | Move between the header's sort buttons; on a row, Right reaches the row's controls and Left comes back |
1245
+ | shift Left Right | Resize the column, on its header |
1246
+ | Home End | First and last row, or first and last header |
1202
1247
  | Page Up Page Down | A screen of rows up or down |
1203
1248
  | Enter | Opens the row |
1204
- | Space | Selects the row, in a selectable table |
1205
- | Left Right | Resize a column, on its handle |
1206
- | shift F10 | Opens the row menu |
1249
+ | Space | Selects the row, in a selectable table (also x) |
1250
+ | shift Up Down | Extends the selection |
1251
+ | mod A | Selects every row |
1252
+ | Escape | Returns from a row's control to its row; on a row, clears the selection |
1253
+ | shift F10 | Opens the row menu, or the column's width menu on its header |
1207
1254
 
1208
1255
  ### Accessibility
1209
1256
 
1210
- - role=table with column headers; sorted columns carry aria-sort.
1257
+ - An ARIA table whose rows are one tab stop, moved through with the arrow keys; sorted columns carry aria-sort, the open row aria-current.
1258
+ - One tab stop: checkboxes, row controls and resize handles stay out of the tab order and are reached with the arrow keys.
1259
+ - A column's width changes by dragging its handle, with Shift and the arrow keys on its header, or from the header's context menu (Widen, Narrow, Reset width), so no drag is required.
1211
1260
  - Columns declare a priority; low-priority columns hide first when space is short. A growing column then shrinks to its readable minimum (minWidth, 136px by default) and truncates. On a screen narrower still, the other priority 1 columns give way from the row's end backwards, keeping its last column (the actions) and the selection boxes; only a row with nothing left to give way scrolls sideways, its last column pinned at the end.
1212
1261
  - Over 100 rows render virtually; the row count is in aria-rowcount and each row's place in aria-rowindex.
1213
1262
 
@@ -1359,16 +1408,28 @@ The destructive flow: the object and the consequence, typed confirmation, a dang
1359
1408
 
1360
1409
  ### Examples
1361
1410
 
1362
- #### Archive a project
1411
+ #### Delete a project
1363
1412
 
1364
1413
  ```tsx
1365
1414
  <DeleteResource
1366
1415
  kind="project"
1367
- verb="Archive"
1368
1416
  name="Checkout assistant"
1369
- consequence="Its keys stop working. Logs stay for 30 days, then they are deleted."
1417
+ consequence="Its keys stop working at once, and its request logs are deleted. This can't be undone."
1370
1418
  onConfirm={() => new Promise((r) => setTimeout(r, 900))}
1371
- trigger={<Button variant="danger-secondary">Archive project</Button>}
1419
+ trigger={<Button variant="danger-secondary">Delete project</Button>}
1420
+ />
1421
+ ```
1422
+
1423
+ #### Delete a key
1424
+
1425
+ ```tsx
1426
+ <DeleteResource
1427
+ kind="key"
1428
+ name="checkout-web"
1429
+ confirm="simple"
1430
+ consequence="Applications using it stop authenticating with the gateway."
1431
+ onConfirm={() => new Promise((r) => setTimeout(r, 900))}
1432
+ trigger={<Button variant="danger-secondary">Delete key</Button>}
1372
1433
  />
1373
1434
  ```
1374
1435
 
@@ -1635,19 +1696,14 @@ function Changing() {
1635
1696
  #### Sizes
1636
1697
 
1637
1698
  ```tsx
1638
- <div className="flex gap-12">
1639
- {(["sm", "md", "lg"] as const).map((s) => (
1699
+ <div className="flex flex-wrap gap-12">
1700
+ {sizes.map((s) => (
1640
1701
  <Dialog
1641
- key={s}
1642
- size={s}
1643
- trigger={<Button>{s}</Button>}
1644
- title={`A ${s} dialog`}
1702
+ key={s.size}
1703
+ size={s.size}
1704
+ trigger={<Button>{s.open}</Button>}
1705
+ title={`${s.width} pixels wide`}
1645
1706
  description="Sizes are 440, 560 and 720 pixels."
1646
- footer={
1647
- <Dialog.Close>
1648
- <Button>Close</Button>
1649
- </Dialog.Close>
1650
- }
1651
1707
  />
1652
1708
  ))}
1653
1709
  </div>
@@ -1791,7 +1847,7 @@ What someone can do at a glance: a row per group, in words, under the roles it c
1791
1847
 
1792
1848
  ## Empty
1793
1849
 
1794
- What is absent and the next step: an icon circle, a title, one sentence, one or two actions.
1850
+ What is absent and the next step: a title, one sentence, one action.
1795
1851
 
1796
1852
  `import { Empty } from "@logicplanes/kaeso-ui";`
1797
1853
 
@@ -1802,13 +1858,12 @@ What is absent and the next step: an icon circle, a title, one sentence, one or
1802
1858
  ```tsx
1803
1859
  <Empty
1804
1860
  title="No keys yet"
1805
- description="Create a key so an application can call the gateway."
1806
- actions={
1861
+ description={
1807
1862
  <>
1808
- <Button variant="primary">Create key</Button>
1809
- <Button>Read about keys</Button>
1863
+ Create a key so an application can call the gateway. <Link href="https://docs.kaeso.app">Read about keys</Link>
1810
1864
  </>
1811
1865
  }
1866
+ actions={<Button variant="primary">Create key</Button>}
1812
1867
  />
1813
1868
  ```
1814
1869
 
@@ -1829,6 +1884,8 @@ A label, a control and its help, wired together; an error shows under the contro
1829
1884
  - The label points at the control; help is in aria-describedby.
1830
1885
  - invalid sets aria-invalid and the danger ring; error shows what is wrong under the control and is its description for a screen reader.
1831
1886
  - Optional fields are marked, not required ones.
1887
+ - Fieldset's legend names the group, so each field inside is heard with it; its description describes the group.
1888
+ - After a failed submit, move focus to the first invalid field: its error is then read with it.
1832
1889
 
1833
1890
  ### Examples
1834
1891
 
@@ -1859,8 +1916,8 @@ A label, a control and its help, wired together; an error shows under the contro
1859
1916
  <Field label="Name" layout="horizontal" description="Shown in logs.">
1860
1917
  <Input defaultValue="checkout-web" />
1861
1918
  </Field>
1862
- <Field label="Monthly budget" layout="horizontal" invalid>
1863
- <Input defaultValue="-20" suffix="USD" />
1919
+ <Field label="Monthly budget" layout="horizontal" error="Enter an amount of 0 or more.">
1920
+ <Input defaultValue="-20" suffix="USD" align="end" />
1864
1921
  </Field>
1865
1922
  </div>
1866
1923
  ```
@@ -2040,6 +2097,33 @@ A node-and-connector diagram for the route: app → Kaeso → provider and model
2040
2097
  <Flow columns={columns} edges={edges} aria-label="Requests go from your app through the Kaeso gateway to gpt-5 or claude-sonnet-4-5" />
2041
2098
  ```
2042
2099
 
2100
+ #### A route that changes
2101
+
2102
+ With animated, a dot runs once along each connector when the route changes; never on load and never with reduced motion.
2103
+
2104
+ ```tsx
2105
+ function Changes() {
2106
+ const [fallback, setFallback] = useState(false);
2107
+ const target = fallback ? "anthropic" : "openai";
2108
+ return (
2109
+ <div className="flex flex-col items-start gap-16">
2110
+ <Flow
2111
+ animated
2112
+ columns={columns}
2113
+ edges={[
2114
+ ["app", "kaeso"],
2115
+ ["kaeso", target],
2116
+ ]}
2117
+ aria-label={`Requests go from your app through the Kaeso gateway to ${fallback ? "claude-sonnet-4-5" : "gpt-5"}`}
2118
+ />
2119
+ <Button variant="secondary" size="sm" onClick={() => setFallback(!fallback)}>
2120
+ {fallback ? "Route to gpt-5" : "Route to claude-sonnet-4-5"}
2121
+ </Button>
2122
+ </div>
2123
+ );
2124
+ }
2125
+ ```
2126
+
2043
2127
  ## Gauge
2044
2128
 
2045
2129
  A semicircle for “budget used”; thresholds as ticks.
@@ -2171,11 +2255,11 @@ Hugeicons free, Stroke Rounded, in currentColor. One icon per Kaeso concept.
2171
2255
  #### Vocabulary
2172
2256
 
2173
2257
  ```tsx
2174
- <div className="grid w-full grid-cols-2 gap-x-16 gap-y-4 sm:grid-cols-4">
2258
+ <div className="grid w-full grid-cols-2 gap-x-8 gap-y-4 sm:grid-cols-4 sm:gap-x-16">
2175
2259
  {(Object.keys(icons) as IconName[]).map((n) => (
2176
- <div key={n} className="flex h-32 items-center gap-8 text-small text-fg-secondary">
2260
+ <div key={n} className="flex min-h-32 items-center gap-8 text-small text-fg-secondary">
2177
2261
  <Icon icon={icons[n]} size="sm" className="text-fg" />
2178
- <span className="mono truncate">{n}</span>
2262
+ <span className="mono min-w-0 text-caption wrap-anywhere sm:text-small">{n}</span>
2179
2263
  </div>
2180
2264
  ))}
2181
2265
  </div>
@@ -2198,7 +2282,7 @@ A circle with an icon, a required name, and a tooltip that says it.
2198
2282
 
2199
2283
  - aria-label is required by the types; it is also the tooltip, so sighted and screen-reader users get the same name.
2200
2284
  - Shortcuts appear in the tooltip as key caps.
2201
- - Disabled icon buttons have no tooltip unless they carry a disabledReason.
2285
+ - Disabled icon buttons have no tooltip unless they carry a disabledReason, which the tooltip shows and screen readers read as the description.
2202
2286
 
2203
2287
  ### Examples
2204
2288
 
@@ -2268,12 +2352,12 @@ A pill text field with the secondary material and a soft focus halo.
2268
2352
 
2269
2353
  #### With label and help
2270
2354
 
2271
- An invalid value gets the danger ring; what is wrong goes in a toast.
2355
+ An invalid value gets the danger ring and a message under the field that says what to enter.
2272
2356
 
2273
2357
  ```tsx
2274
2358
  <div className="flex w-360 flex-col gap-24">
2275
2359
  <Input label="Key name" description="Shown in logs and the audit log." placeholder="checkout-web" />
2276
- <Input label="Monthly budget" defaultValue="-20" suffix="USD" invalid />
2360
+ <Input label="Monthly budget" defaultValue="-20" suffix="USD" align="end" error="Enter an amount of 0 or more." />
2277
2361
  </div>
2278
2362
  ```
2279
2363
 
@@ -2315,6 +2399,7 @@ Addons inside the pill: text, icons, a ghost circle or a key cap, sharing one fo
2315
2399
  ### Accessibility
2316
2400
 
2317
2401
  - Addons are text the input's label should not repeat; buttons inside need their own names.
2402
+ - invalid on the group also marks the input aria-invalid, and disabled turns off its input and buttons.
2318
2403
 
2319
2404
  ### Examples
2320
2405
 
@@ -2323,12 +2408,12 @@ Addons inside the pill: text, icons, a ghost circle or a key cap, sharing one fo
2323
2408
  ```tsx
2324
2409
  <div className="flex w-400 flex-col gap-12">
2325
2410
  <InputGroup>
2326
- <InputGroup.Addon>https://</InputGroup.Addon>
2411
+ <InputGroup.Addon data-join>https://</InputGroup.Addon>
2327
2412
  <InputGroup.Input aria-label="Host" placeholder="kaeso.example.com" />
2328
2413
  <InputGroup.Addon>/v1</InputGroup.Addon>
2329
2414
  </InputGroup>
2330
2415
  <InputGroup trailingButton>
2331
- <InputGroup.Input aria-label="Token" defaultValue="sk-kso-AbC123…wxyz" className="mono text-small" />
2416
+ <InputGroup.Input aria-label="Token" defaultValue="sk-kso-AbC123…wxyz" data-mono />
2332
2417
  <InputGroup.Button icon={icons.copy} aria-label="Copy" />
2333
2418
  </InputGroup>
2334
2419
  <InputGroup leadingIcon>
@@ -2344,6 +2429,20 @@ A folding JSON tree: copy any path, highlight a search.
2344
2429
 
2345
2430
  `import { JsonView } from "@logicplanes/kaeso-ui";`
2346
2431
 
2432
+ ### Keyboard
2433
+
2434
+ | Key | Action |
2435
+ |---|---|
2436
+ | Tab | Moves into the tree, then out of it: the tree is one tab stop |
2437
+ | ↑ ↓ | Moves between rows |
2438
+ | → ← | Opens and closes an object or array, or moves into it and back to its parent |
2439
+ | Enter Space | Opens or closes an object or array |
2440
+ | ⌘C Ctrl C | Copies the row's path |
2441
+
2442
+ ### Accessibility
2443
+
2444
+ - The tree is a tree of rows with their level and open state; a copied path is announced.
2445
+
2347
2446
  ### Examples
2348
2447
 
2349
2448
  #### Request body
@@ -2368,7 +2467,8 @@ Key caps and shortcuts: ⌘ ⌥ ⇧ ⌃ on macOS, words elsewhere; sequences lik
2368
2467
 
2369
2468
  ### Accessibility
2370
2469
 
2371
- - Modifier symbols carry an aria-label with the key's name.
2470
+ - A symbol such as ⌘ is hidden from screen readers and its name (“Command”) is read instead; letters need no extra name.
2471
+ - Inside a button, the shortcut stays out of the button's name, which is its visible label.
2372
2472
 
2373
2473
  ### Examples
2374
2474
 
@@ -2519,6 +2619,7 @@ The name of a field: 14/500, with an optional “Optional”.
2519
2619
  ### Accessibility
2520
2620
 
2521
2621
  - Connect it to its control with htmlFor; Field does this for you.
2622
+ - Beside a disabled control, pass data-disabled so the label dims with it.
2522
2623
 
2523
2624
  ### Examples
2524
2625
 
@@ -2547,7 +2648,7 @@ A second layer slides over the first (add model → review values); Back returns
2547
2648
 
2548
2649
  | Key | Action |
2549
2650
  |---|---|
2550
- | Escape | Closes and returns focus to the trigger |
2651
+ | Escape | Closes the dialog from any layer and returns focus to the trigger |
2551
2652
  | Tab | Moves within the layer shown |
2552
2653
  | mod Enter | Calls onSubmit, on every layer |
2553
2654
 
@@ -2665,7 +2766,7 @@ function Wizard() {
2665
2766
 
2666
2767
  ## Link
2667
2768
 
2668
- Links look like links: text color with a quiet underline that turns solid on hover.
2769
+ Links look like links: text color with a grey underline that takes the text color on hover.
2669
2770
 
2670
2771
  `import { Link } from "@logicplanes/kaeso-ui";`
2671
2772
 
@@ -2679,6 +2780,7 @@ Links look like links: text color with a quiet underline that turns solid on hov
2679
2780
 
2680
2781
  - External links open in a new tab, add rel="noopener noreferrer" and say so to screen readers.
2681
2782
  - Router links come from LinkProvider.
2783
+ - The underline is the cue that text is a link, so it stays visible at rest; color alone never marks a link.
2682
2784
 
2683
2785
  ### Examples
2684
2786
 
@@ -2983,6 +3085,7 @@ A rounded dropdown: 16px radius, 34px rows, icons that wake on highlight.
2983
3085
  - role=menu with menuitem, menuitemcheckbox and menuitemradio.
2984
3086
  - Groups of more than seven items get a caption or a separator.
2985
3087
  - Danger items name the action: “Delete key”.
3088
+ - An item's shortcut and hint describe it; its name is the label alone.
2986
3089
 
2987
3090
  ### Examples
2988
3091
 
@@ -2999,9 +3102,7 @@ A rounded dropdown: 16px radius, 34px rows, icons that wake on highlight.
2999
3102
  <Menu.Item icon={icons.limit}>Edit limits</Menu.Item>
3000
3103
  <Menu.Separator />
3001
3104
  <Menu.Item icon={icons.hide}>Disable</Menu.Item>
3002
- <Menu.Item icon={icons.delete} variant="danger">
3003
- Archive key
3004
- </Menu.Item>
3105
+ <Menu.Item variant="danger">Archive key</Menu.Item>
3005
3106
  </Menu.Content>
3006
3107
  </Menu>
3007
3108
  ```
@@ -3203,7 +3304,7 @@ function Catalogue() {
3203
3304
 
3204
3305
  ## NumberInput
3205
3306
 
3206
- Exact numbers: right-aligned tabular digits, a unit, steppers on hover, a decimal string value.
3307
+ Exact numbers: end-aligned tabular digits, a unit, quiet steppers, a decimal string value.
3207
3308
 
3208
3309
  `import { NumberInput } from "@logicplanes/kaeso-ui";`
3209
3310
 
@@ -3213,11 +3314,14 @@ Exact numbers: right-aligned tabular digits, a unit, steppers on hover, a decima
3213
3314
  |---|---|
3214
3315
  | Up | Increases by the step |
3215
3316
  | Down | Decreases by the step |
3317
+ | Tab | Moves past the field; the steppers are not tab stops, since the arrows do the same |
3216
3318
 
3217
3319
  ### Accessibility
3218
3320
 
3219
3321
  - The value is a decimal string, so money never passes through a float.
3220
3322
  - Thousands separators appear on blur and are removed while editing.
3323
+ - The input is a spin button: screen readers hear its value with the unit, its limits, and that the arrow keys change it.
3324
+ - A stepper turns off at the minimum or maximum.
3221
3325
 
3222
3326
  ### Examples
3223
3327
 
@@ -3249,10 +3353,21 @@ Six cells for a TOTP code over one accessible input: paste fills, Backspace move
3249
3353
 
3250
3354
  `import { OTPInput } from "@logicplanes/kaeso-ui";`
3251
3355
 
3356
+ ### Keyboard
3357
+
3358
+ | Key | Action |
3359
+ |---|---|
3360
+ | 0–9 | Types a digit into the focused cell and moves to the next |
3361
+ | Backspace | Clears the focused digit |
3362
+ | ← → | Moves between cells |
3363
+ | Home, End | Moves to the first cell, or the next empty one |
3364
+
3252
3365
  ### Accessibility
3253
3366
 
3254
3367
  - One real input with autocomplete="one-time-code", so the browser can offer the code.
3255
3368
  - Cells are decorative; the input carries the label.
3369
+ - A pasted code fills every cell even when it is shown with spaces or dashes, such as 418 207.
3370
+ - Clicking a cell puts the caret there, so one wrong digit can be fixed without retyping the code.
3256
3371
 
3257
3372
  ### Examples
3258
3373
 
@@ -3413,7 +3528,7 @@ A request's parameters: system instructions, temperature, top P, max output toke
3413
3528
 
3414
3529
  ### Accessibility
3415
3530
 
3416
- - Every control has a visible label that names it; the popover holds a form and traps the focus until it closes.
3531
+ - Every control has a visible label that names it; the popover holds a form, keeps the focus inside until it closes and has a Close button; Escape closes it too.
3417
3532
 
3418
3533
  ### Examples
3419
3534
 
@@ -3473,6 +3588,8 @@ A floating panel next to its trigger; HoverCard previews on hover, never as the
3473
3588
  ### Accessibility
3474
3589
 
3475
3590
  - Popovers with a form trap focus (trapFocus); others do not.
3591
+ - The title names the popover's dialog; without a title, give the content an aria-label.
3592
+ - A popover and a hover card are never wider than the screen.
3476
3593
 
3477
3594
  ### Examples
3478
3595
 
@@ -3504,9 +3621,9 @@ A floating panel next to its trigger; HoverCard previews on hover, never as the
3504
3621
  ```tsx
3505
3622
  <HoverCard>
3506
3623
  <HoverCard.Trigger>
3507
- <a href="#" className="mono text-small text-fg underline decoration-line-strong underline-offset-3">
3624
+ <Link href="#models/claude-sonnet-4-5" className="mono text-small">
3508
3625
  claude-sonnet-4-5
3509
- </a>
3626
+ </Link>
3510
3627
  </HoverCard.Trigger>
3511
3628
  <HoverCard.Content>
3512
3629
  <div className="flex flex-col gap-12">
@@ -3525,13 +3642,14 @@ A floating panel next to its trigger; HoverCard previews on hover, never as the
3525
3642
 
3526
3643
  ## PromptSuggestions
3527
3644
 
3528
- Example prompts before a thread starts: up to three quiet lines that take a fill on hover and go once a prompt is sent.
3645
+ Example prompts before a thread starts: up to three quiet rows that take a fill on hover and go once a prompt is sent.
3529
3646
 
3530
3647
  `import { PromptSuggestions } from "@logicplanes/kaeso-ui/playground";`
3531
3648
 
3532
3649
  ### Accessibility
3533
3650
 
3534
3651
  - A list named “Example prompts”; each suggestion is a button that reads its prompt.
3652
+ - Choosing one puts it in the composer and moves the focus there.
3535
3653
 
3536
3654
  ### Examples
3537
3655
 
@@ -3540,10 +3658,19 @@ Example prompts before a thread starts: up to three quiet lines that take a fill
3540
3658
  ```tsx
3541
3659
  function Basic() {
3542
3660
  const [draft, setDraft] = useState("");
3661
+ const composer = useRef<HTMLTextAreaElement | null>(null);
3543
3662
  return (
3544
3663
  <div className="flex w-full max-w-640 flex-col gap-12">
3545
- {draft === "" && <PromptSuggestions suggestions={suggestions} onSelect={setDraft} />}
3546
- <Composer value={draft} onValueChange={setDraft} aria-label="Message all models" placeholder="Message 3 models" />
3664
+ {draft === "" && (
3665
+ <PromptSuggestions
3666
+ suggestions={suggestions}
3667
+ onSelect={(p) => {
3668
+ setDraft(p);
3669
+ composer.current?.focus();
3670
+ }}
3671
+ />
3672
+ )}
3673
+ <Composer ref={composer} value={draft} onValueChange={setDraft} aria-label="Message all models" placeholder="Message 3 models" />
3547
3674
  </div>
3548
3675
  );
3549
3676
  }
@@ -3774,7 +3901,7 @@ A response's numbers on one line: time to first token, total time, tokens in and
3774
3901
 
3775
3902
  ## ResponseView
3776
3903
 
3777
- A model's response as it arrives: Markdown with a quiet caret, reasoning in a Thinking disclosure, and calm stopped, cut-off and failed states.
3904
+ A model's response as it arrives: a quiet caret until the first token, Markdown as it streams, reasoning in a Thinking disclosure, and calm stopped, cut-off and failed states.
3778
3905
 
3779
3906
  `import { ResponseView, UserMessage, Thread } from "@logicplanes/kaeso-ui/playground";`
3780
3907
 
@@ -3789,6 +3916,7 @@ A model's response as it arrives: Markdown with a quiet caret, reasoning in a Th
3789
3916
  - Each response is an article named by aria-label (“GPT-5 response” in a comparison) and is aria-busy while it streams, so its words aren't read out one by one.
3790
3917
  - Thinking is a disclosure button; closed, its row shows the latest line of the summary, hidden from screen readers, which read the summary when opened.
3791
3918
  - A failure is an alert in place of the response: “No response”, then the error.
3919
+ - When a response finishes, stops or is cut off, a status message says so once, by name: “GPT-5 response finished”.
3792
3920
 
3793
3921
  ### Examples
3794
3922
 
@@ -4018,13 +4146,14 @@ Requests from keys to models to providers; hover a node to follow its path.
4018
4146
 
4019
4147
  ## ScrollArea
4020
4148
 
4021
- A scroll container with thin scrollbars that appear on hover.
4149
+ A scroll container with thin scrollbars that appear on hover, fading at every edge with more to scroll to.
4022
4150
 
4023
4151
  `import { ScrollArea } from "@logicplanes/kaeso-ui";`
4024
4152
 
4025
4153
  ### Accessibility
4026
4154
 
4027
4155
  - Give a focusable scroll region an aria-label so keyboard users know what they scroll.
4156
+ - The focus ring is drawn above the fade, so all four sides show while the content scrolls.
4028
4157
 
4029
4158
  ### Examples
4030
4159
 
@@ -4058,6 +4187,7 @@ Search with a leading icon, a clear circle when filled, and a shortcut hint wher
4058
4187
 
4059
4188
  - The clear button is named “Clear search”.
4060
4189
  - type=search lets assistive technology announce it as a search field.
4190
+ - A shortcut hint hides while the field has focus, where it no longer applies; its room stays, so nothing moves.
4061
4191
 
4062
4192
  ### Examples
4063
4193
 
@@ -4065,7 +4195,7 @@ Search with a leading icon, a clear circle when filled, and a shortcut hint wher
4065
4195
 
4066
4196
  ```tsx
4067
4197
  <div className="w-240">
4068
- <SearchInput aria-label="Search logs" placeholder="Search logs" />
4198
+ <SearchInput aria-label="Search logs" placeholder="gpt-5, req_01…" shortcut={["mod", "k"]} />
4069
4199
  </div>
4070
4200
  ```
4071
4201
 
@@ -4073,21 +4203,22 @@ Search with a leading icon, a clear circle when filled, and a shortcut hint wher
4073
4203
 
4074
4204
  ```tsx
4075
4205
  <div className="w-240">
4076
- <SearchInput size="md" aria-label="Search settings" placeholder="Search…" />
4206
+ <SearchInput size="md" aria-label="Search settings" placeholder="Rate limit, budget" />
4077
4207
  </div>
4078
4208
  ```
4079
4209
 
4080
4210
  ## SecretReveal
4081
4211
 
4082
- The one-time secret: calm, centered, certain. Copy it, store it, see how to use it.
4212
+ The one-time key: calm, centered, certain. Copy it, store it, see how to use it.
4083
4213
 
4084
4214
  `import { SecretReveal, EnvironmentSnippet } from "@logicplanes/kaeso-ui";`
4085
4215
 
4086
4216
  ### Accessibility
4087
4217
 
4088
- - The secret is a read-only text box; a click selects all of it.
4089
- - “Copy key” becomes “Copied” without changing size.
4090
- - The warning is text, not only color.
4218
+ - The key is a read-only text box named “Key for …”; a click selects all of it.
4219
+ - “Copy key” becomes “Key copied” without changing size.
4220
+ - The warning comes before the button, so it is read before the key is copied; it is text, not only color.
4221
+ - The snippets start with a .env line and read the key from the environment, so no code example hard-codes it.
4091
4222
 
4092
4223
  ### Examples
4093
4224
 
@@ -4308,8 +4439,9 @@ Secrets masked by default, an eye to reveal, mono when revealed, never autocompl
4308
4439
 
4309
4440
  ### Accessibility
4310
4441
 
4311
- - The reveal circle is named Show or Hide.
4312
- - Passwords show “Caps Lock is on.” in the field's description.
4442
+ - The reveal circle is named “Show key” or “Hide key” (“Show password” for passwords).
4443
+ - With Caps Lock on, a password field shows “Caps Lock” beside the reveal circle and announces it once; the field's own description stays.
4444
+ - A revealed key is set in mono at the same size as every other id.
4313
4445
 
4314
4446
  ### Examples
4315
4447
 
@@ -4375,7 +4507,7 @@ Settings rows in a rounded group, title and description left, the control right.
4375
4507
  #### Preferences
4376
4508
 
4377
4509
  ```tsx
4378
- <div className="w-720">
4510
+ <div className="w-560">
4379
4511
  <SettingsSection title="General">
4380
4512
  <SettingsGroup>
4381
4513
  <SettingsRow
@@ -4437,7 +4569,7 @@ Settings rows in a rounded group, title and description left, the control right.
4437
4569
  #### Navigation rows
4438
4570
 
4439
4571
  ```tsx
4440
- <div className="w-720">
4572
+ <div className="w-560">
4441
4573
  <SettingsGroup>
4442
4574
  <SettingsRow icon={icons.members} title="Members" description="Who can use this organization." value="5 members" href="#" />
4443
4575
  <SettingsRow icon={icons.providerKey} title="Provider keys" description="Credentials the gateway uses upstream." value="2" href="#" />
@@ -4490,6 +4622,7 @@ A panel from the edge that keeps the list behind it readable: the request inspec
4490
4622
 
4491
4623
  - A dialog; the title names it, the subtitle carries the id.
4492
4624
  - Apps make it URL-addressable so links can open it.
4625
+ - A sheet that isn't modal stays open when the page behind it is pressed, so the next row can fill it.
4493
4626
 
4494
4627
  ### Examples
4495
4628
 
@@ -4931,10 +5064,15 @@ A reference table of five or more columns puts 8px between them, so it fits the
4931
5064
 
4932
5065
  ## TableOfContents
4933
5066
 
4934
- “On this page”: the heading in view in text color with a 2px ink bar.
5067
+ “On this page”: the heading in view in text color with a 2px ink bar on the rail.
4935
5068
 
4936
5069
  `import { TableOfContents } from "@logicplanes/kaeso-ui";`
4937
5070
 
5071
+ ### Accessibility
5072
+
5073
+ - A navigation landmark named by its title; the heading in view has aria-current=location.
5074
+ - Links are 32px tall, 44px with a coarse pointer; the rail and the bar sit on the start side, so they move to the right in right-to-left pages.
5075
+
4938
5076
  ### Examples
4939
5077
 
4940
5078
  #### Basic
@@ -4953,12 +5091,14 @@ Underline tabs for detail pages and pill tabs for page headers.
4953
5091
 
4954
5092
  | Key | Action |
4955
5093
  |---|---|
4956
- | Left Right | Moves between tabs |
4957
- | Home End | First and last tab |
5094
+ | Left Right | Moves focus between tabs |
5095
+ | Home End | Moves focus to the first or last tab |
5096
+ | Enter Space | Opens the focused tab |
4958
5097
 
4959
5098
  ### Accessibility
4960
5099
 
4961
- - role=tablist with tabs and panels wired by Base UI.
5100
+ - role=tablist with tabs and panels wired by Base UI; arrows move focus and Enter or Space opens the tab, so a slow panel never loads on the way past.
5101
+ - Focus rings sit inside the pill, so a scrolling tab list never cuts them; in forced colours the selected tab keeps a Highlight outline and the indicator a solid line.
4962
5102
 
4963
5103
  ### Examples
4964
5104
 
@@ -5047,7 +5187,7 @@ function Toggle() {
5047
5187
 
5048
5188
  ## TagInput
5049
5189
 
5050
- Removable tags in a field: Enter, comma and paste split them; Backspace removes the last.
5190
+ Removable tags in a field: Enter, comma and paste split them; Backspace selects the last, a second press removes it.
5051
5191
 
5052
5192
  `import { TagInput } from "@logicplanes/kaeso-ui";`
5053
5193
 
@@ -5057,11 +5197,15 @@ Removable tags in a field: Enter, comma and paste split them; Backspace removes
5057
5197
  |---|---|
5058
5198
  | Enter | Adds the typed tag |
5059
5199
  | , | Adds the typed tag |
5060
- | Backspace | Removes the last tag when the field is empty |
5200
+ | Backspace | Selects the last tag from the start of the field; a second press removes it |
5201
+ | ← → | Moves the selection between tags from the start of the field |
5202
+ | Delete | Removes the selected tag |
5203
+ | Escape | Lets go of the selected tag |
5061
5204
 
5062
5205
  ### Accessibility
5063
5206
 
5064
- - Each tag's remove circle is named “Remove …”.
5207
+ - Each tag's remove circle is named “Remove …”; after it, focus goes back to the field.
5208
+ - Selecting and removing a tag is announced through a polite live region, so nothing goes silently.
5065
5209
  - Invalid tags stay, marked with the danger ring; each says what is wrong in its tooltip, and the first problem shows under the field.
5066
5210
 
5067
5211
  ### Examples
@@ -5084,7 +5228,7 @@ Text in the type scale: one scale, used the same way everywhere.
5084
5228
 
5085
5229
  - Text renders a span by default; pass as="p" for paragraphs.
5086
5230
  - Truncated text gets a tooltip with the full string and becomes focusable so keyboard users can read it.
5087
- - Tertiary never carries meaning alone (3.23:1 on white).
5231
+ - Tertiary measures at least 4.5:1 on every surface, and still never carries meaning alone.
5088
5232
 
5089
5233
  ### Examples
5090
5234
 
@@ -5397,8 +5541,9 @@ An ink capsule at the bottom center: brief, calm, at most three.
5397
5541
  ### Accessibility
5398
5542
 
5399
5543
  - role=status; errors are alerts.
5400
- - Five seconds, paused on hover and focus; swipe to dismiss.
5401
- - Undo lives in the toast, so reversible actions need no confirmation.
5544
+ - Five seconds, paused on hover and focus; swipe, Escape or the close button dismisses.
5545
+ - An error, or a toast with Undo, stays until it is dismissed, so nobody has to race it.
5546
+ - F6 moves the focus to the toasts.
5402
5547
 
5403
5548
  ### Examples
5404
5549
 
@@ -5407,16 +5552,16 @@ An ink capsule at the bottom center: brief, calm, at most three.
5407
5552
  ```tsx
5408
5553
  <>
5409
5554
  <Inline gap={8}>
5410
- <Button onClick={() => toast("Key copied")}>Neutral</Button>
5411
- <Button onClick={() => toast.success("Provider saved")}>Success</Button>
5412
- <Button onClick={() => toast.error("Couldn't reach the provider.", { description: "Check the provider key, then try again." })}>Error</Button>
5413
- <Button onClick={() => toast("Key disabled", { action: { label: "Undo", onClick: () => toast("Key enabled") } })}>With undo</Button>
5555
+ <Button onClick={() => toast("Key copied")}>Copy key</Button>
5556
+ <Button onClick={() => toast.success("Provider saved")}>Save provider</Button>
5557
+ <Button onClick={() => toast.error("Couldn't reach the provider.", { description: "Check the provider key, then try again." })}>Test provider</Button>
5558
+ <Button onClick={() => toast("Key disabled", { action: { label: "Undo", onClick: () => toast("Key enabled") } })}>Disable key</Button>
5414
5559
  <Button
5415
5560
  onClick={() =>
5416
5561
  void toast.promise(new Promise((r) => setTimeout(r, 1600)), { loading: "Syncing models…", success: "Models synced", error: "Couldn't sync models" })
5417
5562
  }
5418
5563
  >
5419
- Promise
5564
+ Sync models
5420
5565
  </Button>
5421
5566
  </Inline>
5422
5567
  </>
@@ -5432,7 +5577,12 @@ Filters, search and display options on one 48px row, with arrow-key focus across
5432
5577
 
5433
5578
  | Key | Action |
5434
5579
  |---|---|
5435
- | Left Right | Moves between controls |
5580
+ | Tab | Enters the toolbar on the control used last, and leaves it |
5581
+ | Left Right | Moves between controls, wrapping at the ends |
5582
+
5583
+ ### Accessibility
5584
+
5585
+ - One tab stop: arrows move inside, skipping the parts of a filter chip that aren't controls; a filled search keeps the arrows for its caret.
5436
5586
 
5437
5587
  ### Examples
5438
5588
 
@@ -5450,7 +5600,7 @@ function Logs() {
5450
5600
  Add filter
5451
5601
  </Button>
5452
5602
  <Toolbar.Spacer />
5453
- <div className="w-240">
5603
+ <div className="order-last basis-full sm:order-none sm:basis-auto sm:w-240">
5454
5604
  <SearchInput aria-label="Search logs" placeholder="Search logs" />
5455
5605
  </div>
5456
5606
  <DisplayOptions {...display} />
@@ -5478,6 +5628,8 @@ A short label on hover and focus: a pill, with a shortcut when there is one.
5478
5628
  - Opens after 500ms, instantly when moving between tooltipped siblings.
5479
5629
  - Never the only place for essential information.
5480
5630
  - Disabled controls show a tooltip only with a disabledReason.
5631
+ - role=tooltip. When it says more than the control's name, it is also the control's accessible description.
5632
+ - A single-line tooltip too long for the screen wraps into the box of several lines.
5481
5633
 
5482
5634
  ### Examples
5483
5635
 
@@ -5515,8 +5667,8 @@ Token kinds in their fixed colors, and limits with their scope, window, kind and
5515
5667
 
5516
5668
  ### Accessibility
5517
5669
 
5518
- - Token kinds always map to the same series: input 1, cache read 6, cache write 2, output 3, reasoning 5.
5519
- - Limits say hard or soft in words.
5670
+ - Token kinds always map to the same series: input blue, cache read a soft blue edged in blue, cache write amber, output emerald, reasoning violet.
5671
+ - Limits say hard or soft in words, and say so when they are over.
5520
5672
 
5521
5673
  ### Examples
5522
5674