@cloudflare/kumo 1.13.1 → 1.14.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 (181) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/ai/component-registry.json +57 -30
  3. package/ai/component-registry.md +247 -19
  4. package/ai/schemas.ts +3 -2
  5. package/dist/.build-complete +1 -1
  6. package/dist/ai/schemas.d.ts +10 -2
  7. package/dist/ai/schemas.d.ts.map +1 -1
  8. package/dist/ai/schemas.js +175 -173
  9. package/dist/ai/schemas.js.map +1 -1
  10. package/dist/chunks/Legend-mkh1v83sz972e29d.js +407 -0
  11. package/dist/chunks/Legend-mkh1v83sz972e29d.js.map +1 -0
  12. package/dist/chunks/{breadcrumbs-e564gabk59go37cg.js → breadcrumbs-gr907zcoo65rpn90.js} +2 -2
  13. package/dist/chunks/{breadcrumbs-e564gabk59go37cg.js.map → breadcrumbs-gr907zcoo65rpn90.js.map} +1 -1
  14. package/dist/chunks/{button-b1yp3lbrhjr9eg07.js → button-d82sexqgnd834eaa.js} +2 -2
  15. package/dist/chunks/{button-b1yp3lbrhjr9eg07.js.map → button-d82sexqgnd834eaa.js.map} +1 -1
  16. package/dist/chunks/{checkbox-khvh0efmlzvlo6qi.js → checkbox-f4qsbq6xycaji7qw.js} +3 -3
  17. package/dist/chunks/{checkbox-khvh0efmlzvlo6qi.js.map → checkbox-f4qsbq6xycaji7qw.js.map} +1 -1
  18. package/dist/chunks/{clipboard-text-jvrlvyz5ulm49h5b.js → clipboard-text-fvggzgqrza82t5om.js} +4 -4
  19. package/dist/chunks/{clipboard-text-jvrlvyz5ulm49h5b.js.map → clipboard-text-fvggzgqrza82t5om.js.map} +1 -1
  20. package/dist/chunks/{combobox-i3mdp6f01dvpoc5j.js → combobox-om4zw74o076sa00p.js} +61 -50
  21. package/dist/chunks/combobox-om4zw74o076sa00p.js.map +1 -0
  22. package/dist/chunks/{command-palette-l8dym46a74o7j8ci.js → command-palette-ejoszjfivybu9yi5.js} +3 -3
  23. package/dist/chunks/{command-palette-l8dym46a74o7j8ci.js.map → command-palette-ejoszjfivybu9yi5.js.map} +1 -1
  24. package/dist/chunks/{dialog-emk68n0piw8u7hkb.js → dialog-gkmecnx48ge38jrr.js} +11 -11
  25. package/dist/chunks/dialog-gkmecnx48ge38jrr.js.map +1 -0
  26. package/dist/chunks/{dropdown-ejgjnn9gq3daua1h.js → dropdown-i8n7nv3cvkvb1x3e.js} +2 -2
  27. package/dist/chunks/{dropdown-ejgjnn9gq3daua1h.js.map → dropdown-i8n7nv3cvkvb1x3e.js.map} +1 -1
  28. package/dist/chunks/{empty-crbntv0dhud7besh.js → empty-h3qhwtx0z8arupc9.js} +2 -2
  29. package/dist/chunks/{empty-crbntv0dhud7besh.js.map → empty-h3qhwtx0z8arupc9.js.map} +1 -1
  30. package/dist/chunks/{field-ftrgblg9mbmz9eo3.js → field-lc4gr226y5aqlctf.js} +3 -3
  31. package/dist/chunks/{field-ftrgblg9mbmz9eo3.js.map → field-lc4gr226y5aqlctf.js.map} +1 -1
  32. package/dist/chunks/input-area-ce3bf8m8wvot44kg.js +74 -0
  33. package/dist/chunks/input-area-ce3bf8m8wvot44kg.js.map +1 -0
  34. package/dist/chunks/{input-group-g6qyhe5jvpe02hee.js → input-group-kttdor9mr32k289o.js} +3 -3
  35. package/dist/chunks/{input-group-g6qyhe5jvpe02hee.js.map → input-group-kttdor9mr32k289o.js.map} +1 -1
  36. package/dist/chunks/{input-me56hug8sl0u650q.js → input-nvne68upfj8b2bk6.js} +20 -20
  37. package/dist/chunks/input-nvne68upfj8b2bk6.js.map +1 -0
  38. package/dist/chunks/{label-eooot7dhtfvw7n3x.js → label-e42o95ab0dxmchxb.js} +3 -3
  39. package/dist/chunks/{label-eooot7dhtfvw7n3x.js.map → label-e42o95ab0dxmchxb.js.map} +1 -1
  40. package/dist/chunks/{layer-card-8azgeai6zsrdbeoj.js → layer-card-mu2w82x6ko1nhhtr.js} +7 -7
  41. package/dist/chunks/{layer-card-8azgeai6zsrdbeoj.js.map → layer-card-mu2w82x6ko1nhhtr.js.map} +1 -1
  42. package/dist/chunks/{link-moetfdbgxda0yhwg.js → link-lpzl5s47pmobk361.js} +2 -2
  43. package/dist/chunks/{link-moetfdbgxda0yhwg.js.map → link-lpzl5s47pmobk361.js.map} +1 -1
  44. package/dist/chunks/{menubar-c2zwv4mbo3xqq7is.js → menubar-ifxxdoa35zz79z1q.js} +2 -2
  45. package/dist/chunks/{menubar-c2zwv4mbo3xqq7is.js.map → menubar-ifxxdoa35zz79z1q.js.map} +1 -1
  46. package/dist/chunks/{meter-em2hfu8j2rhmf5ae.js → meter-fbtqfg0okpwmaiju.js} +2 -2
  47. package/dist/chunks/{meter-em2hfu8j2rhmf5ae.js.map → meter-fbtqfg0okpwmaiju.js.map} +1 -1
  48. package/dist/chunks/{pagination-xt93wvwvow4z44lc.js → pagination-owm6h66jjgv1tjoe.js} +3 -3
  49. package/dist/chunks/{pagination-xt93wvwvow4z44lc.js.map → pagination-owm6h66jjgv1tjoe.js.map} +1 -1
  50. package/dist/chunks/{popover-irccwetx73p8pnua.js → popover-dd7hi5ajeoq9od1i.js} +2 -2
  51. package/dist/chunks/{popover-irccwetx73p8pnua.js.map → popover-dd7hi5ajeoq9od1i.js.map} +1 -1
  52. package/dist/chunks/radio-ff1csb328f12smd4.js +200 -0
  53. package/dist/chunks/radio-ff1csb328f12smd4.js.map +1 -0
  54. package/dist/chunks/{select-jxxef2rf76pgdrf8.js → select-go7a0z3evkh9cfxq.js} +41 -34
  55. package/dist/chunks/select-go7a0z3evkh9cfxq.js.map +1 -0
  56. package/dist/chunks/{sensitive-input-i7ey1w0ky7nco012.js → sensitive-input-gtzk3vit4i35n95g.js} +34 -34
  57. package/dist/chunks/sensitive-input-gtzk3vit4i35n95g.js.map +1 -0
  58. package/dist/chunks/switch-cpbp0i75jnazkani.js +241 -0
  59. package/dist/chunks/switch-cpbp0i75jnazkani.js.map +1 -0
  60. package/dist/chunks/{table-d4ql7fjvok30xs1f.js → table-g41yb7ruredizqr8.js} +3 -3
  61. package/dist/chunks/table-g41yb7ruredizqr8.js.map +1 -0
  62. package/dist/chunks/{tabs-n3rcvuzx0gbslyy6.js → tabs-hy6oa7xtf96d9mxt.js} +27 -27
  63. package/dist/chunks/{tabs-n3rcvuzx0gbslyy6.js.map → tabs-hy6oa7xtf96d9mxt.js.map} +1 -1
  64. package/dist/chunks/{toast-j05qj3vk688ht1i1.js → toast-j5gtfc50xpzzd0hc.js} +3 -3
  65. package/dist/chunks/{toast-j05qj3vk688ht1i1.js.map → toast-j5gtfc50xpzzd0hc.js.map} +1 -1
  66. package/dist/chunks/{tooltip-es2dwwbhftg4k2jy.js → tooltip-k68wcv9mrigb7rcb.js} +2 -2
  67. package/dist/chunks/{tooltip-es2dwwbhftg4k2jy.js.map → tooltip-k68wcv9mrigb7rcb.js.map} +1 -1
  68. package/dist/chunks/{vendor-base-ui-kxxocm122zr4pipe.js → vendor-base-ui-cpvkrhz4zgw9nw2b.js} +18 -18
  69. package/dist/chunks/{vendor-base-ui-kxxocm122zr4pipe.js.map → vendor-base-ui-cpvkrhz4zgw9nw2b.js.map} +1 -1
  70. package/dist/code.js +1 -1
  71. package/dist/code.js.map +1 -1
  72. package/dist/components/breadcrumbs.js +1 -1
  73. package/dist/components/button.js +1 -1
  74. package/dist/components/chart.js +1 -1
  75. package/dist/components/checkbox.js +1 -1
  76. package/dist/components/clipboard-text.js +1 -1
  77. package/dist/components/combobox.js +1 -1
  78. package/dist/components/command-palette.js +1 -1
  79. package/dist/components/dialog.js +1 -1
  80. package/dist/components/dropdown.js +1 -1
  81. package/dist/components/empty.js +1 -1
  82. package/dist/components/field.js +1 -1
  83. package/dist/components/flow.js +1435 -1431
  84. package/dist/components/flow.js.map +1 -1
  85. package/dist/components/input.js +3 -3
  86. package/dist/components/label.js +1 -1
  87. package/dist/components/layer-card.js +1 -1
  88. package/dist/components/link.js +1 -1
  89. package/dist/components/menubar.js +1 -1
  90. package/dist/components/meter.js +1 -1
  91. package/dist/components/pagination.js +1 -1
  92. package/dist/components/popover.js +1 -1
  93. package/dist/components/radio.js +1 -1
  94. package/dist/components/select.js +1 -1
  95. package/dist/components/sensitive-input.js +1 -1
  96. package/dist/components/switch.js +1 -1
  97. package/dist/components/table.js +1 -1
  98. package/dist/components/tabs.js +1 -1
  99. package/dist/components/toast.js +2 -2
  100. package/dist/components/tooltip.js +1 -1
  101. package/dist/index.js +70 -69
  102. package/dist/primitives/accordion.js +1 -1
  103. package/dist/primitives/alert-dialog.js +1 -1
  104. package/dist/primitives/autocomplete.js +1 -1
  105. package/dist/primitives/avatar.js +1 -1
  106. package/dist/primitives/button.js +1 -1
  107. package/dist/primitives/checkbox-group.js +1 -1
  108. package/dist/primitives/checkbox.js +1 -1
  109. package/dist/primitives/collapsible.js +1 -1
  110. package/dist/primitives/combobox.js +1 -1
  111. package/dist/primitives/context-menu.js +1 -1
  112. package/dist/primitives/csp-provider.js +1 -1
  113. package/dist/primitives/dialog.js +1 -1
  114. package/dist/primitives/direction-provider.js +1 -1
  115. package/dist/primitives/drawer.js +1 -1
  116. package/dist/primitives/field.js +1 -1
  117. package/dist/primitives/fieldset.js +1 -1
  118. package/dist/primitives/form.js +1 -1
  119. package/dist/primitives/input.js +1 -1
  120. package/dist/primitives/menu.js +1 -1
  121. package/dist/primitives/menubar.js +1 -1
  122. package/dist/primitives/meter.js +1 -1
  123. package/dist/primitives/navigation-menu.js +1 -1
  124. package/dist/primitives/number-field.js +1 -1
  125. package/dist/primitives/popover.js +1 -1
  126. package/dist/primitives/preview-card.js +1 -1
  127. package/dist/primitives/progress.js +1 -1
  128. package/dist/primitives/radio-group.js +1 -1
  129. package/dist/primitives/radio.js +1 -1
  130. package/dist/primitives/scroll-area.js +1 -1
  131. package/dist/primitives/select.js +1 -1
  132. package/dist/primitives/separator.js +1 -1
  133. package/dist/primitives/slider.js +1 -1
  134. package/dist/primitives/switch.js +1 -1
  135. package/dist/primitives/tabs.js +1 -1
  136. package/dist/primitives/toast.js +1 -1
  137. package/dist/primitives/toggle-group.js +1 -1
  138. package/dist/primitives/toggle.js +1 -1
  139. package/dist/primitives/toolbar.js +1 -1
  140. package/dist/primitives/tooltip.js +1 -1
  141. package/dist/primitives.js +1 -1
  142. package/dist/scripts/theme-generator/config.d.ts.map +1 -1
  143. package/dist/scripts/theme-generator/config.js +12 -3
  144. package/dist/scripts/theme-generator/config.js.map +1 -1
  145. package/dist/src/code/code-highlighted.d.ts +2 -2
  146. package/dist/src/code/code-highlighted.d.ts.map +1 -1
  147. package/dist/src/code/provider.d.ts +2 -2
  148. package/dist/src/code/provider.d.ts.map +1 -1
  149. package/dist/src/components/chart/EChart.d.ts +7 -2
  150. package/dist/src/components/chart/EChart.d.ts.map +1 -1
  151. package/dist/src/components/combobox/combobox.d.ts.map +1 -1
  152. package/dist/src/components/flow/diagram.d.ts.map +1 -1
  153. package/dist/src/components/input/input-area.d.ts.map +1 -1
  154. package/dist/src/components/radio/index.d.ts +1 -1
  155. package/dist/src/components/radio/index.d.ts.map +1 -1
  156. package/dist/src/components/radio/radio.d.ts +43 -4
  157. package/dist/src/components/radio/radio.d.ts.map +1 -1
  158. package/dist/src/components/select/select.d.ts.map +1 -1
  159. package/dist/src/components/switch/switch.d.ts +8 -8
  160. package/dist/src/components/switch/switch.d.ts.map +1 -1
  161. package/dist/src/index.d.ts +1 -1
  162. package/dist/src/index.d.ts.map +1 -1
  163. package/dist/styles/kumo-binding.css +5 -0
  164. package/dist/styles/kumo-standalone.css +1 -1
  165. package/dist/styles/theme-kumo.css +7 -0
  166. package/package.json +3 -6
  167. package/scripts/theme-generator/config.ts +12 -3
  168. package/dist/chunks/Legend-fu32ev5ph2ehbfzy.js +0 -402
  169. package/dist/chunks/Legend-fu32ev5ph2ehbfzy.js.map +0 -1
  170. package/dist/chunks/combobox-i3mdp6f01dvpoc5j.js.map +0 -1
  171. package/dist/chunks/dialog-emk68n0piw8u7hkb.js.map +0 -1
  172. package/dist/chunks/input-area-hxtyrqpp44m18j72.js +0 -59
  173. package/dist/chunks/input-area-hxtyrqpp44m18j72.js.map +0 -1
  174. package/dist/chunks/input-me56hug8sl0u650q.js.map +0 -1
  175. package/dist/chunks/radio-394mfs3au5m8cgd8.js +0 -125
  176. package/dist/chunks/radio-394mfs3au5m8cgd8.js.map +0 -1
  177. package/dist/chunks/select-jxxef2rf76pgdrf8.js.map +0 -1
  178. package/dist/chunks/sensitive-input-i7ey1w0ky7nco012.js.map +0 -1
  179. package/dist/chunks/switch-b0xo8fxsfzv87krj.js +0 -257
  180. package/dist/chunks/switch-b0xo8fxsfzv87krj.js.map +0 -1
  181. package/dist/chunks/table-d4ql7fjvok30xs1f.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,40 @@
1
1
  # @cloudflare/kumo
2
2
 
3
+ ## 1.14.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 839b0cb: fix: update styling for mostly-used components with new greyscale tokens (combobox, dialog, input, layerCard, select & tabs) as well as homegrid and component preview backgrounds.
8
+ - 7083a17: Remove es2022 build target that caused Jest/babel-jest test failures in stratus
9
+
10
+ ## 1.14.0
11
+
12
+ ### Minor Changes
13
+
14
+ - 8b2d6a0: Add radio card appearance via `appearance="card"` prop on Radio.Group and Radio.Item. Cards display a bordered, selectable container with title and description. Also adds `description` prop to Radio.Item for helper text. Supports vertical and horizontal orientations, error state, and disabled state.
15
+ - abbf586: Expose Chart `optionUpdateBehavior` to control how ECharts applies option updates; `notMerge` now defaults to `false`.
16
+ - c6aa554: Add neutral variant to Switch component and improve accessibility
17
+ - New `variant="neutral"` option: monochrome switch with squircle shape, matching the design from stratus
18
+ - Improved off-state visibility for default variant with darker background/ring colors
19
+ - Removed `error` variant (not useful for toggle switches)
20
+ - Added defensive fallback so invalid variant values don't cause runtime crashes
21
+
22
+ ### Patch Changes
23
+
24
+ - f2e17d7: removed `outline-none` to bring back focus states on all buttons
25
+ - eba693e: Fix flaky vitest "Closing rpc while fetch was pending" error in deep-imports test
26
+ - db91f50: Fix InputArea label click not focusing textarea. Use FieldBase.Control with render callback to properly associate the label with the textarea element.
27
+ - 80afd4d: Fix TypeScript return types for ShikiProvider and CodeHighlighted components.
28
+
29
+ Changed return type from `ReactNode` to `React.JSX.Element` to resolve JSX compatibility errors. This fixes issues when consuming these components in projects with stricter TypeScript configurations (e.g., `skipLibCheck: false`), where `ReactNode` was incorrectly inferred as a valid JSX element return type.
30
+
31
+ - dc9742d: Fix table header font size to ensure consistent rendering across dashboards with different default font sizes
32
+ - f94fee7: Add dedicated `kumo-placeholder` text color token and use it for Input, InputArea, SensitiveInput, and CommandPalette placeholder text. The new token provides better visual distinction between placeholder and active text in both light and dark modes.
33
+ - 66012b7: Replace the package-level ESLint pass with Oxlint JS plugin coverage for the remaining jsx-a11y rules, and pin the library build to `es2022` with a post-build browser-compat test that blocks newer runtime APIs from shipping in `dist`.
34
+ - e8acdd8: fix(Select): prevent chevron overflow with long multi-select values
35
+
36
+ Added `min-w-0 truncate` to the value element and `shrink-0` to the chevron icon so that long option names truncate gracefully instead of pushing the chevron outside the select bounds.
37
+
3
38
  ## 1.13.1
4
39
 
5
40
  ### Patch Changes
@@ -322,7 +322,7 @@
322
322
  "ghost": "text-kumo-default hover:bg-kumo-tint shadow-none bg-inherit",
323
323
  "destructive": "bg-kumo-danger !text-white hover:bg-kumo-danger/70",
324
324
  "secondary-destructive": "bg-kumo-base !text-kumo-danger ring not-disabled:hover:border-secondary! not-disabled:hover:bg-kumo-base disabled:bg-kumo-base/50 disabled:!text-kumo-danger/70 ring-kumo-line data-[state=open]:bg-kumo-base",
325
- "outline": "text-kumo-default ring-2 ring-kumo-ring"
325
+ "outline": "bg-transparent text-kumo-default ring-2 ring-kumo-ring"
326
326
  },
327
327
  "stateClasses": {
328
328
  "primary": {
@@ -2130,11 +2130,11 @@
2130
2130
  "<div className=\"flex flex-wrap items-center gap-4\">\n <Combobox\n size=\"sm\"\n value={smValue}\n onValueChange={(v) => setSmValue(v as Language)}\n items={languages}\n >\n <Combobox.TriggerValue className=\"w-[160px]\" />\n <Combobox.Content>\n <Combobox.Input placeholder=\"Search\" />\n <Combobox.Empty />\n <Combobox.List>\n {(item: Language) => (\n <Combobox.Item key={item.value} value={item}>\n {item.emoji} {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n <Combobox\n size=\"base\"\n value={baseValue}\n onValueChange={(v) => setBaseValue(v as Language)}\n items={languages}\n >\n <Combobox.TriggerValue className=\"w-[180px]\" />\n <Combobox.Content>\n <Combobox.Input placeholder=\"Search\" />\n <Combobox.Empty />\n <Combobox.List>\n {(item: Language) => (\n <Combobox.Item key={item.value} value={item}>\n {item.emoji} {item.label}\n </Combobox.Item>\n )}\n </Combobox.List>\n </Combobox.Content>\n </Combobox>\n </div>"
2131
2131
  ],
2132
2132
  "colors": [
2133
- "bg-kumo-control",
2133
+ "bg-kumo-base",
2134
2134
  "bg-kumo-fill-hover",
2135
2135
  "bg-kumo-overlay",
2136
+ "bg-kumo-tint",
2136
2137
  "border-kumo-line",
2137
- "fill-kumo-ring",
2138
2138
  "ring-kumo-line",
2139
2139
  "text-kumo-default",
2140
2140
  "text-kumo-strong",
@@ -2474,7 +2474,6 @@
2474
2474
  ],
2475
2475
  "colors": [
2476
2476
  "bg-kumo-base",
2477
- "bg-kumo-overlay",
2478
2477
  "text-kumo-default"
2479
2478
  ],
2480
2479
  "subComponents": {
@@ -3166,6 +3165,7 @@
3166
3165
  "colors": [
3167
3166
  "bg-kumo-base",
3168
3167
  "bg-kumo-elevated",
3168
+ "bg-kumo-recessed",
3169
3169
  "ring-kumo-fill",
3170
3170
  "ring-kumo-line",
3171
3171
  "text-kumo-strong"
@@ -3718,6 +3718,28 @@
3718
3718
  "horizontal"
3719
3719
  ]
3720
3720
  },
3721
+ "appearance": {
3722
+ "type": "enum",
3723
+ "optional": true,
3724
+ "description": "Visual appearance applied to all Radio.Item children.\n- `\"default\"` — Standard inline radio items\n- `\"card\"` — Choice card with border, padding, and highlighted selection state\n\nIndividual items can override this with their own `appearance` prop.",
3725
+ "values": [
3726
+ "default",
3727
+ "card"
3728
+ ],
3729
+ "descriptions": {
3730
+ "default": "Standard inline radio item",
3731
+ "card": "Choice card appearance with border, padding, and highlighted selection state"
3732
+ },
3733
+ "classes": {
3734
+ "card": "rounded-lg border border-kumo-ring bg-kumo-base p-3 transition-colors hover:bg-kumo-tint has-[[data-checked]]:border-kumo-interact has-[[data-checked]]:bg-kumo-tint"
3735
+ },
3736
+ "stateClasses": {
3737
+ "card": {
3738
+ "hover": "hover:bg-kumo-tint"
3739
+ }
3740
+ },
3741
+ "default": "default"
3742
+ },
3721
3743
  "error": {
3722
3744
  "type": "string",
3723
3745
  "optional": true,
@@ -3741,7 +3763,7 @@
3741
3763
  "controlPosition": {
3742
3764
  "type": "enum",
3743
3765
  "optional": true,
3744
- "description": "Position of radio control relative to label: \"start\" (default) puts radio before label, \"end\" puts label before radio",
3766
+ "description": "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.",
3745
3767
  "values": [
3746
3768
  "start",
3747
3769
  "end"
@@ -3763,14 +3785,20 @@
3763
3785
  "<Radio.Group legend=\"Account type\" value={value} onValueChange={setValue}>\n <Radio.Item label=\"Personal\" value=\"personal\" />\n <Radio.Item label=\"Business\" value=\"business\" />\n <Radio.Item label=\"Enterprise\" value=\"enterprise\" />\n </Radio.Group>",
3764
3786
  "<Radio.Group\n legend=\"Size\"\n orientation=\"horizontal\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Small\" value=\"sm\" />\n <Radio.Item label=\"Medium\" value=\"md\" />\n <Radio.Item label=\"Large\" value=\"lg\" />\n </Radio.Group>",
3765
3787
  "<Radio.Group\n legend=\"Shipping method\"\n description=\"Choose how you'd like to receive your order\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item label=\"Standard (5-7 days)\" value=\"standard\" />\n <Radio.Item label=\"Express (2-3 days)\" value=\"express\" />\n <Radio.Item label=\"Overnight\" value=\"overnight\" />\n </Radio.Group>",
3766
- "<Radio.Group\n legend=\"Payment method\"\n error=\"Please select a payment method to continue\"\n >\n <Radio.Item label=\"Credit Card\" value=\"card\" variant=\"error\" />\n <Radio.Item label=\"PayPal\" value=\"paypal\" variant=\"error\" />\n <Radio.Item label=\"Bank Transfer\" value=\"bank\" variant=\"error\" />\n </Radio.Group>",
3767
- "<div className=\"flex flex-col gap-6\">\n <Radio.Group legend=\"Disabled group\" disabled defaultValue=\"a\">\n <Radio.Item label=\"Option A\" value=\"a\" />\n <Radio.Item label=\"Option B\" value=\"b\" />\n </Radio.Group>\n <Radio.Group legend=\"Individual disabled\" defaultValue=\"available\">\n <Radio.Item label=\"Available\" value=\"available\" />\n <Radio.Item label=\"Unavailable\" value=\"unavailable\" disabled />\n </Radio.Group>\n </div>",
3768
- "<Radio.Group legend=\"Preferences\" controlPosition=\"end\" defaultValue=\"a\">\n <Radio.Item label=\"Label before radio\" value=\"a\" />\n <Radio.Item label=\"Another option\" value=\"b\" />\n </Radio.Group>"
3788
+ "<div className=\"grid grid-cols-2 gap-6\">\n <Radio.Group\n legend=\"Payment method\"\n error=\"Please select a payment method to continue\"\n >\n <Radio.Item label=\"Credit Card\" value=\"card\" variant=\"error\" />\n <Radio.Item label=\"PayPal\" value=\"paypal\" variant=\"error\" />\n </Radio.Group>\n <Radio.Group\n legend=\"Payment method\"\n appearance=\"card\"\n error=\"Please select a payment method to continue\"\n >\n <Radio.Item\n label=\"Credit Card\"\n description=\"Pay with Visa, Mastercard, American Express, or Elo.\"\n value=\"card\"\n variant=\"error\"\n />\n <Radio.Item\n label=\"PayPal\"\n description=\"Pay with your PayPal account.\"\n value=\"paypal\"\n variant=\"error\"\n />\n </Radio.Group>\n </div>",
3789
+ "<div className=\"grid grid-cols-2 gap-6\">\n <Radio.Group legend=\"Disabled group\" disabled defaultValue=\"a\">\n <Radio.Item label=\"Option A\" value=\"a\" />\n <Radio.Item label=\"Option B\" value=\"b\" />\n </Radio.Group>\n <Radio.Group legend=\"Individual disabled\" defaultValue=\"available\">\n <Radio.Item label=\"Available\" value=\"available\" />\n <Radio.Item label=\"Unavailable\" value=\"unavailable\" disabled />\n </Radio.Group>\n <Radio.Group\n legend=\"Disabled card group\"\n appearance=\"card\"\n disabled\n defaultValue=\"a\"\n >\n <Radio.Item\n label=\"Option A\"\n description=\"This option is disabled.\"\n value=\"a\"\n />\n <Radio.Item\n label=\"Option B\"\n description=\"This option is disabled.\"\n value=\"b\"\n />\n </Radio.Group>\n <Radio.Group\n legend=\"Individual disabled card\"\n appearance=\"card\"\n defaultValue=\"available\"\n >\n <Radio.Item\n label=\"Available\"\n description=\"This option can be selected.\"\n value=\"available\"\n />\n <Radio.Item\n label=\"Unavailable\"\n description=\"This option is not available.\"\n value=\"unavailable\"\n disabled\n />\n </Radio.Group>\n </div>",
3790
+ "<Radio.Group legend=\"Preferences\" controlPosition=\"end\" defaultValue=\"a\">\n <Radio.Item label=\"Label before radio\" value=\"a\" />\n <Radio.Item label=\"Another option\" value=\"b\" />\n </Radio.Group>",
3791
+ "<Radio.Group\n legend=\"Choose a plan\"\n appearance=\"card\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item\n label=\"Free\"\n description=\"For personal or hobby projects that aren't business-critical.\"\n value=\"free\"\n />\n <Radio.Item\n label=\"Pro\"\n description=\"For professional websites that aren't business-critical.\"\n value=\"pro\"\n />\n <Radio.Item\n label=\"Business\"\n description=\"For small businesses operating online.\"\n value=\"business\"\n />\n <Radio.Item\n label=\"Contract\"\n description=\"For mission-critical applications that are core to your business.\"\n value=\"contract\"\n />\n </Radio.Group>",
3792
+ "<Radio.Group\n legend=\"Choose a plan\"\n appearance=\"card\"\n orientation=\"horizontal\"\n value={value}\n onValueChange={setValue}\n >\n <Radio.Item\n label=\"Free\"\n description=\"For personal or hobby projects that aren't business-critical.\"\n value=\"free\"\n />\n <Radio.Item\n label=\"Pro\"\n description=\"For professional websites that aren't business-critical.\"\n value=\"pro\"\n />\n <Radio.Item\n label=\"Business\"\n description=\"For small businesses operating online.\"\n value=\"business\"\n />\n <Radio.Item\n label=\"Contract\"\n description=\"For mission-critical applications that are core to your business.\"\n value=\"contract\"\n />\n </Radio.Group>"
3769
3793
  ],
3770
3794
  "colors": [
3771
3795
  "bg-kumo-base",
3772
3796
  "bg-kumo-contrast",
3797
+ "bg-kumo-tint",
3798
+ "border-kumo-danger",
3799
+ "border-kumo-interact",
3773
3800
  "border-kumo-line",
3801
+ "border-kumo-ring",
3774
3802
  "ring-kumo-danger",
3775
3803
  "ring-kumo-line",
3776
3804
  "ring-kumo-ring",
@@ -3864,12 +3892,13 @@
3864
3892
  "<Select aria-label=\"Loading select\" className=\"w-[200px]\" loading />",
3865
3893
  "<Select\n label=\"Assignee\"\n className=\"w-[200px]\"\n loading={loading}\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n placeholder=\"Select assignee\"\n items={items}\n />",
3866
3894
  "<Select\n label=\"Visible Columns\"\n className=\"w-[250px]\"\n multiple\n renderValue={(value) => {\n if (value.length > 3) {\n return (\n <span className=\"line-clamp-1\">\n {value.slice(0, 2).join(\", \") + ` and ${value.length - 2} more`}\n </span>\n );\n }\n return <span>{value.join(\", \")}</span>;\n }}\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n <Select.Option value=\"Name\">Name</Select.Option>\n <Select.Option value=\"Location\">Location</Select.Option>\n <Select.Option value=\"Size\">Size</Select.Option>\n <Select.Option value=\"Read\">Read</Select.Option>\n <Select.Option value=\"Write\">Write</Select.Option>\n <Select.Option value=\"CreatedAt\">Created At</Select.Option>\n </Select>",
3895
+ "<Select\n label=\"Compliance Frameworks\"\n className=\"w-[280px]\"\n multiple\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n <Select.Option value=\"European Union Privacy Regulation\">\n European Union Privacy Regulation\n </Select.Option>\n <Select.Option value=\"California Consumer Protection Act\">\n California Consumer Protection Act\n </Select.Option>\n <Select.Option value=\"Health Insurance Portability Act\">\n Health Insurance Portability Act\n </Select.Option>\n <Select.Option value=\"Payment Card Industry Standard\">\n Payment Card Industry Standard\n </Select.Option>\n </Select>",
3896
+ "<Select\n label=\"Issue Types\"\n className=\"w-[220px]\"\n multiple\n renderValue={(selected) => (\n <span className=\"flex items-center gap-2\">\n <span>Issue Types</span>\n {selected.length > 0 && (\n <Badge variant=\"secondary\">{selected.length}</Badge>\n )}\n </span>\n )}\n value={value}\n onValueChange={(v) => setValue(v as string[])}\n >\n {allOptions.map((option) => (\n <Select.Option key={option.value} value={option.value}>\n {option.label}\n </Select.Option>\n ))}\n </Select>",
3867
3897
  "<Select\n label=\"Author\"\n description=\"Select the primary author for this document\"\n className=\"w-[200px]\"\n onValueChange={(v) => setValue(v as (typeof authors)[0] | null)}\n value={value}\n isItemEqualToValue={(item, value) => item?.id === value?.id}\n renderValue={(author) => {\n return author?.name ?? \"Select an author\";\n }}\n >\n {authors.map((author) => (\n <Select.Option key={author.id} value={author}>\n <div className=\"flex w-[300px] items-center justify-between gap-2\">\n <Text>{author.name}</Text>\n <Text variant=\"secondary\">{author.title}</Text>\n </div>\n </Select.Option>\n ))}\n </Select>"
3868
3898
  ],
3869
3899
  "colors": [
3870
- "bg-kumo-control",
3871
- "bg-kumo-overlay",
3872
- "ring-kumo-line",
3900
+ "bg-kumo-base",
3901
+ "bg-kumo-tint",
3873
3902
  "ring-kumo-ring",
3874
3903
  "text-kumo-danger",
3875
3904
  "text-kumo-default",
@@ -4102,17 +4131,14 @@
4102
4131
  "variant": {
4103
4132
  "type": "enum",
4104
4133
  "optional": true,
4105
- "description": "Visual variant: \"default\" or \"error\" for validation failures (visual only, no error text)",
4134
+ "description": "Visual variant: \"default\" (pill, brand color) or \"neutral\" (squircle, monochrome)",
4106
4135
  "values": [
4107
4136
  "default",
4108
- "error"
4137
+ "neutral"
4109
4138
  ],
4110
4139
  "descriptions": {
4111
- "default": "Default switch appearance",
4112
- "error": "Error state for validation failures"
4113
- },
4114
- "classes": {
4115
- "error": "ring-kumo-danger"
4140
+ "default": "Default switch with squircle shape and brand blue color",
4141
+ "neutral": "Monochrome switch with squircle shape for subtle toggles"
4116
4142
  },
4117
4143
  "default": "default"
4118
4144
  },
@@ -4211,16 +4237,15 @@
4211
4237
  "<Switch label=\"Switch\" checked={checked} onCheckedChange={setChecked} />",
4212
4238
  "<Switch label=\"Switch\" checked={false} onCheckedChange={() => {}} />",
4213
4239
  "<Switch label=\"Switch\" checked={true} onCheckedChange={() => {}} />",
4214
- "<Switch label=\"Disabled\" checked={false} disabled />"
4240
+ "<Switch label=\"Disabled\" checked={false} disabled />",
4241
+ "<Switch\n label=\"Neutral switch\"\n variant=\"neutral\"\n checked={checked}\n onCheckedChange={setChecked}\n />",
4242
+ "<div className=\"flex flex-col gap-4\">\n <Switch\n label=\"Neutral off\"\n variant=\"neutral\"\n checked={false}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Neutral on\"\n variant=\"neutral\"\n checked={true}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Neutral disabled\"\n variant=\"neutral\"\n checked={false}\n disabled\n />\n </div>",
4243
+ "<div className=\"flex flex-col gap-4\">\n <Switch\n label=\"Default variant\"\n checked={true}\n onCheckedChange={() => {}}\n />\n <Switch\n label=\"Neutral variant\"\n variant=\"neutral\"\n checked={true}\n onCheckedChange={() => {}}\n />\n </div>"
4215
4244
  ],
4216
4245
  "colors": [
4217
- "bg-kumo-brand",
4218
- "bg-kumo-brand-hover",
4219
- "bg-kumo-danger",
4220
- "bg-kumo-interact",
4221
- "bg-kumo-recessed",
4246
+ "bg-kumo-base",
4222
4247
  "border-kumo-line",
4223
- "ring-kumo-danger",
4248
+ "ring-kumo-line",
4224
4249
  "text-kumo-danger",
4225
4250
  "text-kumo-default",
4226
4251
  "text-kumo-subtle"
@@ -4438,11 +4463,12 @@
4438
4463
  "<Tabs\n tabs={[\n {\n value: \"tab1\",\n label: \"Regular Tab\",\n },\n {\n value: \"tab2\",\n label: \"Link Tab\",\n render: (props) => <a {...props} href=\"#tab2\" />,\n },\n {\n value: \"tab3\",\n label: \"Cloudflare\",\n render: (props) => (\n <a {...props} href=\"https://cloudflare.com\" target=\"_blank\" />\n ),\n },\n ]}\n selectedValue=\"tab1\"\n />"
4439
4464
  ],
4440
4465
  "colors": [
4466
+ "bg-kumo-base",
4441
4467
  "bg-kumo-brand",
4442
- "bg-kumo-overlay",
4468
+ "bg-kumo-recessed",
4469
+ "bg-kumo-surface",
4443
4470
  "bg-kumo-tint",
4444
- "border-kumo-line",
4445
- "ring-kumo-fill-hover",
4471
+ "border-kumo-ring",
4446
4472
  "ring-kumo-ring",
4447
4473
  "text-kumo-default",
4448
4474
  "text-kumo-strong",
@@ -4708,7 +4734,8 @@
4708
4734
  "examples": [
4709
4735
  "<TooltipProvider>\n <Tooltip content=\"Add new item\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add new item\" />\n </Tooltip>\n </TooltipProvider>",
4710
4736
  "<TooltipProvider>\n <Tooltip content=\"Add\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n </TooltipProvider>",
4711
- "<TooltipProvider>\n <div className=\"flex gap-2\">\n <Tooltip content=\"Add\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n <Tooltip content=\"Change language\" asChild>\n <Button\n shape=\"square\"\n icon={TranslateIcon}\n aria-label=\"Change language\"\n />\n </Tooltip>\n </div>\n </TooltipProvider>"
4737
+ "<TooltipProvider>\n <div className=\"flex gap-2\">\n <Tooltip content=\"Add\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n <Tooltip content=\"Change language\" asChild>\n <Button\n shape=\"square\"\n icon={TranslateIcon}\n aria-label=\"Change language\"\n />\n </Tooltip>\n </div>\n </TooltipProvider>",
4738
+ "<TooltipProvider>\n <Tooltip\n content=\"Click to learn more\"\n className=\"inline-flex items-center gap-1.5 rounded-full bg-kumo-brand px-3 py-1.5 text-sm font-medium text-white shadow-md transition-transform hover:scale-105 active:scale-95\"\n >\n <Info className=\"size-4\" />\n <span>Help</span>\n </Tooltip>\n </TooltipProvider>"
4712
4739
  ],
4713
4740
  "colors": [
4714
4741
  "bg-kumo-base",
@@ -5111,4 +5138,4 @@
5111
5138
  ]
5112
5139
  }
5113
5140
  }
5114
- }
5141
+ }
@@ -1209,7 +1209,7 @@ Combobox — autocomplete input with filterable dropdown list. Compound compone
1209
1209
 
1210
1210
  **Colors (kumo tokens used):**
1211
1211
 
1212
- `bg-kumo-control`, `bg-kumo-fill-hover`, `bg-kumo-overlay`, `border-kumo-line`, `fill-kumo-ring`, `ring-kumo-line`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
1212
+ `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`
1213
1213
 
1214
1214
  **Sub-Components:**
1215
1215
 
@@ -2035,7 +2035,7 @@ Dialog component
2035
2035
 
2036
2036
  **Colors (kumo tokens used):**
2037
2037
 
2038
- `bg-kumo-base`, `bg-kumo-overlay`, `text-kumo-default`
2038
+ `bg-kumo-base`, `text-kumo-default`
2039
2039
 
2040
2040
  **Styling:**
2041
2041
 
@@ -3100,7 +3100,7 @@ LayerCard component
3100
3100
 
3101
3101
  **Colors (kumo tokens used):**
3102
3102
 
3103
- `bg-kumo-base`, `bg-kumo-elevated`, `ring-kumo-fill`, `ring-kumo-line`, `text-kumo-strong`
3103
+ `bg-kumo-base`, `bg-kumo-elevated`, `bg-kumo-recessed`, `ring-kumo-fill`, `ring-kumo-line`, `text-kumo-strong`
3104
3104
 
3105
3105
  **Styling:**
3106
3106
 
@@ -3815,6 +3815,13 @@ Radio — radio button group for single-select choices. Compound component: `Ra
3815
3815
  Child Radio.Item components
3816
3816
  - `orientation`: enum
3817
3817
  Layout direction of the radio items
3818
+ - `appearance`: enum [default: default]
3819
+ - `"default"`: Standard inline radio item
3820
+ - `"card"`: Choice card appearance with border, padding, and highlighted selection state
3821
+
3822
+ **State Classes:**
3823
+ - `"card"`:
3824
+ - `hover`: `hover:bg-kumo-tint`
3818
3825
  - `error`: string
3819
3826
  Error message for the group
3820
3827
  - `description`: ReactNode
@@ -3824,7 +3831,7 @@ Radio — radio button group for single-select choices. Compound component: `Ra
3824
3831
  - `disabled`: boolean
3825
3832
  Whether all radios in the group are disabled
3826
3833
  - `controlPosition`: enum
3827
- Position of radio control relative to label: "start" (default) puts radio before label, "end" puts label before radio
3834
+ 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.
3828
3835
  - `name`: string
3829
3836
  Form submission name for the radio group
3830
3837
  - `className`: string
@@ -3832,7 +3839,7 @@ Radio — radio button group for single-select choices. Compound component: `Ra
3832
3839
 
3833
3840
  **Colors (kumo tokens used):**
3834
3841
 
3835
- `bg-kumo-base`, `bg-kumo-contrast`, `border-kumo-line`, `ring-kumo-danger`, `ring-kumo-line`, `ring-kumo-ring`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
3842
+ `bg-kumo-base`, `bg-kumo-contrast`, `bg-kumo-tint`, `border-kumo-danger`, `border-kumo-interact`, `border-kumo-line`, `border-kumo-ring`, `ring-kumo-danger`, `ring-kumo-line`, `ring-kumo-ring`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
3836
3843
 
3837
3844
  **Examples:**
3838
3845
 
@@ -3875,18 +3882,37 @@ Radio — radio button group for single-select choices. Compound component: `Ra
3875
3882
  ```
3876
3883
 
3877
3884
  ```tsx
3878
- <Radio.Group
3879
- legend="Payment method"
3880
- error="Please select a payment method to continue"
3881
- >
3882
- <Radio.Item label="Credit Card" value="card" variant="error" />
3883
- <Radio.Item label="PayPal" value="paypal" variant="error" />
3884
- <Radio.Item label="Bank Transfer" value="bank" variant="error" />
3885
- </Radio.Group>
3885
+ <div className="grid grid-cols-2 gap-6">
3886
+ <Radio.Group
3887
+ legend="Payment method"
3888
+ error="Please select a payment method to continue"
3889
+ >
3890
+ <Radio.Item label="Credit Card" value="card" variant="error" />
3891
+ <Radio.Item label="PayPal" value="paypal" variant="error" />
3892
+ </Radio.Group>
3893
+ <Radio.Group
3894
+ legend="Payment method"
3895
+ appearance="card"
3896
+ error="Please select a payment method to continue"
3897
+ >
3898
+ <Radio.Item
3899
+ label="Credit Card"
3900
+ description="Pay with Visa, Mastercard, American Express, or Elo."
3901
+ value="card"
3902
+ variant="error"
3903
+ />
3904
+ <Radio.Item
3905
+ label="PayPal"
3906
+ description="Pay with your PayPal account."
3907
+ value="paypal"
3908
+ variant="error"
3909
+ />
3910
+ </Radio.Group>
3911
+ </div>
3886
3912
  ```
3887
3913
 
3888
3914
  ```tsx
3889
- <div className="flex flex-col gap-6">
3915
+ <div className="grid grid-cols-2 gap-6">
3890
3916
  <Radio.Group legend="Disabled group" disabled defaultValue="a">
3891
3917
  <Radio.Item label="Option A" value="a" />
3892
3918
  <Radio.Item label="Option B" value="b" />
@@ -3895,6 +3921,40 @@ Radio — radio button group for single-select choices. Compound component: `Ra
3895
3921
  <Radio.Item label="Available" value="available" />
3896
3922
  <Radio.Item label="Unavailable" value="unavailable" disabled />
3897
3923
  </Radio.Group>
3924
+ <Radio.Group
3925
+ legend="Disabled card group"
3926
+ appearance="card"
3927
+ disabled
3928
+ defaultValue="a"
3929
+ >
3930
+ <Radio.Item
3931
+ label="Option A"
3932
+ description="This option is disabled."
3933
+ value="a"
3934
+ />
3935
+ <Radio.Item
3936
+ label="Option B"
3937
+ description="This option is disabled."
3938
+ value="b"
3939
+ />
3940
+ </Radio.Group>
3941
+ <Radio.Group
3942
+ legend="Individual disabled card"
3943
+ appearance="card"
3944
+ defaultValue="available"
3945
+ >
3946
+ <Radio.Item
3947
+ label="Available"
3948
+ description="This option can be selected."
3949
+ value="available"
3950
+ />
3951
+ <Radio.Item
3952
+ label="Unavailable"
3953
+ description="This option is not available."
3954
+ value="unavailable"
3955
+ disabled
3956
+ />
3957
+ </Radio.Group>
3898
3958
  </div>
3899
3959
  ```
3900
3960
 
@@ -3905,6 +3965,67 @@ Radio — radio button group for single-select choices. Compound component: `Ra
3905
3965
  </Radio.Group>
3906
3966
  ```
3907
3967
 
3968
+ ```tsx
3969
+ <Radio.Group
3970
+ legend="Choose a plan"
3971
+ appearance="card"
3972
+ value={value}
3973
+ onValueChange={setValue}
3974
+ >
3975
+ <Radio.Item
3976
+ label="Free"
3977
+ description="For personal or hobby projects that aren't business-critical."
3978
+ value="free"
3979
+ />
3980
+ <Radio.Item
3981
+ label="Pro"
3982
+ description="For professional websites that aren't business-critical."
3983
+ value="pro"
3984
+ />
3985
+ <Radio.Item
3986
+ label="Business"
3987
+ description="For small businesses operating online."
3988
+ value="business"
3989
+ />
3990
+ <Radio.Item
3991
+ label="Contract"
3992
+ description="For mission-critical applications that are core to your business."
3993
+ value="contract"
3994
+ />
3995
+ </Radio.Group>
3996
+ ```
3997
+
3998
+ ```tsx
3999
+ <Radio.Group
4000
+ legend="Choose a plan"
4001
+ appearance="card"
4002
+ orientation="horizontal"
4003
+ value={value}
4004
+ onValueChange={setValue}
4005
+ >
4006
+ <Radio.Item
4007
+ label="Free"
4008
+ description="For personal or hobby projects that aren't business-critical."
4009
+ value="free"
4010
+ />
4011
+ <Radio.Item
4012
+ label="Pro"
4013
+ description="For professional websites that aren't business-critical."
4014
+ value="pro"
4015
+ />
4016
+ <Radio.Item
4017
+ label="Business"
4018
+ description="For small businesses operating online."
4019
+ value="business"
4020
+ />
4021
+ <Radio.Item
4022
+ label="Contract"
4023
+ description="For mission-critical applications that are core to your business."
4024
+ value="contract"
4025
+ />
4026
+ </Radio.Group>
4027
+ ```
4028
+
3908
4029
 
3909
4030
  ---
3910
4031
 
@@ -3950,7 +4071,7 @@ Select component
3950
4071
 
3951
4072
  **Colors (kumo tokens used):**
3952
4073
 
3953
- `bg-kumo-control`, `bg-kumo-overlay`, `ring-kumo-line`, `ring-kumo-ring`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
4074
+ `bg-kumo-base`, `bg-kumo-tint`, `ring-kumo-ring`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
3954
4075
 
3955
4076
  **Styling:**
3956
4077
 
@@ -4087,6 +4208,53 @@ Option sub-component
4087
4208
  </Select>
4088
4209
  ```
4089
4210
 
4211
+ ```tsx
4212
+ <Select
4213
+ label="Compliance Frameworks"
4214
+ className="w-[280px]"
4215
+ multiple
4216
+ value={value}
4217
+ onValueChange={(v) => setValue(v as string[])}
4218
+ >
4219
+ <Select.Option value="European Union Privacy Regulation">
4220
+ European Union Privacy Regulation
4221
+ </Select.Option>
4222
+ <Select.Option value="California Consumer Protection Act">
4223
+ California Consumer Protection Act
4224
+ </Select.Option>
4225
+ <Select.Option value="Health Insurance Portability Act">
4226
+ Health Insurance Portability Act
4227
+ </Select.Option>
4228
+ <Select.Option value="Payment Card Industry Standard">
4229
+ Payment Card Industry Standard
4230
+ </Select.Option>
4231
+ </Select>
4232
+ ```
4233
+
4234
+ ```tsx
4235
+ <Select
4236
+ label="Issue Types"
4237
+ className="w-[220px]"
4238
+ multiple
4239
+ renderValue={(selected) => (
4240
+ <span className="flex items-center gap-2">
4241
+ <span>Issue Types</span>
4242
+ {selected.length > 0 && (
4243
+ <Badge variant="secondary">{selected.length}</Badge>
4244
+ )}
4245
+ </span>
4246
+ )}
4247
+ value={value}
4248
+ onValueChange={(v) => setValue(v as string[])}
4249
+ >
4250
+ {allOptions.map((option) => (
4251
+ <Select.Option key={option.value} value={option.value}>
4252
+ {option.label}
4253
+ </Select.Option>
4254
+ ))}
4255
+ </Select>
4256
+ ```
4257
+
4090
4258
  ```tsx
4091
4259
  <Select
4092
4260
  label="Author"
@@ -4316,8 +4484,8 @@ Switch component
4316
4484
  **Props:**
4317
4485
 
4318
4486
  - `variant`: enum [default: default]
4319
- - `"default"`: Default switch appearance
4320
- - `"error"`: Error state for validation failures
4487
+ - `"default"`: Default switch with squircle shape and brand blue color
4488
+ - `"neutral"`: Monochrome switch with squircle shape for subtle toggles
4321
4489
  - `label`: ReactNode
4322
4490
  Label content for the switch (Field wrapper is built-in) - can be a string or any React node. Optional when used standalone for visual-only purposes.
4323
4491
  - `labelTooltip`: ReactNode
@@ -4345,7 +4513,7 @@ Switch component
4345
4513
 
4346
4514
  **Colors (kumo tokens used):**
4347
4515
 
4348
- `bg-kumo-brand`, `bg-kumo-brand-hover`, `bg-kumo-danger`, `bg-kumo-interact`, `bg-kumo-recessed`, `border-kumo-line`, `ring-kumo-danger`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
4516
+ `bg-kumo-base`, `border-kumo-line`, `ring-kumo-line`, `text-kumo-danger`, `text-kumo-default`, `text-kumo-subtle`
4349
4517
 
4350
4518
  **Sub-Components:**
4351
4519
 
@@ -4379,6 +4547,54 @@ Props:
4379
4547
  <Switch label="Disabled" checked={false} disabled />
4380
4548
  ```
4381
4549
 
4550
+ ```tsx
4551
+ <Switch
4552
+ label="Neutral switch"
4553
+ variant="neutral"
4554
+ checked={checked}
4555
+ onCheckedChange={setChecked}
4556
+ />
4557
+ ```
4558
+
4559
+ ```tsx
4560
+ <div className="flex flex-col gap-4">
4561
+ <Switch
4562
+ label="Neutral off"
4563
+ variant="neutral"
4564
+ checked={false}
4565
+ onCheckedChange={() => {}}
4566
+ />
4567
+ <Switch
4568
+ label="Neutral on"
4569
+ variant="neutral"
4570
+ checked={true}
4571
+ onCheckedChange={() => {}}
4572
+ />
4573
+ <Switch
4574
+ label="Neutral disabled"
4575
+ variant="neutral"
4576
+ checked={false}
4577
+ disabled
4578
+ />
4579
+ </div>
4580
+ ```
4581
+
4582
+ ```tsx
4583
+ <div className="flex flex-col gap-4">
4584
+ <Switch
4585
+ label="Default variant"
4586
+ checked={true}
4587
+ onCheckedChange={() => {}}
4588
+ />
4589
+ <Switch
4590
+ label="Neutral variant"
4591
+ variant="neutral"
4592
+ checked={true}
4593
+ onCheckedChange={() => {}}
4594
+ />
4595
+ </div>
4596
+ ```
4597
+
4382
4598
 
4383
4599
  ---
4384
4600
 
@@ -4741,7 +4957,7 @@ Tab navigation component with segmented or underline style. Built on Base UI Tab
4741
4957
 
4742
4958
  **Colors (kumo tokens used):**
4743
4959
 
4744
- `bg-kumo-brand`, `bg-kumo-overlay`, `bg-kumo-tint`, `border-kumo-line`, `ring-kumo-fill-hover`, `ring-kumo-ring`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
4960
+ `bg-kumo-base`, `bg-kumo-brand`, `bg-kumo-recessed`, `bg-kumo-surface`, `bg-kumo-tint`, `border-kumo-ring`, `ring-kumo-ring`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
4745
4961
 
4746
4962
  **Styling:**
4747
4963
 
@@ -5041,6 +5257,18 @@ Accessible popup that shows additional information on hover/focus. Wrap your app
5041
5257
  </TooltipProvider>
5042
5258
  ```
5043
5259
 
5260
+ ```tsx
5261
+ <TooltipProvider>
5262
+ <Tooltip
5263
+ content="Click to learn more"
5264
+ className="inline-flex items-center gap-1.5 rounded-full bg-kumo-brand px-3 py-1.5 text-sm font-medium text-white shadow-md transition-transform hover:scale-105 active:scale-95"
5265
+ >
5266
+ <Info className="size-4" />
5267
+ <span>Help</span>
5268
+ </Tooltip>
5269
+ </TooltipProvider>
5270
+ ```
5271
+
5044
5272
 
5045
5273
  ---
5046
5274
 
package/ai/schemas.ts CHANGED
@@ -606,11 +606,12 @@ export const RadioPropsSchema = z.object({
606
606
  legend: z.string(), // Legend text for the group (required for accessibility)
607
607
  children: z.union([z.string(), z.number(), z.boolean(), z.null(), DynamicValueSchema]).optional(), // Child Radio.Item components
608
608
  orientation: z.enum(["vertical", "horizontal"]).optional(), // Layout direction of the radio items
609
+ appearance: z.enum(["default", "card"]).optional(), // Visual appearance applied to all Radio.Item children. - `"default"` — Standard inline radio items - `"card"` — Choice card with border, padding, and highlighted selection state Individual items can override this with their own `appearance` prop.
609
610
  error: z.string().optional(), // Error message for the group
610
611
  description: z.union([z.string(), z.number(), z.boolean(), z.null(), DynamicValueSchema]).optional(), // Helper text for the group
611
612
  value: z.string().optional(), // Value of the radio that should be selected (controlled)
612
613
  disabled: z.boolean().optional(), // Whether all radios in the group are disabled
613
- controlPosition: z.enum(["start", "end"]).optional(), // Position of radio control relative to label: "start" (default) puts radio before label, "end" puts label before radio
614
+ controlPosition: z.enum(["start", "end"]).optional(), // 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.
614
615
  name: z.string().optional(), // Form submission name for the radio group
615
616
  className: z.string().optional(), // Additional CSS classes
616
617
  });
@@ -665,7 +666,7 @@ export const SurfacePropsSchema = z.object({
665
666
  });
666
667
 
667
668
  export const SwitchPropsSchema = z.object({
668
- variant: z.enum(["default", "error"]).optional(), // Visual variant: "default" or "error" for validation failures (visual only, no error text)
669
+ variant: z.enum(["default", "neutral"]).optional(), // Visual variant: "default" (pill, brand color) or "neutral" (squircle, monochrome)
669
670
  label: z.union([z.string(), z.number(), z.boolean(), z.null(), DynamicValueSchema]).optional(), // Label content for the switch (Field wrapper is built-in) - can be a string or any React node. Optional when used standalone for visual-only purposes.
670
671
  labelTooltip: z.union([z.string(), z.number(), z.boolean(), z.null(), DynamicValueSchema]).optional(), // Tooltip content to display next to the label via an info icon
671
672
  required: z.boolean().optional(), // Whether the switch is required. When explicitly false, shows "(optional)" text after the label.
@@ -1 +1 @@
1
- 1773682726614
1
+ 1773937426378