Minor changes

  • 8a33813

    Create Sankey Chart component

Patch changes

  • a21cc3a

    Fix CommandPalette List bottom ring being clipped by Footer background. Add scroll padding to prevent items from clipping behind rounded corners.

  • 0414c54

    Deprecate to prop on Link in favor of href. The to prop is a routing-framework concept that doesn't belong on a presentational component. Use href for all link destinations and configure a LinkProvider wrapper to bridge to your router. to continues to work but emits a dev-mode deprecation warning.

  • 8b12a4c

    Allow LayerCard.Primary and LayerCard.Secondary to accept all standard HTML div attributes, including data-testid for testing.

  • 7d8ec27

    Set cursor-default on Tooltip triggers so disclosure buttons don't appear clickable. Overridable via className.

Patch changes

  • 8f8a55d

    Export Combobox.Trigger, Combobox.Value, and Combobox.Icon — the raw Base UI primitives for building custom combobox triggers. Use these when you need full control over the trigger's visual treatment (e.g. a sidebar account switcher that renders as a plain button instead of an input-like control).

Patch changes

  • 8926ee7

    fix(CloudflareLogo): remove registered trademark symbol from full logo variant

  • 75d4f4d

    Fix Google Translate DOM mutation crash in Button

  • f2d356d

    Remove z-50 from mobile Sidebar Dialog backdrop and panel. The z-50 caused portaled floating elements (Popover, DropdownMenu, Select, Combobox) opened from inside the Sidebar to render behind the Dialog backdrop. Matches the pattern used by Kumo's own Dialog component, which relies on DOM order for stacking with no explicit z-index. Also adds data-sidebar-backdrop and data-sidebar-popup attributes as stable CSS hooks.

Patch changes

  • 3b36e21

    fix(combobox): forward all props from TriggerValue to ComboboxBase.Value, enabling placeholder support and styled placeholder text via data-[placeholder]:text-kumo-placeholder

  • 5d5d810

    fix(registry): correct Select component metadata for AI-generated code

    The component registry metadata was incorrectly typing Select's value, defaultValue, and onValueChange props as string, causing AI agents to produce broken code when implementing Select with object values (e.g., rendering object.value in the trigger instead of the label).

    Changes:

    • value type: stringT (generic, matches actual component interface)
    • defaultValue type: stringT
    • onValueChange type: (value: string) => void(value: T) => void
    • Added missing renderValue prop: (value: T) => ReactNode — required for object values
    • Added missing items prop: supports both Record<string, string> and Array<{ label, value }> forms
    • Added missing isItemEqualToValue prop: required for object equality comparison
  • 62e093c

    Gracefully fall back to default variant instead of crashing when an invalid variant prop is passed at runtime. Previously 22 of 25 components would throw TypeError on unknown variant values; all 25 now use a shared resolveVariant() utility that returns the default config and logs a dev warning.

Patch changes

  • fbf3eef

    Forward all Base UI Panel props (including keepMounted and hiddenUntilFound) through Collapsible.DefaultPanel. Previously these were silently dropped because DefaultPanel used a standalone props interface instead of extending BasePanelProps.

  • 40491c2

    Fix registry codegen to match demo examples when component export name differs from directory name (e.g. DropdownMenu vs dropdown). This restores missing examples for DropdownMenu and other affected components.

  • 3427221

    TooltipProvider props (delay, closeDelay, timeout) are now shown in the Tooltip component's API Reference on the docs site.

Patch changes

  • e53bd68

    Rebalanced semantic text token usage to improve hierarchy and consistency across components, docs, and generated Figma output.

    • Updated theme token definitions so text-kumo-strong represents high-emphasis text and text-kumo-inactive is lighter/inactive in both light and dark modes.
    • Migrated affected UI surfaces from text-kumo-strong to text-kumo-subtle where content is supportive metadata, labels, or secondary text.
    • Synced token usage in docs and Figma code generators with the updated semantic text mapping.

Major changes

  • bf68ac0

    BREAKING: Checkbox onCheckedChange now receives event details as second argument

    The onCheckedChange callback 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 - use onCheckedChange instead
    • onValueChange on individual checkboxes - use onCheckedChange instead
    • onClick - 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's onValueChange prop 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 DefaultTrigger and DefaultPanel components 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

    ComponentDescription
    Collapsible.RootManages open state
    Collapsible.TriggerComposable trigger with render prop support
    Collapsible.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, heading3 variants no longer auto-render <h1>, <h2>, <h3> tags. They now render as <span> by default. Use the as prop 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 element
    

    The as prop is now restricted to valid text elements: "h1" through "h6", "p", and "span".

  • 267ba7a

    BREAKING (v2): Text requires an explicit as prop when variant is a heading ("heading1", "heading2", "heading3").

    The previous major bump (#393) decoupled heading variants from semantic HTML — heading variants render as <span> unless an as prop is provided. That made the library more flexible but introduced a silent accessibility footgun: forgetting as on a real section heading produced a <span>, excluding it from the document outline without any type-level feedback.

    This change makes as required for heading variants via a discriminated union. Body and monospace variants are unchanged (as remains optional; defaults to <p> and <span> respectively).

    Migration

    Every <Text variant="heading1">, <Text variant="heading2">, <Text variant="heading3"> must now pass as. TypeScript will flag each call site:

    // Before (compiled, silently produced a <span>)
    <Text variant="heading1">Page Title</Text>
    
    // After (required)
    <Text variant="heading1" as="h1">Page Title</Text>
    
    // Still allowed — decorative heading-styled text that is NOT a section heading:
    <Text variant="heading1" as="span">Big bold card label</Text>
    

    For each heading call site, decide whether it's a real section heading (use as="h1"/"h2"/etc.) or decorative (use as="span"). Codemod cannot make this choice mechanically — it is a semantic judgment per usage.

    Body and monospace variants: no changes required.

Minor changes

  • 1954aa8

    feat(radio, checkbox, switch): add composable Legend sub-component for group components

    • Add Radio.Legend, Checkbox.Legend, and Switch.Legend sub-components
    • Accepts className for full styling control (e.g. className="sr-only" to visually hide)
    • Make legend string 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.Group no longer renders a visible border/padding/rounded container — now consistent with Radio.Group and Checkbox.Group. Use className to add a border if needed.
  • 1eee41a

    Add InputGroup compound component for composing decorated inputs

    Compound structure: InputGroup, InputGroup.Input, InputGroup.Addon, InputGroup.Suffix, InputGroup.Button.

    • Field integration — pass label, description, error, required, and labelTooltip directly to InputGroup
    • 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 at align="start" (default) or align="end" of the input
    • InputGroup.Suffix — inline text suffix (e.g. .workers.dev)
    • InputGroup.Button — ghost button for secondary actions with tooltip support
    • Deprecated InputGroup.Label — use InputGroup.Addon instead
    • Deprecated InputGroup.Description — use InputGroup.Suffix instead
    {
      /* 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>;
    
  • 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.Item label and honor controlPosition on card appearance

    • Radio.Item's label prop now accepts ReactNode, allowing icons, badges, or other markup alongside text.
    • Radio.Group's controlPosition prop now takes effect on appearance="card". Card appearance continues to default to "end" (radio on the right); pass controlPosition="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/li HTML structure
    • Add href and active props to TableOfContents.Group for clickable labels
  • 07426f6

    feat(table): add onCheckedChange prop to Table.CheckCell and Table.CheckHead, aligning with the Checkbox component's signature.

    The new prop exposes an optional second argument with event details, matching Base UI's idiom:

    <Table.CheckCell
      checked={selected.has(row.id)}
      onCheckedChange={(checked, eventDetails) => {
        toggle(row.id);
        eventDetails?.event.stopPropagation();
      }}
    />
    

    The existing onValueChange prop still works but is now deprecated and flagged by the no-deprecated-props lint rule. It will be removed in a future major version. Migrate by renaming the prop — the single-argument callback shape is preserved.

    This change is additive and does not require consumer code changes at this time.

  • c1c60c8

    Expand Text component's as prop to accept additional HTML text elements: label, dt, dd, li, figcaption, legend, pre, code, em, strong, small, abbr, and time. This unblocks downstream usage in Stratus where Text needs to render as definition list terms, labels, and code elements.

Patch changes

  • ac6df5f

    Remove invalid hover border utility from secondary button variants to keep hover styling consistent and avoid unintended class output.

  • ec73bc5

    Update chart color docs and demos, including sequential heatmap/CVD coverage and improved chart demo behavior.

  • 7d12918

    Combobox.Item now renders a visible disabled state when the disabled prop is set. Previously the prop was forwarded to Base UI (so click/keyboard selection were correctly blocked) but the row looked identical to an enabled one. Adds data-[disabled]:* Tailwind classes for muted text, cursor-not-allowed, reduced opacity, and suppresses the highlight background on disabled rows during keyboard navigation. Also fixes className passthrough — user-supplied classes are now merged via cn() instead of being overridden.

  • 69bfc53

    Improve focus ring consistency and clipping behavior across inputs and related controls.

    • Move the command palette focus ring to the input header container with focus-within and remove duplicate input-level ring styles.
    • Update Select trigger and option focus styles to use inset focus rings to prevent clipping in rounded/overflow contexts.
    • Fix clipboard copy button focus ring clipping by using inset focus-visible ring, matching border-radius inheritance, and isolated stacking.
    • Align InputGroup and InputGroup.Button focus ring color to ring-kumo-focus, including hybrid container-zone focus ring classes.
    • Update InputGroup tests to match inline focus ring class changes.
    • Set DatePicker (react-day-picker) focus ring token to var(--color-kumo-brand).
    • Update InputGroup container and hybrid keyboard outlines in kumo-binding.css to use var(--color-kumo-focus) at 1px weight.
  • 30bfd82

    Allow CommandPalette.Input to accept standard HTML input attributes (autoComplete, autoCorrect, autoCapitalize, spellCheck, data-*, etc.) by extending its props type with InputHTMLAttributes<HTMLInputElement>. Export new CommandPaletteInputProps type.

  • b923281

    Fix InputGroup hover state incorrectly propagating to the first child button (e.g. in Pagination.Controls). Root now renders as <div> instead of <label> when it contains multiple labelable controls.

  • 06b8852

    Fix Table body cells rendering at 16px. The Table root now sets text-base (14px) so <td> cells match Kumo's default body font-size instead of inheriting the browser default. Also replaces an arbitrary text-[14px] in Empty with text-base.

  • c019b41

    Improved focus and keyboard accessibility styles across Kumo components and docs navigation.

    • Added the kumo-focus semantic token to the theme generator config and generated theme-kumo.css output.
    • 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-focus ring to keep pointer and keyboard focus visually consistent where browsers apply :focus-visible heuristics to typed-input controls.
    • Refined Select and Input styling/state combinations to align focus visuals with current semantic token usage.
    • Updated docs SidebarNav keyboard-focus affordances (links, section toggles, search trigger) and adjusted collapsible list overflow so focus rings remain visible.
    • Replace raw colors in Select with kumo semantic tokens.
  • 21ed1a1

    Fix InputGroup container className to enforce mb-0, ensuring all container variants (not just the standalone <label> mode) reset inherited bottom margin.

  • fa991d9

    Fix InputGroup label wrappers to enforce mb-0, preventing inherited label margins from shifting layout and click-target overlays.

  • 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.

Minor changes

  • da6eee1

    feat(chart): rename formatter to dangerousHtmlFormatter for XSS awareness

    BREAKING CHANGE: The formatter property in KumoChartOption['tooltip'] has been renamed to dangerousHtmlFormatter. This change makes the security implications of using HTML formatters more explicit to developers. The API remains identical—only the name has changed.

    Migration: Replace formatter with dangerousHtmlFormatter in your chart tooltip configurations.

  • 4785c43

    feat(tooltip, popover): deprecate asChild in favor of render prop

    Unifies composition patterns across the library by adopting Base UI's render prop pattern. The asChild prop is now deprecated on:

    • Tooltip
    • Popover.Trigger
    • Popover.Close

    Migration:

    - <Tooltip content="Save" asChild>
    -   <Button>Save</Button>
    - </Tooltip>
    + <Tooltip content="Save" render={<Button>Save</Button>} />
    
    - <Popover.Trigger asChild>
    -   <Button>Open</Button>
    - </Popover.Trigger>
    + <Popover.Trigger render={<Button>Open</Button>} />
    
    - <Popover.Close asChild>
    -   <Button>Close</Button>
    - </Popover.Close>
    + <Popover.Close render={<Button>Close</Button>} />
    

    The asChild prop remains functional for backward compatibility but will be removed in a future major version.

  • a0f2b18

    feat(popover): expose anchor prop on Popover.Content for virtual positioning

    Forwards Base UI's anchor prop through Popover.Content to the underlying Positioner, enabling popover positioning against custom elements, refs, or virtual points (e.g., a DOMRect from getBoundingClientRect()). This is useful when the popover trigger and the desired anchor are in different component trees, or when anchoring to a coordinate rather than a DOM element.

  • 58b5777

    Convert Table of Contents to exported Kumo component

  • 0cae077

    feat(Select): add size prop (xs/sm/base/lg) matching Input and Combobox heights

Patch changes

  • 1e7ba10

    feat(layer-card): support simple card usage and deprecate Surface

    • allow LayerCard to be used directly without LayerCard.Primary for simple single-layer card layouts
    • keep LayerCard.Secondary and LayerCard.Primary supported for the existing layered card pattern
    • deprecate Surface in favor of LayerCard while keeping the old API working as a compatibility wrapper
    • update docs and examples to prefer LayerCard, including table examples that no longer need a nested LayerCard.Primary
  • 2682319

    fix(pagination): add ARIA attributes for screen reader accessibility

    • Wrap pagination controls in <nav> for proper landmark navigation
    • Add aria-live="polite" and aria-atomic="true" to status text for page change announcements
    • Add navigation to PaginationLabels for i18n customization of the nav aria-label
  • 9eb1306

    fix(chart): escape HTML in tooltip series name and values

    Escapes HTML entities in TimeseriesChart tooltip series names and values before rendering.

  • 4565baa

    fix(combobox): make TriggerInput caret button clickable for Playwright tests

  • 4dfdc3f

    fix(dropdown): pass children through when render prop is provided on DropdownMenu.Trigger

  • 98e3170

    fix(Select): TypeScript inference with strictNullChecks and renderValue/placeholder interaction

    TypeScript fix: Under strictNullChecks, using value={objectOrNull} would cause T to be inferred as never, making callbacks like onValueChange and renderValue unusable. This is now fixed.

    Runtime fix: renderValue is now only called with non-null values. When value is null, the placeholder is shown instead. Previously, renderValue would receive null at runtime despite being typed as (value: T) => ReactNode.

    // Recommended pattern
    <Select
      placeholder="Select..."
      value={value}
      onValueChange={setValue} // value is T | null (works with strictNullChecks)
      renderValue={(v) => v.name} // v is T (non-null), no defensive coding needed
    />
    
  • 9c3cdbf

    Fix sidebar collapsible content snapping shut instead of animating smoothly when closing.

  • 27bcd59

    fix(table): align sticky column colors with compact header variant

  • a8adf02

    fix(tokens): correct text-kumo-subtle dark mode value to provide visible contrast

  • 547c7fa

    Updated the token value for kumo-line and kumo-hairline in dark mode so they are more visible.

    • replace kumo-line usages with kumo-hairline across Kumo components and docs UI/content styles
    • use ring-kumo-line for shadowed surfaces (for example combobox, dialog, select, dropdown, toast, and related surface wrappers)
    • adjust theme token configuration and generated styles to support updated neutral/hairline appearance
  • 460a603

    fix(a11y): add accessible labels to icon-only controls

Minor changes

  • b1e51a8

    Add Enter key navigation to Pagination page number input and new pageSelector prop for dropdown mode

    • The page number input in Pagination.Controls now navigates on Enter key press (previously only on blur)
    • New pageSelector prop on Pagination.Controls: set to "dropdown" to render a Select dropdown instead of a text input for page selection
  • e676f0b

    Add disabled option support, groups, group labels, and separators to Select

    • Select.Option now accepts disabled and className props
    • New Select.Group and Select.GroupLabel sub-components for organizing options under labeled headers
    • New Select.Separator sub-component for visual dividers between groups
    • The items object-map prop now accepts SelectItemDescriptor values with disabled metadata
  • a685953

    Expose delay and closeDelay props on Tooltip component to control open and close timing. These props are forwarded to the underlying Base UI Trigger component.

Patch changes

  • dacf445

    Input and InputArea now automatically apply error styling when the error prop is truthy. You no longer need to set variant="error" separately - just pass an error message and the styling is applied automatically. The variant="error" prop is now deprecated but still works for backwards compatibility.

  • 44c26f5

    Adjust semantic tint usage for status/error ring styles across core form and feedback components.

    • Update background styles in Badge and Banner components to use *-tint tokens.
    • Update kumo-danger to a darker token to improve a11y contrast.
    • Update error ring styling in form components to use semantic tokens (now darker with token swap).
    • Removed text-color-badge-red-subtle token in replacement of the danger token.
    • Update theme generator color mappings used by these tints to improve visual consistency.
  • 2bb8628

    Fix CodeBlock crash when an unsupported lang value is passed at runtime. The codeVariants() function now uses optional chaining with a nullish coalescing fallback to the default language, matching the defensive pattern already used by switchVariants() and badgeVariants().

  • e8bcf6f

    fix(select): use ring-kumo-hairline token in Select popup (missed in PR #355)

  • c3beded

    Fix Select popup scrolling and height behavior; align popup/list structure with Base UI. Split popup into frame (Popup) and scroll container (List) to match Combobox pattern and fix touch scroll on long lists.

  • 4a2fb02

    fix(loader): add ARIA attributes for screen reader accessibility

    Added role="status" and aria-label="Loading" to the Loader SVG component to make it accessible to screen readers. This resolves a WCAG 2.1 SC 4.1.3 (Status Messages) violation where assistive technology users received no indication that content was loading.

  • 5e4c7b1

    Refine badge semantics/fill styling and banner tone updates

    • Rework Badge variant model to prioritize semantic variants (primary, secondary, error, warning, success, info) with updated descriptions and primary as default.
    • Keep token color variants for product-specific use cases while updating class mappings so semantic and token variants are distinct.
    • Slight updates to token color variants to meet a11y contrast requirements.
    • Update token color variants by replacing yellow with purple since yellow doesn't meet a11y contrast requirements, and keeping docs/demo examples in sync.
    • Update badge docs demos/content to focus on primary semantic badges and a consolidated "other variants" section.
    • Adjust banner variant surfaces (default, alert, error) to stronger tinted backgrounds and borders.
    • Update theme generator badge/semantic token mappings and regenerate theme-kumo.css to match the new badge color system.
  • 6458fae

    Fix Switch label click not toggling when a custom id prop is provided

    The id was not being forwarded to Base UI's Switch.Root, causing a mismatch between the label's htmlFor and the button's actual id.

  • cf6b917

    Align semantic token documentation and docs presentation updates.

    • Update colors.mdx token documentation structure.
    • Replaced kumo-ring with kumo-hairline for border/ring colors and all its instances in kumo components and docs.
    • Sync packages/kumo/ai/USAGE.md token reference categories and descriptions with the docs token guide.
    • Adjust the typo in the recessed dark token value in theme generator config and regenerate theme-kumo.css.
    • Updated kumo-fill-hover token value from neutral-700 to neutral-800

Minor changes

  • 355a1b5

    Badge: add color-based variants and deprecate semantic variants

    • Add color variants: red, orange, yellow, green, teal, blue, neutral, inverted
    • Add subtle variants for each color (red-subtle, orange-subtle, etc.) with lighter backgrounds and darker text
    • Retain outline and beta variants unchanged
    • Deprecate primary (use inverted), secondary (use neutral), destructive (use red), success (use green)
    • Dark mode support: subtle variants flip to dark backgrounds with light text, regular color variants darken slightly, inverted flips to white bg with black text
    • Default variant changed from primary to neutral
  • 250a6dd

    Add action prop to Banner for rendering CTA buttons alongside structured title/description content without resorting to the children prop.

  • 8c244d2

    Refresh semantic surface color tokens and component surface usage.

    • Add and adopt kumo-canvas as the page-level surface token in theme output and docs usage.
    • Rebalance neutral token values in kumo-binding.css and generated theme variables for improved light/dark surface hierarchy.
    • Update surface-related component styling (LayerCard, MenuBar, Tabs) to align with the refreshed canvas/elevated/recessed layering model.
    • Update token usage guidance in ai/USAGE.md to reflect page vs component background roles.
  • ef15662

    Make timeseries' highlighted on hovering a data point

  • cd0c22f

    Add Shadow DOM support via KumoPortalProvider and container prop on all portal-based components

    All overlay components (Dialog, DropdownMenu, Combobox, Select, Tooltip, Popover, CommandPalette, Toast) now support rendering inside Shadow DOM or custom containers.

    New exports:

    • KumoPortalProvider - Context provider to set default portal container for all overlays
    • PortalContainer - Type for portal container (HTMLElement, ShadowRoot, or ref)

    Component updates: All portal-based components now accept an optional container prop:

    • Dialog - container prop on Dialog component
    • DropdownMenu.Content - container prop
    • Combobox.Content - container prop
    • Select - container prop
    • Tooltip - container prop
    • Popover.Content - container prop
    • CommandPalette.Root and CommandPalette.Dialog - container prop
    • Toasty (Toast provider) - container prop

    Usage:

    Set once at the app level:

    <KumoPortalProvider container={shadowRoot}>
      <App />
    </KumoPortalProvider>
    

    Or override per component:

    <Dialog container={customContainer}>
      <Dialog.Title>Modal inside shadow DOM</Dialog.Title>
    </Dialog>
    

    When no provider or prop is set, components default to document.body (existing behavior).

  • 17f21f3

    SkeletonLine: add blockHeight prop to set a container height and vertically center the skeleton line within it

  • d1f697b

    Table: add sticky prop to Table.Head and Table.Cell for pinning columns to left/right edges, and sticky prop to Table.Header for sticky header rows. Uses isolate stacking context with z-0/z-1/z-2 layering.

  • 56e3640

    Add toml as a supported language for syntax highlighting in the Code component

  • f0c8952

    Add title prop to Button — wraps the button in a Tooltip when provided.

Patch changes

  • 7721bc5

    Checkbox.Group & Radio.Group: remove fieldset border box and simplify styling

    • Remove rounded-lg border border-kumo-line p-4 wrapper from both group fieldsets
    • Downsize legend from text-lg to text-base with inline-flex layout
    • Drop font-medium from Checkbox.Item and Radio.Item labels
  • 6c21970

    Fix missing disabled styling on Combobox triggers. TriggerValue and TriggerMultipleWithInput now apply opacity-50 and cursor-not-allowed when disabled, matching the behaviour of the Select component.

  • 0e4247a

    Update dialog backdrop overlay to use bg-kumo-recessed token

  • 0060bb9

    Remove ai/schemas.ts from version control (now fully generated at build time)

  • 04a1f07

    Fix LayerCard.Primary stacking order when sandwiched between LayerCard.Secondary elements

  • 94d50e2

    Fix SensitiveInput focus ring and global CSS pollution

    • Fix focus ring not showing on container when inner input is focused (focus-within:outline)
    • Add defensive styles to eye toggle and copy buttons to prevent global CSS pollution
    • Fix inputVariants parentFocusIndicator using wrong selector ([&:has(:focus-within)] → focus-within:)
  • db75c51

    SkeletonLine: move .skeleton-line styles into @layer base so Tailwind utility classes (e.g. className="h-6") can override the default height

  • eb68b35

    Tabs indicator now uses translate-x for its transition animation, replacing the CSS left transition with a GPU-accelerated transform.

  • e21a6df

    fix flow component not reflecting padding prop

  • 29c56fd

    Surface: replace as prop with Base UI render prop for polymorphism

    The as prop used a hand-rolled generic forwardRef pattern (with as any casts) that conflicted with how the rest of the library handles polymorphism via Base UI's useRender hook.

    Surface now accepts a render prop, consistent with Link and other components. The old as prop is kept as a deprecated alias and continues to work unchanged — no migration required.

    // Still works (deprecated)
    <Surface as="section">...</Surface>
    
    // Preferred going forward
    <Surface render={<section />}>...</Surface>
    
  • 9272b4a

    Switch: polish squircle styling

    • Use ring-inset on thumb to prevent border protruding beyond the track
    • Make thumb ring transparent to remove visible border outline
    • Switch focus indicator from ring to outline with outline-offset-2 to avoid clashing with the track's own ring border
  • 6b15bac

    fix(Tabs): update segmented tab spacing and track styling

    • Adjust segmented Tabs list styling colour to bg-kumo-recessed and added ring to make the Tabs background more visible
    • Remove extra edge spacing and keep the segmented track/indicator alignment consistent
  • cfe814d

    update toast styling to use a subtle ring and background that reflect each state.

  • 7ac73d2

    update status text token values for info and danger to improve a11y contrast ratio on banners.

  • dcbf185

    Add truncate prop to Text component. When true, applies truncate min-w-0 classes to clip overflowing text with an ellipsis.

Showing 1-10 of 38