v1.21.0

We're excited to welcome a brand new component to the family! The new NavigationTree component displays a hierarchical set of links, perfect for building sidebars and complex app navigation. It comes fully loaded with keyboard navigation, and support for nested routes.

Menu also gets a big upgrade this release: it now supports async loading and empty states! Load menu items from an API as the user scrolls with the new MenuLoadMoreItem and use renderEmptyState to show a indicator when data is loading or when the menu is empty.

TokenField selection API update

TokenFieldValue now tracks the full selected range instead of a single caret position. The caretPosition property is replaced by selectedRange, which stores both the anchor and current offsets so a range selection can be restored after an undo or redo. Use withSelectedRange to update the selection going forward.

Finally, this release also features many fixes and updates from external contributors! As always, a big thank you for all the support!

Changelog

General Changes

  • Re-export FocusableElement, HoverEvent, and KeyboardEvent types from react-aria-components - @sobol-sudo - PR
  • Export setInteractionModality - @snowystinger - PR
  • Keep the interaction modality on window refocus so Safari doesn't show a focus ring - @daveycodez - PR
  • Apply hook filters in optimize-locales-plugin so unused locale strings are removed - @wojtekmaj - PR
  • Improve setStyle and focus handling in usePreventScroll - @snowystinger - PR
  • Upgrade to TypeScript 7 - @devongovett - PR

Calendar

  • Allow selecting dates outside the visible range when isDateUnavailable is set - @cycsmail - PR

Checkbox

  • UpdateinputRef type to accept callback refs - @timges - PR

ColorField

  • Commit the value when pressing Enter - @grayashh - PR

Collections

  • Select the autofocused item when selectOnFocus is enabled - @xevrion - PR

Date and Time

  • Fix Ethiopic and Coptic year estimation in julianDayToCE on new year dates - @FrancoKaddour - PR

Dialog

  • Allow DialogTrigger to work when nested inside Tabs - @RobHannay - PR
  • Support Select and Combobox inside a Dialog - @yihuiliao - PR

Form

  • Add Formisch to the form libraries section of the forms doc guide - @fabian-hiller - PR
  • Add async loading and empty state support to Menu - @LFDanLu - PR
  • Add typeahead support to Menu example in docs - @snowystinger - PR

Overlays

  • Fix position overlays on iOS 26 - @nwidynski - PR
  • Guard against a null restore target in FocusScope restoreFocus - @Faithfinder - PR

RadioGroup

  • UpdateinputRef type to accept callback refs - @timges - PR

Switch

  • Update inputRef type to accept callback refs - @timges - PR

Table

  • Insert at the end when dropping past the last row instead of failing to resolve the drop target - @meesvandongen - PR

Tabs

  • Keep ArrowLeft and ArrowRight consistent in RTL vertical orientation - @starboyvarun - PR

TokenField

  • Track the TokenField selection range to allow external control and restore selection on undo - @devongovett - PR, PR
  • Fix IME composition in Firefox - @chirokas - PR
  • Fix TokenField docs regex for IME - @LFDanLu - PR

Released packages

 - @internationalized/date@3.12.4
 - @internationalized/number@3.6.8
 - @react-aria/test-utils@1.0.0-rc.1
 - @react-aria/optimize-locales-plugin@2.0.2
 - @react-aria/mcp@1.2.1
 - react-aria@3.52.0
 - react-aria-components@1.21.0
 - react-stately@3.50.0