2.9.2Patch

Patch changes

  • 188a82c

    Remove the elevated chip styling from Tabs overflow scroll controls.

  • c5ad709

    Constrain Tabs overflow controls to segmented tabs and focus the caret target.

2.9.1Patch

Patch changes

  • ff76f30

    Update the default collapsible trigger and panel styling.

    Collapsible.DefaultPanel now uses an inner content wrapper so the outer panel can animate height smoothly while clipping overflow during the transition. Consumers applying custom layout or spacing classes directly to DefaultPanel may need to move those styles to their content, or use Collapsible.Panel for a fully custom layout.

  • 7468623

    Fix initCatalog so it actually loads the validation schemas.

    Previously it triggered a synchronous validation whose "schemas not loaded" error was swallowed, so await initCatalog(catalog) could resolve while hasComponent, componentNames, and the other synchronous catalog APIs still reported no components. It now awaits loadSchemas() directly.

    A failed schema load is also no longer cached: retrying initCatalog (or loadSchemas) after a transient failure now re-attempts the import instead of returning the stale rejection.

  • d7639f2

    Fix Shiki highlighter lifecycle in ShikiProvider and CodeHighlighted.

    ShikiProvider no longer re-creates the highlighter when a parent rerender passes an equivalent inline languages array — initialization is keyed on the normalized language set. Highlighters are now disposed on unmount and when the engine or language set changes, instead of leaking. CodeHighlighted memoizes the highlighted HTML so unrelated rerenders (such as copy-button state changes) no longer re-highlight unchanged code, and initialization errors are logged once instead of on every render. Reinitializing after a failed initialization now clears the stale error state instead of showing it during the retry.

  • c599590

    Reset the Tabs overflow control background so host button styles do not show through the scrim gradient.

2.9.0Minor

Minor changes

  • ff8ad54

    Improves Banner contrast and CTA colors, adds compact sizing, and keeps components that consume the updated status tokens visually balanced.

    • Updated status tokens to improve contrast between Banner backgrounds, text, and CTAs.
    • Rebalanced Badge status tints, Toast backgrounds, and Command Palette search highlights to correspond with the updated tokens.
    • Added a new Banner.Action CTA compound that builds on Button with banner-specific accent styling. It supports primary (filled), secondary (accent-hued outline on a transparent background), and ghost variants.
    • Added a size prop to Banner ("base" | "sm"); the compact "sm" size suits dialogs and other tight spaces and sets its Banner.Action children to the xs size.
  • f919182

    Improve chart loading states with a static, reduced-motion-aware TimeseriesChart skeleton (line and bar variants matching type) and a new loading prop for ChartLegend.SmallItem and ChartLegend.LargeItem.

  • 535d579

    Add a disabled prop to LinkButton. When disabled, it renders a real disabled <button> (dropping anchor-only attributes and event handlers) and supports title tooltips explaining why the action is unavailable.

    Also removes stale Storybook references from the README and drops .stories.tsx generation from the component scaffolder, since Storybook is no longer set up in this repo.

  • aae94f1

    LinkButton now wraps in a Kumo Tooltip when a title is provided, matching Button's behavior. Previously an enabled LinkButton only set a native title attribute; it now surfaces the same styled tooltip on hover and focus.

  • 9e083d2

    Add fullScreenOnMobile prop to Sidebar. When set, the mobile navigation sheet expands to the full viewport instead of leaving a sliver of the page visible, giving nav items comfortable touch targets. The backdrop is suppressed and the divider border dropped, since neither has anything to separate. Defaults to false.

    Also adds Sidebar.Close, a ghost button that dismisses the mobile sheet. It is intended for Sidebar.Header in full-screen mobile layouts where the backdrop is hidden and there is no adjacent page content to tap.

    Also fixes Breadcrumbs.Link shrinking alongside the current crumb. Flexbox distributed truncation across every crumb, turning the trail into unreadable stubs; ancestors now hold their width so only the current page truncates.

  • 51aa44c

    Add Sidebar.Loading, a nav loading skeleton so apps stop hand-rolling their own. It renders nav-item-shaped placeholder rows (icon + label) grouped like the real nav, composed from SkeletonLine and matching the Sidebar.MenuButton box model so there's no layout shift when the real nav swaps in. Collapse-aware (icon squares only when collapsed) and exposes role="status" with a configurable label.

  • 86ee08c

    Add useTableOfContentsActiveId hook for TableOfContents scroll tracking.

    The TableOfContents component is presentational, so consumers had to wire up their own scroll-position tracking. This adds a shared hook: pass the section ids (in document order) and it returns the active section id plus a selectSection action for click handling.

    const { activeId, selectSection } = useTableOfContentsActiveId({
      ids: headings.map((h) => h.slug),
      offset: HEADER_HEIGHT,
    });
    
    • Highlights the topmost section actually in view (via IntersectionObserver), offset by an optional fixed-header offset; supports custom scroll containers via root.
    • Handles location.hash deep links on load and hashchange automatically (opt out with trackHash: false).
    • selectSection pins a clicked section until scrolling settles, so short sections stay highlighted after a jump. Works on browsers without scrollend support.
    • SSR-safe: all DOM access happens in effects, so it renders under Astro/Next SSR (activeId is null on the server).

    The docs site "On this page" table of contents now consumes this hook instead of its own bespoke observer.

  • 87d1ebc

    Ship unminified dist output without sourcemaps or declaration maps

    Consumers' bundlers minify (and tree-shake) the library code anyway, so pre-minifying only obscured the shipped modules, and the declaration maps pointed at source files that aren't published. The package shrinks from ~13.9 MB to ~6.5 MB unpacked, and the code in node_modules is now readable. No API or behavior changes; final application bundle sizes are effectively unchanged.

Patch changes

  • fc5e222

    Use a string or numeric Button title as the fallback accessible label when the button has no text children.

  • 8e71b38

    Bump Prettier 3.6.2 → 3.9.5 and reformat (Prettier changed e.g. interface heritage-clause wrapping). No functional changes.

  • 2a463f7

    Prevent TimeseriesChart tooltips from following the cursor outside the chart after a browser context menu interaction.

  • 0f0c44d

    ClipboardText: keep the check icon until the last copy click settles, and bump the anchored "Copied" toast (without stacking) when the button is pressed again while it's open.

  • b171c71

    Render Kumo Link actions inline in compact Banners while keeping CTA actions trailing.

  • 4f0ed75

    Fix purple badge token fallback colors to use purple OKLCH values.

  • 5efe6dd

    Add a lint rule that verifies custom components used with Flow.Node's render prop forward refs and spread received props.

  • 32b2168

    Keep TimeseriesChart brush-to-zoom active after replacing ECharts options.

  • b0870e1

    Remove the subtle shadow-xs drop shadow from InputGroup Root and from nested InputGroup.Button, so the component matches the flat appearance of the standalone Input and other form controls (previously non-ghost button variants still had the base Button's shadow-xs).

  • 34e1672

    Bundle the library with vp pack (tsdown) instead of Vite lib mode; declarations are now bundled per entry and export types paths follow the import paths

  • 2575f9c

    Use muted chart colors for timeseries axes and horizontal gridlines.

  • 7c33107

    One-time repo-wide format with the repo's own Prettier 3.6.2 (formatting was never enforced; drift accumulated). No functional changes.

  • ee6e569

    Set default text-base and text-lg line heights to 1.5.

  • 927d19f

    Remove inert Tailwind classes surfaced by class sorting: ring alongside ring-2 (overridden — later stylesheet rule wins) and bare outline in three places (no such utility in Tailwind v4; outline-1 already applies the default solid style). No visual changes.

  • 924f07a

    Split Base UI across fine-grained chunks instead of one vendor-base-ui chunk

    Components now pull in only the Base UI modules they actually use, improving consumer tree-shaking: a single-Button app bundle drops from ~173 KB to ~129 KB minified (~57 KB to ~44 KB gzipped) compared to 2.8.0.

  • 7ef8c46

    Add clearer edge affordances when Tabs overflow horizontally.

  • 86afc2b

    Show Button title tooltips when the button is disabled or loading.

  • 5516c22

    Fix command palette match highlight contrast in dark mode.

  • 24149b9

    Normalize Tailwind class strings via Oxfmt class sorting (sortTailwindcss, canonical Tailwind order, duplicates removed). No functional changes.

  • 8de0551

    Migrate the toolchain to Vite+ (vp): the library now builds with Vite 8 on Rolldown, tests run through vp test (Vitest), and linting/formatting run through vp lint (Oxlint) / vp fmt (Oxfmt, replacing Prettier). No API changes; published output is functionally identical, though entry files are now re-export facades whose source maps live in the shared chunks, and use-sync-external-store is now an explicit dependency instead of being bundled (bundling it left CJS require("react") calls that broke importing the package directly in Node).

  • 60f5bfa

    Enable full type-checking in vp check / vp lint (typeAware + typeCheck) and fix the type issues it surfaced in files tsc --noEmit never covered. Only runtime-visible change: the CLI entrypoint explicitly voids its main() promise.

2.8.0Minor

Minor changes

  • 8f2c40b

    Rewrite Flow to use computed layout over relying on DOM layout.

    Flow now measures node sizes, reconstructs the flow tree, and computes node positions and connector paths from that derived state instead of chaining DOM rect reads. This keeps connectors aligned through resize and scroll changes, supports nested flow structures more predictably, and makes anchor-based connector placement follow the anchor midpoint.

  • fdeeb74

    Add target prop to Sidebar.MenuSubButton for parity with Sidebar.MenuButton — forwarded to the link when href is set, so link sub-items can control where they open (e.g. same-tab cross-origin navigation).

  • b05ea3f

    Add auto-resize support to InputArea and Textarea.

  • 33cb988

    Add vertical reference markers to TimeseriesChart.

  • 0562dd1

    Add horizontal threshold lines to TimeseriesChart.

Patch changes

  • a90dc83

    Include chart components exported from multi-component barrel directories in the generated component registry, with complete props metadata for generic interfaces.

  • 0e440d4

    Keep the mobile Sidebar open when focus moves to portaled interactive content.

  • 67061e1

    Disable Sidebar.MenuButton tooltips while the sidebar is expanded or peeking.

2.7.0Minor

Minor changes

  • 8f8f898

    Add ChoroplethMap, a GeoJSON region choropleth chart component that joins data rows to features by name/nameProperty and shades regions with a continuous visualMap scale. Includes Kumo light/dark map colours, tooltip formatting, optional legend, hover/click callbacks, roam controls, docs, and demos.

    Both BubbleMap and ChoroplethMap now apply a d3-geo projection (latitude-clamped Mercator by default; pass another d3-geo projection or null for raw plotting) and size by aspectRatio so the map fills its container without letterboxing. The container height now derives from the projected window's aspect ratio by default; pass an explicit height to opt back into a fixed pixel height.

    Update BubbleMap viewport behavior to avoid resetting user pan and zoom while refreshing bubble data.

    BubbleMap now defaults roam to false to avoid accidental pan and zoom interactions. Consumers that want drag-to-pan or scroll-to-zoom can pass roam={true}.

  • 6d366d9

    Add orientation="vertical" support to Flow for laying out nodes top-to-bottom. The align prop now controls cross-axis alignment in both orientations.

  • ebc5cf8

    feat(chart): add BubbleMap chart component

    New BubbleMap component renders proportional bubbles over a registered geographic map using ECharts' scatter series. Includes value-based radius scaling, a mapColors palette addition to ChartPalette, and supporting types. Also extracts escapeHtml / defaultValueFormat tooltip helpers into a shared tooltip-utils module reused by SankeyChart.

Patch changes

  • dd1a0b5

    Keep primary and destructive button active/focus rings matched to their variant color.

  • 8463c38

    Use the Button component for Toast close controls and match the hover tint to the toast variant.

  • 3aa0d9a

    Limit Dropdown content height to available viewport space to prevent overflow.

  • 25b2ab1

    Replace the internal class merging implementation with cnfast.

  • 6232d34

    fix(button): resolve Firefox rendering artifact when Turnstile is present

    Replace translate-y-px with box-shadow: inset 0 1px 0 0 var(--kumo-button-emphasis-bg) on the primary/destructive button emphasis overlay span. The transform triggered a rendering bug in Firefox on pages with Turnstile's contain: strict CSS. The box-shadow achieves the same visual depth effect without the rendering issue.

  • a74bd9c

    Fix Dialog size prop to set a fixed width instead of only a minimum width. Previously, dialog content could stretch the dialog beyond its intended size.

  • 4dd1398

    Update Base UI to 1.6.0.

2.6.0Minor

Minor changes

  • 1b04ee9

    Add Toolbar for composing explicit toolbar controls into a shared grouped card.

  • 116e0de

    feat(chart): add enableLegendSelection prop to TimeseriesChart

    Opt-in (default false) hidden ECharts legend that lets consumers drive series visibility imperatively via the legendSelect / legendUnSelect / legendToggleSelect actions — useful for building a custom interactive legend with ChartLegend. Series toggled off via the legend are also excluded from the tooltip. Requires registering ECharts' LegendComponent (echarts.use([LegendComponent])). When disabled, behaviour is unchanged.

  • 815628f

    Extend LegendItems to take pointer events & timeseries merges forwardref to support those events

Patch changes

  • 430689b

    Update the Button primary and destructive variants with token-derived gradient treatments.

  • 539e5bf

    Fix horizontal scroll in Sidebar.Content: always apply overflow-x: hidden on the scroll viewport, not just when collapsed. Base UI's ScrollArea.Viewport sets overflow: scroll as an inline style, which allowed ~14px of horizontal overflow when consumer content (e.g. search buttons with keyboard shortcuts) exceeded the sidebar width.

  • 4378067

    feat(radio): add generic value type support to Radio.Group and Radio.Item

  • fb5fed1

    Fix the green Badge variant missing its background color token.

  • bdd890c

    Keep generated component registry descriptions to JSDoc summaries before markdown sections or code examples.

2.5.2Patch

Patch changes

  • 9a13576

    fix(button): use ring-kumo-line for default secondary button ring

  • b18837c

    Refine outline and secondary destructive button hover states.

  • 595d10e

    fix(sidebar): correct GroupLabel top margin from mt-6 to mt-4

2.5.1Patch

Patch changes

  • b06e35b

    Allow unprefixed Dialog max-width classes to override the default viewport cap at desktop breakpoints.

2.5.0Minor

Minor changes

  • 7401701

    Sidebar: mobile rewrite, smooth collapse transitions, and new props

    New features:

    • mobileBreakpoint prop on Provider — configurable viewport width for mobile detection
    • contentClassName prop on Sidebar root — pass-through class for the inner content container
    • Controlled mobile state — open prop now controls the mobile sidebar too, not just desktop

    Fixes:

    • Replaced Base UI Dialog mobile sidebar with a plain <nav> + backdrop for simpler, more predictable transitions
    • Collapsible sections now animate closed smoothly when the sidebar collapses instead of snapping shut
    • Removed hidden class from Sidebar.MenuSub so sub-menus participate in collapse animations
    • Removed inertValue React-version helper — SidebarSlidingView now sets inert imperatively for React 18 compatibility
    • Restored inert on closed SidebarCollapsibleContent while removing its data-open attribute

    Styling:

    • bg-kumo-tintbg-(--sidebar-active-bg) CSS variable for active/hover/focus backgrounds
    • Icon opacity 0.50.4; chevron gains hover opacity transition
    • Header gains shrink-0 and animated padding on collapse
    • Content scroll area gains animated gap transition and tabIndex={-1} on viewport
    • Sliding views container gains max-w-(--sidebar-width) to prevent overflow
    • Mobile sidebar uses --sidebar-animation-duration CSS variable for slide transition

Patch changes

  • f957dbc

    Add React 18 and React 19 compatibility checks for Kumo tests.

  • ac46184

    Fix Chart (and SankeyChart) rendering in dark mode. The chart canvas now stays transparent so the surrounding bg-kumo-* surface shows through symmetrically in both modes, and ECharts' built-in "dark" theme is applied when isDarkMode is true so the tooltip card, axes, splitLines, and legend text are themed correctly.

  • e25a3d6

    fix(sidebar): add text truncation with ellipsis to Sidebar.MenuButton content

    Previously, Sidebar.MenuButton used overflow-hidden which clipped long text without showing an ellipsis. Now uses truncate to match Sidebar.MenuSubButton's behavior.

  • d3feec0

    Fix segmented Tabs scroll fade, scroll-into-view, and ring styling:

    • Rewrite CSS scroll-fade masking to use @property-animated custom properties, fixing proportional fade rendering across browsers.
    • Scroll the selected tab into view on click so it stays visible in overflowing tab lists.
    • Move ring ring-kumo-hairline/70 from the inner list to the root container so the segmented variant ring wraps the entire component correctly.
  • f831482

    Fix Flow connector rendering in Firefox by emitting valid SVG path data without array commas and setting visible overflow on the SVG element attribute.

  • 4a8b992

    Restore React 18-compatible Sidebar inert attribute handling while keeping the full React compatibility CI suite.

2.4.1Patch

Patch changes

  • 2daa237

    Fix Combobox and Autocomplete rendering in React 18 by using the explicit context provider API.

Showing 1-10 of 53