@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,6 +1,6 @@
1
1
  {
2
2
  "package": "@logicplanes/kaeso-ui",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "components": [
5
5
  {
6
6
  "entry": "agent-avatar",
@@ -9,7 +9,7 @@
9
9
  "components": [
10
10
  {
11
11
  "name": "AgentAttribution",
12
- "description": "A person's avatar with the agent that acted for them as a small badge on its corner, for audit rows and activity; it reads as one picture named after both. The badge stays inside the avatar's square, so a table cell never cuts it off.",
12
+ "description": "A person's avatar with the agent that acted for them as a small round ink badge on its corner, for audit rows and activity; it reads as one picture named after both, and a tooltip says the same to the pointer. The badge is about 40% of the avatar and a 2px gap cut out of the face separates it on any surface; it stays inside the avatar's square, so a table cell never cuts it off.",
13
13
  "props": [
14
14
  {
15
15
  "name": "agent",
@@ -37,7 +37,7 @@
37
37
  "type": "24 | 20 | 28 | 32 | 40",
38
38
  "required": false,
39
39
  "default": "24",
40
- "description": "The diameter of the person's avatar in pixels; the agent badge is half of it."
40
+ "description": "The diameter of the person's avatar in pixels; the agent badge is about 40% of it (8 to 16px)."
41
41
  },
42
42
  {
43
43
  "name": "src",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  {
53
53
  "name": "AgentAvatar",
54
- "description": "An agent acting for a person: one bot face on an ink square, the same for every agent; write its model family beside it with useModelName where it matters.",
54
+ "description": "An agent acting for a person: one bot face on a `fill-3` square, the same for every agent (people are round, agents square); write its model family beside it with useModelName where it matters.",
55
55
  "props": [
56
56
  {
57
57
  "name": "name",
@@ -89,11 +89,11 @@
89
89
  "AGENT_ATTRIBUTION": {
90
90
  "axes": {
91
91
  "size": {
92
- "20": "20px person, 10px agent badge",
93
- "24": "24px person, 12px agent badge (default)",
94
- "28": "28px person, 14px agent badge",
95
- "32": "32px person, 16px agent badge",
96
- "40": "40px person, 20px agent badge"
92
+ "20": "20px person, 8px agent badge",
93
+ "24": "24px person, 10px agent badge (default)",
94
+ "28": "28px person, 12px agent badge",
95
+ "32": "32px person, 12px agent badge",
96
+ "40": "40px person, 16px agent badge"
97
97
  }
98
98
  },
99
99
  "defaults": {
@@ -214,7 +214,7 @@
214
214
  "type": "boolean",
215
215
  "required": false,
216
216
  "default": "false",
217
- "description": "Slides the sheet in a little, to hint that it can be opened."
217
+ "description": "Shows the sheet as a preview that doesn't trap focus or dim the page, and closes when the pointer leaves it."
218
218
  },
219
219
  {
220
220
  "name": "returnFocus",
@@ -260,7 +260,7 @@
260
260
  "components": [
261
261
  {
262
262
  "name": "Avatar",
263
- "description": "The first letters of the first and last word; `max` 1 keeps only the first.",
263
+ "description": "The first letters of the first and last word; `max` 1 keeps only the first. A photo gets a hairline so a light picture keeps its edge.",
264
264
  "props": [
265
265
  {
266
266
  "name": "name",
@@ -309,7 +309,7 @@
309
309
  },
310
310
  {
311
311
  "name": "AvatarGroup",
312
- "description": "Overlapping avatars with a 2px panel ring and a \"+3\".",
312
+ "description": "Overlapping avatars, each separated from the one under it by a 2px gap cut out of that avatar, so the gap shows whatever surface the group sits on (a hovered row, a card); then a \"+3\".",
313
313
  "props": [
314
314
  {
315
315
  "name": "people",
@@ -337,7 +337,7 @@
337
337
  "type": "number",
338
338
  "required": false,
339
339
  "default": "4",
340
- "description": "Show at most this many; the rest become \"+3\"."
340
+ "description": "Show at most this many; the rest become \"+3\", which names them in a tooltip."
341
341
  },
342
342
  {
343
343
  "name": "size",
@@ -379,7 +379,7 @@
379
379
  "components": [
380
380
  {
381
381
  "name": "Badge",
382
- "description": "A small pill label: 22px, 12/500. Words carry meaning; color supports them.",
382
+ "description": "A small read-only pill label: 22px, 12/500, smaller than a Tag (24 or 28px) so a mark never looks like a control. Words carry meaning; color supports them. A label longer than its room ends in an ellipsis and shows in full in a tooltip. `ink` is for at most one badge on a view.",
383
383
  "props": [
384
384
  {
385
385
  "name": "children",
@@ -403,13 +403,13 @@
403
403
  "BADGE": {
404
404
  "axes": {
405
405
  "tone": {
406
- "neutral": "Neutral (default)",
406
+ "neutral": "Neutral (default): fill-2, or the control fill on a hovered or selected row",
407
407
  "success": "Success",
408
408
  "warning": "Warning",
409
409
  "danger": "Danger",
410
410
  "info": "Information",
411
411
  "outline": "A ring only",
412
- "ink": "Inverted, for the one thing that must stand out"
412
+ "ink": "Inverted: at most one on a view, for the one thing that must stand out"
413
413
  }
414
414
  },
415
415
  "defaults": {
@@ -425,7 +425,7 @@
425
425
  "components": [
426
426
  {
427
427
  "name": "Banner",
428
- "description": "An inline notice: a tint, an icon, an optional title, the text, actions at the end. The banner is its own size container. From 480px inside its padding (the `banner` container size, `@banner:`) the actions sit on the right, centered on the title and text together, and the icon stays on the first line. Narrower (a phone) the actions go under the text, starting where the text starts: their 24px inset is the icon's 16px column and its 8px gap, which in the row is the gap before them.",
428
+ "description": "An inline notice: a tint, an icon (none for a neutral notice, so it never looks like information), an optional title, the text, actions at the end. Inline, the icon sits 12px in and the banner is at least 56px tall, so banners with and without actions stack evenly; full width, the icon sits on the 24px gutter and the text 24px further in. The banner is its own size container. From 480px inside its padding (the `banner` container size, `@banner:`) the actions sit on the right, centered on the title and text together, and the icon stays on the first line. Narrower (a phone) the actions go under the text, starting where the text starts: their 24px inset is the icon's 16px column and its 8px gap, which in the row is the gap before them.",
429
429
  "props": [
430
430
  {
431
431
  "name": "actions",
@@ -453,7 +453,7 @@
453
453
  "type": "IconSvgElement",
454
454
  "required": false,
455
455
  "default": null,
456
- "description": "An icon in place of the tone's own."
456
+ "description": "An icon in place of the tone's own; a neutral banner has none unless you pass one."
457
457
  },
458
458
  {
459
459
  "name": "layout",
@@ -467,7 +467,7 @@
467
467
  "type": "(() => void)",
468
468
  "required": false,
469
469
  "default": null,
470
- "description": "Only informational banners can be dismissed."
470
+ "description": "Shows a dismiss button on `neutral` and `info` banners. Success, warning and danger banners stay until their cause changes, so they ignore it and warn in development."
471
471
  },
472
472
  {
473
473
  "name": "title",
@@ -498,8 +498,8 @@
498
498
  "danger": "Something failed or will fail"
499
499
  },
500
500
  "layout": {
501
- "inline": "Inside content: radius 14 (default)",
502
- "full": "Across the top of the panel for global notices"
501
+ "inline": "Inside content: radius 14, its icon 12px in, at least 56px tall with or without actions (default)",
502
+ "full": "Across the top of the panel for global notices: its icon on the 24px gutter"
503
503
  }
504
504
  },
505
505
  "defaults": {
@@ -530,7 +530,7 @@
530
530
  "type": "ReactNode",
531
531
  "required": false,
532
532
  "default": null,
533
- "description": "The button's label: a verb first, in sentence case."
533
+ "description": "The button's label: a verb first, in sentence case. A label wider than its container is cut with an ellipsis and shown whole in a tooltip."
534
534
  },
535
535
  {
536
536
  "name": "count",
@@ -551,7 +551,7 @@
551
551
  "type": "string",
552
552
  "required": false,
553
553
  "default": null,
554
- "description": "Why the button is disabled, shown as a tooltip. The button stays focusable so people can read it."
554
+ "description": "Why the button is disabled, shown as a tooltip and read out as the button's description. The button stays focusable so people can reach it."
555
555
  },
556
556
  {
557
557
  "name": "fullWidth",
@@ -614,7 +614,7 @@
614
614
  "type": "\"md\" | \"xs\" | \"sm\" | \"lg\" | \"xl\"",
615
615
  "required": false,
616
616
  "default": null,
617
- "description": "The height, from `xs` (24px) to `xl` (44px)."
617
+ "description": "The height, from `xs` (24px) to `xl` (48px)."
618
618
  },
619
619
  {
620
620
  "name": "target",
@@ -681,7 +681,7 @@
681
681
  "components": [
682
682
  {
683
683
  "name": "ButtonGroup",
684
- "description": "Related actions side by side: connected pills, or spaced with `attached={false}`.",
684
+ "description": "Related actions side by side: connected pills, or spaced with `attached={false}`. An item with `pressed` is a toggle; pass `false` while it is off, and the selected item turns ink.",
685
685
  "props": [
686
686
  {
687
687
  "name": "children",
@@ -840,7 +840,7 @@
840
840
  "components": [
841
841
  {
842
842
  "name": "BarChart",
843
- "description": "Bars for comparing values across categories: grouped, stacked, or horizontal for rankings. The category under the pointer, or reached with the arrow keys, shows its tooltip.",
843
+ "description": "Bars for comparing values across categories: grouped, stacked, or horizontal for rankings. The category under the pointer, or reached with the arrow keys, shows its tooltip; the legend pills show and hide series.",
844
844
  "props": [
845
845
  {
846
846
  "name": "aria-label",
@@ -861,7 +861,7 @@
861
861
  "type": "BarSeries[]",
862
862
  "required": true,
863
863
  "default": null,
864
- "description": "The bars' series, each with an `id`, a `label`, one value per category and an optional `color`. Colors otherwise come from the series order by `id`."
864
+ "description": "The bars' series, each with an `id`, a `label`, one value per category and an optional `color`. Colors otherwise come from the series order by `id`; one series takes series 1. Negative values grow down from the zero line. With two or more, the legend shows and hides them."
865
865
  },
866
866
  {
867
867
  "name": "axisLabels",
@@ -889,7 +889,7 @@
889
889
  "type": "boolean",
890
890
  "required": false,
891
891
  "default": null,
892
- "description": "Shows the empty state (`emptyText`) in place of the data. Pass it when the period has no data."
892
+ "description": "Shows the empty state (`emptyText`) in place of the data, over the baseline and the category axis. By default it shows when there is no value at all; zeros are data."
893
893
  },
894
894
  {
895
895
  "name": "emptyText",
@@ -903,14 +903,14 @@
903
903
  "type": "ReactNode",
904
904
  "required": false,
905
905
  "default": null,
906
- "description": "The data failed to load: the chart keeps its height, says so quietly and offers Try again. Errors are toasts, so the value isn't shown; toast the message where the request fails."
906
+ "description": "The data failed to load: the chart keeps its height, hides its legend and table toggle, and says so quietly, with Try again when there is `onRetry` and otherwise a hint to reload the page. Errors are toasts, so the value isn't shown; pass `true` and toast the message where the request fails."
907
907
  },
908
908
  {
909
909
  "name": "formatValue",
910
910
  "type": "((v: number) => string)",
911
911
  "required": false,
912
- "default": "(v) => formatNumber(v)",
913
- "description": "Formats values on the axis and in the tooltip."
912
+ "default": null,
913
+ "description": "Formats values in the tooltip, the table and beside horizontal bars. Without it, values are written in full and the axis in short form (1.2M); the axis takes the room its widest label needs, and long category names in a ranking end in an ellipsis with the full name on hover."
914
914
  },
915
915
  {
916
916
  "name": "height",
@@ -938,7 +938,7 @@
938
938
  "type": "boolean",
939
939
  "required": false,
940
940
  "default": null,
941
- "description": "The data is loading: the chart keeps its height and shows a quiet loading bar."
941
+ "description": "The data is loading: the chart keeps its height and is marked busy; data already on screen dims and breathes, and with none yet the plot is a skeleton."
942
942
  },
943
943
  {
944
944
  "name": "onRetry",
@@ -952,7 +952,7 @@
952
952
  "type": "{ first?: boolean; last?: boolean; ongoing?: boolean | undefined; } | undefined",
953
953
  "required": false,
954
954
  "default": null,
955
- "description": "Marks the `first` or `last` category as covering only part of its span: its bars are drawn lighter and its tooltip says \"partial\". `ongoing` marks the last one as still counting, such as today, and says \"so far\"."
955
+ "description": "Marks the `first` or `last` category as covering only part of its span: its bars are drawn faint with a dashed edge, like a partial line, and its tooltip says \"partial\". `ongoing` marks the last one as still counting, such as today, and says \"so far\"."
956
956
  },
957
957
  {
958
958
  "name": "shares",
@@ -966,7 +966,7 @@
966
966
  },
967
967
  {
968
968
  "name": "ChartFrame",
969
- "description": "The frame every chart draws in: a hidden data table for assistive technology, a \"View as table\" toggle, and the empty, loading and error states. The toggle sits at the right end of the last line of the legend; when the frame is narrower than 480px (the `chart-legend` container size, a phone), it moves to its own line under the legend, so it never reads as one of the series. Use it to build a chart of your own that behaves like the others.",
969
+ "description": "The frame every chart draws in: a hidden data table for assistive technology, a \"View as table\" toggle that shows the table at the chart's height, scrolling inside, and the empty, loading and error states. The toggle sits at the right end of the last line of the legend; when the frame is narrower than 480px (the `chart-legend` container size, a phone), it moves to its own line under the legend, so it never reads as one of the series. Use it to build a chart of your own that behaves like the others.",
970
970
  "props": [
971
971
  {
972
972
  "name": "children",
@@ -1113,7 +1113,7 @@
1113
1113
  "type": "Slice[]",
1114
1114
  "required": true,
1115
1115
  "default": null,
1116
- "description": "The parts of the whole, each with an `id`, a `label`, a `value` and an optional `color`. Slices under 2% are grouped as Other when there are two or more."
1116
+ "description": "The parts of the whole, each with an `id`, a `label`, a `value` and an optional `color`. Slices under 2% are grouped as Other when there are two or more, and past the eighth slice the rest are grouped too, so no two slices share a color."
1117
1117
  },
1118
1118
  {
1119
1119
  "name": "className",
@@ -1127,7 +1127,7 @@
1127
1127
  "type": "boolean",
1128
1128
  "required": false,
1129
1129
  "default": null,
1130
- "description": "Shows the empty state (`emptyText`) in place of the data. By default it shows when every value is 0."
1130
+ "description": "Shows the empty state (`emptyText`) in place of the ring and legend. By default it shows when every value is 0, since a ring of nothing has no shares."
1131
1131
  },
1132
1132
  {
1133
1133
  "name": "emptyText",
@@ -1141,7 +1141,7 @@
1141
1141
  "type": "ReactNode",
1142
1142
  "required": false,
1143
1143
  "default": null,
1144
- "description": "The data failed to load: the chart keeps its height, says so quietly and offers Try again. Errors are toasts, so the value isn't shown; toast the message where the request fails."
1144
+ "description": "The data failed to load: the chart keeps its height, hides its legend and table toggle, and says so quietly, with Try again when there is `onRetry` and otherwise a hint to reload the page. Errors are toasts, so the value isn't shown; pass `true` and toast the message where the request fails."
1145
1145
  },
1146
1146
  {
1147
1147
  "name": "formatValue",
@@ -1155,7 +1155,7 @@
1155
1155
  "type": "boolean",
1156
1156
  "required": false,
1157
1157
  "default": null,
1158
- "description": "The data is loading: the chart keeps its height and shows a quiet loading bar."
1158
+ "description": "The data is loading: the chart keeps its height and is marked busy; data already on screen dims and breathes, and with none yet the plot is a skeleton."
1159
1159
  },
1160
1160
  {
1161
1161
  "name": "onRetry",
@@ -1176,7 +1176,7 @@
1176
1176
  "type": "ReactNode",
1177
1177
  "required": false,
1178
1178
  "default": null,
1179
- "description": "Replaces the total in the center, which is otherwise the sum of the slices written with `formatValue`."
1179
+ "description": "Replaces the total in the center, which is otherwise the sum of the slices written with `formatValue`. A long total steps down a size to fit the ring."
1180
1180
  },
1181
1181
  {
1182
1182
  "name": "totalLabel",
@@ -1190,7 +1190,7 @@
1190
1190
  },
1191
1191
  {
1192
1192
  "name": "Gauge",
1193
- "description": "A semicircle meter for one share of a limit, such as \"budget used\". It turns to warning at the first threshold and to danger at 100%.",
1193
+ "description": "A semicircle meter for one share of a limit, such as \"budget used\". At the first threshold it says \"Near the limit\" and turns to warning; at 100% it says \"Over the limit\" and turns to danger.",
1194
1194
  "props": [
1195
1195
  {
1196
1196
  "name": "aria-label",
@@ -1204,7 +1204,7 @@
1204
1204
  "type": "number",
1205
1205
  "required": true,
1206
1206
  "default": null,
1207
- "description": "The share used, from 0 to 1. Values above 1 fill the arc and turn it to danger."
1207
+ "description": "The share used, from 0 to 1. Values above 1 fill the arc and turn it to danger; a missing value (NaN) shows a dash and no arc."
1208
1208
  },
1209
1209
  {
1210
1210
  "name": "className",
@@ -1218,7 +1218,7 @@
1218
1218
  "type": "ReactNode",
1219
1219
  "required": false,
1220
1220
  "default": null,
1221
- "description": "A caption under the value (\"of $500.00 budget\")."
1221
+ "description": "A caption under the arc (\"of $500.00 budget\"); it wraps when long."
1222
1222
  },
1223
1223
  {
1224
1224
  "name": "thresholds",
@@ -1232,14 +1232,14 @@
1232
1232
  "type": "ReactNode",
1233
1233
  "required": false,
1234
1234
  "default": null,
1235
- "description": "Replaces the value in the center, which is otherwise the percentage."
1235
+ "description": "Replaces the value in the center, which is otherwise the percentage. Pass a string so screen readers hear it with the unit."
1236
1236
  }
1237
1237
  ],
1238
1238
  "file": "src/components/charts/gauge.tsx"
1239
1239
  },
1240
1240
  {
1241
1241
  "name": "Heatmap",
1242
- "description": "A grid of cells shaded on a five-step ramp, for one value across two dimensions such as hour by weekday.",
1242
+ "description": "A grid of cells shaded on a five-step ramp, for one value across two dimensions such as hour by weekday. One tab stop: the arrow keys move between cells and show each value, the table toggle lists them all, and a grid wider than its column scrolls with a fade at the edge.",
1243
1243
  "props": [
1244
1244
  {
1245
1245
  "name": "aria-label",
@@ -1260,7 +1260,7 @@
1260
1260
  "type": "string[]",
1261
1261
  "required": true,
1262
1262
  "default": null,
1263
- "description": "The row labels, top to bottom (weekdays)."
1263
+ "description": "The row labels, top to bottom (weekdays). With no rows or columns the chart shows its empty state."
1264
1264
  },
1265
1265
  {
1266
1266
  "name": "values",
@@ -1288,7 +1288,7 @@
1288
1288
  "type": "((v: number) => string)",
1289
1289
  "required": false,
1290
1290
  "default": "(v) => formatNumber(v)",
1291
- "description": "Formats a cell's value for its tooltip and screen readers. Defaults to `formatNumber`."
1291
+ "description": "Formats a cell's value for its tooltip, the table and screen readers. Defaults to `formatNumber`."
1292
1292
  }
1293
1293
  ],
1294
1294
  "file": "src/components/charts/heatmap.tsx"
@@ -1351,7 +1351,7 @@
1351
1351
  "type": "Slice[]",
1352
1352
  "required": true,
1353
1353
  "default": null,
1354
- "description": "The parts of the whole, each with an `id`, a `label`, a `value` and an optional `color`. Slices under 2% are grouped as Other when there are two or more."
1354
+ "description": "The parts of the whole, each with an `id`, a `label`, a `value` and an optional `color`. Slices under 2% are grouped as Other when there are two or more, and past the eighth slice the rest are grouped too, so no two slices share a color."
1355
1355
  },
1356
1356
  {
1357
1357
  "name": "className",
@@ -1365,7 +1365,7 @@
1365
1365
  "type": "boolean",
1366
1366
  "required": false,
1367
1367
  "default": null,
1368
- "description": "Shows the empty state (`emptyText`) in place of the data. By default it shows when every value is 0."
1368
+ "description": "Shows the empty state (`emptyText`) in place of the ring and legend. By default it shows when every value is 0, since a ring of nothing has no shares."
1369
1369
  },
1370
1370
  {
1371
1371
  "name": "emptyText",
@@ -1379,7 +1379,7 @@
1379
1379
  "type": "ReactNode",
1380
1380
  "required": false,
1381
1381
  "default": null,
1382
- "description": "The data failed to load: the chart keeps its height, says so quietly and offers Try again. Errors are toasts, so the value isn't shown; toast the message where the request fails."
1382
+ "description": "The data failed to load: the chart keeps its height, hides its legend and table toggle, and says so quietly, with Try again when there is `onRetry` and otherwise a hint to reload the page. Errors are toasts, so the value isn't shown; pass `true` and toast the message where the request fails."
1383
1383
  },
1384
1384
  {
1385
1385
  "name": "formatValue",
@@ -1393,7 +1393,7 @@
1393
1393
  "type": "boolean",
1394
1394
  "required": false,
1395
1395
  "default": null,
1396
- "description": "The data is loading: the chart keeps its height and shows a quiet loading bar."
1396
+ "description": "The data is loading: the chart keeps its height and is marked busy; data already on screen dims and breathes, and with none yet the plot is a skeleton."
1397
1397
  },
1398
1398
  {
1399
1399
  "name": "onRetry",
@@ -1414,7 +1414,7 @@
1414
1414
  "type": "ReactNode",
1415
1415
  "required": false,
1416
1416
  "default": null,
1417
- "description": "Replaces the total in the center, which is otherwise the sum of the slices written with `formatValue`."
1417
+ "description": "Replaces the total in the center, which is otherwise the sum of the slices written with `formatValue`. A long total steps down a size to fit the ring."
1418
1418
  },
1419
1419
  {
1420
1420
  "name": "totalLabel",
@@ -1428,7 +1428,7 @@
1428
1428
  },
1429
1429
  {
1430
1430
  "name": "Sankey",
1431
- "description": "A flow diagram, such as requests from keys to models to providers, with ribbons as wide as each flow. Hovering a node highlights its paths.",
1431
+ "description": "A flow diagram, such as requests from keys to models to providers, with ribbons as wide as each flow. Hovering a node, or reaching it with the arrow keys, highlights its paths. Each column keeps room for its labels; when narrow, the values go first, then long names end in an ellipsis.",
1432
1432
  "props": [
1433
1433
  {
1434
1434
  "name": "aria-label",
@@ -1463,7 +1463,7 @@
1463
1463
  "type": "boolean",
1464
1464
  "required": false,
1465
1465
  "default": null,
1466
- "description": "Shows the empty state (`emptyText`) in place of the data. Pass it when the period has no data."
1466
+ "description": "Shows the empty state (`emptyText`) in place of the data. By default it shows when no link carries a value."
1467
1467
  },
1468
1468
  {
1469
1469
  "name": "emptyText",
@@ -1477,7 +1477,7 @@
1477
1477
  "type": "ReactNode",
1478
1478
  "required": false,
1479
1479
  "default": null,
1480
- "description": "The data failed to load: the chart keeps its height, says so quietly and offers Try again. Errors are toasts, so the value isn't shown; toast the message where the request fails."
1480
+ "description": "The data failed to load: the chart keeps its height, hides its legend and table toggle, and says so quietly, with Try again when there is `onRetry` and otherwise a hint to reload the page. Errors are toasts, so the value isn't shown; pass `true` and toast the message where the request fails."
1481
1481
  },
1482
1482
  {
1483
1483
  "name": "formatValue",
@@ -1498,7 +1498,7 @@
1498
1498
  "type": "boolean",
1499
1499
  "required": false,
1500
1500
  "default": null,
1501
- "description": "The data is loading: the chart keeps its height and shows a quiet loading bar."
1501
+ "description": "The data is loading: the chart keeps its height and is marked busy; data already on screen dims and breathes, and with none yet the plot is a skeleton."
1502
1502
  },
1503
1503
  {
1504
1504
  "name": "onRetry",
@@ -1540,7 +1540,7 @@
1540
1540
  "type": "((v: number) => string)",
1541
1541
  "required": false,
1542
1542
  "default": "(v) => formatNumber(v)",
1543
- "description": "Formats a segment's value in its tooltip. Defaults to `formatNumber`."
1543
+ "description": "Formats each segment's value for screen readers, beside its share. Defaults to `formatNumber`."
1544
1544
  },
1545
1545
  {
1546
1546
  "name": "legend",
@@ -1568,7 +1568,7 @@
1568
1568
  "type": "number[]",
1569
1569
  "required": true,
1570
1570
  "default": null,
1571
- "description": "The values in order, oldest first."
1571
+ "description": "The values in order, oldest first. One value is a dot at the newest end; none is a quiet flat line."
1572
1572
  },
1573
1573
  {
1574
1574
  "name": "className",
@@ -1610,7 +1610,7 @@
1610
1610
  "type": "boolean",
1611
1611
  "required": false,
1612
1612
  "default": null,
1613
- "description": "Draws the swatch as off, for a hidden series."
1613
+ "description": "Draws the swatch as an outline in the series color, for a hidden series."
1614
1614
  },
1615
1615
  {
1616
1616
  "name": "shape",
@@ -1652,7 +1652,7 @@
1652
1652
  "type": "boolean",
1653
1653
  "required": false,
1654
1654
  "default": null,
1655
- "description": "Shows the empty state (`emptyText`) in place of the data. By default it shows when every value is 0."
1655
+ "description": "Shows the empty state (`emptyText`) in place of the data, over the baseline and the time axis. By default it shows when there are no points; zeros are data and draw a flat line on the baseline."
1656
1656
  },
1657
1657
  {
1658
1658
  "name": "emptyText",
@@ -1666,7 +1666,7 @@
1666
1666
  "type": "ReactNode",
1667
1667
  "required": false,
1668
1668
  "default": null,
1669
- "description": "The data failed to load: the chart keeps its height, says so quietly and offers Try again. Errors are toasts, so the value isn't shown; toast the message where the request fails."
1669
+ "description": "The data failed to load: the chart keeps its height, hides its legend and table toggle, and says so quietly, with Try again when there is `onRetry` and otherwise a hint to reload the page. Errors are toasts, so the value isn't shown; pass `true` and toast the message where the request fails."
1670
1670
  },
1671
1671
  {
1672
1672
  "name": "formatTick",
@@ -1686,8 +1686,8 @@
1686
1686
  "name": "formatValue",
1687
1687
  "type": "((v: number) => string)",
1688
1688
  "required": false,
1689
- "default": "(v) => formatNumber(v)",
1690
- "description": "Formats values on the axis and in the tooltip."
1689
+ "default": null,
1690
+ "description": "Formats values in the tooltip, the table and on the axis. Without it, values are written in full and the axis in short form (1.2M), and the axis takes the room its widest label needs."
1691
1691
  },
1692
1692
  {
1693
1693
  "name": "height",
@@ -1722,7 +1722,7 @@
1722
1722
  "type": "boolean",
1723
1723
  "required": false,
1724
1724
  "default": null,
1725
- "description": "The data is loading: the chart keeps its height and shows a quiet loading bar."
1725
+ "description": "The data is loading: the chart keeps its height and is marked busy; data already on screen dims and breathes, and with none yet the plot is a skeleton."
1726
1726
  },
1727
1727
  {
1728
1728
  "name": "onRetry",
@@ -1961,7 +1961,7 @@
1961
1961
  "type": "boolean",
1962
1962
  "required": false,
1963
1963
  "default": null,
1964
- "description": "Shows it as invalid; pair it with a message that says what to fix."
1964
+ "description": "Shows it as invalid; inside a `Field` with `error`, it is invalid on its own and reads the message with it."
1965
1965
  },
1966
1966
  {
1967
1967
  "name": "label",
@@ -2094,7 +2094,7 @@
2094
2094
  "type": "boolean",
2095
2095
  "required": false,
2096
2096
  "default": null,
2097
- "description": "Shows it as invalid; pair it with a message that says what to fix."
2097
+ "description": "Shows it as invalid; inside a `Field` with `error`, it is invalid on its own and reads the message with it."
2098
2098
  },
2099
2099
  {
2100
2100
  "name": "label",
@@ -2250,14 +2250,14 @@
2250
2250
  "type": "\"cell\" | \"text\" | \"box\"",
2251
2251
  "required": false,
2252
2252
  "default": "box",
2253
- "description": "`text` for long code in running text, so it breaks with the sentence instead of jumping to its own line as one box; `cell` for the same in a table cell."
2253
+ "description": "`text` for long code in running text, so it breaks with the sentence instead of jumping to its own line as one box; `cell` for the same in a table cell. The default box wraps inside itself when it is wider than its line."
2254
2254
  },
2255
2255
  {
2256
2256
  "name": "shape",
2257
2257
  "type": "\"auto\" | \"pill\" | \"rounded\"",
2258
2258
  "required": false,
2259
2259
  "default": "auto",
2260
- "description": "A pill on one line, rounded corners when it wraps, or `auto` to choose by length."
2260
+ "description": "`auto` (default) and `rounded` keep radius 6, so code in a sentence never mixes shapes; pass `pill` for one word standing alone, such as a model name in a table cell."
2261
2261
  }
2262
2262
  ],
2263
2263
  "file": "src/components/code/code.tsx"
@@ -2267,7 +2267,7 @@
2267
2267
  "CODE": {
2268
2268
  "axes": {
2269
2269
  "shape": {
2270
- "auto": "Pill for a single word, radius 6 for anything longer (default)",
2270
+ "auto": "Radius 6, like every inline code in running text (default)",
2271
2271
  "pill": "Always a pill",
2272
2272
  "rounded": "Always radius 6"
2273
2273
  },
@@ -2291,7 +2291,7 @@
2291
2291
  "components": [
2292
2292
  {
2293
2293
  "name": "CodeBlock",
2294
- "description": "Highlighted code on a well: Kaeso's monochrome theme, copy on hover, tabs, line numbers, collapse. Long lines scroll sideways inside 16px of padding at both ends, and the code fades out at an edge with more to scroll to.",
2294
+ "description": "Highlighted code on a well: Kaeso's monochrome theme, copy in the header with a title or tabs and on hover without, tabs, line numbers, collapse with a fade at the cut. Long lines scroll sideways inside 16px of padding at both ends, and the code fades out at an edge with more to scroll to.",
2295
2295
  "props": [
2296
2296
  {
2297
2297
  "name": "className",
@@ -2564,7 +2564,7 @@
2564
2564
  },
2565
2565
  {
2566
2566
  "name": "JsonView",
2567
- "description": "A folding JSON tree: copy any path, highlight a search. For request and response bodies.",
2567
+ "description": "A folding JSON tree: copy any path, highlight a search. For request and response bodies. It is one tab stop: the arrow keys move between rows and open and close them, and ⌘C or Ctrl C copies the row's path.",
2568
2568
  "props": [
2569
2569
  {
2570
2570
  "name": "value",
@@ -2648,7 +2648,7 @@
2648
2648
  "components": [
2649
2649
  {
2650
2650
  "name": "Accordion",
2651
- "description": "Collapsible rows separated by hairlines.",
2651
+ "description": "Collapsible rows separated by hairlines, each the same pill row as Collapsible.",
2652
2652
  "props": [
2653
2653
  {
2654
2654
  "name": "items",
@@ -2683,7 +2683,7 @@
2683
2683
  },
2684
2684
  {
2685
2685
  "name": "Collapsible",
2686
- "description": "A disclosure row: a chevron that rotates in 180ms, a measured height animation.",
2686
+ "description": "A disclosure row: a pill with the title 12px in and a chevron at its end that turns in 200ms, the content on the title's line, a measured height animation.",
2687
2687
  "props": [
2688
2688
  {
2689
2689
  "name": "children",
@@ -2742,8 +2742,8 @@
2742
2742
  "COLLAPSIBLE": {
2743
2743
  "axes": {
2744
2744
  "state": {
2745
- "closed": "Closed: the chevron points to the row (default)",
2746
- "open": "Open: the chevron turns down and the content shows"
2745
+ "closed": "Closed: a pill row with the title 12px in and a chevron at its end pointing right (default)",
2746
+ "open": "Open: the chevron turns down in 200ms and the content shows under the title"
2747
2747
  }
2748
2748
  },
2749
2749
  "defaults": {
@@ -2962,7 +2962,7 @@
2962
2962
  "type": "ReactNode",
2963
2963
  "required": false,
2964
2964
  "default": null,
2965
- "description": "What the empty list says: \"No models match\". Defaults to \"No results\" in the provider's language."
2965
+ "description": "What the empty list says: \"No models match\". Defaults to \"No matches for\" and the typed text, in the provider's language."
2966
2966
  },
2967
2967
  {
2968
2968
  "name": "error",
@@ -3004,7 +3004,7 @@
3004
3004
  "type": "boolean",
3005
3005
  "required": false,
3006
3006
  "default": null,
3007
- "description": "Shows a quiet progress line at the top of the list (async results)."
3007
+ "description": "Shows a quiet progress line at the top of the list (async results) once loading takes 300ms; with reduced motion, only the words."
3008
3008
  },
3009
3009
  {
3010
3010
  "name": "multiple",
@@ -3158,7 +3158,7 @@
3158
3158
  "type": "CommandListGroup[]",
3159
3159
  "required": true,
3160
3160
  "default": null,
3161
- "description": "The rows, in groups; a group with a label gets a sticky caption with its mark and count, and a loading group keeps its caption while it has no rows yet."
3161
+ "description": "The rows, in groups; a group with a label gets a sticky caption with its mark and count, and a loading group keeps its caption, without a count, over a Loading… row while it has no rows yet."
3162
3162
  },
3163
3163
  {
3164
3164
  "name": "autoFocus",
@@ -3200,7 +3200,7 @@
3200
3200
  "type": "ReactNode",
3201
3201
  "required": false,
3202
3202
  "default": null,
3203
- "description": "What the list says when nothing matches: \"No models match\"."
3203
+ "description": "What the list says when nothing matches: \"No models match\". Defaults to \"No results for “claude”\", naming the query, in the provider's language."
3204
3204
  },
3205
3205
  {
3206
3206
  "name": "escapeClears",
@@ -3235,7 +3235,7 @@
3235
3235
  "type": "boolean",
3236
3236
  "required": false,
3237
3237
  "default": null,
3238
- "description": "Shows a quiet progress line at the top while more rows load."
3238
+ "description": "Shows a quiet progress line at the top while more rows load; with reduced motion it breathes instead of moving."
3239
3239
  },
3240
3240
  {
3241
3241
  "name": "match",
@@ -3483,7 +3483,7 @@
3483
3483
  "components": [
3484
3484
  {
3485
3485
  "name": "CommandPalette",
3486
- "description": "⌘K: search every page and action; nested pages; async groups with a quiet progress line.",
3486
+ "description": "⌘K: search every page and action; nested pages with a chip that goes back; async groups with a quiet progress line. Escape closes; on a nested page it clears the search, then goes back a page. ⌘K does nothing while another dialog is open.",
3487
3487
  "props": [
3488
3488
  {
3489
3489
  "name": "groups",
@@ -3511,7 +3511,7 @@
3511
3511
  "type": "ReactNode",
3512
3512
  "required": false,
3513
3513
  "default": null,
3514
- "description": "Defaults to \"No results\" in the provider's language."
3514
+ "description": "Defaults to \"No results for “claude”\" (naming the query) in the provider's language."
3515
3515
  },
3516
3516
  {
3517
3517
  "name": "hotkey",
@@ -3766,7 +3766,7 @@
3766
3766
  "components": [
3767
3767
  {
3768
3768
  "name": "DataTable",
3769
- "description": "A table for many rows: sorting, selection, loading and empty states, more rows on demand, and virtual scrolling for long lists.",
3769
+ "description": "A table for many rows: sorting, selection, loading and empty states, more rows on demand, and virtual scrolling for long lists. One tab stop: the arrows move between rows and header buttons, Right reaches a row's controls, Shift with Left or Right resizes a column from its header, and a header's context menu widens, narrows or resets it.",
3770
3770
  "props": [
3771
3771
  {
3772
3772
  "name": "aria-label",
@@ -3794,7 +3794,7 @@
3794
3794
  "type": "string",
3795
3795
  "required": false,
3796
3796
  "default": null,
3797
- "description": "The id of a row to show as active (open in a sheet)."
3797
+ "description": "The id of the row whose detail is open, in a sheet beside the table: it keeps the selected fill and is marked aria-current."
3798
3798
  },
3799
3799
  {
3800
3800
  "name": "canSelectRow",
@@ -3810,6 +3810,13 @@
3810
3810
  "default": null,
3811
3811
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
3812
3812
  },
3813
+ {
3814
+ "name": "data-force-row",
3815
+ "type": "string",
3816
+ "required": false,
3817
+ "default": null,
3818
+ "description": "Force a state on the first row for state matrices: hover, pressed, focus."
3819
+ },
3813
3820
  {
3814
3821
  "name": "density",
3815
3822
  "type": "\"default\" | \"compact\" | \"comfortable\"",
@@ -3822,14 +3829,14 @@
3822
3829
  "type": "ReactNode",
3823
3830
  "required": false,
3824
3831
  "default": null,
3825
- "description": "What to show when there are no rows, usually an `Empty`."
3832
+ "description": "What to show when there are no rows: an `Empty` with the page's own sentence, such as \"No requests yet\" or, behind filters, \"No requests match\". Without it the table says \"No rows\"."
3826
3833
  },
3827
3834
  {
3828
3835
  "name": "error",
3829
3836
  "type": "ReactNode",
3830
3837
  "required": false,
3831
3838
  "default": null,
3832
- "description": "The rows failed to load: the table says so where its rows would be and offers Try again (`onRetry`). Errors are toasts, so the value isn't shown; toast the message where the request fails."
3839
+ "description": "The rows failed to load: the table says so where its rows would be and offers Try again (`onRetry`), or, without it, says to reload the page. Errors are toasts, so the value isn't shown; toast the message where the request fails."
3833
3840
  },
3834
3841
  {
3835
3842
  "name": "freshRowIds",
@@ -3934,7 +3941,7 @@
3934
3941
  "type": "boolean",
3935
3942
  "required": false,
3936
3943
  "default": null,
3937
- "description": "Adds a checkbox to every row."
3944
+ "description": "Adds a checkbox to every row, named after the row's first text column; Space, Shift with the arrows and ⌘A select from the keyboard."
3938
3945
  },
3939
3946
  {
3940
3947
  "name": "selection",
@@ -3972,8 +3979,8 @@
3972
3979
  "DATA_TABLE": {
3973
3980
  "axes": {
3974
3981
  "density": {
3975
- "compact": "36px rows",
3976
- "default": "40px rows (default)",
3982
+ "compact": "36px rows; 44px with a coarse pointer",
3983
+ "default": "40px rows (default); 44px with a coarse pointer",
3977
3984
  "comfortable": "48px rows"
3978
3985
  }
3979
3986
  },
@@ -4095,7 +4102,7 @@
4095
4102
  "type": "string",
4096
4103
  "required": false,
4097
4104
  "default": null,
4098
- "description": "Shown without a date. Defaults to \"Pick a date\" (\"Pick a range\" for a range) in the provider's language."
4105
+ "description": "Shown without a date. Defaults to \"Choose a date\" (\"Choose a date range\" for a range) in the provider's language."
4099
4106
  },
4100
4107
  {
4101
4108
  "name": "required",
@@ -4235,7 +4242,7 @@
4235
4242
  "type": "string",
4236
4243
  "required": false,
4237
4244
  "default": null,
4238
- "description": "Shown without a date. Defaults to \"Pick a date\" (\"Pick a range\" for a range) in the provider's language."
4245
+ "description": "Shown without a date. Defaults to \"Choose a date\" (\"Choose a date range\" for a range) in the provider's language."
4239
4246
  },
4240
4247
  {
4241
4248
  "name": "preset",
@@ -4437,7 +4444,7 @@
4437
4444
  "components": [
4438
4445
  {
4439
4446
  "name": "DeleteResource",
4440
- "description": "Confirms deleting a resource: names the object and the consequence, asks for its name typed, and ends with a danger button.",
4447
+ "description": "Confirms deleting a resource for good: the title names it, the body says the consequence, the person types its name, and a danger button names the action. A reversible action needs no confirmation: act at once and offer Undo in a toast.",
4441
4448
  "props": [
4442
4449
  {
4443
4450
  "name": "consequence",
@@ -4451,14 +4458,14 @@
4451
4458
  "type": "string",
4452
4459
  "required": true,
4453
4460
  "default": null,
4454
- "description": "\"project\", \"key\", \"organization\""
4461
+ "description": "The kind of resource in the provider's language, as it reads after the verb on the button: \"project\", \"key\"; in German \"Projekt\"."
4455
4462
  },
4456
4463
  {
4457
4464
  "name": "name",
4458
4465
  "type": "string",
4459
4466
  "required": true,
4460
4467
  "default": null,
4461
- "description": "The resource's name; typed to confirm."
4468
+ "description": "The resource's name: the title names it, and the person types it to confirm."
4462
4469
  },
4463
4470
  {
4464
4471
  "name": "onConfirm",
@@ -4507,7 +4514,7 @@
4507
4514
  "type": "string",
4508
4515
  "required": false,
4509
4516
  "default": null,
4510
- "description": "\"Delete\", \"Archive\". Defaults to \"Delete\" in the provider's language."
4517
+ "description": "The action in the provider's language, in the form it takes on the button and in the title: \"Archive\" (\"Archive project\", \"Archive “Checkout”?\"); in German the infinitive, \"archivieren\" (\"Projekt archivieren\"). Defaults to \"Delete\" in the provider's language."
4511
4518
  }
4512
4519
  ],
4513
4520
  "file": "src/blocks/delete-resource/delete-resource.tsx"
@@ -4517,8 +4524,8 @@
4517
4524
  "DELETE_RESOURCE": {
4518
4525
  "axes": {
4519
4526
  "confirm": {
4520
- "typed": "The person types the resource's name (default)",
4521
- "simple": "A confirm button only, for reversible archives"
4527
+ "typed": "The person types the resource's name, for one that holds a lot: a project, an organization (default)",
4528
+ "simple": "A confirm button only, for a resource that holds little: a key, an alias"
4522
4529
  }
4523
4530
  },
4524
4531
  "defaults": {
@@ -4562,7 +4569,7 @@
4562
4569
  "type": "ReactNode",
4563
4570
  "required": true,
4564
4571
  "default": null,
4565
- "description": "Names the action: \"Delete this key?\""
4572
+ "description": "Names the action and the object: \"Delete “checkout-web”?\""
4566
4573
  },
4567
4574
  {
4568
4575
  "name": "cancelLabel",
@@ -4618,7 +4625,7 @@
4618
4625
  "type": "\"warning\" | \"danger\" | \"info\"",
4619
4626
  "required": false,
4620
4627
  "default": null,
4621
- "description": "How serious the confirmation is; `danger` for actions that can't be undone."
4628
+ "description": "How serious the confirmation is: `danger` for an action that can't be undone (a danger confirm, the focus on Cancel), `warning` for a risky one that can (a primary confirm, the focus still on Cancel), `info` for a neutral one (the focus on the confirm)."
4622
4629
  },
4623
4630
  {
4624
4631
  "name": "trigger",
@@ -4639,13 +4646,13 @@
4639
4646
  "type": "ReactNode",
4640
4647
  "required": true,
4641
4648
  "default": null,
4642
- "description": "The dialog's heading, also its accessible name."
4649
+ "description": "The dialog's heading, also its accessible name; a long one, or an id, wraps."
4643
4650
  },
4644
4651
  {
4645
4652
  "name": "anchor",
4646
4653
  "type": "\"center\" | \"top\"",
4647
4654
  "required": false,
4648
- "default": null,
4655
+ "default": "top",
4649
4656
  "description": "Where it sits: centered, or with a fixed top edge for content that changes height, so the title never moves."
4650
4657
  },
4651
4658
  {
@@ -4744,7 +4751,7 @@
4744
4751
  "type": "boolean",
4745
4752
  "required": false,
4746
4753
  "default": null,
4747
- "description": "A press outside doesn't close it, for forms that would lose what was typed; Escape and the close circle still do. Every StepDialog is persistent."
4754
+ "description": "A press outside doesn't close it or move the focus, for forms that would lose what was typed; Escape and the close circle still close it. Every StepDialog is persistent."
4748
4755
  },
4749
4756
  {
4750
4757
  "name": "size",
@@ -4793,7 +4800,7 @@
4793
4800
  },
4794
4801
  {
4795
4802
  "name": "LayerDialog",
4796
- "description": "A stacked dialog: a second layer slides over the first (add model → review values); back returns. The layers below stay as they were. Moving to a layer puts the focus on its first field, or its primary action; Back returns it to the control that opened the layer, scrolled where it was. Enter in a single-line field and ⌘/Ctrl+Enter call onSubmit on every layer.",
4803
+ "description": "A stacked dialog: a second layer slides over the first (add model → review values); Back returns, and Escape closes the dialog from any layer. The layers below stay as they were. The close circle sits in a bar above the title, with Back at its start from the second layer, so the title keeps its place on every layer. Moving to a layer puts the focus on its first field, or its primary action; Back returns it to the control that opened the layer, scrolled where it was. Enter in a single-line field and ⌘/Ctrl+Enter call onSubmit on every layer.",
4797
4804
  "props": [
4798
4805
  {
4799
4806
  "name": "layers",
@@ -4806,8 +4813,8 @@
4806
4813
  "name": "anchor",
4807
4814
  "type": "\"center\" | \"top\"",
4808
4815
  "required": false,
4809
- "default": null,
4810
- "description": "Where it sits: centered, or with a fixed top edge for layers of different heights."
4816
+ "default": "top",
4817
+ "description": "Where it sits: with a fixed top edge (default), so the title stays put on layers of different heights, or centered."
4811
4818
  },
4812
4819
  {
4813
4820
  "name": "busy",
@@ -4919,7 +4926,7 @@
4919
4926
  "type": "DialogStep[]",
4920
4927
  "required": true,
4921
4928
  "default": null,
4922
- "description": "The steps, each with its title, content and whether it can be continued; `onContinue` checks a step before the next opens, such as asking a server, and `continueLabel` names that check: \"Detect settings\"."
4929
+ "description": "The steps, each with its title, content and whether it can be continued: with `blockedReason`, Continue waits, and Enter shows and announces the reason under the step; `onContinue` checks a step before the next opens, such as asking a server, and `continueLabel` names that check: \"Detect settings\"."
4923
4930
  },
4924
4931
  {
4925
4932
  "name": "submitLabel",
@@ -4999,9 +5006,9 @@
4999
5006
  "ALERT_DIALOG": {
5000
5007
  "axes": {
5001
5008
  "tone": {
5002
- "danger": "Destructive (default)",
5003
- "warning": "Risky but reversible",
5004
- "info": "Neutral confirmation"
5009
+ "danger": "Destructive: a danger confirm, with the focus on Cancel (default)",
5010
+ "warning": "Risky but reversible: a primary confirm, with the focus on Cancel",
5011
+ "info": "A neutral confirmation: a primary confirm, with the focus on it"
5005
5012
  }
5006
5013
  },
5007
5014
  "defaults": {
@@ -5043,7 +5050,7 @@
5043
5050
  },
5044
5051
  "defaults": {
5045
5052
  "size": "md",
5046
- "anchor": "center"
5053
+ "anchor": "top"
5047
5054
  }
5048
5055
  },
5049
5056
  "STEP_DIALOG": {
@@ -5148,7 +5155,7 @@
5148
5155
  "components": [
5149
5156
  {
5150
5157
  "name": "Empty",
5151
- "description": "An empty state: a title, one sentence, one or two actions. No icon, no illustration.",
5158
+ "description": "An empty state: a title, one sentence, one action. No icon, no illustration. The `lg` title is a heading (h2) for a page that is empty; `md` and `compact` titles are text, so an empty table, list or section adds no heading to the page's outline.",
5152
5159
  "props": [
5153
5160
  {
5154
5161
  "name": "title",
@@ -5162,7 +5169,7 @@
5162
5169
  "type": "ReactNode",
5163
5170
  "required": false,
5164
5171
  "default": null,
5165
- "description": "One primary and at most one secondary action."
5172
+ "description": "The one action that makes something appear; put a link to read more in the description."
5166
5173
  },
5167
5174
  {
5168
5175
  "name": "children",
@@ -5190,7 +5197,7 @@
5190
5197
  "type": "\"md\" | \"lg\" | \"compact\"",
5191
5198
  "required": false,
5192
5199
  "default": "lg",
5193
- "description": "How much room it takes: a whole page (`lg`), a section (`md`) or a row (`compact`)."
5200
+ "description": "How much room it takes: a whole page (`lg`, with a heading), a section (`md`) or a row (`compact`)."
5194
5201
  }
5195
5202
  ],
5196
5203
  "file": "src/components/empty/empty.tsx"
@@ -5232,7 +5239,7 @@
5232
5239
  "type": "ReactNode",
5233
5240
  "required": false,
5234
5241
  "default": null,
5235
- "description": "The error message, shown under the control in the danger color: it marks the field invalid and is read out with the description."
5242
+ "description": "The error message, shown under the control in the danger color: it marks the field invalid and is read out with the description. After a failed submit, move focus to the first invalid field so its error is heard."
5236
5243
  },
5237
5244
  {
5238
5245
  "name": "id",
@@ -5267,21 +5274,21 @@
5267
5274
  },
5268
5275
  {
5269
5276
  "name": "Fieldset",
5270
- "description": "A group of fields under one legend.",
5277
+ "description": "A group of fields under one legend, which names the group for screen readers.",
5271
5278
  "props": [
5272
5279
  {
5273
5280
  "name": "legend",
5274
5281
  "type": "ReactNode",
5275
5282
  "required": true,
5276
5283
  "default": null,
5277
- "description": "The heading of the group of fields."
5284
+ "description": "The heading of the group of fields, read out as the group's name."
5278
5285
  },
5279
5286
  {
5280
5287
  "name": "description",
5281
5288
  "type": "ReactNode",
5282
5289
  "required": false,
5283
5290
  "default": null,
5284
- "description": "One sentence of help under the heading."
5291
+ "description": "One sentence of help under the heading; it also describes the group."
5285
5292
  }
5286
5293
  ],
5287
5294
  "file": "src/components/field/field.tsx"
@@ -5322,7 +5329,7 @@
5322
5329
  "type": "string",
5323
5330
  "required": true,
5324
5331
  "default": null,
5325
- "description": "The name of the figure's scrolling region, read by screen readers."
5332
+ "description": "The name of the figure's scrolling region, read by screen readers; give each figure on a page its own."
5326
5333
  },
5327
5334
  {
5328
5335
  "name": "caption",
@@ -5529,7 +5536,7 @@
5529
5536
  "components": [
5530
5537
  {
5531
5538
  "name": "FilterRow",
5532
- "description": "The row between a page's header and its list or table: pill tabs at the start, filters at the end. It grows with its content instead of keeping a toolbar's 48px, and on a narrow screen the filters wrap under the tabs, at the start. The tabs keep their own arrow keys; Left and Right move across the filters only, which form their own toolbar.",
5539
+ "description": "The row between a page's header and its list or table: pill tabs at the start, filters at the end. It grows with its content instead of keeping a toolbar's 48px, and on a narrow screen the filters wrap under the tabs, at the start. The tabs keep their own arrow keys; Left and Right move from filter to filter, which form their own toolbar.",
5533
5540
  "props": [
5534
5541
  {
5535
5542
  "name": "children",
@@ -5584,7 +5591,7 @@
5584
5591
  "components": [
5585
5592
  {
5586
5593
  "name": "Flow",
5587
- "description": "A node-and-connector diagram: the route \"app → Kaeso → provider / model\".",
5594
+ "description": "A node-and-connector diagram: the route \"app → Kaeso → provider / model\". A diagram wider than its column scrolls sideways with a fade at the edge and takes focus.",
5588
5595
  "props": [
5589
5596
  {
5590
5597
  "name": "columns",
@@ -5605,7 +5612,7 @@
5605
5612
  "type": "boolean",
5606
5613
  "required": false,
5607
5614
  "default": "false",
5608
- "description": "Dots that travel along the connectors. Off by default; never on loaded pages that need calm."
5615
+ "description": "When the route changes, a dot runs once along each connector, to show where requests now go. Never on first render and never with reduced motion."
5609
5616
  },
5610
5617
  {
5611
5618
  "name": "aria-label",
@@ -5636,7 +5643,7 @@
5636
5643
  "FLOW": {
5637
5644
  "axes": {
5638
5645
  "node": {
5639
- "pill": "A raised pill (default)",
5646
+ "pill": "A pill with a hairline (default)",
5640
5647
  "box": "A rounded-14 box with a description line"
5641
5648
  }
5642
5649
  },
@@ -6032,7 +6039,7 @@
6032
6039
  },
6033
6040
  {
6034
6041
  "name": "NumberInput",
6035
- "description": "Numbers that stay exact: right-aligned tabular digits, a unit, stepper circles on hover, thousands separators on blur, and a decimal string value.",
6042
+ "description": "Numbers that stay exact: end-aligned tabular digits, a unit, quiet stepper circles, thousands separators on blur, and a decimal string value.",
6036
6043
  "props": [
6037
6044
  {
6038
6045
  "name": "align",
@@ -6081,7 +6088,7 @@
6081
6088
  "type": "boolean",
6082
6089
  "required": false,
6083
6090
  "default": null,
6084
- "description": "Hide the stepper circles."
6091
+ "description": "Hide the stepper circles, where a value is typed rather than nudged, such as an id or a year."
6085
6092
  },
6086
6093
  {
6087
6094
  "name": "integer",
@@ -6726,8 +6733,8 @@
6726
6733
  "NUMBER_INPUT": {
6727
6734
  "axes": {
6728
6735
  "align": {
6729
- "end": "Right-aligned tabular digits (default)",
6730
- "start": "Left-aligned"
6736
+ "end": "End-aligned tabular digits (default)",
6737
+ "start": "Start-aligned"
6731
6738
  }
6732
6739
  },
6733
6740
  "defaults": {
@@ -6737,7 +6744,7 @@
6737
6744
  "OTP_INPUT": {
6738
6745
  "axes": {
6739
6746
  "size": {
6740
- "md": "48px cells (default)",
6747
+ "md": "48px cells (default); they shrink, square, when the row is narrower",
6741
6748
  "sm": "40px cells"
6742
6749
  }
6743
6750
  },
@@ -6820,7 +6827,7 @@
6820
6827
  },
6821
6828
  {
6822
6829
  "name": "ClientButton",
6823
- "description": "An agent client's mark, such as Claude, Cursor or GitHub Copilot, on a raised tile, as a button that opens how to connect it.",
6830
+ "description": "An agent client's mark, such as Claude, Cursor or GitHub Copilot, in a raised circle beside the other header buttons, as a button that opens how to connect it.",
6824
6831
  "props": [
6825
6832
  {
6826
6833
  "name": "aria-label",
@@ -6843,6 +6850,13 @@
6843
6850
  "default": null,
6844
6851
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6845
6852
  },
6853
+ {
6854
+ "name": "data-force",
6855
+ "type": "string",
6856
+ "required": false,
6857
+ "default": null,
6858
+ "description": "Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`."
6859
+ },
6846
6860
  {
6847
6861
  "name": "onClick",
6848
6862
  "type": "(() => void)",
@@ -6897,7 +6911,7 @@
6897
6911
  },
6898
6912
  {
6899
6913
  "name": "EffectiveAccess",
6900
- "description": "What someone can do, at a glance: a row per group with the granted rights in words (\"Every right\", \"None\", or their names) and how many of the group's rights that is, under the roles it comes from. The detail, with a source per right, is RightsMatrix in read-only mode.",
6914
+ "description": "What someone can do, at a glance: a row per group with the granted rights in words (\"Every right\", \"None\", or their names) and how many of the group's rights that is, under the roles it comes from; groups with nothing granted share one \"No rights\" row. A role chip with more to say has a dotted underline and says it in a tooltip. The detail, with a source per right, is RightsMatrix in read-only mode.",
6901
6915
  "props": [
6902
6916
  {
6903
6917
  "name": "groups",
@@ -6974,7 +6988,7 @@
6974
6988
  },
6975
6989
  {
6976
6990
  "name": "GrantSummary",
6977
- "description": "What an agent or a key may do, one short line each after a check mark, on a group surface.",
6991
+ "description": "What an agent or a key may do, one short line each after a check mark, on a group surface with 20px inside, like a settings group.",
6978
6992
  "props": [
6979
6993
  {
6980
6994
  "name": "aria-label",
@@ -6995,7 +7009,7 @@
6995
7009
  "type": "ReactNode",
6996
7010
  "required": false,
6997
7011
  "default": null,
6998
- "description": "A small button after the note, such as Customize."
7012
+ "description": "A small button after the note (or alone, at the end), such as Customize."
6999
7013
  },
7000
7014
  {
7001
7015
  "name": "className",
@@ -7009,14 +7023,14 @@
7009
7023
  "type": "ReactNode",
7010
7024
  "required": false,
7011
7025
  "default": null,
7012
- "description": "A quiet note under the lines, such as how long it lasts."
7026
+ "description": "A note under the lines in secondary text, such as how long it lasts."
7013
7027
  }
7014
7028
  ],
7015
7029
  "file": "src/components/kaeso/grant-summary.tsx"
7016
7030
  },
7017
7031
  {
7018
7032
  "name": "KeyDisplay",
7019
- "description": "A redacted key: mono 13 with its state dot, copy of the redacted form, and its access.",
7033
+ "description": "A redacted key: mono 13, a word badge for any state but active, a copy of the redacted form, and its access in an outline badge.",
7020
7034
  "props": [
7021
7035
  {
7022
7036
  "name": "redacted",
@@ -7065,7 +7079,7 @@
7065
7079
  },
7066
7080
  {
7067
7081
  "name": "LimitMeter",
7068
- "description": "A limit: its kind, scope and window, hard or soft, the meter with alert ticks, and when it resets.",
7082
+ "description": "A limit: its kind, scope and window, hard or soft, the meter with alert ticks, and when it resets. Over the limit it says so, and what happens to requests.",
7069
7083
  "props": [
7070
7084
  {
7071
7085
  "name": "kind",
@@ -7086,7 +7100,7 @@
7086
7100
  "type": "ReactNode",
7087
7101
  "required": true,
7088
7102
  "default": null,
7089
- "description": "\"Project\", \"Key ci-runner\", \"Member Ada\"."
7103
+ "description": "\"Project\", \"Key ci-runner\", \"Member Ada\". A text scope also names the meter for screen readers, and shows whole on hover when it doesn't fit."
7090
7104
  },
7091
7105
  {
7092
7106
  "name": "used",
@@ -7479,7 +7493,7 @@
7479
7493
  },
7480
7494
  {
7481
7495
  "name": "RightsMatrix",
7482
- "description": "Rights by group, for a role, a member or a key. Edit mode: a checkbox per right and per group (mixed when some are granted), requirements kept (granting \"edit\" grants \"view\"; withdrawing \"view\" withdraws \"edit\"), each right's needs said under it, and arrow keys moving between checkboxes. Read-only mode: a mark per right and the roles that grant it. Rows keep their size whatever their state. Fits a sheet and a phone.",
7496
+ "description": "Rights by group, for a role, a member or a key. Edit mode: a checkbox per right and per group (checked only when every right in it is granted, mixed when some are), requirements kept (granting \"edit\" grants \"view\"; withdrawing \"view\" withdraws \"edit\"), each right's needs said under it, and a right that can't change saying why under it. The matrix is one tab stop: the arrow keys move between checkboxes, and the right arrow reaches a right's sensitive mark. A group's name toggles the group, as a right's row toggles the right. Read-only mode: a mark per right and the roles that grant it. Rows keep their size whatever their state. Fits a sheet and a phone.",
7483
7497
  "props": [
7484
7498
  {
7485
7499
  "name": "groups",
@@ -7542,7 +7556,7 @@
7542
7556
  },
7543
7557
  {
7544
7558
  "name": "RolePicker",
7545
- "description": "Choosing a role: built-in roles first, then custom ones under their own caption, each with its one-sentence description. A role the person can't give stays in the list, disabled, with the reason under it and in its tooltip, so nobody wonders where it went.",
7559
+ "description": "Choosing a role: built-in roles first, then custom ones under their own caption, each with its one-sentence description. A role the person can't give stays in the list, disabled, with the reason under it, so nobody wonders where it went.",
7546
7560
  "props": [
7547
7561
  {
7548
7562
  "name": "roles",
@@ -7626,14 +7640,14 @@
7626
7640
  },
7627
7641
  {
7628
7642
  "name": "SecretReveal",
7629
- "description": "The one-time secret: calm, centered, certain. The secret on a well (selected on click), a large \"Copy key\" that becomes \"Copied\" without changing size, a plain warning, and snippets that use it.",
7643
+ "description": "The one-time secret: calm, centered, certain. The secret on a well (selected on click), a plain warning, a large \"Copy key\" that becomes \"Key copied\" without changing size, and a `.env` tab with the gateway's URL and the key beside SDK snippets that read the key from the environment.",
7630
7644
  "props": [
7631
7645
  {
7632
7646
  "name": "baseUrl",
7633
7647
  "type": "string",
7634
7648
  "required": true,
7635
7649
  "default": null,
7636
- "description": "The gateway's address, for the code snippet that uses the key."
7650
+ "description": "The gateway's address, for the `.env` tab and the code snippets."
7637
7651
  },
7638
7652
  {
7639
7653
  "name": "secret",
@@ -7717,7 +7731,7 @@
7717
7731
  },
7718
7732
  {
7719
7733
  "name": "UsageBreakdown",
7720
- "description": "A stacked bar of token kinds with the numbers under it, in the fixed series mapping.",
7734
+ "description": "A stacked bar of token kinds with the numbers under it, in the fixed series mapping; cache read is a soft blue edged in input's blue. Each rounded count shows the exact one on hover and focus.",
7721
7735
  "props": [
7722
7736
  {
7723
7737
  "name": "tokens",
@@ -7921,7 +7935,7 @@
7921
7935
  "components": [
7922
7936
  {
7923
7937
  "name": "KeyValue",
7924
- "description": "Label and value pairs (13 secondary label, 14 value), copyable values. Side by side for sheets; label above value in columns (`grid`) where a sheet is wide enough for two or more to a row. A text value that doesn't fit ends in an ellipsis and shows whole in a tooltip.",
7938
+ "description": "Label and value pairs (13 secondary label, 14 value), copyable values. Side by side for sheets; label above value in columns (`grid`) where a sheet is wide enough for two or more to a row. A value or grid label that doesn't fit ends in an ellipsis, takes focus and shows whole in a tooltip. Side by side, the label column grows to its longest label up to 240px, and longer labels wrap. Ids and keys (`mono`) are 13px, like ids everywhere in the library.",
7925
7939
  "props": [
7926
7940
  {
7927
7941
  "name": "items",
@@ -7983,7 +7997,7 @@
7983
7997
  "components": [
7984
7998
  {
7985
7999
  "name": "Label",
7986
- "description": "The label of a form control.",
8000
+ "description": "The label of a form control. Pass `data-disabled` beside a disabled control and it dims with it.",
7987
8001
  "props": [
7988
8002
  {
7989
8003
  "name": "children",
@@ -8056,7 +8070,7 @@
8056
8070
  },
8057
8071
  {
8058
8072
  "name": "gap",
8059
- "type": "0 | 2 | 24 | 20 | 32 | 40 | 4 | 6 | 8 | 12 | 16 | 48 | 64",
8073
+ "type": "0 | 2 | 24 | 8 | 12 | 16 | 20 | 32 | 40 | 4 | 6 | 48 | 64",
8060
8074
  "required": false,
8061
8075
  "default": "16",
8062
8076
  "description": "The space between items, in pixels on the spacing scale."
@@ -8084,7 +8098,7 @@
8084
8098
  },
8085
8099
  {
8086
8100
  "name": "gap",
8087
- "type": "0 | 2 | 24 | 20 | 32 | 40 | 4 | 6 | 8 | 12 | 16 | 48 | 64",
8101
+ "type": "0 | 2 | 24 | 8 | 12 | 16 | 20 | 32 | 40 | 4 | 6 | 48 | 64",
8088
8102
  "required": false,
8089
8103
  "default": "16",
8090
8104
  "description": "The space between items, in pixels on the spacing scale."
@@ -8126,7 +8140,7 @@
8126
8140
  },
8127
8141
  {
8128
8142
  "name": "gap",
8129
- "type": "0 | 2 | 24 | 20 | 32 | 40 | 4 | 6 | 8 | 12 | 16 | 48 | 64",
8143
+ "type": "0 | 2 | 24 | 8 | 12 | 16 | 20 | 32 | 40 | 4 | 6 | 48 | 64",
8130
8144
  "required": false,
8131
8145
  "default": "16",
8132
8146
  "description": "The space between items, in pixels on the spacing scale."
@@ -8163,7 +8177,7 @@
8163
8177
  "2": "Two columns from 768px",
8164
8178
  "3": "Three columns from 768px",
8165
8179
  "4": "Two, then four from 1024px",
8166
- "6": "Three, then six from 1024px"
8180
+ "6": "Two, three from 768px, six from 1024px"
8167
8181
  }
8168
8182
  },
8169
8183
  "defaults": {
@@ -8219,7 +8233,7 @@
8219
8233
  "LINK": {
8220
8234
  "axes": {
8221
8235
  "variant": {
8222
- "inline": "Inside prose: text color with a quiet underline that turns solid on hover",
8236
+ "inline": "Inside prose: text color with a grey underline that turns to the text color on hover",
8223
8237
  "quiet": "Navigation-style links in footers and metadata; no underline until hover",
8224
8238
  "standalone": "A link on its own line (“Team overview ›”)",
8225
8239
  "heading": "A heading's link to itself: the heading's own look, with a # beside it on hover and keyboard focus",
@@ -8239,7 +8253,7 @@
8239
8253
  "components": [
8240
8254
  {
8241
8255
  "name": "GroupHeader",
8242
- "description": "A quiet caption row above its group: title, count and a disclosure chevron, set in from the edges like the rows. No band: space separates the groups, and the + circle appears with hover or focus.",
8256
+ "description": "A quiet caption row above its group: title, count and a disclosure chevron, set in from the edges like the rows. On the panel there is no band: 16px of space separates the groups. In a card the header is a `fill-1` band with a hairline, the card's way of separating groups. The + circle appears with hover or focus.",
8243
8257
  "props": [
8244
8258
  {
8245
8259
  "name": "title",
@@ -8281,7 +8295,7 @@
8281
8295
  "type": "boolean",
8282
8296
  "required": false,
8283
8297
  "default": null,
8284
- "description": "The list's first row (no hairline above it in a card)."
8298
+ "description": "The list's first row: no space above it on the panel, no hairline above it in a card."
8285
8299
  },
8286
8300
  {
8287
8301
  "name": "glyph",
@@ -8295,7 +8309,7 @@
8295
8309
  "type": "boolean",
8296
8310
  "required": false,
8297
8311
  "default": null,
8298
- "description": "In a selectable list, line the title up with the row titles after the checkbox column."
8312
+ "description": "In a selectable list, line the title up with the row titles after the checkbox column; the hover fill still starts on the gutter."
8299
8313
  },
8300
8314
  {
8301
8315
  "name": "index",
@@ -8330,7 +8344,7 @@
8330
8344
  },
8331
8345
  {
8332
8346
  "name": "List",
8333
- "description": "The console list: 44px rows on the panel, no lines, metadata on the right, keyboard-first. An ARIA grid of one-cell rows with one tab stop: arrows move between rows, Space selects, Enter opens, and the right arrow reaches a row's actions.",
8347
+ "description": "The console list: 44px rows on the panel (48px in a card, 56px with a second line), no lines, metadata on the right, keyboard-first. An ARIA grid of one-cell rows with one tab stop: arrows move between rows, Space selects, Enter opens, the right arrow reaches a row's actions and Escape comes back. A row's text can be selected and copied; a click that selects text doesn't open the row.",
8334
8348
  "props": [
8335
8349
  {
8336
8350
  "name": "aria-label",
@@ -8351,7 +8365,7 @@
8351
8365
  "type": "string",
8352
8366
  "required": false,
8353
8367
  "default": null,
8354
- "description": "Force a state on the first row for state matrices: hover, focus, selected."
8368
+ "description": "Force a state on the first row for state matrices: hover, pressed, focus."
8355
8369
  },
8356
8370
  {
8357
8371
  "name": "density",
@@ -8393,7 +8407,7 @@
8393
8407
  "type": "boolean",
8394
8408
  "required": false,
8395
8409
  "default": null,
8396
- "description": "Loading rows shaped like items, while the rows aren't known yet."
8410
+ "description": "Loading rows shaped like items, under a group header's shape when the list has groups, while the rows aren't known yet."
8397
8411
  },
8398
8412
  {
8399
8413
  "name": "onOpen",
@@ -8435,7 +8449,7 @@
8435
8449
  "type": "boolean",
8436
8450
  "required": false,
8437
8451
  "default": "true",
8438
- "description": "The floating selection bar; off where the host shows the count itself, as in a dialog."
8452
+ "description": "The floating selection bar; off where the host shows the count itself, as in a dialog. Rows reached with the arrow keys scroll clear of it."
8439
8453
  },
8440
8454
  {
8441
8455
  "name": "virtualizeAbove",
@@ -8519,7 +8533,7 @@
8519
8533
  "type": "boolean",
8520
8534
  "required": false,
8521
8535
  "default": "false",
8522
- "description": "The list is narrow (a phone): the title, the subtitle and the metadata with the date are lines of their own."
8536
+ "description": "The list is narrow (a phone): the title and the subtitle are lines of their own, and the metadata, the date, the avatar and the actions share one line under them, so titles keep the row's width."
8523
8537
  },
8524
8538
  {
8525
8539
  "name": "onFocus",
@@ -8642,7 +8656,7 @@
8642
8656
  "axes": {
8643
8657
  "density": {
8644
8658
  "default": "44px rows (default)",
8645
- "compact": "36px rows"
8659
+ "compact": "36px rows; 44px with a coarse pointer"
8646
8660
  }
8647
8661
  },
8648
8662
  "defaults": {
@@ -8658,14 +8672,14 @@
8658
8672
  "components": [
8659
8673
  {
8660
8674
  "name": "Loader",
8661
- "description": "A status region with the spinner and a label: \"Saving provider…\", or a page or region that is loading. Its place is kept while it waits out `delay`, so nothing moves when it shows.",
8675
+ "description": "A status region with the spinner and a label: \"Saving provider…\", or a page or region that is loading. Its place is kept while it waits out `delay`, so nothing moves when it shows; the status region is there, empty, from the start, and its words arrive when the spinner shows, so screen readers announce them.",
8662
8676
  "props": [
8663
8677
  {
8664
8678
  "name": "delay",
8665
8679
  "type": "number | boolean",
8666
8680
  "required": false,
8667
8681
  "default": null,
8668
- "description": "Waits before the spinner and its label show, so quick work shows nothing: `true` for the library's 300ms (`useDelayedLoading`), or milliseconds. None by default."
8682
+ "description": "Waits before the spinner and its label show, so quick work shows nothing: the library's 300ms by default (`useDelayedLoading`), a number of milliseconds, or `false` to show at once."
8669
8683
  },
8670
8684
  {
8671
8685
  "name": "hideLabel",
@@ -8693,7 +8707,7 @@
8693
8707
  "type": "number",
8694
8708
  "required": false,
8695
8709
  "default": null,
8696
- "description": "Once shown, they stay at least this many milliseconds: 400 with a delay, 0 without."
8710
+ "description": "Once shown, they stay at least this many milliseconds: 400 by default, 0 with `delay={false}`."
8697
8711
  },
8698
8712
  {
8699
8713
  "name": "size",
@@ -8834,7 +8848,7 @@
8834
8848
  "components": [
8835
8849
  {
8836
8850
  "name": "Markdown",
8837
- "description": "Markdown, safely: headings, paragraphs, lists, tasks, code fences (CodeBlock), inline code, emphasis, links, quotes, rules and tables. Raw HTML stays text, links open only for http, https and mailto in a new tab, images are links. Long texts show their start until \"Show all\".",
8851
+ "description": "Markdown, safely: headings, paragraphs, lists, tasks, code fences (CodeBlock), inline code, emphasis, links, quotes, rules and tables. Raw HTML stays text, links open only for http, https and mailto in a new tab, images are links. Long texts show their start until \"Show all\". A table wider than its column scrolls sideways with a fade and takes focus.",
8838
8852
  "props": [
8839
8853
  {
8840
8854
  "name": "text",
@@ -8937,7 +8951,7 @@
8937
8951
  "type": "ReactNode",
8938
8952
  "required": true,
8939
8953
  "default": null,
8940
- "description": "The area that opens the menu on a right click or long press."
8954
+ "description": "The area that opens the menu on a right click or long press. When it holds nothing focusable, it becomes a focus stop, so Shift F10 and the context-menu key reach it; the focus returns to it when the menu closes."
8941
8955
  },
8942
8956
  {
8943
8957
  "name": "onOpenChange",
@@ -8951,7 +8965,7 @@
8951
8965
  },
8952
8966
  {
8953
8967
  "name": "Menu",
8954
- "description": "A dropdown menu: 16px radius, 34px rows, typeahead, Home/End, loops.",
8968
+ "description": "A dropdown menu: 16px radius, 34px rows that grow when a label wraps, typeahead, Home/End, loops. An item's shortcut and hint describe it rather than name it. Checkbox and radio items show a check when chosen; the group's label says whether it takes one or several.",
8955
8969
  "props": [
8956
8970
  {
8957
8971
  "name": "children",
@@ -9059,7 +9073,7 @@
9059
9073
  "components": [
9060
9074
  {
9061
9075
  "name": "Meter",
9062
- "description": "A limit or quota: label and value, a 6px pill track, threshold ticks, a caption.",
9076
+ "description": "A limit or quota: label and value, a 6px pill track, threshold ticks cut out of the bar, a caption. Past the first threshold the bar turns amber and the value and caption turn the warning color, at the limit red, and screen readers hear \"near the limit\" or \"over the limit\" after the value; in light the bar's end keeps 3:1 against the track.",
9063
9077
  "props": [
9064
9078
  {
9065
9079
  "name": "value",
@@ -9080,7 +9094,7 @@
9080
9094
  "type": "ReactNode",
9081
9095
  "required": false,
9082
9096
  "default": null,
9083
- "description": "\"Resets in 12 days\""
9097
+ "description": "\"Resets in 12 days\"; near or over the limit, say what happens, such as \"Over the limit: requests are refused\"."
9084
9098
  },
9085
9099
  {
9086
9100
  "name": "className",
@@ -9136,7 +9150,7 @@
9136
9150
  },
9137
9151
  {
9138
9152
  "name": "Progress",
9139
- "description": "Progress for work over a second: a determinate pill, or an indeterminate 2px line.",
9153
+ "description": "Progress for work over a second: a determinate pill, or an indeterminate 2px line. With reduced motion the indeterminate line spans the width and pulses instead of sliding, so it never reads as a third done.",
9140
9154
  "props": [
9141
9155
  {
9142
9156
  "name": "aria-label",
@@ -9167,7 +9181,7 @@
9167
9181
  "METER": {
9168
9182
  "axes": {
9169
9183
  "tone": {
9170
- "auto": "Series 1 until the first alert threshold, warning after, danger at 100% (default)",
9184
+ "auto": "Series 1 until the first alert threshold, amber (series 2) after, danger at 100%; the value and the caption take the warning or danger color too (default)",
9171
9185
  "neutral": "A plain share"
9172
9186
  }
9173
9187
  },
@@ -9247,7 +9261,7 @@
9247
9261
  "PAGE_HEADER": {
9248
9262
  "axes": {
9249
9263
  "size": {
9250
- "md": "52px, no bottom line (default); on a phone the tabs take a second row"
9264
+ "md": "52px, no bottom line (default); on a phone the title and actions keep the first row and the tabs take a second"
9251
9265
  }
9252
9266
  },
9253
9267
  "defaults": {
@@ -9482,7 +9496,7 @@
9482
9496
  "type": "boolean",
9483
9497
  "required": false,
9484
9498
  "default": null,
9485
- "description": "Whether there is a next page."
9499
+ "description": "Whether there is a next page; with Load more, turning it off after the last load shows “All rows shown” where focus was."
9486
9500
  },
9487
9501
  {
9488
9502
  "name": "hasPrevious",
@@ -9531,7 +9545,7 @@
9531
9545
  "type": "number",
9532
9546
  "required": false,
9533
9547
  "default": "1",
9534
- "description": "pages:"
9548
+ "description": "The current page, for numbered pages; previous and next stay in place and only announce themselves unavailable at the ends."
9535
9549
  },
9536
9550
  {
9537
9551
  "name": "pageCount",
@@ -9555,9 +9569,9 @@
9555
9569
  "PAGINATION": {
9556
9570
  "axes": {
9557
9571
  "variant": {
9558
- "load-more": "A “Load more” pill while more rows exist, nothing once all are shown (cursor APIs, default)",
9572
+ "load-more": "A “Load more” pill while more rows exist; once all are shown, nothing, or “All rows shown” where the button had focus (cursor APIs, default)",
9559
9573
  "cursor": "Previous and next circles, without a count",
9560
- "pages": "Page numbers, for lists with a known number of pages"
9574
+ "pages": "Page numbers in seven fixed slots, so Next stays under the pointer, for lists with a known number of pages"
9561
9575
  }
9562
9576
  },
9563
9577
  "defaults": {
@@ -9573,7 +9587,7 @@
9573
9587
  "components": [
9574
9588
  {
9575
9589
  "name": "CompareGrid",
9576
- "description": "Columns side by side to compare models: equal widths, a header, a body that scrolls on its own and a footer each.",
9590
+ "description": "Columns side by side to compare models: equal widths of at least 320px, a header, a body that scrolls on its own and a footer each. When the columns don't fit, Previous column and Next column reach the hidden ones. Removing a column is instant, so offer Undo in a toast.",
9577
9591
  "props": [
9578
9592
  {
9579
9593
  "name": "aria-label",
@@ -9636,21 +9650,21 @@
9636
9650
  "type": "(() => void)",
9637
9651
  "required": false,
9638
9652
  "default": null,
9639
- "description": "Adds a column: a circle at the end of the last column's header (and in the phone's switcher)."
9653
+ "description": "Adds a column: a circle in a narrow rail after the columns (on a phone, in the switcher, or in the header of a single column). Focus moves to the new column's header."
9640
9654
  }
9641
9655
  ],
9642
9656
  "file": "src/components/playground/compare-grid.tsx"
9643
9657
  },
9644
9658
  {
9645
9659
  "name": "Composer",
9646
- "description": "The prompt box: a text box that grows with what is written up to `maxRows`, then scrolls; Send, which becomes Stop while a response streams. Enter sends and Shift Enter adds a line (`submitOn`); ⌘ Enter or Ctrl Enter also sends. On a touch screen Enter adds a line and the button sends.",
9660
+ "description": "The prompt box: a text box that grows with what is written up to `maxRows`, then scrolls, its edge fading where more lines wait; Send, which becomes Stop while a response streams. Enter sends and Shift Enter adds a line (`submitOn`); ⌘ Enter or Ctrl Enter also sends. On a touch screen Enter adds a line and the button sends. A click anywhere in the box, the button row included, puts the cursor in the text.",
9647
9661
  "props": [
9648
9662
  {
9649
9663
  "name": "actions",
9650
9664
  "type": "ReactNode",
9651
9665
  "required": false,
9652
9666
  "default": null,
9653
- "description": "Controls at the start of the button row: parameters, clear."
9667
+ "description": "Controls at the start of the button row: parameters, clear. Ghost and secondary buttons there take tones made for the composer's surface."
9654
9668
  },
9655
9669
  {
9656
9670
  "name": "aria-label",
@@ -9762,21 +9776,21 @@
9762
9776
  "type": "string",
9763
9777
  "required": false,
9764
9778
  "default": null,
9765
- "description": "The stop button's accessible name, shown while a reply streams."
9779
+ "description": "The Stop button's label, shown while a response streams (\"Stop\" by default)."
9766
9780
  },
9767
9781
  {
9768
9782
  "name": "streaming",
9769
9783
  "type": "boolean",
9770
9784
  "required": false,
9771
9785
  "default": "false",
9772
- "description": "A response is arriving: Send becomes Stop. The text box stays editable for the next prompt."
9786
+ "description": "A response is arriving: Send becomes Stop. The text box stays editable for the next prompt; Enter waits, and the text box's description says to stop the response to send."
9773
9787
  },
9774
9788
  {
9775
9789
  "name": "submitLabel",
9776
9790
  "type": "string",
9777
9791
  "required": false,
9778
9792
  "default": null,
9779
- "description": "The send button's accessible name."
9793
+ "description": "The Send button's label (\"Send\" by default)."
9780
9794
  },
9781
9795
  {
9782
9796
  "name": "submitOn",
@@ -9987,7 +10001,7 @@
9987
10001
  },
9988
10002
  {
9989
10003
  "name": "ParameterPanel",
9990
- "description": "A request's parameters: system instructions, temperature, top P, most output tokens, and, for a model that reasons, reasoning effort and summary. Unset values are the model's defaults; Reset returns to them (instructions stay).",
10004
+ "description": "A request's parameters: system instructions, temperature, top P, maximum output tokens, and, for a model that reasons, reasoning effort and summary. Unset values are the model's defaults; Reset returns to them (instructions stay).",
9991
10005
  "props": [
9992
10006
  {
9993
10007
  "name": "onValueChange",
@@ -10043,7 +10057,7 @@
10043
10057
  "type": "number",
10044
10058
  "required": false,
10045
10059
  "default": null,
10046
- "description": "The model's most output tokens: the field's maximum."
10060
+ "description": "The model's maximum output tokens: the field's maximum, named in a hint under it."
10047
10061
  },
10048
10062
  {
10049
10063
  "name": "reasoning",
@@ -10064,7 +10078,7 @@
10064
10078
  },
10065
10079
  {
10066
10080
  "name": "ParameterPopover",
10067
- "description": "ParameterPanel in a 320px popover from a sliders circle (or any trigger).",
10081
+ "description": "ParameterPanel in a 320px popover from a sliders circle (or any trigger), with a Close button beside its title. Focus stays inside until it closes.",
10068
10082
  "props": [
10069
10083
  {
10070
10084
  "name": "onValueChange",
@@ -10120,7 +10134,7 @@
10120
10134
  "type": "number",
10121
10135
  "required": false,
10122
10136
  "default": null,
10123
- "description": "The model's most output tokens: the field's maximum."
10137
+ "description": "The model's maximum output tokens: the field's maximum, named in a hint under it."
10124
10138
  },
10125
10139
  {
10126
10140
  "name": "onOpenChange",
@@ -10176,14 +10190,14 @@
10176
10190
  },
10177
10191
  {
10178
10192
  "name": "PromptSuggestions",
10179
- "description": "Example prompts before a thread starts: up to three lines of plain secondary text that take a quiet fill on hover. No outlines, no icons; leave them out once a prompt is sent.",
10193
+ "description": "Example prompts before a thread starts: up to three pill rows of secondary text that take a quiet fill on hover. No outlines, no icons; a prompt too long for its row shows in full in a tooltip. Leave them out once a prompt is sent.",
10180
10194
  "props": [
10181
10195
  {
10182
10196
  "name": "onSelect",
10183
10197
  "type": "(prompt: string) => void",
10184
10198
  "required": true,
10185
10199
  "default": null,
10186
- "description": "Puts the prompt in the composer (or sends it)."
10200
+ "description": "Puts the prompt in the composer (or sends it). The list usually goes away then, so move focus to the composer."
10187
10201
  },
10188
10202
  {
10189
10203
  "name": "suggestions",
@@ -10212,13 +10226,20 @@
10212
10226
  "required": false,
10213
10227
  "default": null,
10214
10228
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
10229
+ },
10230
+ {
10231
+ "name": "data-force",
10232
+ "type": "string",
10233
+ "required": false,
10234
+ "default": null,
10235
+ "description": "Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`."
10215
10236
  }
10216
10237
  ],
10217
10238
  "file": "src/components/playground/prompt-suggestions.tsx"
10218
10239
  },
10219
10240
  {
10220
10241
  "name": "Reasoning",
10221
- "description": "A model's reasoning behind a quiet disclosure, closed by default: “Thought for 4.2 s” when it is done, “Thinking” with the latest line beside it while it streams. Opened, the reasoning reads in small secondary text beside a line. The Playground and the request log show reasoning with it.",
10242
+ "description": "A model's reasoning behind a quiet disclosure, closed by default: a chevron, then “Thought for 4.2 s” when it is done, or “Thinking” with the latest line beside it while it streams. Opened, the reasoning reads in small secondary text under the title, beside a line under the chevron. The Playground and the request log (ConversationView) show reasoning with it.",
10222
10243
  "props": [
10223
10244
  {
10224
10245
  "name": "children",
@@ -10234,6 +10255,13 @@
10234
10255
  "default": null,
10235
10256
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
10236
10257
  },
10258
+ {
10259
+ "name": "data-force",
10260
+ "type": "string",
10261
+ "required": false,
10262
+ "default": null,
10263
+ "description": "Forces an interaction state for state matrices: `hover`, `pressed`, `focus`, `open`."
10264
+ },
10237
10265
  {
10238
10266
  "name": "defaultOpen",
10239
10267
  "type": "boolean",
@@ -10295,7 +10323,7 @@
10295
10323
  },
10296
10324
  {
10297
10325
  "name": "ResponseMetrics",
10298
- "description": "A response's numbers on one line: time to first token, total time, tokens (\"412 in · 168 out\", and reasoning), cost to the millionth of a dollar, as request logs show it. Tabular figures, labels in tertiary text. While `live`, values not known yet show \"—\" in the room they will take; before any response the line is empty, its height kept.",
10326
+ "description": "A response's numbers on one line: time to first token, total time, tokens (\"412 in · 168 out\", and reasoning), cost with the decimals it was given, as request logs show it. Tabular figures, labels in tertiary text. Every value keeps the room a typical value takes, so nothing moves when values arrive; while `live`, values not known yet show \"—\"; before any response the line is empty, its height kept.",
10299
10327
  "props": [
10300
10328
  {
10301
10329
  "name": "className",
@@ -10309,7 +10337,7 @@
10309
10337
  "type": "string | null",
10310
10338
  "required": false,
10311
10339
  "default": null,
10312
- "description": "USD as a decimal string: \"0.004213\" reads \"$0.004213\", and zero reads \"$0\"."
10340
+ "description": "USD as a decimal string, shown with its own decimals (two at least, six at most): \"0.004213\" reads \"$0.004213\", \"1.2311\" reads \"$1.2311\", zero reads \"$0\" and less than a millionth reads \"< $0.000001\"."
10313
10341
  },
10314
10342
  {
10315
10343
  "name": "duration",
@@ -10351,7 +10379,7 @@
10351
10379
  "type": "number | null",
10352
10380
  "required": false,
10353
10381
  "default": null,
10354
- "description": "Of the output tokens, those spent reasoning. Shown when given, or when `reasoning` is set."
10382
+ "description": "Of the output tokens, those spent reasoning. Shown when given, or when `reasoning` is set (\"—\" when the provider didn't report them)."
10355
10383
  },
10356
10384
  {
10357
10385
  "name": "size",
@@ -10365,7 +10393,7 @@
10365
10393
  "type": "number",
10366
10394
  "required": false,
10367
10395
  "default": null,
10368
- "description": "When the request was sent (Date.now()): while live, Total counts up quietly until `duration` arrives."
10396
+ "description": "When the request was sent (Date.now()): while live, Total counts up quietly, in tenths of a second and in whole seconds past ten, until `duration` arrives."
10369
10397
  },
10370
10398
  {
10371
10399
  "name": "timeToFirstToken",
@@ -10379,7 +10407,7 @@
10379
10407
  },
10380
10408
  {
10381
10409
  "name": "ResponseView",
10382
- "description": "A model's response as it arrives: Markdown text for reading (15/22), the reasoning summary in a \"Thinking\" disclosure (closed by default, live while it streams), and calm states for a stop, a cut-off reply or a failure, which shows its error in place.",
10410
+ "description": "A model's response as it arrives: a quiet caret where the text will start until the first token, then Markdown text for reading (15/22) with the caret at its end while it streams; the reasoning summary in a \"Thinking\" disclosure (closed by default, live while it streams); and calm states for a stop, a cut-off reply or a failure, which shows its error in place. Text sits 12px in, code and tables on the edge; screen readers hear when a response finishes or stops.",
10383
10411
  "props": [
10384
10412
  {
10385
10413
  "name": "aria-label",
@@ -10414,7 +10442,7 @@
10414
10442
  "type": "ReactNode",
10415
10443
  "required": false,
10416
10444
  "default": null,
10417
- "description": "Under the response: its metrics, actions."
10445
+ "description": "Under the response, on its text line: its metrics, actions."
10418
10446
  },
10419
10447
  {
10420
10448
  "name": "incompleteReason",
@@ -10435,7 +10463,7 @@
10435
10463
  "type": "(() => void)",
10436
10464
  "required": false,
10437
10465
  "default": null,
10438
- "description": "Sends the turn again; shown with an error, a stop or a cut-off reply."
10466
+ "description": "Sends the turn again: a Retry button after a stop, a cut-off reply or an error."
10439
10467
  },
10440
10468
  {
10441
10469
  "name": "reasoning",
@@ -10498,7 +10526,7 @@
10498
10526
  },
10499
10527
  {
10500
10528
  "name": "UserMessage",
10501
- "description": "A person's turn: their prompt as quiet text that opens the turn, no bubble. A long prompt shows its first lines until \"Show all\".",
10529
+ "description": "A person's turn: their prompt as quiet text that opens the turn, no bubble. A long prompt shows its first lines until \"Show all\", a disclosure button under them.",
10502
10530
  "props": [
10503
10531
  {
10504
10532
  "name": "children",
@@ -10669,7 +10697,7 @@
10669
10697
  },
10670
10698
  {
10671
10699
  "name": "Popover",
10672
- "description": "A floating panel next to its trigger: radius 16, raised; collision-aware.",
10700
+ "description": "A floating panel next to its trigger: radius 16, raised; collision-aware and never wider than the screen. Its content takes a title, or an aria-label, which names it.",
10673
10701
  "props": [
10674
10702
  {
10675
10703
  "name": "children",
@@ -11243,7 +11271,7 @@
11243
11271
  "components": [
11244
11272
  {
11245
11273
  "name": "ResourceList",
11246
- "description": "A console list of resources: search, group headers, row actions and a selection bar.",
11274
+ "description": "A console list of resources: search, group headers, row actions and a selection bar. A search announces how many rows it leaves, and its no-match state offers Clear search.",
11247
11275
  "props": [
11248
11276
  {
11249
11277
  "name": "aria-label",
@@ -11285,7 +11313,7 @@
11285
11313
  "type": "string",
11286
11314
  "required": false,
11287
11315
  "default": null,
11288
- "description": "Defaults to \"Nothing here yet\" in the provider's language."
11316
+ "description": "What will appear, such as \"No keys yet\". Pass it: the default names the collection by its `aria-label` (\"No keys yet\", in the provider's language), which only reads well for a plural noun."
11289
11317
  },
11290
11318
  {
11291
11319
  "name": "onOpen",
@@ -11326,7 +11354,7 @@
11326
11354
  "components": [
11327
11355
  {
11328
11356
  "name": "ScrollArea",
11329
- "description": "A scroll container with thin scrollbars in the strong line color that show on hover (5.1), its content fading at an edge with more to scroll to.",
11357
+ "description": "A scroll container with thin scrollbars that show on hover and darken while held, its content fading at every edge with more to scroll to; its focus ring sits above the fade.",
11330
11358
  "props": [
11331
11359
  {
11332
11360
  "name": "children",
@@ -11373,7 +11401,7 @@
11373
11401
  "orientation": {
11374
11402
  "vertical": "Scrolls up and down; the content fades at an edge with more to scroll to (default)",
11375
11403
  "horizontal": "Scrolls sideways",
11376
- "both": "Both directions"
11404
+ "both": "Both directions; the content fades at every edge with more to scroll to"
11377
11405
  }
11378
11406
  },
11379
11407
  "defaults": {
@@ -11779,7 +11807,7 @@
11779
11807
  "type": "ReactNode",
11780
11808
  "required": false,
11781
11809
  "default": null,
11782
- "description": "Defaults to \"Select\" in the provider's language."
11810
+ "description": "Defaults to \"Not set\" in the provider's language."
11783
11811
  },
11784
11812
  {
11785
11813
  "name": "required",
@@ -12080,7 +12108,7 @@
12080
12108
  "type": "ReactNode",
12081
12109
  "required": true,
12082
12110
  "default": null,
12083
- "description": "The sheet's heading, also its accessible name."
12111
+ "description": "The sheet's heading, also its accessible name; a long one wraps."
12084
12112
  },
12085
12113
  {
12086
12114
  "name": "actions",
@@ -12115,7 +12143,7 @@
12115
12143
  "type": "boolean",
12116
12144
  "required": false,
12117
12145
  "default": null,
12118
- "description": "Keep the page behind interactive (non-modal)."
12146
+ "description": "`false` keeps the page behind interactive, for an inspector: a press on the page leaves the sheet open, so the next row can fill it; Escape and the close circle close it."
12119
12147
  },
12120
12148
  {
12121
12149
  "name": "onOpenChange",
@@ -12143,14 +12171,14 @@
12143
12171
  "type": "\"md\" | \"sm\" | \"lg\"",
12144
12172
  "required": false,
12145
12173
  "default": null,
12146
- "description": "The sheet's width, or its height from the bottom."
12174
+ "description": "The sheet's width from the side; a sheet from the bottom takes its content's height and ignores it."
12147
12175
  },
12148
12176
  {
12149
12177
  "name": "subtitle",
12150
12178
  "type": "ReactNode",
12151
12179
  "required": false,
12152
12180
  "default": null,
12153
- "description": "A mono subtitle for ids: `req_01J…`."
12181
+ "description": "A mono subtitle for ids, shown whole: `req_01J…`."
12154
12182
  },
12155
12183
  {
12156
12184
  "name": "trigger",
@@ -12269,7 +12297,7 @@
12269
12297
  "components": [
12270
12298
  {
12271
12299
  "name": "Skeleton",
12272
- "description": "A placeholder in the shape of the content that is loading.",
12300
+ "description": "A placeholder in the shape of the content that is loading. It is hidden from screen readers, so the region it stands in for sets `aria-busy` while it loads (List, DataTable and StatTile do). In forced colours it keeps an outline.",
12273
12301
  "props": [
12274
12302
  {
12275
12303
  "name": "shape",
@@ -12434,7 +12462,7 @@
12434
12462
  "SLIDER": {
12435
12463
  "axes": {
12436
12464
  "size": {
12437
- "md": "A 4px track in a 20px hit area (default)"
12465
+ "md": "A 4px track in a 32px hit area (default)"
12438
12466
  }
12439
12467
  },
12440
12468
  "defaults": {
@@ -12513,7 +12541,7 @@
12513
12541
  },
12514
12542
  {
12515
12543
  "name": "StatGrid",
12516
- "description": "`StatTile`s in one raised group, divided by hairlines: two to a row, then as many as there are tiles (up to four) from 1024px. The last tile of a short row widens to fill it (the third of three spans both columns below 1024px), so the group never shows an empty cell. Where a number doesn't fit its tile (a phone, a long amount), every tile's number steps down a size, and the tiles take a row each when even the smallest doesn't fit: a value is never cut short.",
12544
+ "description": "`StatTile`s in one raised group, divided by hairlines: two to a row, then as many as there are tiles (up to four) from 1024px. The last tile of a short row widens to fill it (the third of three spans both columns below 1024px), so the group never shows an empty cell. Where a number doesn't fit its tile (a phone, a long amount), every tile's number steps down a size, and the tiles take a row each when even the smallest doesn't fit. At the same width, live numbers only step the size down, never back up, so a digit that comes and goes doesn't make the tiles jump; a value that still can't fit ends in an ellipsis and shows in full in a tooltip.",
12517
12545
  "props": [
12518
12546
  {
12519
12547
  "name": "children",
@@ -12562,7 +12590,7 @@
12562
12590
  "type": "{ value: number; better?: \"up\" | \"down\"; }",
12563
12591
  "required": false,
12564
12592
  "default": null,
12565
- "description": "The change against the previous period, as a fraction (0.12 is +12%). `better` says which direction is good: errors are better down."
12593
+ "description": "The change against the previous period, as a fraction (0.12 is +12%). `better` says which direction is good: errors are better down. The badge is green or red and says \"better\" or \"worse\" to screen readers."
12566
12594
  },
12567
12595
  {
12568
12596
  "name": "className",
@@ -12652,7 +12680,7 @@
12652
12680
  "type": "\"md\" | \"sm\"",
12653
12681
  "required": false,
12654
12682
  "default": "md",
12655
- "description": "The text size."
12683
+ "description": "The text size: 14px, or 13px (`sm`) with a 14px icon."
12656
12684
  },
12657
12685
  {
12658
12686
  "name": "tone",
@@ -12694,14 +12722,14 @@
12694
12722
  "type": "\"md\" | \"sm\"",
12695
12723
  "required": false,
12696
12724
  "default": "md",
12697
- "description": "The dot's size."
12725
+ "description": "The text size: 14px, or 13px (`sm`) with a 14px icon."
12698
12726
  },
12699
12727
  {
12700
12728
  "name": "tone",
12701
12729
  "type": "\"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\"",
12702
12730
  "required": false,
12703
12731
  "default": "neutral",
12704
- "description": "The status the dot marks; keep it next to words that say the same."
12732
+ "description": "The status the word marks; keep it next to words that say the same."
12705
12733
  }
12706
12734
  ],
12707
12735
  "file": "src/components/status-dot/status-dot.tsx"
@@ -12882,7 +12910,7 @@
12882
12910
  "type": "string",
12883
12911
  "required": false,
12884
12912
  "default": null,
12885
- "description": "Why it is disabled, shown as a tooltip; it stays focusable so people can read it."
12913
+ "description": "Why it is disabled: shown under the label when there is one, and as a tooltip; it stays focusable so people can read it."
12886
12914
  },
12887
12915
  {
12888
12916
  "name": "id",
@@ -12903,7 +12931,7 @@
12903
12931
  "type": "boolean",
12904
12932
  "required": false,
12905
12933
  "default": null,
12906
- "description": "Shows that the change is being saved and ignores clicks until it is."
12934
+ "description": "Shows that the change is being saved: it ignores clicks at once, and a spinner shows in the track once saving takes 300ms."
12907
12935
  },
12908
12936
  {
12909
12937
  "name": "name",
@@ -12959,7 +12987,7 @@
12959
12987
  "components": [
12960
12988
  {
12961
12989
  "name": "Table",
12962
- "description": "A plain table for small amounts of data; use `DataTable` for sorting, selection and many rows.",
12990
+ "description": "A plain table for small amounts of data; use `DataTable` for sorting, selection and many rows. It has no row boxes, so its text sits on the gutter, not 12px in; its rows are 40px like DataTable's and grow when a cell wraps. Wider than its room, it scrolls sideways inside its own box under an edge fade, and the box takes focus as a group named \"Table, scrolls sideways\". Keep ids and model names on one line with `className=\"whitespace-nowrap\"` on their cells.",
12963
12991
  "props": [
12964
12992
  {
12965
12993
  "name": "density",
@@ -13099,8 +13127,8 @@
13099
13127
  "PILL_TABS": {
13100
13128
  "axes": {
13101
13129
  "variant": {
13102
- "underline": "Underline tabs for detail pages: 40px, a 2px ink indicator that slides",
13103
- "pill": "Header tabs: separate 32px pills, the active one filled"
13130
+ "underline": "Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides",
13131
+ "pill": "Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter"
13104
13132
  }
13105
13133
  },
13106
13134
  "defaults": {
@@ -13110,8 +13138,8 @@
13110
13138
  "TABS": {
13111
13139
  "axes": {
13112
13140
  "variant": {
13113
- "underline": "Underline tabs for detail pages: 40px, a 2px ink indicator that slides",
13114
- "pill": "Header tabs: separate 32px pills, the active one filled"
13141
+ "underline": "Underline tabs for detail pages: 40px, labels 12px in like every box, a 2px ink indicator under the label that slides",
13142
+ "pill": "Header tabs: separate 32px pills, the active one filled; the first pill's edge on the gutter"
13115
13143
  }
13116
13144
  },
13117
13145
  "defaults": {
@@ -13155,14 +13183,14 @@
13155
13183
  "type": "boolean",
13156
13184
  "required": false,
13157
13185
  "default": null,
13158
- "description": "Marks a value that isn't accepted."
13186
+ "description": "Marks a value that isn't accepted: a red ring, red text and an error icon named \"Not accepted\", so it doesn't rest on color."
13159
13187
  },
13160
13188
  {
13161
13189
  "name": "onClick",
13162
13190
  "type": "((e: MouseEvent<HTMLElement, MouseEvent>) => void)",
13163
13191
  "required": false,
13164
13192
  "default": null,
13165
- "description": "Renders a button with a hover fill."
13193
+ "description": "Renders a button with the control's hover, press and focus: raised tags take the secondary button's material, outline tags the ghost's."
13166
13194
  },
13167
13195
  {
13168
13196
  "name": "onRemove",
@@ -13176,7 +13204,7 @@
13176
13204
  "type": "boolean",
13177
13205
  "required": false,
13178
13206
  "default": null,
13179
- "description": "For toggle pills (DisplayOptions)."
13207
+ "description": "For toggle pills (DisplayOptions): sets aria-pressed, and `true` draws the selected soft fill whatever the variant, so a toggle needs no variant swap."
13180
13208
  },
13181
13209
  {
13182
13210
  "name": "removeLabel",
@@ -13232,14 +13260,14 @@
13232
13260
  "type": "boolean",
13233
13261
  "required": false,
13234
13262
  "default": null,
13235
- "description": "Marks a value that isn't accepted."
13263
+ "description": "Marks a value that isn't accepted: a red ring, red text and an error icon named \"Not accepted\", so it doesn't rest on color."
13236
13264
  },
13237
13265
  {
13238
13266
  "name": "onClick",
13239
13267
  "type": "((e: MouseEvent<HTMLElement, MouseEvent>) => void)",
13240
13268
  "required": false,
13241
13269
  "default": null,
13242
- "description": "Renders a button with a hover fill."
13270
+ "description": "Renders a button with the control's hover, press and focus: raised tags take the secondary button's material, outline tags the ghost's."
13243
13271
  },
13244
13272
  {
13245
13273
  "name": "onRemove",
@@ -13253,7 +13281,7 @@
13253
13281
  "type": "boolean",
13254
13282
  "required": false,
13255
13283
  "default": null,
13256
- "description": "For toggle pills (DisplayOptions)."
13284
+ "description": "For toggle pills (DisplayOptions): sets aria-pressed, and `true` draws the selected soft fill whatever the variant, so a toggle needs no variant swap."
13257
13285
  },
13258
13286
  {
13259
13287
  "name": "removeLabel",
@@ -13349,7 +13377,7 @@
13349
13377
  "type": "boolean",
13350
13378
  "required": false,
13351
13379
  "default": null,
13352
- "description": "One line with an ellipsis; the full text appears in a tooltip when it is cut."
13380
+ "description": "One line with an ellipsis; when it is cut, plain text becomes a focus stop whose tooltip shows all of it."
13353
13381
  },
13354
13382
  {
13355
13383
  "name": "variant",
@@ -13456,7 +13484,7 @@
13456
13484
  "type": "number",
13457
13485
  "required": false,
13458
13486
  "default": null,
13459
- "description": "The image's own height in pixels, so the page keeps its place before it loads."
13487
+ "description": "The image's own height in pixels. Pass it with `width` so the page keeps the image's place before it loads; without both, the content below moves when it arrives."
13460
13488
  },
13461
13489
  {
13462
13490
  "name": "width",
@@ -13673,7 +13701,7 @@
13673
13701
  "components": [
13674
13702
  {
13675
13703
  "name": "Timeline",
13676
- "description": "Events down a 1px line (the audit log): each event marks the line with a short 3px bar in its tone, no dots; titles, and times on the right.",
13704
+ "description": "Events down a 1px line (the audit log): each event marks the line with a short 3px bar in its tone, no dots; titles, and times on the right. A toned event's title starts with its tone in words for screen readers (\"Critical: Key revoked\"), and a time with `datetime` shows the exact date and time in a tooltip.",
13677
13705
  "props": [
13678
13706
  {
13679
13707
  "name": "events",
@@ -13731,7 +13759,7 @@
13731
13759
  "type": "number",
13732
13760
  "required": false,
13733
13761
  "default": "5000",
13734
- "description": "How long a toast stays, in milliseconds."
13762
+ "description": "How long a toast stays, in milliseconds; errors and toasts with an action stay until dismissed, unless `toast()` gets a timeout of its own."
13735
13763
  }
13736
13764
  ],
13737
13765
  "file": "src/components/toast/toast.tsx"
@@ -13759,7 +13787,7 @@
13759
13787
  "type": "boolean",
13760
13788
  "required": false,
13761
13789
  "default": null,
13762
- "description": "Shows a close button."
13790
+ "description": "Shows the close button at its end, as a toast that stays until dismissed has."
13763
13791
  },
13764
13792
  {
13765
13793
  "name": "data-force",
@@ -13787,7 +13815,7 @@
13787
13815
  },
13788
13816
  {
13789
13817
  "name": "Toaster",
13790
- "description": "Mount once near the root. Three visible at most; 5s, paused on hover and focus; swipe or Escape to dismiss. With a client router that replaces <body> on navigation (Astro's ClientRouter), mount it in a persisted element inside a `PortalContainer`, so the toasts are not swapped away with the page.",
13818
+ "description": "Mount once near the root. Three visible at most; 5s, paused on hover and focus; an error, or a toast with an action such as Undo, stays until it is dismissed; the close button, a swipe or Escape dismisses, and F6 moves the focus to the toasts. With a client router that replaces <body> on navigation (Astro's ClientRouter), mount it in a persisted element inside a `PortalContainer`, so the toasts are not swapped away with the page.",
13791
13819
  "props": [
13792
13820
  {
13793
13821
  "name": "limit",
@@ -13801,7 +13829,7 @@
13801
13829
  "type": "number",
13802
13830
  "required": false,
13803
13831
  "default": "5000",
13804
- "description": "How long a toast stays, in milliseconds."
13832
+ "description": "How long a toast stays, in milliseconds; errors and toasts with an action stay until dismissed, unless `toast()` gets a timeout of its own."
13805
13833
  }
13806
13834
  ],
13807
13835
  "file": "src/components/toast/toast.tsx"
@@ -13832,7 +13860,7 @@
13832
13860
  "components": [
13833
13861
  {
13834
13862
  "name": "TableOfContents",
13835
- "description": "\"On this page\": the heading in view in text color with a 2px ink bar.",
13863
+ "description": "\"On this page\": the heading in view in text color with a 2px ink bar on the rail.",
13836
13864
  "props": [
13837
13865
  {
13838
13866
  "name": "items",
@@ -13871,7 +13899,7 @@
13871
13899
  "axes": {
13872
13900
  "state": {
13873
13901
  "default": "A heading",
13874
- "active": "The heading in view, with a 2px ink bar"
13902
+ "active": "The heading in view, with a 2px ink bar on the rail (a solid line in forced colours)"
13875
13903
  }
13876
13904
  },
13877
13905
  "defaults": {
@@ -13887,7 +13915,7 @@
13887
13915
  "components": [
13888
13916
  {
13889
13917
  "name": "Toolbar",
13890
- "description": "A row of controls above a list or a chart.",
13918
+ "description": "A row of controls above a list or a chart: one tab stop, with the arrow keys moving between its controls.",
13891
13919
  "props": [
13892
13920
  {
13893
13921
  "name": "aria-label",
@@ -13911,7 +13939,7 @@
13911
13939
  "TOOLBAR": {
13912
13940
  "axes": {
13913
13941
  "size": {
13914
- "md": "48px, 24px side padding, under the page header (default)",
13942
+ "md": "48px, 24px side padding, under the page header (default); one tab stop, arrows move between controls",
13915
13943
  "inset": "48px without side padding, inside padded content"
13916
13944
  }
13917
13945
  },
@@ -13928,7 +13956,7 @@
13928
13956
  "components": [
13929
13957
  {
13930
13958
  "name": "Tooltip",
13931
- "description": "A short label for a control, shown on hover and focus. Never on disabled elements without a reason.",
13959
+ "description": "A short label for a control, shown on hover and focus. When it says more than the control's name, it is also the control's accessible description. Never on disabled elements without a reason.",
13932
13960
  "props": [
13933
13961
  {
13934
13962
  "name": "children",
@@ -13984,7 +14012,7 @@
13984
14012
  "type": "\"pill\" | \"multiline\"",
13985
14013
  "required": false,
13986
14014
  "default": "pill",
13987
- "description": "A pill for a short label, or a box for several lines."
14015
+ "description": "A pill for a short label, or a box for several lines; a pill too long for the screen wraps into the box."
13988
14016
  },
13989
14017
  {
13990
14018
  "name": "shortcut",
@@ -14012,7 +14040,7 @@
14012
14040
  },
14013
14041
  {
14014
14042
  "name": "TooltipProvider",
14015
- "description": "Tooltips open after 500ms, and instantly when moving between tooltipped siblings.",
14043
+ "description": "Tooltips open once the pointer has rested on a control for 500ms, and instantly when moving between tooltipped siblings.",
14016
14044
  "props": [
14017
14045
  {
14018
14046
  "name": "children",