@logicplanes/kaeso-ui 0.4.3 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. package/ai/component-guides.md +279 -98
  2. package/ai/component-registry.json +352 -236
  3. package/ai/component-registry.md +241 -219
  4. package/ai/icons.md +2 -2
  5. package/ai/tokens.md +18 -14
  6. package/dist/blocks/delete-resource.js +3 -3
  7. package/dist/blocks/delete-resource.js.map +1 -1
  8. package/dist/blocks/pages.js +47 -42
  9. package/dist/blocks/pages.js.map +1 -1
  10. package/dist/blocks/resource-list.js +68 -55
  11. package/dist/blocks/resource-list.js.map +1 -1
  12. package/dist/chunks/agent-avatar-DHieggHK.js +188 -0
  13. package/dist/chunks/agent-avatar-DHieggHK.js.map +1 -0
  14. package/dist/chunks/app-frame-DysOel2X.js +232 -0
  15. package/dist/chunks/app-frame-DysOel2X.js.map +1 -0
  16. package/dist/chunks/arrow-focus-B0KdRFX8.js +20 -0
  17. package/dist/chunks/arrow-focus-B0KdRFX8.js.map +1 -0
  18. package/dist/chunks/avatar-CYNMK7uY.js +110 -0
  19. package/dist/chunks/avatar-CYNMK7uY.js.map +1 -0
  20. package/dist/chunks/badge-C0GC3B9X.js +27 -0
  21. package/dist/chunks/badge-C0GC3B9X.js.map +1 -0
  22. package/dist/chunks/banner-B3DGLTBu.js +88 -0
  23. package/dist/chunks/banner-B3DGLTBu.js.map +1 -0
  24. package/dist/chunks/button-IblhXUyZ.js +202 -0
  25. package/dist/chunks/button-IblhXUyZ.js.map +1 -0
  26. package/dist/chunks/{calendar-BWaf2MXc.js → calendar-Dc6_dl0f.js} +4 -4
  27. package/dist/chunks/calendar-Dc6_dl0f.js.map +1 -0
  28. package/dist/chunks/checkbox-9tbimmF3.js +141 -0
  29. package/dist/chunks/checkbox-9tbimmF3.js.map +1 -0
  30. package/dist/chunks/{cn-Dj6sRgkF.js → cn-BjnOAUrA.js} +45 -4
  31. package/dist/chunks/cn-BjnOAUrA.js.map +1 -0
  32. package/dist/chunks/code-block-64e-Cy1S.js +346 -0
  33. package/dist/chunks/code-block-64e-Cy1S.js.map +1 -0
  34. package/dist/chunks/code-block-KIvuE8jg.js +352 -0
  35. package/dist/chunks/code-block-KIvuE8jg.js.map +1 -0
  36. package/dist/chunks/{code-tqj0uhBL.js → code-xqjww4Pv.js} +5 -6
  37. package/dist/chunks/code-xqjww4Pv.js.map +1 -0
  38. package/dist/chunks/combobox-DkcjkWc6.js +352 -0
  39. package/dist/chunks/combobox-DkcjkWc6.js.map +1 -0
  40. package/dist/chunks/command-list-CypqsC4T.js +456 -0
  41. package/dist/chunks/command-list-CypqsC4T.js.map +1 -0
  42. package/dist/chunks/{copy-button-FJvPJn72.js → copy-button-CwU8t_9_.js} +22 -15
  43. package/dist/chunks/copy-button-CwU8t_9_.js.map +1 -0
  44. package/dist/chunks/core-CmK-8ObW.js +505 -0
  45. package/dist/chunks/core-CmK-8ObW.js.map +1 -0
  46. package/dist/chunks/data-table-CqY8_6IS.js +581 -0
  47. package/dist/chunks/data-table-CqY8_6IS.js.map +1 -0
  48. package/dist/chunks/date-popup-DAnjptFt.js +58 -0
  49. package/dist/chunks/date-popup-DAnjptFt.js.map +1 -0
  50. package/dist/chunks/{de-CPXJh9cq.js → de-CqC4aSIV.js} +81 -40
  51. package/dist/chunks/de-CqC4aSIV.js.map +1 -0
  52. package/dist/chunks/{dialog-Cg9A_6SF.js → dialog-2zb6ClNR.js} +156 -134
  53. package/dist/chunks/dialog-2zb6ClNR.js.map +1 -0
  54. package/dist/chunks/disclosure-BtYRTDO3.js +22 -0
  55. package/dist/chunks/disclosure-BtYRTDO3.js.map +1 -0
  56. package/dist/chunks/domain-obd_w9xk.js +28 -0
  57. package/dist/chunks/domain-obd_w9xk.js.map +1 -0
  58. package/dist/chunks/{empty-DvhyMXQq.js → empty-BpiUgGzm.js} +2 -2
  59. package/dist/chunks/{empty-DvhyMXQq.js.map → empty-BpiUgGzm.js.map} +1 -1
  60. package/dist/chunks/{field-TviMvYa2.js → field-D7m-yl-D.js} +37 -34
  61. package/dist/chunks/field-D7m-yl-D.js.map +1 -0
  62. package/dist/chunks/{icon-D7ja-_Yk.js → icon-CBzOwqrX.js} +7 -6
  63. package/dist/chunks/{icon-D7ja-_Yk.js.map → icon-CBzOwqrX.js.map} +1 -1
  64. package/dist/chunks/icon-CPJWE2N-.js +95 -0
  65. package/dist/chunks/{icon-DVooQfk4.js.map → icon-CPJWE2N-.js.map} +1 -1
  66. package/dist/chunks/{icon-button-CrdF_eMG.js → icon-button-Dfwpvmav.js} +7 -6
  67. package/dist/chunks/icon-button-Dfwpvmav.js.map +1 -0
  68. package/dist/chunks/{identity-BmhQ6BQ-.js → identity-3Foi5F8w.js} +7 -7
  69. package/dist/chunks/{identity-BmhQ6BQ-.js.map → identity-3Foi5F8w.js.map} +1 -1
  70. package/dist/chunks/{input-2VJuj_M4.js → input-Bo5-UZg2.js} +15 -9
  71. package/dist/chunks/input-Bo5-UZg2.js.map +1 -0
  72. package/dist/chunks/{input-group-DQ_4DoXg.js → input-group-jPcK9T_a.js} +42 -29
  73. package/dist/chunks/input-group-jPcK9T_a.js.map +1 -0
  74. package/dist/chunks/iso-field-DoqHBg8n.js +52 -0
  75. package/dist/chunks/iso-field-DoqHBg8n.js.map +1 -0
  76. package/dist/chunks/json-view-DZ2nL2Ir.js +253 -0
  77. package/dist/chunks/json-view-DZ2nL2Ir.js.map +1 -0
  78. package/dist/chunks/{kbd-BF1vKXJf.js → kbd-8A0ML_up.js} +30 -28
  79. package/dist/chunks/kbd-8A0ML_up.js.map +1 -0
  80. package/dist/chunks/label-DW24Aj0Z.js +26 -0
  81. package/dist/chunks/label-DW24Aj0Z.js.map +1 -0
  82. package/dist/chunks/{link-KWI7PevW.js → link-CMjkcLQK.js} +14 -14
  83. package/dist/chunks/link-CMjkcLQK.js.map +1 -0
  84. package/dist/chunks/list-B4G-sWwV.js +540 -0
  85. package/dist/chunks/list-B4G-sWwV.js.map +1 -0
  86. package/dist/chunks/{loader-DCfPndXa.js → loader-zo8CCIGJ.js} +2 -2
  87. package/dist/chunks/{loader-DCfPndXa.js.map → loader-zo8CCIGJ.js.map} +1 -1
  88. package/dist/chunks/markdown-C565aBR7.js +338 -0
  89. package/dist/chunks/markdown-C565aBR7.js.map +1 -0
  90. package/dist/chunks/menu-Clvv6ftq.js +485 -0
  91. package/dist/chunks/menu-Clvv6ftq.js.map +1 -0
  92. package/dist/chunks/merge-refs-BN1FyQt9.js +20 -0
  93. package/dist/chunks/merge-refs-BN1FyQt9.js.map +1 -0
  94. package/dist/chunks/meter-CASMHlxl.js +100 -0
  95. package/dist/chunks/meter-CASMHlxl.js.map +1 -0
  96. package/dist/chunks/nav-sheet-Dt6JSvzX.js +67 -0
  97. package/dist/chunks/nav-sheet-Dt6JSvzX.js.map +1 -0
  98. package/dist/chunks/{nav-wordmark-_pjheAsZ.js → nav-wordmark-J4pB_vjr.js} +4 -8
  99. package/dist/chunks/nav-wordmark-J4pB_vjr.js.map +1 -0
  100. package/dist/chunks/page-header-kS5tdmvb.js +45 -0
  101. package/dist/chunks/page-header-kS5tdmvb.js.map +1 -0
  102. package/dist/chunks/pagination-D7fAm8qg.js +147 -0
  103. package/dist/chunks/pagination-D7fAm8qg.js.map +1 -0
  104. package/dist/chunks/picker-popover-1FHb1LQG.js +119 -0
  105. package/dist/chunks/picker-popover-1FHb1LQG.js.map +1 -0
  106. package/dist/chunks/popover-Bl5QYqnh.js +51 -0
  107. package/dist/chunks/popover-Bl5QYqnh.js.map +1 -0
  108. package/dist/chunks/{portal-context-BBbzDKmY.js → portal-context-CTatR2Z8.js} +14 -4
  109. package/dist/chunks/portal-context-CTatR2Z8.js.map +1 -0
  110. package/dist/chunks/{radio-CDDFpdtL.js → radio-C6GtzF_t.js} +38 -23
  111. package/dist/chunks/radio-C6GtzF_t.js.map +1 -0
  112. package/dist/chunks/range-popup-lGiZsG3s.js +160 -0
  113. package/dist/chunks/range-popup-lGiZsG3s.js.map +1 -0
  114. package/dist/chunks/reasoning-frame-C3HdQRRS.js +51 -0
  115. package/dist/chunks/reasoning-frame-C3HdQRRS.js.map +1 -0
  116. package/dist/chunks/release-art-ChiT4T2S.js +582 -0
  117. package/dist/chunks/release-art-ChiT4T2S.js.map +1 -0
  118. package/dist/chunks/rights-B68ocZuq.js +312 -0
  119. package/dist/chunks/rights-B68ocZuq.js.map +1 -0
  120. package/dist/chunks/{scroll-area-D8MD7Vpo.js → scroll-area-_Ljh4-bG.js} +11 -6
  121. package/dist/chunks/scroll-area-_Ljh4-bG.js.map +1 -0
  122. package/dist/chunks/section-CFBYhsUi.js +77 -0
  123. package/dist/chunks/section-CFBYhsUi.js.map +1 -0
  124. package/dist/chunks/section-header-DU1Q4Tdf.js +28 -0
  125. package/dist/chunks/section-header-DU1Q4Tdf.js.map +1 -0
  126. package/dist/chunks/segmented-D9i1avik.js +119 -0
  127. package/dist/chunks/segmented-D9i1avik.js.map +1 -0
  128. package/dist/chunks/select-BqjmQOqx.js +222 -0
  129. package/dist/chunks/select-BqjmQOqx.js.map +1 -0
  130. package/dist/chunks/{separator-D7TzNHmX.js → separator-BNWf6BBj.js} +13 -8
  131. package/dist/chunks/separator-BNWf6BBj.js.map +1 -0
  132. package/dist/chunks/sidebar-Dq7oGOje.js +664 -0
  133. package/dist/chunks/sidebar-Dq7oGOje.js.map +1 -0
  134. package/dist/chunks/{sidebar-menu-BN3jkTlK.js → sidebar-menu-QSSNu1jJ.js} +2 -2
  135. package/dist/chunks/{sidebar-menu-BN3jkTlK.js.map → sidebar-menu-QSSNu1jJ.js.map} +1 -1
  136. package/dist/chunks/{skeleton-Dcz57Zyp.js → skeleton-D-qk3mes.js} +3 -3
  137. package/dist/chunks/skeleton-D-qk3mes.js.map +1 -0
  138. package/dist/chunks/slider-CcE8GtuV.js +58 -0
  139. package/dist/chunks/slider-CcE8GtuV.js.map +1 -0
  140. package/dist/chunks/{status-dot-QJTF0Yv4.js → status-dot-CP6runiC.js} +4 -4
  141. package/dist/chunks/{status-dot-QJTF0Yv4.js.map → status-dot-CP6runiC.js.map} +1 -1
  142. package/dist/chunks/{styles-CVJU9t9v.js → styles-hkFkoBbi.js} +2 -2
  143. package/dist/chunks/{styles-CVJU9t9v.js.map → styles-hkFkoBbi.js.map} +1 -1
  144. package/dist/chunks/{swap-text-Dr0Irxz6.js → swap-text-SlUjrTlG.js} +3 -3
  145. package/dist/chunks/swap-text-SlUjrTlG.js.map +1 -0
  146. package/dist/chunks/switch-ngywMQdl.js +76 -0
  147. package/dist/chunks/switch-ngywMQdl.js.map +1 -0
  148. package/dist/chunks/table-CTK5E0J7.js +102 -0
  149. package/dist/chunks/table-CTK5E0J7.js.map +1 -0
  150. package/dist/chunks/tag-BGr6lTSV.js +100 -0
  151. package/dist/chunks/tag-BGr6lTSV.js.map +1 -0
  152. package/dist/chunks/{text-CIXH8rmT.js → text-DkKdTVUf.js} +9 -9
  153. package/dist/chunks/text-DkKdTVUf.js.map +1 -0
  154. package/dist/chunks/{textarea--4FRL3Pb.js → textarea-CO0HP6fK.js} +47 -36
  155. package/dist/chunks/textarea-CO0HP6fK.js.map +1 -0
  156. package/dist/chunks/timeseries-Ck-q0wWn.js +381 -0
  157. package/dist/chunks/timeseries-Ck-q0wWn.js.map +1 -0
  158. package/dist/chunks/toolbar-u0Gm7Q7-.js +61 -0
  159. package/dist/chunks/toolbar-u0Gm7Q7-.js.map +1 -0
  160. package/dist/chunks/tooltip-Tkm-urbi.js +202 -0
  161. package/dist/chunks/tooltip-Tkm-urbi.js.map +1 -0
  162. package/dist/chunks/tooltip-root-BC_RNNiP.js +70 -0
  163. package/dist/chunks/tooltip-root-BC_RNNiP.js.map +1 -0
  164. package/dist/chunks/truncated-d1afmUJT.js +33 -0
  165. package/dist/chunks/truncated-d1afmUJT.js.map +1 -0
  166. package/dist/chunks/use-coarse-pointer-Ml5oE6oX.js +28 -0
  167. package/dist/chunks/use-coarse-pointer-Ml5oE6oX.js.map +1 -0
  168. package/dist/chunks/use-hydrating-COtYVRo4.js +8 -0
  169. package/dist/chunks/use-hydrating-COtYVRo4.js.map +1 -0
  170. package/dist/chunks/use-scroll-fade-uc8mWSDX.js +30 -0
  171. package/dist/chunks/use-scroll-fade-uc8mWSDX.js.map +1 -0
  172. package/dist/chunks/{zh-CN-29X4CDLE.js → zh-CN-BlpsT6d_.js} +80 -39
  173. package/dist/chunks/zh-CN-BlpsT6d_.js.map +1 -0
  174. package/dist/components/agent-avatar.js +1 -1
  175. package/dist/components/app-frame.js +2 -2
  176. package/dist/components/avatar.js +1 -1
  177. package/dist/components/badge.js +1 -1
  178. package/dist/components/banner.js +1 -1
  179. package/dist/components/button-group.js +22 -22
  180. package/dist/components/button-group.js.map +1 -1
  181. package/dist/components/button.js +1 -1
  182. package/dist/components/calendar.js +1 -1
  183. package/dist/components/charts/bar.js +235 -160
  184. package/dist/components/charts/bar.js.map +1 -1
  185. package/dist/components/charts/donut.js +144 -99
  186. package/dist/components/charts/donut.js.map +1 -1
  187. package/dist/components/charts/gauge.js +61 -49
  188. package/dist/components/charts/gauge.js.map +1 -1
  189. package/dist/components/charts/heatmap.js +179 -70
  190. package/dist/components/charts/heatmap.js.map +1 -1
  191. package/dist/components/charts/sankey.js +144 -77
  192. package/dist/components/charts/sankey.js.map +1 -1
  193. package/dist/components/charts/sparkline.js +54 -38
  194. package/dist/components/charts/sparkline.js.map +1 -1
  195. package/dist/components/charts/timeseries.js +1 -1
  196. package/dist/components/charts.js +2 -2
  197. package/dist/components/checkbox.js +1 -1
  198. package/dist/components/code-block.js +4 -3
  199. package/dist/components/code.js +1 -1
  200. package/dist/components/collapsible.js +77 -1
  201. package/dist/components/collapsible.js.map +1 -0
  202. package/dist/components/combobox.js +1 -1
  203. package/dist/components/command-list.js +2 -2
  204. package/dist/components/command-palette.js +89 -66
  205. package/dist/components/command-palette.js.map +1 -1
  206. package/dist/components/copy-button.js +1 -1
  207. package/dist/components/data-table.js +1 -459
  208. package/dist/components/date-picker.js +162 -151
  209. package/dist/components/date-picker.js.map +1 -1
  210. package/dist/components/dialog.js +74 -63
  211. package/dist/components/dialog.js.map +1 -1
  212. package/dist/components/display-options.js +76 -64
  213. package/dist/components/display-options.js.map +1 -1
  214. package/dist/components/empty.js +1 -1
  215. package/dist/components/field.js +1 -1
  216. package/dist/components/figure.js +2 -2
  217. package/dist/components/filter-chip.js +36 -27
  218. package/dist/components/filter-chip.js.map +1 -1
  219. package/dist/components/filter-row.js +4 -4
  220. package/dist/components/filter-row.js.map +1 -1
  221. package/dist/components/flow.js +94 -63
  222. package/dist/components/flow.js.map +1 -1
  223. package/dist/components/heading.js +1 -1
  224. package/dist/components/icon-button.js +1 -1
  225. package/dist/components/icon.js +2 -2
  226. package/dist/components/input.js +176 -98
  227. package/dist/components/input.js.map +1 -1
  228. package/dist/components/kaeso/conversation.js +51 -46
  229. package/dist/components/kaeso/conversation.js.map +1 -1
  230. package/dist/components/kaeso/identity.js +1 -1
  231. package/dist/components/kaeso/moments.js +23 -20
  232. package/dist/components/kaeso/moments.js.map +1 -1
  233. package/dist/components/kaeso/rights.js +1 -1
  234. package/dist/components/kaeso/usage.js +90 -74
  235. package/dist/components/kaeso/usage.js.map +1 -1
  236. package/dist/components/kaeso.js +200 -187
  237. package/dist/components/kaeso.js.map +1 -1
  238. package/dist/components/kbd.js +1 -1
  239. package/dist/components/key-value.js +32 -47
  240. package/dist/components/key-value.js.map +1 -1
  241. package/dist/components/label.js +1 -25
  242. package/dist/components/layout.js +2 -2
  243. package/dist/components/layout.js.map +1 -1
  244. package/dist/components/link.js +1 -1
  245. package/dist/components/list.js +1 -1
  246. package/dist/components/loader.js +11 -10
  247. package/dist/components/loader.js.map +1 -1
  248. package/dist/components/logo.js +2 -2
  249. package/dist/components/markdown.js +1 -1
  250. package/dist/components/menu.js +2 -2
  251. package/dist/components/meter.js +1 -1
  252. package/dist/components/page-header.js +1 -1
  253. package/dist/components/pagination.js +1 -1
  254. package/dist/components/playground.js +644 -529
  255. package/dist/components/playground.js.map +1 -1
  256. package/dist/components/popover.js +4 -4
  257. package/dist/components/popover.js.map +1 -1
  258. package/dist/components/portal.js +1 -1
  259. package/dist/components/qr-code.js +2 -2
  260. package/dist/components/qr-code.js.map +1 -1
  261. package/dist/components/radio.js +1 -1
  262. package/dist/components/release-art.js +1 -1
  263. package/dist/components/scroll-area.js +1 -1
  264. package/dist/components/section.js +1 -1
  265. package/dist/components/segmented.js +1 -1
  266. package/dist/components/select.js +1 -1
  267. package/dist/components/separator.js +1 -1
  268. package/dist/components/settings.js +39 -46
  269. package/dist/components/settings.js.map +1 -1
  270. package/dist/components/sheet.js +10 -9
  271. package/dist/components/sheet.js.map +1 -1
  272. package/dist/components/sidebar.js +1 -1
  273. package/dist/components/skeleton.js +1 -1
  274. package/dist/components/slider.js +1 -1
  275. package/dist/components/stat.js +98 -84
  276. package/dist/components/stat.js.map +1 -1
  277. package/dist/components/status-dot.js +1 -1
  278. package/dist/components/surface.js +1 -1
  279. package/dist/components/swap-text.js +1 -1
  280. package/dist/components/switch.js +1 -1
  281. package/dist/components/table.js +1 -1
  282. package/dist/components/tabs.js +73 -55
  283. package/dist/components/tabs.js.map +1 -1
  284. package/dist/components/tag.js +1 -1
  285. package/dist/components/text.js +1 -1
  286. package/dist/components/theme-image.js +1 -1
  287. package/dist/components/theme-menu.js +5 -2
  288. package/dist/components/theme-menu.js.map +1 -1
  289. package/dist/components/theme-select.js +1 -1
  290. package/dist/components/thumbnail.js +35 -24
  291. package/dist/components/thumbnail.js.map +1 -1
  292. package/dist/components/timeline.js +51 -35
  293. package/dist/components/timeline.js.map +1 -1
  294. package/dist/components/toast.js +76 -66
  295. package/dist/components/toast.js.map +1 -1
  296. package/dist/components/toc.js +14 -8
  297. package/dist/components/toc.js.map +1 -1
  298. package/dist/components/toolbar.js +1 -1
  299. package/dist/components/tooltip.js +1 -1
  300. package/dist/components/visually-hidden.js +1 -1
  301. package/dist/i18n-provider.js +1 -1
  302. package/dist/index.js +101 -101
  303. package/dist/kaeso.css +605 -67
  304. package/dist/styles.css +1 -1
  305. package/dist/tailwind.css +1 -1
  306. package/dist/types/blocks/delete-resource/delete-resource.d.ts +2 -2
  307. package/dist/types/components/agent-avatar/agent-avatar.d.ts +24 -19
  308. package/dist/types/components/badge/badge.d.ts +3 -3
  309. package/dist/types/components/banner/banner.d.ts +3 -3
  310. package/dist/types/components/button/button.d.ts +2 -2
  311. package/dist/types/components/button-group/button-group.d.ts +1 -1
  312. package/dist/types/components/charts/domain.d.ts +11 -0
  313. package/dist/types/components/charts/marks.d.ts +1 -0
  314. package/dist/types/components/code/code.d.ts +3 -3
  315. package/dist/types/components/code-block/diff-view.d.ts +30 -0
  316. package/dist/types/components/code-block/diff.d.ts +26 -0
  317. package/dist/types/components/code-block/docs.d.ts +14 -0
  318. package/dist/types/components/code-block/index.d.ts +1 -0
  319. package/dist/types/components/code-block/json-view.d.ts +2 -1
  320. package/dist/types/components/code-block/numbers.d.ts +1 -0
  321. package/dist/types/components/collapsible/collapsible.d.ts +2 -2
  322. package/dist/types/components/collapsible/disclosure.d.ts +2 -0
  323. package/dist/types/components/data-table/data-table.d.ts +6 -5
  324. package/dist/types/components/data-table/docs.d.ts +1 -0
  325. package/dist/types/components/data-table/time-columns.d.ts +1 -0
  326. package/dist/types/components/date-picker/focus-day.d.ts +1 -0
  327. package/dist/types/components/date-picker/iso-field.d.ts +8 -1
  328. package/dist/types/components/dialog/dialog.d.ts +7 -7
  329. package/dist/types/components/field/field.d.ts +1 -1
  330. package/dist/types/components/flow/flow.d.ts +1 -1
  331. package/dist/types/components/icon-button/icon-button.d.ts +1 -1
  332. package/dist/types/components/input/input-group.d.ts +2 -0
  333. package/dist/types/components/input/number-input.d.ts +4 -4
  334. package/dist/types/components/input/otp-input.d.ts +3 -3
  335. package/dist/types/components/kaeso/client-button.d.ts +2 -1
  336. package/dist/types/components/kaeso/provider-picker.d.ts +1 -0
  337. package/dist/types/components/kaeso/rights.d.ts +1 -1
  338. package/dist/types/components/kaeso/role-picker.d.ts +1 -0
  339. package/dist/types/components/key-value/key-value.d.ts +2 -2
  340. package/dist/types/components/layout/layout.d.ts +2 -2
  341. package/dist/types/components/link/link.d.ts +4 -4
  342. package/dist/types/components/list/list.d.ts +2 -2
  343. package/dist/types/components/menu/menu.d.ts +2 -1
  344. package/dist/types/components/menu/styles.d.ts +3 -3
  345. package/dist/types/components/meter/meter.d.ts +3 -3
  346. package/dist/types/components/page-header/page-header.d.ts +1 -1
  347. package/dist/types/components/pagination/pagination.d.ts +2 -2
  348. package/dist/types/components/playground/prompt-suggestions.d.ts +1 -0
  349. package/dist/types/components/playground/reasoning-frame.d.ts +14 -0
  350. package/dist/types/components/playground/reasoning.d.ts +1 -0
  351. package/dist/types/components/popover/popover.d.ts +1 -1
  352. package/dist/types/components/scroll-area/scroll-area.d.ts +2 -2
  353. package/dist/types/components/section/section-header.d.ts +6 -0
  354. package/dist/types/components/segmented/segmented.d.ts +1 -0
  355. package/dist/types/components/select/select.d.ts +1 -1
  356. package/dist/types/components/sheet/sheet.d.ts +3 -3
  357. package/dist/types/components/sidebar/sidebar.d.ts +1 -0
  358. package/dist/types/components/slider/slider.d.ts +2 -2
  359. package/dist/types/components/stat/stat.d.ts +1 -1
  360. package/dist/types/components/tabs/tabs.d.ts +6 -4
  361. package/dist/types/components/text/truncated.d.ts +7 -0
  362. package/dist/types/components/timeline/timeline.d.ts +5 -5
  363. package/dist/types/components/toc/toc.d.ts +1 -1
  364. package/dist/types/components/toolbar/toolbar.d.ts +1 -1
  365. package/dist/types/components/tooltip/tooltip.d.ts +2 -2
  366. package/dist/types/components/tooltip/trigger-props.d.ts +1 -0
  367. package/dist/types/hooks/use-coarse-pointer.d.ts +1 -0
  368. package/dist/types/hooks/use-hydrating.d.ts +1 -0
  369. package/dist/types/icons/groups.d.ts +1 -1
  370. package/dist/types/icons/vocabulary.d.ts +5 -0
  371. package/dist/types/utils/arrow-focus.d.ts +4 -1
  372. package/dist/types/utils/cn.d.ts +33 -0
  373. package/dist/types/utils/portal-context.d.ts +7 -1
  374. package/dist/utils.js +2 -2
  375. package/foundations/accessibility.md +3 -2
  376. package/foundations/color.md +5 -1
  377. package/foundations/elevation.md +1 -0
  378. package/foundations/motion.md +1 -1
  379. package/foundations/shape.md +2 -2
  380. package/foundations/typography.md +12 -12
  381. package/package.json +2 -2
  382. package/dist/chunks/agent-avatar-0pdBTWkR.js +0 -171
  383. package/dist/chunks/agent-avatar-0pdBTWkR.js.map +0 -1
  384. package/dist/chunks/app-frame-DogGRmsu.js +0 -221
  385. package/dist/chunks/app-frame-DogGRmsu.js.map +0 -1
  386. package/dist/chunks/arrow-focus-BcySmwwU.js +0 -11
  387. package/dist/chunks/arrow-focus-BcySmwwU.js.map +0 -1
  388. package/dist/chunks/avatar-CWbdwbJv.js +0 -83
  389. package/dist/chunks/avatar-CWbdwbJv.js.map +0 -1
  390. package/dist/chunks/badge-C2KtxCLB.js +0 -26
  391. package/dist/chunks/badge-C2KtxCLB.js.map +0 -1
  392. package/dist/chunks/banner-BA2ALw9M.js +0 -85
  393. package/dist/chunks/banner-BA2ALw9M.js.map +0 -1
  394. package/dist/chunks/button-CzuxqawA.js +0 -164
  395. package/dist/chunks/button-CzuxqawA.js.map +0 -1
  396. package/dist/chunks/calendar-BWaf2MXc.js.map +0 -1
  397. package/dist/chunks/checkbox-CQjwCPkc.js +0 -126
  398. package/dist/chunks/checkbox-CQjwCPkc.js.map +0 -1
  399. package/dist/chunks/cn-Dj6sRgkF.js.map +0 -1
  400. package/dist/chunks/code-block-D5A-CGXG.js +0 -330
  401. package/dist/chunks/code-block-D5A-CGXG.js.map +0 -1
  402. package/dist/chunks/code-tqj0uhBL.js.map +0 -1
  403. package/dist/chunks/collapsible-CKrCX_T9.js +0 -87
  404. package/dist/chunks/collapsible-CKrCX_T9.js.map +0 -1
  405. package/dist/chunks/combobox-DjDI7SUC.js +0 -319
  406. package/dist/chunks/combobox-DjDI7SUC.js.map +0 -1
  407. package/dist/chunks/command-list-C2Y7V_lt.js +0 -418
  408. package/dist/chunks/command-list-C2Y7V_lt.js.map +0 -1
  409. package/dist/chunks/copy-button-FJvPJn72.js.map +0 -1
  410. package/dist/chunks/core-BYns5ytV.js +0 -472
  411. package/dist/chunks/core-BYns5ytV.js.map +0 -1
  412. package/dist/chunks/date-popup-CPA_zt6o.js +0 -35
  413. package/dist/chunks/date-popup-CPA_zt6o.js.map +0 -1
  414. package/dist/chunks/de-CPXJh9cq.js.map +0 -1
  415. package/dist/chunks/dialog-Cg9A_6SF.js.map +0 -1
  416. package/dist/chunks/field-TviMvYa2.js.map +0 -1
  417. package/dist/chunks/hidden-description-B2zSmLcn.js +0 -23
  418. package/dist/chunks/hidden-description-B2zSmLcn.js.map +0 -1
  419. package/dist/chunks/icon-DVooQfk4.js +0 -94
  420. package/dist/chunks/icon-button-CrdF_eMG.js.map +0 -1
  421. package/dist/chunks/input-2VJuj_M4.js.map +0 -1
  422. package/dist/chunks/input-group-DQ_4DoXg.js.map +0 -1
  423. package/dist/chunks/iso-field-B2rTwiBo.js +0 -33
  424. package/dist/chunks/iso-field-B2rTwiBo.js.map +0 -1
  425. package/dist/chunks/json-view-Dqd2TDkc.js +0 -175
  426. package/dist/chunks/json-view-Dqd2TDkc.js.map +0 -1
  427. package/dist/chunks/kbd-BF1vKXJf.js.map +0 -1
  428. package/dist/chunks/link-KWI7PevW.js.map +0 -1
  429. package/dist/chunks/list-M1csq-d4.js +0 -494
  430. package/dist/chunks/list-M1csq-d4.js.map +0 -1
  431. package/dist/chunks/markdown-DULktoTK.js +0 -313
  432. package/dist/chunks/markdown-DULktoTK.js.map +0 -1
  433. package/dist/chunks/menu-DEmBfdPm.js +0 -450
  434. package/dist/chunks/menu-DEmBfdPm.js.map +0 -1
  435. package/dist/chunks/meter-Bj4N3Xuh.js +0 -84
  436. package/dist/chunks/meter-Bj4N3Xuh.js.map +0 -1
  437. package/dist/chunks/nav-sheet-CzgIwgAm.js +0 -60
  438. package/dist/chunks/nav-sheet-CzgIwgAm.js.map +0 -1
  439. package/dist/chunks/nav-wordmark-_pjheAsZ.js.map +0 -1
  440. package/dist/chunks/page-header-DL2y2iZp.js +0 -41
  441. package/dist/chunks/page-header-DL2y2iZp.js.map +0 -1
  442. package/dist/chunks/pagination-Cn_qF4cg.js +0 -86
  443. package/dist/chunks/pagination-Cn_qF4cg.js.map +0 -1
  444. package/dist/chunks/picker-popover-BxyU1U9F.js +0 -106
  445. package/dist/chunks/picker-popover-BxyU1U9F.js.map +0 -1
  446. package/dist/chunks/popover-DNN4S47w.js +0 -50
  447. package/dist/chunks/popover-DNN4S47w.js.map +0 -1
  448. package/dist/chunks/portal-context-BBbzDKmY.js.map +0 -1
  449. package/dist/chunks/radio-CDDFpdtL.js.map +0 -1
  450. package/dist/chunks/range-popup-CRyWYUB1.js +0 -128
  451. package/dist/chunks/range-popup-CRyWYUB1.js.map +0 -1
  452. package/dist/chunks/release-art-ZwfFQImt.js +0 -561
  453. package/dist/chunks/release-art-ZwfFQImt.js.map +0 -1
  454. package/dist/chunks/rights-Cyp0Pzp-.js +0 -279
  455. package/dist/chunks/rights-Cyp0Pzp-.js.map +0 -1
  456. package/dist/chunks/scroll-area-D8MD7Vpo.js.map +0 -1
  457. package/dist/chunks/scroll-parent-WXvzQcUo.js +0 -14
  458. package/dist/chunks/scroll-parent-WXvzQcUo.js.map +0 -1
  459. package/dist/chunks/section-Ce1efbsP.js +0 -87
  460. package/dist/chunks/section-Ce1efbsP.js.map +0 -1
  461. package/dist/chunks/segmented-CErcoxwi.js +0 -114
  462. package/dist/chunks/segmented-CErcoxwi.js.map +0 -1
  463. package/dist/chunks/select-x4XVsdCI.js +0 -210
  464. package/dist/chunks/select-x4XVsdCI.js.map +0 -1
  465. package/dist/chunks/separator-D7TzNHmX.js.map +0 -1
  466. package/dist/chunks/sidebar-3r1ZRXlN.js +0 -621
  467. package/dist/chunks/sidebar-3r1ZRXlN.js.map +0 -1
  468. package/dist/chunks/skeleton-Dcz57Zyp.js.map +0 -1
  469. package/dist/chunks/slider-Ci83PGtj.js +0 -57
  470. package/dist/chunks/slider-Ci83PGtj.js.map +0 -1
  471. package/dist/chunks/swap-text-Dr0Irxz6.js.map +0 -1
  472. package/dist/chunks/switch-BNMq_kGt.js +0 -59
  473. package/dist/chunks/switch-BNMq_kGt.js.map +0 -1
  474. package/dist/chunks/table-BeOSKl_3.js +0 -84
  475. package/dist/chunks/table-BeOSKl_3.js.map +0 -1
  476. package/dist/chunks/tag-D_M1s2qS.js +0 -87
  477. package/dist/chunks/tag-D_M1s2qS.js.map +0 -1
  478. package/dist/chunks/text-CIXH8rmT.js.map +0 -1
  479. package/dist/chunks/textarea--4FRL3Pb.js.map +0 -1
  480. package/dist/chunks/timeseries-D1xjRXfk.js +0 -339
  481. package/dist/chunks/timeseries-D1xjRXfk.js.map +0 -1
  482. package/dist/chunks/toolbar-WA_oZgu-.js +0 -37
  483. package/dist/chunks/toolbar-WA_oZgu-.js.map +0 -1
  484. package/dist/chunks/tooltip-OcwO0VUT.js +0 -154
  485. package/dist/chunks/tooltip-OcwO0VUT.js.map +0 -1
  486. package/dist/chunks/tooltip-root-DzahJDVj.js +0 -60
  487. package/dist/chunks/tooltip-root-DzahJDVj.js.map +0 -1
  488. package/dist/chunks/zh-CN-29X4CDLE.js.map +0 -1
  489. package/dist/components/data-table.js.map +0 -1
  490. package/dist/components/label.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "@logicplanes/kaeso-ui",
3
- "version": "0.4.3",
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",
@@ -2485,9 +2485,86 @@
2485
2485
  ],
2486
2486
  "file": "src/components/code-block/code-block.tsx"
2487
2487
  },
2488
+ {
2489
+ "name": "DiffView",
2490
+ "description": "Two versions of a text side by side in one column: removed lines on red, added lines on green, the changed words inside them marked, syntax highlighted, and long unchanged runs folded away.",
2491
+ "props": [
2492
+ {
2493
+ "name": "after",
2494
+ "type": "string",
2495
+ "required": true,
2496
+ "default": null,
2497
+ "description": "The new version."
2498
+ },
2499
+ {
2500
+ "name": "before",
2501
+ "type": "string",
2502
+ "required": true,
2503
+ "default": null,
2504
+ "description": "The old version."
2505
+ },
2506
+ {
2507
+ "name": "className",
2508
+ "type": "string",
2509
+ "required": false,
2510
+ "default": null,
2511
+ "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
2512
+ },
2513
+ {
2514
+ "name": "context",
2515
+ "type": "number",
2516
+ "required": false,
2517
+ "default": "3",
2518
+ "description": "Unchanged lines kept around each change before the rest folds (3 by default)."
2519
+ },
2520
+ {
2521
+ "name": "copy",
2522
+ "type": "boolean",
2523
+ "required": false,
2524
+ "default": "true",
2525
+ "description": "Hide the copy circle, which copies the diff with + and - markers."
2526
+ },
2527
+ {
2528
+ "name": "lang",
2529
+ "type": "CodeLang",
2530
+ "required": false,
2531
+ "default": "text",
2532
+ "description": "The language of both versions, for highlighting (`text` by default)."
2533
+ },
2534
+ {
2535
+ "name": "lineNumbers",
2536
+ "type": "boolean",
2537
+ "required": false,
2538
+ "default": null,
2539
+ "description": "Shows the old and the new line numbers."
2540
+ },
2541
+ {
2542
+ "name": "surface",
2543
+ "type": "\"well\" | \"plain\"",
2544
+ "required": false,
2545
+ "default": "well",
2546
+ "description": "On a filled well (`well`) or on the panel itself (`plain`)."
2547
+ },
2548
+ {
2549
+ "name": "title",
2550
+ "type": "ReactNode",
2551
+ "required": false,
2552
+ "default": null,
2553
+ "description": "A name in the title bar, beside the count of added and removed lines."
2554
+ },
2555
+ {
2556
+ "name": "wrap",
2557
+ "type": "boolean",
2558
+ "required": false,
2559
+ "default": "false",
2560
+ "description": "Long lines wrap instead of scrolling sideways, keeping their indent: values in a narrow column such as a sheet."
2561
+ }
2562
+ ],
2563
+ "file": "src/components/code-block/diff-view.tsx"
2564
+ },
2488
2565
  {
2489
2566
  "name": "JsonView",
2490
- "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.",
2491
2568
  "props": [
2492
2569
  {
2493
2570
  "name": "value",
@@ -2540,6 +2617,17 @@
2540
2617
  "surface": "well"
2541
2618
  }
2542
2619
  },
2620
+ "DIFF_VIEW": {
2621
+ "axes": {
2622
+ "surface": {
2623
+ "well": "A well: radius 14, fill, no ring (default)",
2624
+ "plain": "No surface, inside another well"
2625
+ }
2626
+ },
2627
+ "defaults": {
2628
+ "surface": "well"
2629
+ }
2630
+ },
2543
2631
  "JSON_VIEW": {
2544
2632
  "axes": {
2545
2633
  "surface": {
@@ -2560,7 +2648,7 @@
2560
2648
  "components": [
2561
2649
  {
2562
2650
  "name": "Accordion",
2563
- "description": "Collapsible rows separated by hairlines.",
2651
+ "description": "Collapsible rows separated by hairlines, each the same pill row as Collapsible.",
2564
2652
  "props": [
2565
2653
  {
2566
2654
  "name": "items",
@@ -2595,7 +2683,7 @@
2595
2683
  },
2596
2684
  {
2597
2685
  "name": "Collapsible",
2598
- "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.",
2599
2687
  "props": [
2600
2688
  {
2601
2689
  "name": "children",
@@ -2654,8 +2742,8 @@
2654
2742
  "COLLAPSIBLE": {
2655
2743
  "axes": {
2656
2744
  "state": {
2657
- "closed": "Closed: the chevron points to the row (default)",
2658
- "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"
2659
2747
  }
2660
2748
  },
2661
2749
  "defaults": {
@@ -2874,7 +2962,7 @@
2874
2962
  "type": "ReactNode",
2875
2963
  "required": false,
2876
2964
  "default": null,
2877
- "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."
2878
2966
  },
2879
2967
  {
2880
2968
  "name": "error",
@@ -2916,7 +3004,7 @@
2916
3004
  "type": "boolean",
2917
3005
  "required": false,
2918
3006
  "default": null,
2919
- "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."
2920
3008
  },
2921
3009
  {
2922
3010
  "name": "multiple",
@@ -3070,7 +3158,7 @@
3070
3158
  "type": "CommandListGroup[]",
3071
3159
  "required": true,
3072
3160
  "default": null,
3073
- "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."
3074
3162
  },
3075
3163
  {
3076
3164
  "name": "autoFocus",
@@ -3112,7 +3200,7 @@
3112
3200
  "type": "ReactNode",
3113
3201
  "required": false,
3114
3202
  "default": null,
3115
- "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."
3116
3204
  },
3117
3205
  {
3118
3206
  "name": "escapeClears",
@@ -3147,7 +3235,7 @@
3147
3235
  "type": "boolean",
3148
3236
  "required": false,
3149
3237
  "default": null,
3150
- "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."
3151
3239
  },
3152
3240
  {
3153
3241
  "name": "match",
@@ -3395,7 +3483,7 @@
3395
3483
  "components": [
3396
3484
  {
3397
3485
  "name": "CommandPalette",
3398
- "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.",
3399
3487
  "props": [
3400
3488
  {
3401
3489
  "name": "groups",
@@ -3423,7 +3511,7 @@
3423
3511
  "type": "ReactNode",
3424
3512
  "required": false,
3425
3513
  "default": null,
3426
- "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."
3427
3515
  },
3428
3516
  {
3429
3517
  "name": "hotkey",
@@ -3678,7 +3766,7 @@
3678
3766
  "components": [
3679
3767
  {
3680
3768
  "name": "DataTable",
3681
- "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.",
3682
3770
  "props": [
3683
3771
  {
3684
3772
  "name": "aria-label",
@@ -3706,7 +3794,7 @@
3706
3794
  "type": "string",
3707
3795
  "required": false,
3708
3796
  "default": null,
3709
- "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."
3710
3798
  },
3711
3799
  {
3712
3800
  "name": "canSelectRow",
@@ -3722,6 +3810,13 @@
3722
3810
  "default": null,
3723
3811
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
3724
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
+ },
3725
3820
  {
3726
3821
  "name": "density",
3727
3822
  "type": "\"default\" | \"compact\" | \"comfortable\"",
@@ -3734,14 +3829,14 @@
3734
3829
  "type": "ReactNode",
3735
3830
  "required": false,
3736
3831
  "default": null,
3737
- "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\"."
3738
3833
  },
3739
3834
  {
3740
3835
  "name": "error",
3741
3836
  "type": "ReactNode",
3742
3837
  "required": false,
3743
3838
  "default": null,
3744
- "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."
3745
3840
  },
3746
3841
  {
3747
3842
  "name": "freshRowIds",
@@ -3846,7 +3941,7 @@
3846
3941
  "type": "boolean",
3847
3942
  "required": false,
3848
3943
  "default": null,
3849
- "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."
3850
3945
  },
3851
3946
  {
3852
3947
  "name": "selection",
@@ -3884,8 +3979,8 @@
3884
3979
  "DATA_TABLE": {
3885
3980
  "axes": {
3886
3981
  "density": {
3887
- "compact": "36px rows",
3888
- "default": "40px rows (default)",
3982
+ "compact": "36px rows; 44px with a coarse pointer",
3983
+ "default": "40px rows (default); 44px with a coarse pointer",
3889
3984
  "comfortable": "48px rows"
3890
3985
  }
3891
3986
  },
@@ -4007,7 +4102,7 @@
4007
4102
  "type": "string",
4008
4103
  "required": false,
4009
4104
  "default": null,
4010
- "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."
4011
4106
  },
4012
4107
  {
4013
4108
  "name": "required",
@@ -4147,7 +4242,7 @@
4147
4242
  "type": "string",
4148
4243
  "required": false,
4149
4244
  "default": null,
4150
- "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."
4151
4246
  },
4152
4247
  {
4153
4248
  "name": "preset",
@@ -4349,7 +4444,7 @@
4349
4444
  "components": [
4350
4445
  {
4351
4446
  "name": "DeleteResource",
4352
- "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.",
4353
4448
  "props": [
4354
4449
  {
4355
4450
  "name": "consequence",
@@ -4363,14 +4458,14 @@
4363
4458
  "type": "string",
4364
4459
  "required": true,
4365
4460
  "default": null,
4366
- "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\"."
4367
4462
  },
4368
4463
  {
4369
4464
  "name": "name",
4370
4465
  "type": "string",
4371
4466
  "required": true,
4372
4467
  "default": null,
4373
- "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."
4374
4469
  },
4375
4470
  {
4376
4471
  "name": "onConfirm",
@@ -4419,7 +4514,7 @@
4419
4514
  "type": "string",
4420
4515
  "required": false,
4421
4516
  "default": null,
4422
- "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."
4423
4518
  }
4424
4519
  ],
4425
4520
  "file": "src/blocks/delete-resource/delete-resource.tsx"
@@ -4429,8 +4524,8 @@
4429
4524
  "DELETE_RESOURCE": {
4430
4525
  "axes": {
4431
4526
  "confirm": {
4432
- "typed": "The person types the resource's name (default)",
4433
- "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"
4434
4529
  }
4435
4530
  },
4436
4531
  "defaults": {
@@ -4474,7 +4569,7 @@
4474
4569
  "type": "ReactNode",
4475
4570
  "required": true,
4476
4571
  "default": null,
4477
- "description": "Names the action: \"Delete this key?\""
4572
+ "description": "Names the action and the object: \"Delete “checkout-web”?\""
4478
4573
  },
4479
4574
  {
4480
4575
  "name": "cancelLabel",
@@ -4530,7 +4625,7 @@
4530
4625
  "type": "\"warning\" | \"danger\" | \"info\"",
4531
4626
  "required": false,
4532
4627
  "default": null,
4533
- "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)."
4534
4629
  },
4535
4630
  {
4536
4631
  "name": "trigger",
@@ -4551,13 +4646,13 @@
4551
4646
  "type": "ReactNode",
4552
4647
  "required": true,
4553
4648
  "default": null,
4554
- "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."
4555
4650
  },
4556
4651
  {
4557
4652
  "name": "anchor",
4558
4653
  "type": "\"center\" | \"top\"",
4559
4654
  "required": false,
4560
- "default": null,
4655
+ "default": "top",
4561
4656
  "description": "Where it sits: centered, or with a fixed top edge for content that changes height, so the title never moves."
4562
4657
  },
4563
4658
  {
@@ -4656,7 +4751,7 @@
4656
4751
  "type": "boolean",
4657
4752
  "required": false,
4658
4753
  "default": null,
4659
- "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."
4660
4755
  },
4661
4756
  {
4662
4757
  "name": "size",
@@ -4705,7 +4800,7 @@
4705
4800
  },
4706
4801
  {
4707
4802
  "name": "LayerDialog",
4708
- "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.",
4709
4804
  "props": [
4710
4805
  {
4711
4806
  "name": "layers",
@@ -4718,8 +4813,8 @@
4718
4813
  "name": "anchor",
4719
4814
  "type": "\"center\" | \"top\"",
4720
4815
  "required": false,
4721
- "default": null,
4722
- "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."
4723
4818
  },
4724
4819
  {
4725
4820
  "name": "busy",
@@ -4831,7 +4926,7 @@
4831
4926
  "type": "DialogStep[]",
4832
4927
  "required": true,
4833
4928
  "default": null,
4834
- "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\"."
4835
4930
  },
4836
4931
  {
4837
4932
  "name": "submitLabel",
@@ -4911,9 +5006,9 @@
4911
5006
  "ALERT_DIALOG": {
4912
5007
  "axes": {
4913
5008
  "tone": {
4914
- "danger": "Destructive (default)",
4915
- "warning": "Risky but reversible",
4916
- "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"
4917
5012
  }
4918
5013
  },
4919
5014
  "defaults": {
@@ -4955,7 +5050,7 @@
4955
5050
  },
4956
5051
  "defaults": {
4957
5052
  "size": "md",
4958
- "anchor": "center"
5053
+ "anchor": "top"
4959
5054
  }
4960
5055
  },
4961
5056
  "STEP_DIALOG": {
@@ -5060,7 +5155,7 @@
5060
5155
  "components": [
5061
5156
  {
5062
5157
  "name": "Empty",
5063
- "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.",
5064
5159
  "props": [
5065
5160
  {
5066
5161
  "name": "title",
@@ -5074,7 +5169,7 @@
5074
5169
  "type": "ReactNode",
5075
5170
  "required": false,
5076
5171
  "default": null,
5077
- "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."
5078
5173
  },
5079
5174
  {
5080
5175
  "name": "children",
@@ -5102,7 +5197,7 @@
5102
5197
  "type": "\"md\" | \"lg\" | \"compact\"",
5103
5198
  "required": false,
5104
5199
  "default": "lg",
5105
- "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`)."
5106
5201
  }
5107
5202
  ],
5108
5203
  "file": "src/components/empty/empty.tsx"
@@ -5144,7 +5239,7 @@
5144
5239
  "type": "ReactNode",
5145
5240
  "required": false,
5146
5241
  "default": null,
5147
- "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."
5148
5243
  },
5149
5244
  {
5150
5245
  "name": "id",
@@ -5179,21 +5274,21 @@
5179
5274
  },
5180
5275
  {
5181
5276
  "name": "Fieldset",
5182
- "description": "A group of fields under one legend.",
5277
+ "description": "A group of fields under one legend, which names the group for screen readers.",
5183
5278
  "props": [
5184
5279
  {
5185
5280
  "name": "legend",
5186
5281
  "type": "ReactNode",
5187
5282
  "required": true,
5188
5283
  "default": null,
5189
- "description": "The heading of the group of fields."
5284
+ "description": "The heading of the group of fields, read out as the group's name."
5190
5285
  },
5191
5286
  {
5192
5287
  "name": "description",
5193
5288
  "type": "ReactNode",
5194
5289
  "required": false,
5195
5290
  "default": null,
5196
- "description": "One sentence of help under the heading."
5291
+ "description": "One sentence of help under the heading; it also describes the group."
5197
5292
  }
5198
5293
  ],
5199
5294
  "file": "src/components/field/field.tsx"
@@ -5234,7 +5329,7 @@
5234
5329
  "type": "string",
5235
5330
  "required": true,
5236
5331
  "default": null,
5237
- "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."
5238
5333
  },
5239
5334
  {
5240
5335
  "name": "caption",
@@ -5441,7 +5536,7 @@
5441
5536
  "components": [
5442
5537
  {
5443
5538
  "name": "FilterRow",
5444
- "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.",
5445
5540
  "props": [
5446
5541
  {
5447
5542
  "name": "children",
@@ -5496,7 +5591,7 @@
5496
5591
  "components": [
5497
5592
  {
5498
5593
  "name": "Flow",
5499
- "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.",
5500
5595
  "props": [
5501
5596
  {
5502
5597
  "name": "columns",
@@ -5517,7 +5612,7 @@
5517
5612
  "type": "boolean",
5518
5613
  "required": false,
5519
5614
  "default": "false",
5520
- "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."
5521
5616
  },
5522
5617
  {
5523
5618
  "name": "aria-label",
@@ -5548,7 +5643,7 @@
5548
5643
  "FLOW": {
5549
5644
  "axes": {
5550
5645
  "node": {
5551
- "pill": "A raised pill (default)",
5646
+ "pill": "A pill with a hairline (default)",
5552
5647
  "box": "A rounded-14 box with a description line"
5553
5648
  }
5554
5649
  },
@@ -5944,7 +6039,7 @@
5944
6039
  },
5945
6040
  {
5946
6041
  "name": "NumberInput",
5947
- "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.",
5948
6043
  "props": [
5949
6044
  {
5950
6045
  "name": "align",
@@ -5993,7 +6088,7 @@
5993
6088
  "type": "boolean",
5994
6089
  "required": false,
5995
6090
  "default": null,
5996
- "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."
5997
6092
  },
5998
6093
  {
5999
6094
  "name": "integer",
@@ -6638,8 +6733,8 @@
6638
6733
  "NUMBER_INPUT": {
6639
6734
  "axes": {
6640
6735
  "align": {
6641
- "end": "Right-aligned tabular digits (default)",
6642
- "start": "Left-aligned"
6736
+ "end": "End-aligned tabular digits (default)",
6737
+ "start": "Start-aligned"
6643
6738
  }
6644
6739
  },
6645
6740
  "defaults": {
@@ -6649,7 +6744,7 @@
6649
6744
  "OTP_INPUT": {
6650
6745
  "axes": {
6651
6746
  "size": {
6652
- "md": "48px cells (default)",
6747
+ "md": "48px cells (default); they shrink, square, when the row is narrower",
6653
6748
  "sm": "40px cells"
6654
6749
  }
6655
6750
  },
@@ -6732,7 +6827,7 @@
6732
6827
  },
6733
6828
  {
6734
6829
  "name": "ClientButton",
6735
- "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.",
6736
6831
  "props": [
6737
6832
  {
6738
6833
  "name": "aria-label",
@@ -6755,6 +6850,13 @@
6755
6850
  "default": null,
6756
6851
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
6757
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
+ },
6758
6860
  {
6759
6861
  "name": "onClick",
6760
6862
  "type": "(() => void)",
@@ -6809,7 +6911,7 @@
6809
6911
  },
6810
6912
  {
6811
6913
  "name": "EffectiveAccess",
6812
- "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.",
6813
6915
  "props": [
6814
6916
  {
6815
6917
  "name": "groups",
@@ -6886,7 +6988,7 @@
6886
6988
  },
6887
6989
  {
6888
6990
  "name": "GrantSummary",
6889
- "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.",
6890
6992
  "props": [
6891
6993
  {
6892
6994
  "name": "aria-label",
@@ -6907,7 +7009,7 @@
6907
7009
  "type": "ReactNode",
6908
7010
  "required": false,
6909
7011
  "default": null,
6910
- "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."
6911
7013
  },
6912
7014
  {
6913
7015
  "name": "className",
@@ -6921,14 +7023,14 @@
6921
7023
  "type": "ReactNode",
6922
7024
  "required": false,
6923
7025
  "default": null,
6924
- "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."
6925
7027
  }
6926
7028
  ],
6927
7029
  "file": "src/components/kaeso/grant-summary.tsx"
6928
7030
  },
6929
7031
  {
6930
7032
  "name": "KeyDisplay",
6931
- "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.",
6932
7034
  "props": [
6933
7035
  {
6934
7036
  "name": "redacted",
@@ -6977,7 +7079,7 @@
6977
7079
  },
6978
7080
  {
6979
7081
  "name": "LimitMeter",
6980
- "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.",
6981
7083
  "props": [
6982
7084
  {
6983
7085
  "name": "kind",
@@ -6998,7 +7100,7 @@
6998
7100
  "type": "ReactNode",
6999
7101
  "required": true,
7000
7102
  "default": null,
7001
- "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."
7002
7104
  },
7003
7105
  {
7004
7106
  "name": "used",
@@ -7391,7 +7493,7 @@
7391
7493
  },
7392
7494
  {
7393
7495
  "name": "RightsMatrix",
7394
- "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.",
7395
7497
  "props": [
7396
7498
  {
7397
7499
  "name": "groups",
@@ -7454,7 +7556,7 @@
7454
7556
  },
7455
7557
  {
7456
7558
  "name": "RolePicker",
7457
- "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.",
7458
7560
  "props": [
7459
7561
  {
7460
7562
  "name": "roles",
@@ -7538,14 +7640,14 @@
7538
7640
  },
7539
7641
  {
7540
7642
  "name": "SecretReveal",
7541
- "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.",
7542
7644
  "props": [
7543
7645
  {
7544
7646
  "name": "baseUrl",
7545
7647
  "type": "string",
7546
7648
  "required": true,
7547
7649
  "default": null,
7548
- "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."
7549
7651
  },
7550
7652
  {
7551
7653
  "name": "secret",
@@ -7629,7 +7731,7 @@
7629
7731
  },
7630
7732
  {
7631
7733
  "name": "UsageBreakdown",
7632
- "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.",
7633
7735
  "props": [
7634
7736
  {
7635
7737
  "name": "tokens",
@@ -7833,7 +7935,7 @@
7833
7935
  "components": [
7834
7936
  {
7835
7937
  "name": "KeyValue",
7836
- "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.",
7837
7939
  "props": [
7838
7940
  {
7839
7941
  "name": "items",
@@ -7895,7 +7997,7 @@
7895
7997
  "components": [
7896
7998
  {
7897
7999
  "name": "Label",
7898
- "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.",
7899
8001
  "props": [
7900
8002
  {
7901
8003
  "name": "children",
@@ -7968,7 +8070,7 @@
7968
8070
  },
7969
8071
  {
7970
8072
  "name": "gap",
7971
- "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",
7972
8074
  "required": false,
7973
8075
  "default": "16",
7974
8076
  "description": "The space between items, in pixels on the spacing scale."
@@ -7996,7 +8098,7 @@
7996
8098
  },
7997
8099
  {
7998
8100
  "name": "gap",
7999
- "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",
8000
8102
  "required": false,
8001
8103
  "default": "16",
8002
8104
  "description": "The space between items, in pixels on the spacing scale."
@@ -8038,7 +8140,7 @@
8038
8140
  },
8039
8141
  {
8040
8142
  "name": "gap",
8041
- "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",
8042
8144
  "required": false,
8043
8145
  "default": "16",
8044
8146
  "description": "The space between items, in pixels on the spacing scale."
@@ -8075,7 +8177,7 @@
8075
8177
  "2": "Two columns from 768px",
8076
8178
  "3": "Three columns from 768px",
8077
8179
  "4": "Two, then four from 1024px",
8078
- "6": "Three, then six from 1024px"
8180
+ "6": "Two, three from 768px, six from 1024px"
8079
8181
  }
8080
8182
  },
8081
8183
  "defaults": {
@@ -8131,7 +8233,7 @@
8131
8233
  "LINK": {
8132
8234
  "axes": {
8133
8235
  "variant": {
8134
- "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",
8135
8237
  "quiet": "Navigation-style links in footers and metadata; no underline until hover",
8136
8238
  "standalone": "A link on its own line (“Team overview ›”)",
8137
8239
  "heading": "A heading's link to itself: the heading's own look, with a # beside it on hover and keyboard focus",
@@ -8151,7 +8253,7 @@
8151
8253
  "components": [
8152
8254
  {
8153
8255
  "name": "GroupHeader",
8154
- "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.",
8155
8257
  "props": [
8156
8258
  {
8157
8259
  "name": "title",
@@ -8193,7 +8295,7 @@
8193
8295
  "type": "boolean",
8194
8296
  "required": false,
8195
8297
  "default": null,
8196
- "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."
8197
8299
  },
8198
8300
  {
8199
8301
  "name": "glyph",
@@ -8207,7 +8309,7 @@
8207
8309
  "type": "boolean",
8208
8310
  "required": false,
8209
8311
  "default": null,
8210
- "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."
8211
8313
  },
8212
8314
  {
8213
8315
  "name": "index",
@@ -8242,7 +8344,7 @@
8242
8344
  },
8243
8345
  {
8244
8346
  "name": "List",
8245
- "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.",
8246
8348
  "props": [
8247
8349
  {
8248
8350
  "name": "aria-label",
@@ -8263,7 +8365,7 @@
8263
8365
  "type": "string",
8264
8366
  "required": false,
8265
8367
  "default": null,
8266
- "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."
8267
8369
  },
8268
8370
  {
8269
8371
  "name": "density",
@@ -8305,7 +8407,7 @@
8305
8407
  "type": "boolean",
8306
8408
  "required": false,
8307
8409
  "default": null,
8308
- "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."
8309
8411
  },
8310
8412
  {
8311
8413
  "name": "onOpen",
@@ -8347,7 +8449,7 @@
8347
8449
  "type": "boolean",
8348
8450
  "required": false,
8349
8451
  "default": "true",
8350
- "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."
8351
8453
  },
8352
8454
  {
8353
8455
  "name": "virtualizeAbove",
@@ -8431,7 +8533,7 @@
8431
8533
  "type": "boolean",
8432
8534
  "required": false,
8433
8535
  "default": "false",
8434
- "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."
8435
8537
  },
8436
8538
  {
8437
8539
  "name": "onFocus",
@@ -8554,7 +8656,7 @@
8554
8656
  "axes": {
8555
8657
  "density": {
8556
8658
  "default": "44px rows (default)",
8557
- "compact": "36px rows"
8659
+ "compact": "36px rows; 44px with a coarse pointer"
8558
8660
  }
8559
8661
  },
8560
8662
  "defaults": {
@@ -8570,14 +8672,14 @@
8570
8672
  "components": [
8571
8673
  {
8572
8674
  "name": "Loader",
8573
- "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.",
8574
8676
  "props": [
8575
8677
  {
8576
8678
  "name": "delay",
8577
8679
  "type": "number | boolean",
8578
8680
  "required": false,
8579
8681
  "default": null,
8580
- "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."
8581
8683
  },
8582
8684
  {
8583
8685
  "name": "hideLabel",
@@ -8605,7 +8707,7 @@
8605
8707
  "type": "number",
8606
8708
  "required": false,
8607
8709
  "default": null,
8608
- "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}`."
8609
8711
  },
8610
8712
  {
8611
8713
  "name": "size",
@@ -8746,7 +8848,7 @@
8746
8848
  "components": [
8747
8849
  {
8748
8850
  "name": "Markdown",
8749
- "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.",
8750
8852
  "props": [
8751
8853
  {
8752
8854
  "name": "text",
@@ -8849,7 +8951,7 @@
8849
8951
  "type": "ReactNode",
8850
8952
  "required": true,
8851
8953
  "default": null,
8852
- "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."
8853
8955
  },
8854
8956
  {
8855
8957
  "name": "onOpenChange",
@@ -8863,7 +8965,7 @@
8863
8965
  },
8864
8966
  {
8865
8967
  "name": "Menu",
8866
- "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.",
8867
8969
  "props": [
8868
8970
  {
8869
8971
  "name": "children",
@@ -8971,7 +9073,7 @@
8971
9073
  "components": [
8972
9074
  {
8973
9075
  "name": "Meter",
8974
- "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.",
8975
9077
  "props": [
8976
9078
  {
8977
9079
  "name": "value",
@@ -8992,7 +9094,7 @@
8992
9094
  "type": "ReactNode",
8993
9095
  "required": false,
8994
9096
  "default": null,
8995
- "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\"."
8996
9098
  },
8997
9099
  {
8998
9100
  "name": "className",
@@ -9048,7 +9150,7 @@
9048
9150
  },
9049
9151
  {
9050
9152
  "name": "Progress",
9051
- "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.",
9052
9154
  "props": [
9053
9155
  {
9054
9156
  "name": "aria-label",
@@ -9079,7 +9181,7 @@
9079
9181
  "METER": {
9080
9182
  "axes": {
9081
9183
  "tone": {
9082
- "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)",
9083
9185
  "neutral": "A plain share"
9084
9186
  }
9085
9187
  },
@@ -9159,7 +9261,7 @@
9159
9261
  "PAGE_HEADER": {
9160
9262
  "axes": {
9161
9263
  "size": {
9162
- "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"
9163
9265
  }
9164
9266
  },
9165
9267
  "defaults": {
@@ -9394,7 +9496,7 @@
9394
9496
  "type": "boolean",
9395
9497
  "required": false,
9396
9498
  "default": null,
9397
- "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."
9398
9500
  },
9399
9501
  {
9400
9502
  "name": "hasPrevious",
@@ -9443,7 +9545,7 @@
9443
9545
  "type": "number",
9444
9546
  "required": false,
9445
9547
  "default": "1",
9446
- "description": "pages:"
9548
+ "description": "The current page, for numbered pages; previous and next stay in place and only announce themselves unavailable at the ends."
9447
9549
  },
9448
9550
  {
9449
9551
  "name": "pageCount",
@@ -9467,9 +9569,9 @@
9467
9569
  "PAGINATION": {
9468
9570
  "axes": {
9469
9571
  "variant": {
9470
- "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)",
9471
9573
  "cursor": "Previous and next circles, without a count",
9472
- "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"
9473
9575
  }
9474
9576
  },
9475
9577
  "defaults": {
@@ -9485,7 +9587,7 @@
9485
9587
  "components": [
9486
9588
  {
9487
9589
  "name": "CompareGrid",
9488
- "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.",
9489
9591
  "props": [
9490
9592
  {
9491
9593
  "name": "aria-label",
@@ -9548,21 +9650,21 @@
9548
9650
  "type": "(() => void)",
9549
9651
  "required": false,
9550
9652
  "default": null,
9551
- "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."
9552
9654
  }
9553
9655
  ],
9554
9656
  "file": "src/components/playground/compare-grid.tsx"
9555
9657
  },
9556
9658
  {
9557
9659
  "name": "Composer",
9558
- "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.",
9559
9661
  "props": [
9560
9662
  {
9561
9663
  "name": "actions",
9562
9664
  "type": "ReactNode",
9563
9665
  "required": false,
9564
9666
  "default": null,
9565
- "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."
9566
9668
  },
9567
9669
  {
9568
9670
  "name": "aria-label",
@@ -9674,21 +9776,21 @@
9674
9776
  "type": "string",
9675
9777
  "required": false,
9676
9778
  "default": null,
9677
- "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)."
9678
9780
  },
9679
9781
  {
9680
9782
  "name": "streaming",
9681
9783
  "type": "boolean",
9682
9784
  "required": false,
9683
9785
  "default": "false",
9684
- "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."
9685
9787
  },
9686
9788
  {
9687
9789
  "name": "submitLabel",
9688
9790
  "type": "string",
9689
9791
  "required": false,
9690
9792
  "default": null,
9691
- "description": "The send button's accessible name."
9793
+ "description": "The Send button's label (\"Send\" by default)."
9692
9794
  },
9693
9795
  {
9694
9796
  "name": "submitOn",
@@ -9899,7 +10001,7 @@
9899
10001
  },
9900
10002
  {
9901
10003
  "name": "ParameterPanel",
9902
- "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).",
9903
10005
  "props": [
9904
10006
  {
9905
10007
  "name": "onValueChange",
@@ -9955,7 +10057,7 @@
9955
10057
  "type": "number",
9956
10058
  "required": false,
9957
10059
  "default": null,
9958
- "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."
9959
10061
  },
9960
10062
  {
9961
10063
  "name": "reasoning",
@@ -9976,7 +10078,7 @@
9976
10078
  },
9977
10079
  {
9978
10080
  "name": "ParameterPopover",
9979
- "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.",
9980
10082
  "props": [
9981
10083
  {
9982
10084
  "name": "onValueChange",
@@ -10032,7 +10134,7 @@
10032
10134
  "type": "number",
10033
10135
  "required": false,
10034
10136
  "default": null,
10035
- "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."
10036
10138
  },
10037
10139
  {
10038
10140
  "name": "onOpenChange",
@@ -10088,14 +10190,14 @@
10088
10190
  },
10089
10191
  {
10090
10192
  "name": "PromptSuggestions",
10091
- "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.",
10092
10194
  "props": [
10093
10195
  {
10094
10196
  "name": "onSelect",
10095
10197
  "type": "(prompt: string) => void",
10096
10198
  "required": true,
10097
10199
  "default": null,
10098
- "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."
10099
10201
  },
10100
10202
  {
10101
10203
  "name": "suggestions",
@@ -10124,13 +10226,20 @@
10124
10226
  "required": false,
10125
10227
  "default": null,
10126
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`."
10127
10236
  }
10128
10237
  ],
10129
10238
  "file": "src/components/playground/prompt-suggestions.tsx"
10130
10239
  },
10131
10240
  {
10132
10241
  "name": "Reasoning",
10133
- "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.",
10134
10243
  "props": [
10135
10244
  {
10136
10245
  "name": "children",
@@ -10146,6 +10255,13 @@
10146
10255
  "default": null,
10147
10256
  "description": "Classes for the layout of the outer element: margin, width and placement, never its look."
10148
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
+ },
10149
10265
  {
10150
10266
  "name": "defaultOpen",
10151
10267
  "type": "boolean",
@@ -10207,7 +10323,7 @@
10207
10323
  },
10208
10324
  {
10209
10325
  "name": "ResponseMetrics",
10210
- "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.",
10211
10327
  "props": [
10212
10328
  {
10213
10329
  "name": "className",
@@ -10221,7 +10337,7 @@
10221
10337
  "type": "string | null",
10222
10338
  "required": false,
10223
10339
  "default": null,
10224
- "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\"."
10225
10341
  },
10226
10342
  {
10227
10343
  "name": "duration",
@@ -10263,7 +10379,7 @@
10263
10379
  "type": "number | null",
10264
10380
  "required": false,
10265
10381
  "default": null,
10266
- "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)."
10267
10383
  },
10268
10384
  {
10269
10385
  "name": "size",
@@ -10277,7 +10393,7 @@
10277
10393
  "type": "number",
10278
10394
  "required": false,
10279
10395
  "default": null,
10280
- "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."
10281
10397
  },
10282
10398
  {
10283
10399
  "name": "timeToFirstToken",
@@ -10291,7 +10407,7 @@
10291
10407
  },
10292
10408
  {
10293
10409
  "name": "ResponseView",
10294
- "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.",
10295
10411
  "props": [
10296
10412
  {
10297
10413
  "name": "aria-label",
@@ -10326,7 +10442,7 @@
10326
10442
  "type": "ReactNode",
10327
10443
  "required": false,
10328
10444
  "default": null,
10329
- "description": "Under the response: its metrics, actions."
10445
+ "description": "Under the response, on its text line: its metrics, actions."
10330
10446
  },
10331
10447
  {
10332
10448
  "name": "incompleteReason",
@@ -10347,7 +10463,7 @@
10347
10463
  "type": "(() => void)",
10348
10464
  "required": false,
10349
10465
  "default": null,
10350
- "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."
10351
10467
  },
10352
10468
  {
10353
10469
  "name": "reasoning",
@@ -10410,7 +10526,7 @@
10410
10526
  },
10411
10527
  {
10412
10528
  "name": "UserMessage",
10413
- "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.",
10414
10530
  "props": [
10415
10531
  {
10416
10532
  "name": "children",
@@ -10581,7 +10697,7 @@
10581
10697
  },
10582
10698
  {
10583
10699
  "name": "Popover",
10584
- "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.",
10585
10701
  "props": [
10586
10702
  {
10587
10703
  "name": "children",
@@ -11155,7 +11271,7 @@
11155
11271
  "components": [
11156
11272
  {
11157
11273
  "name": "ResourceList",
11158
- "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.",
11159
11275
  "props": [
11160
11276
  {
11161
11277
  "name": "aria-label",
@@ -11197,7 +11313,7 @@
11197
11313
  "type": "string",
11198
11314
  "required": false,
11199
11315
  "default": null,
11200
- "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."
11201
11317
  },
11202
11318
  {
11203
11319
  "name": "onOpen",
@@ -11238,7 +11354,7 @@
11238
11354
  "components": [
11239
11355
  {
11240
11356
  "name": "ScrollArea",
11241
- "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.",
11242
11358
  "props": [
11243
11359
  {
11244
11360
  "name": "children",
@@ -11285,7 +11401,7 @@
11285
11401
  "orientation": {
11286
11402
  "vertical": "Scrolls up and down; the content fades at an edge with more to scroll to (default)",
11287
11403
  "horizontal": "Scrolls sideways",
11288
- "both": "Both directions"
11404
+ "both": "Both directions; the content fades at every edge with more to scroll to"
11289
11405
  }
11290
11406
  },
11291
11407
  "defaults": {
@@ -11691,7 +11807,7 @@
11691
11807
  "type": "ReactNode",
11692
11808
  "required": false,
11693
11809
  "default": null,
11694
- "description": "Defaults to \"Select\" in the provider's language."
11810
+ "description": "Defaults to \"Not set\" in the provider's language."
11695
11811
  },
11696
11812
  {
11697
11813
  "name": "required",
@@ -11992,7 +12108,7 @@
11992
12108
  "type": "ReactNode",
11993
12109
  "required": true,
11994
12110
  "default": null,
11995
- "description": "The sheet's heading, also its accessible name."
12111
+ "description": "The sheet's heading, also its accessible name; a long one wraps."
11996
12112
  },
11997
12113
  {
11998
12114
  "name": "actions",
@@ -12027,7 +12143,7 @@
12027
12143
  "type": "boolean",
12028
12144
  "required": false,
12029
12145
  "default": null,
12030
- "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."
12031
12147
  },
12032
12148
  {
12033
12149
  "name": "onOpenChange",
@@ -12055,14 +12171,14 @@
12055
12171
  "type": "\"md\" | \"sm\" | \"lg\"",
12056
12172
  "required": false,
12057
12173
  "default": null,
12058
- "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."
12059
12175
  },
12060
12176
  {
12061
12177
  "name": "subtitle",
12062
12178
  "type": "ReactNode",
12063
12179
  "required": false,
12064
12180
  "default": null,
12065
- "description": "A mono subtitle for ids: `req_01J…`."
12181
+ "description": "A mono subtitle for ids, shown whole: `req_01J…`."
12066
12182
  },
12067
12183
  {
12068
12184
  "name": "trigger",
@@ -12181,7 +12297,7 @@
12181
12297
  "components": [
12182
12298
  {
12183
12299
  "name": "Skeleton",
12184
- "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.",
12185
12301
  "props": [
12186
12302
  {
12187
12303
  "name": "shape",
@@ -12346,7 +12462,7 @@
12346
12462
  "SLIDER": {
12347
12463
  "axes": {
12348
12464
  "size": {
12349
- "md": "A 4px track in a 20px hit area (default)"
12465
+ "md": "A 4px track in a 32px hit area (default)"
12350
12466
  }
12351
12467
  },
12352
12468
  "defaults": {
@@ -12425,7 +12541,7 @@
12425
12541
  },
12426
12542
  {
12427
12543
  "name": "StatGrid",
12428
- "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.",
12429
12545
  "props": [
12430
12546
  {
12431
12547
  "name": "children",
@@ -12474,7 +12590,7 @@
12474
12590
  "type": "{ value: number; better?: \"up\" | \"down\"; }",
12475
12591
  "required": false,
12476
12592
  "default": null,
12477
- "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."
12478
12594
  },
12479
12595
  {
12480
12596
  "name": "className",
@@ -12564,7 +12680,7 @@
12564
12680
  "type": "\"md\" | \"sm\"",
12565
12681
  "required": false,
12566
12682
  "default": "md",
12567
- "description": "The text size."
12683
+ "description": "The text size: 14px, or 13px (`sm`) with a 14px icon."
12568
12684
  },
12569
12685
  {
12570
12686
  "name": "tone",
@@ -12606,14 +12722,14 @@
12606
12722
  "type": "\"md\" | \"sm\"",
12607
12723
  "required": false,
12608
12724
  "default": "md",
12609
- "description": "The dot's size."
12725
+ "description": "The text size: 14px, or 13px (`sm`) with a 14px icon."
12610
12726
  },
12611
12727
  {
12612
12728
  "name": "tone",
12613
12729
  "type": "\"neutral\" | \"success\" | \"warning\" | \"danger\" | \"info\"",
12614
12730
  "required": false,
12615
12731
  "default": "neutral",
12616
- "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."
12617
12733
  }
12618
12734
  ],
12619
12735
  "file": "src/components/status-dot/status-dot.tsx"
@@ -12794,7 +12910,7 @@
12794
12910
  "type": "string",
12795
12911
  "required": false,
12796
12912
  "default": null,
12797
- "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."
12798
12914
  },
12799
12915
  {
12800
12916
  "name": "id",
@@ -12815,7 +12931,7 @@
12815
12931
  "type": "boolean",
12816
12932
  "required": false,
12817
12933
  "default": null,
12818
- "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."
12819
12935
  },
12820
12936
  {
12821
12937
  "name": "name",
@@ -12871,7 +12987,7 @@
12871
12987
  "components": [
12872
12988
  {
12873
12989
  "name": "Table",
12874
- "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.",
12875
12991
  "props": [
12876
12992
  {
12877
12993
  "name": "density",
@@ -13011,8 +13127,8 @@
13011
13127
  "PILL_TABS": {
13012
13128
  "axes": {
13013
13129
  "variant": {
13014
- "underline": "Underline tabs for detail pages: 40px, a 2px ink indicator that slides",
13015
- "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"
13016
13132
  }
13017
13133
  },
13018
13134
  "defaults": {
@@ -13022,8 +13138,8 @@
13022
13138
  "TABS": {
13023
13139
  "axes": {
13024
13140
  "variant": {
13025
- "underline": "Underline tabs for detail pages: 40px, a 2px ink indicator that slides",
13026
- "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"
13027
13143
  }
13028
13144
  },
13029
13145
  "defaults": {
@@ -13067,14 +13183,14 @@
13067
13183
  "type": "boolean",
13068
13184
  "required": false,
13069
13185
  "default": null,
13070
- "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."
13071
13187
  },
13072
13188
  {
13073
13189
  "name": "onClick",
13074
13190
  "type": "((e: MouseEvent<HTMLElement, MouseEvent>) => void)",
13075
13191
  "required": false,
13076
13192
  "default": null,
13077
- "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."
13078
13194
  },
13079
13195
  {
13080
13196
  "name": "onRemove",
@@ -13088,7 +13204,7 @@
13088
13204
  "type": "boolean",
13089
13205
  "required": false,
13090
13206
  "default": null,
13091
- "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."
13092
13208
  },
13093
13209
  {
13094
13210
  "name": "removeLabel",
@@ -13144,14 +13260,14 @@
13144
13260
  "type": "boolean",
13145
13261
  "required": false,
13146
13262
  "default": null,
13147
- "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."
13148
13264
  },
13149
13265
  {
13150
13266
  "name": "onClick",
13151
13267
  "type": "((e: MouseEvent<HTMLElement, MouseEvent>) => void)",
13152
13268
  "required": false,
13153
13269
  "default": null,
13154
- "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."
13155
13271
  },
13156
13272
  {
13157
13273
  "name": "onRemove",
@@ -13165,7 +13281,7 @@
13165
13281
  "type": "boolean",
13166
13282
  "required": false,
13167
13283
  "default": null,
13168
- "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."
13169
13285
  },
13170
13286
  {
13171
13287
  "name": "removeLabel",
@@ -13261,7 +13377,7 @@
13261
13377
  "type": "boolean",
13262
13378
  "required": false,
13263
13379
  "default": null,
13264
- "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."
13265
13381
  },
13266
13382
  {
13267
13383
  "name": "variant",
@@ -13368,7 +13484,7 @@
13368
13484
  "type": "number",
13369
13485
  "required": false,
13370
13486
  "default": null,
13371
- "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."
13372
13488
  },
13373
13489
  {
13374
13490
  "name": "width",
@@ -13585,7 +13701,7 @@
13585
13701
  "components": [
13586
13702
  {
13587
13703
  "name": "Timeline",
13588
- "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.",
13589
13705
  "props": [
13590
13706
  {
13591
13707
  "name": "events",
@@ -13643,7 +13759,7 @@
13643
13759
  "type": "number",
13644
13760
  "required": false,
13645
13761
  "default": "5000",
13646
- "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."
13647
13763
  }
13648
13764
  ],
13649
13765
  "file": "src/components/toast/toast.tsx"
@@ -13671,7 +13787,7 @@
13671
13787
  "type": "boolean",
13672
13788
  "required": false,
13673
13789
  "default": null,
13674
- "description": "Shows a close button."
13790
+ "description": "Shows the close button at its end, as a toast that stays until dismissed has."
13675
13791
  },
13676
13792
  {
13677
13793
  "name": "data-force",
@@ -13699,7 +13815,7 @@
13699
13815
  },
13700
13816
  {
13701
13817
  "name": "Toaster",
13702
- "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.",
13703
13819
  "props": [
13704
13820
  {
13705
13821
  "name": "limit",
@@ -13713,7 +13829,7 @@
13713
13829
  "type": "number",
13714
13830
  "required": false,
13715
13831
  "default": "5000",
13716
- "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."
13717
13833
  }
13718
13834
  ],
13719
13835
  "file": "src/components/toast/toast.tsx"
@@ -13744,7 +13860,7 @@
13744
13860
  "components": [
13745
13861
  {
13746
13862
  "name": "TableOfContents",
13747
- "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.",
13748
13864
  "props": [
13749
13865
  {
13750
13866
  "name": "items",
@@ -13783,7 +13899,7 @@
13783
13899
  "axes": {
13784
13900
  "state": {
13785
13901
  "default": "A heading",
13786
- "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)"
13787
13903
  }
13788
13904
  },
13789
13905
  "defaults": {
@@ -13799,7 +13915,7 @@
13799
13915
  "components": [
13800
13916
  {
13801
13917
  "name": "Toolbar",
13802
- "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.",
13803
13919
  "props": [
13804
13920
  {
13805
13921
  "name": "aria-label",
@@ -13823,7 +13939,7 @@
13823
13939
  "TOOLBAR": {
13824
13940
  "axes": {
13825
13941
  "size": {
13826
- "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",
13827
13943
  "inset": "48px without side padding, inside padded content"
13828
13944
  }
13829
13945
  },
@@ -13840,7 +13956,7 @@
13840
13956
  "components": [
13841
13957
  {
13842
13958
  "name": "Tooltip",
13843
- "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.",
13844
13960
  "props": [
13845
13961
  {
13846
13962
  "name": "children",
@@ -13896,7 +14012,7 @@
13896
14012
  "type": "\"pill\" | \"multiline\"",
13897
14013
  "required": false,
13898
14014
  "default": "pill",
13899
- "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."
13900
14016
  },
13901
14017
  {
13902
14018
  "name": "shortcut",
@@ -13924,7 +14040,7 @@
13924
14040
  },
13925
14041
  {
13926
14042
  "name": "TooltipProvider",
13927
- "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.",
13928
14044
  "props": [
13929
14045
  {
13930
14046
  "name": "children",