@cloudflare/kumo 1.18.0 → 1.19.0

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 (228) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/ai/component-registry.json +174 -66
  3. package/ai/component-registry.md +836 -503
  4. package/ai/schemas.ts +19 -3
  5. package/dist/.build-complete +1 -1
  6. package/dist/ai/schemas.d.ts +55 -8
  7. package/dist/ai/schemas.d.ts.map +1 -1
  8. package/dist/ai/schemas.js +163 -146
  9. package/dist/ai/schemas.js.map +1 -1
  10. package/dist/chunks/{Legend-o0ntojbaplmszwk0.js → Legend-ks7se6149vsa3tze.js} +127 -118
  11. package/dist/chunks/Legend-ks7se6149vsa3tze.js.map +1 -0
  12. package/dist/chunks/{breadcrumbs-k39s28qx05vbxxth.js → breadcrumbs-ge20hcb3o5spswrk.js} +2 -2
  13. package/dist/chunks/{breadcrumbs-k39s28qx05vbxxth.js.map → breadcrumbs-ge20hcb3o5spswrk.js.map} +1 -1
  14. package/dist/chunks/{button-cdxnqcgzwko8ooha.js → button-oaqi7ykdisyskoos.js} +12 -12
  15. package/dist/chunks/button-oaqi7ykdisyskoos.js.map +1 -0
  16. package/dist/chunks/{checkbox-kt1uojk2f9e0d0h1.js → checkbox-mwgmohffm22ut13s.js} +5 -5
  17. package/dist/chunks/checkbox-mwgmohffm22ut13s.js.map +1 -0
  18. package/dist/chunks/{clipboard-text-vcbvmtne4zjk4b18.js → clipboard-text-dxczqon3d27xp6f0.js} +10 -10
  19. package/dist/chunks/{clipboard-text-vcbvmtne4zjk4b18.js.map → clipboard-text-dxczqon3d27xp6f0.js.map} +1 -1
  20. package/dist/chunks/{cloudflare-logo-bgts2jgsdh7sslw4.js → cloudflare-logo-pbavoe1wu8nr5c4n.js} +9 -9
  21. package/dist/chunks/{cloudflare-logo-bgts2jgsdh7sslw4.js.map → cloudflare-logo-pbavoe1wu8nr5c4n.js.map} +1 -1
  22. package/dist/chunks/{combobox-he2hd9e2ruknq5mp.js → combobox-eaowwt1xr4d23gsn.js} +113 -101
  23. package/dist/chunks/combobox-eaowwt1xr4d23gsn.js.map +1 -0
  24. package/dist/chunks/{command-palette-jc1w07jwakxvj23a.js → command-palette-maqtbmpfev9mysqd.js} +19 -19
  25. package/dist/chunks/command-palette-maqtbmpfev9mysqd.js.map +1 -0
  26. package/dist/chunks/{dialog-oqh8l3l3zutpibxx.js → dialog-e3m5bhs7fds26p9y.js} +25 -25
  27. package/dist/chunks/dialog-e3m5bhs7fds26p9y.js.map +1 -0
  28. package/dist/chunks/{dropdown-ncwhcd912vmone8k.js → dropdown-ewte287db3vyt8t5.js} +94 -92
  29. package/dist/chunks/{dropdown-ncwhcd912vmone8k.js.map → dropdown-ewte287db3vyt8t5.js.map} +1 -1
  30. package/dist/chunks/{empty-cj898km1r8xwuw44.js → empty-dr1eckm2z40euns6.js} +2 -2
  31. package/dist/chunks/{empty-cj898km1r8xwuw44.js.map → empty-dr1eckm2z40euns6.js.map} +1 -1
  32. package/dist/chunks/{field-krp6z6vfbkrvufz2.js → field-bo5gmna16odrrb1q.js} +3 -3
  33. package/dist/chunks/{field-krp6z6vfbkrvufz2.js.map → field-bo5gmna16odrrb1q.js.map} +1 -1
  34. package/dist/chunks/{grid-m9r71jxo2b8q1972.js → grid-hj1ylz16p7g5uelh.js} +2 -2
  35. package/dist/chunks/{grid-m9r71jxo2b8q1972.js.map → grid-hj1ylz16p7g5uelh.js.map} +1 -1
  36. package/dist/chunks/{input-area-no30c09udyjxshu5.js → input-area-jkkkjej6luumrqpa.js} +4 -4
  37. package/dist/chunks/{input-area-no30c09udyjxshu5.js.map → input-area-jkkkjej6luumrqpa.js.map} +1 -1
  38. package/dist/chunks/{input-h48k3uagzrgb98au.js → input-cw05pbqdburghkus.js} +31 -31
  39. package/dist/chunks/input-cw05pbqdburghkus.js.map +1 -0
  40. package/dist/chunks/{input-group-lxdd09p60cf27pe1.js → input-group-lfugneuz71g42n0w.js} +6 -6
  41. package/dist/chunks/input-group-lfugneuz71g42n0w.js.map +1 -0
  42. package/dist/chunks/label-cvyvbqmt4mt757ff.js +68 -0
  43. package/dist/chunks/{label-latndvb1ngem7we8.js.map → label-cvyvbqmt4mt757ff.js.map} +1 -1
  44. package/dist/chunks/layer-card-ljqth3yxgnk04v2o.js +46 -0
  45. package/dist/chunks/layer-card-ljqth3yxgnk04v2o.js.map +1 -0
  46. package/dist/chunks/{link-hn5ejal7nhh0o0b4.js → link-fjnhtxvfe5ieamjf.js} +2 -2
  47. package/dist/chunks/{link-hn5ejal7nhh0o0b4.js.map → link-fjnhtxvfe5ieamjf.js.map} +1 -1
  48. package/dist/chunks/menubar-e5e4zwfagr0wx023.js +96 -0
  49. package/dist/chunks/menubar-e5e4zwfagr0wx023.js.map +1 -0
  50. package/dist/chunks/{meter-gfa1hz9fhjnvx784.js → meter-duj3micor1lqj3y2.js} +2 -2
  51. package/dist/chunks/{meter-gfa1hz9fhjnvx784.js.map → meter-duj3micor1lqj3y2.js.map} +1 -1
  52. package/dist/chunks/pagination-olaypvwr8swsmn8m.js +266 -0
  53. package/dist/chunks/pagination-olaypvwr8swsmn8m.js.map +1 -0
  54. package/dist/chunks/{popover-h300w4vit0s2ayej.js → popover-nv9cmzbo7mf6bky0.js} +70 -74
  55. package/dist/chunks/popover-nv9cmzbo7mf6bky0.js.map +1 -0
  56. package/dist/chunks/{radio-jouttv89lbvhs55r.js → radio-ihxbe37us2jnqtzf.js} +5 -5
  57. package/dist/chunks/radio-ihxbe37us2jnqtzf.js.map +1 -0
  58. package/dist/chunks/select-nx6ded5swra74iar.js +213 -0
  59. package/dist/chunks/select-nx6ded5swra74iar.js.map +1 -0
  60. package/dist/chunks/{sensitive-input-hd4tpqkzifad1yca.js → sensitive-input-00fujb510rrn61v9.js} +4 -4
  61. package/dist/chunks/{sensitive-input-hd4tpqkzifad1yca.js.map → sensitive-input-00fujb510rrn61v9.js.map} +1 -1
  62. package/dist/chunks/{sidebar-hljy3ssm8itc0ucx.js → sidebar-ltbfius1eolkl8tb.js} +22 -26
  63. package/dist/chunks/sidebar-ltbfius1eolkl8tb.js.map +1 -0
  64. package/dist/chunks/surface-dfgurg5eu3et4vw1.js +29 -0
  65. package/dist/chunks/surface-dfgurg5eu3et4vw1.js.map +1 -0
  66. package/dist/chunks/{switch-ihaydbzem62bey4p.js → switch-fbv3iawqo3o3jgap.js} +17 -17
  67. package/dist/chunks/switch-fbv3iawqo3o3jgap.js.map +1 -0
  68. package/dist/chunks/table-of-contents-f813ivi7ta23vqdm.js +88 -0
  69. package/dist/chunks/table-of-contents-f813ivi7ta23vqdm.js.map +1 -0
  70. package/dist/chunks/table-olwwulga2l3hdwlx.js +189 -0
  71. package/dist/chunks/table-olwwulga2l3hdwlx.js.map +1 -0
  72. package/dist/chunks/{tabs-e7eh7l3mpk3xgmwq.js → tabs-lohcglgppp6gj0hp.js} +4 -4
  73. package/dist/chunks/{tabs-e7eh7l3mpk3xgmwq.js.map → tabs-lohcglgppp6gj0hp.js.map} +1 -1
  74. package/dist/chunks/{toast-bpz6iaq54u9jmuu8.js → toast-dg52x89yd231mxhe.js} +4 -4
  75. package/dist/chunks/{toast-bpz6iaq54u9jmuu8.js.map → toast-dg52x89yd231mxhe.js.map} +1 -1
  76. package/dist/chunks/{tooltip-belkznz8t8333h5f.js → tooltip-hikjvdbg3xghnq1x.js} +38 -37
  77. package/dist/chunks/tooltip-hikjvdbg3xghnq1x.js.map +1 -0
  78. package/dist/chunks/{vendor-base-ui-k7bzesq81ie36nya.js → vendor-base-ui-m5pz3e8c4grg5qmj.js} +21 -21
  79. package/dist/chunks/{vendor-base-ui-k7bzesq81ie36nya.js.map → vendor-base-ui-m5pz3e8c4grg5qmj.js.map} +1 -1
  80. package/dist/code.js +1 -1
  81. package/dist/components/breadcrumbs.js +1 -1
  82. package/dist/components/button.js +1 -1
  83. package/dist/components/chart.js +1 -1
  84. package/dist/components/checkbox.js +1 -1
  85. package/dist/components/clipboard-text.js +1 -1
  86. package/dist/components/cloudflare-logo.js +1 -1
  87. package/dist/components/combobox.js +1 -1
  88. package/dist/components/command-palette.js +1 -1
  89. package/dist/components/dialog.js +1 -1
  90. package/dist/components/dropdown.js +1 -1
  91. package/dist/components/empty.js +1 -1
  92. package/dist/components/field.js +1 -1
  93. package/dist/components/flow.js +2 -2
  94. package/dist/components/flow.js.map +1 -1
  95. package/dist/components/grid.js +1 -1
  96. package/dist/components/input.js +3 -3
  97. package/dist/components/label.js +1 -1
  98. package/dist/components/layer-card.js +1 -1
  99. package/dist/components/link.js +1 -1
  100. package/dist/components/menubar.js +1 -1
  101. package/dist/components/meter.js +1 -1
  102. package/dist/components/pagination.js +1 -1
  103. package/dist/components/popover.js +1 -1
  104. package/dist/components/radio.js +1 -1
  105. package/dist/components/select.js +1 -1
  106. package/dist/components/sensitive-input.js +1 -1
  107. package/dist/components/sidebar.js +1 -1
  108. package/dist/components/surface.js +1 -1
  109. package/dist/components/switch.js +1 -1
  110. package/dist/components/table-of-contents.js +8 -0
  111. package/dist/components/table-of-contents.js.map +1 -0
  112. package/dist/components/table.js +1 -1
  113. package/dist/components/tabs.js +1 -1
  114. package/dist/components/toast.js +2 -2
  115. package/dist/components/tooltip.js +1 -1
  116. package/dist/index.js +124 -120
  117. package/dist/index.js.map +1 -1
  118. package/dist/primitives/accordion.js +1 -1
  119. package/dist/primitives/alert-dialog.js +1 -1
  120. package/dist/primitives/autocomplete.js +1 -1
  121. package/dist/primitives/avatar.js +1 -1
  122. package/dist/primitives/button.js +1 -1
  123. package/dist/primitives/checkbox-group.js +1 -1
  124. package/dist/primitives/checkbox.js +1 -1
  125. package/dist/primitives/collapsible.js +1 -1
  126. package/dist/primitives/combobox.js +1 -1
  127. package/dist/primitives/context-menu.js +1 -1
  128. package/dist/primitives/csp-provider.js +1 -1
  129. package/dist/primitives/dialog.js +1 -1
  130. package/dist/primitives/direction-provider.js +1 -1
  131. package/dist/primitives/drawer.js +1 -1
  132. package/dist/primitives/field.js +1 -1
  133. package/dist/primitives/fieldset.js +1 -1
  134. package/dist/primitives/form.js +1 -1
  135. package/dist/primitives/input.js +1 -1
  136. package/dist/primitives/menu.js +1 -1
  137. package/dist/primitives/menubar.js +1 -1
  138. package/dist/primitives/meter.js +1 -1
  139. package/dist/primitives/navigation-menu.js +1 -1
  140. package/dist/primitives/number-field.js +1 -1
  141. package/dist/primitives/popover.js +1 -1
  142. package/dist/primitives/preview-card.js +1 -1
  143. package/dist/primitives/progress.js +1 -1
  144. package/dist/primitives/radio-group.js +1 -1
  145. package/dist/primitives/radio.js +1 -1
  146. package/dist/primitives/scroll-area.js +1 -1
  147. package/dist/primitives/select.js +1 -1
  148. package/dist/primitives/separator.js +1 -1
  149. package/dist/primitives/slider.js +1 -1
  150. package/dist/primitives/switch.js +1 -1
  151. package/dist/primitives/tabs.js +1 -1
  152. package/dist/primitives/toast.js +1 -1
  153. package/dist/primitives/toggle-group.js +1 -1
  154. package/dist/primitives/toggle.js +1 -1
  155. package/dist/primitives/toolbar.js +1 -1
  156. package/dist/primitives/tooltip.js +1 -1
  157. package/dist/primitives.js +1 -1
  158. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  159. package/dist/scripts/theme-generator/config.js +3 -3
  160. package/dist/scripts/theme-generator/config.js.map +1 -1
  161. package/dist/src/components/button/button.d.ts +1 -1
  162. package/dist/src/components/button/button.d.ts.map +1 -1
  163. package/dist/src/components/chart/EChart.d.ts +18 -2
  164. package/dist/src/components/chart/EChart.d.ts.map +1 -1
  165. package/dist/src/components/chart/TimeseriesChart.d.ts.map +1 -1
  166. package/dist/src/components/chart/index.d.ts +1 -1
  167. package/dist/src/components/chart/index.d.ts.map +1 -1
  168. package/dist/src/components/combobox/combobox.d.ts +16 -2
  169. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  170. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  171. package/dist/src/components/input/input.d.ts.map +1 -1
  172. package/dist/src/components/label/label.d.ts.map +1 -1
  173. package/dist/src/components/layer-card/layer-card.d.ts +39 -5
  174. package/dist/src/components/layer-card/layer-card.d.ts.map +1 -1
  175. package/dist/src/components/menubar/menubar.d.ts.map +1 -1
  176. package/dist/src/components/pagination/pagination.d.ts +51 -1
  177. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  178. package/dist/src/components/popover/popover.d.ts +35 -8
  179. package/dist/src/components/popover/popover.d.ts.map +1 -1
  180. package/dist/src/components/radio/radio.d.ts +1 -1
  181. package/dist/src/components/select/select.d.ts +49 -5
  182. package/dist/src/components/select/select.d.ts.map +1 -1
  183. package/dist/src/components/sidebar/sidebar.d.ts +2 -2
  184. package/dist/src/components/sidebar/sidebar.d.ts.map +1 -1
  185. package/dist/src/components/surface/index.d.ts +3 -0
  186. package/dist/src/components/surface/index.d.ts.map +1 -1
  187. package/dist/src/components/surface/surface.d.ts +14 -10
  188. package/dist/src/components/surface/surface.d.ts.map +1 -1
  189. package/dist/src/components/table/table.d.ts.map +1 -1
  190. package/dist/src/components/table-of-contents/index.d.ts +2 -0
  191. package/dist/src/components/table-of-contents/index.d.ts.map +1 -0
  192. package/dist/src/components/table-of-contents/table-of-contents.d.ts +70 -0
  193. package/dist/src/components/table-of-contents/table-of-contents.d.ts.map +1 -0
  194. package/dist/src/components/tooltip/tooltip.d.ts +15 -6
  195. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  196. package/dist/src/index.d.ts +6 -2
  197. package/dist/src/index.d.ts.map +1 -1
  198. package/dist/styles/kumo-binding.css +1 -0
  199. package/dist/styles/kumo-standalone.css +1 -1
  200. package/dist/styles/theme-kumo.css +6 -6
  201. package/package.json +5 -1
  202. package/scripts/theme-generator/config.ts +8 -6
  203. package/dist/chunks/Legend-o0ntojbaplmszwk0.js.map +0 -1
  204. package/dist/chunks/button-cdxnqcgzwko8ooha.js.map +0 -1
  205. package/dist/chunks/checkbox-kt1uojk2f9e0d0h1.js.map +0 -1
  206. package/dist/chunks/combobox-he2hd9e2ruknq5mp.js.map +0 -1
  207. package/dist/chunks/command-palette-jc1w07jwakxvj23a.js.map +0 -1
  208. package/dist/chunks/dialog-oqh8l3l3zutpibxx.js.map +0 -1
  209. package/dist/chunks/input-group-lxdd09p60cf27pe1.js.map +0 -1
  210. package/dist/chunks/input-h48k3uagzrgb98au.js.map +0 -1
  211. package/dist/chunks/label-latndvb1ngem7we8.js +0 -62
  212. package/dist/chunks/layer-card-l5yjvrxry1dhte57.js +0 -44
  213. package/dist/chunks/layer-card-l5yjvrxry1dhte57.js.map +0 -1
  214. package/dist/chunks/menubar-f1pilzooe5mue7c4.js +0 -92
  215. package/dist/chunks/menubar-f1pilzooe5mue7c4.js.map +0 -1
  216. package/dist/chunks/pagination-cu5lm6p5dxuycta4.js +0 -243
  217. package/dist/chunks/pagination-cu5lm6p5dxuycta4.js.map +0 -1
  218. package/dist/chunks/popover-h300w4vit0s2ayej.js.map +0 -1
  219. package/dist/chunks/radio-jouttv89lbvhs55r.js.map +0 -1
  220. package/dist/chunks/select-kva5ru5f673kah1m.js +0 -179
  221. package/dist/chunks/select-kva5ru5f673kah1m.js.map +0 -1
  222. package/dist/chunks/sidebar-hljy3ssm8itc0ucx.js.map +0 -1
  223. package/dist/chunks/surface-cilvbyhmyujz1bee.js +0 -36
  224. package/dist/chunks/surface-cilvbyhmyujz1bee.js.map +0 -1
  225. package/dist/chunks/switch-ihaydbzem62bey4p.js.map +0 -1
  226. package/dist/chunks/table-inweecadl3her7pd.js +0 -183
  227. package/dist/chunks/table-inweecadl3her7pd.js.map +0 -1
  228. package/dist/chunks/tooltip-belkznz8t8333h5f.js.map +0 -1
@@ -383,7 +383,7 @@ Primary action trigger. Supports multiple variants, sizes, shapes, icons, and lo
383
383
 
384
384
  **Colors (kumo tokens used):**
385
385
 
386
- `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-brand-hover`, `bg-kumo-danger`, `bg-kumo-tint`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
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`
387
387
 
388
388
  **Examples:**
389
389
 
@@ -504,7 +504,7 @@ Checkbox component
504
504
 
505
505
  **Colors (kumo tokens used):**
506
506
 
507
- `bg-kumo-base`, `bg-kumo-contrast`, `ring-kumo-contrast`, `ring-kumo-danger`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-inverse`, `text-kumo-subtle`
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`
508
508
 
509
509
  **Styling:**
510
510
 
@@ -638,7 +638,7 @@ Read-only text field with a one-click copy-to-clipboard button.
638
638
 
639
639
  **Colors (kumo tokens used):**
640
640
 
641
- `bg-kumo-base`, `border-kumo-line`, `outline-kumo-fill`, `text-kumo-default`
641
+ `bg-kumo-base`, `border-kumo-hairline`, `outline-kumo-fill`, `text-kumo-default`
642
642
 
643
643
  **Styling:**
644
644
 
@@ -980,7 +980,7 @@ Cloudflare logo component.
980
980
 
981
981
  **Colors (kumo tokens used):**
982
982
 
983
- `bg-kumo-base`, `ring-kumo-line`, `text-kumo-default`
983
+ `bg-kumo-base`, `ring-kumo-hairline`, `text-kumo-default`
984
984
 
985
985
  **Examples:**
986
986
 
@@ -1108,7 +1108,7 @@ Cloudflare logo component.
1108
1108
  ```
1109
1109
 
1110
1110
  ```tsx
1111
- <footer className="flex w-full items-center justify-between rounded-lg border border-kumo-line bg-kumo-elevated px-6 py-4">
1111
+ <footer className="flex w-full items-center justify-between rounded-lg border border-kumo-hairline bg-kumo-elevated px-6 py-4">
1112
1112
  <span className="text-sm text-kumo-subtle">
1113
1113
  &copy; 2026 Your Company. All rights reserved.
1114
1114
  </span>
@@ -1277,7 +1277,7 @@ Combobox — autocomplete input with filterable dropdown list. Compound compone
1277
1277
 
1278
1278
  **Colors (kumo tokens used):**
1279
1279
 
1280
- `bg-kumo-base`, `bg-kumo-fill-hover`, `bg-kumo-overlay`, `bg-kumo-tint`, `border-kumo-line`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
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`
1281
1281
 
1282
1282
  **Sub-Components:**
1283
1283
 
@@ -1656,7 +1656,7 @@ CommandPalette — accessible command palette / spotlight search overlay. Compo
1656
1656
 
1657
1657
  **Colors (kumo tokens used):**
1658
1658
 
1659
- `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-overlay`, `bg-kumo-warning`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
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`
1660
1660
 
1661
1661
  **Examples:**
1662
1662
 
@@ -1714,13 +1714,13 @@ CommandPalette — accessible command palette / spotlight search overlay. Compo
1714
1714
  </CommandPalette.List>
1715
1715
  <CommandPalette.Footer>
1716
1716
  <span className="flex items-center gap-2">
1717
- <kbd className="rounded border border-kumo-line bg-kumo-base px-1.5 py-0.5 text-[10px]">
1717
+ <kbd className="rounded border border-kumo-hairline bg-kumo-base px-1.5 py-0.5 text-[10px]">
1718
1718
  ↑↓
1719
1719
  </kbd>
1720
1720
  <span>Navigate</span>
1721
1721
  </span>
1722
1722
  <span className="flex items-center gap-2">
1723
- <kbd className="rounded border border-kumo-line bg-kumo-base px-1.5 py-0.5 text-[10px]">
1723
+ <kbd className="rounded border border-kumo-hairline bg-kumo-base px-1.5 py-0.5 text-[10px]">
1724
1724
 
1725
1725
  </kbd>
1726
1726
  <span>Select</span>
@@ -1857,13 +1857,13 @@ CommandPalette — accessible command palette / spotlight search overlay. Compo
1857
1857
  </CommandPalette.List>
1858
1858
  <CommandPalette.Footer>
1859
1859
  <span className="flex items-center gap-2">
1860
- <kbd className="rounded border border-kumo-line bg-kumo-base px-1.5 py-0.5 text-[10px]">
1860
+ <kbd className="rounded border border-kumo-hairline bg-kumo-base px-1.5 py-0.5 text-[10px]">
1861
1861
  ↑↓
1862
1862
  </kbd>
1863
1863
  <span>Navigate</span>
1864
1864
  </span>
1865
1865
  <span className="flex items-center gap-2">
1866
- <kbd className="rounded border border-kumo-line bg-kumo-base px-1.5 py-0.5 text-[10px]">
1866
+ <kbd className="rounded border border-kumo-hairline bg-kumo-base px-1.5 py-0.5 text-[10px]">
1867
1867
  ⌘↵
1868
1868
  </kbd>
1869
1869
  <span>Open in new tab</span>
@@ -1901,11 +1901,15 @@ DatePicker — a date selection calendar. Built on [react-day-picker](https://d
1901
1901
 
1902
1902
  ```tsx
1903
1903
  <div className="flex flex-col gap-4">
1904
- <DatePicker mode="single" selected={date} onChange={d => {
1905
- if (d) {
1906
- setDate(d);
1907
- }
1908
- }} />
1904
+ <DatePicker
1905
+ mode="single"
1906
+ selected={date}
1907
+ onChange={(d) => {
1908
+ if (d) {
1909
+ setDate(d);
1910
+ }
1911
+ }}
1912
+ />
1909
1913
  <p className="text-sm text-kumo-subtle">
1910
1914
  Selected: {date ? date.toLocaleDateString() : "None"}
1911
1915
  </p>
@@ -1960,10 +1964,10 @@ DatePicker — a date selection calendar. Built on [react-day-picker](https://d
1960
1964
 
1961
1965
  ```tsx
1962
1966
  <Popover>
1963
- <Popover.Trigger asChild>
1964
- <Button variant="outline" icon={CalendarDotsIcon}>
1965
- {date ? date.toLocaleDateString() : "Pick a date"}
1966
- </Button>
1967
+ <Popover.Trigger
1968
+ render={<Button variant="outline" icon={CalendarDotsIcon} />}
1969
+ >
1970
+ {date ? date.toLocaleDateString() : "Pick a date"}
1967
1971
  </Popover.Trigger>
1968
1972
  <Popover.Content className="p-3">
1969
1973
  <DatePicker mode="single" selected={date} onChange={setDate} />
@@ -1973,10 +1977,10 @@ DatePicker — a date selection calendar. Built on [react-day-picker](https://d
1973
1977
 
1974
1978
  ```tsx
1975
1979
  <Popover>
1976
- <Popover.Trigger asChild>
1977
- <Button variant="outline" icon={CalendarDotsIcon}>
1978
- {formatRange()}
1979
- </Button>
1980
+ <Popover.Trigger
1981
+ render={<Button variant="outline" icon={CalendarDotsIcon} />}
1982
+ >
1983
+ {formatRange()}
1980
1984
  </Popover.Trigger>
1981
1985
  <Popover.Content className="p-3">
1982
1986
  <DatePicker
@@ -1991,14 +1995,14 @@ DatePicker — a date selection calendar. Built on [react-day-picker](https://d
1991
1995
 
1992
1996
  ```tsx
1993
1997
  <Popover>
1994
- <Popover.Trigger asChild>
1995
- <Button variant="outline" icon={CalendarDotsIcon}>
1996
- {formatRange()}
1997
- </Button>
1998
+ <Popover.Trigger
1999
+ render={<Button variant="outline" icon={CalendarDotsIcon} />}
2000
+ >
2001
+ {formatRange()}
1998
2002
  </Popover.Trigger>
1999
2003
  <Popover.Content className="p-0">
2000
2004
  <div className="flex">
2001
- <div className="flex flex-col gap-1 border-r border-kumo-line p-2 text-sm">
2005
+ <div className="flex flex-col gap-1 border-r border-kumo-hairline p-2 text-sm">
2002
2006
  {presets.map((preset) => {
2003
2007
  const isActive = isPresetActive(preset);
2004
2008
  return (
@@ -2006,10 +2010,11 @@ DatePicker — a date selection calendar. Built on [react-day-picker](https://d
2006
2010
  key={preset.label}
2007
2011
  type="button"
2008
2012
  onClick={() => handlePresetClick(preset)}
2009
- className={`rounded-md px-3 py-1.5 text-left whitespace-nowrap ${isActive
2010
- ? "bg-kumo-bg-inverse text-kumo-text-inverse"
2011
- : "text-kumo-strong hover:bg-kumo-control"
2012
- }`}
2013
+ className={`rounded-md px-3 py-1.5 text-left whitespace-nowrap ${
2014
+ isActive
2015
+ ? "bg-kumo-bg-inverse text-kumo-text-inverse"
2016
+ : "text-kumo-strong hover:bg-kumo-control"
2017
+ }`}
2013
2018
  >
2014
2019
  {preset.label}
2015
2020
  </button>
@@ -2144,7 +2149,7 @@ Dialog component
2144
2149
 
2145
2150
  **Colors (kumo tokens used):**
2146
2151
 
2147
- `bg-kumo-base`, `bg-kumo-recessed`, `text-kumo-default`
2152
+ `bg-kumo-base`, `bg-kumo-recessed`, `ring-kumo-line`, `text-kumo-default`
2148
2153
 
2149
2154
  **Styling:**
2150
2155
 
@@ -2460,7 +2465,7 @@ DropdownMenu — accessible dropdown menu anchored to a trigger. Compound compo
2460
2465
 
2461
2466
  **Colors (kumo tokens used):**
2462
2467
 
2463
- `bg-kumo-control`, `bg-kumo-danger`, `bg-kumo-line`, `bg-kumo-overlay`, `bg-kumo-tint`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`
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`
2464
2469
 
2465
2470
  **Sub-Components:**
2466
2471
 
@@ -2726,7 +2731,7 @@ Responsive CSS grid layout container with preset column configurations.
2726
2731
 
2727
2732
  **Colors (kumo tokens used):**
2728
2733
 
2729
- `border-kumo-line`
2734
+ `border-kumo-hairline`
2730
2735
 
2731
2736
  **Examples:**
2732
2737
 
@@ -3013,7 +3018,7 @@ Input component
3013
3018
 
3014
3019
  **Colors (kumo tokens used):**
3015
3020
 
3016
- `bg-kumo-control`, `ring-kumo-danger`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-subtle`
3021
+ `bg-kumo-control`, `ring-kumo-danger`, `ring-kumo-hairline`, `text-kumo-default`, `text-kumo-subtle`
3017
3022
 
3018
3023
  **Styling:**
3019
3024
 
@@ -3102,6 +3107,26 @@ Input component
3102
3107
  />
3103
3108
  ```
3104
3109
 
3110
+ ```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
+ />
3118
+ ```
3119
+
3120
+ ```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
+ />
3128
+ ```
3129
+
3105
3130
 
3106
3131
  ---
3107
3132
 
@@ -3201,13 +3226,19 @@ LayerCard component
3201
3226
 
3202
3227
  **Props:**
3203
3228
 
3229
+ - `render`: ReactNode
3230
+ Allows you to replace the component’s HTML element with a different tag, or compose it with another component.
3231
+
3232
+ Accepts a `ReactElement` or a function that returns the element to render.
3204
3233
  - `children`: ReactNode
3205
3234
  - `className`: string
3206
- Additional CSS classes merged via `cn()`.
3235
+ - `id`: string
3236
+ - `lang`: string
3237
+ - `title`: string
3207
3238
 
3208
3239
  **Colors (kumo tokens used):**
3209
3240
 
3210
- `bg-kumo-base`, `bg-kumo-elevated`, `ring-kumo-fill`, `ring-kumo-line`, `text-kumo-strong`
3241
+ `bg-kumo-base`, `bg-kumo-elevated`, `ring-kumo-fill`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-strong`
3211
3242
 
3212
3243
  **Styling:**
3213
3244
 
@@ -3453,7 +3484,7 @@ MenuBar — horizontal icon-button toolbar with keyboard arrow-key navigation.
3453
3484
 
3454
3485
  **Colors (kumo tokens used):**
3455
3486
 
3456
- `bg-kumo-base`, `bg-kumo-recessed`, `border-kumo-fill`, `border-kumo-recessed`
3487
+ `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-recessed`, `border-kumo-recessed`, `ring-kumo-line`
3457
3488
 
3458
3489
  **Styling:**
3459
3490
 
@@ -3564,6 +3595,12 @@ Pagination component
3564
3595
  Total number of items across all pages.
3565
3596
  - `className`: string
3566
3597
  Additional CSS classes for the container
3598
+ - `labels`: PaginationLabels
3599
+ Labels for internationalization of aria-labels. All labels have English defaults.
3600
+
3601
+ For visible text like "Showing X of Y", use render props on sub-components:
3602
+ - `Pagination.Info` children for the info text
3603
+ - `Pagination.PageSize` label prop for the "Per page:" text
3567
3604
  - `children`: ReactNode
3568
3605
  Compound component children for custom layouts. Use Pagination.Info, Pagination.PageSize, Pagination.Controls, and Pagination.Separator.
3569
3606
  - `controls`: enum [default: full]
@@ -3573,7 +3610,7 @@ Pagination component
3573
3610
 
3574
3611
  **Colors (kumo tokens used):**
3575
3612
 
3576
- `border-kumo-line`, `ring-kumo-line`, `text-kumo-strong`
3613
+ `border-kumo-hairline`, `ring-kumo-hairline`, `text-kumo-strong`
3577
3614
 
3578
3615
  **Styling:**
3579
3616
 
@@ -3600,6 +3637,7 @@ PageSize sub-component
3600
3637
  Props:
3601
3638
  - `value`: number (required)
3602
3639
  - `options`: number[]
3640
+ - `page`: " (required)
3603
3641
  - `label`: ReactNode
3604
3642
  - `className`: string
3605
3643
 
@@ -3731,6 +3769,34 @@ Props:
3731
3769
  </Pagination>
3732
3770
  ```
3733
3771
 
3772
+ ```tsx
3773
+ <Pagination
3774
+ page={page}
3775
+ setPage={setPage}
3776
+ perPage={10}
3777
+ totalCount={100}
3778
+ labels={{
3779
+ firstPage: "Première page",
3780
+ previousPage: "Page précédente",
3781
+ nextPage: "Page suivante",
3782
+ lastPage: "Dernière page",
3783
+ pageNumber: "Numéro de page",
3784
+ pageSize: "Taille de page",
3785
+ }}
3786
+ >
3787
+ <Pagination.Info>
3788
+ {({ pageShowingRange, totalCount }) => (
3789
+ <>
3790
+ Affichage de{" "}
3791
+ <span className="tabular-nums">{pageShowingRange}</span> sur{" "}
3792
+ <span className="tabular-nums">{totalCount}</span>
3793
+ </>
3794
+ )}
3795
+ </Pagination.Info>
3796
+ <Pagination.Controls />
3797
+ </Pagination>
3798
+ ```
3799
+
3734
3800
 
3735
3801
  ---
3736
3802
 
@@ -3785,9 +3851,11 @@ Close sub-component
3785
3851
 
3786
3852
  ```tsx
3787
3853
  <Popover>
3788
- <Popover.Trigger asChild>
3789
- <Button shape="square" icon={BellIcon} aria-label="Notifications" />
3790
- </Popover.Trigger>
3854
+ <Popover.Trigger
3855
+ render={
3856
+ <Button shape="square" icon={BellIcon} aria-label="Notifications" />
3857
+ }
3858
+ />
3791
3859
  <Popover.Content>
3792
3860
  <Popover.Title>Notifications</Popover.Title>
3793
3861
  <Popover.Description>
@@ -3799,9 +3867,7 @@ Close sub-component
3799
3867
 
3800
3868
  ```tsx
3801
3869
  <Popover>
3802
- <Popover.Trigger asChild>
3803
- <Button>Open Popover</Button>
3804
- </Popover.Trigger>
3870
+ <Popover.Trigger render={<Button />}>Open Popover</Popover.Trigger>
3805
3871
  <Popover.Content>
3806
3872
  <Popover.Title>Popover Title</Popover.Title>
3807
3873
  <Popover.Description>
@@ -3813,19 +3879,15 @@ Close sub-component
3813
3879
 
3814
3880
  ```tsx
3815
3881
  <Popover>
3816
- <Popover.Trigger asChild>
3817
- <Button>Open Settings</Button>
3818
- </Popover.Trigger>
3882
+ <Popover.Trigger render={<Button />}>Open Settings</Popover.Trigger>
3819
3883
  <Popover.Content>
3820
3884
  <Popover.Title>Settings</Popover.Title>
3821
3885
  <Popover.Description>
3822
3886
  Configure your preferences below.
3823
3887
  </Popover.Description>
3824
3888
  <div className="mt-3">
3825
- <Popover.Close asChild>
3826
- <Button variant="secondary" size="sm">
3827
- Close
3828
- </Button>
3889
+ <Popover.Close render={<Button variant="secondary" size="sm" />}>
3890
+ Close
3829
3891
  </Popover.Close>
3830
3892
  </div>
3831
3893
  </Popover.Content>
@@ -3835,8 +3897,8 @@ Close sub-component
3835
3897
  ```tsx
3836
3898
  <div className="flex flex-wrap gap-4">
3837
3899
  <Popover>
3838
- <Popover.Trigger asChild>
3839
- <Button variant="secondary">Bottom</Button>
3900
+ <Popover.Trigger render={<Button variant="secondary" />}>
3901
+ Bottom
3840
3902
  </Popover.Trigger>
3841
3903
  <Popover.Content side="bottom">
3842
3904
  <Popover.Title>Bottom</Popover.Title>
@@ -3847,8 +3909,8 @@ Close sub-component
3847
3909
  </Popover>
3848
3910
 
3849
3911
  <Popover>
3850
- <Popover.Trigger asChild>
3851
- <Button variant="secondary">Top</Button>
3912
+ <Popover.Trigger render={<Button variant="secondary" />}>
3913
+ Top
3852
3914
  </Popover.Trigger>
3853
3915
  <Popover.Content side="top">
3854
3916
  <Popover.Title>Top</Popover.Title>
@@ -3857,8 +3919,8 @@ Close sub-component
3857
3919
  </Popover>
3858
3920
 
3859
3921
  <Popover>
3860
- <Popover.Trigger asChild>
3861
- <Button variant="secondary">Left</Button>
3922
+ <Popover.Trigger render={<Button variant="secondary" />}>
3923
+ Left
3862
3924
  </Popover.Trigger>
3863
3925
  <Popover.Content side="left">
3864
3926
  <Popover.Title>Left</Popover.Title>
@@ -3867,8 +3929,8 @@ Close sub-component
3867
3929
  </Popover>
3868
3930
 
3869
3931
  <Popover>
3870
- <Popover.Trigger asChild>
3871
- <Button variant="secondary">Right</Button>
3932
+ <Popover.Trigger render={<Button variant="secondary" />}>
3933
+ Right
3872
3934
  </Popover.Trigger>
3873
3935
  <Popover.Content side="right">
3874
3936
  <Popover.Title>Right</Popover.Title>
@@ -3880,9 +3942,7 @@ Close sub-component
3880
3942
 
3881
3943
  ```tsx
3882
3944
  <Popover>
3883
- <Popover.Trigger asChild>
3884
- <Button>User Profile</Button>
3885
- </Popover.Trigger>
3945
+ <Popover.Trigger render={<Button />}>User Profile</Popover.Trigger>
3886
3946
  <Popover.Content className="w-64">
3887
3947
  <div className="flex items-center gap-3">
3888
3948
  <div className="size-10 rounded-full bg-kumo-recessed" />
@@ -3891,14 +3951,14 @@ Close sub-component
3891
3951
  <p className="text-sm text-kumo-subtle">jane@example.com</p>
3892
3952
  </div>
3893
3953
  </div>
3894
- <div className="mt-3 flex gap-2 border-t border-kumo-line pt-3">
3954
+ <div className="mt-3 flex gap-2 border-t border-kumo-hairline pt-3">
3895
3955
  <Button variant="secondary" size="sm" className="flex-1">
3896
3956
  Profile
3897
3957
  </Button>
3898
- <Popover.Close asChild>
3899
- <Button variant="ghost" size="sm" className="flex-1">
3900
- Sign Out
3901
- </Button>
3958
+ <Popover.Close
3959
+ render={<Button variant="ghost" size="sm" className="flex-1" />}
3960
+ >
3961
+ Sign Out
3902
3962
  </Popover.Close>
3903
3963
  </div>
3904
3964
  </Popover.Content>
@@ -3907,8 +3967,12 @@ Close sub-component
3907
3967
 
3908
3968
  ```tsx
3909
3969
  <Popover>
3910
- <Popover.Trigger openOnHover delay={200} asChild>
3911
- <Button variant="secondary">Hover Me</Button>
3970
+ <Popover.Trigger
3971
+ openOnHover
3972
+ delay={200}
3973
+ render={<Button variant="secondary" />}
3974
+ >
3975
+ Hover Me
3912
3976
  </Popover.Trigger>
3913
3977
  <Popover.Content>
3914
3978
  <Popover.Title>Hover Triggered</Popover.Title>
@@ -3917,16 +3981,79 @@ Close sub-component
3917
3981
  interactive content like buttons and links.
3918
3982
  </Popover.Description>
3919
3983
  <div className="mt-3">
3920
- <Popover.Close asChild>
3921
- <Button variant="secondary" size="sm">
3922
- Got it
3923
- </Button>
3984
+ <Popover.Close render={<Button variant="secondary" size="sm" />}>
3985
+ Got it
3924
3986
  </Popover.Close>
3925
3987
  </div>
3926
3988
  </Popover.Content>
3927
3989
  </Popover>
3928
3990
  ```
3929
3991
 
3992
+ ```tsx
3993
+ <div className="w-full">
3994
+ <div className="overflow-hidden rounded-lg border border-kumo-hairline">
3995
+ <table className="w-full text-sm">
3996
+ <thead className="bg-kumo-elevated">
3997
+ <tr>
3998
+ <th className="px-4 py-2 text-left font-medium">Name</th>
3999
+ <th className="px-4 py-2 text-left font-medium">Status</th>
4000
+ <th className="w-12 px-4 py-2"></th>
4001
+ </tr>
4002
+ </thead>
4003
+ <tbody className="divide-y divide-kumo-hairline">
4004
+ {rows.map((row) => (
4005
+ <tr
4006
+ key={row.id}
4007
+ ref={(el) => {
4008
+ if (el) rowRefs.current.set(row.id, el);
4009
+ }}
4010
+ className={
4011
+ selectedRow === row.id ? "bg-kumo-recessed" : "bg-kumo-base"
4012
+ }
4013
+ >
4014
+ <td className="px-4 py-2 font-mono">{row.name}</td>
4015
+ <td className="px-4 py-2 text-kumo-subtle">{row.status}</td>
4016
+ <td className="px-4 py-2">
4017
+ <Button
4018
+ size="xs"
4019
+ variant="ghost"
4020
+ shape="square"
4021
+ icon={DotsThree}
4022
+ aria-label={`Actions for ${row.name}`}
4023
+ onClick={() => handleEdit(row.id)}
4024
+ />
4025
+ </td>
4026
+ </tr>
4027
+ ))}
4028
+ </tbody>
4029
+ </table>
4030
+ </div>
4031
+ <Popover
4032
+ open={!!selectedRow}
4033
+ onOpenChange={(open) => !open && setSelectedRow(null)}
4034
+ >
4035
+ <Popover.Content
4036
+ side="left"
4037
+ anchor={
4038
+ anchorRect ? { getBoundingClientRect: () => anchorRect } : undefined
4039
+ }
4040
+ >
4041
+ <Popover.Title>
4042
+ Edit {rows.find((r) => r.id === selectedRow)?.name}
4043
+ </Popover.Title>
4044
+ <Popover.Description>
4045
+ The popover anchors to the selected row, not the icon button.
4046
+ </Popover.Description>
4047
+ <div className="mt-3">
4048
+ <Popover.Close render={<Button size="sm" variant="secondary" />}>
4049
+ Close
4050
+ </Popover.Close>
4051
+ </div>
4052
+ </Popover.Content>
4053
+ </Popover>
4054
+ </div>
4055
+ ```
4056
+
3930
4057
 
3931
4058
  ---
3932
4059
 
@@ -3972,7 +4099,7 @@ Radio — radio button group for single-select choices. Compound component: `Ra
3972
4099
 
3973
4100
  **Colors (kumo tokens used):**
3974
4101
 
3975
- `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-tint`, `border-kumo-danger`, `border-kumo-hairline`, `border-kumo-interact`, `ring-kumo-danger`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
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`
3976
4103
 
3977
4104
  **Sub-Components:**
3978
4105
 
@@ -4204,6 +4331,8 @@ Select component
4204
4331
 
4205
4332
  - `className`: string
4206
4333
  Additional CSS classes merged via `cn()`.
4334
+ - `size`: enum [default: base]
4335
+ Size of the select trigger. Matches Input component sizes.
4207
4336
  - `label`: ReactNode
4208
4337
  Label content for the select. When provided, enables the Field wrapper with a visible label above the select. For accessibility without a visible label, use `aria-label` instead.
4209
4338
  - `hideLabel`: boolean
@@ -4232,7 +4361,7 @@ Select component
4232
4361
 
4233
4362
  **Colors (kumo tokens used):**
4234
4363
 
4235
- `bg-kumo-base`, `bg-kumo-line`, `bg-kumo-tint`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
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`
4236
4365
 
4237
4366
  **Styling:**
4238
4367
 
@@ -4270,6 +4399,51 @@ Separator sub-component
4270
4399
  />
4271
4400
  ```
4272
4401
 
4402
+ ```tsx
4403
+ <div className="grid gap-4">
4404
+ <div className="flex items-center gap-3">
4405
+ <span className="w-10 text-sm text-kumo-subtle">xs</span>
4406
+ <Select
4407
+ aria-label="Select size xs"
4408
+ size="xs"
4409
+ className="w-[200px]"
4410
+ placeholder="Choose..."
4411
+ items={{ a: "Option A", b: "Option B" }}
4412
+ />
4413
+ </div>
4414
+ <div className="flex items-center gap-3">
4415
+ <span className="w-10 text-sm text-kumo-subtle">sm</span>
4416
+ <Select
4417
+ aria-label="Select size sm"
4418
+ size="sm"
4419
+ className="w-[200px]"
4420
+ placeholder="Choose..."
4421
+ items={{ a: "Option A", b: "Option B" }}
4422
+ />
4423
+ </div>
4424
+ <div className="flex items-center gap-3">
4425
+ <span className="w-10 text-sm text-kumo-subtle">base</span>
4426
+ <Select
4427
+ aria-label="Select size base"
4428
+ size="base"
4429
+ className="w-[200px]"
4430
+ placeholder="Choose..."
4431
+ items={{ a: "Option A", b: "Option B" }}
4432
+ />
4433
+ </div>
4434
+ <div className="flex items-center gap-3">
4435
+ <span className="w-10 text-sm text-kumo-subtle">lg</span>
4436
+ <Select
4437
+ aria-label="Select size lg"
4438
+ size="lg"
4439
+ className="w-[200px]"
4440
+ placeholder="Choose..."
4441
+ items={{ a: "Option A", b: "Option B" }}
4442
+ />
4443
+ </div>
4444
+ </div>
4445
+ ```
4446
+
4273
4447
  ```tsx
4274
4448
  <Select
4275
4449
  label="Issue Type"
@@ -4432,13 +4606,12 @@ Separator sub-component
4432
4606
  <Select
4433
4607
  label="Author"
4434
4608
  description="Select the primary author for this document"
4609
+ placeholder="Select an author"
4435
4610
  className="w-[200px]"
4436
4611
  onValueChange={(v) => setValue(v as (typeof authors)[0] | null)}
4437
4612
  value={value}
4438
4613
  isItemEqualToValue={(item, value) => item?.id === value?.id}
4439
- renderValue={(author) => {
4440
- return author?.name ?? "Select an author";
4441
- }}
4614
+ renderValue={(author) => author.name}
4442
4615
  >
4443
4616
  {authors.map((author) => (
4444
4617
  <Select.Option key={author.id} value={author}>
@@ -4457,16 +4630,18 @@ Separator sub-component
4457
4630
  placeholder="Choose a region..."
4458
4631
  className="w-[250px]"
4459
4632
  value={value}
4460
- onValueChange={(v) => setValue(v as string | null)}
4633
+ onValueChange={(v) => setValue(v as Region | null)}
4634
+ isItemEqualToValue={(item, val) => item.value === val.value}
4461
4635
  >
4462
- <Select.Option value="us-east">US East</Select.Option>
4463
- <Select.Option value="us-west">US West</Select.Option>
4464
- <Select.Option value="eu-west" disabled>
4465
- EU West
4466
- </Select.Option>
4467
- <Select.Option value="ap-south" disabled>
4468
- AP South
4469
- </Select.Option>
4636
+ {regions.map((region) => (
4637
+ <Select.Option
4638
+ key={region.value}
4639
+ value={region}
4640
+ disabled={region.disabled}
4641
+ >
4642
+ {region.label}
4643
+ </Select.Option>
4644
+ ))}
4470
4645
  </Select>
4471
4646
  ```
4472
4647
 
@@ -4476,47 +4651,25 @@ Separator sub-component
4476
4651
  placeholder="Pick a food..."
4477
4652
  className="w-[220px]"
4478
4653
  value={value}
4479
- onValueChange={(v) => setValue(v as string | null)}
4654
+ onValueChange={(v) => setValue(v as Food | null)}
4655
+ isItemEqualToValue={(item, val) => item.value === val.value}
4480
4656
  >
4481
4657
  <Select.Group>
4482
4658
  <Select.GroupLabel>Fruits</Select.GroupLabel>
4483
- <Select.Option value="apple">Apple</Select.Option>
4484
- <Select.Option value="banana">Banana</Select.Option>
4485
- <Select.Option value="cherry">Cherry</Select.Option>
4659
+ {foods.fruits.map((food) => (
4660
+ <Select.Option key={food.value} value={food}>
4661
+ {food.label}
4662
+ </Select.Option>
4663
+ ))}
4486
4664
  </Select.Group>
4487
4665
  <Select.Separator />
4488
4666
  <Select.Group>
4489
4667
  <Select.GroupLabel>Vegetables</Select.GroupLabel>
4490
- <Select.Option value="carrot">Carrot</Select.Option>
4491
- <Select.Option value="broccoli">Broccoli</Select.Option>
4492
- <Select.Option value="spinach">Spinach</Select.Option>
4493
- </Select.Group>
4494
- </Select>
4495
- ```
4496
-
4497
- ```tsx
4498
- <Select
4499
- label="Server Region"
4500
- placeholder="Select a region..."
4501
- className="w-[260px]"
4502
- value={value}
4503
- onValueChange={(v) => setValue(v as string | null)}
4504
- >
4505
- <Select.Group>
4506
- <Select.GroupLabel>Available</Select.GroupLabel>
4507
- <Select.Option value="us-east-1">US East (N. Virginia)</Select.Option>
4508
- <Select.Option value="us-west-2">US West (Oregon)</Select.Option>
4509
- <Select.Option value="eu-west-1">EU West (Ireland)</Select.Option>
4510
- </Select.Group>
4511
- <Select.Separator />
4512
- <Select.Group>
4513
- <Select.GroupLabel>Unavailable</Select.GroupLabel>
4514
- <Select.Option value="ap-south-1" disabled>
4515
- AP South (Mumbai)
4516
- </Select.Option>
4517
- <Select.Option value="sa-east-1" disabled>
4518
- SA East (São Paulo)
4519
- </Select.Option>
4668
+ {foods.vegetables.map((food) => (
4669
+ <Select.Option key={food.value} value={food}>
4670
+ {food.label}
4671
+ </Select.Option>
4672
+ ))}
4520
4673
  </Select.Group>
4521
4674
  </Select>
4522
4675
  ```
@@ -4528,10 +4681,11 @@ Separator sub-component
4528
4681
  placeholder="Choose an option..."
4529
4682
  className="w-[220px]"
4530
4683
  value={value}
4531
- onValueChange={(v) => setValue(v as string | null)}
4684
+ onValueChange={(v) => setValue(v as LongListItem | null)}
4685
+ isItemEqualToValue={(item, val) => item.value === val.value}
4532
4686
  >
4533
4687
  {longListItems.map((item) => (
4534
- <Select.Option key={item.value} value={item.value}>
4688
+ <Select.Option key={item.value} value={item}>
4535
4689
  {item.label}
4536
4690
  </Select.Option>
4537
4691
  ))}
@@ -4709,7 +4863,7 @@ Sidebar — responsive navigation panel with expand/collapse support. Compound
4709
4863
 
4710
4864
  **Colors (kumo tokens used):**
4711
4865
 
4712
- `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-line`, `bg-kumo-overlay`, `bg-kumo-recessed`, `bg-kumo-tint`, `border-kumo-line`, `ring-kumo-hairline`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
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`
4713
4867
 
4714
4868
  **Styling:**
4715
4869
 
@@ -5144,7 +5298,7 @@ CollapsibleContent sub-component
5144
5298
 
5145
5299
  ### Surface
5146
5300
 
5147
- Polymorphic container with consistent background, shadow, and border styling. Use the `render` prop to change the underlying element: ```tsx <Surface render={<section />} className="rounded-lg p-4">Card content</Surface> ```
5301
+ Surface component
5148
5302
 
5149
5303
  **Type:** component
5150
5304
 
@@ -5165,49 +5319,6 @@ Accepts a `ReactElement` or a function that returns the element to render.
5165
5319
  - `lang`: string
5166
5320
  - `title`: string
5167
5321
 
5168
- **Colors (kumo tokens used):**
5169
-
5170
- `bg-kumo-base`, `ring-kumo-line`
5171
-
5172
- **Examples:**
5173
-
5174
- ```tsx
5175
- <Surface className="rounded-lg p-6">
5176
- <Text size="lg" bold>
5177
- Surface Component
5178
- </Text>
5179
- <div className="mt-2">
5180
- <Text variant="secondary">
5181
- A container with consistent elevation and border styling.
5182
- </Text>
5183
- </div>
5184
- </Surface>
5185
- ```
5186
-
5187
- ```tsx
5188
- <div className="flex flex-col gap-4">
5189
- <Surface render={<section />} className="rounded-lg p-4">
5190
- <Text bold>As section element</Text>
5191
- </Surface>
5192
- <Surface render={<article />} className="rounded-lg p-4">
5193
- <Text bold>As article element</Text>
5194
- </Surface>
5195
- <Surface render={<aside />} className="rounded-lg p-4">
5196
- <Text bold>As aside element</Text>
5197
- </Surface>
5198
- </div>
5199
- ```
5200
-
5201
- ```tsx
5202
- <Surface className="rounded-lg p-6">
5203
- <Text bold>Outer Surface</Text>
5204
- <Surface className="mt-4 rounded-md bg-kumo-elevated p-4">
5205
- <Text variant="secondary">Nested Surface</Text>
5206
- </Surface>
5207
- </Surface>
5208
- ```
5209
-
5210
-
5211
5322
  ---
5212
5323
 
5213
5324
  ### Switch
@@ -5252,7 +5363,7 @@ Switch component
5252
5363
 
5253
5364
  **Colors (kumo tokens used):**
5254
5365
 
5255
- `bg-kumo-base`, `border-kumo-line`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
5366
+ `bg-kumo-base`, `border-kumo-hairline`, `ring-kumo-hairline`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
5256
5367
 
5257
5368
  **Sub-Components:**
5258
5369
 
@@ -5446,326 +5557,537 @@ ResizeHandle sub-component
5446
5557
  **Examples:**
5447
5558
 
5448
5559
  ```tsx
5449
- <LayerCard>
5450
- <LayerCard.Primary className="p-0">
5451
- <Table>
5452
- <Table.Header>
5453
- <Table.Row>
5454
- <Table.Head>Subject</Table.Head>
5455
- <Table.Head>From</Table.Head>
5456
- <Table.Head>Date</Table.Head>
5560
+ <LayerCard className="p-0">
5561
+ <Table>
5562
+ <Table.Header>
5563
+ <Table.Row>
5564
+ <Table.Head>Subject</Table.Head>
5565
+ <Table.Head>From</Table.Head>
5566
+ <Table.Head>Date</Table.Head>
5567
+ </Table.Row>
5568
+ </Table.Header>
5569
+ <Table.Body>
5570
+ {emailData.slice(0, 3).map((row) => (
5571
+ <Table.Row key={row.id}>
5572
+ <Table.Cell>{row.subject}</Table.Cell>
5573
+ <Table.Cell>{row.from}</Table.Cell>
5574
+ <Table.Cell>{row.date}</Table.Cell>
5457
5575
  </Table.Row>
5458
- </Table.Header>
5459
- <Table.Body>
5460
- {emailData.slice(0, 3).map((row) => (
5461
- <Table.Row key={row.id}>
5462
- <Table.Cell>{row.subject}</Table.Cell>
5463
- <Table.Cell>{row.from}</Table.Cell>
5464
- <Table.Cell>{row.date}</Table.Cell>
5465
- </Table.Row>
5466
- ))}
5467
- </Table.Body>
5468
- </Table>
5469
- </LayerCard.Primary>
5576
+ ))}
5577
+ </Table.Body>
5578
+ </Table>
5470
5579
  </LayerCard>
5471
5580
  ```
5472
5581
 
5473
5582
  ```tsx
5474
- <LayerCard>
5475
- <LayerCard.Primary className="p-0">
5476
- <Table>
5477
- <Table.Header>
5478
- <Table.Row>
5479
- <Table.CheckHead
5480
- checked={selectedIds.size === rows.length}
5481
- indeterminate={
5482
- selectedIds.size > 0 && selectedIds.size < rows.length
5483
- }
5484
- onValueChange={toggleAll}
5485
- aria-label="Select all rows"
5583
+ <LayerCard className="p-0">
5584
+ <Table>
5585
+ <Table.Header>
5586
+ <Table.Row>
5587
+ <Table.CheckHead
5588
+ checked={selectedIds.size === rows.length}
5589
+ indeterminate={
5590
+ selectedIds.size > 0 && selectedIds.size < rows.length
5591
+ }
5592
+ onValueChange={toggleAll}
5593
+ aria-label="Select all rows"
5594
+ />
5595
+ <Table.Head>Subject</Table.Head>
5596
+ <Table.Head>From</Table.Head>
5597
+ <Table.Head>Date</Table.Head>
5598
+ </Table.Row>
5599
+ </Table.Header>
5600
+ <Table.Body>
5601
+ {rows.map((row) => (
5602
+ <Table.Row key={row.id}>
5603
+ <Table.CheckCell
5604
+ checked={selectedIds.has(row.id)}
5605
+ onValueChange={() => toggleRow(row.id)}
5606
+ aria-label={`Select ${row.subject}`}
5486
5607
  />
5487
- <Table.Head>Subject</Table.Head>
5488
- <Table.Head>From</Table.Head>
5489
- <Table.Head>Date</Table.Head>
5608
+ <Table.Cell>{row.subject}</Table.Cell>
5609
+ <Table.Cell>{row.from}</Table.Cell>
5610
+ <Table.Cell>{row.date}</Table.Cell>
5490
5611
  </Table.Row>
5491
- </Table.Header>
5492
- <Table.Body>
5493
- {rows.map((row) => (
5494
- <Table.Row key={row.id}>
5495
- <Table.CheckCell
5496
- checked={selectedIds.has(row.id)}
5497
- onValueChange={() => toggleRow(row.id)}
5498
- aria-label={`Select ${row.subject}`}
5499
- />
5500
- <Table.Cell>{row.subject}</Table.Cell>
5501
- <Table.Cell>{row.from}</Table.Cell>
5502
- <Table.Cell>{row.date}</Table.Cell>
5503
- </Table.Row>
5504
- ))}
5505
- </Table.Body>
5506
- </Table>
5507
- </LayerCard.Primary>
5612
+ ))}
5613
+ </Table.Body>
5614
+ </Table>
5508
5615
  </LayerCard>
5509
5616
  ```
5510
5617
 
5511
5618
  ```tsx
5512
- <LayerCard>
5513
- <LayerCard.Primary className="p-0">
5514
- <Table>
5515
- <Table.Header variant="compact">
5516
- <Table.Row>
5517
- <Table.Head>Subject</Table.Head>
5518
- <Table.Head>From</Table.Head>
5519
- <Table.Head>Date</Table.Head>
5619
+ <LayerCard className="p-0">
5620
+ <Table>
5621
+ <Table.Header variant="compact">
5622
+ <Table.Row>
5623
+ <Table.Head>Subject</Table.Head>
5624
+ <Table.Head>From</Table.Head>
5625
+ <Table.Head>Date</Table.Head>
5626
+ </Table.Row>
5627
+ </Table.Header>
5628
+ <Table.Body>
5629
+ {emailData.slice(0, 3).map((row) => (
5630
+ <Table.Row key={row.id}>
5631
+ <Table.Cell>{row.subject}</Table.Cell>
5632
+ <Table.Cell>{row.from}</Table.Cell>
5633
+ <Table.Cell>{row.date}</Table.Cell>
5520
5634
  </Table.Row>
5521
- </Table.Header>
5522
- <Table.Body>
5523
- {emailData.slice(0, 3).map((row) => (
5524
- <Table.Row key={row.id}>
5525
- <Table.Cell>{row.subject}</Table.Cell>
5526
- <Table.Cell>{row.from}</Table.Cell>
5527
- <Table.Cell>{row.date}</Table.Cell>
5528
- </Table.Row>
5529
- ))}
5530
- </Table.Body>
5531
- </Table>
5532
- </LayerCard.Primary>
5635
+ ))}
5636
+ </Table.Body>
5637
+ </Table>
5533
5638
  </LayerCard>
5534
5639
  ```
5535
5640
 
5536
5641
  ```tsx
5537
- <LayerCard>
5538
- <LayerCard.Primary className="p-0">
5539
- <Table>
5540
- <Table.Header>
5541
- <Table.Row>
5542
- <Table.CheckHead
5543
- checked={selectedIds.size === rows.length}
5544
- indeterminate={
5545
- selectedIds.size > 0 && selectedIds.size < rows.length
5546
- }
5547
- onValueChange={toggleAll}
5548
- aria-label="Select all rows"
5642
+ <LayerCard className="p-0">
5643
+ <Table>
5644
+ <Table.Header>
5645
+ <Table.Row>
5646
+ <Table.CheckHead
5647
+ checked={selectedIds.size === rows.length}
5648
+ indeterminate={
5649
+ selectedIds.size > 0 && selectedIds.size < rows.length
5650
+ }
5651
+ onValueChange={toggleAll}
5652
+ aria-label="Select all rows"
5653
+ />
5654
+ <Table.Head>Subject</Table.Head>
5655
+ <Table.Head>From</Table.Head>
5656
+ <Table.Head>Date</Table.Head>
5657
+ </Table.Row>
5658
+ </Table.Header>
5659
+ <Table.Body>
5660
+ {rows.map((row) => (
5661
+ <Table.Row
5662
+ key={row.id}
5663
+ variant={selectedIds.has(row.id) ? "selected" : "default"}
5664
+ >
5665
+ <Table.CheckCell
5666
+ checked={selectedIds.has(row.id)}
5667
+ onValueChange={() => toggleRow(row.id)}
5668
+ aria-label={`Select ${row.subject}`}
5549
5669
  />
5550
- <Table.Head>Subject</Table.Head>
5551
- <Table.Head>From</Table.Head>
5552
- <Table.Head>Date</Table.Head>
5670
+ <Table.Cell>{row.subject}</Table.Cell>
5671
+ <Table.Cell>{row.from}</Table.Cell>
5672
+ <Table.Cell>{row.date}</Table.Cell>
5553
5673
  </Table.Row>
5554
- </Table.Header>
5555
- <Table.Body>
5556
- {rows.map((row) => (
5557
- <Table.Row
5558
- key={row.id}
5559
- variant={selectedIds.has(row.id) ? "selected" : "default"}
5560
- >
5561
- <Table.CheckCell
5562
- checked={selectedIds.has(row.id)}
5563
- onValueChange={() => toggleRow(row.id)}
5564
- aria-label={`Select ${row.subject}`}
5565
- />
5566
- <Table.Cell>{row.subject}</Table.Cell>
5567
- <Table.Cell>{row.from}</Table.Cell>
5568
- <Table.Cell>{row.date}</Table.Cell>
5569
- </Table.Row>
5570
- ))}
5571
- </Table.Body>
5572
- </Table>
5573
- </LayerCard.Primary>
5674
+ ))}
5675
+ </Table.Body>
5676
+ </Table>
5574
5677
  </LayerCard>
5575
5678
  ```
5576
5679
 
5577
5680
  ```tsx
5578
- <LayerCard>
5579
- <LayerCard.Primary className="p-0">
5580
- <Table layout="fixed">
5581
- <colgroup>
5582
- <col />
5583
- <col className="w-[150px]" />
5584
- <col className="w-[150px]" />
5585
- </colgroup>
5586
- <Table.Header>
5587
- <Table.Row>
5588
- <Table.Head>Subject</Table.Head>
5589
- <Table.Head>From</Table.Head>
5590
- <Table.Head>Date</Table.Head>
5681
+ <LayerCard className="p-0">
5682
+ <Table layout="fixed">
5683
+ <colgroup>
5684
+ <col />
5685
+ <col className="w-[150px]" />
5686
+ <col className="w-[150px]" />
5687
+ </colgroup>
5688
+ <Table.Header>
5689
+ <Table.Row>
5690
+ <Table.Head>Subject</Table.Head>
5691
+ <Table.Head>From</Table.Head>
5692
+ <Table.Head>Date</Table.Head>
5693
+ </Table.Row>
5694
+ </Table.Header>
5695
+ <Table.Body>
5696
+ {emailData.map((row) => (
5697
+ <Table.Row key={row.id}>
5698
+ <Table.Cell>{row.subject}</Table.Cell>
5699
+ <Table.Cell>{row.from}</Table.Cell>
5700
+ <Table.Cell>{row.date}</Table.Cell>
5591
5701
  </Table.Row>
5592
- </Table.Header>
5593
- <Table.Body>
5594
- {emailData.map((row) => (
5595
- <Table.Row key={row.id}>
5596
- <Table.Cell>{row.subject}</Table.Cell>
5597
- <Table.Cell>{row.from}</Table.Cell>
5598
- <Table.Cell>{row.date}</Table.Cell>
5599
- </Table.Row>
5600
- ))}
5601
- </Table.Body>
5602
- </Table>
5603
- </LayerCard.Primary>
5702
+ ))}
5703
+ </Table.Body>
5704
+ </Table>
5604
5705
  </LayerCard>
5605
5706
  ```
5606
5707
 
5607
5708
  ```tsx
5608
- <LayerCard>
5609
- <LayerCard.Primary className="w-full max-w-md overflow-x-auto p-0">
5610
- <Table>
5611
- <Table.Header>
5612
- <Table.Row>
5613
- <Table.Head>Subject</Table.Head>
5614
- <Table.Head>From</Table.Head>
5615
- <Table.Head>Date</Table.Head>
5616
- <Table.Head>Tags</Table.Head>
5617
- <Table.Head sticky="right">
5618
- <span className="sr-only">Actions</span>
5619
- </Table.Head>
5709
+ <LayerCard className="w-full max-w-md overflow-x-auto p-0">
5710
+ <Table>
5711
+ <Table.Header variant="compact">
5712
+ <Table.Row>
5713
+ <Table.Head>Subject</Table.Head>
5714
+ <Table.Head>From</Table.Head>
5715
+ <Table.Head>Date</Table.Head>
5716
+ <Table.Head>Tags</Table.Head>
5717
+ <Table.Head sticky="right">
5718
+ <span className="sr-only">Actions</span>
5719
+ </Table.Head>
5720
+ </Table.Row>
5721
+ </Table.Header>
5722
+ <Table.Body>
5723
+ {emailData.map((row) => (
5724
+ <Table.Row key={row.id}>
5725
+ <Table.Cell className="whitespace-nowrap">
5726
+ {row.subject}
5727
+ </Table.Cell>
5728
+ <Table.Cell className="whitespace-nowrap">
5729
+ {row.from}
5730
+ </Table.Cell>
5731
+ <Table.Cell className="whitespace-nowrap">
5732
+ {row.date}
5733
+ </Table.Cell>
5734
+ <Table.Cell className="whitespace-nowrap">
5735
+ {row.tags ? (
5736
+ <div className="inline-flex gap-1">
5737
+ {row.tags.map((tag) => (
5738
+ <Badge key={tag}>{tag}</Badge>
5739
+ ))}
5740
+ </div>
5741
+ ) : (
5742
+ "—"
5743
+ )}
5744
+ </Table.Cell>
5745
+ <Table.Cell sticky="right" className="text-right">
5746
+ <DropdownMenu>
5747
+ <DropdownMenu.Trigger
5748
+ render={
5749
+ <Button
5750
+ variant="ghost"
5751
+ size="sm"
5752
+ shape="square"
5753
+ aria-label="More options"
5754
+ >
5755
+ <DotsThree weight="bold" size={16} />
5756
+ </Button>
5757
+ }
5758
+ />
5759
+ <DropdownMenu.Content>
5760
+ <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>
5761
+ <DropdownMenu.Item icon={PencilSimple}>
5762
+ Edit
5763
+ </DropdownMenu.Item>
5764
+ <DropdownMenu.Separator />
5765
+ <DropdownMenu.Item icon={Trash} variant="danger">
5766
+ Delete
5767
+ </DropdownMenu.Item>
5768
+ </DropdownMenu.Content>
5769
+ </DropdownMenu>
5770
+ </Table.Cell>
5771
+ </Table.Row>
5772
+ ))}
5773
+ </Table.Body>
5774
+ </Table>
5775
+ </LayerCard>
5776
+ ```
5777
+
5778
+ ```tsx
5779
+ <LayerCard className="w-full max-w-md overflow-x-auto p-0">
5780
+ <Table>
5781
+ <Table.Header>
5782
+ <Table.Row>
5783
+ <Table.Head>Subject</Table.Head>
5784
+ <Table.Head>From</Table.Head>
5785
+ <Table.Head>Date</Table.Head>
5786
+ <Table.Head>Tags</Table.Head>
5787
+ <Table.Head sticky="right">
5788
+ <span className="sr-only">Actions</span>
5789
+ </Table.Head>
5790
+ </Table.Row>
5791
+ </Table.Header>
5792
+ <Table.Body>
5793
+ {emailData.map((row) => (
5794
+ <Table.Row key={row.id}>
5795
+ <Table.Cell className="whitespace-nowrap">
5796
+ {row.subject}
5797
+ </Table.Cell>
5798
+ <Table.Cell className="whitespace-nowrap">
5799
+ {row.from}
5800
+ </Table.Cell>
5801
+ <Table.Cell className="whitespace-nowrap">
5802
+ {row.date}
5803
+ </Table.Cell>
5804
+ <Table.Cell className="whitespace-nowrap">
5805
+ {row.tags ? (
5806
+ <div className="inline-flex gap-1">
5807
+ {row.tags.map((tag) => (
5808
+ <Badge key={tag}>{tag}</Badge>
5809
+ ))}
5810
+ </div>
5811
+ ) : (
5812
+ "—"
5813
+ )}
5814
+ </Table.Cell>
5815
+ <Table.Cell sticky="right" className="text-right">
5816
+ <DropdownMenu>
5817
+ <DropdownMenu.Trigger
5818
+ render={
5819
+ <Button
5820
+ variant="ghost"
5821
+ size="sm"
5822
+ shape="square"
5823
+ aria-label="More options"
5824
+ >
5825
+ <DotsThree weight="bold" size={16} />
5826
+ </Button>
5827
+ }
5828
+ />
5829
+ <DropdownMenu.Content>
5830
+ <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>
5831
+ <DropdownMenu.Item icon={PencilSimple}>
5832
+ Edit
5833
+ </DropdownMenu.Item>
5834
+ <DropdownMenu.Separator />
5835
+ <DropdownMenu.Item icon={Trash} variant="danger">
5836
+ Delete
5837
+ </DropdownMenu.Item>
5838
+ </DropdownMenu.Content>
5839
+ </DropdownMenu>
5840
+ </Table.Cell>
5620
5841
  </Table.Row>
5621
- </Table.Header>
5622
- <Table.Body>
5623
- {emailData.map((row) => (
5624
- <Table.Row key={row.id}>
5625
- <Table.Cell className="whitespace-nowrap">
5626
- {row.subject}
5627
- </Table.Cell>
5628
- <Table.Cell className="whitespace-nowrap">
5629
- {row.from}
5630
- </Table.Cell>
5631
- <Table.Cell className="whitespace-nowrap">
5632
- {row.date}
5633
- </Table.Cell>
5634
- <Table.Cell className="whitespace-nowrap">
5635
- {row.tags ? (
5636
- <div className="inline-flex gap-1">
5842
+ ))}
5843
+ </Table.Body>
5844
+ </Table>
5845
+ </LayerCard>
5846
+ ```
5847
+
5848
+ ```tsx
5849
+ <LayerCard className="w-full overflow-x-auto p-0">
5850
+ <Table layout="fixed">
5851
+ <colgroup>
5852
+ <col />{" "}
5853
+ {/* Checkbox column - width handled by Table.CheckHead/CheckCell */}
5854
+ <col />
5855
+ <col style={{ width: "150px" }} />
5856
+ <col style={{ width: "120px" }} />
5857
+ <col style={{ width: "50px" }} />
5858
+ </colgroup>
5859
+ <Table.Header>
5860
+ <Table.Row>
5861
+ <Table.CheckHead
5862
+ checked={selectedIds.size === emailData.length}
5863
+ indeterminate={
5864
+ selectedIds.size > 0 && selectedIds.size < emailData.length
5865
+ }
5866
+ onValueChange={toggleAll}
5867
+ aria-label="Select all rows"
5868
+ />
5869
+ <Table.Head>Subject</Table.Head>
5870
+ <Table.Head>From</Table.Head>
5871
+ <Table.Head>Date</Table.Head>
5872
+ <Table.Head></Table.Head>
5873
+ </Table.Row>
5874
+ </Table.Header>
5875
+ <Table.Body>
5876
+ {emailData.map((row) => (
5877
+ <Table.Row
5878
+ key={row.id}
5879
+ variant={selectedIds.has(row.id) ? "selected" : "default"}
5880
+ >
5881
+ <Table.CheckCell
5882
+ checked={selectedIds.has(row.id)}
5883
+ onValueChange={() => toggleRow(row.id)}
5884
+ aria-label={`Select ${row.subject}`}
5885
+ />
5886
+ <Table.Cell>
5887
+ <div className="flex items-center gap-2">
5888
+ <EnvelopeSimple size={16} />
5889
+ <span className="truncate">{row.subject}</span>
5890
+ {row.tags && (
5891
+ <div className="ml-2 inline-flex gap-1">
5637
5892
  {row.tags.map((tag) => (
5638
5893
  <Badge key={tag}>{tag}</Badge>
5639
5894
  ))}
5640
5895
  </div>
5641
- ) : (
5642
- "—"
5643
5896
  )}
5644
- </Table.Cell>
5645
- <Table.Cell sticky="right" className="text-right">
5646
- <DropdownMenu>
5647
- <DropdownMenu.Trigger
5648
- render={
5649
- <Button
5650
- variant="ghost"
5651
- size="sm"
5652
- shape="square"
5653
- aria-label="More options"
5654
- >
5655
- <DotsThree weight="bold" size={16} />
5656
- </Button>
5657
- }
5658
- />
5659
- <DropdownMenu.Content>
5660
- <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>
5661
- <DropdownMenu.Item icon={PencilSimple}>
5662
- Edit
5663
- </DropdownMenu.Item>
5664
- <DropdownMenu.Separator />
5665
- <DropdownMenu.Item icon={Trash} variant="danger">
5666
- Delete
5667
- </DropdownMenu.Item>
5668
- </DropdownMenu.Content>
5669
- </DropdownMenu>
5670
- </Table.Cell>
5671
- </Table.Row>
5672
- ))}
5673
- </Table.Body>
5674
- </Table>
5675
- </LayerCard.Primary>
5897
+ </div>
5898
+ </Table.Cell>
5899
+ <Table.Cell>
5900
+ <span className="truncate">{row.from}</span>
5901
+ </Table.Cell>
5902
+ <Table.Cell>
5903
+ <span className="truncate">{row.date}</span>
5904
+ </Table.Cell>
5905
+ <Table.Cell className="text-right">
5906
+ <DropdownMenu>
5907
+ <DropdownMenu.Trigger
5908
+ render={
5909
+ <Button
5910
+ variant="ghost"
5911
+ size="sm"
5912
+ shape="square"
5913
+ aria-label="More options"
5914
+ >
5915
+ <DotsThree weight="bold" size={16} />
5916
+ </Button>
5917
+ }
5918
+ />
5919
+ <DropdownMenu.Content>
5920
+ <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>
5921
+ <DropdownMenu.Item icon={PencilSimple}>
5922
+ Edit
5923
+ </DropdownMenu.Item>
5924
+ <DropdownMenu.Separator />
5925
+ <DropdownMenu.Item icon={Trash} variant="danger">
5926
+ Delete
5927
+ </DropdownMenu.Item>
5928
+ </DropdownMenu.Content>
5929
+ </DropdownMenu>
5930
+ </Table.Cell>
5931
+ </Table.Row>
5932
+ ))}
5933
+ </Table.Body>
5934
+ </Table>
5676
5935
  </LayerCard>
5677
5936
  ```
5678
5937
 
5938
+
5939
+ ---
5940
+
5941
+ ### TableOfContents
5942
+
5943
+ TableOfContents — presentational compound component for section navigation. Purely visual; all interaction logic (scroll tracking, active state management) is left to the consumer.
5944
+
5945
+ **Type:** component
5946
+
5947
+ **Import:** `import { TableOfContents } from "@cloudflare/kumo";`
5948
+
5949
+ **Category:** Other
5950
+
5951
+ **Props:**
5952
+
5953
+ - `children`: ReactNode
5954
+ - `className`: string
5955
+ - `id`: string
5956
+ - `lang`: string
5957
+ - `title`: string
5958
+
5959
+ **Colors (kumo tokens used):**
5960
+
5961
+ `bg-kumo-brand`, `bg-kumo-line`, `bg-kumo-tint`, `text-kumo-default`, `text-kumo-subtle`
5962
+
5963
+ **Sub-Components:**
5964
+
5965
+ This is a compound component. Use these sub-components:
5966
+
5967
+ #### TableOfContents.Title
5968
+
5969
+ Title sub-component
5970
+
5971
+ #### TableOfContents.List
5972
+
5973
+ List sub-component
5974
+
5975
+ #### TableOfContents.Item
5976
+
5977
+ Item sub-component
5978
+
5979
+ #### TableOfContents.Group
5980
+
5981
+ Group sub-component
5982
+
5983
+
5984
+ **Examples:**
5985
+
5986
+ ```tsx
5987
+ <DemoWrapper>
5988
+ <TableOfContents>
5989
+ <TableOfContents.Title>On this page</TableOfContents.Title>
5990
+ <TableOfContents.List>
5991
+ {headings.map((heading) => (
5992
+ <TableOfContents.Item
5993
+ key={heading.text}
5994
+ active={heading.text === "Usage"}
5995
+ className="cursor-pointer"
5996
+ >
5997
+ {heading.text}
5998
+ </TableOfContents.Item>
5999
+ ))}
6000
+ </TableOfContents.List>
6001
+ </TableOfContents>
6002
+ </DemoWrapper>
6003
+ ```
6004
+
6005
+ ```tsx
6006
+ <DemoWrapper>
6007
+ <TableOfContents>
6008
+ <TableOfContents.Title>On this page</TableOfContents.Title>
6009
+ <TableOfContents.List>
6010
+ {headings.map((heading) => (
6011
+ <TableOfContents.Item
6012
+ key={heading.text}
6013
+ active={heading.text === active}
6014
+ onClick={() => setActive(heading.text)}
6015
+ className="cursor-pointer"
6016
+ >
6017
+ {heading.text}
6018
+ </TableOfContents.Item>
6019
+ ))}
6020
+ </TableOfContents.List>
6021
+ </TableOfContents>
6022
+ </DemoWrapper>
6023
+ ```
6024
+
5679
6025
  ```tsx
5680
- <LayerCard>
5681
- <LayerCard.Primary className="w-full overflow-x-auto p-0">
5682
- <Table layout="fixed">
5683
- <colgroup>
5684
- <col />{" "}
5685
- {/* Checkbox column - width handled by Table.CheckHead/CheckCell */}
5686
- <col />
5687
- <col style={{ width: "150px" }} />
5688
- <col style={{ width: "120px" }} />
5689
- <col style={{ width: "50px" }} />
5690
- </colgroup>
5691
- <Table.Header>
5692
- <Table.Row>
5693
- <Table.CheckHead
5694
- checked={selectedIds.size === emailData.length}
5695
- indeterminate={
5696
- selectedIds.size > 0 && selectedIds.size < emailData.length
5697
- }
5698
- onValueChange={toggleAll}
5699
- aria-label="Select all rows"
5700
- />
5701
- <Table.Head>Subject</Table.Head>
5702
- <Table.Head>From</Table.Head>
5703
- <Table.Head>Date</Table.Head>
5704
- <Table.Head></Table.Head>
5705
- </Table.Row>
5706
- </Table.Header>
5707
- <Table.Body>
5708
- {emailData.map((row) => (
5709
- <Table.Row
5710
- key={row.id}
5711
- variant={selectedIds.has(row.id) ? "selected" : "default"}
6026
+ <DemoWrapper>
6027
+ <TableOfContents>
6028
+ <TableOfContents.Title>On this page</TableOfContents.Title>
6029
+ <TableOfContents.List>
6030
+ {headings.map((heading) => (
6031
+ <TableOfContents.Item key={heading.text} className="cursor-pointer">
6032
+ {heading.text}
6033
+ </TableOfContents.Item>
6034
+ ))}
6035
+ </TableOfContents.List>
6036
+ </TableOfContents>
6037
+ </DemoWrapper>
6038
+ ```
6039
+
6040
+ ```tsx
6041
+ <DemoWrapper>
6042
+ <TableOfContents>
6043
+ <TableOfContents.Title>On this page</TableOfContents.Title>
6044
+ <TableOfContents.List>
6045
+ <TableOfContents.Item active className="cursor-pointer">
6046
+ Overview
6047
+ </TableOfContents.Item>
6048
+ <TableOfContents.Group label="Getting Started">
6049
+ <TableOfContents.Item className="cursor-pointer">
6050
+ Installation
6051
+ </TableOfContents.Item>
6052
+ <TableOfContents.Item className="cursor-pointer">
6053
+ Configuration
6054
+ </TableOfContents.Item>
6055
+ </TableOfContents.Group>
6056
+ <TableOfContents.Group label="API">
6057
+ <TableOfContents.Item className="cursor-pointer">
6058
+ Props
6059
+ </TableOfContents.Item>
6060
+ <TableOfContents.Item className="cursor-pointer">
6061
+ Events
6062
+ </TableOfContents.Item>
6063
+ </TableOfContents.Group>
6064
+ </TableOfContents.List>
6065
+ </TableOfContents>
6066
+ </DemoWrapper>
6067
+ ```
6068
+
6069
+ ```tsx
6070
+ <DemoWrapper>
6071
+ <div className="space-y-3">
6072
+ <TableOfContents>
6073
+ <TableOfContents.List>
6074
+ {["Introduction", "Installation", "Usage"].map((text) => (
6075
+ <TableOfContents.Item
6076
+ key={text}
6077
+ render={<button type="button" />}
6078
+ onClick={() => setClicked(text)}
6079
+ active={text === "Introduction"}
5712
6080
  >
5713
- <Table.CheckCell
5714
- checked={selectedIds.has(row.id)}
5715
- onValueChange={() => toggleRow(row.id)}
5716
- aria-label={`Select ${row.subject}`}
5717
- />
5718
- <Table.Cell>
5719
- <div className="flex items-center gap-2">
5720
- <EnvelopeSimple size={16} />
5721
- <span className="truncate">{row.subject}</span>
5722
- {row.tags && (
5723
- <div className="ml-2 inline-flex gap-1">
5724
- {row.tags.map((tag) => (
5725
- <Badge key={tag}>{tag}</Badge>
5726
- ))}
5727
- </div>
5728
- )}
5729
- </div>
5730
- </Table.Cell>
5731
- <Table.Cell>
5732
- <span className="truncate">{row.from}</span>
5733
- </Table.Cell>
5734
- <Table.Cell>
5735
- <span className="truncate">{row.date}</span>
5736
- </Table.Cell>
5737
- <Table.Cell className="text-right">
5738
- <DropdownMenu>
5739
- <DropdownMenu.Trigger
5740
- render={
5741
- <Button
5742
- variant="ghost"
5743
- size="sm"
5744
- shape="square"
5745
- aria-label="More options"
5746
- >
5747
- <DotsThree weight="bold" size={16} />
5748
- </Button>
5749
- }
5750
- />
5751
- <DropdownMenu.Content>
5752
- <DropdownMenu.Item icon={Eye}>View</DropdownMenu.Item>
5753
- <DropdownMenu.Item icon={PencilSimple}>
5754
- Edit
5755
- </DropdownMenu.Item>
5756
- <DropdownMenu.Separator />
5757
- <DropdownMenu.Item icon={Trash} variant="danger">
5758
- Delete
5759
- </DropdownMenu.Item>
5760
- </DropdownMenu.Content>
5761
- </DropdownMenu>
5762
- </Table.Cell>
5763
- </Table.Row>
6081
+ {text}
6082
+ </TableOfContents.Item>
5764
6083
  ))}
5765
- </Table.Body>
5766
- </Table>
5767
- </LayerCard.Primary>
5768
- </LayerCard>
6084
+ </TableOfContents.List>
6085
+ </TableOfContents>
6086
+ {clicked && (
6087
+ <p className="text-xs text-kumo-subtle">Clicked: {clicked}</p>
6088
+ )}
6089
+ </div>
6090
+ </DemoWrapper>
5769
6091
  ```
5770
6092
 
5771
6093
 
@@ -5959,69 +6281,69 @@ Text component
5959
6281
 
5960
6282
  ```tsx
5961
6283
  <div className="grid w-full grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3">
5962
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6284
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5963
6285
  <Text variant="heading1">Heading 1</Text>
5964
- <p className="font-mono text-xs text-kumo-subtle">text-3xl (30px)</p>
6286
+ <Text variant="mono-secondary">text-3xl (30px)</Text>
5965
6287
  </div>
5966
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6288
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5967
6289
  <Text variant="heading2">Heading 2</Text>
5968
- <p className="font-mono text-xs text-kumo-subtle">text-2xl (24px)</p>
6290
+ <Text variant="mono-secondary">text-2xl (24px)</Text>
5969
6291
  </div>
5970
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6292
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5971
6293
  <Text variant="heading3">Heading 3</Text>
5972
- <p className="font-mono text-xs text-kumo-subtle">text-lg (16px)</p>
6294
+ <Text variant="mono-secondary">text-lg (16px)</Text>
5973
6295
  </div>
5974
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6296
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5975
6297
  <Text>Body</Text>
5976
- <p className="font-mono text-xs text-kumo-subtle">text-base (14px)</p>
6298
+ <Text variant="mono-secondary">text-base (14px)</Text>
5977
6299
  </div>
5978
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6300
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5979
6301
  <Text bold>Body bold</Text>
5980
- <p className="font-mono text-xs text-kumo-subtle">text-base (14px)</p>
6302
+ <Text variant="mono-secondary">text-base (14px)</Text>
5981
6303
  </div>
5982
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6304
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5983
6305
  <Text size="lg">Body lg</Text>
5984
- <p className="font-mono text-xs text-kumo-subtle">text-lg (16px)</p>
6306
+ <Text variant="mono-secondary">text-lg (16px)</Text>
5985
6307
  </div>
5986
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6308
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5987
6309
  <Text size="sm">Body sm</Text>
5988
- <p className="font-mono text-xs text-kumo-subtle">text-sm (13px)</p>
6310
+ <Text variant="mono-secondary">text-sm (13px)</Text>
5989
6311
  </div>
5990
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6312
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5991
6313
  <Text size="xs">Body xs</Text>
5992
- <p className="font-mono text-xs text-kumo-subtle">text-xs (12px)</p>
6314
+ <Text variant="mono-secondary">text-xs (12px)</Text>
5993
6315
  </div>
5994
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6316
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5995
6317
  <Text variant="secondary">Body secondary</Text>
5996
- <p className="font-mono text-xs text-kumo-subtle">text-base (14px)</p>
6318
+ <Text variant="mono-secondary">text-base (14px)</Text>
5997
6319
  </div>
5998
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6320
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
5999
6321
  <Text variant="mono">Monospace</Text>
6000
- <p className="font-mono text-xs text-kumo-subtle">text-sm (13px)</p>
6322
+ <Text variant="mono-secondary">text-sm (13px)</Text>
6001
6323
  </div>
6002
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6324
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6003
6325
  <Text variant="mono" size="lg">
6004
6326
  Monospace lg
6005
6327
  </Text>
6006
- <p className="font-mono text-xs text-kumo-subtle">text-base (14px)</p>
6328
+ <Text variant="mono-secondary">text-base (14px)</Text>
6007
6329
  </div>
6008
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6330
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6009
6331
  <Text variant="mono-secondary">Monospace secondary</Text>
6010
- <p className="font-mono text-xs text-kumo-subtle">text-sm (13px)</p>
6332
+ <Text variant="mono-secondary">text-sm (13px)</Text>
6011
6333
  </div>
6012
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6334
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6013
6335
  <Text variant="success">Success</Text>
6014
- <p className="font-mono text-xs text-kumo-subtle">text-base (14px)</p>
6336
+ <Text variant="mono-secondary">text-base (14px)</Text>
6015
6337
  </div>
6016
- <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-line bg-kumo-base p-4">
6338
+ <div className="flex flex-col justify-end gap-1 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6017
6339
  <Text variant="error">Error</Text>
6018
- <p className="font-mono text-xs text-kumo-subtle">text-base (14px)</p>
6340
+ <Text variant="mono-secondary">text-base (14px)</Text>
6019
6341
  </div>
6020
6342
  </div>
6021
6343
  ```
6022
6344
 
6023
6345
  ```tsx
6024
- <div className="w-64 rounded-lg border border-kumo-line bg-kumo-base p-4">
6346
+ <div className="w-64 rounded-lg border border-kumo-hairline bg-kumo-base p-4">
6025
6347
  <Text truncate>
6026
6348
  This is a long piece of text that will be truncated with an ellipsis
6027
6349
  when it overflows its container.
@@ -6057,7 +6379,7 @@ Toasty — toast notification provider and viewport. Renders a `Toast.Provider`
6057
6379
 
6058
6380
  **Colors (kumo tokens used):**
6059
6381
 
6060
- `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-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`
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`
6061
6383
 
6062
6384
  **Styling:**
6063
6385
 
@@ -6096,25 +6418,32 @@ Accessible popup that shows additional information on hover/focus. Wrap your app
6096
6418
 
6097
6419
  ```tsx
6098
6420
  <TooltipProvider>
6099
- <Tooltip content="Add new item" asChild>
6100
- <Button shape="square" icon={PlusIcon} aria-label="Add new item" />
6101
- </Tooltip>
6421
+ <Tooltip
6422
+ content="Add new item"
6423
+ render={
6424
+ <Button shape="square" icon={PlusIcon} aria-label="Add new item" />
6425
+ }
6426
+ />
6102
6427
  </TooltipProvider>
6103
6428
  ```
6104
6429
 
6105
6430
  ```tsx
6106
6431
  <TooltipProvider>
6107
6432
  <div className="flex gap-2">
6108
- <Tooltip content="Add" asChild>
6109
- <Button shape="square" icon={PlusIcon} aria-label="Add" />
6110
- </Tooltip>
6111
- <Tooltip content="Change language" asChild>
6112
- <Button
6113
- shape="square"
6114
- icon={TranslateIcon}
6115
- aria-label="Change language"
6116
- />
6117
- </Tooltip>
6433
+ <Tooltip
6434
+ content="Add"
6435
+ render={<Button shape="square" icon={PlusIcon} aria-label="Add" />}
6436
+ />
6437
+ <Tooltip
6438
+ content="Change language"
6439
+ render={
6440
+ <Button
6441
+ shape="square"
6442
+ icon={TranslateIcon}
6443
+ aria-label="Change language"
6444
+ />
6445
+ }
6446
+ />
6118
6447
  </div>
6119
6448
  </TooltipProvider>
6120
6449
  ```
@@ -6134,23 +6463,27 @@ Accessible popup that shows additional information on hover/focus. Wrap your app
6134
6463
  ```tsx
6135
6464
  <TooltipProvider>
6136
6465
  <div className="flex gap-4">
6137
- <Tooltip content="Opens after 1 second" delay={1000} asChild>
6138
- <Button variant="secondary">1s open delay</Button>
6466
+ <Tooltip
6467
+ content="Opens after 1 second"
6468
+ delay={1000}
6469
+ render={<Button variant="secondary" />}
6470
+ >
6471
+ 1s open delay
6139
6472
  </Tooltip>
6140
6473
  <Tooltip
6141
6474
  content="Stays open 500ms after leaving"
6142
6475
  closeDelay={500}
6143
- asChild
6476
+ render={<Button variant="secondary" />}
6144
6477
  >
6145
- <Button variant="secondary">500ms close delay</Button>
6478
+ 500ms close delay
6146
6479
  </Tooltip>
6147
6480
  <Tooltip
6148
6481
  content="Instant open, stays 1s"
6149
6482
  delay={0}
6150
6483
  closeDelay={1000}
6151
- asChild
6484
+ render={<Button variant="secondary" />}
6152
6485
  >
6153
- <Button variant="secondary">Instant + 1s close</Button>
6486
+ Instant + 1s close
6154
6487
  </Tooltip>
6155
6488
  </div>
6156
6489
  </TooltipProvider>
@@ -6187,7 +6520,7 @@ Multi-line textarea input with Input variants and InputArea-specific dimensions
6187
6520
  - **Feedback:** Banner, Loader, Toasty
6188
6521
  - **Action:** Button, ClipboardText
6189
6522
  - **Input:** Checkbox, Combobox, DateRangePicker, Field, Input, Radio, Select, Switch
6190
- - **Other:** CloudflareLogo, DatePicker, Label, Link, SensitiveInput, Sidebar, Table, DeleteResource
6523
+ - **Other:** CloudflareLogo, DatePicker, Label, Link, SensitiveInput, Sidebar, Table, TableOfContents, DeleteResource
6191
6524
  - **Navigation:** CommandPalette, MenuBar, Pagination, Tabs
6192
6525
  - **Overlay:** Dialog, DropdownMenu, Popover, Tooltip
6193
6526
  - **Layout:** Grid, Surface, PageHeader, ResourceListPage