@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.
- package/CHANGELOG.md +97 -0
- package/ai/component-registry.json +21 -32
- package/ai/component-registry.md +66 -60
- package/ai/schemas.ts +2 -2
- package/dist/.build-complete +1 -1
- package/dist/ai/schemas.js +1 -2
- package/dist/ai/schemas.js.map +1 -1
- package/dist/checkbox-ZiHzIOCx.js +220 -0
- package/dist/checkbox-ZiHzIOCx.js.map +1 -0
- package/dist/{clipboard-text-DbvIaZ3g.js → clipboard-text-DXs1GdOt.js} +3 -3
- package/dist/{clipboard-text-DbvIaZ3g.js.map → clipboard-text-DXs1GdOt.js.map} +1 -1
- package/dist/code.js +62 -62
- package/dist/code.js.map +1 -1
- package/dist/{collapsible-OBNkTO48.js → collapsible-C3LJ1dfZ.js} +13 -11
- package/dist/collapsible-C3LJ1dfZ.js.map +1 -0
- package/dist/{combobox-CJqgoue6.js → combobox--ec3iibR.js} +63 -63
- package/dist/combobox--ec3iibR.js.map +1 -0
- package/dist/{command-palette-xctZ--ZT.js → command-palette-B_J7o7P-.js} +8 -8
- package/dist/{command-palette-xctZ--ZT.js.map → command-palette-B_J7o7P-.js.map} +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/clipboard-text.js +1 -1
- package/dist/components/collapsible.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/command-palette.js +1 -1
- package/dist/components/dialog.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/flow.js +1857 -1803
- package/dist/components/flow.js.map +1 -1
- package/dist/components/input.js +3 -3
- package/dist/components/label.js +1 -1
- package/dist/components/link.js +1 -1
- package/dist/components/menubar.js +1 -1
- package/dist/components/meter.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/popover.js +1 -1
- package/dist/components/radio.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/sensitive-input.js +1 -1
- package/dist/components/switch.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/toast.js +2 -2
- package/dist/components/tooltip.js +1 -1
- package/dist/{dialog-1pa-ezdL.js → dialog-DGaQTZVR.js} +2 -2
- package/dist/{dialog-1pa-ezdL.js.map → dialog-DGaQTZVR.js.map} +1 -1
- package/dist/{dropdown-BXg01-8j.js → dropdown-DBfVqi0v.js} +74 -75
- package/dist/dropdown-DBfVqi0v.js.map +1 -0
- package/dist/{field-BYaOyOtJ.js → field-CQmGKOVZ.js} +7 -7
- package/dist/{field-BYaOyOtJ.js.map → field-CQmGKOVZ.js.map} +1 -1
- package/dist/index.js +28 -28
- package/dist/{input-area-C3ddZhEo.js → input-area-BgpN8siO.js} +3 -3
- package/dist/{input-area-C3ddZhEo.js.map → input-area-BgpN8siO.js.map} +1 -1
- package/dist/{input-BXn3ElmF.js → input-gGpJCiT7.js} +3 -3
- package/dist/{input-BXn3ElmF.js.map → input-gGpJCiT7.js.map} +1 -1
- package/dist/{input-group-BiUKE2TR.js → input-group-DwPPwJEW.js} +2 -2
- package/dist/{input-group-BiUKE2TR.js.map → input-group-DwPPwJEW.js.map} +1 -1
- package/dist/label-hoE9-Nzo.js +62 -0
- package/dist/label-hoE9-Nzo.js.map +1 -0
- package/dist/{link-CfCaX9Ks.js → link-BFszrye7.js} +20 -14
- package/dist/link-BFszrye7.js.map +1 -0
- package/dist/{menubar-be9R8bE-.js → menubar-DF-6twXU.js} +2 -2
- package/dist/{menubar-be9R8bE-.js.map → menubar-DF-6twXU.js.map} +1 -1
- package/dist/{meter-CCpXrH8B.js → meter-CP6NBKRN.js} +2 -2
- package/dist/{meter-CCpXrH8B.js.map → meter-CP6NBKRN.js.map} +1 -1
- package/dist/{pagination-CaHm6TKa.js → pagination-BWkeDEqb.js} +44 -40
- package/dist/pagination-BWkeDEqb.js.map +1 -0
- package/dist/{popover-CHafAVT6.js → popover-B5CWcu7v.js} +2 -2
- package/dist/{popover-CHafAVT6.js.map → popover-B5CWcu7v.js.map} +1 -1
- package/dist/primitives/accordion.js +1 -1
- package/dist/primitives/alert-dialog.js +1 -1
- package/dist/primitives/autocomplete.js +1 -1
- package/dist/primitives/avatar.js +1 -1
- package/dist/primitives/button.js +1 -1
- package/dist/primitives/checkbox-group.js +1 -1
- package/dist/primitives/checkbox.js +1 -1
- package/dist/primitives/collapsible.js +1 -1
- package/dist/primitives/combobox.js +1 -1
- package/dist/primitives/context-menu.js +1 -1
- package/dist/primitives/csp-provider.js +1 -1
- package/dist/primitives/dialog.js +1 -1
- package/dist/primitives/direction-provider.js +1 -1
- package/dist/primitives/drawer.js +1 -1
- package/dist/primitives/field.js +1 -1
- package/dist/primitives/fieldset.js +1 -1
- package/dist/primitives/form.js +1 -1
- package/dist/primitives/input.js +1 -1
- package/dist/primitives/menu.js +1 -1
- package/dist/primitives/menubar.js +1 -1
- package/dist/primitives/meter.js +1 -1
- package/dist/primitives/navigation-menu.js +1 -1
- package/dist/primitives/number-field.js +1 -1
- package/dist/primitives/popover.js +1 -1
- package/dist/primitives/preview-card.js +1 -1
- package/dist/primitives/progress.js +1 -1
- package/dist/primitives/radio-group.js +1 -1
- package/dist/primitives/radio.js +1 -1
- package/dist/primitives/scroll-area.js +1 -1
- package/dist/primitives/select.js +1 -1
- package/dist/primitives/separator.js +1 -1
- package/dist/primitives/slider.js +1 -1
- package/dist/primitives/switch.js +1 -1
- package/dist/primitives/tabs.js +1 -1
- package/dist/primitives/toast.js +1 -1
- package/dist/primitives/toggle-group.js +1 -1
- package/dist/primitives/toggle.js +1 -1
- package/dist/primitives/toolbar.js +1 -1
- package/dist/primitives/tooltip.js +1 -1
- package/dist/primitives.js +1 -1
- package/dist/{radio-DZ1uS-zK.js → radio-BQTXNBkS.js} +6 -6
- package/dist/radio-BQTXNBkS.js.map +1 -0
- package/dist/scripts/theme-generator/config.js +1 -1
- package/dist/scripts/theme-generator/config.js.map +1 -1
- package/dist/scripts/theme-generator/generate-css.d.ts.map +1 -1
- package/dist/select-BWUNPPHQ.js +123 -0
- package/dist/select-BWUNPPHQ.js.map +1 -0
- package/dist/{sensitive-input-CI-gtdfw.js → sensitive-input-A6Kw7URa.js} +4 -4
- package/dist/{sensitive-input-CI-gtdfw.js.map → sensitive-input-A6Kw7URa.js.map} +1 -1
- package/dist/src/code/code-highlighted.d.ts.map +1 -1
- package/dist/src/components/collapsible/collapsible.d.ts.map +1 -1
- package/dist/src/components/dropdown/dropdown.d.ts.map +1 -1
- package/dist/src/components/flow/connectors.d.ts +4 -0
- package/dist/src/components/flow/connectors.d.ts.map +1 -1
- package/dist/src/components/flow/diagram.d.ts +27 -2
- package/dist/src/components/flow/diagram.d.ts.map +1 -1
- package/dist/src/components/flow/node.d.ts +6 -1
- package/dist/src/components/flow/node.d.ts.map +1 -1
- package/dist/src/components/flow/parallel.d.ts.map +1 -1
- package/dist/src/components/flow/use-children.d.ts +12 -1
- package/dist/src/components/flow/use-children.d.ts.map +1 -1
- package/dist/src/components/label/label.d.ts.map +1 -1
- package/dist/src/components/link/link.d.ts +2 -2
- package/dist/src/components/link/link.d.ts.map +1 -1
- package/dist/src/components/pagination/pagination.d.ts.map +1 -1
- package/dist/src/components/radio/radio.d.ts.map +1 -1
- package/dist/src/components/select/select.d.ts +29 -6
- package/dist/src/components/select/select.d.ts.map +1 -1
- package/dist/src/components/switch/switch.d.ts.map +1 -1
- package/dist/src/components/tabs/tabs.d.ts +6 -2
- package/dist/src/components/tabs/tabs.d.ts.map +1 -1
- package/dist/src/components/toast/toast.d.ts +1 -0
- package/dist/src/components/toast/toast.d.ts.map +1 -1
- package/dist/src/components/tooltip/tooltip.d.ts.map +1 -1
- package/dist/styles/kumo-binding.css +19 -0
- package/dist/styles/kumo-standalone.css +1 -1
- package/dist/styles/theme-fedramp.css +13 -0
- package/dist/styles/theme-kumo.css +77 -1
- package/dist/{switch-BxnAwAse.js → switch-CmUFBiJv.js} +4 -4
- package/dist/switch-CmUFBiJv.js.map +1 -0
- package/dist/{table-CdcsAm5X.js → table-CbU4Oe3o.js} +2 -2
- package/dist/{table-CdcsAm5X.js.map → table-CbU4Oe3o.js.map} +1 -1
- package/dist/{tabs-Cf12PXHz.js → tabs-uLzHh6SR.js} +14 -13
- package/dist/tabs-uLzHh6SR.js.map +1 -0
- package/dist/{toast-BzvG5cpW.js → toast-B-d56fkl.js} +124 -92
- package/dist/toast-B-d56fkl.js.map +1 -0
- package/dist/{tooltip-2KqOpTj0.js → tooltip-C7p2iJ0y.js} +24 -18
- package/dist/tooltip-C7p2iJ0y.js.map +1 -0
- package/dist/{vendor-base-ui-DvXlzG7n.js → vendor-base-ui-DN1j_aJS.js} +50 -49
- package/dist/{vendor-base-ui-DvXlzG7n.js.map → vendor-base-ui-DN1j_aJS.js.map} +1 -1
- package/package.json +3 -1
- package/scripts/theme-generator/config.ts +1 -1
- package/scripts/theme-generator/generate-css.test.ts +30 -0
- package/scripts/theme-generator/generate-css.ts +104 -6
- package/dist/checkbox-z5gO1lL8.js +0 -224
- package/dist/checkbox-z5gO1lL8.js.map +0 -1
- package/dist/collapsible-OBNkTO48.js.map +0 -1
- package/dist/combobox-CJqgoue6.js.map +0 -1
- package/dist/dropdown-BXg01-8j.js.map +0 -1
- package/dist/label-ByOtGj7z.js +0 -58
- package/dist/label-ByOtGj7z.js.map +0 -1
- package/dist/link-CfCaX9Ks.js.map +0 -1
- package/dist/pagination-CaHm6TKa.js.map +0 -1
- package/dist/radio-DZ1uS-zK.js.map +0 -1
- package/dist/select-BXZAlFAV.js +0 -113
- package/dist/select-BXZAlFAV.js.map +0 -1
- package/dist/switch-BxnAwAse.js.map +0 -1
- package/dist/tabs-Cf12PXHz.js.map +0 -1
- package/dist/toast-BzvG5cpW.js.map +0 -1
- 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\"
|
|
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
|
-
"
|
|
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
|
|
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
|
-
"<
|
|
3866
|
-
"<Select\n className=\"w-[200px]\"\n value={value}\n onValueChange={(v) => setValue(v
|
|
3867
|
-
"<Select\n className=\"w-[
|
|
3868
|
-
"<Select\n className=\"w-[200px]\"\n value={value}\n
|
|
3869
|
-
"<Select\n
|
|
3870
|
-
"<Select
|
|
3871
|
-
"<Select\
|
|
3872
|
-
"<Select\n
|
|
3873
|
-
"<Select\n className=\"w-[
|
|
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: \"
|
|
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",
|
package/ai/component-registry.md
CHANGED
|
@@ -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"
|
|
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
|
|
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
|
-
<
|
|
3972
|
-
|
|
3973
|
-
|
|
3974
|
-
|
|
3975
|
-
|
|
3976
|
-
|
|
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
|
-
|
|
3980
|
-
|
|
3981
|
-
|
|
3982
|
-
|
|
3983
|
-
|
|
3984
|
-
|
|
3985
|
-
|
|
3986
|
-
|
|
3987
|
-
|
|
3988
|
-
|
|
3989
|
-
|
|
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
|
-
|
|
4013
|
-
|
|
4014
|
-
|
|
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="
|
|
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 ?? "
|
|
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`, `
|
|
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: "
|
|
4825
|
-
render: (props) =>
|
|
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
|
|
621
|
-
hideLabel: z.boolean().optional(),
|
|
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.
|
package/dist/.build-complete
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1773409393878
|
package/dist/ai/schemas.js
CHANGED
|
@@ -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
|
|
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(),
|