Skip to content

Changelog

What changed in each release, newest first. Breaking changes are marked Breaking.

v1.14.2

Released Compare with the previous release

Combobox

  • Fixed a multiple field growing past its control height when it held a chip. At sm the field is 18px inside, but a chip was 24px at every size (block padding around its 16px remove button), so one chip took the field from 28px to 34px. A chip now has a height instead of padding: 24px where the field has room, and the field's inner height where it does not.
  • Fixed Clear and Trigger moving to a row of their own when chips wrapped. The chips container sized itself from its max-content width, which counts the input at its default width (about 156px), so two short chips outgrew the room beside the buttons. It now takes only the room the buttons leave and wraps inside itself, and the buttons are pinned to the first row, so a field whose chips wrap keeps its caret where a one-row field has it. At a narrow sm width (256px) the input can still take a second row, because the two chips plus the input's 64px minimum need more room than the buttons leave. The buttons stay on the first row.
  • Fixed every compact sm field (24px) rendering a fraction taller than its control height, and a chip growing it by 10px.
  • Added the --forte-combobox-field-py theming knob, the field's block padding. It defaults to --forte-space-1, capped so the inside still holds a 16px glyph: 3px at compact sm, and the full --forte-space-1 at every other size and density. The button size, button radius and chip radius read it.

v1.14.1

Released Compare with the previous release

InputGroup

  • Fixed an sm group growing past its control height when an icon-only button sat in an addon. A search field with a clear button went from 28px to 34px the moment the button appeared, because Button's iconOnly rule floors its box at the 24px target on both axes and the group only reset the width floor. The height floor now comes down to the field too; the button's hit area stays at the 24px --forte-target-min. md and lg were not affected.
  • Fixed a compact sm group (24px) growing for every kind of addon content, including text, icons and icon-only buttons. --forte-input-group-py now defaults to --forte-space-1 capped to what leaves room for an icon-only button: 2px at compact sm, and unchanged (--forte-space-1) at every other size and density.

v1.14.0

Released Compare with the previous release

Design tokens & motion

  • Added --forte-color-selection (accent step 6) and --forte-color-on-selection (accent step 12), the pair every field paints its selected text in. Step 12 on step 6 is asserted by the contrast harness at 4.5:1 (worst case 7.48:1 light, 5.66:1 dark).

General

  • Fixed selected text being nearly invisible in Input, Textarea, InputGroup, NumberField, OTPField and Combobox. The selection was painted on the soft accent step, which sat as little as 1.11:1 off the page in light mode and 1.23:1 in dark, so a selection read as the value changing color rather than as a highlight. It now paints on --forte-color-selection with --forte-color-on-selection text. This matters most in OTPField, where every slot selects its character on focus. The selection knobs default to the new tokens: --forte-input-selection-bg / -fg, --forte-textarea-selection-bg / -fg, --forte-input-group-selection-bg / -fg, --forte-number-field-input-selection-bg / -fg and --forte-otp-field-selection-bg / -fg (Combobox has none).
  • Added bg-selection and text-on-selection to the @forte-ui/react/tailwind.css bridge (--color-selection, --color-on-selection), so a field of your own can match the library's: selection:bg-selection selection:text-on-selection.

v1.13.2

Released Compare with the previous release

ToggleGroup

  • Fixed a segmented ToggleGroup strip whose corners did not match the toggles inside it. The strip's radius was a fixed --forte-radius-4, so under the soft, pill and none radius presets the toggles sat in a track of the wrong curvature, and even at the default the strip was off by the padding. The radius is now derived from the toggles' radius (--forte-radius-control) plus the padding and border around them, so the two stay concentric under every preset. The none preset keeps a square strip. --forte-toggle-group-radius now defaults to that derived value when segmented. If you re-point the toggles' radius on the toggles themselves, set this knob alongside it, because the group cannot see a knob declared on each toggle.

v1.13.1

Released Compare with the previous release

Drawer

  • Fixed a non-modal drawer (modal={false} or modal="trap-focus") blocking the page behind it. The scrim used to catch every press aimed at the page, even at the lowest snap point where it is fully transparent and the page looks usable. In these modes the scrim is now purely visual and lets presses through, so they reach the page and Base UI's outside-press dismissal alike. The backdrop is marked data-non-modal while this applies. A drawer that turns modal as it is raised takes presses again from that render on.
  • Fixed the receded page showing square corners behind Drawer.Indent. An app shell's first child, usually a painted app bar flush with the top, covered the rounded corners. The active indent now clips its contents to the radius. The clip is held until the return transition finishes, so the corners do not square off while the radius is still easing out. Nothing changes at rest. While a drawer is open, anything that draws past the indent's box without a portal, such as a shadow or an unportalled popover, is cut at its edge.

v1.13.0

Released Compare with the previous release

Drawer

  • Added the indent effect, which pushes the app back while a drawer is open, the way a native sheet does. Drawer.Provider renders no element and reports whether any drawer inside it is open. Drawer.Indent wraps the app's UI and recedes: it scales down, drops a step and rounds its top corners, easing back to rest in step with a dismissing drag. Drawer.IndentBackground is the decorative fixed layer, transparent until a drawer opens, that shows around the receded page. Put the background directly before the indent inside the same provider. The exports are DrawerProvider, DrawerIndent and DrawerIndentBackground, with DrawerProviderProps, DrawerIndentProps and DrawerIndentBackgroundProps as types.
  • Keep position: fixed chrome, such as a fixed header, outside Drawer.Indent. While a drawer is open the indent is transformed, so its fixed descendants stop following the viewport. At rest nothing is transformed, so the indent has no effect on fixed elements.
  • Added theming knobs for the indent: --forte-drawer-indent-bg, --forte-drawer-indent-scale, --forte-drawer-indent-travel, --forte-drawer-indent-radius, --forte-drawer-indent-duration, --forte-drawer-indent-ease, --forte-drawer-indent-exit-duration and --forte-drawer-indent-exit-ease. The background part has --forte-drawer-indent-background-color. The page does not scale or round under reduced motion, because the scale and radius are gated on motion. The new parts carry data-forte="drawer-indent" and data-forte="drawer-indent-background".
  • Changed the hairline border so it is drawn on all four sides of every drawer. An edge drawer previously drew it only on the side facing into the page. During an overdrag the outer side now shows as a line between the surface and the skirt beyond it. A drawer with another drawer open over it still has its whole ring painted in the scrim color. --forte-drawer-border-width now applies to all four sides.
  • Added hairline to Drawer.Popup (default true). Pass hairline={false} to drop the line, for a surface separated by its shadow and the scrim alone. The popup is then marked data-no-hairline. The border is made transparent rather than zero-width, so nothing shifts and forced-colors mode keeps its system-colored boundary. Use this instead of setting --forte-drawer-border-width to 0px, which would remove that boundary too.

v1.12.1

Released Compare with the previous release

Drawer

  • Every drawer now draws a hairline border, not just one with backdrop={false}. An edge drawer draws it only on the side that faces into the page. The other three sides stay transparent, so an overdrag does not expose a seam against the bezel. A floating drawer draws all four sides. A drawer with another drawer open over it still has its whole ring painted in the scrim color, so a receding parent gets no bright outline. --forte-drawer-border-width and --forte-drawer-border-color now apply to every drawer.
  • data-no-backdrop is still set on the popup when backdrop={false}. Nothing in the stylesheet reads it any more, so it is now only a hook for styling scrimless drawers.

v1.12.0

Released Compare with the previous release

  • Added onSettle to Carousel.Root. It is called with the index and the change reason once the track has come to rest on a slide, after the glide that a drag, a control, autoplay or a clamp started, or on the next frame when there is no glide. A glide that a drag catches or another move retargets never settles, and only the last one is reported. Use it for work that would stall the glide, such as mounting something heavy for the new slide, instead of onIndexChange, which fires on release.
  • Added a data-settling attribute on the carousel root. It is present from the moment a move starts until the track has settled, and is absent while dragging. It lets plain CSS style the in-between state.

v1.11.3

Released Compare with the previous release

  • Fixed a touch swipe swallowing the next tap. After a swipe, the tap that followed on a button inside a slide was cancelled, so the button took two taps. A new press now clears the pending click suppression, and a keyboard-activated click (Enter or Space on a button, or element.click()) is never suppressed.

v1.11.2

Released Compare with the previous release

Accordion

  • A disabled Accordion.Trigger is now a native disabled button, so it leaves the tab order instead of being focusable. This comes from the @base-ui/react 1.9 upgrade.

Collapsible

  • A disabled Collapsible.Trigger is now a native disabled button, so it leaves the tab order instead of being focusable. This comes from the @base-ui/react 1.9 upgrade.

ContextMenu

  • ContextMenu.Root now forwards Base UI's onItemHighlighted prop, and its documentation lists it.
  • The actionsRef documentation now matches Base UI 1.9. It exposes close() to close the open panel. unmount() ends the closing phase after an exit animation you drive yourself, and you must call eventDetails.preventUnmountOnClose() in onValueChange first.

General

  • Upgraded the @base-ui/react dependency from ^1.8.0 to ^1.9.0.

Full history

This page carries the 10 most recent releases. The 31 releases before them — back to v1.0.0-alpha.1 on August 30, 2026 — are in CHANGELOG.md on GitHub, along with everything above.