@logicplanes/kaeso-ui 0.4.3 → 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 (490) hide show
  1. package/ai/component-guides.md +279 -98
  2. package/ai/component-registry.json +352 -236
  3. package/ai/component-registry.md +241 -219
  4. package/ai/icons.md +2 -2
  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-KIvuE8jg.js +352 -0
  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-CPXJh9cq.js → de-CqC4aSIV.js} +81 -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-CPJWE2N-.js +95 -0
  65. package/dist/chunks/{icon-DVooQfk4.js.map → icon-CPJWE2N-.js.map} +1 -1
  66. package/dist/chunks/{icon-button-CrdF_eMG.js → icon-button-Dfwpvmav.js} +7 -6
  67. package/dist/chunks/icon-button-Dfwpvmav.js.map +1 -0
  68. package/dist/chunks/{identity-BmhQ6BQ-.js → identity-3Foi5F8w.js} +7 -7
  69. package/dist/chunks/{identity-BmhQ6BQ-.js.map → identity-3Foi5F8w.js.map} +1 -1
  70. package/dist/chunks/{input-2VJuj_M4.js → input-Bo5-UZg2.js} +15 -9
  71. package/dist/chunks/input-Bo5-UZg2.js.map +1 -0
  72. package/dist/chunks/{input-group-DQ_4DoXg.js → input-group-jPcK9T_a.js} +42 -29
  73. package/dist/chunks/input-group-jPcK9T_a.js.map +1 -0
  74. package/dist/chunks/iso-field-DoqHBg8n.js +52 -0
  75. package/dist/chunks/iso-field-DoqHBg8n.js.map +1 -0
  76. package/dist/chunks/json-view-DZ2nL2Ir.js +253 -0
  77. package/dist/chunks/json-view-DZ2nL2Ir.js.map +1 -0
  78. package/dist/chunks/{kbd-BF1vKXJf.js → kbd-8A0ML_up.js} +30 -28
  79. package/dist/chunks/kbd-8A0ML_up.js.map +1 -0
  80. package/dist/chunks/label-DW24Aj0Z.js +26 -0
  81. package/dist/chunks/label-DW24Aj0Z.js.map +1 -0
  82. package/dist/chunks/{link-KWI7PevW.js → link-CMjkcLQK.js} +14 -14
  83. package/dist/chunks/link-CMjkcLQK.js.map +1 -0
  84. package/dist/chunks/list-B4G-sWwV.js +540 -0
  85. package/dist/chunks/list-B4G-sWwV.js.map +1 -0
  86. package/dist/chunks/{loader-DCfPndXa.js → loader-zo8CCIGJ.js} +2 -2
  87. package/dist/chunks/{loader-DCfPndXa.js.map → loader-zo8CCIGJ.js.map} +1 -1
  88. package/dist/chunks/markdown-C565aBR7.js +338 -0
  89. package/dist/chunks/markdown-C565aBR7.js.map +1 -0
  90. package/dist/chunks/menu-Clvv6ftq.js +485 -0
  91. package/dist/chunks/menu-Clvv6ftq.js.map +1 -0
  92. package/dist/chunks/merge-refs-BN1FyQt9.js +20 -0
  93. package/dist/chunks/merge-refs-BN1FyQt9.js.map +1 -0
  94. package/dist/chunks/meter-CASMHlxl.js +100 -0
  95. package/dist/chunks/meter-CASMHlxl.js.map +1 -0
  96. package/dist/chunks/nav-sheet-Dt6JSvzX.js +67 -0
  97. package/dist/chunks/nav-sheet-Dt6JSvzX.js.map +1 -0
  98. package/dist/chunks/{nav-wordmark-_pjheAsZ.js → nav-wordmark-J4pB_vjr.js} +4 -8
  99. package/dist/chunks/nav-wordmark-J4pB_vjr.js.map +1 -0
  100. package/dist/chunks/page-header-kS5tdmvb.js +45 -0
  101. package/dist/chunks/page-header-kS5tdmvb.js.map +1 -0
  102. package/dist/chunks/pagination-D7fAm8qg.js +147 -0
  103. package/dist/chunks/pagination-D7fAm8qg.js.map +1 -0
  104. package/dist/chunks/picker-popover-1FHb1LQG.js +119 -0
  105. package/dist/chunks/picker-popover-1FHb1LQG.js.map +1 -0
  106. package/dist/chunks/popover-Bl5QYqnh.js +51 -0
  107. package/dist/chunks/popover-Bl5QYqnh.js.map +1 -0
  108. package/dist/chunks/{portal-context-BBbzDKmY.js → portal-context-CTatR2Z8.js} +14 -4
  109. package/dist/chunks/portal-context-CTatR2Z8.js.map +1 -0
  110. package/dist/chunks/{radio-CDDFpdtL.js → radio-C6GtzF_t.js} +38 -23
  111. package/dist/chunks/radio-C6GtzF_t.js.map +1 -0
  112. package/dist/chunks/range-popup-lGiZsG3s.js +160 -0
  113. package/dist/chunks/range-popup-lGiZsG3s.js.map +1 -0
  114. package/dist/chunks/reasoning-frame-C3HdQRRS.js +51 -0
  115. package/dist/chunks/reasoning-frame-C3HdQRRS.js.map +1 -0
  116. package/dist/chunks/release-art-ChiT4T2S.js +582 -0
  117. package/dist/chunks/release-art-ChiT4T2S.js.map +1 -0
  118. package/dist/chunks/rights-B68ocZuq.js +312 -0
  119. package/dist/chunks/rights-B68ocZuq.js.map +1 -0
  120. package/dist/chunks/{scroll-area-D8MD7Vpo.js → scroll-area-_Ljh4-bG.js} +11 -6
  121. package/dist/chunks/scroll-area-_Ljh4-bG.js.map +1 -0
  122. package/dist/chunks/section-CFBYhsUi.js +77 -0
  123. package/dist/chunks/section-CFBYhsUi.js.map +1 -0
  124. package/dist/chunks/section-header-DU1Q4Tdf.js +28 -0
  125. package/dist/chunks/section-header-DU1Q4Tdf.js.map +1 -0
  126. package/dist/chunks/segmented-D9i1avik.js +119 -0
  127. package/dist/chunks/segmented-D9i1avik.js.map +1 -0
  128. package/dist/chunks/select-BqjmQOqx.js +222 -0
  129. package/dist/chunks/select-BqjmQOqx.js.map +1 -0
  130. package/dist/chunks/{separator-D7TzNHmX.js → separator-BNWf6BBj.js} +13 -8
  131. package/dist/chunks/separator-BNWf6BBj.js.map +1 -0
  132. package/dist/chunks/sidebar-Dq7oGOje.js +664 -0
  133. package/dist/chunks/sidebar-Dq7oGOje.js.map +1 -0
  134. package/dist/chunks/{sidebar-menu-BN3jkTlK.js → sidebar-menu-QSSNu1jJ.js} +2 -2
  135. package/dist/chunks/{sidebar-menu-BN3jkTlK.js.map → sidebar-menu-QSSNu1jJ.js.map} +1 -1
  136. package/dist/chunks/{skeleton-Dcz57Zyp.js → skeleton-D-qk3mes.js} +3 -3
  137. package/dist/chunks/skeleton-D-qk3mes.js.map +1 -0
  138. package/dist/chunks/slider-CcE8GtuV.js +58 -0
  139. package/dist/chunks/slider-CcE8GtuV.js.map +1 -0
  140. package/dist/chunks/{status-dot-QJTF0Yv4.js → status-dot-CP6runiC.js} +4 -4
  141. package/dist/chunks/{status-dot-QJTF0Yv4.js.map → status-dot-CP6runiC.js.map} +1 -1
  142. package/dist/chunks/{styles-CVJU9t9v.js → styles-hkFkoBbi.js} +2 -2
  143. package/dist/chunks/{styles-CVJU9t9v.js.map → styles-hkFkoBbi.js.map} +1 -1
  144. package/dist/chunks/{swap-text-Dr0Irxz6.js → swap-text-SlUjrTlG.js} +3 -3
  145. package/dist/chunks/swap-text-SlUjrTlG.js.map +1 -0
  146. package/dist/chunks/switch-ngywMQdl.js +76 -0
  147. package/dist/chunks/switch-ngywMQdl.js.map +1 -0
  148. package/dist/chunks/table-CTK5E0J7.js +102 -0
  149. package/dist/chunks/table-CTK5E0J7.js.map +1 -0
  150. package/dist/chunks/tag-BGr6lTSV.js +100 -0
  151. package/dist/chunks/tag-BGr6lTSV.js.map +1 -0
  152. package/dist/chunks/{text-CIXH8rmT.js → text-DkKdTVUf.js} +9 -9
  153. package/dist/chunks/text-DkKdTVUf.js.map +1 -0
  154. package/dist/chunks/{textarea--4FRL3Pb.js → textarea-CO0HP6fK.js} +47 -36
  155. package/dist/chunks/textarea-CO0HP6fK.js.map +1 -0
  156. package/dist/chunks/timeseries-Ck-q0wWn.js +381 -0
  157. package/dist/chunks/timeseries-Ck-q0wWn.js.map +1 -0
  158. package/dist/chunks/toolbar-u0Gm7Q7-.js +61 -0
  159. package/dist/chunks/toolbar-u0Gm7Q7-.js.map +1 -0
  160. package/dist/chunks/tooltip-Tkm-urbi.js +202 -0
  161. package/dist/chunks/tooltip-Tkm-urbi.js.map +1 -0
  162. package/dist/chunks/tooltip-root-BC_RNNiP.js +70 -0
  163. package/dist/chunks/tooltip-root-BC_RNNiP.js.map +1 -0
  164. package/dist/chunks/truncated-d1afmUJT.js +33 -0
  165. package/dist/chunks/truncated-d1afmUJT.js.map +1 -0
  166. package/dist/chunks/use-coarse-pointer-Ml5oE6oX.js +28 -0
  167. package/dist/chunks/use-coarse-pointer-Ml5oE6oX.js.map +1 -0
  168. package/dist/chunks/use-hydrating-COtYVRo4.js +8 -0
  169. package/dist/chunks/use-hydrating-COtYVRo4.js.map +1 -0
  170. package/dist/chunks/use-scroll-fade-uc8mWSDX.js +30 -0
  171. package/dist/chunks/use-scroll-fade-uc8mWSDX.js.map +1 -0
  172. package/dist/chunks/{zh-CN-29X4CDLE.js → zh-CN-BlpsT6d_.js} +80 -39
  173. package/dist/chunks/zh-CN-BlpsT6d_.js.map +1 -0
  174. package/dist/components/agent-avatar.js +1 -1
  175. package/dist/components/app-frame.js +2 -2
  176. package/dist/components/avatar.js +1 -1
  177. package/dist/components/badge.js +1 -1
  178. package/dist/components/banner.js +1 -1
  179. package/dist/components/button-group.js +22 -22
  180. package/dist/components/button-group.js.map +1 -1
  181. package/dist/components/button.js +1 -1
  182. package/dist/components/calendar.js +1 -1
  183. package/dist/components/charts/bar.js +235 -160
  184. package/dist/components/charts/bar.js.map +1 -1
  185. package/dist/components/charts/donut.js +144 -99
  186. package/dist/components/charts/donut.js.map +1 -1
  187. package/dist/components/charts/gauge.js +61 -49
  188. package/dist/components/charts/gauge.js.map +1 -1
  189. package/dist/components/charts/heatmap.js +179 -70
  190. package/dist/components/charts/heatmap.js.map +1 -1
  191. package/dist/components/charts/sankey.js +144 -77
  192. package/dist/components/charts/sankey.js.map +1 -1
  193. package/dist/components/charts/sparkline.js +54 -38
  194. package/dist/components/charts/sparkline.js.map +1 -1
  195. package/dist/components/charts/timeseries.js +1 -1
  196. package/dist/components/charts.js +2 -2
  197. package/dist/components/checkbox.js +1 -1
  198. package/dist/components/code-block.js +4 -3
  199. package/dist/components/code.js +1 -1
  200. package/dist/components/collapsible.js +77 -1
  201. package/dist/components/collapsible.js.map +1 -0
  202. package/dist/components/combobox.js +1 -1
  203. package/dist/components/command-list.js +2 -2
  204. package/dist/components/command-palette.js +89 -66
  205. package/dist/components/command-palette.js.map +1 -1
  206. package/dist/components/copy-button.js +1 -1
  207. package/dist/components/data-table.js +1 -459
  208. package/dist/components/date-picker.js +162 -151
  209. package/dist/components/date-picker.js.map +1 -1
  210. package/dist/components/dialog.js +74 -63
  211. package/dist/components/dialog.js.map +1 -1
  212. package/dist/components/display-options.js +76 -64
  213. package/dist/components/display-options.js.map +1 -1
  214. package/dist/components/empty.js +1 -1
  215. package/dist/components/field.js +1 -1
  216. package/dist/components/figure.js +2 -2
  217. package/dist/components/filter-chip.js +36 -27
  218. package/dist/components/filter-chip.js.map +1 -1
  219. package/dist/components/filter-row.js +4 -4
  220. package/dist/components/filter-row.js.map +1 -1
  221. package/dist/components/flow.js +94 -63
  222. package/dist/components/flow.js.map +1 -1
  223. package/dist/components/heading.js +1 -1
  224. package/dist/components/icon-button.js +1 -1
  225. package/dist/components/icon.js +2 -2
  226. package/dist/components/input.js +176 -98
  227. package/dist/components/input.js.map +1 -1
  228. package/dist/components/kaeso/conversation.js +51 -46
  229. package/dist/components/kaeso/conversation.js.map +1 -1
  230. package/dist/components/kaeso/identity.js +1 -1
  231. package/dist/components/kaeso/moments.js +23 -20
  232. package/dist/components/kaeso/moments.js.map +1 -1
  233. package/dist/components/kaeso/rights.js +1 -1
  234. package/dist/components/kaeso/usage.js +90 -74
  235. package/dist/components/kaeso/usage.js.map +1 -1
  236. package/dist/components/kaeso.js +200 -187
  237. package/dist/components/kaeso.js.map +1 -1
  238. package/dist/components/kbd.js +1 -1
  239. package/dist/components/key-value.js +32 -47
  240. package/dist/components/key-value.js.map +1 -1
  241. package/dist/components/label.js +1 -25
  242. package/dist/components/layout.js +2 -2
  243. package/dist/components/layout.js.map +1 -1
  244. package/dist/components/link.js +1 -1
  245. package/dist/components/list.js +1 -1
  246. package/dist/components/loader.js +11 -10
  247. package/dist/components/loader.js.map +1 -1
  248. package/dist/components/logo.js +2 -2
  249. package/dist/components/markdown.js +1 -1
  250. package/dist/components/menu.js +2 -2
  251. package/dist/components/meter.js +1 -1
  252. package/dist/components/page-header.js +1 -1
  253. package/dist/components/pagination.js +1 -1
  254. package/dist/components/playground.js +644 -529
  255. package/dist/components/playground.js.map +1 -1
  256. package/dist/components/popover.js +4 -4
  257. package/dist/components/popover.js.map +1 -1
  258. package/dist/components/portal.js +1 -1
  259. package/dist/components/qr-code.js +2 -2
  260. package/dist/components/qr-code.js.map +1 -1
  261. package/dist/components/radio.js +1 -1
  262. package/dist/components/release-art.js +1 -1
  263. package/dist/components/scroll-area.js +1 -1
  264. package/dist/components/section.js +1 -1
  265. package/dist/components/segmented.js +1 -1
  266. package/dist/components/select.js +1 -1
  267. package/dist/components/separator.js +1 -1
  268. package/dist/components/settings.js +39 -46
  269. package/dist/components/settings.js.map +1 -1
  270. package/dist/components/sheet.js +10 -9
  271. package/dist/components/sheet.js.map +1 -1
  272. package/dist/components/sidebar.js +1 -1
  273. package/dist/components/skeleton.js +1 -1
  274. package/dist/components/slider.js +1 -1
  275. package/dist/components/stat.js +98 -84
  276. package/dist/components/stat.js.map +1 -1
  277. package/dist/components/status-dot.js +1 -1
  278. package/dist/components/surface.js +1 -1
  279. package/dist/components/swap-text.js +1 -1
  280. package/dist/components/switch.js +1 -1
  281. package/dist/components/table.js +1 -1
  282. package/dist/components/tabs.js +73 -55
  283. package/dist/components/tabs.js.map +1 -1
  284. package/dist/components/tag.js +1 -1
  285. package/dist/components/text.js +1 -1
  286. package/dist/components/theme-image.js +1 -1
  287. package/dist/components/theme-menu.js +5 -2
  288. package/dist/components/theme-menu.js.map +1 -1
  289. package/dist/components/theme-select.js +1 -1
  290. package/dist/components/thumbnail.js +35 -24
  291. package/dist/components/thumbnail.js.map +1 -1
  292. package/dist/components/timeline.js +51 -35
  293. package/dist/components/timeline.js.map +1 -1
  294. package/dist/components/toast.js +76 -66
  295. package/dist/components/toast.js.map +1 -1
  296. package/dist/components/toc.js +14 -8
  297. package/dist/components/toc.js.map +1 -1
  298. package/dist/components/toolbar.js +1 -1
  299. package/dist/components/tooltip.js +1 -1
  300. package/dist/components/visually-hidden.js +1 -1
  301. package/dist/i18n-provider.js +1 -1
  302. package/dist/index.js +101 -101
  303. package/dist/kaeso.css +605 -67
  304. package/dist/styles.css +1 -1
  305. package/dist/tailwind.css +1 -1
  306. package/dist/types/blocks/delete-resource/delete-resource.d.ts +2 -2
  307. package/dist/types/components/agent-avatar/agent-avatar.d.ts +24 -19
  308. package/dist/types/components/badge/badge.d.ts +3 -3
  309. package/dist/types/components/banner/banner.d.ts +3 -3
  310. package/dist/types/components/button/button.d.ts +2 -2
  311. package/dist/types/components/button-group/button-group.d.ts +1 -1
  312. package/dist/types/components/charts/domain.d.ts +11 -0
  313. package/dist/types/components/charts/marks.d.ts +1 -0
  314. package/dist/types/components/code/code.d.ts +3 -3
  315. package/dist/types/components/code-block/diff-view.d.ts +30 -0
  316. package/dist/types/components/code-block/diff.d.ts +26 -0
  317. package/dist/types/components/code-block/docs.d.ts +14 -0
  318. package/dist/types/components/code-block/index.d.ts +1 -0
  319. package/dist/types/components/code-block/json-view.d.ts +2 -1
  320. package/dist/types/components/code-block/numbers.d.ts +1 -0
  321. package/dist/types/components/collapsible/collapsible.d.ts +2 -2
  322. package/dist/types/components/collapsible/disclosure.d.ts +2 -0
  323. package/dist/types/components/data-table/data-table.d.ts +6 -5
  324. package/dist/types/components/data-table/docs.d.ts +1 -0
  325. package/dist/types/components/data-table/time-columns.d.ts +1 -0
  326. package/dist/types/components/date-picker/focus-day.d.ts +1 -0
  327. package/dist/types/components/date-picker/iso-field.d.ts +8 -1
  328. package/dist/types/components/dialog/dialog.d.ts +7 -7
  329. package/dist/types/components/field/field.d.ts +1 -1
  330. package/dist/types/components/flow/flow.d.ts +1 -1
  331. package/dist/types/components/icon-button/icon-button.d.ts +1 -1
  332. package/dist/types/components/input/input-group.d.ts +2 -0
  333. package/dist/types/components/input/number-input.d.ts +4 -4
  334. package/dist/types/components/input/otp-input.d.ts +3 -3
  335. package/dist/types/components/kaeso/client-button.d.ts +2 -1
  336. package/dist/types/components/kaeso/provider-picker.d.ts +1 -0
  337. package/dist/types/components/kaeso/rights.d.ts +1 -1
  338. package/dist/types/components/kaeso/role-picker.d.ts +1 -0
  339. package/dist/types/components/key-value/key-value.d.ts +2 -2
  340. package/dist/types/components/layout/layout.d.ts +2 -2
  341. package/dist/types/components/link/link.d.ts +4 -4
  342. package/dist/types/components/list/list.d.ts +2 -2
  343. package/dist/types/components/menu/menu.d.ts +2 -1
  344. package/dist/types/components/menu/styles.d.ts +3 -3
  345. package/dist/types/components/meter/meter.d.ts +3 -3
  346. package/dist/types/components/page-header/page-header.d.ts +1 -1
  347. package/dist/types/components/pagination/pagination.d.ts +2 -2
  348. package/dist/types/components/playground/prompt-suggestions.d.ts +1 -0
  349. package/dist/types/components/playground/reasoning-frame.d.ts +14 -0
  350. package/dist/types/components/playground/reasoning.d.ts +1 -0
  351. package/dist/types/components/popover/popover.d.ts +1 -1
  352. package/dist/types/components/scroll-area/scroll-area.d.ts +2 -2
  353. package/dist/types/components/section/section-header.d.ts +6 -0
  354. package/dist/types/components/segmented/segmented.d.ts +1 -0
  355. package/dist/types/components/select/select.d.ts +1 -1
  356. package/dist/types/components/sheet/sheet.d.ts +3 -3
  357. package/dist/types/components/sidebar/sidebar.d.ts +1 -0
  358. package/dist/types/components/slider/slider.d.ts +2 -2
  359. package/dist/types/components/stat/stat.d.ts +1 -1
  360. package/dist/types/components/tabs/tabs.d.ts +6 -4
  361. package/dist/types/components/text/truncated.d.ts +7 -0
  362. package/dist/types/components/timeline/timeline.d.ts +5 -5
  363. package/dist/types/components/toc/toc.d.ts +1 -1
  364. package/dist/types/components/toolbar/toolbar.d.ts +1 -1
  365. package/dist/types/components/tooltip/tooltip.d.ts +2 -2
  366. package/dist/types/components/tooltip/trigger-props.d.ts +1 -0
  367. package/dist/types/hooks/use-coarse-pointer.d.ts +1 -0
  368. package/dist/types/hooks/use-hydrating.d.ts +1 -0
  369. package/dist/types/icons/groups.d.ts +1 -1
  370. package/dist/types/icons/vocabulary.d.ts +5 -0
  371. package/dist/types/utils/arrow-focus.d.ts +4 -1
  372. package/dist/types/utils/cn.d.ts +33 -0
  373. package/dist/types/utils/portal-context.d.ts +7 -1
  374. package/dist/utils.js +2 -2
  375. package/foundations/accessibility.md +3 -2
  376. package/foundations/color.md +5 -1
  377. package/foundations/elevation.md +1 -0
  378. package/foundations/motion.md +1 -1
  379. package/foundations/shape.md +2 -2
  380. package/foundations/typography.md +12 -12
  381. package/package.json +2 -2
  382. package/dist/chunks/agent-avatar-0pdBTWkR.js +0 -171
  383. package/dist/chunks/agent-avatar-0pdBTWkR.js.map +0 -1
  384. package/dist/chunks/app-frame-DogGRmsu.js +0 -221
  385. package/dist/chunks/app-frame-DogGRmsu.js.map +0 -1
  386. package/dist/chunks/arrow-focus-BcySmwwU.js +0 -11
  387. package/dist/chunks/arrow-focus-BcySmwwU.js.map +0 -1
  388. package/dist/chunks/avatar-CWbdwbJv.js +0 -83
  389. package/dist/chunks/avatar-CWbdwbJv.js.map +0 -1
  390. package/dist/chunks/badge-C2KtxCLB.js +0 -26
  391. package/dist/chunks/badge-C2KtxCLB.js.map +0 -1
  392. package/dist/chunks/banner-BA2ALw9M.js +0 -85
  393. package/dist/chunks/banner-BA2ALw9M.js.map +0 -1
  394. package/dist/chunks/button-CzuxqawA.js +0 -164
  395. package/dist/chunks/button-CzuxqawA.js.map +0 -1
  396. package/dist/chunks/calendar-BWaf2MXc.js.map +0 -1
  397. package/dist/chunks/checkbox-CQjwCPkc.js +0 -126
  398. package/dist/chunks/checkbox-CQjwCPkc.js.map +0 -1
  399. package/dist/chunks/cn-Dj6sRgkF.js.map +0 -1
  400. package/dist/chunks/code-block-D5A-CGXG.js +0 -330
  401. package/dist/chunks/code-block-D5A-CGXG.js.map +0 -1
  402. package/dist/chunks/code-tqj0uhBL.js.map +0 -1
  403. package/dist/chunks/collapsible-CKrCX_T9.js +0 -87
  404. package/dist/chunks/collapsible-CKrCX_T9.js.map +0 -1
  405. package/dist/chunks/combobox-DjDI7SUC.js +0 -319
  406. package/dist/chunks/combobox-DjDI7SUC.js.map +0 -1
  407. package/dist/chunks/command-list-C2Y7V_lt.js +0 -418
  408. package/dist/chunks/command-list-C2Y7V_lt.js.map +0 -1
  409. package/dist/chunks/copy-button-FJvPJn72.js.map +0 -1
  410. package/dist/chunks/core-BYns5ytV.js +0 -472
  411. package/dist/chunks/core-BYns5ytV.js.map +0 -1
  412. package/dist/chunks/date-popup-CPA_zt6o.js +0 -35
  413. package/dist/chunks/date-popup-CPA_zt6o.js.map +0 -1
  414. package/dist/chunks/de-CPXJh9cq.js.map +0 -1
  415. package/dist/chunks/dialog-Cg9A_6SF.js.map +0 -1
  416. package/dist/chunks/field-TviMvYa2.js.map +0 -1
  417. package/dist/chunks/hidden-description-B2zSmLcn.js +0 -23
  418. package/dist/chunks/hidden-description-B2zSmLcn.js.map +0 -1
  419. package/dist/chunks/icon-DVooQfk4.js +0 -94
  420. package/dist/chunks/icon-button-CrdF_eMG.js.map +0 -1
  421. package/dist/chunks/input-2VJuj_M4.js.map +0 -1
  422. package/dist/chunks/input-group-DQ_4DoXg.js.map +0 -1
  423. package/dist/chunks/iso-field-B2rTwiBo.js +0 -33
  424. package/dist/chunks/iso-field-B2rTwiBo.js.map +0 -1
  425. package/dist/chunks/json-view-Dqd2TDkc.js +0 -175
  426. package/dist/chunks/json-view-Dqd2TDkc.js.map +0 -1
  427. package/dist/chunks/kbd-BF1vKXJf.js.map +0 -1
  428. package/dist/chunks/link-KWI7PevW.js.map +0 -1
  429. package/dist/chunks/list-M1csq-d4.js +0 -494
  430. package/dist/chunks/list-M1csq-d4.js.map +0 -1
  431. package/dist/chunks/markdown-DULktoTK.js +0 -313
  432. package/dist/chunks/markdown-DULktoTK.js.map +0 -1
  433. package/dist/chunks/menu-DEmBfdPm.js +0 -450
  434. package/dist/chunks/menu-DEmBfdPm.js.map +0 -1
  435. package/dist/chunks/meter-Bj4N3Xuh.js +0 -84
  436. package/dist/chunks/meter-Bj4N3Xuh.js.map +0 -1
  437. package/dist/chunks/nav-sheet-CzgIwgAm.js +0 -60
  438. package/dist/chunks/nav-sheet-CzgIwgAm.js.map +0 -1
  439. package/dist/chunks/nav-wordmark-_pjheAsZ.js.map +0 -1
  440. package/dist/chunks/page-header-DL2y2iZp.js +0 -41
  441. package/dist/chunks/page-header-DL2y2iZp.js.map +0 -1
  442. package/dist/chunks/pagination-Cn_qF4cg.js +0 -86
  443. package/dist/chunks/pagination-Cn_qF4cg.js.map +0 -1
  444. package/dist/chunks/picker-popover-BxyU1U9F.js +0 -106
  445. package/dist/chunks/picker-popover-BxyU1U9F.js.map +0 -1
  446. package/dist/chunks/popover-DNN4S47w.js +0 -50
  447. package/dist/chunks/popover-DNN4S47w.js.map +0 -1
  448. package/dist/chunks/portal-context-BBbzDKmY.js.map +0 -1
  449. package/dist/chunks/radio-CDDFpdtL.js.map +0 -1
  450. package/dist/chunks/range-popup-CRyWYUB1.js +0 -128
  451. package/dist/chunks/range-popup-CRyWYUB1.js.map +0 -1
  452. package/dist/chunks/release-art-ZwfFQImt.js +0 -561
  453. package/dist/chunks/release-art-ZwfFQImt.js.map +0 -1
  454. package/dist/chunks/rights-Cyp0Pzp-.js +0 -279
  455. package/dist/chunks/rights-Cyp0Pzp-.js.map +0 -1
  456. package/dist/chunks/scroll-area-D8MD7Vpo.js.map +0 -1
  457. package/dist/chunks/scroll-parent-WXvzQcUo.js +0 -14
  458. package/dist/chunks/scroll-parent-WXvzQcUo.js.map +0 -1
  459. package/dist/chunks/section-Ce1efbsP.js +0 -87
  460. package/dist/chunks/section-Ce1efbsP.js.map +0 -1
  461. package/dist/chunks/segmented-CErcoxwi.js +0 -114
  462. package/dist/chunks/segmented-CErcoxwi.js.map +0 -1
  463. package/dist/chunks/select-x4XVsdCI.js +0 -210
  464. package/dist/chunks/select-x4XVsdCI.js.map +0 -1
  465. package/dist/chunks/separator-D7TzNHmX.js.map +0 -1
  466. package/dist/chunks/sidebar-3r1ZRXlN.js +0 -621
  467. package/dist/chunks/sidebar-3r1ZRXlN.js.map +0 -1
  468. package/dist/chunks/skeleton-Dcz57Zyp.js.map +0 -1
  469. package/dist/chunks/slider-Ci83PGtj.js +0 -57
  470. package/dist/chunks/slider-Ci83PGtj.js.map +0 -1
  471. package/dist/chunks/swap-text-Dr0Irxz6.js.map +0 -1
  472. package/dist/chunks/switch-BNMq_kGt.js +0 -59
  473. package/dist/chunks/switch-BNMq_kGt.js.map +0 -1
  474. package/dist/chunks/table-BeOSKl_3.js +0 -84
  475. package/dist/chunks/table-BeOSKl_3.js.map +0 -1
  476. package/dist/chunks/tag-D_M1s2qS.js +0 -87
  477. package/dist/chunks/tag-D_M1s2qS.js.map +0 -1
  478. package/dist/chunks/text-CIXH8rmT.js.map +0 -1
  479. package/dist/chunks/textarea--4FRL3Pb.js.map +0 -1
  480. package/dist/chunks/timeseries-D1xjRXfk.js +0 -339
  481. package/dist/chunks/timeseries-D1xjRXfk.js.map +0 -1
  482. package/dist/chunks/toolbar-WA_oZgu-.js +0 -37
  483. package/dist/chunks/toolbar-WA_oZgu-.js.map +0 -1
  484. package/dist/chunks/tooltip-OcwO0VUT.js +0 -154
  485. package/dist/chunks/tooltip-OcwO0VUT.js.map +0 -1
  486. package/dist/chunks/tooltip-root-DzahJDVj.js +0 -60
  487. package/dist/chunks/tooltip-root-DzahJDVj.js.map +0 -1
  488. package/dist/chunks/zh-CN-29X4CDLE.js.map +0 -1
  489. package/dist/components/data-table.js.map +0 -1
  490. 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.3. 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."
1418
+ onConfirm={() => new Promise((r) => setTimeout(r, 900))}
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."
1370
1431
  onConfirm={() => new Promise((r) => setTimeout(r, 900))}
1371
- trigger={<Button variant="danger-secondary">Archive project</Button>}
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>
@@ -1686,6 +1742,35 @@ function CreateKey() {
1686
1742
  }
1687
1743
  ```
1688
1744
 
1745
+ ## DiffView
1746
+
1747
+ Two versions in one column: removed lines on red, added on green, changed words marked, unchanged runs folded.
1748
+
1749
+ `import { DiffView } from "@logicplanes/kaeso-ui";`
1750
+
1751
+ ### Accessibility
1752
+
1753
+ - Each changed line starts with “Added” or “Removed” for screen readers; the + and − marks and the colour are only for sight.
1754
+ - The title bar says how many lines were added and removed, and each folded run is a button that names how many lines it shows.
1755
+
1756
+ ### Examples
1757
+
1758
+ #### An audit event
1759
+
1760
+ ```tsx
1761
+ <div className="w-560 max-w-full">
1762
+ <DiffView title="Before → after" lang="json" before={json(credential)} after={json(moved)} wrap />
1763
+ </div>
1764
+ ```
1765
+
1766
+ #### With line numbers
1767
+
1768
+ ```tsx
1769
+ <div className="w-560 max-w-full">
1770
+ <DiffView title="limit.json" lang="json" before={json(limit)} after={json(raised)} lineNumbers />
1771
+ </div>
1772
+ ```
1773
+
1689
1774
  ## DisplayOptions
1690
1775
 
1691
1776
  View, grouping and ordering, toggles, and the properties to show, behind one circle at the end of a toolbar.
@@ -1762,7 +1847,7 @@ What someone can do at a glance: a row per group, in words, under the roles it c
1762
1847
 
1763
1848
  ## Empty
1764
1849
 
1765
- 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.
1766
1851
 
1767
1852
  `import { Empty } from "@logicplanes/kaeso-ui";`
1768
1853
 
@@ -1773,13 +1858,12 @@ What is absent and the next step: an icon circle, a title, one sentence, one or
1773
1858
  ```tsx
1774
1859
  <Empty
1775
1860
  title="No keys yet"
1776
- description="Create a key so an application can call the gateway."
1777
- actions={
1861
+ description={
1778
1862
  <>
1779
- <Button variant="primary">Create key</Button>
1780
- <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>
1781
1864
  </>
1782
1865
  }
1866
+ actions={<Button variant="primary">Create key</Button>}
1783
1867
  />
1784
1868
  ```
1785
1869
 
@@ -1800,6 +1884,8 @@ A label, a control and its help, wired together; an error shows under the contro
1800
1884
  - The label points at the control; help is in aria-describedby.
1801
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.
1802
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.
1803
1889
 
1804
1890
  ### Examples
1805
1891
 
@@ -1830,8 +1916,8 @@ A label, a control and its help, wired together; an error shows under the contro
1830
1916
  <Field label="Name" layout="horizontal" description="Shown in logs.">
1831
1917
  <Input defaultValue="checkout-web" />
1832
1918
  </Field>
1833
- <Field label="Monthly budget" layout="horizontal" invalid>
1834
- <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" />
1835
1921
  </Field>
1836
1922
  </div>
1837
1923
  ```
@@ -2011,6 +2097,33 @@ A node-and-connector diagram for the route: app → Kaeso → provider and model
2011
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" />
2012
2098
  ```
2013
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
+
2014
2127
  ## Gauge
2015
2128
 
2016
2129
  A semicircle for “budget used”; thresholds as ticks.
@@ -2142,11 +2255,11 @@ Hugeicons free, Stroke Rounded, in currentColor. One icon per Kaeso concept.
2142
2255
  #### Vocabulary
2143
2256
 
2144
2257
  ```tsx
2145
- <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">
2146
2259
  {(Object.keys(icons) as IconName[]).map((n) => (
2147
- <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">
2148
2261
  <Icon icon={icons[n]} size="sm" className="text-fg" />
2149
- <span className="mono truncate">{n}</span>
2262
+ <span className="mono min-w-0 text-caption wrap-anywhere sm:text-small">{n}</span>
2150
2263
  </div>
2151
2264
  ))}
2152
2265
  </div>
@@ -2169,7 +2282,7 @@ A circle with an icon, a required name, and a tooltip that says it.
2169
2282
 
2170
2283
  - aria-label is required by the types; it is also the tooltip, so sighted and screen-reader users get the same name.
2171
2284
  - Shortcuts appear in the tooltip as key caps.
2172
- - 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.
2173
2286
 
2174
2287
  ### Examples
2175
2288
 
@@ -2239,12 +2352,12 @@ A pill text field with the secondary material and a soft focus halo.
2239
2352
 
2240
2353
  #### With label and help
2241
2354
 
2242
- 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.
2243
2356
 
2244
2357
  ```tsx
2245
2358
  <div className="flex w-360 flex-col gap-24">
2246
2359
  <Input label="Key name" description="Shown in logs and the audit log." placeholder="checkout-web" />
2247
- <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." />
2248
2361
  </div>
2249
2362
  ```
2250
2363
 
@@ -2286,6 +2399,7 @@ Addons inside the pill: text, icons, a ghost circle or a key cap, sharing one fo
2286
2399
  ### Accessibility
2287
2400
 
2288
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.
2289
2403
 
2290
2404
  ### Examples
2291
2405
 
@@ -2294,12 +2408,12 @@ Addons inside the pill: text, icons, a ghost circle or a key cap, sharing one fo
2294
2408
  ```tsx
2295
2409
  <div className="flex w-400 flex-col gap-12">
2296
2410
  <InputGroup>
2297
- <InputGroup.Addon>https://</InputGroup.Addon>
2411
+ <InputGroup.Addon data-join>https://</InputGroup.Addon>
2298
2412
  <InputGroup.Input aria-label="Host" placeholder="kaeso.example.com" />
2299
2413
  <InputGroup.Addon>/v1</InputGroup.Addon>
2300
2414
  </InputGroup>
2301
2415
  <InputGroup trailingButton>
2302
- <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 />
2303
2417
  <InputGroup.Button icon={icons.copy} aria-label="Copy" />
2304
2418
  </InputGroup>
2305
2419
  <InputGroup leadingIcon>
@@ -2315,6 +2429,20 @@ A folding JSON tree: copy any path, highlight a search.
2315
2429
 
2316
2430
  `import { JsonView } from "@logicplanes/kaeso-ui";`
2317
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
+
2318
2446
  ### Examples
2319
2447
 
2320
2448
  #### Request body
@@ -2339,7 +2467,8 @@ Key caps and shortcuts: ⌘ ⌥ ⇧ ⌃ on macOS, words elsewhere; sequences lik
2339
2467
 
2340
2468
  ### Accessibility
2341
2469
 
2342
- - 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.
2343
2472
 
2344
2473
  ### Examples
2345
2474
 
@@ -2490,6 +2619,7 @@ The name of a field: 14/500, with an optional “Optional”.
2490
2619
  ### Accessibility
2491
2620
 
2492
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.
2493
2623
 
2494
2624
  ### Examples
2495
2625
 
@@ -2518,7 +2648,7 @@ A second layer slides over the first (add model → review values); Back returns
2518
2648
 
2519
2649
  | Key | Action |
2520
2650
  |---|---|
2521
- | Escape | Closes and returns focus to the trigger |
2651
+ | Escape | Closes the dialog from any layer and returns focus to the trigger |
2522
2652
  | Tab | Moves within the layer shown |
2523
2653
  | mod Enter | Calls onSubmit, on every layer |
2524
2654
 
@@ -2636,7 +2766,7 @@ function Wizard() {
2636
2766
 
2637
2767
  ## Link
2638
2768
 
2639
- 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.
2640
2770
 
2641
2771
  `import { Link } from "@logicplanes/kaeso-ui";`
2642
2772
 
@@ -2650,6 +2780,7 @@ Links look like links: text color with a quiet underline that turns solid on hov
2650
2780
 
2651
2781
  - External links open in a new tab, add rel="noopener noreferrer" and say so to screen readers.
2652
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.
2653
2784
 
2654
2785
  ### Examples
2655
2786
 
@@ -2954,6 +3085,7 @@ A rounded dropdown: 16px radius, 34px rows, icons that wake on highlight.
2954
3085
  - role=menu with menuitem, menuitemcheckbox and menuitemradio.
2955
3086
  - Groups of more than seven items get a caption or a separator.
2956
3087
  - Danger items name the action: “Delete key”.
3088
+ - An item's shortcut and hint describe it; its name is the label alone.
2957
3089
 
2958
3090
  ### Examples
2959
3091
 
@@ -2970,9 +3102,7 @@ A rounded dropdown: 16px radius, 34px rows, icons that wake on highlight.
2970
3102
  <Menu.Item icon={icons.limit}>Edit limits</Menu.Item>
2971
3103
  <Menu.Separator />
2972
3104
  <Menu.Item icon={icons.hide}>Disable</Menu.Item>
2973
- <Menu.Item icon={icons.delete} variant="danger">
2974
- Archive key
2975
- </Menu.Item>
3105
+ <Menu.Item variant="danger">Archive key</Menu.Item>
2976
3106
  </Menu.Content>
2977
3107
  </Menu>
2978
3108
  ```
@@ -3174,7 +3304,7 @@ function Catalogue() {
3174
3304
 
3175
3305
  ## NumberInput
3176
3306
 
3177
- 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.
3178
3308
 
3179
3309
  `import { NumberInput } from "@logicplanes/kaeso-ui";`
3180
3310
 
@@ -3184,11 +3314,14 @@ Exact numbers: right-aligned tabular digits, a unit, steppers on hover, a decima
3184
3314
  |---|---|
3185
3315
  | Up | Increases by the step |
3186
3316
  | Down | Decreases by the step |
3317
+ | Tab | Moves past the field; the steppers are not tab stops, since the arrows do the same |
3187
3318
 
3188
3319
  ### Accessibility
3189
3320
 
3190
3321
  - The value is a decimal string, so money never passes through a float.
3191
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.
3192
3325
 
3193
3326
  ### Examples
3194
3327
 
@@ -3220,10 +3353,21 @@ Six cells for a TOTP code over one accessible input: paste fills, Backspace move
3220
3353
 
3221
3354
  `import { OTPInput } from "@logicplanes/kaeso-ui";`
3222
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
+
3223
3365
  ### Accessibility
3224
3366
 
3225
3367
  - One real input with autocomplete="one-time-code", so the browser can offer the code.
3226
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.
3227
3371
 
3228
3372
  ### Examples
3229
3373
 
@@ -3384,7 +3528,7 @@ A request's parameters: system instructions, temperature, top P, max output toke
3384
3528
 
3385
3529
  ### Accessibility
3386
3530
 
3387
- - 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.
3388
3532
 
3389
3533
  ### Examples
3390
3534
 
@@ -3444,6 +3588,8 @@ A floating panel next to its trigger; HoverCard previews on hover, never as the
3444
3588
  ### Accessibility
3445
3589
 
3446
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.
3447
3593
 
3448
3594
  ### Examples
3449
3595
 
@@ -3475,9 +3621,9 @@ A floating panel next to its trigger; HoverCard previews on hover, never as the
3475
3621
  ```tsx
3476
3622
  <HoverCard>
3477
3623
  <HoverCard.Trigger>
3478
- <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">
3479
3625
  claude-sonnet-4-5
3480
- </a>
3626
+ </Link>
3481
3627
  </HoverCard.Trigger>
3482
3628
  <HoverCard.Content>
3483
3629
  <div className="flex flex-col gap-12">
@@ -3496,13 +3642,14 @@ A floating panel next to its trigger; HoverCard previews on hover, never as the
3496
3642
 
3497
3643
  ## PromptSuggestions
3498
3644
 
3499
- 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.
3500
3646
 
3501
3647
  `import { PromptSuggestions } from "@logicplanes/kaeso-ui/playground";`
3502
3648
 
3503
3649
  ### Accessibility
3504
3650
 
3505
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.
3506
3653
 
3507
3654
  ### Examples
3508
3655
 
@@ -3511,10 +3658,19 @@ Example prompts before a thread starts: up to three quiet lines that take a fill
3511
3658
  ```tsx
3512
3659
  function Basic() {
3513
3660
  const [draft, setDraft] = useState("");
3661
+ const composer = useRef<HTMLTextAreaElement | null>(null);
3514
3662
  return (
3515
3663
  <div className="flex w-full max-w-640 flex-col gap-12">
3516
- {draft === "" && <PromptSuggestions suggestions={suggestions} onSelect={setDraft} />}
3517
- <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" />
3518
3674
  </div>
3519
3675
  );
3520
3676
  }
@@ -3745,7 +3901,7 @@ A response's numbers on one line: time to first token, total time, tokens in and
3745
3901
 
3746
3902
  ## ResponseView
3747
3903
 
3748
- 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.
3749
3905
 
3750
3906
  `import { ResponseView, UserMessage, Thread } from "@logicplanes/kaeso-ui/playground";`
3751
3907
 
@@ -3760,6 +3916,7 @@ A model's response as it arrives: Markdown with a quiet caret, reasoning in a Th
3760
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.
3761
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.
3762
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”.
3763
3920
 
3764
3921
  ### Examples
3765
3922
 
@@ -3989,13 +4146,14 @@ Requests from keys to models to providers; hover a node to follow its path.
3989
4146
 
3990
4147
  ## ScrollArea
3991
4148
 
3992
- 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.
3993
4150
 
3994
4151
  `import { ScrollArea } from "@logicplanes/kaeso-ui";`
3995
4152
 
3996
4153
  ### Accessibility
3997
4154
 
3998
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.
3999
4157
 
4000
4158
  ### Examples
4001
4159
 
@@ -4029,6 +4187,7 @@ Search with a leading icon, a clear circle when filled, and a shortcut hint wher
4029
4187
 
4030
4188
  - The clear button is named “Clear search”.
4031
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.
4032
4191
 
4033
4192
  ### Examples
4034
4193
 
@@ -4036,7 +4195,7 @@ Search with a leading icon, a clear circle when filled, and a shortcut hint wher
4036
4195
 
4037
4196
  ```tsx
4038
4197
  <div className="w-240">
4039
- <SearchInput aria-label="Search logs" placeholder="Search logs" />
4198
+ <SearchInput aria-label="Search logs" placeholder="gpt-5, req_01…" shortcut={["mod", "k"]} />
4040
4199
  </div>
4041
4200
  ```
4042
4201
 
@@ -4044,21 +4203,22 @@ Search with a leading icon, a clear circle when filled, and a shortcut hint wher
4044
4203
 
4045
4204
  ```tsx
4046
4205
  <div className="w-240">
4047
- <SearchInput size="md" aria-label="Search settings" placeholder="Search…" />
4206
+ <SearchInput size="md" aria-label="Search settings" placeholder="Rate limit, budget" />
4048
4207
  </div>
4049
4208
  ```
4050
4209
 
4051
4210
  ## SecretReveal
4052
4211
 
4053
- 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.
4054
4213
 
4055
4214
  `import { SecretReveal, EnvironmentSnippet } from "@logicplanes/kaeso-ui";`
4056
4215
 
4057
4216
  ### Accessibility
4058
4217
 
4059
- - The secret is a read-only text box; a click selects all of it.
4060
- - “Copy key” becomes “Copied” without changing size.
4061
- - 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.
4062
4222
 
4063
4223
  ### Examples
4064
4224
 
@@ -4279,8 +4439,9 @@ Secrets masked by default, an eye to reveal, mono when revealed, never autocompl
4279
4439
 
4280
4440
  ### Accessibility
4281
4441
 
4282
- - The reveal circle is named Show or Hide.
4283
- - 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.
4284
4445
 
4285
4446
  ### Examples
4286
4447
 
@@ -4346,7 +4507,7 @@ Settings rows in a rounded group, title and description left, the control right.
4346
4507
  #### Preferences
4347
4508
 
4348
4509
  ```tsx
4349
- <div className="w-720">
4510
+ <div className="w-560">
4350
4511
  <SettingsSection title="General">
4351
4512
  <SettingsGroup>
4352
4513
  <SettingsRow
@@ -4408,7 +4569,7 @@ Settings rows in a rounded group, title and description left, the control right.
4408
4569
  #### Navigation rows
4409
4570
 
4410
4571
  ```tsx
4411
- <div className="w-720">
4572
+ <div className="w-560">
4412
4573
  <SettingsGroup>
4413
4574
  <SettingsRow icon={icons.members} title="Members" description="Who can use this organization." value="5 members" href="#" />
4414
4575
  <SettingsRow icon={icons.providerKey} title="Provider keys" description="Credentials the gateway uses upstream." value="2" href="#" />
@@ -4461,6 +4622,7 @@ A panel from the edge that keeps the list behind it readable: the request inspec
4461
4622
 
4462
4623
  - A dialog; the title names it, the subtitle carries the id.
4463
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.
4464
4626
 
4465
4627
  ### Examples
4466
4628
 
@@ -4902,10 +5064,15 @@ A reference table of five or more columns puts 8px between them, so it fits the
4902
5064
 
4903
5065
  ## TableOfContents
4904
5066
 
4905
- “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.
4906
5068
 
4907
5069
  `import { TableOfContents } from "@logicplanes/kaeso-ui";`
4908
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
+
4909
5076
  ### Examples
4910
5077
 
4911
5078
  #### Basic
@@ -4924,12 +5091,14 @@ Underline tabs for detail pages and pill tabs for page headers.
4924
5091
 
4925
5092
  | Key | Action |
4926
5093
  |---|---|
4927
- | Left Right | Moves between tabs |
4928
- | 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 |
4929
5097
 
4930
5098
  ### Accessibility
4931
5099
 
4932
- - 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.
4933
5102
 
4934
5103
  ### Examples
4935
5104
 
@@ -5018,7 +5187,7 @@ function Toggle() {
5018
5187
 
5019
5188
  ## TagInput
5020
5189
 
5021
- 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.
5022
5191
 
5023
5192
  `import { TagInput } from "@logicplanes/kaeso-ui";`
5024
5193
 
@@ -5028,11 +5197,15 @@ Removable tags in a field: Enter, comma and paste split them; Backspace removes
5028
5197
  |---|---|
5029
5198
  | Enter | Adds the typed tag |
5030
5199
  | , | Adds the typed tag |
5031
- | 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 |
5032
5204
 
5033
5205
  ### Accessibility
5034
5206
 
5035
- - 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.
5036
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.
5037
5210
 
5038
5211
  ### Examples
@@ -5055,7 +5228,7 @@ Text in the type scale: one scale, used the same way everywhere.
5055
5228
 
5056
5229
  - Text renders a span by default; pass as="p" for paragraphs.
5057
5230
  - Truncated text gets a tooltip with the full string and becomes focusable so keyboard users can read it.
5058
- - 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.
5059
5232
 
5060
5233
  ### Examples
5061
5234
 
@@ -5368,8 +5541,9 @@ An ink capsule at the bottom center: brief, calm, at most three.
5368
5541
  ### Accessibility
5369
5542
 
5370
5543
  - role=status; errors are alerts.
5371
- - Five seconds, paused on hover and focus; swipe to dismiss.
5372
- - 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.
5373
5547
 
5374
5548
  ### Examples
5375
5549
 
@@ -5378,16 +5552,16 @@ An ink capsule at the bottom center: brief, calm, at most three.
5378
5552
  ```tsx
5379
5553
  <>
5380
5554
  <Inline gap={8}>
5381
- <Button onClick={() => toast("Key copied")}>Neutral</Button>
5382
- <Button onClick={() => toast.success("Provider saved")}>Success</Button>
5383
- <Button onClick={() => toast.error("Couldn't reach the provider.", { description: "Check the provider key, then try again." })}>Error</Button>
5384
- <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>
5385
5559
  <Button
5386
5560
  onClick={() =>
5387
5561
  void toast.promise(new Promise((r) => setTimeout(r, 1600)), { loading: "Syncing models…", success: "Models synced", error: "Couldn't sync models" })
5388
5562
  }
5389
5563
  >
5390
- Promise
5564
+ Sync models
5391
5565
  </Button>
5392
5566
  </Inline>
5393
5567
  </>
@@ -5403,7 +5577,12 @@ Filters, search and display options on one 48px row, with arrow-key focus across
5403
5577
 
5404
5578
  | Key | Action |
5405
5579
  |---|---|
5406
- | 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.
5407
5586
 
5408
5587
  ### Examples
5409
5588
 
@@ -5421,7 +5600,7 @@ function Logs() {
5421
5600
  Add filter
5422
5601
  </Button>
5423
5602
  <Toolbar.Spacer />
5424
- <div className="w-240">
5603
+ <div className="order-last basis-full sm:order-none sm:basis-auto sm:w-240">
5425
5604
  <SearchInput aria-label="Search logs" placeholder="Search logs" />
5426
5605
  </div>
5427
5606
  <DisplayOptions {...display} />
@@ -5449,6 +5628,8 @@ A short label on hover and focus: a pill, with a shortcut when there is one.
5449
5628
  - Opens after 500ms, instantly when moving between tooltipped siblings.
5450
5629
  - Never the only place for essential information.
5451
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.
5452
5633
 
5453
5634
  ### Examples
5454
5635
 
@@ -5486,8 +5667,8 @@ Token kinds in their fixed colors, and limits with their scope, window, kind and
5486
5667
 
5487
5668
  ### Accessibility
5488
5669
 
5489
- - Token kinds always map to the same series: input 1, cache read 6, cache write 2, output 3, reasoning 5.
5490
- - 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.
5491
5672
 
5492
5673
  ### Examples
5493
5674