All notable changes to this project will be documented in this file.
For v0.x changelog, see the v0 branch
1.38.1 - 2026-03-25
-
File Upload: Automatically reject duplicate files with
FILE_EXISTSerror. Previously, uploading the same file twice was silently accepted and deleting one duplicate removed all of them. -
Toast: Restore
role="region"on the toast group element. The role was previously removed to reduce screen reader landmark noise, but this caused an axearia-prohibited-attrviolation sincearia-labelis not permitted on adivwithout a valid role. -
Tour
- Fix step navigation events (
next,prev,setStep) firing when the tour is inactive, bypassing thestartflow - Fix popper styles not being cleaned up when transitioning from a tooltip step to a dialog/non-tooltip step
- Fix step navigation events (
- Core: Validate compound states at machine creation — throw if a state has child states but no
initial, or ifinitialreferences a nonexistent child.
1.38.0 - 2026-03-24
-
Date Picker
- Add missing range data attributes (
data-range-start,data-range-end,data-in-hover-range,data-hover-range-start,data-hover-range-end) to month and year cell triggers for range picker mode TableCellStatenow includesfirstInRange,lastInRange,inHoveredRange,firstInHoveredRange,lastInHoveredRange, andoutsideRange- Range boundary dates now announce "Starting range from {date}" and "Range ending at {date}" for better screen reader context
- Add missing range data attributes (
-
Drawer
-
Add
descriptionanatomy part witharia-describedbysupport on the content element -
Add
SwipeAreapart for swipe-to-open gestures from screen edges<div {...api.getSwipeAreaProps()} />
-
Add
getDescriptionProps()andgetSwipeAreaProps()to the connect API -
Require intentional swipe movement before showing the drawer (no flash on pointer down)
-
Smooth settle animation from release point to fully open position
-
Add cross-axis scroll preservation to prevent drawer drag when scrolling horizontally
-
Add initial focus management for non-modal mode
-
-
Pin Input
- No more holes: Delete and Backspace now splice values left instead of leaving empty gaps. Deleting "2" from
[1, 2, 3]yields[1, 3, ""]— not[1, "", 3]. Cut (Ctrl+X) behaves the same way. - Smarter focus management: Backspace always moves back, click and ArrowRight are clamped to the insertion point, same-key skip advances focus, and roving tabIndex treats the entire pin input as a single tab stop
- New keyboard shortcuts: Home/End to jump to first slot or last filled slot,
enterKeyHintshows "next" on intermediate slots and "done" on the last - Add
autoSubmitprop to automatically submit the owning form when all inputs are filled - Add
sanitizeValueprop to sanitize pasted values before validation (e.g. strip dashes from "1-2-3")
- No more holes: Delete and Backspace now splice values left instead of leaving empty gaps. Deleting "2" from
-
Date Picker: Fix inverted year cell
selectablestate that caused years outside the visible decade or min/max range to appear selectable -
Dialog
- Set
pointer-events: noneon positioner in non-modal mode so the page stays interactive - Add initial focus management for non-modal mode (mirrors popover behavior)
- Fix
aria-modalto reflect actualmodalprop value instead of hardcodedtrue
- Set
-
Drawer: Fix swipe-to-dismiss in controlled mode (
open: truewithoutonOpenChangenow blocks dismiss) -
Floating Panel: Fix
closeOnEscapenot working when focus is on a child element (e.g., input) inside the panel -
Focus Trap: Fix focus trapping when the content has a single effective tab stop, such as a native radio group. Handle disconnected
initialFocusnodes more safely. -
Interact Outside: Fix issue where nested popovers and select within popovers didn't toggle correctly in Safari due to
focusinevents racing with pointer interactions -
Splitter: Fix global cursor styles when splitter is used in a shadow root
-
Date Picker:
DayTableCellState.formattedDateremoved — usevalueTextinstead (inherited fromTableCellState) -
Drawer: Set
pointer-events: noneon positioner in non-modal mode so the page stays interactive
1.37.0 - 2026-03-16
-
Date Input
- Add paste support for ISO 8601 date strings
- Add
api.focus()method for programmatic focus - Add
createCalendarprop for non-Gregorian calendar systems (e.g., Buddhist, Persian) - Add
isDateUnavailableprop to mark specific dates as invalid
-
Table of Contents: Initial release of table of contents machine that highlights active headings as you scroll
-
Dialog, Drawer: Improve focus restoration by preferring the trigger element as a stable fallback return target after remount cycles
-
Floating Panel: Fix
Escapeduring drag or resize so floating panels restore their previous position or size correctly in non-React frameworks -
Preact: Fix Fast Refresh lifecycle edge cases where machine cleanup could hydrate from stale state and skip expected effect re-application
-
React
- Re-run entry actions after StrictMode remount
- Fix Fast Refresh lifecycle edge cases where machine cleanup could hydrate from stale state and skip expected effect re-application
-
Radio Group: Fix missing
aria-labelledbyon radio hidden input, ensuringgetByRole('radio', { name: '...' })works in testing tools like Playwright -
Toast: Improve toast group accessibility by removing
role="region"landmark to reduce screen reader noise and restructuringaria-labelfor more natural output (e.g., "Notifications, bottom (Alt+T)")
1.36.0 - 2026-03-11
-
Clipboard, Navigation Menu, Popover, Select, Timer, Toast, Tree View: Add
translationsprop for localization of hardcoded accessibility labels -
Listbox
- Add
keyboardPrioritytogetInputPropsto control whether input key handling prioritizes text editing or list navigation forHome/Endand horizontal arrows in grid collections - Add
highlightFirst,highlightLast,highlightNext, andhighlightPreviousto the API for programmatic highlight navigation
- Add
-
Tags Input: Add
allowDuplicatesprop to allow duplicate tagsuseMachine(tagsInput.machine, { allowDuplicates: true, })
-
Carousel
- Fix controlled carousel inside dialog jumping or skipping pages
- Fix carousel navigation inside CSS-transformed containers (e.g., dialogs with open/close animations)
- Fix scroll position drifting when container layout shifts (e.g., scrollbar removal)
-
Color Picker: Preserve vertical slider orientation on pointer updates
-
Date Input: Improve focus management
-
Floating Panel
- Fix
opentaking precedence overdefaultOpenduring initialization - Fix
api.setPositionandapi.setSizeto work independently of drag/resize state - Fix React
Maximum update depth exceededwhen content usesResizeObserver - Fix maximize/minimize restore reverting to
(0, 0)in controlled mode - Fix Escape during drag/resize to cancel and revert to original position/size
- Fix
-
Menu: Fix trigger to keep
aria-expanded="false"when closed -
Pin Input: Fix crash when typing the same character in a completed pin input on frameworks that use native
inputevent (Svelte, Vue, etc.) -
Radio Group, Tabs: Fix indicator only animating when value changes, not on initial render or resize
-
Vanilla: Fix handling of controlled mode
1.35.3 - 2026-03-02
- Date Input: Initial release of date input machine
-
Carousel
- Fix issue where carousel inside a Portal (e.g., Dialog) computes incorrect page count due to incomplete DOM layout
at mount time. The item-group container is now observed with a
ResizeObserver, so snap points are recalculated when the container resizes - Keep page and indicators in sync after drag release and scroll settling
- Handle rapid mixed interactions (drag, wheel, buttons, indicators) more consistently
- Keep page state valid when
slidesPerPage,slidesPerMove, direction, or orientation change - Make
slidesPerMove(auto,1,2) progression more predictable
- Fix issue where carousel inside a Portal (e.g., Dialog) computes incorrect page count due to incomplete DOM layout
at mount time. The item-group container is now observed with a
-
Combobox: Improve controlled-mode synchronization and keep callback/item resolution behavior consistent across filtered collections
-
Listbox: Improve controlled-mode synchronization and keep callback/item resolution behavior consistent across filtered collections
-
Select: Improve controlled-mode synchronization and keep callback/item resolution behavior consistent across filtered collections
- I18n Utils:
formatTimenow acceptsamLabelandpmLabelas separate options instead of the previousamPmLabelsobject
1.35.2 - 2026-02-26
- Fix CJS build issues across all packages
1.35.1 - 2026-02-26
- Core: Add support for XState-style
#idtransition targets.#...targets now resolve by state nodeid, making cross-level transitions explicit.
-
Color Picker: Fix a regression where clicking the color picker trigger while open did not close the popover
-
Docs: Fix ESM JSON imports for Node loader compatibility. Add
with { type: "json" }import attributes and set build target tonode20.10so the ESM output works when loaded innext.config.mjs, velite, or other Node ESM contexts withoutERR_IMPORT_ATTRIBUTE_MISSING
1.35.0 - 2026-02-26
- Date Picker
- Add non-Gregorian calendar support via
createCalendarprop- Support Persian, Buddhist, Islamic, Hebrew, and other calendar systems
- Month names, year ranges, formatters, and navigation now respect the active calendar
- Add
data-typeattribute to weekend table header and cell
- Add non-Gregorian calendar support via
-
Combobox: Fix
onValueChangereturning emptyitemsarray when using controlled value -
Popover: Fix nested popover z-index layering by running
trackDismissableElementbeforetrackPositioning -
Toast: Fix types to ensure
parent/indexare exposed as props andexpand/collapseare exposed on the store -
Vanilla: Fix
mergePropsto ensure thestyleprop is always a string
1.34.0 - 2026-02-19
-
Cascade Select [New]: Initial release of cascade select state machine
-
Date Picker
- Add
focusoption toapi.clearValue({ focus?: boolean }) - Add
api.setTime(time, index?)for date-time picker support - Add
maxSelectedDatesprop to limit the number of selected dates inmultipleselection mode - Add
api.isMaxSelectedto check if the maximum number of dates has been selected - Add
openOnClickprop to open the calendar when clicking the input field (defaults tofalse) - Add
showWeekNumberssupport to display an ISO 8601 week number column in the day view
- Add
-
Date Utils: Add
getWeekOfYearutility for week number calculation -
Drawer [New]: Initial release of the drawer state machine. Replaces the previous
bottom-sheetimplementation and API naming -
I18n Utils: Add
formatTimeutility for locale-aware 12h/24h time formatting with optional seconds -
Popover: Add
sizeMiddlewarepositioning option to optionally disable the size middleware for better scroll performance -
Select: Add
autoCompleteprop for browser autofill hints (e.g.,"address-level1"for state fields)
-
Combobox
- Fix
aria-selectedbeing set on highlighted items instead of selected items, improving screen reader announcements - Fix
selectedItemsgetting out of sync withvaluewhen controller ignores selection in controlled mode - Fix item disabled state not accounting for root-level
disabledprop
- Fix
-
Date Picker
- Fix
api.selectToday()sending incorrect value format to state machine - Preserve time/timezone when selecting new dates (
CalendarDateTimeandZonedDateTime) - Export
DateValuetype locally instead of re-exporting from@internationalized/date(v3.10.0+ compatibility) - Improve focus management in trigger-only mode: focus now correctly returns to the trigger element after selecting a date or clearing the value
- Fix
-
Date Utils: Fix
constrainValuestripping time fromCalendarDateTime/ZonedDateTimevalues -
Dialog: Fix issue where non-modal dialog closes on outside click even when
modalis set tofalse -
Listbox: Fix DOM IDs
-
Number Input: Fix issue where explicit
invalidprop was ignored when value is out of range. Theinvalidprop now takes precedence over the internalisOutOfRangecomputation -
Popover: Improve performance by reducing style recalculations when scrolling with heavy content
-
Select: Fix issue where autofill does not update value when the hidden select value changes
-
Svelte: Fix
state_unsafe_mutationwarning that occurs due to state transition during component teardown -
Toast: Fix TypeScript compilation errors when building projects that use
@zag-js/toast
1.33.1 - 2026-01-28
-
Date Picker: Fix
visibleRangeTextto show correct format based on current view (year/month/day) -
Dismissable: Fix issue where closing a nested dialog/popover would incorrectly close its parent layers
-
File Upload: Fix accessibility violations in file upload component
- Remove invalid
aria-readonlyfrom dropzone (not valid forrole="button") - Add
aria-hiddento hidden input to exclude from accessibility tree
- Remove invalid
-
Menu: Fix glitchy submenu behavior when hovering between trigger items quickly
1.33.0 - 2026-01-24
-
Scroll Area: Add overflow CSS variables to the viewport element for creating scroll fade effects:
--scroll-area-overflow-x-start: Distance from horizontal start edge in pixels--scroll-area-overflow-x-end: Distance from horizontal end edge in pixels--scroll-area-overflow-y-start: Distance from vertical start edge in pixels--scroll-area-overflow-y-end: Distance from vertical end edge in pixels
-
Slider: Add
thumbCollisionBehaviorprop to control how thumbs behave when they collide during pointer interactions:none(default): Thumbs cannot move past each other; excess movement is ignored.push: Thumbs push each other without restoring their previous positions when dragged back.swap: Thumbs swap places when dragged past each other.
-
Steps: Add validation and skippable step support:
isStepValid(index): Block forward navigation when step is invalid (linear mode)isStepSkippable(index): Mark steps as optional, bypassing validationonStepInvalid({ step, action, targetStep }): Callback when navigation is blockedapi.isStepValid(index)/api.isStepSkippable(index): Check step stateitemState.isValid(): Lazy validation check per step
-
Tags Input: Add
placeholderprop that is applied to the input only when there are no tags -
Tooltip: Add
data-instantattribute to tooltip content to indicate when animations should be instant (e.g., when switching between tooltips quickly)
-
Auto Resize: Fix issue where change event is not emitted after clearing a controlled textarea programmatically
-
Collection, Tree View: Fix initial focus issue when the first node or branch is disabled. Added
skipoption togetFirstNode()(matchinggetLastNode()) to respect collapsed branches. The initial focus now correctly targets the first visible non-disabled node. -
Color Picker, Color Utils: Fix color not updating in controlled mode when selecting black shades.
- Fixed equality check to compare actual channel values instead of CSS string output
- Auto-detect
defaultFormatfrom initial color value instead of hardcoding"rgba"
-
Floating Panel: Fix issue where double-clicking title bar while minimized would incorrectly maximize instead of restore
-
Image Cropper
- Fix issue where
reset()destroys the cropper area - Fix issue where changing
aspectRatioorcropShapeprops doesn't update the crop instantly - Add symmetric resize support when holding
Altkey during pointer drag - Fix panning bounds in fixed crop mode at various zoom levels
- Fix race condition where initial crop may not compute on page reload
- Fix issue where
-
Number Input: Fix cursor positioning when clicking label or after scrubbing. The cursor now moves to the end of the input value instead of the start.
-
Pagination: Fix issue where next trigger was not disabled when
countis0 -
Slider: Fix pointer movement when dragging slider thumb from its edge in
thumbAlignment="contain"mode. The value calculation now correctly accounts for thumb inset, ensuring consistent behavior when clicking on the track to set a value or dragging the thumb from any position. -
Switch: Fix issue where
api.toggleChecked()doesn't work as expected -
Toast: Fix issue where toasts created before the state machine connects are not shown
-
Tour: Fix janky scroll behavior when navigating between tour steps. Changed
scrollIntoViewto useblock: "nearest"instead ofblock: "center"so the page only scrolls when the target element is not already visible. -
Vanilla
- Fix issue where vanilla machines do not have the option to change their props during runtime
- Fix issue where some
aria-attributes were toggled as boolean attributes and not as attributes with value strings
1.32.0 - 2026-01-02
-
Date Picker: Add
onVisibleRangeChangecallback to notify when the visible date range changes. This callback fires when:- Clicking next/prev triggers
- Selecting a month from the month dropdown
- Selecting a year from the year dropdown
- Focusing a date outside the current visible range
- Any other action that changes the visible range
-
File Upload
- Add
readOnlyprop to prevent file modifications while keeping component visually active - Add
maxFilesReachedandremainingFilesto exposed API
- Add
-
Vanilla: Initial release of the vanilla JavaScript adapter for Zag.js
VanillaMachine- Class-based wrapper for zag machines with start/stop lifecyclenormalizeProps- Converts React-style props to vanilla DOM attributesspreadProps- Spreads props onto DOM elements with event listener management
import { VanillaMachine, normalizeProps, spreadProps } from "@zag-js/vanilla" import * as toggle from "@zag-js/toggle" const machine = new VanillaMachine(toggle.machine, { id: "toggle" }) machine.start() const api = toggle.connect(machine.service, normalizeProps) spreadProps(buttonEl, api.buttonProps) machine.stop()
-
Carousel: Fix issue where next/prev carousel buttons and indicators don't work when
dir="rtl"is set -
File Upload
- Fix issue where using
api.setClipboardFilesdoesn't runtransformFilesand validation functions - Fix item element IDs to use
name-sizecombination for uniqueness (prevents ID collisions with same-named files)
- Fix issue where using
-
Focus Trap: Fix focus trap crash when clicking labels in dialogs
-
Pin Input: Fix issue in Vanilla.js where paste does not work due to
maxlength="1"truncating clipboard data before the input event -
Tour: Fix issue where input elements inside the spotlight target were not interactive. The focus trap now includes both the tour content and the spotlight target as containers, allowing users to interact with elements inside the highlighted area
1.31.1 - 2025-12-10
- Accordion, Menu: Fix issue where querying elements by
aria-controlsattribute could fail when lazy mounting the content - Rating Group: Fix issue where rating group becomes unfocusable via keyboard when value is 0
1.31.0 - 2025-12-05
-
Number Input: Add
onValueCommitcallback that fires when the input loses focus or Enter is pressed -
Pagination
- Add
getFirstTriggerProps()andgetLastTriggerProps()methods for navigating to first/last page - Add
boundaryCountparameter for controlling boundary pages (start/end) - Implement balanced pagination algorithm for consistent UI elements
- Maintain visual consistency with max 7 elements regardless of total pages
- Add
-
Tree View: Added
scrollToIndexFnprop to enable keyboard navigation in virtualized trees
-
Color Picker
- Add
role="dialog"to color picker content when not inline to ensure properaria-controlsdetection - Add
aria-haspopup="dialog"to color picker trigger when not inline for better accessibility
- Add
-
Date Picker: Fix issue where date picker input does not update format when locale changes
-
Listbox
- Fix issue in React where filtering items with an input would throw a
flushSync was called from inside a lifecycle methodwarning - Fix issue where
data-highlightedwasn't applied to the first item when usingautoHighlightwith input filtering
- Fix issue in React where filtering items with an input would throw a
-
Number Input
- Fixed issue where input element doesn't sync when
formatOptionschanges dynamically - Ensure cursor position is preserved when
Enterkey is pressed and formatting is triggered - Fix cursor jumping to start when value is changed externally via props while user is typing
- Fixed issue where input element doesn't sync when
-
Pagination: Fix ellipsis showing when only 1 page gap
-
Radio Group
- Fix issue where
radio-groupmachine no longer shows theindicatorprematurely - Improve accessibility of radio group by adding
invalidandrequiredprops with correspondingdata-*andaria-*attributes
- Fix issue where
-
Tabs: Fix issue where
tabsmachine no longer shows theindicatorprematurely -
Tooltip: Fix tooltip not showing when scrolling with pointer over trigger
-
Collapsible, Presence, Tour: Fix machines setting reactive state in exit actions
-
Tree View:
getVisibleNodes()now returns{ node, indexPath }[]instead ofnode[]. Returning the index path perhaps the most useful use of this function, hence the change.// Before const nodes = api.getVisibleNodes() nodes.forEach((node) => console.log(node.id)) // After const visibleNodes = api.getVisibleNodes() visibleNodes.forEach(({ node }) => console.log(node.id))
1.30.0 - 2025-11-26
-
Date Picker
- Add support for
requiredandinvalidprops - Exposed
disabledandinvalidin the date picker API for better state access
- Add support for
-
Navigation Menu
- Add
getItemIndicatorPropspart for indicator styling - Add
closeOnClickprop togetLinkPropsto control whether the navigation menu closes when a link is clicked (defaults totrue)
- Add
-
Floating Panel
- Fix issue where
dirprop is ignored. Thedirattribute is now properly delegated to all floating panel parts - Ensure double-click behavior doesn't trigger when
resizable={false}is set - Double-click behavior now checks
event.defaultPreventedto allow users to prevent the default behavior by callingevent.preventDefault()
- Fix issue where
-
Navigation Menu
- Avoid focusing the trigger when hovering over it
- Separate
ContentPropsfromLinkPropsforgetContentProps- previously it incorrectly usedLinkProps
-
Number Input: Improve controlled usage by ensuring input element stays synced with controlled value
-
Navigation Menu: Removed
getIndicatorTrackProps- usegetListPropsinstead (list now includesposition: relative)// Before <div {...api.getIndicatorTrackProps()}> <div {...api.getListProps()}> {/* items */} </div> </div> // After <div {...api.getListProps()}> {/* now acts as indicator track */} {/* items */} </div>
1.29.1 - 2025-11-22
-
Floating Panel
- Fix issue where resize trigger with
naxis was not explicitly set totop: 0 - Fix issue where
draggableandresizableoptions were not respected when set tofalse
- Fix issue where resize trigger with
-
Presence: Fix regression where UNMOUNT transition might not be called consistently
1.29.0 - 2025-11-19
-
Carousel, Color Picker, Combobox, Date Picker, Select: Add
valuetoOpenChangeDetailsfor better context in change handlers -
Splitter: Add
getResizeTriggerIndicatorto render an indicator when resizing -
Toast: Expose viewport offset as CSS variables (
--viewport-offset-left,--viewport-offset-right,--viewport-offset-top,--viewport-offset-bottom) on the toast group element
-
Carousel: Fix dragging not working after scrolling with mouse wheel when
allowMouseDragis enabled -
Combobox: Fix
onHighlightChangenot being invoked when collection is filtered to empty results. The callback now correctly receives{ highlightedValue: null, highlightedItem: null }when the collection becomes empty -
File Upload: Fix issue where clicking on non-interactive children (icons, text) inside the dropzone doesn't open the file picker
-
Radio Group: Fix inconsistent application of
data-focus-visibleanddata-focusattributes -
Splitter: Fix disabled splitter showing resize cursor and allowing dragging
1.28.0 - 2025-11-12
- Carousel: Add support for
autoSizeprop to allow variable width/height slide items.
-
Carousel: Fix dragging behavior that stops working after switching browser tabs or scrolling the page. The issue was caused by incorrectly checking
event.buttoninstead ofevent.buttonsto detect interrupted drag operations. -
Date Picker: Fix issue where the range date picker crashes when typing the end date first and blurring the input field multiple times.
-
Image Cropper
- Fix issues with the controlled
zoomprop not functioning as expected - Clamping offset for non-fixed crop area should be based on viewport rectangle
- Fix issues with the controlled
-
Presence: Fix a bug where elements get stuck in unmountSuspended state during rapid hovering
-
Radio Group, Tabs: Fix indicator prematurely showing when rect has not been resolved yet
-
Store: Fix "Illegal invocation" errors by excluding native objects with special
thisbindings from being proxied. -
Tabs: Fix tabs indicator position not updating when inactive tabs change size.
-
Tags Input: Fix issue where item delete trigger doesn't have
data-*attached
1.27.1 - 2025-11-04
-
Combobox
- Fix focus stealing in controlled open mode
- Remove problematic
aria-hiddenbehavior to allow interaction with other page elements
-
All Components: Export missing types across all machine packages
1.27.0 - 2025-11-01
- Dialog, Popover: Improve support for shadow DOM in interact outside and focus trap detection.
-
Marquee: Fix Firefox flicker, use margin spacing, add GPU acceleration, and add
itempart. -
Popover: Improve support for shadow DOM in interact outside and focus trap detection.
-
Dialog: Fix issue where setting
scrollbar-gutter: stablein CSS caused an unwanted gap and layout shift when opening dialogs. -
Slider: Fix issue where programmatic value changes do not trigger the
onValueChangeEndcallback. This affects thesetThumbValue,setValue,increment, anddecrementAPI methods.
1.26.5 - 2025-10-29
-
Date Picker: Fix crash in range date picker when typing end date first by adding
null/undefinedchecks when accessing date properties. -
Image Cropper
- Fix not working resize API
- Export missing types
- Make the image cropper responsive
-
Radio Group: Revert to using
offsetLeft/offsetTopto fix indicator positioning in scrollable containers. -
Tabs: Revert to using
offsetLeft/offsetTopto fix indicator positioning in scrollable containers. -
Tour
- Fix issue where effects were not cleanup correct.
- Fix issue where wait step doesn't work correctly.
- Validate the configured steps on mount to ensure they are valid.
1.26.4 - 2025-10-23
-
Image Cropper [New]: Initial release of image cropper state machine
-
Marquee [New]: Initial release of marquee component for continuously scrolling content
-
Angle Slider: Fix issue where clicking and dragging the angle-slider thumb from a non-center position causes unexpected value jumps. The thumb now maintains its relative position from the initial click point throughout the drag operation, providing more intuitive dragging behavior.
-
Slider: Fix issue where slider thumb offset changes dynamically during drag, causing unexpected value jumps. The thumb now maintains a constant offset from the pointer throughout the drag operation, matching the initial grab position.
-
Svelte: Refactor
mergePropsto return the class values as an array, this delegates the resolution to Svelte's native class handling, which usesclsxinternally. This ensures proper support for conditional classes, arrays, and objects. -
Toast: Fix issue in Solid.js where toasts collapse immediately when dismissing while hovering, by tracking pointer state and temporarily ignoring spurious mouse events during DOM mutations using requestAnimationFrame.
1.26.3 - 2025-10-18
-
Angle Slider: Fix accessibility violation where the slider thumb element lacked an accessible name. The thumb now supports
aria-labelandaria-labelledbyprops, and automatically falls back to the label element's ID for proper ARIA labeling. -
Select: Fix accessibility violation where the required state was not set correctly to on the trigger.
-
Tags Input: Fix issue where entering a custom tag with combobox integration required pressing
Entertwice. The tags-input now correctly handles custom values when the combobox has no highlighted item (aria-activedescendantis empty), allowing the tag to be added on the firstEnterpress.
1.26.2 - 2025-10-14
-
Checkbox
- Fix issue where setting initial checked state to
indeterminatedoesn't work - Ensure
api.checkedStatereturns the correct checked state (boolean | "indeterminate")
- Fix issue where setting initial checked state to
-
Collapsible: Fix issue where
dirprop value was hardcoded toltrinstead of using the provided value -
Combobox: Fix issue where controlled single-select combobox does not propagate its initial value to
inputValue -
Listbox: Fix issue where pressing Enter key when no highlighted item still calls
event.preventDefault() -
Radio Group: Refactor to use
getBoundingClientRect()for precise indicator positioning -
Slider
- Fix issue where slider could stop abruptly when scrubbing thumb
- Fix issue where range slider thumbs become stuck when dragged to the same position without
minStepsBetweenThumbs
-
Tabs: Refactor to use
getBoundingClientRect()for precise indicator positioning -
Tags Input: Fix issue where
maxLengthdoesn't apply to the edit input as well
1.26.1 - 2025-10-08
- Tree View
- Fixed issue where pressing
F2on any tree node would lock navigation and prevent selecting other nodes. - The rename feature now requires the
canRenamecallback to be explicitly provided, making it opt-in rather than opt-out.
- Fixed issue where pressing
1.26.0 - 2025-10-06
-
Tree View: [Experimental] Add support for renaming tree node labels with validation and control features.
This feature enables users to edit tree node labels inline, unlocking use cases like file explorers, folder management systems, content hierarchies, and any tree-based interface where users need to rename items.
Key Features:
- Press
F2on any node to enter rename mode - Input is automatically focused and synced with current label
- Press
Enterto submit orEscapeto cancel - Blur event automatically submits changes
- IME composition events are properly handled for international input
Validation & Control:
canRename- Control which nodes are renameable based on node type or custom logiconRenameStart- Called when rename mode starts (useful for analytics, showing hints)onBeforeRename- Validate rename before accepting (e.g., prevent duplicates, empty names)- Empty name prevention - Automatically stays in rename mode if submitted name is empty/whitespace
- Label trimming - Labels are automatically trimmed before being passed to callbacks
onRenameComplete- Handle the rename and update your collection
Styling & Visual State:
data-renamingattribute - Added to both item and branch elements when in rename mode for easy stylingnodeState.renaming- Boolean property to check if a node is currently being renamed
- Press
-
Editable: Fix issue where input value fails to revert after repeated full deletion
-
Focus Visible: Fix
"Cannot assign to read only property 'focus'"console error by gracefully handling environments whereHTMLElement.prototype.focusis non-configurable. -
Listbox: Fix
splitPropsto avoid partial -
Presence: Fix race condition where dialog remains closed when
openprop rapidly changes fromtruetofalsetotrue -
Solid: Fix issue where transition actions received stale event data
1.25.0 - 2025-09-28
-
Collapsible: Add support for
collapsedHeightandcollapsedWidthprops to control the dimensions of the collapsible content when in its collapsed state. -
Focus Trap: Allow elements referenced by
aria-controlsto be included in the trap scope. This makes it possible for menus, popovers, etc. to be portalled and work correctly. -
Pagination: Add
getPageUrlprop for generatinghrefattributes when using pagination as links.
const service = useMachine(pagination.machine, {
type: "link",
getPageUrl: ({ page, pageSize }) => `/products?page=${page}&size=${pageSize}`,
})- Slider: Export
splitMarkerPropshelper.
-
Scroll Area: Fix RTL horizontal scrollbar positioning on Safari
-
Slider: Fix issue where slider continues dragging when disabled during drag operation.
-
Switch: Fix issue where
data-activeis inconsistently applied whendisabledstate changes at runtime
1.24.2 - 2025-09-18
-
Date Picker: Fix issue where year range picker doesn't show the hovered range
-
Date Utils:
- Fix issue where quarter presets returns incorrect date
- Fix issue where year range picker doesn't show the hovered range
-
I18n Utils:
- formatBytes: Support
unitSystemproperty to allow changing between decimal (1000 bytes) and binary (1024 bytes) systems.
- formatBytes: Support
-
Number Input: When
formatOptionsis used (likestyle: "currency"), the cursor would jump to the end of the input when typing in the middle. The cursor now maintains its relative position during formatting changes. -
Pin Input: Fix issue where using the keyboard shortcuts
Cmd+BackspaceandCmd+Deleteto delete text in pin inputs would insert "undefined" instead of clearing the field. -
Scroll Area: Fix issue where resize tracking was not observing the root element, which caused the scrollbar to not update when the root element's size changed.
1.24.1 - 2025-09-14
- Core: Fix issue where
mergePropsthrows whenpropsis undefined or null
1.24.0 - 2025-09-13
- Combobox: Add
alwaysSubmitOnEnterprop to allow bypassing the default two-step behavior (Enter to close combobox, then Enter to submit form) and instead submit the form immediately on Enter press. This is useful for single-field autocomplete forms where Enter should submit the form directly.
-
Editable: Allow text selection in editable preview when
autoResizeis enabledPreviously, when
autoResizewas set totrue, the preview element haduserSelect: "none"applied, preventing users from selecting text. This has been fixed by removing theuserSelectstyle property. -
File Upload: Fix regression where clicking the trigger doesn't open the file picker when used within the dropzone
-
Hover Card: Change default delay values for hover card to improve accessibility.
openDelay: from700msto600ms
-
Menu: Fix issue where keyboard activation of menu items with
target="_blank"would open two tabs -
Svelte: Fix Svelte warning about state reference capturing initial value instead of current reactive state
-
Tooltip: Change default delay values for tooltip to improve accessibility. Learn more
openDelay: from1000msto400mscloseDelay: from500msto150ms
1.23.0 - 2025-09-11
- Dismissable: Add support for layer types in dismissable layer stack. Layers can now be categorized as
dialog,popover,menu, orlistbox. This enables:data-nestedattribute on nested layers of the same typedata-has-nestedattribute on parent layers with nested children of the same type--nested-layer-countCSS variable indicating the number of nested layers of the same type
-
Core: Fix issue where
mergePropsstrips symbols after merging -
Dom Query:
- Fix issue where
isActiveElementchecks don't consider the Shadow DOM - Fix issue where
getActiveElementreturnsactiveElementrather thannullfor focusable web components with no focusable children
- Fix issue where
-
Menu: Fix issue where hovering a partially visible item with pointer causes it to scroll into view
-
Tabs: Fix issue where
idsforitemandcontentcould not be customized -
Toast: Allow creating a toast store without any arguments
// before const store = toast.createStore({}) // after const store = toast.createStore()
1.22.1 - 2025-08-27
-
Collection: Fix issue where disabled items could be reached via typeahead
-
Date Picker: Fix issue where datepicker doesn't revert to a valid value when the input value exceeds the min/max and blurred
-
Tags Input: Fix issue where highlighted item doesn't clear when tabbing out of the input to an external button within the
controlpart.
1.22.0 - 2025-08-26
- Hover Card: Add support for
disabledprop
-
Color Picker: Fix issue where color picker was not working correctly in RTL mode
-
Dismissable: Expose
onRequestDismisscustom event handler for event a parent layer requests the child layer to dismiss. If prevented viaevent.preventDefault(), the child layer will not dismiss when the parent layer is dismissed. -
Number Input
- Omit the input
patternwhenformatOptionsis provided. This prevents native pattern validation from conflicting with formatted values (e.g., currency or percent). - Handle empty values consistently across all format options.
- Add
data-scrubbingattribute to the number input parts.
- Omit the input
-
Tooltip
- Set
closeOnPointerdowntofalsewhencloseOnClickis set tofalse - Reduce bundle size by replacing
@zag-js/storedependency with a lightweight store implementation.
- Set
1.21.9 - 2025-08-23
- Async List:
- Fixed critical race conditions and dual operations in sort functionality that could cause stale data overwrites and unexpected behavior
- Fixed event handling during async operations - users can now properly interrupt sorting with RELOAD, FILTER, or new SORT events
- Enhanced
SortDetailsinterface withfilterTextparameter for consistent filtering context across local and server-side operations
1.21.8 - 2025-08-22
-
Date Picker:
- Clear hovered range state after completing range selection instead of waiting for pointer to leave the calendar area.
- Fix issue where month and year select labels don't update correctly when using
min/maxconstraints. - Expose
disabledonapi.getMonths()andapi.getYears()results to indicate options out of range for current constraints.
-
Listbox:
- Fix issue where first enabled item should be highlighted by default when listbox receives focus and no item is currently highlighted.
- Add
getElementtoscrollToIndexFndetails - Track collection changes and clear
highlightedValueif the item is no longer in the collection.
-
Scroll Area:
- Avoid detecting hover state from portalled descendants.
- Add
data-draggingattribute to scroll area parts.
-
Select: Add
getElementtoscrollToIndexFndetails -
Combobox: Add
getElementtoscrollToIndexFndetails
1.21.7 - 2025-08-19
- Highlight Word: Add
exactMatchoption that enables whole-word matching using regex word boundaries.
-
Menu: Fix context menu repositioning logic
-
Scroll Area: Add
data-hoverto scroll area
1.21.6 - 2025-08-17
-
Menu: Fix context menu positioning bug where reopening at the same coordinates fails to reposition
-
Scroll Area: Rename
data-hoveringtodata-hoverfor consistency
1.21.5 - 2025-08-16
- Scroll Area:
- Fix issue where scroll area thumb applies width/height incorrectly
- Add
data-overflow-*to content and corner - Add custom easing function support for smooth scrolling
1.21.4 - 2025-08-16
-
Scroll Area: Ensure types are exported and fix incorrect
@zag-js/dom-query/src/queryimport -
ListCollection
- Avoid recomputing groups on every call to
at()andindexOf() - Fixed bug in
find()method (was checking!= nullinstead of!== -1)
- Avoid recomputing groups on every call to
-
GridCollection: Avoid recomputing rows on every call to
getRows() -
Menu: Add
data-stateattribute for context menu trigger
1.21.3 - 2025-08-14
- Listbox: Add support for navigating grid collections
-
Async List: Improve type inference for descriptors
-
Framework Components: Improve runtime performance of components by removing refs/events from stateful to non-stateful objects (affects Svelte, Solid, and Vue components)
1.21.2 - 2025-08-13
- Scroll Area: Initial release of scroll area state machine
-
Carousel:
- Fix an issue where the carousel would not update when
slideCountorautoplayprops change. - Fix an issue where
loop: falsewas ignored when using autoplay. Now, the carousel will stop when it gets to the last slide.
- Fix an issue where the carousel would not update when
-
Date Picker: Expose
data-inlineattribute on Content part to enable distinct styling for inline date pickers versus popover date pickers. -
Menu: Fix issue where
onCheckedChangecould be called twice on checkbox or radio item -
Radio Group: Fixed issue where arrow key navigation doesn't apply
data-focus-visibleon the newly focused item.
1.21.1 - 2025-07-31
-
Carousel: Fix issue where controlled carousel ignores last slide
-
Tour: Re-expose
WaitOptions -
Floating Panel: Add data attributes for floating panel stage status
1.21.0 - 2025-07-26
- File Upload: Add
api.transformingto track file transformation state when usingtransformFiles. This enables developers to show loading states during file processing.
- Dialog
- Sync content
--layer-indexwith positioner and backdrop - Decouple
trapFocusfrommodalso it's possible to setmodal=falseandtrapFocus=true
- Sync content
1.20.1 - 2025-07-23
-
Date Picker: Fixed issue where hovered range was connect to selected values, when it shouldn't
-
Tree View: Fixed issue where tree view doesn't scroll into view when content overflows.
1.20.0 - 2025-07-22
- Date Picker: Fix date comparison issues when time components are involved. This resolves critical issues with date
comparison operations when different date types (
CalendarDate,CalendarDateTime,ZonedDateTime) are mixed, particularly in scenarios involving time components.
-
Date Picker: Added hover range preview support for date picker range selection. Added
inHoveredRange,firstInHoveredRange, andlastInHoveredRangeproperties toDayTableCellStatewith corresponding data attributesdata-in-hover-range,data-hover-range-start, anddata-hover-range-end.Hover range states are only active when not overlapping with actual selected range, enabling distinct styling for hover preview vs actual selection in range mode.
1.19.0 - 2025-07-20
-
File Upload: Add support for programmatically controlling the accepted files via
acceptedFilesanddefaultAcceptedFiles -
Signature Pad: Add support for programmatically controlling the paths via
pathsanddefaultPathsprops.
1.18.5 - 2025-07-19
- JSON Tree Utils: Add support for
groupArraysAfterLengthto truncate large arrays into chunks (reducing the number of DOM nodes rendered).
-
General: Fix issue destructuring returned api could throw an ESLint
unbound-methodwarning -
Tree View: Fix issue where
onExpandedChange,onSelectionChangeandonFocusChangedoesn't infer the tree node types -
Popper: Expose floatingElement to the
updatePositionfunction
1.18.4 - 2025-07-18
-
Collection: Fix issue where the
filtermethod completely deletes the children key from the node when there are no matching children -
Number Input: Fix issue where default pattern does not allow negative numbers with decimal point
1.18.3 - 2025-07-05
-
Carousel: Fix issue where full page carousel could trap scrolling
-
File Upload:
- Fix issue where calling
api.setFilesinvokes validation with incorrectacceptedFiles - Fix issue where the browser might not be able to infer the mime type of a file due to limitations, drag source or security restrictions. As a fallback in the file validation logic, we now infer the mime type from the file extension.
- Fix issue where calling
1.18.2 - 2025-07-04
- Collection: Add
upsertto list collection. Useful for making creatable items in select or combobox
- Date Picker: Fix issue where
focusedValuecould not be fully controlled - Toast: Fix issue where toast
titleordescriptioncould not accept React or Vue elements
1.18.1 - 2025-07-02
-
Combobox:
- Expose
reasontoonOpenChangeandonInputValueChangecallbacks - Select highlighted item only if it exists in the collection
- Expose
api.clearHighlightedValuefunction to clear highlighted value
- Expose
-
Date Picker: Fix issue where datepicker errors when setting
selectionMode=rangeandminView=year -
Listbox: Select highlighted item only if it exists in the collection
-
Progress: Improve
valueAsStringformatting -
Select:
- Select highlighted item only if it exists in the collection
- Expose
api.clearHighlightedValuefunction to clear highlighted value
-
Tour: Fix an issue where the
gotofunction inStepActionMapdoesn't work when passing step IDs (string) -
Tree View: Expose
idin the tree node state
1.18.0 - 2025-06-30
- Color Picker: Add support for
inlineprop to render color picker inline - Date Picker: Add support for
inlineprop to render the date calendar inline
- Aria Hidden: Exclude elements with
role="status"andoutputelements when applying aria-hidden - Color Picker: Auto-prefix Hex values with
#if missing when using thehexchannel input - Menu: Fix interaction outside detection for focusable context trigger
- Tree View: Improve support for rendering tree items as links
1.17.4 - 2025-06-27
- Combobox, Select, Listbox: Fix issue where rehydrating
defaultValueorvalueafter fetching items doesn't update thevalueAsString
1.17.3 - 2025-06-27
- Tree View: Fix tree traversal for querying last node
1.17.2 - 2025-06-26
-
Angle Slider: Fix issue where scrubbing doesn't feel smooth on touch devices
-
Timer:
- Fix issue where timer could continue beyond
targetMswhen window is not visible - Add validation to ensure
startMsandtargetMsare configured correctly - Fix
progressPercentcalculation for countdown timers
- Fix issue where timer could continue beyond
-
Tree View: Expose node details in
onExpandChange,onSelectionChangeandonFocusChange
-
Collection:
- Add support for
findNodesto find multiple nodes by value in a single pass - Fix issue with
getLastNodenot returning the last node in the tree with only one branch
- Add support for
-
I18n Utils: Add new
createCollatorfunction for locale sensitive string comparison
1.17.1 - 2025-06-24
-
Date Picker: Fix issue with keyboard selection where setting unavailable date causes month view to behave differently from clicking with mouse
-
Toast: Fix issue where app crashes when
toaster.promiseis called without loading option. Theloadingoption is now required. A warning will be logged if it is not provided -
Tree View:
- Fix issue where clicking a branch with indeterminate state doesn't check its child nodes
- Remove
aria-busyattribute from branch trigger when not loading children
1.17.0 - 2025-06-23
- Progress: Fix issue where setting orientation to
verticaldon't work - Progress: Fix issue where setting
defaultValuetonulldoesn't show indeterminate state
- Tree View: Rename
getItemCheckboxPropstogetNodeCheckboxPropssince it can be used in both items and branches
1.16.0 - 2025-06-21
-
Tree View
- Add support for checkbox state for checkbox trees via
defaultCheckedValue,checkedValue,onCheckedChangeprops - Add callback for when
loadChildrenfails viaonLoadChildrenErrorprop - Add
api.getCheckedMapmethod to get the checked state of all nodes
- Add support for checkbox state for checkbox trees via
-
Tree Collection: Add support for
getDescendantNodesandgetDescendantValues
- Tree View: Fix issue where
api.collapseandapi.deselectthrows error when called without arguments - General: Add better support for TypeScript's
exactOptionalPropertyTypescompiler option
1.15.7 - 2025-06-19
- Collection: Fix issue where tree collection filter method returns empty children for leaf item.
1.15.6 - 2025-06-18
- General: Ensure pointerdown or click event handlers only execute when the main button is clicked
-
Collection: Improve the APIs around
tree.flatten(...)andflattenedToTreeto ensure the original node properties are preserved.Previously,
tree.flatten()would return an array of objects withvalueandlabelstripping out the original node properties.const tree = new TreeCollection({ rootNode: { value: "ROOT", children: [{ value: "child1" }, { value: "child2" }], }, }) const flattened = tree.flatten() const reconstructed = flattenedToTree(flattened) console.log(reconstructed.rootNode) // { // value: "ROOT", // children: [{ value: "child1" }, { value: "child2" }], // }
1.15.5 - 2025-06-17
- Combobox: Fix issue where combobox with
allowCustomValue: trueused within in a form requires two enter keypress to submit
1.15.4 - 2025-06-16
- Menu, Combobox: Fix issue in Svelte where menu and combobox items rendered as links don't work
- Toggle Group: Fix issue in Svelte where toggle group doesn't work due to blur timing
1.15.3 - 2025-06-13
- Popover: Fix issue where
onOpenChangecould be called twice when controlled - File Utils: Improve
downloadFilefunction to handle webview scenarios - Combobox: Fix issue where
onInputValueChangecould be called twice when selecting an item
1.15.2 - 2025-06-10
- Menu: Refactor
getItemTextPropsandgetItemIndicatorPropsto accept a partial interface of option item.
1.15.1 - 2025-06-10
- [NEW]Async List: Initial release of async list controller
- Editable: Add support for
activationMode=none - Collection:
- Expose
copymethod - Allow
getParentNodesto accept a value or index path
- Expose
- Carousel: Fix issue where carousel crashes when
slidesPerPageis 0 - File Upload: Prevent
undefinedinacceptedFileswhen no files accepted - Select: Fix issue where highlighted item could be cleared when navigating up/down the list with keyboard
- Tabs: Fix issue where tabs with links should not trigger tab change upon cmd/middle click
1.15.0 - 2025-06-05
- Tree View: Add support for lazy loading node children. To use this, you need to provide:
loadChildrenis a function that is used to load the children of a node.onLoadChildrenCompleteis a callback that is called when the children of a node are loaded. Used to update the tree collection.- Add
childrenCountto the node object to indicate the number of children.
function TreeAsync() {
const [collection, setCollection] = useState(initCollection)
const service = useMachine(tree.machine, {
id: useId(),
collection,
async loadChildren({ valuePath, signal }) {
const url = `/api/file-system/${valuePath.join("/")}`
const response = await fetch(url, { signal })
const data = await response.json()
return data.children
},
onLoadChildrenComplete({ collection }) {
setCollection(collection)
},
})
// ...
}- Collapsible: Fix rect measurement timing issue in Svelte
- Remove Scroll: Fix scrollbar width calculation before DOM change for scroll-lock workaround compatibility
- Slider:
- Fix issue where
Shift+ArrowRightset value to0instead ofmaxwhen step is too large (e.g.20) - Fix issue where
onValueChangeEnddoesn't return the latest value when dragging very fast
- Fix issue where
1.14.0 - 2025-05-29
- File Upload: Add support for transforming uploaded files via
transformFilescontext property.
const service = useMachine(fileUpload.machine, {
id: useId(),
accept: ["image/jpeg", "image/png"],
transformFiles: async (files) => {
return Promise.all(files.map((file) => compress(file, { size: 200 })))
},
})- Slider: Fix issue where
minStepsBetweenThumbsisn't computed correctly when interacting with pointer or keyboard.
1.13.1 - 2025-05-27
- Password Input
- Export missing types for
ApiandService - Add
api.toggleVisiblefunction to toggle the visibility of the password input - Implement
translationsprop to customize the visibility trigger accessibility label
- Export missing types for
1.13.0 - 2025-05-26
- [New] Password Input: Add password input machine for displaying a password input field.
- Select: Add
onSelectcallback that gets fired when an item is selected via keyboard/mouse.
-
Color Picker: Fix issue where value change end event is invoked when committing via an input.
-
Svelte: Fix issue with microtask timing in svelte
5.28.3+. -
Toast: Fix issue where calling
toast.remove()without an id shows a TypeScript error.
1.12.4 - 2025-05-20
- Svelte: Improve reactivity of synchronous state updates.
1.12.3 - 2025-05-16
-
Carousel:
- Fix issue where focusing on carousel region and navigating with keyboard doesn't work as expected
- Fix issue when
allowMouseDragis set where carousel no longer snaps after mouse interaction
-
Combobox: Fix issue where
onInputValueChangedoesn't get called whenautoFocusis set totrue -
Focus Visible: Fix an issue where an assignment to the browser's
HTMLElementprototype is not supported (e.g. happy-dom) -
Preact: Remove
reactandreact-domfrom peerDependencies -
Slider: Fix issue where slider could throw a error when rendered in an popover or dialog
-
Svelte: Improve reactivity when events don't trigger a state transition
-
Tour: Fix issue where calling
api.start(<id>)with a step id doesn't work as expected
1.12.2 - 2025-05-12
- Select, Menu, Tabs: Fix type issue with the
navigateprop
1.12.1 - 2025-05-12
-
Collection: Fix issue where
getNextValueandgetPreviousValuedoesn't work as expected whengroupByis used. -
Combobox:
- Fix issue in Vue.js where combobox doesn't work for items rendered as link
- Add
hrefto params innavigatecontext property
-
Menu, Tabs: Add
hrefto params innavigatecontext property
1.12.0 - 2025-05-01
- Date Picker: Add support for
outsideDaySelectableprop to allow selecting days outside the current month (on the same visible date range)
- Collapsible: Fix issue in React.js <= v18.x where collapse animation might not work as expected
1.11.0 - 2025-04-20
- ListCollection: Add support for grouping collection items
- Listbox: Export missing
SelectionModeinterface
1.10.0 - 2025-04-15
-
Toggle Group: Add support for
deselectableprop to ensure one or more toggle is selected at any time. -
Splitter:
- Expose
api.resetSizes()to reset the size to the initial specified size - Fix issue in vertical orientation where arrow up doesn't work as expected.
- Expose
-
Select: Fix issue where machine doesn't leave focus state when interacting outside with another editable element. This leads to the
data-focusattribute not being removed from the trigger element. -
Floating Panel: Fix issue where clicking the trigger when panel is open, doesn't close the panel
1.9.3 - 2025-04-10
- Floating Panel
- Change default strategy from
absolutetofixedto improve positioning consistency - Implement controlled open/close state
- Constraint the mouse movement to the boundary rect to prevent content from being moved outside completely
- Change default strategy from
1.9.2 - 2025-04-10
- Floating Panel: Fix issue where
StageTriggerPropsandAnchorPositionDetailswas not exported
1.9.1 - 2025-04-10
- Floating Panel
- Update props and APIs to be consistent with other components
- Fix issue where position and size were not synchronized correctly
1.9.0 - 2025-04-09
-
Toast: Add support for queuing toasts that exceed the maximum limit. When the maximum number of toasts is reached:
- New toasts are added to a queue instead of being dropped
- Queued toasts are automatically displayed when space becomes available
- Queue is cleared when all toasts are removed
-
Listbox
- Add support for clearing selection on Escape press
- Add
api.clearHighlightedValuefunction to clear the highlighted value - Add
data-emptyattribute to indicate when the listbox is empty
-
Collection: Add
filterfunction to collection methods
- Listbox: Fix keyboard navigation when no item is highlighted
- Combobox: Fallback to trigger element as the positioning anchor
- Combobox: Add
data-emptyattribute to the listbox and content to indicate when the listbox is empty
1.8.2 - 2025-04-04
- Tabs, Radio Group: Fix Next.js issue where indicator size might not be mentioned when conditionally rendering the
component and
defaultValueis set.
1.8.1 - 2025-04-04
-
Listbox
- Fix issue where keyboard focus loops when
loopFocuswas not set. - Fix issue where
extendedselection mode was not working as expected.
- Fix issue where keyboard focus loops when
-
Dom Query: Improve platform detection logic to detect
macOSandiOScorrectly.
1.8.0 - 2025-04-04
- [New] Listbox: Add listbox machine for displaying a list of selectable options, supporting both single and multiple selection modes.
- ListCollection: Fix staleness issues in mutation methods by returning a new
ListCollectioninstead of mutating the internalitems
-
Tabs: Fix issue where tabs indicator animation behaves inconsistently.
-
Date Picker
- Fix issue where datepicker throws error when navigating month view.
- Fix issue where range selection doesn't reset correctly when clicking the same start date.
-
Interact Outside
- Fix issue where pointerdown outside doesn't work consistently on mobile devices.
- Improve pointerdown outside click detection in shadow DOM environments.
1.7.0 - 2025-03-28
-
Slider
- Add support for
origin: endto align the thumb to the end of the track. - Expose
thumbSizeas CSS variables in the root element. Can be useful for styling the slider.
- Add support for
-
Menu: Fix issue where
addItemListenerdoesn't work as expected.
- Slider: Fix issue where
thumbSizeCSS variable is not applied.
1.6.2 - 2025-03-27
- Frameworks: Ensure machine has started before processing events.
- Menu: Add
addItemListenerfunction to allow listening for dispatched custom event on menu item.
1.6.1 - 2025-03-26
- HoverCard, ColorPicker: Add missing
tabIndexto improve usage within dialogs - Menu
- Fix issue where menu items don't have a unique id leading to accessibility and HTML validation issues
- Dispatch
menu:selectevent on the menu item when it is selected
1.6.0 - 2025-03-24
- Collapsible: Add collapsible indicator part
-
Splitter: Fix issue where
onResizeStartandonResizeEndcallbacks are not called when using keyboard -
Combobox: Fix issue where
onOpenChangewith the sameopenvalue
- Color Utils: Export
ColorStringFormattype
1.5.0 - 2025-03-20
- File Utils: Fix issue in
downloadFilewherenameis not considered in some cases
-
Number Input: Set the default step to
0.01whenformatOptions.styleis set topercent -
[Breaking] Splitter: Redesign splitter machine to support more use cases and improve DX.
Before:
const service = useMachine(splitter.machine, { id: useId(), defaultSize: [ { id: "a", size: 50 }, { id: "b", size: 50 }, ], })
After:
const service = useMachine(splitter.machine, { id: useId(), panels: [{ id: "a" }, { id: "b" }], defaultSize: [50, 50], })
The also comes with new features such as:
- Support for collapsible panels
- Support for collapse and expand events
- Methods for resizing the panels programmatically
1.4.2 - 2025-03-18
-
Toast: Fix issue where setting
offsetstoundefinedcauses machine to throw -
Select: Fix issue where select
valueAsStringloses reactivity
1.4.1 - 2025-03-17
- Slider: Fix issue where value normalization doesn't work as expected
1.4.0 - 2025-03-14
- Splitter
- Add
api.setSizesto set the size of multiple panels - Add
api.getSizeto get the size of a panel
- Add
-
Number Input: Fix issue where number input
onValueChangeis called with incorrectvalueAsNumber -
Slider: Fix issue where setting
minto value other than0causes incorrect initial placement of thumbs
1.3.3 - 2025-03-10
-
Combobox: Fix issue where cursor moves unexpected when editing input value
-
Tags Input: Improve caret detection logic to prevent unwanted tag removal
-
Timer
- Fix issue where timer slows down when switching tabs/windows
- Change default
intervalvalue from250to1000
1.3.2 - 2025-03-08
-
Pin Input: Fix issue where OTP SMS autofill doesn't work as expected.
-
Date Picker: Fix issue where Svelte throws a
state_unsafe_mutationerror when controlling the datepicker range mode. -
Rating Group: Fix issue where rating group label places focus incorrectly.
-
React: Flush effects synchronously rather than within a microtask.
-
Checkbox: Fix issue where checkbox incorrectly sets
data-invalidwheninvalidisfalse.
1.3.1 - 2025-03-05
-
Radio Group, Switch: Improve focus behavior in Safari browser.
-
Accordion: Fix issue in Safari where clicking triggers doesn't show the content as expected.
-
Auto Resize:
- Fix issue where height calculations could be incorrect in high DPI scenarios.
- Account for
maxHeight,overflowY, andboxSizingCSS properties. - Calculate height when its form owner resets.
1.3.0 - 2025-03-03
- General: Fix issue where machines that hold complex objects could cause issues.
-
Date Picker:
- Add support for
api.getViewProps. - Add
visibleRangeTextproperty toapi.offset()return value.
- Add support for
-
Progress: Add support for
localeandformatOptionsto properly format theapi.percentAsStringresult. -
Framework Adapters (React, Svelte, Solid, Vue): Support
reenter:truein machine transitions.
1.2.1 - 2025-02-27
-
Progress: Allow for more precise (decimal) values.
-
Scroll Snap: Fix issue where
getScrollPaddingcould returnNaNin test environments. -
Date Picker: Fix issue where
onValueChangedoesn't get called when value is cleared. -
Number Input: Fix issue where
allowOverflowwas not implemented.
1.2.0 - 2025-02-26
-
Signature Pad
- Fix issue where hidden input throws a controlled warning in React due to the absence of
readOnlyoronChange. - Fix issue where calling
getDataUrlin theonDrawEndcallback after clearing the signature pad does not return an empty string.
- Fix issue where hidden input throws a controlled warning in React due to the absence of
-
React: Improve Hot Module Replacement such that effects are replayed correctly. This removes the need to refresh the page for changes to take effect.
-
Toggle Group: Fix issue where calling
api.setValuewith an array doesn't work as expected. -
Pin Input: Fix
flushSync was called from inside a lifecycle methodwarning. -
Vue: Fix issue where
choose is not a functionerror could be thrown for some machines. -
File Upload: Fix issue where
win.DataTransfercould throw in testing environments. -
Time Picker: Fix
[@zag-js/dismissable] node is null or undefinedwarning when lazy mounting the content.
- Pin Input: Add support for
countprop to improve SSRaria-labelattribute.
1.1.0 - 2025-02-26
-
Pin Input: Fix issue where editing existing values don't work as expected.
-
Number Input: Fix issue where
valueprop wasn't consumed in the machine. -
Carousel: Fix issue where
pagewas not consumed in the machine. -
Textarea: Fix issue where
ResizeObserverloop could throw undelivered notifications warning.
-
Toggle: Bring back toggle machine.
-
Hover Card: Expose interaction outside handlers to hover card.
1.0.2 - 2025-02-24
-
Collection: Widen
itemstype to allowIterableinstead of justArraysince we internally convert iterables to an array. -
Carousel: Enforce required
slideCountto ensure machine works as expected. -
Framework Bindings: Fix issue where
undefinedvalues were not filtered out before resolving props. -
React: Fix issue where
flushSyncwarnings could be shown when unmounting a component.
1.0.1 - 2025-02-23
-
Select: Fix regression where
multiple: truedoesn't work. -
Timer: Fix issue where timer doesn't restart when
startMschanges. -
Toggle Group: Fix issue where
data-focusdoesn't get removed after blurring the toggle group. -
Toast: Fix keyboard navigation issue where toast group skips the close button within the toast item and moves to the next focusable element in the document.
- Added
<component>.Machinetype to help when typecasting generic components like combobox and select.
1.0.0 - 2025-02-22
-
Core: Rewrite machines for increased performance and initial mount time. The results show roughly 1.5x - 4x performance improvements across components.
-
[Breaking] Toast
- Require the creation of a toast store using
createStore - Solid.js: Require the usage of
<Key>component to render toasts
- Require the creation of a toast store using
-
Menu: Fix issue where context menu doesn't update positioning on subsequent right clicks.
-
Avatar: Fix issue where
api.setSrcdoesn't work. -
File Upload: Fix issue where drag-and-drop doesn't work when
directoryistrue. -
Carousel
- Fix issue where initial page is not working.
- Fix issue where pagination sync broken after using dots indicators.
-
Timer: Fix issue where timer stops when switching tabs.