@cloudflare/kumo 1.10.0 → 1.11.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 (179) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/ai/component-registry.json +21 -32
  3. package/ai/component-registry.md +66 -60
  4. package/ai/schemas.ts +2 -2
  5. package/dist/.build-complete +1 -1
  6. package/dist/ai/schemas.js +1 -2
  7. package/dist/ai/schemas.js.map +1 -1
  8. package/dist/checkbox-ZiHzIOCx.js +220 -0
  9. package/dist/checkbox-ZiHzIOCx.js.map +1 -0
  10. package/dist/{clipboard-text-DbvIaZ3g.js → clipboard-text-DXs1GdOt.js} +3 -3
  11. package/dist/{clipboard-text-DbvIaZ3g.js.map → clipboard-text-DXs1GdOt.js.map} +1 -1
  12. package/dist/code.js +62 -62
  13. package/dist/code.js.map +1 -1
  14. package/dist/{collapsible-OBNkTO48.js → collapsible-C3LJ1dfZ.js} +13 -11
  15. package/dist/collapsible-C3LJ1dfZ.js.map +1 -0
  16. package/dist/{combobox-CJqgoue6.js → combobox--ec3iibR.js} +63 -63
  17. package/dist/combobox--ec3iibR.js.map +1 -0
  18. package/dist/{command-palette-xctZ--ZT.js → command-palette-B_J7o7P-.js} +8 -8
  19. package/dist/{command-palette-xctZ--ZT.js.map → command-palette-B_J7o7P-.js.map} +1 -1
  20. package/dist/components/checkbox.js +1 -1
  21. package/dist/components/clipboard-text.js +1 -1
  22. package/dist/components/collapsible.js +1 -1
  23. package/dist/components/combobox.js +1 -1
  24. package/dist/components/command-palette.js +1 -1
  25. package/dist/components/dialog.js +1 -1
  26. package/dist/components/dropdown.js +1 -1
  27. package/dist/components/field.js +1 -1
  28. package/dist/components/flow.js +1857 -1803
  29. package/dist/components/flow.js.map +1 -1
  30. package/dist/components/input.js +3 -3
  31. package/dist/components/label.js +1 -1
  32. package/dist/components/link.js +1 -1
  33. package/dist/components/menubar.js +1 -1
  34. package/dist/components/meter.js +1 -1
  35. package/dist/components/pagination.js +1 -1
  36. package/dist/components/popover.js +1 -1
  37. package/dist/components/radio.js +1 -1
  38. package/dist/components/select.js +1 -1
  39. package/dist/components/sensitive-input.js +1 -1
  40. package/dist/components/switch.js +1 -1
  41. package/dist/components/table.js +1 -1
  42. package/dist/components/tabs.js +1 -1
  43. package/dist/components/toast.js +2 -2
  44. package/dist/components/tooltip.js +1 -1
  45. package/dist/{dialog-1pa-ezdL.js → dialog-DGaQTZVR.js} +2 -2
  46. package/dist/{dialog-1pa-ezdL.js.map → dialog-DGaQTZVR.js.map} +1 -1
  47. package/dist/{dropdown-BXg01-8j.js → dropdown-DBfVqi0v.js} +74 -75
  48. package/dist/dropdown-DBfVqi0v.js.map +1 -0
  49. package/dist/{field-BYaOyOtJ.js → field-CQmGKOVZ.js} +7 -7
  50. package/dist/{field-BYaOyOtJ.js.map → field-CQmGKOVZ.js.map} +1 -1
  51. package/dist/index.js +28 -28
  52. package/dist/{input-area-C3ddZhEo.js → input-area-BgpN8siO.js} +3 -3
  53. package/dist/{input-area-C3ddZhEo.js.map → input-area-BgpN8siO.js.map} +1 -1
  54. package/dist/{input-BXn3ElmF.js → input-gGpJCiT7.js} +3 -3
  55. package/dist/{input-BXn3ElmF.js.map → input-gGpJCiT7.js.map} +1 -1
  56. package/dist/{input-group-BiUKE2TR.js → input-group-DwPPwJEW.js} +2 -2
  57. package/dist/{input-group-BiUKE2TR.js.map → input-group-DwPPwJEW.js.map} +1 -1
  58. package/dist/label-hoE9-Nzo.js +62 -0
  59. package/dist/label-hoE9-Nzo.js.map +1 -0
  60. package/dist/{link-CfCaX9Ks.js → link-BFszrye7.js} +20 -14
  61. package/dist/link-BFszrye7.js.map +1 -0
  62. package/dist/{menubar-be9R8bE-.js → menubar-DF-6twXU.js} +2 -2
  63. package/dist/{menubar-be9R8bE-.js.map → menubar-DF-6twXU.js.map} +1 -1
  64. package/dist/{meter-CCpXrH8B.js → meter-CP6NBKRN.js} +2 -2
  65. package/dist/{meter-CCpXrH8B.js.map → meter-CP6NBKRN.js.map} +1 -1
  66. package/dist/{pagination-CaHm6TKa.js → pagination-BWkeDEqb.js} +44 -40
  67. package/dist/pagination-BWkeDEqb.js.map +1 -0
  68. package/dist/{popover-CHafAVT6.js → popover-B5CWcu7v.js} +2 -2
  69. package/dist/{popover-CHafAVT6.js.map → popover-B5CWcu7v.js.map} +1 -1
  70. package/dist/primitives/accordion.js +1 -1
  71. package/dist/primitives/alert-dialog.js +1 -1
  72. package/dist/primitives/autocomplete.js +1 -1
  73. package/dist/primitives/avatar.js +1 -1
  74. package/dist/primitives/button.js +1 -1
  75. package/dist/primitives/checkbox-group.js +1 -1
  76. package/dist/primitives/checkbox.js +1 -1
  77. package/dist/primitives/collapsible.js +1 -1
  78. package/dist/primitives/combobox.js +1 -1
  79. package/dist/primitives/context-menu.js +1 -1
  80. package/dist/primitives/csp-provider.js +1 -1
  81. package/dist/primitives/dialog.js +1 -1
  82. package/dist/primitives/direction-provider.js +1 -1
  83. package/dist/primitives/drawer.js +1 -1
  84. package/dist/primitives/field.js +1 -1
  85. package/dist/primitives/fieldset.js +1 -1
  86. package/dist/primitives/form.js +1 -1
  87. package/dist/primitives/input.js +1 -1
  88. package/dist/primitives/menu.js +1 -1
  89. package/dist/primitives/menubar.js +1 -1
  90. package/dist/primitives/meter.js +1 -1
  91. package/dist/primitives/navigation-menu.js +1 -1
  92. package/dist/primitives/number-field.js +1 -1
  93. package/dist/primitives/popover.js +1 -1
  94. package/dist/primitives/preview-card.js +1 -1
  95. package/dist/primitives/progress.js +1 -1
  96. package/dist/primitives/radio-group.js +1 -1
  97. package/dist/primitives/radio.js +1 -1
  98. package/dist/primitives/scroll-area.js +1 -1
  99. package/dist/primitives/select.js +1 -1
  100. package/dist/primitives/separator.js +1 -1
  101. package/dist/primitives/slider.js +1 -1
  102. package/dist/primitives/switch.js +1 -1
  103. package/dist/primitives/tabs.js +1 -1
  104. package/dist/primitives/toast.js +1 -1
  105. package/dist/primitives/toggle-group.js +1 -1
  106. package/dist/primitives/toggle.js +1 -1
  107. package/dist/primitives/toolbar.js +1 -1
  108. package/dist/primitives/tooltip.js +1 -1
  109. package/dist/primitives.js +1 -1
  110. package/dist/{radio-DZ1uS-zK.js → radio-BQTXNBkS.js} +6 -6
  111. package/dist/radio-BQTXNBkS.js.map +1 -0
  112. package/dist/scripts/theme-generator/config.js +1 -1
  113. package/dist/scripts/theme-generator/config.js.map +1 -1
  114. package/dist/scripts/theme-generator/generate-css.d.ts.map +1 -1
  115. package/dist/select-BWUNPPHQ.js +123 -0
  116. package/dist/select-BWUNPPHQ.js.map +1 -0
  117. package/dist/{sensitive-input-CI-gtdfw.js → sensitive-input-A6Kw7URa.js} +4 -4
  118. package/dist/{sensitive-input-CI-gtdfw.js.map → sensitive-input-A6Kw7URa.js.map} +1 -1
  119. package/dist/src/code/code-highlighted.d.ts.map +1 -1
  120. package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
  121. package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
  122. package/dist/src/components/flow/connectors.d.ts +4 -0
  123. package/dist/src/components/flow/connectors.d.ts.map +1 -1
  124. package/dist/src/components/flow/diagram.d.ts +27 -2
  125. package/dist/src/components/flow/diagram.d.ts.map +1 -1
  126. package/dist/src/components/flow/node.d.ts +6 -1
  127. package/dist/src/components/flow/node.d.ts.map +1 -1
  128. package/dist/src/components/flow/parallel.d.ts.map +1 -1
  129. package/dist/src/components/flow/use-children.d.ts +12 -1
  130. package/dist/src/components/flow/use-children.d.ts.map +1 -1
  131. package/dist/src/components/label/label.d.ts.map +1 -1
  132. package/dist/src/components/link/link.d.ts +2 -2
  133. package/dist/src/components/link/link.d.ts.map +1 -1
  134. package/dist/src/components/pagination/pagination.d.ts.map +1 -1
  135. package/dist/src/components/radio/radio.d.ts.map +1 -1
  136. package/dist/src/components/select/select.d.ts +29 -6
  137. package/dist/src/components/select/select.d.ts.map +1 -1
  138. package/dist/src/components/switch/switch.d.ts.map +1 -1
  139. package/dist/src/components/tabs/tabs.d.ts +6 -2
  140. package/dist/src/components/tabs/tabs.d.ts.map +1 -1
  141. package/dist/src/components/toast/toast.d.ts +1 -0
  142. package/dist/src/components/toast/toast.d.ts.map +1 -1
  143. package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
  144. package/dist/styles/kumo-binding.css +19 -0
  145. package/dist/styles/kumo-standalone.css +1 -1
  146. package/dist/styles/theme-fedramp.css +13 -0
  147. package/dist/styles/theme-kumo.css +77 -1
  148. package/dist/{switch-BxnAwAse.js → switch-CmUFBiJv.js} +4 -4
  149. package/dist/switch-CmUFBiJv.js.map +1 -0
  150. package/dist/{table-CdcsAm5X.js → table-CbU4Oe3o.js} +2 -2
  151. package/dist/{table-CdcsAm5X.js.map → table-CbU4Oe3o.js.map} +1 -1
  152. package/dist/{tabs-Cf12PXHz.js → tabs-uLzHh6SR.js} +14 -13
  153. package/dist/tabs-uLzHh6SR.js.map +1 -0
  154. package/dist/{toast-BzvG5cpW.js → toast-B-d56fkl.js} +124 -92
  155. package/dist/toast-B-d56fkl.js.map +1 -0
  156. package/dist/{tooltip-2KqOpTj0.js → tooltip-C7p2iJ0y.js} +24 -18
  157. package/dist/tooltip-C7p2iJ0y.js.map +1 -0
  158. package/dist/{vendor-base-ui-DvXlzG7n.js → vendor-base-ui-DN1j_aJS.js} +50 -49
  159. package/dist/{vendor-base-ui-DvXlzG7n.js.map → vendor-base-ui-DN1j_aJS.js.map} +1 -1
  160. package/package.json +3 -1
  161. package/scripts/theme-generator/config.ts +1 -1
  162. package/scripts/theme-generator/generate-css.test.ts +30 -0
  163. package/scripts/theme-generator/generate-css.ts +104 -6
  164. package/dist/checkbox-z5gO1lL8.js +0 -224
  165. package/dist/checkbox-z5gO1lL8.js.map +0 -1
  166. package/dist/collapsible-OBNkTO48.js.map +0 -1
  167. package/dist/combobox-CJqgoue6.js.map +0 -1
  168. package/dist/dropdown-BXg01-8j.js.map +0 -1
  169. package/dist/label-ByOtGj7z.js +0 -58
  170. package/dist/label-ByOtGj7z.js.map +0 -1
  171. package/dist/link-CfCaX9Ks.js.map +0 -1
  172. package/dist/pagination-CaHm6TKa.js.map +0 -1
  173. package/dist/radio-DZ1uS-zK.js.map +0 -1
  174. package/dist/select-BXZAlFAV.js +0 -113
  175. package/dist/select-BXZAlFAV.js.map +0 -1
  176. package/dist/switch-BxnAwAse.js.map +0 -1
  177. package/dist/tabs-Cf12PXHz.js.map +0 -1
  178. package/dist/toast-BzvG5cpW.js.map +0 -1
  179. package/dist/tooltip-2KqOpTj0.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,102 @@
1
1
  # @cloudflare/kumo
2
2
 
3
+ ## 1.11.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 140f4ab: **Select: Improved label API to match Input component pattern**
8
+ - `hideLabel` is now deprecated. When `label` is provided, the label is **visible by default** (previously hidden by default).
9
+ - For visible labels: `<Select label="Country" />` (no changes needed if you were using `hideLabel={false}`)
10
+ - For hidden labels: Use `<Select aria-label="Select a country" />` instead of `<Select label="Country" hideLabel={true} />`
11
+ - **Bug fix**: Placeholder text now displays correctly when using object map `items` format (e.g., `items={{ a: "Option A" }}`). Previously, placeholders only worked with array format items.
12
+
13
+ **Backward compatibility**: `hideLabel={true}` still works but shows a deprecation warning in development. Existing code using `hideLabel={false}` requires no changes.
14
+
15
+ **Migration guide:**
16
+
17
+ ```tsx
18
+ // Before (label hidden by default)
19
+ <Select label="Country" /> // label was sr-only
20
+ <Select label="Country" hideLabel={false} /> // label was visible
21
+
22
+ // After (label visible by default, matching Input)
23
+ <Select label="Country" /> // label is now visible
24
+ <Select aria-label="Country" /> // use aria-label for hidden labels
25
+ ```
26
+
27
+ - f1c6392: Add optional `id` prop to `Flow.Node` for stable node identification and connector test IDs
28
+ - da03394: Avoid adding multiple toasts with the same ID. Use a subtle bump animation when a toast with an existing ID is added.
29
+
30
+ ### Patch Changes
31
+
32
+ - a53ec1b: Fix theme token flicker by generating stable light/dark fallback variables with safer scope and layer precedence.
33
+ - cb121bc: fix: add defensive styles to prevent global CSS pollution
34
+
35
+ ## Problem
36
+
37
+ When Kumo components are used in applications with aggressive global styles (e.g., Stratus's `cfBaseStyles` layer), certain elements get polluted:
38
+ - `label { margin-bottom: 1rem }` adds unwanted margins to all labels
39
+ - `button { background: gray }` affects unstyled button wrappers (e.g., tooltip triggers)
40
+ - `a { color: var(--text-color-primary) }` can override link colors if the consuming app defines `--text-color-primary` differently
41
+
42
+ ## Solution
43
+
44
+ Add defensive Tailwind utility classes directly to components. These:
45
+ 1. Reset commonly-polluted properties to safe defaults
46
+ 2. Use `cn()` (tailwind-merge) so consumer styles via `className` still override them
47
+ 3. Are no-ops in clean CSS environments (no visual change in Kumo docs)
48
+
49
+ ## Changes
50
+
51
+ ### Label margins (`m-0`)
52
+ - **Label**: `labelVariants()` now includes `m-0`
53
+ - **Field**: `FieldBase.Label` gets `m-0`
54
+ - **Checkbox**: label wrapper gets `m-0`
55
+ - **Radio**: label wrapper gets `m-0`
56
+ - **Switch**: label wrapper gets `m-0`
57
+
58
+ ### Button trigger resets
59
+ - **Tooltip trigger** (when `!asChild`): `bg-transparent border-none shadow-none p-0 m-0 h-auto min-h-0 leading-[0] inline-flex items-center`
60
+ - **Collapsible trigger**: `bg-transparent border-none shadow-none p-0 m-0`
61
+
62
+ ### Link color namespace fix
63
+ - **Link**: Changed from `text-primary` to `text-kumo-link` to avoid collision with consuming apps that define `--text-color-primary` differently
64
+
65
+ ### Label tooltip composition
66
+ - **Label**: Tooltip trigger now uses `<Button variant="ghost" size="xs" shape="square">` with `asChild`, leveraging composition instead of relying on defensive resets
67
+
68
+ ## Docs
69
+
70
+ Added "Custom Trigger" section to Tooltip docs demonstrating that `className` can fully override defensive styles when not using `asChild`.
71
+
72
+ - c6a3fb3: fix(dropdown): use Base UI CheckboxItemIndicator for proper accessibility
73
+
74
+ Replace custom Checkbox component with Base UI's CheckboxItemIndicator in DropdownMenuCheckboxItem. The previous implementation nested an interactive Checkbox inside the menuitemcheckbox role, causing duplicate accessibility labels. CheckboxItemIndicator is automatically aria-hidden and only renders when checked, following the standard Base UI pattern.
75
+
76
+ - 1bfffaa: Fix Field error message line height by adding `leading-snug` for consistent text spacing
77
+ - 5d16fdb: Improve info banner dark mode contrast for WCAG AA compliance. Changes `kumo-info` from `blue-700` (L=48.8%) to `blue-400` (L=70.7%), achieving 7.97:1 contrast ratio against the banner background.
78
+ - 8b964f5: Fix Combobox.TriggerValue icon misalignment caused by inherited line-height
79
+
80
+ The caret icon span was inheriting `line-height` from the parent button's `text-base` class, causing the span's height to exceed the icon's height (e.g., 21.5px vs 16px). The icon sits at the top of the span by default, so when the span is centered via `top-1/2 -translate-y-1/2`, the icon appears offset.
81
+
82
+ Added `flex items-center` to the icon wrapper to ensure proper vertical centering regardless of inherited styles. This matches the pattern used in TriggerInput.
83
+
84
+ - 529274d: fix(Pagination): use aria-label instead of label for PageSize select
85
+
86
+ The Select component now shows visible labels by default. Since Pagination.PageSize
87
+ already displays "Per page:" text next to the select, the internal Select should use
88
+ `aria-label` for accessibility without showing a duplicate visible label.
89
+
90
+ - 2f0e572: chore(toast): replace inline XIcon with Phosphor icon
91
+ - ee1099d: Prevent password managers autofilling Pagination input field
92
+ - 6dc952f: fix(tabs): improve focus ring and hover styling
93
+ - Fixed focus ring to use proper `ring-kumo-ring` token instead of browser default blue
94
+ - Segmented variant: inset focus ring to avoid overlap with adjacent tabs, hidden on active tab
95
+ - Underline variant: added padding for better focus ring spacing around text
96
+ - Added subtle hover states for both variants
97
+
98
+ - 2352344: fix(Tabs): pass TabItem render prop through to Base UI for custom tab rendering (e.g., link-based tabs)
99
+
3
100
  ## 1.10.0
4
101
 
5
102
  ### Minor Changes
@@ -1939,13 +1939,7 @@
1939
1939
  "description": "Additional CSS classes merged via `cn()`."
1940
1940
  }
1941
1941
  },
1942
- "examples": [
1943
- "<CodeBlock\n lang=\"tsx\"\n code={`const greeting = \"Hello, World!\";\nconsole.log(greeting);`}\n />",
1944
- "<CodeBlock\n lang=\"tsx\"\n code={`interface User {\n id: string;\n name: string;\n email: string;\n}\n\nconst user: User = {\n id: \"1\",\n name: \"John Doe\",\n email: \"john@example.com\"\n};`}\n />",
1945
- "<CodeBlock\n lang=\"bash\"\n code={`npm install @cloudflare/kumo\npnpm add @cloudflare/kumo`}\n />",
1946
- "<CodeBlock\n lang=\"jsonc\"\n code={`{\n \"name\": \"kumo\",\n \"version\": \"1.0.0\",\n \"dependencies\": {\n \"react\": \"^19.0.0\"\n }\n}`}\n />",
1947
- "<Code\n lang=\"bash\"\n code=\"export API_KEY={{apiKey}}\"\n values={{\n apiKey: { value: \"sk_live_123\", highlight: true },\n }}\n />"
1948
- ],
1942
+ "examples": [],
1949
1943
  "colors": [
1950
1944
  "bg-kumo-base",
1951
1945
  "border-kumo-fill",
@@ -3134,7 +3128,7 @@
3134
3128
  "<Input label=\"Phone Number\" required={false} placeholder=\"+1 555-0000\" />",
3135
3129
  "<Input\n label=\"API Key\"\n labelTooltip=\"Find this in your dashboard settings under API > Keys\"\n placeholder=\"sk_live_...\"\n />",
3136
3130
  "<Checkbox\n label={\n <span>\n I agree to the <strong>Terms of Service</strong>\n </span>\n }\n />",
3137
- "<div className=\"flex max-w-md flex-col gap-4\">\n <Input label=\"Full Name\" placeholder=\"John Doe\" />\n <Input\n label=\"Email\"\n labelTooltip=\"We'll send your receipt here\"\n placeholder=\"john@example.com\"\n type=\"email\"\n />\n <Input label=\"Company\" required={false} placeholder=\"Acme Inc.\" />\n <Select label=\"Country\" hideLabel={false} placeholder=\"Select a country\">\n <Select.Option value=\"us\">United States</Select.Option>\n <Select.Option value=\"uk\">United Kingdom</Select.Option>\n <Select.Option value=\"ca\">Canada</Select.Option>\n </Select>\n </div>",
3131
+ "<div className=\"flex max-w-md flex-col gap-4\">\n <Input label=\"Full Name\" placeholder=\"John Doe\" />\n <Input\n label=\"Email\"\n labelTooltip=\"We'll send your receipt here\"\n placeholder=\"john@example.com\"\n type=\"email\"\n />\n <Input label=\"Company\" required={false} placeholder=\"Acme Inc.\" />\n <Select label=\"Country\" placeholder=\"Select a country\">\n <Select.Option value=\"us\">United States</Select.Option>\n <Select.Option value=\"uk\">United Kingdom</Select.Option>\n <Select.Option value=\"ca\">Canada</Select.Option>\n </Select>\n </div>",
3138
3132
  "<div className=\"flex flex-col gap-3\">\n <Label>Default</Label>\n <Label showOptional>Optional</Label>\n <Label tooltip=\"Important field\">With Tooltip</Label>\n </div>"
3139
3133
  ],
3140
3134
  "colors": [
@@ -3228,14 +3222,7 @@
3228
3222
  "plain": "Link without underline decoration"
3229
3223
  },
3230
3224
  "classes": {
3231
- "inline": "text-primary underline underline-offset-[0.15em] decoration-[0.0625em] link-current transition-colors",
3232
- "current": "text-current underline underline-offset-[0.15em] decoration-[0.0625em] link-current transition-colors",
3233
- "plain": "text-primary hover:text-primary/70 transition-colors"
3234
- },
3235
- "stateClasses": {
3236
- "plain": {
3237
- "hover": "hover:text-primary/70"
3238
- }
3225
+ "current": "text-current underline underline-offset-[0.15em] decoration-[0.0625em] link-current transition-colors"
3239
3226
  },
3240
3227
  "default": "inline"
3241
3228
  },
@@ -3319,7 +3306,9 @@
3319
3306
  "<p className=\"text-base text-kumo-danger\">\n This error message contains a{\" \"}\n <Link href=\"#\" variant=\"current\">\n link\n </Link>{\" \"}\n that inherits the red color from its parent.\n </p>",
3320
3307
  "<div className=\"flex flex-col gap-x-6 gap-y-4 text-base md:flex-row\">\n <Link render={<CustomRouterLink href=\"/dashboard\" />} variant=\"inline\">\n Dashboard (via render)\n </Link>\n <Link\n render={\n <CustomRouterLink\n href=\"https://developers.cloudflare.com\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n />\n }\n variant=\"inline\"\n >\n Cloudflare Docs <Link.ExternalIcon />\n </Link>\n </div>"
3321
3308
  ],
3322
- "colors": [],
3309
+ "colors": [
3310
+ "text-kumo-link"
3311
+ ],
3323
3312
  "subComponents": {
3324
3313
  "ExternalIcon": {
3325
3314
  "name": "ExternalIcon",
@@ -3800,12 +3789,11 @@
3800
3789
  "label": {
3801
3790
  "type": "ReactNode",
3802
3791
  "optional": true,
3803
- "description": "Label content for the select (enables Field wrapper) can be a string or any React node."
3792
+ "description": "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."
3804
3793
  },
3805
3794
  "hideLabel": {
3806
3795
  "type": "boolean",
3807
- "optional": true,
3808
- "description": "Visually hide the label while keeping it accessible to screen readers. Set to `false` to show a visible label above the select via the Field wrapper."
3796
+ "optional": true
3809
3797
  },
3810
3798
  "placeholder": {
3811
3799
  "type": "string",
@@ -3862,15 +3850,16 @@
3862
3850
  }
3863
3851
  },
3864
3852
  "examples": [
3865
- "<div className=\"flex gap-2\">\n <Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v ?? \"apple\")}\n items={{ apple: \"Apple\", banana: \"Banana\", cherry: \"Cherry\" }}\n />\n\n <Select\n value={value}\n className=\"w-[200px]\"\n onValueChange={(v) => setValue(v ?? \"apple\")}\n items={{ apple: \"Apple\", banana: \"Banana\", cherry: \"Cherry\" }}\n >\n <Select.Option value=\"apple\">Apple</Select.Option>\n <Select.Option value=\"banana\">Banana</Select.Option>\n <Select.Option value=\"cherry\">Cherry</Select.Option>\n </Select>\n </div>",
3866
- "<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string)}\n items={{\n bug: \"Bug\",\n documentation: \"Documentation\",\n feature: \"Feature\",\n }}\n />",
3867
- "<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={[\n { value: null, label: \"Please select\" },\n { value: \"bug\", label: \"Bug\" },\n { value: \"documentation\", label: \"Documentation\" },\n { value: \"feature\", label: \"Feature\" },\n ]}\n />",
3868
- "<Select\n className=\"w-[200px]\"\n value={value}\n placeholder=\"Please select\"\n onValueChange={(v) => setValue(v as string | null)}\n items={[\n { value: \"bug\", label: \"Bug\" },\n { value: \"documentation\", label: \"Documentation\" },\n { value: \"feature\", label: \"Feature\" },\n ]}\n />",
3869
- "<Select\n className=\"w-[200px]\"\n renderValue={(v) => (\n <span>\n {v.emoji} {v.label}\n </span>\n )}\n value={value}\n onValueChange={(v) => setValue(v as (typeof languages)[0])}\n >\n {languages.map((language) => (\n <Select.Option key={language.value} value={language}>\n {language.emoji} {language.label}\n </Select.Option>\n ))}\n </Select>",
3870
- "<Select className=\"w-[200px]\" loading />",
3871
- "<Select\n className=\"w-[200px]\"\n loading={loading}\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n placeholder=\"Please select\"\n items={items}\n />",
3872
- "<Select\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(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>",
3873
- "<Select\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 ?? \"Please select 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>"
3853
+ "<Select\n label=\"Favorite Fruit\"\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v ?? \"apple\")}\n items={{ apple: \"Apple\", banana: \"Banana\", cherry: \"Cherry\" }}\n />",
3854
+ "<Select\n aria-label=\"Select a fruit\"\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v ?? \"apple\")}\n items={{ apple: \"Apple\", banana: \"Banana\", cherry: \"Cherry\" }}\n />",
3855
+ "<Select\n label=\"Issue Type\"\n description=\"Choose the category that best describes your issue\"\n error={!value ? \"Please select an issue type\" : undefined}\n className=\"w-[280px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={{\n bug: \"Bug\",\n documentation: \"Documentation\",\n feature: \"Feature\",\n }}\n />",
3856
+ "<Select\n label=\"Category\"\n placeholder=\"Choose a category...\"\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={{\n bug: \"Bug\",\n documentation: \"Documentation\",\n feature: \"Feature\",\n }}\n />",
3857
+ "<Select\n label=\"Priority\"\n labelTooltip=\"Higher priority issues are addressed first\"\n placeholder=\"Select priority\"\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v as string | null)}\n items={{\n low: \"Low\",\n medium: \"Medium\",\n high: \"High\",\n critical: \"Critical\",\n }}\n />",
3858
+ "<Select\n label=\"Language\"\n className=\"w-[200px]\"\n renderValue={(v) => (\n <span>\n {v.emoji} {v.label}\n </span>\n )}\n value={value}\n onValueChange={(v) => setValue(v as (typeof languages)[0])}\n >\n {languages.map((language) => (\n <Select.Option key={language.value} value={language}>\n {language.emoji} {language.label}\n </Select.Option>\n ))}\n </Select>",
3859
+ "<Select aria-label=\"Loading select\" className=\"w-[200px]\" loading />",
3860
+ "<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 />",
3861
+ "<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>",
3862
+ "<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>"
3874
3863
  ],
3875
3864
  "colors": [
3876
3865
  "bg-kumo-control",
@@ -4441,14 +4430,13 @@
4441
4430
  "<Tabs\n variant=\"underline\"\n tabs={[\n { value: \"tab1\", label: \"Tab 1\" },\n { value: \"tab2\", label: \"Tab 2\" },\n { value: \"tab3\", label: \"Tab 3\" },\n ]}\n selectedValue=\"tab1\"\n />",
4442
4431
  "<div className=\"space-y-4\">\n <Tabs\n tabs={[\n { value: \"tab1\", label: \"Tab 1\" },\n { value: \"tab2\", label: \"Tab 2\" },\n { value: \"tab3\", label: \"Tab 3\" },\n ]}\n value={activeTab}\n onValueChange={setActiveTab}\n />\n <p className=\"text-sm text-kumo-subtle\">\n Active tab: <code className=\"text-sm\">{activeTab}</code>\n </p>\n </div>",
4443
4432
  "<Tabs\n tabs={[\n { value: \"overview\", label: \"Overview\" },\n { value: \"analytics\", label: \"Analytics\" },\n { value: \"reports\", label: \"Reports\" },\n { value: \"notifications\", label: \"Notifications\" },\n { value: \"settings\", label: \"Settings\" },\n { value: \"billing\", label: \"Billing\" },\n ]}\n selectedValue=\"overview\"\n />",
4444
- "<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: \"Another Link\",\n render: (props) => <a {...props} href=\"#tab3\" />,\n },\n ]}\n selectedValue=\"tab1\"\n />"
4433
+ "<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 />"
4445
4434
  ],
4446
4435
  "colors": [
4447
4436
  "bg-kumo-brand",
4448
4437
  "bg-kumo-overlay",
4449
4438
  "bg-kumo-tint",
4450
4439
  "border-kumo-line",
4451
- "border-kumo-tint",
4452
4440
  "ring-kumo-fill-hover",
4453
4441
  "ring-kumo-ring",
4454
4442
  "text-kumo-default",
@@ -4715,7 +4703,8 @@
4715
4703
  "examples": [
4716
4704
  "<TooltipProvider>\n <Tooltip content=\"Add new item\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add new item\" />\n </Tooltip>\n </TooltipProvider>",
4717
4705
  "<TooltipProvider>\n <Tooltip content=\"Add\" asChild>\n <Button shape=\"square\" icon={PlusIcon} aria-label=\"Add\" />\n </Tooltip>\n </TooltipProvider>",
4718
- "<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>"
4706
+ "<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>",
4707
+ "<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>"
4719
4708
  ],
4720
4709
  "colors": [
4721
4710
  "bg-kumo-base",
@@ -1077,27 +1077,6 @@ Props:
1077
1077
  - `lang`: CodeLang
1078
1078
 
1079
1079
 
1080
- **Examples:**
1081
-
1082
- ```tsx
1083
- <CodeBlock
1084
- lang="tsx"
1085
- code={`const greeting = "Hello, World!";
1086
- console.log(greeting);`}
1087
- />
1088
- ```
1089
-
1090
- ```tsx
1091
- <Code
1092
- lang="bash"
1093
- code="export API_KEY={{apiKey}}"
1094
- values={{
1095
- apiKey: { value: "sk_live_123", highlight: true },
1096
- }}
1097
- />
1098
- ```
1099
-
1100
-
1101
1080
  ---
1102
1081
 
1103
1082
  ### Collapsible
@@ -3071,7 +3050,7 @@ Label component for form fields. Provides a standardized way to display labels
3071
3050
  type="email"
3072
3051
  />
3073
3052
  <Input label="Company" required={false} placeholder="Acme Inc." />
3074
- <Select label="Country" hideLabel={false} placeholder="Select a country">
3053
+ <Select label="Country" placeholder="Select a country">
3075
3054
  <Select.Option value="us">United States</Select.Option>
3076
3055
  <Select.Option value="uk">United Kingdom</Select.Option>
3077
3056
  <Select.Option value="ca">Canada</Select.Option>
@@ -3185,10 +3164,6 @@ Link component
3185
3164
  - `"inline"`: Inline text link that flows with content
3186
3165
  - `"current"`: Link that inherits color from parent text
3187
3166
  - `"plain"`: Link without underline decoration
3188
-
3189
- **State Classes:**
3190
- - `"plain"`:
3191
- - `hover`: `hover:text-primary/70`
3192
3167
  - `to`: string
3193
3168
  - `children`: ReactNode
3194
3169
  - `className`: string
@@ -3208,6 +3183,10 @@ Link component
3208
3183
 
3209
3184
  Accepts a `ReactElement` or a function that returns the element to render.
3210
3185
 
3186
+ **Colors (kumo tokens used):**
3187
+
3188
+ `text-kumo-link`
3189
+
3211
3190
  **Sub-Components:**
3212
3191
 
3213
3192
  This is a compound component. Use these sub-components:
@@ -3923,9 +3902,8 @@ Select component
3923
3902
  - `className`: string
3924
3903
  Additional CSS classes merged via `cn()`.
3925
3904
  - `label`: ReactNode
3926
- Label content for the select (enables Field wrapper) can be a string or any React node.
3905
+ 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.
3927
3906
  - `hideLabel`: boolean
3928
- Visually hide the label while keeping it accessible to screen readers. Set to `false` to show a visible label above the select via the Field wrapper.
3929
3907
  - `placeholder`: string
3930
3908
  Placeholder text shown when no value is selected.
3931
3909
  - `loading`: boolean
@@ -3968,32 +3946,38 @@ Option sub-component
3968
3946
  **Examples:**
3969
3947
 
3970
3948
  ```tsx
3971
- <div className="flex gap-2">
3972
- <Select
3973
- className="w-[200px]"
3974
- value={value}
3975
- onValueChange={(v) => setValue(v ?? "apple")}
3976
- items={{ apple: "Apple", banana: "Banana", cherry: "Cherry" }}
3977
- />
3949
+ <Select
3950
+ label="Favorite Fruit"
3951
+ className="w-[200px]"
3952
+ value={value}
3953
+ onValueChange={(v) => setValue(v ?? "apple")}
3954
+ items={{ apple: "Apple", banana: "Banana", cherry: "Cherry" }}
3955
+ />
3956
+ ```
3978
3957
 
3979
- <Select
3980
- value={value}
3981
- className="w-[200px]"
3982
- onValueChange={(v) => setValue(v ?? "apple")}
3983
- items={{ apple: "Apple", banana: "Banana", cherry: "Cherry" }}
3984
- >
3985
- <Select.Option value="apple">Apple</Select.Option>
3986
- <Select.Option value="banana">Banana</Select.Option>
3987
- <Select.Option value="cherry">Cherry</Select.Option>
3988
- </Select>
3989
- </div>
3958
+ ```tsx
3959
+ <Select
3960
+ label="Issue Type"
3961
+ description="Choose the category that best describes your issue"
3962
+ error={!value ? "Please select an issue type" : undefined}
3963
+ className="w-[280px]"
3964
+ value={value}
3965
+ onValueChange={(v) => setValue(v as string | null)}
3966
+ items={{
3967
+ bug: "Bug",
3968
+ documentation: "Documentation",
3969
+ feature: "Feature",
3970
+ }}
3971
+ />
3990
3972
  ```
3991
3973
 
3992
3974
  ```tsx
3993
3975
  <Select
3976
+ label="Category"
3977
+ placeholder="Choose a category..."
3994
3978
  className="w-[200px]"
3995
3979
  value={value}
3996
- onValueChange={(v) => setValue(v as string)}
3980
+ onValueChange={(v) => setValue(v as string | null)}
3997
3981
  items={{
3998
3982
  bug: "Bug",
3999
3983
  documentation: "Documentation",
@@ -4004,20 +3988,24 @@ Option sub-component
4004
3988
 
4005
3989
  ```tsx
4006
3990
  <Select
3991
+ label="Priority"
3992
+ labelTooltip="Higher priority issues are addressed first"
3993
+ placeholder="Select priority"
4007
3994
  className="w-[200px]"
4008
3995
  value={value}
4009
- placeholder="Please select"
4010
3996
  onValueChange={(v) => setValue(v as string | null)}
4011
- items={[
4012
- { value: "bug", label: "Bug" },
4013
- { value: "documentation", label: "Documentation" },
4014
- { value: "feature", label: "Feature" },
4015
- ]}
3997
+ items={{
3998
+ low: "Low",
3999
+ medium: "Medium",
4000
+ high: "High",
4001
+ critical: "Critical",
4002
+ }}
4016
4003
  />
4017
4004
  ```
4018
4005
 
4019
4006
  ```tsx
4020
4007
  <Select
4008
+ label="Language"
4021
4009
  className="w-[200px]"
4022
4010
  renderValue={(v) => (
4023
4011
  <span>
@@ -4036,29 +4024,31 @@ Option sub-component
4036
4024
  ```
4037
4025
 
4038
4026
  ```tsx
4039
- <Select className="w-[200px]" loading />
4027
+ <Select aria-label="Loading select" className="w-[200px]" loading />
4040
4028
  ```
4041
4029
 
4042
4030
  ```tsx
4043
4031
  <Select
4032
+ label="Assignee"
4044
4033
  className="w-[200px]"
4045
4034
  loading={loading}
4046
4035
  value={value}
4047
4036
  onValueChange={(v) => setValue(v as string | null)}
4048
- placeholder="Please select"
4037
+ placeholder="Select assignee"
4049
4038
  items={items}
4050
4039
  />
4051
4040
  ```
4052
4041
 
4053
4042
  ```tsx
4054
4043
  <Select
4044
+ label="Visible Columns"
4055
4045
  className="w-[250px]"
4056
4046
  multiple
4057
4047
  renderValue={(value) => {
4058
4048
  if (value.length > 3) {
4059
4049
  return (
4060
4050
  <span className="line-clamp-1">
4061
- {value.slice(2).join(", ") + ` and ${value.length - 2} more`}
4051
+ {value.slice(0, 2).join(", ") + ` and ${value.length - 2} more`}
4062
4052
  </span>
4063
4053
  );
4064
4054
  }
@@ -4078,12 +4068,14 @@ Option sub-component
4078
4068
 
4079
4069
  ```tsx
4080
4070
  <Select
4071
+ label="Author"
4072
+ description="Select the primary author for this document"
4081
4073
  className="w-[200px]"
4082
4074
  onValueChange={(v) => setValue(v as (typeof authors)[0] | null)}
4083
4075
  value={value}
4084
4076
  isItemEqualToValue={(item, value) => item?.id === value?.id}
4085
4077
  renderValue={(author) => {
4086
- return author?.name ?? "Please select author";
4078
+ return author?.name ?? "Select an author";
4087
4079
  }}
4088
4080
  >
4089
4081
  {authors.map((author) => (
@@ -4728,7 +4720,7 @@ Tab navigation component with segmented or underline style. Built on Base UI Tab
4728
4720
 
4729
4721
  **Colors (kumo tokens used):**
4730
4722
 
4731
- `bg-kumo-brand`, `bg-kumo-overlay`, `bg-kumo-tint`, `border-kumo-line`, `border-kumo-tint`, `ring-kumo-fill-hover`, `ring-kumo-ring`, `text-kumo-default`, `text-kumo-strong`, `text-kumo-subtle`
4723
+ `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`
4732
4724
 
4733
4725
  **Styling:**
4734
4726
 
@@ -4821,8 +4813,10 @@ Tab navigation component with segmented or underline style. Built on Base UI Tab
4821
4813
  },
4822
4814
  {
4823
4815
  value: "tab3",
4824
- label: "Another Link",
4825
- render: (props) => <a {...props} href="#tab3" />,
4816
+ label: "Cloudflare",
4817
+ render: (props) => (
4818
+ <a {...props} href="https://cloudflare.com" target="_blank" />
4819
+ ),
4826
4820
  },
4827
4821
  ]}
4828
4822
  selectedValue="tab1"
@@ -5026,6 +5020,18 @@ Accessible popup that shows additional information on hover/focus. Wrap your app
5026
5020
  </TooltipProvider>
5027
5021
  ```
5028
5022
 
5023
+ ```tsx
5024
+ <TooltipProvider>
5025
+ <Tooltip
5026
+ content="Click to learn more"
5027
+ 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"
5028
+ >
5029
+ <Info className="size-4" />
5030
+ <span>Help</span>
5031
+ </Tooltip>
5032
+ </TooltipProvider>
5033
+ ```
5034
+
5029
5035
 
5030
5036
  ---
5031
5037
 
package/ai/schemas.ts CHANGED
@@ -617,8 +617,8 @@ export const RadioPropsSchema = z.object({
617
617
 
618
618
  export const SelectPropsSchema = z.object({
619
619
  className: z.string().optional(), // Additional CSS classes merged via `cn()`.
620
- label: z.union([z.string(), z.number(), z.boolean(), z.null(), DynamicValueSchema]).optional(), // Label content for the select (enables Field wrapper) can be a string or any React node.
621
- hideLabel: z.boolean().optional(), // Visually hide the label while keeping it accessible to screen readers. Set to `false` to show a visible label above the select via the Field wrapper.
620
+ label: z.union([z.string(), z.number(), z.boolean(), z.null(), DynamicValueSchema]).optional(), // 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.
621
+ hideLabel: z.boolean().optional(),
622
622
  placeholder: z.string().optional(), // Placeholder text shown when no value is selected.
623
623
  loading: z.boolean().optional(), // When `true`, shows a skeleton loader in place of the selected value.
624
624
  disabled: z.boolean().optional(), // Whether the select is disabled.
@@ -1 +1 @@
1
- 1772718260106
1
+ 1773409393878
@@ -3587,9 +3587,8 @@ const g = z([
3587
3587
  className: c().optional(),
3588
3588
  // Additional CSS classes merged via `cn()`.
3589
3589
  label: z([c(), _(), h(), w(), g]).optional(),
3590
- // Label content for the select (enables Field wrapper) can be a string or any React node.
3590
+ // 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.
3591
3591
  hideLabel: h().optional(),
3592
- // Visually hide the label while keeping it accessible to screen readers. Set to `false` to show a visible label above the select via the Field wrapper.
3593
3592
  placeholder: c().optional(),
3594
3593
  // Placeholder text shown when no value is selected.
3595
3594
  loading: h().optional(),