Major changes
- bf68ac0
BREAKING: Checkbox
onCheckedChangenow receives event details as second argumentThe
onCheckedChangecallback signature now matches Base UI, providing access to the underlying event:// Before onCheckedChange={(checked) => console.log(checked)} // After (event details available as optional second arg) onCheckedChange={(checked, eventDetails) => { console.log(checked); console.log(eventDetails.event); // native event }}Removed deprecated props:
onChange- useonCheckedChangeinsteadonValueChangeon individual checkboxes - useonCheckedChangeinsteadonClick- was redundant, use standard React event handling via spread props
Migration:
// Before (deprecated) <Checkbox onChange={(e) => console.log(e.target.checked)} /> <Checkbox onValueChange={(checked) => setChecked(checked)} /> // After <Checkbox onCheckedChange={(checked) => setChecked(checked)} />Note:
Checkbox.Group'sonValueChangeprop is unchanged - it still accepts(values: string[]) => void. - f9ba3f9
feat(Collapsible)!: refactor to compound component API
Breaking change: Collapsible now uses a compound component pattern matching other Kumo components like Popover and Dialog.
Before
<Collapsible label="Show details" open={open} onOpenChange={setOpen}> Content here </Collapsible>After
<Collapsible.Root open={open} onOpenChange={setOpen}> <Collapsible.Trigger>Show details</Collapsible.Trigger> <Collapsible.Panel>Content here</Collapsible.Panel> </Collapsible.Root>Migration
For the quickest migration, use the new
DefaultTriggerandDefaultPanelcomponents which preserve the previous styling:<Collapsible.Root open={open} onOpenChange={setOpen}> <Collapsible.DefaultTrigger>Show details</Collapsible.DefaultTrigger> <Collapsible.DefaultPanel>Content here</Collapsible.DefaultPanel> </Collapsible.Root>New Sub-components
Component Description Collapsible.RootManages open state Collapsible.TriggerComposable trigger with renderprop supportCollapsible.PanelContent container Collapsible.DefaultTriggerPre-styled trigger with caret icon (migration helper) Collapsible.DefaultPanelPre-styled panel with border-left accent (migration helper) - 3256a7b
feat(Text): decouple visual heading variants from semantic HTML elements
Breaking change:
heading1,heading2,heading3variants no longer auto-render<h1>,<h2>,<h3>tags. They now render as<span>by default. Use theasprop to set the appropriate semantic heading level for your document outline.Before:
<Text variant="heading1">Title</Text> // rendered <h1>After:
<Text variant="heading1" as="h1"> Title </Text> // explicit semantic elementThe
asprop is now restricted to valid text elements:"h1"through"h6","p", and"span".
Minor changes
- 1954aa8
feat(radio, checkbox, switch): add composable Legend sub-component for group components
- Add
Radio.Legend,Checkbox.Legend, andSwitch.Legendsub-components - Accepts
classNamefor full styling control (e.g.className="sr-only"to visually hide) - Make
legendstring prop optional when using the sub-component instead - Useful when a parent Field already provides a visible label and the legend would be redundant
- Breaking:
Switch.Groupno longer renders a visible border/padding/rounded container — now consistent withRadio.GroupandCheckbox.Group. UseclassNameto add a border if needed.
- Add
- 1eee41a
Add
InputGroupcompound component for composing decorated inputsCompound structure:
InputGroup,InputGroup.Input,InputGroup.Addon,InputGroup.Suffix,InputGroup.Button.- Field integration — pass
label,description,error,required, andlabelTooltipdirectly toInputGroup - Size variants (
xs,sm,base,lg) propagate to all sub-components via context, including icon sizing in addons InputGroup.Addon— positions icons, text, or buttons atalign="start"(default) oralign="end"of the inputInputGroup.Suffix— inline text suffix (e.g..workers.dev)InputGroup.Button— ghost button for secondary actions with tooltip support- Deprecated
InputGroup.Label— useInputGroup.Addoninstead - Deprecated
InputGroup.Description— useInputGroup.Suffixinstead
{ /* Reveal / hide password */ } <InputGroup> <InputGroup.Input type={show ? "text" : "password"} defaultValue="password" aria-label="Password" /> <InputGroup.Addon align="end" className="pr-1"> <InputGroup.Button size="sm" aria-label={show ? "Hide password" : "Show password"} onClick={() => setShow(!show)} > {show ? <EyeSlashIcon size={16} /> : <EyeIcon size={16} />} </InputGroup.Button> </InputGroup.Addon> </InputGroup>;{ /* Search input */ } <InputGroup> <InputGroup.Addon> <MagnifyingGlassIcon className="text-kumo-subtle" /> </InputGroup.Addon> <InputGroup.Input placeholder="Search..." /> </InputGroup>; - Field integration — pass
- 353faea
Adds Autocomplete component. A free-form text input with an optional filtered suggestion list. Unlike Combobox, the value is not constrained to the items list.
- 431de04
feat(radio): accept ReactNode for
Radio.Itemlabel and honorcontrolPositionon card appearanceRadio.Item'slabelprop now acceptsReactNode, allowing icons, badges, or other markup alongside text.Radio.Group'scontrolPositionprop now takes effect onappearance="card". Card appearance continues to default to"end"(radio on the right); passcontrolPosition="start"to render the radio on the left of the label and description.
- f9d8b76
Polish TableOfContents indicator and semantic HTML
- Replace pill/background-tint hover with left-border indicator pattern
- Switch to semantic
ul/liHTML structure - Add
hrefandactiveprops toTableOfContents.Groupfor clickable labels
Patch changes
- ec73bc5
Update chart color docs and demos, including sequential heatmap/CVD coverage and improved chart demo behavior.
- c019b41
Improved focus and keyboard accessibility styles across Kumo components and docs navigation.
- Added the
kumo-focussemantic token to the theme generator config and generatedtheme-kumo.cssoutput. - Updated focus ring behavior across interactive components (including
Button,Input,InputGroup,Select,Checkbox,Radio,Switch,Sidebar,Tabs,Menubar, and related controls) for more consistent and visible keyboard focus visibility. - Text-entry controls use a lighter opacity
kumo-focusring to keep pointer and keyboard focus visually consistent where browsers apply:focus-visibleheuristics to typed-input controls. - Refined
SelectandInputstyling/state combinations to align focus visuals with current semantic token usage. - Updated docs
SidebarNavkeyboard-focus affordances (links, section toggles, search trigger) and adjusted collapsible list overflow so focus rings remain visible. - Replace raw colors in
Selectwith kumo semantic tokens.
- Added the
- 6765526
chore: update @base-ui/react to v1.4.0
Bugfix release with improvements to Popover hover state, Checkbox/Switch readOnly mode, Select touch handling, Tabs activation direction, Toast timers, and various other fixes. No breaking changes.