@cloudflare/kumo 1.19.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/CHANGELOG.md +248 -0
  2. package/ai/component-registry.json +764 -131
  3. package/ai/component-registry.md +1161 -163
  4. package/ai/schemas.ts +42 -14
  5. package/dist/.build-complete +1 -1
  6. package/dist/ai/schemas.d.ts +153 -21
  7. package/dist/ai/schemas.d.ts.map +1 -1
  8. package/dist/ai/schemas.js +1994 -1956
  9. package/dist/ai/schemas.js.map +1 -1
  10. package/dist/blocks-source/resource-list/resource-list.tsx +1 -1
  11. package/dist/chunks/Legend-ibjxhfm9pn2vrb6f.js +430 -0
  12. package/dist/chunks/Legend-ibjxhfm9pn2vrb6f.js.map +1 -0
  13. package/dist/chunks/autocomplete-48aq0d244bs2e8zv.js +174 -0
  14. package/dist/chunks/autocomplete-48aq0d244bs2e8zv.js.map +1 -0
  15. package/dist/chunks/{breadcrumbs-ge20hcb3o5spswrk.js → breadcrumbs-cxcwf2l1ki3ffg5d.js} +2 -2
  16. package/dist/chunks/{breadcrumbs-ge20hcb3o5spswrk.js.map → breadcrumbs-cxcwf2l1ki3ffg5d.js.map} +1 -1
  17. package/dist/chunks/{button-oaqi7ykdisyskoos.js → button-6by9ntsa3nj553mq.js} +23 -24
  18. package/dist/chunks/button-6by9ntsa3nj553mq.js.map +1 -0
  19. package/dist/chunks/checkbox-hvxfvhtx1qjo2mww.js +210 -0
  20. package/dist/chunks/checkbox-hvxfvhtx1qjo2mww.js.map +1 -0
  21. package/dist/chunks/{clipboard-text-dxczqon3d27xp6f0.js → clipboard-text-hswydzx3iql369sd.js} +45 -41
  22. package/dist/chunks/{clipboard-text-dxczqon3d27xp6f0.js.map → clipboard-text-hswydzx3iql369sd.js.map} +1 -1
  23. package/dist/chunks/{code-cz0w1y5z4h29a9eg.js → code-f9v1ikwhekqw274q.js} +4 -4
  24. package/dist/chunks/{code-cz0w1y5z4h29a9eg.js.map → code-f9v1ikwhekqw274q.js.map} +1 -1
  25. package/dist/chunks/collapsible-k8urhi16pg90jvxa.js +71 -0
  26. package/dist/chunks/collapsible-k8urhi16pg90jvxa.js.map +1 -0
  27. package/dist/chunks/{combobox-eaowwt1xr4d23gsn.js → combobox-fq36ye0hstote16x.js} +90 -78
  28. package/dist/chunks/combobox-fq36ye0hstote16x.js.map +1 -0
  29. package/dist/chunks/{command-palette-maqtbmpfev9mysqd.js → command-palette-md65owxt5hv4rt9r.js} +68 -68
  30. package/dist/chunks/command-palette-md65owxt5hv4rt9r.js.map +1 -0
  31. package/dist/chunks/{date-range-picker-j318zxjyqz4o3dak.js → date-range-picker-o8uyril1kogvhoei.js} +11 -11
  32. package/dist/chunks/{date-range-picker-j318zxjyqz4o3dak.js.map → date-range-picker-o8uyril1kogvhoei.js.map} +1 -1
  33. package/dist/chunks/{dialog-e3m5bhs7fds26p9y.js → dialog-k3f1fbam6nt96k8x.js} +3 -3
  34. package/dist/chunks/{dialog-e3m5bhs7fds26p9y.js.map → dialog-k3f1fbam6nt96k8x.js.map} +1 -1
  35. package/dist/chunks/{dropdown-ewte287db3vyt8t5.js → dropdown-zbax0zowy6m9zhmt.js} +87 -87
  36. package/dist/chunks/dropdown-zbax0zowy6m9zhmt.js.map +1 -0
  37. package/dist/chunks/{empty-dr1eckm2z40euns6.js → empty-b82oer7npkhtkx7k.js} +14 -14
  38. package/dist/chunks/{empty-dr1eckm2z40euns6.js.map → empty-b82oer7npkhtkx7k.js.map} +1 -1
  39. package/dist/chunks/{field-bo5gmna16odrrb1q.js → field-c0wf94plit2gci59.js} +7 -7
  40. package/dist/chunks/{field-bo5gmna16odrrb1q.js.map → field-c0wf94plit2gci59.js.map} +1 -1
  41. package/dist/chunks/{input-area-jkkkjej6luumrqpa.js → input-area-bkyzu6f7gsck479h.js} +4 -4
  42. package/dist/chunks/{input-area-jkkkjej6luumrqpa.js.map → input-area-bkyzu6f7gsck479h.js.map} +1 -1
  43. package/dist/chunks/input-group-bidweffa0zyg8gt0.js +505 -0
  44. package/dist/chunks/input-group-bidweffa0zyg8gt0.js.map +1 -0
  45. package/dist/chunks/{input-cw05pbqdburghkus.js → input-ncfowphv81yq7fyy.js} +44 -44
  46. package/dist/chunks/input-ncfowphv81yq7fyy.js.map +1 -0
  47. package/dist/chunks/{label-cvyvbqmt4mt757ff.js → label-c3h9i3y4wiccelt7.js} +22 -22
  48. package/dist/chunks/{label-cvyvbqmt4mt757ff.js.map → label-c3h9i3y4wiccelt7.js.map} +1 -1
  49. package/dist/chunks/{layer-card-ljqth3yxgnk04v2o.js → layer-card-ikm31xemd70w3lru.js} +5 -5
  50. package/dist/chunks/{layer-card-ljqth3yxgnk04v2o.js.map → layer-card-ikm31xemd70w3lru.js.map} +1 -1
  51. package/dist/chunks/{link-fjnhtxvfe5ieamjf.js → link-kt74pxkud4olmcer.js} +4 -4
  52. package/dist/chunks/{link-fjnhtxvfe5ieamjf.js.map → link-kt74pxkud4olmcer.js.map} +1 -1
  53. package/dist/chunks/menubar-hwev159bm4rw9ixk.js +96 -0
  54. package/dist/chunks/menubar-hwev159bm4rw9ixk.js.map +1 -0
  55. package/dist/chunks/{meter-duj3micor1lqj3y2.js → meter-n34a7yb8c3rim26i.js} +3 -3
  56. package/dist/chunks/{meter-duj3micor1lqj3y2.js.map → meter-n34a7yb8c3rim26i.js.map} +1 -1
  57. package/dist/chunks/{pagination-olaypvwr8swsmn8m.js → pagination-jb3mncivbwsoi1se.js} +56 -56
  58. package/dist/chunks/pagination-jb3mncivbwsoi1se.js.map +1 -0
  59. package/dist/chunks/{popover-nv9cmzbo7mf6bky0.js → popover-iayd9ya5yhujz6ve.js} +5 -5
  60. package/dist/chunks/{popover-nv9cmzbo7mf6bky0.js.map → popover-iayd9ya5yhujz6ve.js.map} +1 -1
  61. package/dist/chunks/{radio-ihxbe37us2jnqtzf.js → radio-datzh3pilz8ojak1.js} +86 -74
  62. package/dist/chunks/radio-datzh3pilz8ojak1.js.map +1 -0
  63. package/dist/chunks/{select-nx6ded5swra74iar.js → select-g261chvosodu22i8.js} +64 -62
  64. package/dist/chunks/select-g261chvosodu22i8.js.map +1 -0
  65. package/dist/chunks/{sensitive-input-00fujb510rrn61v9.js → sensitive-input-cijagk551mesdtk4.js} +42 -42
  66. package/dist/chunks/sensitive-input-cijagk551mesdtk4.js.map +1 -0
  67. package/dist/chunks/{sidebar-ltbfius1eolkl8tb.js → sidebar-kb9kykqfgy5yzqwr.js} +132 -129
  68. package/dist/chunks/sidebar-kb9kykqfgy5yzqwr.js.map +1 -0
  69. package/dist/chunks/{surface-dfgurg5eu3et4vw1.js → surface-k0e8mq1x00b7i8r6.js} +2 -2
  70. package/dist/chunks/{surface-dfgurg5eu3et4vw1.js.map → surface-k0e8mq1x00b7i8r6.js.map} +1 -1
  71. package/dist/chunks/{switch-fbv3iawqo3o3jgap.js → switch-jdfsr3j3oa1qxegw.js} +86 -78
  72. package/dist/chunks/switch-jdfsr3j3oa1qxegw.js.map +1 -0
  73. package/dist/chunks/{table-olwwulga2l3hdwlx.js → table-iudje0lva0z68jto.js} +89 -71
  74. package/dist/chunks/table-iudje0lva0z68jto.js.map +1 -0
  75. package/dist/chunks/table-of-contents-fzyv7uhnnyr13dqu.js +102 -0
  76. package/dist/chunks/table-of-contents-fzyv7uhnnyr13dqu.js.map +1 -0
  77. package/dist/chunks/{tabs-lohcglgppp6gj0hp.js → tabs-mkhf1uemgr3ij0ps.js} +20 -20
  78. package/dist/chunks/{tabs-lohcglgppp6gj0hp.js.map → tabs-mkhf1uemgr3ij0ps.js.map} +1 -1
  79. package/dist/chunks/{text-nmyi1rkwdj37f30f.js → text-f7t467waymhb30sx.js} +8 -8
  80. package/dist/chunks/text-f7t467waymhb30sx.js.map +1 -0
  81. package/dist/chunks/{toast-dg52x89yd231mxhe.js → toast-h573o0tc7tefivk2.js} +11 -11
  82. package/dist/chunks/toast-h573o0tc7tefivk2.js.map +1 -0
  83. package/dist/chunks/{tooltip-hikjvdbg3xghnq1x.js → tooltip-odudhkxe282wxinq.js} +5 -5
  84. package/dist/chunks/{tooltip-hikjvdbg3xghnq1x.js.map → tooltip-odudhkxe282wxinq.js.map} +1 -1
  85. package/dist/chunks/vendor-base-ui-ie71jahf0czyf58j.js +24638 -0
  86. package/dist/chunks/vendor-base-ui-ie71jahf0czyf58j.js.map +1 -0
  87. package/dist/chunks/vendor-floating-ui-dwag5e88viikh2zs.js +1311 -0
  88. package/dist/chunks/vendor-floating-ui-dwag5e88viikh2zs.js.map +1 -0
  89. package/dist/chunks/vendor-utils-ixnhxmehwihk5tr7.js +534 -0
  90. package/dist/chunks/vendor-utils-ixnhxmehwihk5tr7.js.map +1 -0
  91. package/dist/code.js +31 -31
  92. package/dist/code.js.map +1 -1
  93. package/dist/components/autocomplete.js +9 -0
  94. package/dist/components/autocomplete.js.map +1 -0
  95. package/dist/components/breadcrumbs.js +1 -1
  96. package/dist/components/button.js +1 -1
  97. package/dist/components/chart.js +1 -1
  98. package/dist/components/checkbox.js +1 -1
  99. package/dist/components/clipboard-text.js +1 -1
  100. package/dist/components/code.js +1 -1
  101. package/dist/components/collapsible.js +1 -1
  102. package/dist/components/combobox.js +1 -1
  103. package/dist/components/command-palette.js +1 -1
  104. package/dist/components/date-range-picker.js +1 -1
  105. package/dist/components/dialog.js +1 -1
  106. package/dist/components/dropdown.js +1 -1
  107. package/dist/components/empty.js +1 -1
  108. package/dist/components/field.js +1 -1
  109. package/dist/components/input-group.js +8 -0
  110. package/dist/components/input-group.js.map +1 -0
  111. package/dist/components/input.js +9 -7
  112. package/dist/components/label.js +1 -1
  113. package/dist/components/layer-card.js +1 -1
  114. package/dist/components/link.js +1 -1
  115. package/dist/components/menubar.js +1 -1
  116. package/dist/components/meter.js +1 -1
  117. package/dist/components/pagination.js +1 -1
  118. package/dist/components/popover.js +1 -1
  119. package/dist/components/radio.js +1 -1
  120. package/dist/components/select.js +1 -1
  121. package/dist/components/sensitive-input.js +1 -1
  122. package/dist/components/sidebar.js +1 -1
  123. package/dist/components/surface.js +1 -1
  124. package/dist/components/switch.js +1 -1
  125. package/dist/components/table-of-contents.js +1 -1
  126. package/dist/components/table.js +1 -1
  127. package/dist/components/tabs.js +1 -1
  128. package/dist/components/text.js +1 -1
  129. package/dist/components/toast.js +2 -2
  130. package/dist/components/tooltip.js +1 -1
  131. package/dist/index.js +149 -144
  132. package/dist/index.js.map +1 -1
  133. package/dist/primitives/accordion.js +1 -1
  134. package/dist/primitives/alert-dialog.js +1 -1
  135. package/dist/primitives/autocomplete.js +1 -1
  136. package/dist/primitives/avatar.js +1 -1
  137. package/dist/primitives/button.js +1 -1
  138. package/dist/primitives/checkbox-group.js +1 -1
  139. package/dist/primitives/checkbox.js +1 -1
  140. package/dist/primitives/collapsible.js +1 -1
  141. package/dist/primitives/combobox.js +1 -1
  142. package/dist/primitives/context-menu.js +1 -1
  143. package/dist/primitives/csp-provider.js +1 -1
  144. package/dist/primitives/dialog.js +1 -1
  145. package/dist/primitives/direction-provider.js +1 -1
  146. package/dist/primitives/drawer.js +2 -2
  147. package/dist/primitives/field.js +1 -1
  148. package/dist/primitives/fieldset.js +1 -1
  149. package/dist/primitives/form.js +1 -1
  150. package/dist/primitives/input.js +1 -1
  151. package/dist/primitives/menu.js +1 -1
  152. package/dist/primitives/menubar.js +1 -1
  153. package/dist/primitives/meter.js +1 -1
  154. package/dist/primitives/navigation-menu.js +1 -1
  155. package/dist/primitives/number-field.js +1 -1
  156. package/dist/primitives/otp-field.js +6 -0
  157. package/dist/primitives/otp-field.js.map +1 -0
  158. package/dist/primitives/popover.js +1 -1
  159. package/dist/primitives/preview-card.js +2 -2
  160. package/dist/primitives/progress.js +1 -1
  161. package/dist/primitives/radio-group.js +1 -1
  162. package/dist/primitives/radio.js +1 -1
  163. package/dist/primitives/scroll-area.js +1 -1
  164. package/dist/primitives/select.js +1 -1
  165. package/dist/primitives/separator.js +1 -1
  166. package/dist/primitives/slider.js +1 -1
  167. package/dist/primitives/switch.js +1 -1
  168. package/dist/primitives/tabs.js +1 -1
  169. package/dist/primitives/toast.js +1 -1
  170. package/dist/primitives/toggle-group.js +1 -1
  171. package/dist/primitives/toggle.js +1 -1
  172. package/dist/primitives/toolbar.js +1 -1
  173. package/dist/primitives/tooltip.js +1 -1
  174. package/dist/primitives.js +22 -21
  175. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  176. package/dist/scripts/theme-generator/config.js +21 -4
  177. package/dist/scripts/theme-generator/config.js.map +1 -1
  178. package/dist/src/components/autocomplete/autocomplete.d.ts +180 -0
  179. package/dist/src/components/autocomplete/autocomplete.d.ts.map +1 -0
  180. package/dist/src/components/autocomplete/index.d.ts +2 -0
  181. package/dist/src/components/autocomplete/index.d.ts.map +1 -0
  182. package/dist/src/components/button/button.d.ts +3 -3
  183. package/dist/src/components/button/button.d.ts.map +1 -1
  184. package/dist/src/components/chart/Color.d.ts +36 -52
  185. package/dist/src/components/chart/Color.d.ts.map +1 -1
  186. package/dist/src/components/checkbox/checkbox.d.ts +37 -14
  187. package/dist/src/components/checkbox/checkbox.d.ts.map +1 -1
  188. package/dist/src/components/checkbox/index.d.ts +1 -1
  189. package/dist/src/components/checkbox/index.d.ts.map +1 -1
  190. package/dist/src/components/clipboard-text/clipboard-text.d.ts.map +1 -1
  191. package/dist/src/components/code/code.d.ts +2 -2
  192. package/dist/src/components/collapsible/collapsible.d.ts +77 -40
  193. package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
  194. package/dist/src/components/collapsible/index.d.ts +1 -1
  195. package/dist/src/components/collapsible/index.d.ts.map +1 -1
  196. package/dist/src/components/combobox/combobox.d.ts +3 -1
  197. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  198. package/dist/src/components/command-palette/command-palette.d.ts +2 -11
  199. package/dist/src/components/command-palette/command-palette.d.ts.map +1 -1
  200. package/dist/src/components/command-palette/index.d.ts +1 -1
  201. package/dist/src/components/command-palette/index.d.ts.map +1 -1
  202. package/dist/src/components/command-palette/types.d.ts +13 -1
  203. package/dist/src/components/command-palette/types.d.ts.map +1 -1
  204. package/dist/src/components/input/index.d.ts +16 -1
  205. package/dist/src/components/input/index.d.ts.map +1 -1
  206. package/dist/src/components/input/input.d.ts +2 -2
  207. package/dist/src/components/input/input.d.ts.map +1 -1
  208. package/dist/src/components/input-group/context.d.ts +96 -0
  209. package/dist/src/components/input-group/context.d.ts.map +1 -0
  210. package/dist/src/components/input-group/index.d.ts +2 -0
  211. package/dist/src/components/input-group/index.d.ts.map +1 -0
  212. package/dist/src/components/input-group/input-group-addon.d.ts +15 -0
  213. package/dist/src/components/input-group/input-group-addon.d.ts.map +1 -0
  214. package/dist/src/components/input-group/input-group-button.d.ts +36 -0
  215. package/dist/src/components/input-group/input-group-button.d.ts.map +1 -0
  216. package/dist/src/components/input-group/input-group-input.d.ts +9 -0
  217. package/dist/src/components/input-group/input-group-input.d.ts.map +1 -0
  218. package/dist/src/components/input-group/input-group-suffix.d.ts +13 -0
  219. package/dist/src/components/input-group/input-group-suffix.d.ts.map +1 -0
  220. package/dist/src/components/input-group/input-group.d.ts +43 -0
  221. package/dist/src/components/input-group/input-group.d.ts.map +1 -0
  222. package/dist/src/components/menubar/menubar.d.ts.map +1 -1
  223. package/dist/src/components/radio/index.d.ts +1 -1
  224. package/dist/src/components/radio/index.d.ts.map +1 -1
  225. package/dist/src/components/radio/radio.d.ts +43 -7
  226. package/dist/src/components/radio/radio.d.ts.map +1 -1
  227. package/dist/src/components/select/select.d.ts +3 -3
  228. package/dist/src/components/select/select.d.ts.map +1 -1
  229. package/dist/src/components/sensitive-input/sensitive-input.d.ts +2 -2
  230. package/dist/src/components/sidebar/sidebar.d.ts.map +1 -1
  231. package/dist/src/components/switch/index.d.ts +1 -1
  232. package/dist/src/components/switch/index.d.ts.map +1 -1
  233. package/dist/src/components/switch/switch.d.ts +31 -3
  234. package/dist/src/components/switch/switch.d.ts.map +1 -1
  235. package/dist/src/components/table/table.d.ts +17 -2
  236. package/dist/src/components/table/table.d.ts.map +1 -1
  237. package/dist/src/components/table-of-contents/table-of-contents.d.ts +9 -7
  238. package/dist/src/components/table-of-contents/table-of-contents.d.ts.map +1 -1
  239. package/dist/src/components/text/text.d.ts +34 -6
  240. package/dist/src/components/text/text.d.ts.map +1 -1
  241. package/dist/src/components/text/text.type-spec.d.ts +44 -0
  242. package/dist/src/components/text/text.type-spec.d.ts.map +1 -0
  243. package/dist/src/components/toast/toast.d.ts +2 -2
  244. package/dist/src/components/toast/toast.d.ts.map +1 -1
  245. package/dist/src/index.d.ts +8 -6
  246. package/dist/src/index.d.ts.map +1 -1
  247. package/dist/src/primitives/index.d.ts +1 -0
  248. package/dist/src/primitives/index.d.ts.map +1 -1
  249. package/dist/src/primitives/otp-field.d.ts +13 -0
  250. package/dist/src/primitives/otp-field.d.ts.map +1 -0
  251. package/dist/styles/kumo-binding.css +18 -0
  252. package/dist/styles/kumo-standalone.css +1 -1
  253. package/dist/styles/kumo.css +2 -2
  254. package/dist/styles/theme-kumo.css +15 -8
  255. package/package.json +14 -2
  256. package/scripts/component-registry/discovery.ts +1 -0
  257. package/scripts/component-registry/index.test.ts +265 -0
  258. package/scripts/component-registry/index.ts +14 -0
  259. package/scripts/component-registry/metadata.ts +56 -8
  260. package/scripts/component-registry/sub-components.ts +81 -50
  261. package/scripts/component-registry/types.ts +2 -0
  262. package/scripts/theme-generator/config.ts +19 -9
  263. package/dist/chunks/Legend-ks7se6149vsa3tze.js +0 -430
  264. package/dist/chunks/Legend-ks7se6149vsa3tze.js.map +0 -1
  265. package/dist/chunks/button-oaqi7ykdisyskoos.js.map +0 -1
  266. package/dist/chunks/checkbox-mwgmohffm22ut13s.js +0 -211
  267. package/dist/chunks/checkbox-mwgmohffm22ut13s.js.map +0 -1
  268. package/dist/chunks/collapsible-jhzee3ks51d3xowb.js +0 -58
  269. package/dist/chunks/collapsible-jhzee3ks51d3xowb.js.map +0 -1
  270. package/dist/chunks/combobox-eaowwt1xr4d23gsn.js.map +0 -1
  271. package/dist/chunks/command-palette-maqtbmpfev9mysqd.js.map +0 -1
  272. package/dist/chunks/dropdown-ewte287db3vyt8t5.js.map +0 -1
  273. package/dist/chunks/input-cw05pbqdburghkus.js.map +0 -1
  274. package/dist/chunks/input-group-lfugneuz71g42n0w.js +0 -111
  275. package/dist/chunks/input-group-lfugneuz71g42n0w.js.map +0 -1
  276. package/dist/chunks/menubar-e5e4zwfagr0wx023.js +0 -96
  277. package/dist/chunks/menubar-e5e4zwfagr0wx023.js.map +0 -1
  278. package/dist/chunks/pagination-olaypvwr8swsmn8m.js.map +0 -1
  279. package/dist/chunks/radio-ihxbe37us2jnqtzf.js.map +0 -1
  280. package/dist/chunks/select-nx6ded5swra74iar.js.map +0 -1
  281. package/dist/chunks/sensitive-input-00fujb510rrn61v9.js.map +0 -1
  282. package/dist/chunks/sidebar-ltbfius1eolkl8tb.js.map +0 -1
  283. package/dist/chunks/switch-fbv3iawqo3o3jgap.js.map +0 -1
  284. package/dist/chunks/table-of-contents-f813ivi7ta23vqdm.js +0 -88
  285. package/dist/chunks/table-of-contents-f813ivi7ta23vqdm.js.map +0 -1
  286. package/dist/chunks/table-olwwulga2l3hdwlx.js.map +0 -1
  287. package/dist/chunks/text-nmyi1rkwdj37f30f.js.map +0 -1
  288. package/dist/chunks/toast-dg52x89yd231mxhe.js.map +0 -1
  289. package/dist/chunks/vendor-base-ui-m5pz3e8c4grg5qmj.js +0 -22813
  290. package/dist/chunks/vendor-base-ui-m5pz3e8c4grg5qmj.js.map +0 -1
  291. package/dist/chunks/vendor-floating-ui-gr9m6tsa1cpqwn99.js +0 -1286
  292. package/dist/chunks/vendor-floating-ui-gr9m6tsa1cpqwn99.js.map +0 -1
  293. package/dist/chunks/vendor-utils-fxk97j6xi1g42z2v.js +0 -740
  294. package/dist/chunks/vendor-utils-fxk97j6xi1g42z2v.js.map +0 -1
  295. package/dist/src/components/input/input-group.d.ts +0 -39
  296. package/dist/src/components/input/input-group.d.ts.map +0 -1
@@ -2,6 +2,266 @@
2
2
 
3
3
  > Auto-generated component metadata for AI/agent consumption.
4
4
 
5
+ ---
6
+
7
+ ### Autocomplete
8
+
9
+ Autocomplete — free-form text input with an optional filtered suggestion list. Unlike Combobox, the input value is not restricted to items in the list. Use Combobox when the selected value must come from the list. Compound component: `Autocomplete` (Root), `.InputGroup`, `.Content`, `.Item`, `.GroupLabel`, `.Group`, `.Separator`, `.List`, `.Collection`. `InputGroup` renders the text input with Input component styling. Pass a `size` prop to `InputGroup` to match the Input component sizes.
10
+
11
+ **Type:** component
12
+
13
+ **Import:** `import { Autocomplete } from "@cloudflare/kumo";`
14
+
15
+ **Category:** Other
16
+
17
+ **Props:**
18
+
19
+ - `items`: unknown[] (required)
20
+ Array of items to display in the dropdown
21
+ - `value`: string | number | string[]
22
+ The controlled input value
23
+ - `open`: boolean
24
+ Whether the popup is open (controlled)
25
+ - `children`: ReactNode
26
+ Autocomplete content (input group, popup content)
27
+ - `className`: string
28
+ Additional CSS classes
29
+ - `label`: ReactNode
30
+ Label content (enables Field wrapper)
31
+ - `required`: boolean
32
+ Whether the field is required
33
+ - `labelTooltip`: ReactNode
34
+ Tooltip content to display next to the label
35
+ - `description`: ReactNode
36
+ Helper text displayed below the field
37
+ - `error`: string | object
38
+ Error message or validation error object
39
+
40
+ **Colors (kumo tokens used):**
41
+
42
+ `bg-kumo-control`, `bg-kumo-line`, `bg-kumo-overlay`, `border-kumo-line`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-strong`
43
+
44
+ **Sub-Components:**
45
+
46
+ This is a compound component. Use these sub-components:
47
+
48
+ #### Autocomplete.InputGroup
49
+
50
+ InputGroup sub-component
51
+
52
+ Props:
53
+ - `className`: string
54
+ - `size`: KumoAutocompleteSize
55
+ - `placeholder`: string
56
+
57
+ #### Autocomplete.Content
58
+
59
+ Content sub-component
60
+
61
+ Props:
62
+ - `children`: ReactNode
63
+ - `className`: string
64
+ - `align`: AutocompleteBase.Positioner.Props["align"]
65
+ - `alignOffset`: AutocompleteBase.Positioner.Props["alignOffset"]
66
+ - `side`: AutocompleteBase.Positioner.Props["side"]
67
+ - `sideOffset`: AutocompleteBase.Positioner.Props["sideOffset"]
68
+
69
+ #### Autocomplete.Item
70
+
71
+ Item sub-component
72
+
73
+ #### Autocomplete.GroupLabel
74
+
75
+ GroupLabel sub-component
76
+
77
+ #### Autocomplete.Group
78
+
79
+ Group sub-component
80
+
81
+ #### Autocomplete.Separator
82
+
83
+ Separator sub-component
84
+
85
+ #### Autocomplete.List
86
+
87
+ List sub-component
88
+
89
+ #### Autocomplete.Empty
90
+
91
+ Empty sub-component (wraps AutocompleteBase)
92
+
93
+ #### Autocomplete.Collection
94
+
95
+ Collection sub-component (wraps AutocompleteBase)
96
+
97
+
98
+ **Examples:**
99
+
100
+ ```tsx
101
+ <Autocomplete items={fruits}>
102
+ <Autocomplete.InputGroup placeholder="Search fruits…" />
103
+ <Autocomplete.Content>
104
+ <Autocomplete.List>
105
+ {(item: string) => (
106
+ <Autocomplete.Item key={item} value={item}>
107
+ {item}
108
+ </Autocomplete.Item>
109
+ )}
110
+ </Autocomplete.List>
111
+ </Autocomplete.Content>
112
+ </Autocomplete>
113
+ ```
114
+
115
+ ```tsx
116
+ <div className="w-80">
117
+ <Autocomplete
118
+ items={countries}
119
+ label="Country"
120
+ description="Start typing to filter countries"
121
+ filter={(item: Country, query: string) =>
122
+ item.label.toLowerCase().includes(query.toLowerCase())
123
+ }
124
+ >
125
+ <Autocomplete.InputGroup placeholder="Search countries…" />
126
+ <Autocomplete.Content>
127
+ <Autocomplete.List>
128
+ {(item: Country) => (
129
+ <Autocomplete.Item key={item.code} value={item}>
130
+ {item.label}
131
+ </Autocomplete.Item>
132
+ )}
133
+ </Autocomplete.List>
134
+ </Autocomplete.Content>
135
+ </Autocomplete>
136
+ </div>
137
+ ```
138
+
139
+ ```tsx
140
+ <div className="w-80">
141
+ <Autocomplete
142
+ items={countries}
143
+ label="Country"
144
+ error={{ message: "Please enter a valid country", match: true }}
145
+ filter={(item: Country, query: string) =>
146
+ item.label.toLowerCase().includes(query.toLowerCase())
147
+ }
148
+ >
149
+ <Autocomplete.InputGroup placeholder="Search countries…" />
150
+ <Autocomplete.Content>
151
+ <Autocomplete.List>
152
+ {(item: Country) => (
153
+ <Autocomplete.Item key={item.code} value={item}>
154
+ {item.label}
155
+ </Autocomplete.Item>
156
+ )}
157
+ </Autocomplete.List>
158
+ </Autocomplete.Content>
159
+ </Autocomplete>
160
+ </div>
161
+ ```
162
+
163
+ ```tsx
164
+ <Autocomplete items={servers}>
165
+ <Autocomplete.InputGroup placeholder="Select region…" />
166
+ <Autocomplete.Content>
167
+ <Autocomplete.List>
168
+ {(group: ServerGroup) => (
169
+ <Autocomplete.Group key={group.value} items={group.items}>
170
+ <Autocomplete.GroupLabel>{group.value}</Autocomplete.GroupLabel>
171
+ <Autocomplete.Collection>
172
+ {(item: ServerLocation) => (
173
+ <Autocomplete.Item key={item.value} value={item}>
174
+ {item.label}
175
+ </Autocomplete.Item>
176
+ )}
177
+ </Autocomplete.Collection>
178
+ </Autocomplete.Group>
179
+ )}
180
+ </Autocomplete.List>
181
+ </Autocomplete.Content>
182
+ </Autocomplete>
183
+ ```
184
+
185
+ ```tsx
186
+ <div className="flex flex-wrap items-center gap-4">
187
+ <Autocomplete items={fruits.slice(0, 10)}>
188
+ <Autocomplete.InputGroup size="xs" placeholder="xs" />
189
+ <Autocomplete.Content>
190
+ <Autocomplete.List>
191
+ {(item: string) => (
192
+ <Autocomplete.Item key={item} value={item}>
193
+ {item}
194
+ </Autocomplete.Item>
195
+ )}
196
+ </Autocomplete.List>
197
+ </Autocomplete.Content>
198
+ </Autocomplete>
199
+ <Autocomplete items={fruits.slice(0, 10)}>
200
+ <Autocomplete.InputGroup size="sm" placeholder="sm" />
201
+ <Autocomplete.Content>
202
+ <Autocomplete.List>
203
+ {(item: string) => (
204
+ <Autocomplete.Item key={item} value={item}>
205
+ {item}
206
+ </Autocomplete.Item>
207
+ )}
208
+ </Autocomplete.List>
209
+ </Autocomplete.Content>
210
+ </Autocomplete>
211
+ <Autocomplete items={fruits.slice(0, 10)}>
212
+ <Autocomplete.InputGroup size="base" placeholder="base (default)" />
213
+ <Autocomplete.Content>
214
+ <Autocomplete.List>
215
+ {(item: string) => (
216
+ <Autocomplete.Item key={item} value={item}>
217
+ {item}
218
+ </Autocomplete.Item>
219
+ )}
220
+ </Autocomplete.List>
221
+ </Autocomplete.Content>
222
+ </Autocomplete>
223
+ <Autocomplete items={fruits.slice(0, 10)}>
224
+ <Autocomplete.InputGroup size="lg" placeholder="lg" />
225
+ <Autocomplete.Content>
226
+ <Autocomplete.List>
227
+ {(item: string) => (
228
+ <Autocomplete.Item key={item} value={item}>
229
+ {item}
230
+ </Autocomplete.Item>
231
+ )}
232
+ </Autocomplete.List>
233
+ </Autocomplete.Content>
234
+ </Autocomplete>
235
+ </div>
236
+ ```
237
+
238
+ ```tsx
239
+ <div className="flex flex-col gap-3 w-80">
240
+ <Autocomplete
241
+ items={fruits}
242
+ value={value}
243
+ onValueChange={(v) => setValue(v)}
244
+ >
245
+ <Autocomplete.InputGroup placeholder="Type a fruit…" />
246
+ <Autocomplete.Content>
247
+ <Autocomplete.List>
248
+ {(item: string) => (
249
+ <Autocomplete.Item key={item} value={item}>
250
+ {item}
251
+ </Autocomplete.Item>
252
+ )}
253
+ </Autocomplete.List>
254
+ </Autocomplete.Content>
255
+ </Autocomplete>
256
+ {value && (
257
+ <p className="text-sm text-kumo-subtle">
258
+ Value: <span className="text-kumo-default font-medium">{value}</span>
259
+ </p>
260
+ )}
261
+ </div>
262
+ ```
263
+
264
+
5
265
  ---
6
266
 
7
267
  ### Badge
@@ -353,10 +613,9 @@ Primary action trigger. Supports multiple variants, sizes, shapes, icons, and lo
353
613
  **State Classes:**
354
614
  - `"primary"`:
355
615
  - `hover`: `hover:bg-kumo-brand-hover`
356
- - `focus`: `focus:bg-kumo-brand-hover`
357
616
  - `disabled`: `disabled:bg-kumo-brand/50`
358
617
  - `"secondary"`:
359
- - `not-disabled`: `not-disabled:hover:border-secondary! not-disabled:hover:bg-kumo-tint`
618
+ - `not-disabled`: `not-disabled:hover:bg-kumo-tint`
360
619
  - `disabled`: `disabled:bg-kumo-base/50 disabled:!text-kumo-default/70`
361
620
  - `data-state`: `data-[state=open]:bg-kumo-base`
362
621
  - `"ghost"`:
@@ -364,7 +623,7 @@ Primary action trigger. Supports multiple variants, sizes, shapes, icons, and lo
364
623
  - `"destructive"`:
365
624
  - `hover`: `hover:bg-kumo-danger/70`
366
625
  - `"secondary-destructive"`:
367
- - `not-disabled`: `not-disabled:hover:border-secondary! not-disabled:hover:bg-kumo-base`
626
+ - `not-disabled`: `not-disabled:hover:bg-kumo-base`
368
627
  - `disabled`: `disabled:bg-kumo-base/50 disabled:!text-kumo-danger/70`
369
628
  - `data-state`: `data-[state=open]:bg-kumo-base`
370
629
  - `children`: ReactNode
@@ -383,7 +642,7 @@ Primary action trigger. Supports multiple variants, sizes, shapes, icons, and lo
383
642
 
384
643
  **Colors (kumo tokens used):**
385
644
 
386
- `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-brand-hover`, `bg-kumo-danger`, `bg-kumo-tint`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
645
+ `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-brand-hover`, `bg-kumo-danger`, `bg-kumo-tint`, `ring-kumo-brand`, `ring-kumo-focus`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
387
646
 
388
647
  **Examples:**
389
648
 
@@ -479,7 +738,7 @@ Checkbox component
479
738
 
480
739
  **State Classes:**
481
740
  - `"default"`:
482
- - `focus`: `[&:focus-within>span]:ring-kumo-hairline`
741
+ - `focus`: `[&:focus-within>span]:ring-kumo-focus`
483
742
  - `hover`: `[&:hover>span]:ring-kumo-hairline`
484
743
  - `label`: ReactNode
485
744
  Label content for the checkbox (enables built-in Field wrapper) - can be a string or any React node
@@ -499,12 +758,10 @@ Checkbox component
499
758
  Whether the field is required
500
759
  - `className`: string
501
760
  Additional class name
502
- - `onValueChange`: (checked: boolean) => void
503
- Callback when checkbox value changes
504
761
 
505
762
  **Colors (kumo tokens used):**
506
763
 
507
- `bg-kumo-base`, `bg-kumo-contrast`, `ring-kumo-contrast`, `ring-kumo-danger`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-inverse`, `text-kumo-subtle`
764
+ `bg-kumo-base`, `bg-kumo-contrast`, `ring-kumo-brand`, `ring-kumo-contrast`, `ring-kumo-danger`, `ring-kumo-focus`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-inverse`, `text-kumo-subtle`
508
765
 
509
766
  **Styling:**
510
767
 
@@ -535,7 +792,7 @@ Item sub-component
535
792
  Group sub-component
536
793
 
537
794
  Props:
538
- - `legend`: string (required)
795
+ - `legend`: string
539
796
  - `children`: ReactNode (required)
540
797
  - `error`: string
541
798
  - `description`: ReactNode
@@ -545,6 +802,14 @@ Props:
545
802
  - `controlFirst`: boolean
546
803
  - `className`: string
547
804
 
805
+ #### Checkbox.Legend
806
+
807
+ Legend sub-component
808
+
809
+ Props:
810
+ - `children`: ReactNode (required)
811
+ - `className`: string
812
+
548
813
 
549
814
  **Examples:**
550
815
 
@@ -594,6 +859,17 @@ Props:
594
859
  </Checkbox.Group>
595
860
  ```
596
861
 
862
+ ```tsx
863
+ <Checkbox.Group value={preferences} onValueChange={setPreferences}>
864
+ <Checkbox.Legend className="sr-only">
865
+ Notification preferences
866
+ </Checkbox.Legend>
867
+ <Checkbox.Item value="email" label="Email notifications" />
868
+ <Checkbox.Item value="sms" label="SMS notifications" />
869
+ <Checkbox.Item value="push" label="Push notifications" />
870
+ </Checkbox.Group>
871
+ ```
872
+
597
873
  ```tsx
598
874
  <Checkbox.Group
599
875
  legend="Required preferences"
@@ -638,7 +914,7 @@ Read-only text field with a one-click copy-to-clipboard button.
638
914
 
639
915
  **Colors (kumo tokens used):**
640
916
 
641
- `bg-kumo-base`, `border-kumo-hairline`, `outline-kumo-fill`, `text-kumo-default`
917
+ `bg-kumo-base`, `border-kumo-line`, `outline-kumo-fill`, `ring-kumo-brand`, `ring-kumo-focus`, `text-kumo-default`
642
918
 
643
919
  **Styling:**
644
920
 
@@ -1146,12 +1422,12 @@ Code component
1146
1422
 
1147
1423
  **Colors (kumo tokens used):**
1148
1424
 
1149
- `bg-kumo-base`, `border-kumo-fill`, `text-kumo-strong`
1425
+ `bg-kumo-base`, `border-kumo-fill`, `text-kumo-subtle`
1150
1426
 
1151
1427
  **Styling:**
1152
1428
 
1153
1429
  - **Dimensions:** `[object Object]`
1154
- - **Base Tokens:** `text-kumo-strong`
1430
+ - **Base Tokens:** `text-kumo-subtle`
1155
1431
 
1156
1432
  **Sub-Components:**
1157
1433
 
@@ -1170,7 +1446,7 @@ Props:
1170
1446
 
1171
1447
  ### Collapsible
1172
1448
 
1173
- Collapsible component for showing/hiding content. Features: - Animated chevron indicator (rotates 180° when open) - Accessible with aria-expanded and aria-controls - Content panel with left border accent
1449
+ Collapsible — a composable disclosure component for showing/hiding content. Built on Base UI's Collapsible with full composition support. ## Basic Usage ```tsx const [open, setOpen] = useState(false); <Collapsible.Root open={open} onOpenChange={setOpen}> <Collapsible.Trigger render={<Button variant="ghost" />}> Show details </Collapsible.Trigger> <Collapsible.Panel className="mt-2"> <Text>Hidden content revealed when expanded.</Text> </Collapsible.Panel> </Collapsible.Root> ``` ## With Default Styling Use `DefaultTrigger` and `DefaultPanel` for the classic Kumo style: ```tsx <Collapsible.Root> <Collapsible.DefaultTrigger>Show details</Collapsible.DefaultTrigger> <Collapsible.DefaultPanel> <Text>Content with border-left accent</Text> </Collapsible.DefaultPanel> </Collapsible.Root> ``` ## Controlled Accordion Pattern ```tsx const [activeIndex, setActiveIndex] = useState<number | null>(null); {items.map((item, i) => ( <Collapsible.Root key={i} open={activeIndex === i} onOpenChange={(open) => setActiveIndex(open ? i : null)} > <Collapsible.DefaultTrigger>{item.title}</Collapsible.DefaultTrigger> <Collapsible.DefaultPanel>{item.content}</Collapsible.DefaultPanel> </Collapsible.Root> ))} ```
1174
1450
 
1175
1451
  **Type:** component
1176
1452
 
@@ -1180,13 +1456,8 @@ Collapsible component for showing/hiding content. Features: - Animated chevron
1180
1456
 
1181
1457
  **Props:**
1182
1458
 
1183
- - `children`: ReactNode
1184
- - `label`: string (required)
1185
- Text label displayed in the trigger button
1186
- - `open`: boolean
1187
- Whether the collapsible content is visible
1188
1459
  - `className`: string
1189
- Additional CSS classes for the content panel
1460
+ Additional CSS classes
1190
1461
  - `onOpenChange`: (open: boolean) => void
1191
1462
  Callback when collapsed state changes
1192
1463
 
@@ -1194,35 +1465,115 @@ Collapsible component for showing/hiding content. Features: - Animated chevron
1194
1465
 
1195
1466
  `border-kumo-fill`, `text-kumo-link`
1196
1467
 
1468
+ **Sub-Components:**
1469
+
1470
+ This is a compound component. Use these sub-components:
1471
+
1472
+ #### Collapsible.Root
1473
+
1474
+ Root sub-component
1475
+
1476
+ Props:
1477
+ - `className`: string
1478
+
1479
+ #### Collapsible.Trigger
1480
+
1481
+ Trigger sub-component
1482
+
1483
+ Props:
1484
+ - `className`: string
1485
+
1486
+ #### Collapsible.Panel
1487
+
1488
+ Panel sub-component
1489
+
1490
+ Props:
1491
+ - `className`: string
1492
+
1493
+ #### Collapsible.DefaultTrigger
1494
+
1495
+ DefaultTrigger sub-component
1496
+
1497
+ Props:
1498
+ - `children`: ReactNode (required)
1499
+ - `className`: string
1500
+
1501
+ #### Collapsible.DefaultPanel
1502
+
1503
+ DefaultPanel sub-component
1504
+
1505
+ Props:
1506
+ - `children`: ReactNode (required)
1507
+ - `className`: string
1508
+
1509
+
1197
1510
  **Examples:**
1198
1511
 
1199
1512
  ```tsx
1200
1513
  <div className="w-full">
1201
- <Collapsible label="What is Kumo?" open={isOpen} onOpenChange={setIsOpen}>
1202
- Kumo is Cloudflare's new design system.
1203
- </Collapsible>
1514
+ <Collapsible.Root open={isOpen} onOpenChange={setIsOpen}>
1515
+ <Collapsible.DefaultTrigger>What is Kumo?</Collapsible.DefaultTrigger>
1516
+ <Collapsible.DefaultPanel>
1517
+ <Text>Kumo is Cloudflare's new design system.</Text>
1518
+ </Collapsible.DefaultPanel>
1519
+ </Collapsible.Root>
1204
1520
  </div>
1205
1521
  ```
1206
1522
 
1207
1523
  ```tsx
1208
1524
  <div className="w-full space-y-2">
1209
- <Collapsible label="What is Kumo?" open={open1} onOpenChange={setOpen1}>
1210
- Kumo is Cloudflare's new design system.
1211
- </Collapsible>
1212
- <Collapsible
1213
- label="How do I use it?"
1214
- open={open2}
1215
- onOpenChange={setOpen2}
1216
- >
1217
- Install the components and import them into your project.
1218
- </Collapsible>
1219
- <Collapsible
1220
- label="Is it open source?"
1221
- open={open3}
1222
- onOpenChange={setOpen3}
1223
- >
1224
- Check the repository for license information.
1225
- </Collapsible>
1525
+ <Collapsible.Root open={open1} onOpenChange={setOpen1}>
1526
+ <Collapsible.DefaultTrigger>What is Kumo?</Collapsible.DefaultTrigger>
1527
+ <Collapsible.DefaultPanel>
1528
+ <Text>Kumo is Cloudflare's new design system.</Text>
1529
+ </Collapsible.DefaultPanel>
1530
+ </Collapsible.Root>
1531
+ <Collapsible.Root open={open2} onOpenChange={setOpen2}>
1532
+ <Collapsible.DefaultTrigger>How do I use it?</Collapsible.DefaultTrigger>
1533
+ <Collapsible.DefaultPanel>
1534
+ <Text>Install the components and import them into your project.</Text>
1535
+ </Collapsible.DefaultPanel>
1536
+ </Collapsible.Root>
1537
+ <Collapsible.Root open={open3} onOpenChange={setOpen3}>
1538
+ <Collapsible.DefaultTrigger>Is it open source?</Collapsible.DefaultTrigger>
1539
+ <Collapsible.DefaultPanel>
1540
+ <Text>Check the repository for license information.</Text>
1541
+ </Collapsible.DefaultPanel>
1542
+ </Collapsible.Root>
1543
+ </div>
1544
+ ```
1545
+
1546
+ ```tsx
1547
+ <div className="w-full">
1548
+ <Collapsible.Root open={isOpen} onOpenChange={setIsOpen}>
1549
+ <Collapsible.Trigger
1550
+ render={<Button variant="secondary" size="sm" />}
1551
+ >
1552
+ {isOpen ? "Hide details" : "Show details"}
1553
+ </Collapsible.Trigger>
1554
+ <Collapsible.Panel className="mt-3 rounded-lg bg-kumo-tint p-4">
1555
+ <Text>
1556
+ This panel uses custom styling instead of the default border-left accent.
1557
+ </Text>
1558
+ </Collapsible.Panel>
1559
+ </Collapsible.Root>
1560
+ </div>
1561
+ ```
1562
+
1563
+ ```tsx
1564
+ <div className="w-full space-y-2">
1565
+ {items.map((item, i) => (
1566
+ <Collapsible.Root
1567
+ key={i}
1568
+ open={activeIndex === i}
1569
+ onOpenChange={(open) => setActiveIndex(open ? i : null)}
1570
+ >
1571
+ <Collapsible.DefaultTrigger>{item.title}</Collapsible.DefaultTrigger>
1572
+ <Collapsible.DefaultPanel>
1573
+ <Text>{item.content}</Text>
1574
+ </Collapsible.DefaultPanel>
1575
+ </Collapsible.Root>
1576
+ ))}
1226
1577
  </div>
1227
1578
  ```
1228
1579
 
@@ -1277,7 +1628,7 @@ Combobox — autocomplete input with filterable dropdown list. Compound compone
1277
1628
 
1278
1629
  **Colors (kumo tokens used):**
1279
1630
 
1280
- `bg-kumo-base`, `bg-kumo-fill-hover`, `bg-kumo-overlay`, `bg-kumo-tint`, `border-kumo-hairline`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
1631
+ `bg-kumo-base`, `bg-kumo-fill-hover`, `bg-kumo-overlay`, `bg-kumo-tint`, `border-kumo-hairline`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-subtle`
1281
1632
 
1282
1633
  **Sub-Components:**
1283
1634
 
@@ -1524,6 +1875,36 @@ Usage:
1524
1875
  </div>
1525
1876
  ```
1526
1877
 
1878
+ ```tsx
1879
+ <div className="w-80">
1880
+ <Combobox value={value} onValueChange={setValue} items={items}>
1881
+ <Combobox.TriggerInput placeholder="Select database" />
1882
+ <Combobox.Content>
1883
+ <Combobox.Empty />
1884
+ <Combobox.List>
1885
+ {(item: DatabaseItemWithDisabled) => (
1886
+ <Combobox.Item
1887
+ key={item.value}
1888
+ value={item}
1889
+ disabled={item.disabled}
1890
+ >
1891
+ <span>
1892
+ {item.label}
1893
+ {item.reason && (
1894
+ <Text variant="secondary" size="xs" as="span">
1895
+ {" — "}
1896
+ {item.reason}
1897
+ </Text>
1898
+ )}
1899
+ </span>
1900
+ </Combobox.Item>
1901
+ )}
1902
+ </Combobox.List>
1903
+ </Combobox.Content>
1904
+ </Combobox>
1905
+ </div>
1906
+ ```
1907
+
1527
1908
  ```tsx
1528
1909
  <div className="w-80">
1529
1910
  <Combobox
@@ -1656,7 +2037,7 @@ CommandPalette — accessible command palette / spotlight search overlay. Compo
1656
2037
 
1657
2038
  **Colors (kumo tokens used):**
1658
2039
 
1659
- `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-overlay`, `bg-kumo-warning`, `ring-kumo-hairline`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
2040
+ `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-overlay`, `bg-kumo-warning`, `ring-kumo-brand`, `ring-kumo-hairline`, `text-kumo-default`, `text-kumo-subtle`
1660
2041
 
1661
2042
  **Examples:**
1662
2043
 
@@ -1823,6 +2204,70 @@ CommandPalette — accessible command palette / spotlight search overlay. Compo
1823
2204
  </div>
1824
2205
  ```
1825
2206
 
2207
+ ```tsx
2208
+ <div className="flex flex-col items-start gap-4">
2209
+ <Button onClick={() => setOpen(true)}>
2210
+ Open Palette (No Autocomplete)
2211
+ </Button>
2212
+
2213
+ <CommandPalette.Root
2214
+ open={open}
2215
+ onOpenChange={setOpen}
2216
+ items={filteredGroups}
2217
+ value={search}
2218
+ onValueChange={setSearch}
2219
+ itemToStringValue={(group) => group.label}
2220
+ onSelect={(item) => {
2221
+ console.log("Selected:", item.title);
2222
+ setOpen(false);
2223
+ setSearch("");
2224
+ }}
2225
+ getSelectableItems={getSelectableItems}
2226
+ >
2227
+ <CommandPalette.Input
2228
+ placeholder="Search commands..."
2229
+ autoComplete="off"
2230
+ autoCorrect="off"
2231
+ autoCapitalize="none"
2232
+ spellCheck={false}
2233
+ data-1p-ignore="true"
2234
+ data-lpignore="true"
2235
+ />
2236
+ <CommandPalette.List>
2237
+ <CommandPalette.Results>
2238
+ {(group: CommandGroup) => (
2239
+ <CommandPalette.Group key={group.id} items={group.items}>
2240
+ <CommandPalette.GroupLabel>
2241
+ {group.label}
2242
+ </CommandPalette.GroupLabel>
2243
+ <CommandPalette.Items>
2244
+ {(item: CommandItem) => (
2245
+ <CommandPalette.Item
2246
+ key={item.id}
2247
+ value={item}
2248
+ onClick={() => {
2249
+ setOpen(false);
2250
+ setSearch("");
2251
+ }}
2252
+ >
2253
+ <span className="flex items-center gap-3">
2254
+ {item.icon && (
2255
+ <span className="text-kumo-subtle">{item.icon}</span>
2256
+ )}
2257
+ <span>{item.title}</span>
2258
+ </span>
2259
+ </CommandPalette.Item>
2260
+ )}
2261
+ </CommandPalette.Items>
2262
+ </CommandPalette.Group>
2263
+ )}
2264
+ </CommandPalette.Results>
2265
+ <CommandPalette.Empty>No commands found</CommandPalette.Empty>
2266
+ </CommandPalette.List>
2267
+ </CommandPalette.Root>
2268
+ </div>
2269
+ ```
2270
+
1826
2271
  ```tsx
1827
2272
  <div>
1828
2273
  <Button onClick={() => setOpen(true)}>Open with ResultItem</Button>
@@ -2013,7 +2458,7 @@ DatePicker — a date selection calendar. Built on [react-day-picker](https://d
2013
2458
  className={`rounded-md px-3 py-1.5 text-left whitespace-nowrap ${
2014
2459
  isActive
2015
2460
  ? "bg-kumo-bg-inverse text-kumo-text-inverse"
2016
- : "text-kumo-strong hover:bg-kumo-control"
2461
+ : "text-kumo-subtle hover:bg-kumo-control"
2017
2462
  }`}
2018
2463
  >
2019
2464
  {preset.label}
@@ -2085,7 +2530,7 @@ DateRangePicker — dual-calendar date range selector. Renders two side-by-side
2085
2530
 
2086
2531
  **Colors (kumo tokens used):**
2087
2532
 
2088
- `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-fill`, `bg-kumo-interact`, `bg-kumo-overlay`, `text-kumo-default`, `text-kumo-inverse`, `text-kumo-strong`, `text-kumo-subtle`
2533
+ `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-fill`, `bg-kumo-interact`, `bg-kumo-overlay`, `ring-kumo-focus`, `text-kumo-default`, `text-kumo-inverse`, `text-kumo-subtle`
2089
2534
 
2090
2535
  **Styling:**
2091
2536
 
@@ -2465,7 +2910,7 @@ DropdownMenu — accessible dropdown menu anchored to a trigger. Compound compo
2465
2910
 
2466
2911
  **Colors (kumo tokens used):**
2467
2912
 
2468
- `bg-kumo-control`, `bg-kumo-danger`, `bg-kumo-hairline`, `bg-kumo-overlay`, `bg-kumo-tint`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`
2913
+ `bg-kumo-control`, `bg-kumo-danger`, `bg-kumo-hairline`, `bg-kumo-overlay`, `bg-kumo-tint`, `ring-kumo-brand`, `ring-kumo-focus`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`
2469
2914
 
2470
2915
  **Sub-Components:**
2471
2916
 
@@ -2569,7 +3014,7 @@ Placeholder shown when a list, table, or page has no content to display.
2569
3014
 
2570
3015
  **Colors (kumo tokens used):**
2571
3016
 
2572
- `bg-kumo-control`, `bg-kumo-overlay`, `border-kumo-fill`, `border-kumo-interact`, `text-kumo-brand`, `text-kumo-default`, `text-kumo-inactive`, `text-kumo-strong`, `text-kumo-success`
3017
+ `bg-kumo-control`, `bg-kumo-overlay`, `border-kumo-fill`, `border-kumo-interact`, `text-kumo-brand`, `text-kumo-default`, `text-kumo-inactive`, `text-kumo-subtle`, `text-kumo-success`
2573
3018
 
2574
3019
  **Examples:**
2575
3020
 
@@ -3010,121 +3455,481 @@ Input component
3010
3455
  - `"default"`: Default input appearance
3011
3456
  - `"error"`: Error state for validation failures
3012
3457
 
3013
- **State Classes:**
3014
- - `"default"`:
3015
- - `focus`: `focus:ring-kumo-hairline`
3016
- - `"error"`:
3017
- - `focus`: `focus:ring-kumo-danger`
3458
+ **State Classes:**
3459
+ - `"default"`:
3460
+ - `focus`: `focus:ring-kumo-focus/50 focus:ring-[1.5px]`
3461
+ - `"error"`:
3462
+ - `focus`: `focus:ring-kumo-danger/50 focus:ring-[1.5px]`
3463
+
3464
+ **Colors (kumo tokens used):**
3465
+
3466
+ `bg-kumo-control`, `ring-kumo-danger`, `ring-kumo-focus`, `ring-kumo-line`, `text-kumo-default`
3467
+
3468
+ **Styling:**
3469
+
3470
+ - **Dimensions:** `[object Object]`
3471
+
3472
+ **Examples:**
3473
+
3474
+ ```tsx
3475
+ <Input
3476
+ label="Email"
3477
+ placeholder="you@example.com"
3478
+ description="We'll never share your email"
3479
+ />
3480
+ ```
3481
+
3482
+ ```tsx
3483
+ <Input
3484
+ label="Email"
3485
+ placeholder="you@example.com"
3486
+ value="invalid-email"
3487
+ error="Please enter a valid email address"
3488
+ />
3489
+ ```
3490
+
3491
+ ```tsx
3492
+ <Input
3493
+ label="Password"
3494
+ type="password"
3495
+ value="short"
3496
+ error={{
3497
+ message: "Password must be at least 8 characters",
3498
+ match: "tooShort",
3499
+ }}
3500
+ minLength={8}
3501
+ />
3502
+ ```
3503
+
3504
+ ```tsx
3505
+ <div className="flex flex-col gap-4">
3506
+ <Input size="xs" label="Extra Small" placeholder="Extra small input" />
3507
+ <Input size="sm" label="Small" placeholder="Small input" />
3508
+ <Input label="Base" placeholder="Base input (default)" />
3509
+ <Input size="lg" label="Large" placeholder="Large input" />
3510
+ </div>
3511
+ ```
3512
+
3513
+ ```tsx
3514
+ <Input label="Disabled field" placeholder="Cannot edit" disabled />
3515
+ ```
3516
+
3517
+ ```tsx
3518
+ <div className="flex flex-col gap-4">
3519
+ <Input type="email" label="Email" placeholder="you@example.com" />
3520
+ <Input type="password" label="Password" placeholder="••••••••" />
3521
+ <Input type="number" label="Age" placeholder="18" />
3522
+ <Input type="tel" label="Phone" placeholder="+1 (555) 000-0000" />
3523
+ </div>
3524
+ ```
3525
+
3526
+ ```tsx
3527
+ <Input
3528
+ label="Phone Number"
3529
+ required={false}
3530
+ placeholder="+1 (555) 000-0000"
3531
+ />
3532
+ ```
3533
+
3534
+ ```tsx
3535
+ <Input
3536
+ label="API Key"
3537
+ labelTooltip="Find this in your dashboard under Settings > API Keys"
3538
+ placeholder="sk_live_..."
3539
+ />
3540
+ ```
3541
+
3542
+ ```tsx
3543
+ <Input
3544
+ label={
3545
+ <span>
3546
+ Email for <strong>billing</strong>
3547
+ </span>
3548
+ }
3549
+ required
3550
+ placeholder="billing@company.com"
3551
+ type="email"
3552
+ />
3553
+ ```
3554
+
3555
+ ```tsx
3556
+ <Input
3557
+ label="With onChange"
3558
+ placeholder="Type something..."
3559
+ description={value ? `Value: ${value}` : "Uses e.target.value"}
3560
+ value={value}
3561
+ onChange={(e) => setValue(e.target.value)}
3562
+ />
3563
+ ```
3564
+
3565
+ ```tsx
3566
+ <Input
3567
+ label="With onValueChange"
3568
+ placeholder="Type something..."
3569
+ description={value ? `Value: ${value}` : "Receives the value directly"}
3570
+ value={value}
3571
+ onValueChange={(v) => setValue(v)}
3572
+ />
3573
+ ```
3574
+
3575
+
3576
+ ---
3577
+
3578
+ ### InputGroup
3579
+
3580
+ InputGroup component
3581
+
3582
+ **Type:** component
3583
+
3584
+ **Import:** `import { InputGroup } from "@cloudflare/kumo";`
3585
+
3586
+ **Category:** Input
3587
+
3588
+ **Props:**
3589
+
3590
+ - `label`: ReactNode
3591
+ The label content — can be a string or any React node.
3592
+ - `description`: ReactNode
3593
+ Helper text displayed below the control (hidden when `error` is present).
3594
+ - `error`: object
3595
+ Validation error with a message and a browser `ValidityState` match key.
3596
+ - `required`: boolean
3597
+ When explicitly `false`, shows gray "(optional)" text after the label. When `true` or `undefined`, no indicator is shown.
3598
+ - `labelTooltip`: ReactNode
3599
+ Tooltip content displayed next to the label via an info icon.
3600
+ - `children`: ReactNode
3601
+ - `className`: string
3602
+ - `id`: string
3603
+ - `lang`: string
3604
+ - `title`: string
3605
+ - `size`: enum [default: base]
3606
+ - `"xs"`: Extra small size.
3607
+ - `"sm"`: Small size.
3608
+ - `"base"`: Default size.
3609
+ - `"lg"`: Large size.
3610
+ - `disabled`: boolean
3611
+
3612
+ **Colors (kumo tokens used):**
3613
+
3614
+ `border-kumo-line`, `ring-kumo-danger`, `ring-kumo-focus`, `ring-kumo-line`
3615
+
3616
+ **Sub-Components:**
3617
+
3618
+ This is a compound component. Use these sub-components:
3619
+
3620
+ #### InputGroup.Input
3621
+
3622
+ Input sub-component
3623
+
3624
+ #### InputGroup.Button
3625
+
3626
+ Button sub-component
3627
+
3628
+ Props:
3629
+ - `tooltip`: ReactNode - When provided, wraps the button in a Tooltip. Automatically sets aria-label from a string value.
3630
+ - `tooltipSide`: "top" | "right" | "bottom" | "left" [default: "bottom"] - Preferred side for the tooltip popup.
3631
+ - `variant`: "primary" | "secondary" | "ghost" | "destructive" | "secondary-destructive" | "outline" [default: "ghost"] - Button visual style. Defaults to ghost.
3632
+ - `size`: "xs" | "sm" | "base" | "lg" [default: "sm"] - Button size.
3633
+
3634
+ #### InputGroup.Addon
3018
3635
 
3019
- **Colors (kumo tokens used):**
3636
+ Addon sub-component
3020
3637
 
3021
- `bg-kumo-control`, `ring-kumo-danger`, `ring-kumo-hairline`, `text-kumo-default`, `text-kumo-subtle`
3638
+ Props:
3639
+ - `align`: "start" | "end" [default: "start"] - Position relative to the input.
3640
+ - `className`: string - Additional CSS classes.
3022
3641
 
3023
- **Styling:**
3642
+ #### InputGroup.Suffix
3024
3643
 
3025
- - **Dimensions:** `[object Object]`
3644
+ Suffix sub-component
3026
3645
 
3027
- **Examples:**
3646
+ Props:
3647
+ - `className`: string - Additional CSS classes.
3028
3648
 
3029
- ```tsx
3030
- <Input
3031
- label="Email"
3032
- placeholder="you@example.com"
3033
- description="We'll never share your email"
3034
- />
3035
- ```
3649
+ #### InputGroup.Label
3650
+
3651
+ Label sub-component
3652
+
3653
+ #### InputGroup.Description
3654
+
3655
+ Description sub-component
3656
+
3657
+
3658
+ **Examples:**
3036
3659
 
3037
3660
  ```tsx
3038
- <Input
3039
- label="Email"
3040
- placeholder="you@example.com"
3041
- value="invalid-email"
3042
- error="Please enter a valid email address"
3043
- />
3661
+ <div className="w-full max-w-2xs">
3662
+ <InputGroup>
3663
+ <InputGroup.Input
3664
+ maxLength={20}
3665
+ onChange={handleChange}
3666
+ value={value}
3667
+ />
3668
+ <InputGroup.Suffix>.workers.dev</InputGroup.Suffix>
3669
+ {status !== "idle" && (
3670
+ <InputGroup.Addon align="end">
3671
+ {status === "loading" ? (
3672
+ <Loader />
3673
+ ) : (
3674
+ <CheckCircleIcon weight="duotone" className="text-kumo-success" />
3675
+ )}
3676
+ </InputGroup.Addon>
3677
+ )}
3678
+ </InputGroup>
3679
+ </div>
3044
3680
  ```
3045
3681
 
3046
3682
  ```tsx
3047
- <Input
3048
- label="Password"
3049
- type="password"
3050
- value="short"
3051
- error={{
3052
- message: "Password must be at least 8 characters",
3053
- match: "tooShort",
3054
- }}
3055
- minLength={8}
3056
- />
3683
+ <InputGroup className="w-full max-w-3xs">
3684
+ <InputGroup.Addon>
3685
+ <LinkIcon />
3686
+ </InputGroup.Addon>
3687
+ <InputGroup.Input placeholder="Paste a link..." aria-label="Link" />
3688
+ </InputGroup>
3057
3689
  ```
3058
3690
 
3059
3691
  ```tsx
3060
3692
  <div className="flex flex-col gap-4">
3061
- <Input size="xs" label="Extra Small" placeholder="Extra small input" />
3062
- <Input size="sm" label="Small" placeholder="Small input" />
3063
- <Input label="Base" placeholder="Base input (default)" />
3064
- <Input size="lg" label="Large" placeholder="Large input" />
3693
+ <InputGroup className="w-full max-w-3xs">
3694
+ <InputGroup.Addon>@</InputGroup.Addon>
3695
+ <InputGroup.Input placeholder="username" aria-label="Username" />
3696
+ </InputGroup>
3697
+
3698
+ <InputGroup className="w-full max-w-3xs">
3699
+ <InputGroup.Input placeholder="email" aria-label="Email" />
3700
+ <InputGroup.Addon align="end">@example.com</InputGroup.Addon>
3701
+ </InputGroup>
3702
+
3703
+ <InputGroup className="w-full max-w-3xs">
3704
+ <InputGroup.Addon>/api/</InputGroup.Addon>
3705
+ <InputGroup.Input placeholder="endpoint" aria-label="API path" />
3706
+ <InputGroup.Addon align="end">.json</InputGroup.Addon>
3707
+ </InputGroup>
3065
3708
  </div>
3066
3709
  ```
3067
3710
 
3068
3711
  ```tsx
3069
- <Input label="Disabled field" placeholder="Cannot edit" disabled />
3712
+ <div className="flex flex-col gap-4">
3713
+ <InputGroup className="w-full max-w-3xs">
3714
+ <InputGroup.Input
3715
+ type={show ? "text" : "password"}
3716
+ defaultValue="password"
3717
+ aria-label="Password"
3718
+ />
3719
+ <InputGroup.Addon align="end">
3720
+ <InputGroup.Button
3721
+ className="text-kumo-subtle"
3722
+ icon={show ? EyeSlashIcon : EyeIcon}
3723
+ aria-label={show ? "Hide password" : "Show password"}
3724
+ onClick={() => setShow(!show)}
3725
+ />
3726
+ </InputGroup.Addon>
3727
+ </InputGroup>
3728
+
3729
+ <InputGroup className="w-full max-w-3xs">
3730
+ <InputGroup.Addon>
3731
+ <MagnifyingGlassIcon />
3732
+ </InputGroup.Addon>
3733
+ <InputGroup.Input
3734
+ value={searchValue}
3735
+ placeholder="Search"
3736
+ aria-label="Search"
3737
+ onChange={(e) => setSearchValue(e.target.value)}
3738
+ />
3739
+ {searchValue && (
3740
+ <InputGroup.Addon align="end" className="pr-1">
3741
+ <InputGroup.Button
3742
+ aria-label="Clear search"
3743
+ onClick={() => setSearchValue("")}
3744
+ >
3745
+ <XIcon />
3746
+ </InputGroup.Button>
3747
+ </InputGroup.Addon>
3748
+ )}
3749
+ <InputGroup.Button variant="secondary" onClick={() => {}}>
3750
+ Search
3751
+ </InputGroup.Button>
3752
+ </InputGroup>
3753
+ </div>
3070
3754
  ```
3071
3755
 
3072
3756
  ```tsx
3073
- <div className="flex flex-col gap-4">
3074
- <Input type="email" label="Email" placeholder="you@example.com" />
3075
- <Input type="password" label="Password" placeholder="••••••••" />
3076
- <Input type="number" label="Age" placeholder="18" />
3077
- <Input type="tel" label="Phone" placeholder="+1 (555) 000-0000" />
3078
- </div>
3757
+ <InputGroup className="w-full max-w-2xs">
3758
+ <InputGroup.Addon>
3759
+ <MagnifyingGlassIcon />
3760
+ </InputGroup.Addon>
3761
+ <InputGroup.Input
3762
+ placeholder="Search with query language..."
3763
+ aria-label="Search"
3764
+ />
3765
+ <InputGroup.Addon align="end">
3766
+ <InputGroup.Button
3767
+ className="text-kumo-subtle"
3768
+ icon={QuestionIcon}
3769
+ tooltip="Query language help"
3770
+ onClick={() => {}}
3771
+ />
3772
+ </InputGroup.Addon>
3773
+ </InputGroup>
3079
3774
  ```
3080
3775
 
3081
3776
  ```tsx
3082
- <Input
3083
- label="Phone Number"
3084
- required={false}
3085
- placeholder="+1 (555) 000-0000"
3086
- />
3777
+ <InputGroup className="w-full max-w-3xs">
3778
+ <InputGroup.Addon>
3779
+ <MagnifyingGlassIcon />
3780
+ </InputGroup.Addon>
3781
+ <InputGroup.Input placeholder="Search..." aria-label="Search" />
3782
+ <InputGroup.Addon align="end">
3783
+ <kbd className="bg-none! border-none!">⌘K</kbd>
3784
+ </InputGroup.Addon>
3785
+ </InputGroup>
3087
3786
  ```
3088
3787
 
3089
3788
  ```tsx
3090
- <Input
3091
- label="API Key"
3092
- labelTooltip="Find this in your dashboard under Settings > API Keys"
3093
- placeholder="sk_live_..."
3094
- />
3789
+ <InputGroup className="w-full max-w-3xs">
3790
+ <InputGroup.Input defaultValue="kumo" aria-label="kumo" />
3791
+ <InputGroup.Addon align="end">
3792
+ <Loader />
3793
+ </InputGroup.Addon>
3794
+ </InputGroup>
3095
3795
  ```
3096
3796
 
3097
3797
  ```tsx
3098
- <Input
3099
- label={
3100
- <span>
3101
- Email for <strong>billing</strong>
3102
- </span>
3103
- }
3104
- required
3105
- placeholder="billing@company.com"
3106
- type="email"
3107
- />
3798
+ <div className="flex w-full max-w-2xs flex-col gap-4">
3799
+ <InputGroup label="Subdomain">
3800
+ <InputGroup.Input
3801
+ aria-label="Subdomain"
3802
+ defaultValue="kumo"
3803
+ maxLength={20}
3804
+ />
3805
+ <InputGroup.Suffix>.workers.dev</InputGroup.Suffix>
3806
+ <InputGroup.Addon align="end">
3807
+ <CheckCircleIcon weight="duotone" className="text-kumo-success" />
3808
+ </InputGroup.Addon>
3809
+ </InputGroup>
3810
+
3811
+ <InputGroup
3812
+ label="Subdomain"
3813
+ error={{ message: "This subdomain is unavailable", match: true }}
3814
+ >
3815
+ <InputGroup.Input
3816
+ aria-label="Subdomain"
3817
+ defaultValue="kumo"
3818
+ maxLength={20}
3819
+ />
3820
+ <InputGroup.Suffix>.workers.dev</InputGroup.Suffix>
3821
+ <InputGroup.Addon align="end">
3822
+ <XCircleIcon weight="duotone" className="text-kumo-danger" />
3823
+ </InputGroup.Addon>
3824
+ </InputGroup>
3825
+ </div>
3108
3826
  ```
3109
3827
 
3110
3828
  ```tsx
3111
- <Input
3112
- label="With onChange"
3113
- placeholder="Type something..."
3114
- description={value ? `Value: ${value}` : "Uses e.target.value"}
3115
- value={value}
3116
- onChange={(e) => setValue(e.target.value)}
3117
- />
3829
+ <div className="flex w-full max-w-3xs flex-col gap-4">
3830
+ <InputGroup size="xs" label="Extra Small">
3831
+ <InputGroup.Addon>
3832
+ <MagnifyingGlassIcon />
3833
+ </InputGroup.Addon>
3834
+ <InputGroup.Input placeholder="Extra small input" />
3835
+ <InputGroup.Addon align="end">
3836
+ <InputGroup.Button
3837
+ className="text-kumo-subtle"
3838
+ icon={QuestionIcon}
3839
+ shape="square"
3840
+ aria-label="Help"
3841
+ />
3842
+ </InputGroup.Addon>
3843
+ </InputGroup>
3844
+
3845
+ <InputGroup size="sm" label="Small">
3846
+ <InputGroup.Addon>
3847
+ <MagnifyingGlassIcon />
3848
+ </InputGroup.Addon>
3849
+ <InputGroup.Input placeholder="Small input" />
3850
+ <InputGroup.Addon align="end">
3851
+ <InputGroup.Button
3852
+ className="text-kumo-subtle"
3853
+ icon={QuestionIcon}
3854
+ shape="square"
3855
+ aria-label="Help"
3856
+ />
3857
+ </InputGroup.Addon>
3858
+ </InputGroup>
3859
+
3860
+ <InputGroup label="Base (default)">
3861
+ <InputGroup.Addon>
3862
+ <MagnifyingGlassIcon />
3863
+ </InputGroup.Addon>
3864
+ <InputGroup.Input placeholder="Base input" />
3865
+ <InputGroup.Addon align="end">
3866
+ <InputGroup.Button
3867
+ className="text-kumo-subtle"
3868
+ icon={QuestionIcon}
3869
+ shape="square"
3870
+ aria-label="Help"
3871
+ />
3872
+ </InputGroup.Addon>
3873
+ </InputGroup>
3874
+
3875
+ <InputGroup size="lg" label="Large">
3876
+ <InputGroup.Addon>
3877
+ <MagnifyingGlassIcon />
3878
+ </InputGroup.Addon>
3879
+ <InputGroup.Input placeholder="Large input" />
3880
+ <InputGroup.Addon align="end">
3881
+ <InputGroup.Button
3882
+ className="text-kumo-subtle"
3883
+ icon={QuestionIcon}
3884
+ shape="square"
3885
+ aria-label="Help"
3886
+ />
3887
+ </InputGroup.Addon>
3888
+ </InputGroup>
3889
+ </div>
3118
3890
  ```
3119
3891
 
3120
3892
  ```tsx
3121
- <Input
3122
- label="With onValueChange"
3123
- placeholder="Type something..."
3124
- description={value ? `Value: ${value}` : "Receives the value directly"}
3125
- value={value}
3126
- onValueChange={(v) => setValue(v)}
3127
- />
3893
+ <div className="flex w-full max-w-3xs flex-col gap-4">
3894
+ <InputGroup
3895
+ label="Error State"
3896
+ error={{ message: "Please enter a valid email address", match: true }}
3897
+ >
3898
+ <InputGroup.Input type="email" defaultValue="invalid-email" />
3899
+ <InputGroup.Addon align="end">@example.com</InputGroup.Addon>
3900
+ </InputGroup>
3901
+
3902
+ <InputGroup label="Disabled" disabled>
3903
+ <InputGroup.Addon>
3904
+ <MagnifyingGlassIcon />
3905
+ </InputGroup.Addon>
3906
+ <InputGroup.Input placeholder="Search..." />
3907
+ </InputGroup>
3908
+
3909
+ <InputGroup label="Optional Field" required={false}>
3910
+ <InputGroup.Addon>$</InputGroup.Addon>
3911
+ <InputGroup.Input placeholder="0.00" />
3912
+ </InputGroup>
3913
+
3914
+ <InputGroup
3915
+ label="With Description"
3916
+ description="Must be at least 8 characters"
3917
+ labelTooltip="Your password is stored securely"
3918
+ >
3919
+ <InputGroup.Input
3920
+ type={show ? "text" : "password"}
3921
+ placeholder="Password"
3922
+ />
3923
+ <InputGroup.Addon align="end">
3924
+ <InputGroup.Button
3925
+ className="text-kumo-subtle"
3926
+ icon={show ? EyeSlashIcon : EyeIcon}
3927
+ aria-label={show ? "Hide password" : "Show password"}
3928
+ onClick={() => setShow(!show)}
3929
+ />
3930
+ </InputGroup.Addon>
3931
+ </InputGroup>
3932
+ </div>
3128
3933
  ```
3129
3934
 
3130
3935
 
@@ -3157,7 +3962,7 @@ Label component for form fields. Provides a standardized way to display labels
3157
3962
 
3158
3963
  **Colors (kumo tokens used):**
3159
3964
 
3160
- `text-kumo-default`, `text-kumo-strong`
3965
+ `text-kumo-default`, `text-kumo-subtle`
3161
3966
 
3162
3967
  **Examples:**
3163
3968
 
@@ -3227,7 +4032,7 @@ LayerCard component
3227
4032
  **Props:**
3228
4033
 
3229
4034
  - `render`: ReactNode
3230
- Allows you to replace the components HTML element with a different tag, or compose it with another component.
4035
+ Allows you to replace the component's HTML element with a different tag, or compose it with another component.
3231
4036
 
3232
4037
  Accepts a `ReactElement` or a function that returns the element to render.
3233
4038
  - `children`: ReactNode
@@ -3238,7 +4043,7 @@ Accepts a `ReactElement` or a function that returns the element to render.
3238
4043
 
3239
4044
  **Colors (kumo tokens used):**
3240
4045
 
3241
- `bg-kumo-base`, `bg-kumo-elevated`, `ring-kumo-fill`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-strong`
4046
+ `bg-kumo-base`, `bg-kumo-elevated`, `ring-kumo-fill`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-subtle`
3242
4047
 
3243
4048
  **Styling:**
3244
4049
 
@@ -3338,7 +4143,7 @@ Link component
3338
4143
  - `type`: string
3339
4144
  - `referrerPolicy`: enum
3340
4145
  - `render`: ReactNode
3341
- Allows you to replace the components HTML element with a different tag, or compose it with another component.
4146
+ Allows you to replace the component's HTML element with a different tag, or compose it with another component.
3342
4147
 
3343
4148
  Accepts a `ReactElement` or a function that returns the element to render.
3344
4149
 
@@ -3484,7 +4289,7 @@ MenuBar — horizontal icon-button toolbar with keyboard arrow-key navigation.
3484
4289
 
3485
4290
  **Colors (kumo tokens used):**
3486
4291
 
3487
- `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-recessed`, `border-kumo-recessed`, `ring-kumo-line`
4292
+ `bg-kumo-base`, `bg-kumo-recessed`, `border-kumo-recessed`, `ring-kumo-brand`, `ring-kumo-focus`, `ring-kumo-line`
3488
4293
 
3489
4294
  **Styling:**
3490
4295
 
@@ -3546,7 +4351,7 @@ Progress bar showing a measured value within a known range (e.g. quota usage).
3546
4351
 
3547
4352
  **Colors (kumo tokens used):**
3548
4353
 
3549
- `bg-kumo-fill`, `text-kumo-default`, `text-kumo-strong`
4354
+ `bg-kumo-fill`, `text-kumo-default`, `text-kumo-subtle`
3550
4355
 
3551
4356
  **Examples:**
3552
4357
 
@@ -3610,7 +4415,7 @@ For visible text like "Showing X of Y", use render props on sub-components:
3610
4415
 
3611
4416
  **Colors (kumo tokens used):**
3612
4417
 
3613
- `border-kumo-hairline`, `ring-kumo-hairline`, `text-kumo-strong`
4418
+ `border-kumo-hairline`, `ring-kumo-hairline`, `text-kumo-subtle`
3614
4419
 
3615
4420
  **Styling:**
3616
4421
 
@@ -4059,7 +4864,7 @@ Close sub-component
4059
4864
 
4060
4865
  ### Radio
4061
4866
 
4062
- Radio — radio button group for single-select choices. Compound component: `Radio.Group` (with built-in Fieldset) and `Radio.Item`. Built on `@base-ui/react/radio-group` + `@base-ui/react/radio`.
4867
+ Radio — radio button group for single-select choices. Compound component: `Radio.Group` (with built-in Fieldset), `Radio.Item`, and `Radio.Legend`. Built on `@base-ui/react/radio-group` + `@base-ui/react/radio`.
4063
4868
 
4064
4869
  **Type:** component
4065
4870
 
@@ -4069,10 +4874,10 @@ Radio — radio button group for single-select choices. Compound component: `Ra
4069
4874
 
4070
4875
  **Props:**
4071
4876
 
4072
- - `legend`: string (required)
4073
- Legend text for the group (required for accessibility)
4877
+ - `legend`: string
4878
+ Legend text for the group (required for accessibility). For more control over legend styling, omit this prop and use `<Radio.Legend>` as a child instead.
4074
4879
  - `children`: ReactNode
4075
- Child Radio.Item components
4880
+ Child Radio.Item components (and optionally a Radio.Legend)
4076
4881
  - `orientation`: enum
4077
4882
  Layout direction of the radio items
4078
4883
  - `appearance`: enum [default: default]
@@ -4091,7 +4896,7 @@ Radio — radio button group for single-select choices. Compound component: `Ra
4091
4896
  - `disabled`: boolean
4092
4897
  Whether all radios in the group are disabled
4093
4898
  - `controlPosition`: enum
4094
- Position of radio control relative to label: "start" (default) puts radio before label, "end" puts label before radio. Note: In card appearance, the control is always positioned at the end.
4899
+ Position of radio control relative to label: "start" puts radio before label, "end" puts label before radio. Defaults to "start" for default appearance and "end" for card appearance.
4095
4900
  - `name`: string
4096
4901
  Form submission name for the radio group
4097
4902
  - `className`: string
@@ -4099,7 +4904,7 @@ Radio — radio button group for single-select choices. Compound component: `Ra
4099
4904
 
4100
4905
  **Colors (kumo tokens used):**
4101
4906
 
4102
- `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-tint`, `border-kumo-danger`, `border-kumo-hairline`, `border-kumo-interact`, `ring-kumo-danger`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
4907
+ `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-tint`, `border-kumo-danger`, `border-kumo-hairline`, `border-kumo-interact`, `ring-kumo-brand`, `ring-kumo-danger`, `ring-kumo-focus`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
4103
4908
 
4104
4909
  **Sub-Components:**
4105
4910
 
@@ -4114,7 +4919,7 @@ Item sub-component
4114
4919
  Group sub-component
4115
4920
 
4116
4921
  Props:
4117
- - `legend`: string (required)
4922
+ - `legend`: string
4118
4923
  - `children`: ReactNode (required)
4119
4924
  - `orientation`: "vertical" | "horizontal"
4120
4925
  - `appearance`: KumoRadioAppearance
@@ -4122,12 +4927,19 @@ Props:
4122
4927
  - `description`: ReactNode
4123
4928
  - `value`: string
4124
4929
  - `disabled`: boolean
4125
- - `label`: "start" (default) puts radio before label (required)
4126
- - `Note`: In card appearance (required)
4930
+ - `label`: "start" puts radio before label (required)
4127
4931
  - `controlPosition`: RadioControlPosition
4128
4932
  - `name`: string
4129
4933
  - `className`: string
4130
4934
 
4935
+ #### Radio.Legend
4936
+
4937
+ Legend sub-component
4938
+
4939
+ Props:
4940
+ - `children`: ReactNode (required)
4941
+ - `className`: string
4942
+
4131
4943
 
4132
4944
  **Examples:**
4133
4945
 
@@ -4283,6 +5095,76 @@ Props:
4283
5095
  </Radio.Group>
4284
5096
  ```
4285
5097
 
5098
+ ```tsx
5099
+ <Radio.Group defaultValue="all" value={value} onValueChange={setValue}>
5100
+ <Radio.Legend className="sr-only">Paths</Radio.Legend>
5101
+ <Radio.Item label="Allow all paths" value="all" />
5102
+ <Radio.Item label="Restrict to specific paths" value="specific" />
5103
+ </Radio.Group>
5104
+ ```
5105
+
5106
+ ```tsx
5107
+ <Radio.Group value={value} onValueChange={setValue}>
5108
+ <Radio.Legend className="text-sm font-normal text-kumo-subtle">
5109
+ Notification preference
5110
+ </Radio.Legend>
5111
+ <Radio.Item label="Email" value="email" />
5112
+ <Radio.Item label="SMS" value="sms" />
5113
+ <Radio.Item label="Push notification" value="push" />
5114
+ </Radio.Group>
5115
+ ```
5116
+
5117
+ ```tsx
5118
+ <Radio.Group
5119
+ legend="Choose a plan"
5120
+ appearance="card"
5121
+ controlPosition="start"
5122
+ value={value}
5123
+ onValueChange={setValue}
5124
+ >
5125
+ <Radio.Item
5126
+ label="Free"
5127
+ description="For personal or hobby projects that aren't business-critical."
5128
+ value="free"
5129
+ />
5130
+ <Radio.Item
5131
+ label="Pro"
5132
+ description="For professional websites that aren't business-critical."
5133
+ value="pro"
5134
+ />
5135
+ </Radio.Group>
5136
+ ```
5137
+
5138
+ ```tsx
5139
+ <Radio.Group
5140
+ legend="Choose a plan"
5141
+ appearance="card"
5142
+ value={value}
5143
+ onValueChange={setValue}
5144
+ >
5145
+ <Radio.Item
5146
+ label={
5147
+ <span className="flex items-center gap-2">
5148
+ Free
5149
+ <Badge variant="neutral">$0</Badge>
5150
+ </span>
5151
+ }
5152
+ description="For personal or hobby projects."
5153
+ value="free"
5154
+ />
5155
+ <Radio.Item
5156
+ label={
5157
+ <span className="flex items-center gap-2">
5158
+ Pro
5159
+ <Badge variant="primary">Popular</Badge>
5160
+ </span>
5161
+ }
5162
+ description="For professional websites."
5163
+ value="pro"
5164
+ />
5165
+ </Radio.Group>
5166
+ ```
5167
+
4286
5168
  ```tsx
4287
5169
  <Radio.Group
4288
5170
  legend="Choose a plan"
@@ -4361,7 +5243,7 @@ Select component
4361
5243
 
4362
5244
  **Colors (kumo tokens used):**
4363
5245
 
4364
- `bg-kumo-base`, `bg-kumo-hairline`, `bg-kumo-tint`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-placeholder`, `text-kumo-subtle`
5246
+ `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-hairline`, `bg-kumo-tint`, `border-kumo-line`, `ring-kumo-brand`, `ring-kumo-focus`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-placeholder`, `text-kumo-subtle`
4365
5247
 
4366
5248
  **Styling:**
4367
5249
 
@@ -4746,7 +5628,7 @@ Password/secret input that masks its value by default and reveals on click. Incl
4746
5628
 
4747
5629
  **Colors (kumo tokens used):**
4748
5630
 
4749
- `bg-kumo-brand`, `bg-kumo-control`, `outline-kumo-hairline`, `ring-kumo-hairline`, `text-kumo-default`, `text-kumo-subtle`
5631
+ `bg-kumo-brand`, `bg-kumo-control`, `outline-kumo-focus`, `ring-kumo-brand`, `ring-kumo-focus`, `text-kumo-default`, `text-kumo-subtle`
4750
5632
 
4751
5633
  **Examples:**
4752
5634
 
@@ -4863,7 +5745,7 @@ Sidebar — responsive navigation panel with expand/collapse support. Compound
4863
5745
 
4864
5746
  **Colors (kumo tokens used):**
4865
5747
 
4866
- `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-hairline`, `bg-kumo-overlay`, `bg-kumo-recessed`, `bg-kumo-tint`, `border-kumo-hairline`, `ring-kumo-hairline`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
5748
+ `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-hairline`, `bg-kumo-overlay`, `bg-kumo-recessed`, `bg-kumo-tint`, `border-kumo-hairline`, `ring-kumo-brand`, `ring-kumo-hairline`, `text-kumo-default`, `text-kumo-subtle`
4867
5749
 
4868
5750
  **Styling:**
4869
5751
 
@@ -4893,66 +5775,129 @@ Props:
4893
5775
 
4894
5776
  Header sub-component
4895
5777
 
5778
+ Props:
5779
+ - `collapsible`: boolean
5780
+ - `defaultOpen`: boolean
5781
+ - `open`: boolean
5782
+
4896
5783
  #### Sidebar.Content
4897
5784
 
4898
5785
  Content sub-component
4899
5786
 
5787
+ Props:
5788
+ - `collapsible`: boolean
5789
+ - `defaultOpen`: boolean
5790
+ - `open`: boolean
5791
+
4900
5792
  #### Sidebar.Footer
4901
5793
 
4902
5794
  Footer sub-component
4903
5795
 
5796
+ Props:
5797
+ - `collapsible`: boolean
5798
+ - `defaultOpen`: boolean
5799
+ - `open`: boolean
5800
+
4904
5801
  #### Sidebar.Group
4905
5802
 
4906
5803
  Group sub-component
4907
5804
 
5805
+ Props:
5806
+ - `collapsible`: boolean
5807
+ - `defaultOpen`: boolean
5808
+ - `open`: boolean
5809
+
4908
5810
  #### Sidebar.GroupLabel
4909
5811
 
4910
5812
  GroupLabel sub-component
4911
5813
 
5814
+ Props:
5815
+ - `icon`: React.ComponentType<{ className?: string
5816
+
4912
5817
  #### Sidebar.GroupContent
4913
5818
 
4914
5819
  GroupContent sub-component
4915
5820
 
5821
+ Props:
5822
+ - `icon`: React.ComponentType<{ className?: string
5823
+
4916
5824
  #### Sidebar.Menu
4917
5825
 
4918
5826
  Menu sub-component
4919
5827
 
5828
+ Props:
5829
+ - `icon`: React.ComponentType<{ className?: string
5830
+
4920
5831
  #### Sidebar.MenuItem
4921
5832
 
4922
5833
  MenuItem sub-component
4923
5834
 
5835
+ Props:
5836
+ - `icon`: React.ComponentType<{ className?: string
5837
+
4924
5838
  #### Sidebar.MenuButton
4925
5839
 
4926
5840
  MenuButton sub-component
4927
5841
 
5842
+ Props:
5843
+ - `icon`: React.ComponentType<{ className?: string
5844
+
4928
5845
  #### Sidebar.MenuAction
4929
5846
 
4930
5847
  MenuAction sub-component
4931
5848
 
5849
+ Props:
5850
+ - `active`: boolean
5851
+ - `href`: string
5852
+
4932
5853
  #### Sidebar.MenuBadge
4933
5854
 
4934
5855
  MenuBadge sub-component
4935
5856
 
5857
+ Props:
5858
+ - `active`: boolean
5859
+ - `href`: string
5860
+
4936
5861
  #### Sidebar.MenuSub
4937
5862
 
4938
5863
  MenuSub sub-component
4939
5864
 
5865
+ Props:
5866
+ - `active`: boolean
5867
+ - `href`: string
5868
+
4940
5869
  #### Sidebar.MenuSubItem
4941
5870
 
4942
5871
  MenuSubItem sub-component
4943
5872
 
5873
+ Props:
5874
+ - `active`: boolean
5875
+ - `href`: string
5876
+
4944
5877
  #### Sidebar.MenuSubButton
4945
5878
 
4946
5879
  MenuSubButton sub-component
4947
5880
 
5881
+ Props:
5882
+ - `active`: boolean
5883
+ - `href`: string
5884
+
4948
5885
  #### Sidebar.Separator
4949
5886
 
4950
5887
  Separator sub-component
4951
5888
 
5889
+ Props:
5890
+ - `placeholder`: string
5891
+ - `shortcut`: string
5892
+
4952
5893
  #### Sidebar.Input
4953
5894
 
4954
5895
  Input sub-component
4955
5896
 
5897
+ Props:
5898
+ - `placeholder`: string
5899
+ - `shortcut`: string
5900
+
4956
5901
  #### Sidebar.Trigger
4957
5902
 
4958
5903
  Trigger sub-component
@@ -4969,6 +5914,9 @@ ResizeHandle sub-component
4969
5914
 
4970
5915
  MenuChevron sub-component
4971
5916
 
5917
+ Props:
5918
+ - `className`: string
5919
+
4972
5920
  #### Sidebar.Collapsible
4973
5921
 
4974
5922
  Collapsible sub-component
@@ -5310,7 +6258,7 @@ Surface component
5310
6258
 
5311
6259
  - `as`: React.ElementType
5312
6260
  - `render`: ReactNode
5313
- Allows you to replace the components HTML element with a different tag, or compose it with another component.
6261
+ Allows you to replace the component's HTML element with a different tag, or compose it with another component.
5314
6262
 
5315
6263
  Accepts a `ReactElement` or a function that returns the element to render.
5316
6264
  - `children`: ReactNode
@@ -5363,7 +6311,7 @@ Switch component
5363
6311
 
5364
6312
  **Colors (kumo tokens used):**
5365
6313
 
5366
- `bg-kumo-base`, `border-kumo-hairline`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
6314
+ `bg-kumo-base`, `ring-kumo-brand`, `ring-kumo-focus`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
5367
6315
 
5368
6316
  **Sub-Components:**
5369
6317
 
@@ -5378,7 +6326,7 @@ Item sub-component
5378
6326
  Group sub-component
5379
6327
 
5380
6328
  Props:
5381
- - `legend`: string (required)
6329
+ - `legend`: string
5382
6330
  - `children`: ReactNode (required)
5383
6331
  - `error`: string
5384
6332
  - `description`: ReactNode
@@ -5386,6 +6334,14 @@ Props:
5386
6334
  - `controlFirst`: boolean
5387
6335
  - `className`: string
5388
6336
 
6337
+ #### Switch.Legend
6338
+
6339
+ Legend sub-component
6340
+
6341
+ Props:
6342
+ - `children`: ReactNode (required)
6343
+ - `className`: string
6344
+
5389
6345
 
5390
6346
  **Examples:**
5391
6347
 
@@ -5457,6 +6413,23 @@ Props:
5457
6413
  />
5458
6414
  ```
5459
6415
 
6416
+ ```tsx
6417
+ <Switch.Group legend="Notification settings">
6418
+ <Switch.Item label="Email notifications" />
6419
+ <Switch.Item label="SMS notifications" />
6420
+ <Switch.Item label="Push notifications" />
6421
+ </Switch.Group>
6422
+ ```
6423
+
6424
+ ```tsx
6425
+ <Switch.Group>
6426
+ <Switch.Legend className="sr-only">Notification settings</Switch.Legend>
6427
+ <Switch.Item label="Email notifications" />
6428
+ <Switch.Item label="SMS notifications" />
6429
+ <Switch.Item label="Push notifications" />
6430
+ </Switch.Group>
6431
+ ```
6432
+
5460
6433
  ```tsx
5461
6434
  <div className="flex flex-col gap-4">
5462
6435
  <Switch
@@ -5511,7 +6484,7 @@ Table — semantic HTML table with styled rows, cells, and selection support. C
5511
6484
 
5512
6485
  **Colors (kumo tokens used):**
5513
6486
 
5514
- `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-hairline`, `bg-kumo-tint`, `border-kumo-fill`, `text-kumo-default`, `text-kumo-strong`
6487
+ `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-hairline`, `bg-kumo-tint`, `border-kumo-fill`, `ring-kumo-brand`, `text-kumo-default`, `text-kumo-strong`
5515
6488
 
5516
6489
  **Sub-Components:**
5517
6490
 
@@ -5589,7 +6562,7 @@ ResizeHandle sub-component
5589
6562
  indeterminate={
5590
6563
  selectedIds.size > 0 && selectedIds.size < rows.length
5591
6564
  }
5592
- onValueChange={toggleAll}
6565
+ onCheckedChange={toggleAll}
5593
6566
  aria-label="Select all rows"
5594
6567
  />
5595
6568
  <Table.Head>Subject</Table.Head>
@@ -5602,7 +6575,7 @@ ResizeHandle sub-component
5602
6575
  <Table.Row key={row.id}>
5603
6576
  <Table.CheckCell
5604
6577
  checked={selectedIds.has(row.id)}
5605
- onValueChange={() => toggleRow(row.id)}
6578
+ onCheckedChange={() => toggleRow(row.id)}
5606
6579
  aria-label={`Select ${row.subject}`}
5607
6580
  />
5608
6581
  <Table.Cell>{row.subject}</Table.Cell>
@@ -5648,7 +6621,7 @@ ResizeHandle sub-component
5648
6621
  indeterminate={
5649
6622
  selectedIds.size > 0 && selectedIds.size < rows.length
5650
6623
  }
5651
- onValueChange={toggleAll}
6624
+ onCheckedChange={toggleAll}
5652
6625
  aria-label="Select all rows"
5653
6626
  />
5654
6627
  <Table.Head>Subject</Table.Head>
@@ -5664,7 +6637,7 @@ ResizeHandle sub-component
5664
6637
  >
5665
6638
  <Table.CheckCell
5666
6639
  checked={selectedIds.has(row.id)}
5667
- onValueChange={() => toggleRow(row.id)}
6640
+ onCheckedChange={() => toggleRow(row.id)}
5668
6641
  aria-label={`Select ${row.subject}`}
5669
6642
  />
5670
6643
  <Table.Cell>{row.subject}</Table.Cell>
@@ -5863,7 +6836,7 @@ ResizeHandle sub-component
5863
6836
  indeterminate={
5864
6837
  selectedIds.size > 0 && selectedIds.size < emailData.length
5865
6838
  }
5866
- onValueChange={toggleAll}
6839
+ onCheckedChange={toggleAll}
5867
6840
  aria-label="Select all rows"
5868
6841
  />
5869
6842
  <Table.Head>Subject</Table.Head>
@@ -5880,7 +6853,7 @@ ResizeHandle sub-component
5880
6853
  >
5881
6854
  <Table.CheckCell
5882
6855
  checked={selectedIds.has(row.id)}
5883
- onValueChange={() => toggleRow(row.id)}
6856
+ onCheckedChange={() => toggleRow(row.id)}
5884
6857
  aria-label={`Select ${row.subject}`}
5885
6858
  />
5886
6859
  <Table.Cell>
@@ -5958,7 +6931,7 @@ TableOfContents — presentational compound component for section navigation. P
5958
6931
 
5959
6932
  **Colors (kumo tokens used):**
5960
6933
 
5961
- `bg-kumo-brand`, `bg-kumo-line`, `bg-kumo-tint`, `text-kumo-default`, `text-kumo-subtle`
6934
+ `border-kumo-brand`, `border-kumo-hairline`, `border-kumo-line`, `text-kumo-default`, `text-kumo-subtle`
5962
6935
 
5963
6936
  **Sub-Components:**
5964
6937
 
@@ -5976,10 +6949,18 @@ List sub-component
5976
6949
 
5977
6950
  Item sub-component
5978
6951
 
6952
+ Props:
6953
+ - `active`: boolean
6954
+
5979
6955
  #### TableOfContents.Group
5980
6956
 
5981
6957
  Group sub-component
5982
6958
 
6959
+ Props:
6960
+ - `label`: string (required)
6961
+ - `href`: string
6962
+ - `active`: boolean
6963
+
5983
6964
 
5984
6965
  **Examples:**
5985
6966
 
@@ -6045,6 +7026,14 @@ Group sub-component
6045
7026
  <TableOfContents.Item active className="cursor-pointer">
6046
7027
  Overview
6047
7028
  </TableOfContents.Item>
7029
+ <TableOfContents.Group label="Examples" href="#examples-demo">
7030
+ <TableOfContents.Item className="cursor-pointer">
7031
+ Basic example
7032
+ </TableOfContents.Item>
7033
+ <TableOfContents.Item className="cursor-pointer">
7034
+ Advanced example
7035
+ </TableOfContents.Item>
7036
+ </TableOfContents.Group>
6048
7037
  <TableOfContents.Group label="Getting Started">
6049
7038
  <TableOfContents.Item className="cursor-pointer">
6050
7039
  Installation
@@ -6053,7 +7042,7 @@ Group sub-component
6053
7042
  Configuration
6054
7043
  </TableOfContents.Item>
6055
7044
  </TableOfContents.Group>
6056
- <TableOfContents.Group label="API">
7045
+ <TableOfContents.Group label="API" href="#api-demo">
6057
7046
  <TableOfContents.Item className="cursor-pointer">
6058
7047
  Props
6059
7048
  </TableOfContents.Item>
@@ -6128,7 +7117,7 @@ Tab navigation component with segmented or underline style. Built on Base UI Tab
6128
7117
 
6129
7118
  **Colors (kumo tokens used):**
6130
7119
 
6131
- `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-recessed`, `bg-kumo-tint`, `border-kumo-hairline`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
7120
+ `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-recessed`, `bg-kumo-tint`, `border-kumo-hairline`, `ring-kumo-brand`, `ring-kumo-focus`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-subtle`
6132
7121
 
6133
7122
  **Styling:**
6134
7123
 
@@ -6265,8 +7254,11 @@ Text component
6265
7254
  Whether to use bold font weight (only applies to body variants).
6266
7255
  - `truncate`: boolean
6267
7256
  Whether to truncate overflowing text with an ellipsis. Adds `truncate min-w-0` classes.
6268
- - `as`: React.ElementType
6269
- The HTML element type to render as (e.g. `"span"`, `"p"`, `"h1"`). Auto-selected based on variant if omitted.
7257
+ - `as`: enum
7258
+ The HTML element to render. Accepts headings (`"h1"`–`"h6"`), block text (`"p"`, `"pre"`), inline text (`"span"`, `"code"`, `"em"`, `"strong"`, `"small"`, `"abbr"`, `"time"`), form-related (`"label"`, `"legend"`), list/definition (`"dt"`, `"dd"`, `"li"`), and `"figcaption"`.
7259
+
7260
+ - **Required** for heading variants (`"heading1"`, `"heading2"`, `"heading3"`) — pick the element that reflects this text's place in the document outline, or `"span"` for decorative heading-styled text that is not a section heading.
7261
+ - **Optional** for body variants (defaults to `"p"`) and monospace variants (defaults to `"span"`).
6270
7262
  - `children`: ReactNode
6271
7263
  Text content.
6272
7264
 
@@ -6282,15 +7274,21 @@ Text component
6282
7274
  ```tsx
6283
7275
  <div className="grid w-full grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
6284
7276
  <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6285
- <Text variant="heading1">Heading 1</Text>
7277
+ <Text variant="heading1" as="h1">
7278
+ Heading 1
7279
+ </Text>
6286
7280
  <Text variant="mono-secondary">text-3xl (30px)</Text>
6287
7281
  </div>
6288
7282
  <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6289
- <Text variant="heading2">Heading 2</Text>
7283
+ <Text variant="heading2" as="h2">
7284
+ Heading 2
7285
+ </Text>
6290
7286
  <Text variant="mono-secondary">text-2xl (24px)</Text>
6291
7287
  </div>
6292
7288
  <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6293
- <Text variant="heading3">Heading 3</Text>
7289
+ <Text variant="heading3" as="h3">
7290
+ Heading 3
7291
+ </Text>
6294
7292
  <Text variant="mono-secondary">text-lg (16px)</Text>
6295
7293
  </div>
6296
7294
  <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
@@ -6379,7 +7377,7 @@ Toasty — toast notification provider and viewport. Renders a `Toast.Provider`
6379
7377
 
6380
7378
  **Colors (kumo tokens used):**
6381
7379
 
6382
- `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-control`, `bg-kumo-danger`, `bg-kumo-fill-hover`, `bg-kumo-info`, `bg-kumo-success`, `bg-kumo-warning`, `border-kumo-fill`, `ring-kumo-danger`, `ring-kumo-hairline`, `ring-kumo-info`, `ring-kumo-line`, `ring-kumo-success`, `ring-kumo-warning`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-info`, `text-kumo-strong`, `text-kumo-subtle`, `text-kumo-success`, `text-kumo-warning`
7380
+ `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-control`, `bg-kumo-danger`, `bg-kumo-fill-hover`, `bg-kumo-info`, `bg-kumo-success`, `bg-kumo-warning`, `border-kumo-fill`, `ring-kumo-danger`, `ring-kumo-hairline`, `ring-kumo-info`, `ring-kumo-line`, `ring-kumo-success`, `ring-kumo-warning`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-info`, `text-kumo-subtle`, `text-kumo-success`, `text-kumo-warning`
6383
7381
 
6384
7382
  **Styling:**
6385
7383
 
@@ -6516,11 +7514,11 @@ Multi-line textarea input with Input variants and InputArea-specific dimensions
6516
7514
  ## Quick Reference
6517
7515
 
6518
7516
  **Components by Category:**
7517
+ - **Other:** Autocomplete, CloudflareLogo, DatePicker, Label, Link, SensitiveInput, Sidebar, Table, TableOfContents, DeleteResource
6519
7518
  - **Display:** Badge, Breadcrumbs, Code, Collapsible, Empty, LayerCard, Meter, Text
6520
7519
  - **Feedback:** Banner, Loader, Toasty
6521
7520
  - **Action:** Button, ClipboardText
6522
- - **Input:** Checkbox, Combobox, DateRangePicker, Field, Input, Radio, Select, Switch
6523
- - **Other:** CloudflareLogo, DatePicker, Label, Link, SensitiveInput, Sidebar, Table, TableOfContents, DeleteResource
7521
+ - **Input:** Checkbox, Combobox, DateRangePicker, Field, Input, InputGroup, Radio, Select, Switch
6524
7522
  - **Navigation:** CommandPalette, MenuBar, Pagination, Tabs
6525
7523
  - **Overlay:** Dialog, DropdownMenu, Popover, Tooltip
6526
7524
  - **Layout:** Grid, Surface, PageHeader, ResourceListPage