@ark-ui/react
[5.35.0] - 2026-03-26
Added
-
Date Picker: Improved range picker mode with new data attributes and state properties.
- Added 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. 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. - Fixed inverted year cell
selectablestate that caused years outside the visible decade or min/max range to appear
selectable. - Breaking:
DayTableCellState.formattedDateremoved — usevalueTextinstead (inherited fromTableCellState).
- Added missing range data attributes (
-
Drawer: Added new anatomy parts and improved swipe gestures.
- Added
descriptionanatomy part witharia-describedbysupport on the content element. - Added
SwipeAreapart for swipe-to-open gestures from screen edges. - Require intentional swipe movement before showing the drawer (no flash on pointer down).
- Smooth settle animation from release point to fully open position.
- Added cross-axis scroll preservation to prevent drawer drag when scrolling horizontally.
- Added initial focus management for non-modal mode.
- Set
pointer-events: noneon positioner in non-modal mode so the page stays interactive. - Fixed swipe-to-dismiss in controlled mode (
open: truewithoutonOpenChangenow blocks dismiss).
- Added
-
Field: Added
Field.Itemcomponent andtargetprop onField.Rootfor multi-control fields (e.g., currency
select + amount input). UseField.Itemwith avalueto scope controls, andtargetto specify which item the
label should focus when clicked. -
Interaction: Added
useInteractionModalityanduseFocusVisiblehooks for tracking user input method (keyboard,
pointer, virtual) and conditionally showing focus rings. -
Listbox: Added
keyboardPriorityto input props to control whether key handling prioritizes text editing or list
navigation forHome/Endand horizontal arrows in grid collections. AddedhighlightFirst,highlightLast,
highlightNext, andhighlightPreviousto the API for programmatic highlight navigation. -
Pin Input: Overhauled deletion, focus management, and added new props.
- Delete and Backspace now splice values left instead of leaving empty gaps. Deleting "2" from
[1, 2, 3]yields
[1, 3, ""]— not[1, "", 3]. - 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. - Added Home/End to jump to first slot or last filled slot.
- Added
enterKeyHintshowing "next" on intermediate slots and "done" on the last. - Added
autoSubmitprop to automatically submit the owning form when all inputs are filled. - Added
sanitizeValueprop to sanitize pasted values before validation (e.g. strip dashes from "1-2-3").
- Delete and Backspace now splice values left instead of leaving empty gaps. Deleting "2" from
-
Tags Input: Added
allowDuplicatesprop to allow duplicate tags. -
Clipboard, Navigation Menu, Popover, Select, Timer, Tree View: Added
translationsprop for localizing hardcoded
accessibility labels.
Fixed
-
Carousel: Fixed controlled carousel inside dialog jumping or skipping pages. Fixed navigation inside
CSS-transformed containers (e.g., dialogs with open/close animations). Fixed scroll position drifting when container
layout shifts (e.g., scrollbar removal). -
Color Picker: Fixed vertical slider orientation not preserved on pointer updates.
-
Date Input: Improved focus management.
-
Dialog: Improved non-modal mode behavior.
- Set
pointer-events: noneon positioner in non-modal mode so the page stays interactive. - Added initial focus management for non-modal mode (mirrors popover behavior).
- Fixed
aria-modalto reflect actualmodalprop value instead of hardcodedtrue.
- Set
-
Floating Panel: Fixed
opentaking precedence overdefaultOpenduring initialization. FixedsetPositionand
setSizeto work independently of drag/resize state. Fixed maximize/minimize restore reverting to(0, 0)in
controlled mode. FixedMaximum update depth exceededwhen content usesResizeObserver(React). Fixed Escape during
drag/resize to cancel and revert to original position/size. -
Focus Trap: Fixed edge cases in focus trapping.
- Fixed focus trapping when the content has a single effective tab stop, such as a native radio group.
- Handle disconnected
initialFocusnodes more safely.
-
Interact Outside: Fixed Safari-specific interaction issue.
- Fixed issue where nested popovers and select within popovers didn't toggle correctly in Safari due to
focusin
events racing with pointer interactions.
- Fixed issue where nested popovers and select within popovers didn't toggle correctly in Safari due to
-
Menu: Fixed trigger to keep
aria-expanded="false"when closed. -
Pin Input: Fixed crash when typing the same character in a completed pin input.
-
Radio Group, Tabs: Fixed indicator only animating on value change, not on initial render or resize.
-
Splitter: Fixed shadow root compatibility.
- Fixed global cursor styles when splitter is used in a shadow root.
[5.34.1] - 2026-03-03
Fixed
- Carousel:
- Fixed issue where carousel inside a Portal (e.g., Dialog) computes incorrect page count due to incomplete DOM layout
at mount time - 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
slidesPerMoveprogression more predictable
- Fixed issue where carousel inside a Portal (e.g., Dialog) computes incorrect page count due to incomplete DOM layout
- Combobox, Listbox, Select: Improved controlled-mode synchronization and callback/item resolution behavior across
filtered collections
Changed
- Format:
Format.Timenow acceptsamLabelandpmLabelas separate props instead of the previousamPmLabels
object
[5.34.0] - 2026-02-27
Added
- Format: Added
Format.Timefor formatting time values and examples for basic, date input, seconds, custom AM/PM
labels, and locale
Fixed
- Build: Fixed CJS build issues in downstream Zag.js packages
[5.33.0] - 2026-02-26
Added
-
Date Picker: Added non-Gregorian calendar support via
createCalendarprop (Persian, Buddhist, Islamic, Hebrew,
and other calendar systems)import { PersianCalendar } from '@internationalized/date' function createCalendar(identifier) { switch (identifier) { case 'persian': return new PersianCalendar() default: throw new Error(`Unsupported calendar: ${identifier}`) } } ;<DatePicker.Root locale="fa-IR" createCalendar={createCalendar}> {/* ... */} </DatePicker.Root>
-
Date Picker: Added
data-typeattribute to weekend table header and cell
Fixed
- Combobox: Fixed
onValueChangereturning emptyitemsarray when using controlled value - Popover: Fixed nested popover z-index layering
- Toast: Fixed types to ensure
parent/indexare exposed as props andexpand/collapseare exposed on the
store - Radio Group, Listbox, Progress, Segment Group: Fixed group labels rendering orphan label elements; now render as
spanper W3C ARIA pattern
[5.32.0] - 2026-02-21
Added
- Locale: Added
useDateFormatterhook for localized date formatting using@internationalized/date - Swap: Added new
Swapcomponent for toggling between two visual states with CSS animations using dual presence
instances - Checkbox: Added
maxSelectedValuesprop toCheckboxGroupto limit the number of selected values - Drawer: Replaced
BottomSheetwith newDrawercomponent supporting multi-directional swipe viaswipeDirection
prop (up,down,left,right), a newPositionerpart, andsnapToSequentialPointsoption - Date Picker:
- Added
focusoption toapi.clearValue({ focus?: boolean }) - Added
api.setTime(time, index?)for date-time picker support - Added
maxSelectedDatesprop to limit selected dates inmultipleselection mode - Added
api.isMaxSelectedto check if maximum number of dates has been selected - Added
openOnClickprop to open the calendar when clicking the input field - Added
showWeekNumberssupport to display ISO 8601 week number column in the day view
- Added
- Popover: Added
sizeMiddlewarepositioning option to optionally disable the size middleware - Select: Added
autoCompleteprop for browser autofill hints
Fixed
- Combobox:
- Fixed
aria-selectedbeing set on highlighted items instead of selected items - Fixed
selectedItemsgetting out of sync withvaluein controlled mode - Fixed item disabled state not accounting for root-level
disabledprop
- Fixed
- Date Picker:
- Fixed
api.selectToday()sending incorrect value format - Preserve time/timezone when selecting new dates (
CalendarDateTimeandZonedDateTime) - Improved focus management in trigger-only mode
- Fixed
- Dialog: Fixed non-modal dialog closing on outside click when
modalisfalse - Listbox: Fixed DOM IDs
- Number Input: Fixed
invalidprop being ignored when value is out of range - Popover: Improved performance by reducing style recalculations when scrolling
- Select: Fixed autofill not updating value when hidden select value changes
[5.31.0] - 2026-02-04
Added
- Date Picker: Added
ValueTextcomponent for displaying selected date value(s) with placeholder support and render
prop for custom formatting - Scroll Area: Added overflow CSS variables (
--scroll-area-overflow-{x,y}-{start,end}) for scroll fade effects - Slider: Added
thumbCollisionBehaviorprop (none,push,swap) - Steps: Added
isStepValid,isStepSkippable, andonStepInvalidfor validation support - Tags Input: Added
placeholderprop (shown only when no tags exist) - Tooltip: Added
data-instantattribute for instant animations
Fixed
- Auto Resize: Fixed change event not emitted after clearing controlled textarea
- Date Picker: Fixed
visibleRangeTextto show correct format based on current view (year/month/day) - Dismissable: Fixed issue where closing a nested dialog/popover would incorrectly close its parent layers
- Menu: Fixed glitchy submenu behavior when hovering between trigger items quickly
- Checkbox: Fixed individual checkbox props being overridden by
CheckboxGroup - Collection, Tree View: Fixed initial focus when first node/branch is disabled
- Color Picker: Fixed color not updating when selecting black shades in controlled mode
- Floating Panel: Fixed double-click on minimized title bar incorrectly maximizing
- Image Cropper: Fixed
reset()destroying cropper, prop changes not updating instantly, and panning bounds - Number Input: Fixed cursor positioning after clicking label or scrubbing
- Pagination: Fixed next trigger not disabled when
countis0 - Slider: Fixed thumb drag from edge in
thumbAlignment="contain"mode - Switch: Fixed
api.toggleChecked()not working - Toast: Fixed toasts created before state machine connects not showing
- Tour: Fixed janky scroll between steps
[5.30.0] - 2025-12-10
Added
- Date Picker: Added
requiredandinvalidprops - Number Input: Added
onValueCommitcallback that fires when the input loses focus or Enter is pressed - Pagination:
- Added
FirstTriggerandLastTriggercomponents for navigating to first/last page - Added
boundaryCountparameter for controlling boundary pages (start/end) - Implemented balanced pagination algorithm for consistent UI with max 7 elements
- Added
- Radio Group: Added
invalidandrequiredprops with correspondingdata-*andaria-*attributes - Tree View: Added
scrollToIndexFnprop to enable keyboard navigation in virtualized trees
Fixed
- Accordion, Menu: Fixed issue where querying elements by
aria-controlsattribute could fail when lazy mounting
the content - Color Picker: Added
role="dialog"to content andaria-haspopup="dialog"to trigger when not inline for better
accessibility - Date Picker: Fixed issue where date picker input does not update format when locale changes
- Floating Panel:
- Fixed
dirprop now properly delegated to all panel parts - Fixed double-click behavior improvements and to check
event.defaultPreventedfor custom behavior
- Fixed
- Listbox:
- Fixed issue in React where filtering items with an input would throw a
flushSync was called from inside a lifecycle methodwarning - Fixed issue where
data-highlightedwasn't applied to the first item when usingautoHighlightwith input
filtering
- Fixed issue in React where filtering items with an input would throw a
- Number Input:
- Fixed improved controlled usage sync
- Fixed issue where input element doesn't sync when
formatOptionschanges dynamically - Ensured cursor position is preserved when
Enterkey is pressed and formatting is triggered - Fixed cursor jumping to start when value is changed externally via props while user is typing
- Pagination: Fixed ellipsis showing when only 1 page gap
- Rating Group: Fixed issue where rating group becomes unfocusable via keyboard when value is 0
- Tooltip: Fixed tooltip not showing when scrolling with pointer over trigger
Changed
- Tree View:
getVisibleNodes()now returns{ node, indexPath }[]instead ofnode[]
[5.29.1] - 2025-11-22
Fixed
- Fieldset: Fixed
aria-describedbyresolution to correctly reference helper text and error text IDs - Floating Panel:
- Fixed resize trigger issue with
naxis by explicitly settingtop: 0 - Fixed
draggableandresizableoptions not being respected when set tofalse
- Fixed resize trigger issue with
- Presence: Fixed regression where UNMOUNT transition might not be called consistently
[5.29.0] - 2025-11-20
Added
- Carousel, Color Picker, Combobox, Date Picker, Select: Added
valuetoOpenChangeDetailsfor better context
when handling open state changes - Carousel: Added support for
autoSizeprop to allow variable width/height slide items - Splitter:
- Added
Splitter.ResizeTriggerIndicatorto render an indicator when resizing - Exported
getLayoutandgetSplitterLayoutfunctions for calculating splitter panel layouts
- Added
- Toast: Exposed viewport offset as CSS variables on the toast group element
Fixed
- Carousel:
- Fixed dragging behavior that stops working after switching browser tabs or scrolling the page
- Fixed dragging not working after scrolling with mouse wheel when
allowMouseDragis enabled
- Combobox: Fixed
onHighlightChangenot being invoked when collection is filtered to empty - Date Picker: Fixed issue where the range date picker crashes when typing the end date first and blurring the input
field multiple times - File Upload: Fixed issue where clicking on non-interactive children inside the dropzone doesn't open the file
picker - Presence: Fixed a bug where elements get stuck in unmountSuspended state during rapid state updates
- Radio Group:
- Fixed inconsistent application of
data-focus-visibleanddata-focusattributes
- Fixed inconsistent application of
- Splitter: Fixed disabled splitter showing resize cursor and allowing dragging
- Tabs:
- Fixed tabs indicator position not updating when inactive tabs change size
- Tags Input: Fixed issue where item delete trigger doesn't have
data-*attached
[5.28.0] - 2025-11-14
Added
- General: Exported
InteractOutsideEvent,FocusOutsideEvent, andPointerDownOutsideEventtypes for better type
safety - Carousel:
- Added
Carousel.AutoplayIndicatorcomponent for conditionally rendering content based on autoplay state - Added
Carousel.ProgressTextcomponent for displaying current page progress (e.g., "1 / 5")
- Added
- Toast: Exported
ToastOptionsandToastStorePropstypes for better type safety
Changed
- useListCollection: Updated
initialItemsto acceptreadonlyarrays for better compatibility with immutable data
patterns.
Fixed
- Combobox:
- Fixed focus stealing in controlled open mode
- Removed problematic
aria-hiddenbehavior to allow interaction with other page elements
[5.27.1] - 2025-11-02
Fixed
- Dialog, Popover: Improved shadow DOM support for interact outside and focus trap detection
- Marquee: Fixed Firefox flicker and added GPU acceleration
- Dialog: Fixed layout shift issue when using
scrollbar-gutter: stablein CSS - Slider: Fixed
onValueChangeEndcallback not triggering for programmatic value changes
[5.27.0] - 2025-11-01
Added
- Marquee [New]: Initial release of marquee component for continuously scrolling content
Fixed
-
Angle Slider: Resolved an issue where dragging the thumb from non-center positions caused unexpected value jumps.
The thumb now maintains consistent positioning relative to the initial click point. -
Slider: Fixed a problem where the thumb offset shifted dynamically during dragging, resulting in value jumps. The
offset now remains constant from the pointer throughout the drag operation. -
Date Picker: Resolved a crash in the range date picker occurring when users typed the end date first by
implementingnull/undefinedchecks for date property access. -
Radio Group: Reverted to
offsetLeft/offsetTopcalculations to restore correct indicator positioning within
scrollable container contexts. -
Tabs: Reverted to
offsetLeft/offsetTopcalculations to fix indicator positioning issues in scrollable
containers. -
Tour:
- Corrected improper effect cleanup procedures
- Fixed wait step functionality
- Added step validation on mount to verify configuration validity
[5.26.2] - 2025-10-18
Fixed
-
Angle Slider: Fix accessibility violation where the slider thumb element lacked an accessible name. The thumb now
supportsaria-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.
[5.26.1] - 2025-10-15
Fixed
-
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
[5.26.0] - 2025-10-08
Added
-
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}`,
})-
Select: Add
SelectRootComponentPropstype export for better component type composition. -
Listbox: Add
ListboxRootComponentPropstype export for better component type composition. -
Combobox: Add
ComboboxRootComponentPropstype export for better component type composition. -
TreeView:
- Add
TreeViewRootComponentPropstype export for better component type composition. - (Experimental) Add support for node renaming functionality:
- Add
TreeViewNodeRenameInputcomponent for inline node label editing - Add
canRenameprop to control which nodes can be renamed - Add
onRenameStart,onBeforeRename, andonRenameCompletecallbacks for rename lifecycle - Add
CheckedChangeDetails,LoadChildrenErrorDetails,RenameStartDetails, andRenameCompleteDetailstype
exports
- Add
- Add
Fixed
-
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
[5.25.1] - 2025-09-27
Fixed
-
Date Picker
- Fix issue where year range picker doesn't show the hovered range
- Fix issue where quarter presets returns incorrect date
-
FormatByte: Add support for
unitSystemproperty to allow changing between decimal (1000 bytes) and binary (1024
bytes) systems. -
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.
[5.25.0] - 2025-09-16
Added
- Added
mergePropsutility for combining multiple props objects with proper event handler and className merging. - Added
createContextutility for creating typed React contexts with improved DX.
import { createContext } from '@ark-ui/react/utils'Fixed
- AngleSlider: Export
angleSliderAnatomyfrom the anatomy exports
[5.24.1] - 2025-09-14
Fixed
- General: Fix issue where
mergePropsthrows whenpropsisundefinedornull
[5.24.0] - 2025-09-14
Added
-
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. -
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
Changed
-
Hover Card: Change default delay values for hover card to improve accessibility.
openDelay: from700msto600ms
-
Tooltip: Change default delay values for tooltip to improve accessibility.
Learn moreopenDelay: from1000msto400mscloseDelay: from500msto150ms
Removed
-
TimePicker: The TimePicker component has been removed from this release. This component was never part of the
public API and was considered experimental. It had significant bugs and usability issues across all frameworks and
locales, making it unsuitable for production use.Migration: We recommend building a custom time picker using the Select component for simple use cases, or
implementing a time grid pattern for more complex scenarios.
Fixed
-
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
-
Menu:
- Fix issue where keyboard activation of menu items with
target="_blank"would open two tabs - Fix issue where hovering a partially visible item with pointer causes it to scroll into view
- Fix issue where keyboard activation of menu items with
-
Tabs: Fix issue where
idsforitemandcontentcould not be customized -
Toast: Allow creating a toast store without any arguments
[5.23.0] - 2025-09-08
Added
- Field: Add
data-requiredattribute toField.Label - Select, Combobox, Listbox, TreeView: Export
RootComponentandRootProviderComponenttypes which are useful
when building compositions that wrap theRootandRootProvidercomponents and you still want type-safety for the
collection.
Fixed
-
Menu: Fix
Menu.ItemTextnot working insideMenu.TriggerItemimport { Select } from '@ark-ui/react/select' import { styled } from 'styling-lib' const Root = styled(Select.Root) as Select.RootComponent<{}>
[5.22.0] - 2025-08-28
Added
-
Combobox: Add
ComboboxEmptycomponent to display content when the combobox has no items -
Listbox: Add
ListboxEmptycomponent to display content when the listbox has no items -
Hover Card: Add support for
disabledprop
Fixed
-
Collection: Fix issue where disabled items could be reached via typeahead
-
Color Picker: Fix issue where color picker was not working correctly in RTL mode
-
Date Picker: Fix issue where datepicker doesn't revert to a valid value when the input value exceeds the min/max
and blurred -
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
-
Tags Input: Fix issue where highlighted item doesn't clear when tabbing out of the input to an external button
within thecontrolpart. -
Tooltip
- Set
closeOnPointerdowntofalsewhencloseOnClickis set tofalse - Reduce bundle size by replacing
@zag-js/storedependency with a lightweight store implementation.
- Set
[5.21.0] - 2025-08-24
Added
- Hooks: Add
useAsyncListanduseCollatorhooks for managing asynchronous list operations and locale-aware
string comparison - Toast: Export type definitions
ToastActionOptions,ToastPlacement,ToastPromiseOptions,ToastStatus,
ToastStatusChangeDetails, andToastType
Changed
- Fieldset
- Update Legend component to render as
divinstead oflegendelement for improved styling flexibility - Add
aria-labelledbyattribute to fieldset root for better accessibility by linking to legend
- Update Legend component to render as
Fixed
-
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.
- Clear hovered range state after completing range selection instead of waiting for pointer to leave the calendar
-
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.
- Fix issue where first enabled item should be highlighted by default when listbox receives focus and no item is
-
Scroll Area
- Avoid detecting hover state from portalled descendants.
- Add
data-draggingattribute to scroll area parts.
-
Select: Add
getElementtoscrollToIndexFndetails -
Combobox: Add
getElementtoscrollToIndexFndetails -
Tabs: Fix inconsistent keyboard navigation where TabPanel intermittently receives focus before focusable elements
[5.20.0] - 2025-08-20
Added
- Highlight Word: Add
exactMatchoption that enables whole-word matching using regex word boundaries.
Fixed
-
Menu: Fix context menu repositioning logic
-
ScrollArea: Add
data-hoverto scroll area
[5.19.0] - 2025-08-18
Added
- ScrollArea [NEW]: Add support for new scroll area component.
Fixed
-
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 - Fix context menu positioning bug where reopening at the same coordinates fails to reposition
- Add
[5.18.4] - 2025-08-14
Fixed
-
Listbox: Add support for navigating grid collections
-
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. -
TagsInput: Export
InputValueChangeDetailstype
Changed
- Async List: Improve type inference for descriptors
[5.18.3] - 2025-08-01
Fixed
-
Factory: Check if
childrenis a valid React element before callingChildren.only() -
Carousel: Fix issue where controlled carousel ignores last slide
[5.18.2] - 2025-07-26
Fixed
- Dialog
- Sync content
--layer-indexwith positioner and backdrop - Decouple
trapFocusfrommodalso it's possible to setmodal=falseandtrapFocus=true
- Sync content
[5.18.1] - 2025-07-23
Fixed
-
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.
[5.18.0] - 2025-07-22
Added
-
Collection: Add
useListSelectionhook for managing collection item selection with support for single/multiple
selection modesconst collection = createListCollection({ items: ['React', 'Vue', 'Angular'] }) const selection = useListSelection({ collection }) // Check if item is selected const isSelected = selection.isSelected('React') // Select/deselect items selection.select('React') selection.toggle('Vue')
-
File Upload: Add support for programmatically controlling the accepted files via
acceptedFilesand
defaultAcceptedFiles -
Signature Pad: Add support for programmatically controlling the paths via
pathsanddefaultPathsprops. -
Date Picker: Added hover range preview support for date picker range selection. Added
inHoveredRange,
firstInHoveredRange, andlastInHoveredRangeproperties toDayTableCellStatewith corresponding data attributes
data-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.
Fixed
- 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.
[5.17.0] - 2025-07-18
Added
- Checkbox: Add
CheckboxGroupProvidercomponent for external checkbox group state management
Fixed
-
Carousel: Fix issue where full page carousel could trap scrolling
-
ListCollection:Export
UseListCollectionReturntype -
TreeCollection: 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
-
File Upload
- Export
FileError,FileMimeType, andFileRejectiontypes - 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.
- Export
[5.16.1] - 2025-07-05
Fixed
-
Combobox
- Expose
reasontoonOpenChangeandonInputValueChangecallbacks - Expose
api.clearHighlightedValuefunction to clear highlighted value
- Expose
-
Date Picker
- Fix issue where datepicker errors when setting
selectionMode=rangeandminView=year - Fix issue where
focusedValuecould not be fully controlled
- Fix issue where datepicker errors when setting
-
Toast: Fix issue where toast
titleordescriptioncould not accept React element -
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 -
ClientOnly: Support
childrenas a function
[5.16.0] - 2025-07-01
Added
- Color Picker: Add support for
inlineprop to render color picker inline - Date Picker: Add support for
inlineprop to render the date calendar inline
Fixed
- 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
[5.15.4] - 2025-06-27
Fixed
- Combobox, Select, Listbox: Fix issue where rehydrating
defaultValueorvalueafter fetching items doesn't
update thevalueAsString
[5.15.3] - 2025-06-27
Fixed
- Tree View: Fix tree traversal for querying last node
[5.15.2] - 2025-06-26
Fixed
-
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 - Expose node details in
onExpandChange,onSelectionChangeandonFocusChange
-
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
[5.15.1] - 2025-06-23
Fixed
- Listbox: Fix issue where
Listbox.ItemContextwas not exported
[5.15.0] - 2025-06-23
Added
- Tree View
- Add support for checkbox state for checkbox trees via
defaultCheckedValue,checkedValue,onCheckedChangeprops - Add callback for when
loadChildrenfails viaonLoadChildrenErrorprop
- Add support for checkbox state for checkbox trees via
Fixed
- Progress
- Fix issue where setting orientation to
verticaldon't work - Fix issue where setting
defaultValuetonulldoesn't show indeterminate state
- Fix issue where setting orientation to
[5.14.2] - 2025-06-19
Fixed
- General: Ensure pointerdown or click event handlers only execute when the main button is clicked
- Tree View: Exported
TreeViewNodeStateandTreeViewNodePropstypes from@zag-js/tree-view
Changed
-
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" }], // }
[5.14.1] - 2025-06-17
Fixed
- Popover: Fixed issue where
onOpenChangecould be called twice when controlled - File Utils: Improved
downloadFilefunction to handle webview scenarios - Combobox:
- Fixed issue where
onInputValueChangecould be called twice when selecting an item - Fixed issue where combobox with
allowCustomValue: trueused within in a form requires two enter keypress to submit
- Fixed issue where
[5.14.0] - 2025-06-10
Added
- Editable: Added support for
activationMode=none - Collection
- Exposed
copymethod - Added support for
getParentNodesto accept a value or index path
- Exposed
Fixed
- Collection: Fixed issue where entrypoint
@ark-ui/react/collectionwas not working as expected - Carousel: Fixed issue where carousel crashes when
slidesPerPageis 0 - File Upload: Prevented
undefinedinacceptedFileswhen no files accepted - Select: Fixed issue where highlighted item could be cleared when navigating up/down the list with keyboard
- Tabs: Fixed issue where tabs with links should not trigger tab change upon cmd/middle click
- Menu: Fixed issue where
Menu.ItemTextcould not be used withMenu.Item
[5.13.0] - 2025-06-07
Added
- Collection: Added new
useListCollectionhook to create a dynamic list collection.
Fixed
- Progress: Exported
ProgressValueChangeDetailsandProgressValueTranslationDetailstypes from
@zag-js/progress
[5.12.0] - 2025-06-05
Added
- Tree View: Added 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.
Fixed
- Slider
- Fixed issue where
Shift+ArrowRightset value to0instead ofmaxwhen step is too large (e.g.20) - Fixed issue where
onValueChangeEnddoesn't return the latest value when dragging very fast
- Fixed issue where
[5.11.0] - 2025-05-30
Added
- File Upload: Added support for transforming uploaded files via
transformFilescontext property.
Fixed
- Slider: Fixed issue where
minStepsBetweenThumbsisn't computed correctly when interacting with pointer or
keyboard.
[5.10.0] - 2025-05-29
Added
- [NEW] Password Input: Added
PasswordInputcomponent for creating password inputs
import { PasswordInput } from '@ark-ui/react/password-input'
import { EyeIcon, EyeOffIcon } from 'lucide-react'
export const Basic = () => (
<PasswordInput.Root>
<PasswordInput.Label>Password</PasswordInput.Label>
<PasswordInput.Control>
<PasswordInput.Input />
<PasswordInput.VisibilityTrigger>
<PasswordInput.Indicator fallback={<EyeOffIcon />}>
<EyeIcon />
</PasswordInput.Indicator>
</PasswordInput.VisibilityTrigger>
</PasswordInput.Control>
</PasswordInput.Root>
)- Select: Added
onSelectcallback that gets fired when an item is selected via keyboard/mouse.
Fixed
-
Color Picker: Fixed issue where value change end event is invoked when committing via an input.
-
Toast: Fixed issue where calling
toast.remove()without an id shows a TypeScript error. -
Field: Fixed issue where helper text and error text could not be detected in shadow DOM environments.
[5.9.2] - 2025-05-24
Fixed
-
Collection: Export
CollectionOptions,TreeCollectionOptions,GridCollectionOptionstypes. -
Carousel
- Fixed issue where focusing on carousel region and navigating with keyboard doesn't work as expected
- Fixed issue when
allowMouseDragis set where carousel no longer snaps after mouse interaction
-
Combobox: Fixed issue where
onInputValueChangedoesn't get called whenautoFocusis set totrue -
Slider: Fixed issue where slider could throw a error when rendered in an popover or dialog
-
Tour: Fixed issue where calling
api.start(<id>)with a step id doesn't work as expected
[5.9.1] - 2025-05-12
Fixed
-
Combobox: Fixed issue where
focusableprop was not being applied to the trigger element. -
Collection: Fixed issue where
getNextValueandgetPreviousValuedoesn't work as expected whengroupByis
used.
[5.9.0] - 2025-05-05
Added
- Locale: Added
useFilterhook to filter data based on the current locale. - Format: Added
FormatRelativeTimecomponent for formatting relative time.
[5.8.0] - 2025-05-01
Added
- Date Picker: Added support for
outsideDaySelectableprop to allow selecting days outside the current month (on
the same visible date range)
Fixed
- Collapsible: Fixed issue in React.js <= v18.x where collapse animation might not work as expected
[5.7.0] - 2025-04-25
Added
- [NEW] Listbox: Introduced the
Listboxcomponent for selecting a single or multiple items from a list. See the
documentation for details. - Improved support for grouping collection items. Check the
Listbox,SelectorComboboxdocumentation for more
details.
Changed
- Added
package.jsontoexportsfor improved compatibility with tools like Vite.
[5.6.0] - 2025-04-15
Added
- [NEW] AngleSlider: Introduced the
AngleSlidercomponent for selecting an angle. See the
documentation for details. - [NEW] FloatingPanel: Introduced the
FloatingPanelcomponent for creating floating windows. See the
documentation for details. - Toast: Added toast queuing when the max limit is reached:
- New toasts were queued instead of dropped
- Queued toasts were shown when space became available
- Queue cleared when all toasts were removed
- Combobox:
- Fallbacked to the trigger element as the positioning anchor
- Added
data-emptyattribute to indicate an empty listbox or content
[5.5.0] - 2025-04-05
Added
- Presence: Added support for skipping the initial animation when the component is mounted. This can be used in all
disclosure components (e.g.,Dialog,DatePicker,Menuetc).
Fixed
-
Tabs: Fixed issue where tabs indicator animation behaves inconsistently.
-
Date Picker
- Fixed issue where datepicker throws error when navigating month view.
- Fixed issue where range selection doesn't reset correctly when clicking the same start date.
-
Disclosure Components
- Fixed issue where pointerdown outside doesn't work consistently on mobile devices.
- Improved pointerdown outside click detection in shadow DOM environments.
[5.4.0] - 2025-03-28
Added
-
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
- Added
onSelectevent to theMenu.Itemcomponent.
- Added
Fixed
- Ensured each component's state machine starts before processing events.
- HoverCard, ColorPicker: Added missing
tabIndexfor better dialog support. - Menu: Assigned unique IDs to menu items to improve accessibility and HTML validation.
[5.3.1] - 2025-03-24
Fixed
- Fixed an issue where a function was imported from a package that wasn't declared as a dependency.
[5.3.0] - 2025-03-24
Added
- Collapsible: Added an
Indicatorpart to display whether the collapsible was open or closed. - ColorPicker: Added support for formatting the
ValueTextcomponent.
<ColorPicker.ValueText format="hex" /> // #ff0000Fixed
- Combobox: Fixed an issue where
onOpenChangewas called with the sameopenvalue. - DownloadTrigger: Added the missing
use clientdirective. - Splitter: Fixed an issue where
onResizeStartandonResizeEndcallbacks weren't triggered during keyboard
interactions.
[5.2.0] - 2025-03-22
Added
- [NEW] DownloadTrigger: Added Component for downloading a blob or file, whether retrieved synchronously or
asynchronously.
import { DownloadTrigger } from '@ark-ui/react/download-trigger'
export const DownloadImage = () => {
async function fetchImage() {
const response = await fetch('https://picsum.photos/200/300')
return response.blob()
}
return (
<DownloadTrigger data={fetchImage} fileName="avatar.jpeg" mimeType="image/jpeg">
Download Image
</DownloadTrigger>
)
}Changed
- NumberInput: Set the default step to
0.01whenformatOptions.stylewas set topercent. - [Breaking] Splitter: Redesigned splitter machine to support more use cases and improve DX. Check out the
Splitter documentation for more details.
Fixed
- Toast: Fixed issue where setting
offsetstoundefinedcaused the machine to throw. - Select: Fixed issue where select
valueAsStringlost reactivity.
[5.1.0] - 2025-03-17
Added
- Added support for a cleanup function in
ref.
Fixed
- Field: Exported the missing
useFieldhook. - NumberInput:
onValueChangecorrectly receivedvalueAsNumber. - Slider: Thumbs initialized correctly when
minwas set to a non-zero value.
[5.0.1] - 2025-03-11
Fixed
- Effects now flush synchronously instead of using a microtask.
- Checkbox:
data-invalidis no longer set wheninvalidisfalse. - Combobox: Fixed unexpected cursor movement when editing input.
- PinInput: OTP SMS autofill now works as expected.
- RatingGroup: Fixed incorrect focus placement on the label.
- TagsInput: Improved caret detection to prevent unintended tag removal.
- Timer
- Fixed slowdown when switching tabs/windows.
- Changed default
intervalfrom250to1000.
[5.0.0] - 2025-03-06
Ark UI just got a major performance boost! 🚀
What’s new in v5?
- Blazing-fast performance – Every component runs smoother and renders faster.
- Smaller bundle size – Leaner components and adapters for a more efficient build.
We made this happen by using React’s native reactive primitives instead of external stores.
In our stress tests with 10,000 components, Ark v5 delivered 1.5x–4x better performance across the board.
A quick note on tests
Most component updates are non-breaking, but due to this change, some tests may need adjustments. For example:
// Before
it('should open by default', () => {
render(<ComponentUnderTest defaultOpen />)
expect(screen.getByRole('dialog')).toBeInTheDocument()
})
// After
it('should open by default', async () => {
render(<ComponentUnderTest defaultOpen />)
expect(await screen.findByRole('dialog')).toBeInTheDocument()
})Added
- Carousel: ⚠️ Breaking change: Added required prop
slideCounttoCarousel.Rootcomponent. - Clipboard: Added
onValueChangeanddefaultValueprops. - ColorPicker: Added
defaultFormatprop. - Combobox: Added
defaultHighlightedValueanddefaultInputValueprops. - DatePicker: Added
defaultFocusedValueprop,getViewProps, andvisibleRangeText. - HoverCard: Expanded interaction handlers.
- Menu: Added
defaultHighlightedValueprop. - Pagination: Added
defaultPageSizeprop. - PinInput: Added
countprop for better SSR aria-label. - Progress: Added
localeandformatOptionsprops. - QrCode: Added
pixelSizeprop. - Select: Added
defaultHighlightedValueprop. - TagsInput: Added
defaultInputValueprop. - Toggle: Reintroduced toggle machine.
Fixed
- Accordion: Fixed issue in Safari where clicking triggers didn't show content.
- Avatar: Fixed
api.setSrcnot working. - Carousel: Fixed pagination sync and initial page issues.
- File Upload: Fixed drag-and-drop when
directory: true. - Menu: Fixed context menu positioning not updating on right-click.
- Number Input: Fixed
valueprop not being consumed. - Pin Input: Fixed focus warnings and editing issues.
- Progress: Allowed more precise (decimal) values.
- Radio Group, Switch: Improved focus behavior in Safari.
- Select: Fixed regression where
multiple: truedidn't work. - Steps: Ensured ARIA attributes use valid values and wrapped
<li>elements correctly within<ul>or<ol>. - Textarea: Fixed
ResizeObserverwarning. - Timer: Fixed stopping issue when switching tabs; resolved issue where
actionprop was passed toActionTrigger. - Toast: Fixed keyboard navigation skipping close button.
- Toggle Group: Fixed
data-focusnot being removed on blur.