A set of completely unstyled, fully accessible UI components for React, designed to integrate beautifully with Tailwind CSS.
Last release 4 months ago
13 Apr 2026
Release timing varies
gaps range from 8 days to 4 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
819 releases · first in 2020
Release timeline
819 releases since 2020Releases
- 2.2.107 Apr 2026
- 2.2.925 Sept 2025
Release notes2 sources agree
Open source →Fixed
- Improve focus management in shadow DOM roots (#3794)
- Don't accidentally open the
Comboboxwhen touching theComboboxButtonwhile dragging on mobile (#3795) - Ensure sibling
Dialogcomponents are scrollable on mobile (#3796) - Infer
Comboboxtype based ononChangehandler (#3798) - Allow home/end key default behavior inside
ComboboxInputwhenComboboxis closed (#3798) - Ensure interacting with a
Dialogon iOS works after interacting with a disallowed area (#3801) - Freeze Listbox values as soon as a value is selected (#3802)
- Ensure refs are forwarded when freezing data (#3390)
- Do not serialize React components into form fields (49e9e8e)
- 2.2.812 Sept 2025
Release notes2 sources agree
Open source →Fixed
- Ensure we are not freezing data when the
staticprop is used (#3779) - Ensure
onChangetypes are contravariant instead of bivariant (#3781) - Support
<summary>as a focusable element inside<details>(#3389) - Fix
Maximum update depth exceededcrash when usingtransitionprop (#3782) - Ensure pressing
Tabin theComboboxInput, correctly syncs the input value (#3785) - Ensure
--button-widthand--input-widthhave the latest value (#3786) - Fix 'Invalid prop
data-headlessui-statesupplied toReact.Fragment' warning (#3788) - Ensure
elementinrefcallback is always connected when rendering in aPortal(#3789) - Ensure form state is up to date when using uncontrolled components (#3790)
- Ensure
data-openonComboboxInputis up to date (#3791) - Ensure changing the
immediateprop value on theComboboxcomponent works as expected (#3792)
- Ensure we are not freezing data when the
- 2.2.730 Jul 2025
- 2.2.624 Jul 2025
Release notes2 sources agree
Open source →Fixed
- Fix immediately closing Listbox by requiring some cursor movement (#3762)
- 2.2.523 Jul 2025
Release notes2 sources agree
Open source →Fixed
- Fix listbox closing immediately after opening on touch devices (#3755)
- 2.2.420 May 2025
Release notes2 sources agree
Open source →Fixed
- Fix
Comboboxerror (unexpected undefined) when using virtual mode (#3734)
- Fix
- 2.2.312 May 2025
Release notes2 sources agree
Open source →Added
- Add a quick trigger action to the
Menu,ListboxandComboboxcomponents (#3700)
Fixed
- Fix clicking
Labelcomponent should open<Input type="file">(#3707) - Ensure clicking on interactive elements inside
Labelcomponent works (#3709) - Fix focus not returned to SVG Element (#3704)
- Fix
Listboxnot focusing first or last option on ArrowUp / ArrowDown (#3721) - Performance improvement: only re-render top-level component when nesting components e.g.:
Menuinside aDialog(#3722) - Fix closing
Menuwhen otherMenuis opened (#3726)
- Add a quick trigger action to the
- 2.2.217 Apr 2025
- 2.2.14 Apr 2025
Release notes2 sources agree
Open source →Added
- Accept
tabIndexon theCheckboxcomponent (#3645) - Accept
tabIndexon theRadioGroupcomponent (#3646)
Fixed
- Use correct
ownerDocumentwhen using internalPortalcomponent (#3594) - Bump
@tanstack/react-virtualto fix warnings in React 19 projects (#3588) - Fix
aria-invalidattributes to have a valid'true'value (#3639) - Add missing
invalidprop toComboboxcomponent (#3677) - Fix
Unexpected undefinedcrash inComboboxcomponent withvirtualmode (#3678)
- Accept
- 2.2.025 Oct 2024
- 2.1.1010 Oct 2024
- 2.1.93 Oct 2024
- 2.1.812 Sept 2024
Release notes2 sources agree
Open source →Fixed
- Fix crash when using
as={Fragment}onMenuButton,ListboxButton,DisclosureButtonorButtoncomponents (#3478)
- Fix crash when using
- 2.1.711 Sept 2024
Release notes2 sources agree
Open source →Fixed
- Prevent crash in environments where
Element.prototype.getAnimationsis not available (#3473)
- Prevent crash in environments where
- 2.1.69 Sept 2024
- 2.1.54 Sept 2024
Release notes2 sources agree
Open source →Fixed
- Fix transition bug on Firefox, triggered by clicking the
PopoverButtonin rapid succession (#3452)
- Fix transition bug on Firefox, triggered by clicking the
- 2.1.43 Sept 2024
Release notes2 sources agree
Open source →Fixed
- Fix components not closing properly when using the
transitionprop (#3448)
- Fix components not closing properly when using the
- 2.1.323 Aug 2024
- 2.1.25 Jul 2024
Release notes2 sources agree
Open source →Fixed
- Fix prematurely added anchoring styles on
ListboxOptions(#3337) - Ensure
unmountonDialogworks in combination with thetransitionprop onDialogBackdropandDialogPanelcomponents (#3352) - Fix crash in
Comboboxcomponent when invirtualmode when options are empty (#3356) - Fix hanging tests when using
anchorprop (#3357) - Fix
transitionandfocusprop combination forPopoverPanelcomponent (#3361) - Fix outside click in nested portalled
Popovercomponents (#3362) - Fix restoring focus to correct element when closing
Dialogcomponent (#3365) - Fix
flushSyncwarning forComboboxcomponent withimmediateprop enabled (#3366)
- Fix prematurely added anchoring styles on
- 2.1.126 Jun 2024
- 2.1.021 Jun 2024
Release notes
Open source →We just released Headless UI v2.1 for React, which dramatically simplifies our transition APIs and adds support for rendering multiple dialogs as siblings. See our announcement blog to learn more.
Changelog
Added
- Add ability to render multiple
Dialogcomponents at once (without nesting them) (#3242) - Add new data-attribute-based transition API (#3273, #3285, #3307, #3309, #3312)
- Add
DialogBackdropcomponent (#3307, #3310) - Add
PopoverBackdropcomponent to replacePopoverOverlay(#3308)
Fixed
- Keep
Comboboxopen when clicking scrollbar inComboboxOptions(#3249) - Ensure
ComboboxInputdoes not sync with current value while typing (#3259) - Fix visual jitter in
Comboboxcomponent when using native scrollbar (#3190) - Improve UX by freezing
ComboboxOptionswhile closing (#3304) - Merge incoming
styleprop onComboboxOptions,ListboxOptions,MenuItems, andPopoverPanelcomponents (#3250) - Prevent focus on
Checkboxwhen it isdisabled(#3251) - Use
useIdinstead of React internals (for React 19 compatibility) (#3254) - Cancel outside click behavior on touch devices when scrolling (#3266)
- Correctly apply conditional classes when using
TransitionandTransitionChildcomponents (#3303)
Changed
- Allow using the
TabandShift+Tabkeys when theListboxcomponent is open (#3284)
Additional notes
Open source →Added
- Add ability to render multiple
Dialogcomponents at once (without nesting them) (#3242) - Add new data-attribute-based transition API (#3273, #3285, #3307, #3309, #3312)
- Add
DialogBackdropcomponent (#3307, #3310) - Add
PopoverBackdropcomponent to replacePopoverOverlay(#3308)
Fixed
- Keep
Comboboxopen when clicking scrollbar inComboboxOptions(#3249) - Ensure
ComboboxInputdoes not sync with current value while typing (#3259) - Fix visual jitter in
Comboboxcomponent when using native scrollbar (#3190) - Improve UX by freezing
ComboboxOptionswhile closing (#3304) - Merge incoming
styleprop onComboboxOptions,ListboxOptions,MenuItems, andPopoverPanelcomponents (#3250) - Prevent focus on
Checkboxwhen it isdisabled(#3251) - Use
useIdinstead of React internals (for React 19 compatibility) (#3254) - Cancel outside click behavior on touch devices when scrolling (#3266)
- Correctly apply conditional classes when using
TransitionandTransitionChildcomponents (#3303)
Changed
- Allow using the
TabandShift+Tabkeys when theListboxcomponent is open (#3284)
- Add ability to render multiple
- 2.0.424 May 2024
Release notes2 sources agree
Open source →Fixed
- [internal] Don’t set a focus fallback for Dialog’s in demo mode (#3194)
- Ensure page doesn't scroll down when pressing
Escapeto close theDialogcomponent (#3218) - Fix crash when toggling between
virtualand non-virtual mode inComboboxcomponent (#3236) - Ensure tabbing to a portalled
PopoverPanelcomponent moves focus inside (without usingPortalGroup) (#3239) - Only handle form reset when
defaultValueis used (#3240)
Deprecated
- Mark
SwitchGroupas deprecated, preferFieldinstead (#3232)
Changed
- Use native
fieldsetinstead ofdivby default forFieldsetcomponent (#3237)
- 2.0.37 May 2024
Release notes2 sources agree
Open source →Fixed
- Make sure disabling demo mode on
Comboboxworks (#3182)
- Make sure disabling demo mode on
- 2.0.27 May 2024
Release notes2 sources agree
Open source →Fixed
- Improve performance of internal
useInertOthershook (#3181)
- Improve performance of internal
- 2.0.16 May 2024
Release notes2 sources agree
Open source →Fixed
- Remove accidental deprecation comments on
DialogPanelandDialogTitle(#3176)
- Remove accidental deprecation comments on
- 2.0.06 May 2024
Release notes
Open source →We just released Headless UI v2.0 for React which includes a ton of new stuff:
- Built-in anchor positioning — using Floating UI, components like
Menu,Listbox, and more can now automatically position their popovers to be anchored to their trigger, adapting as needed to changes in the viewport. - Headless checkbox component — we've added a headless
Checkboxcomponent to complement our existingRadioGroupcomponent, making it easy to build totally custom checkbox controls. - HTML form components — we've added
Input,Select,Textarea,Label,Description,Fieldset, andLegendcomponents that handle all of the ID generation andaria-*attribute mapping you need to do to connect form fields together. - Improved hover and focus-visible detection — using hooks from the awesome React Aria library under the hood, Headless UI now adds smarter
data-hoveranddata-focusattributes to your controls that behave more consistently across different devices than the native pseudo-classes. - Combobox list virtualization — the
Comboboxcomponent can now handle giant lists of options with no performance issues.
Changelog
Added
- Add new
Checkboxcomponent (#2887, #2962) - Add new
Buttoncomponent (#2887) - Add new
Inputcomponent (#2887, #2902, #2940) - Add new
Textareacomponent (#2887, #2902, #2940) - Add new
Selectcomponent (#2887, #2902) - Add new
FieldsetandLegendcomponents (#2887) - Add new
Field,Label,Descriptioncomponents (#2887, #2941) - Add new
MenuSection,MenuHeading, andMenuSeparatorcomponents (#2887) - Add new
ListboxSelectedOptioncomponent (#2887) - Add new
DataInteractivecomponent (#2887) - Add new
CloseButtoncomponent anduseClosehook (#3096) - Add new
anchor,modal, andportalprops toCombobox,Listbox,MenuandPopovercomponents (#2887, #3075, #3097, #3111, #3115, #3121, #3124, #3133, #3138, #3148, #3152, #3154, #3157) - Add new
autoFocusprop to focusable components (#2887) - Add new
virtualprop toComboboxcomponent (#2779, #3128, #3160, #3161, #3163) - Add new
onCloseprop toComboboxcomponent (#3122) - Add new
immediateprop toComboboxfor immediately opening the Combobox when theinputreceives focus (#2686) - Add new
--button-widthCSS variable on theListboxOptions,MenuItems, andPopoverPanelcomponents (#2887, #3058) - Add new
--input-widthand--button-widthCSS variables on theComboboxOptionscomponent (#3057) - Add new
data-*attributes as an alternative to the existingdata-headlessui-stateattribute (#2887, #3035, #3061)
Fixed
- Fix scroll-locking on iOS (#2891)
- Fix cancellation of events when using
disabledoraria-disabledattributes (#2890) - Fix unnecessary execution of the
displayValuecallback inComboboxInputcomponent (#3048) - Fix types for
multipleprop inComboboxcomponent (#3099) - Fix focus handling in
ComboboxInputcomponent (#3065, #3073) - Fix enter transitions in
Transitioncomponent (#3074) - Fix focus handling in
ListboxOptionsandMenuItemscomponents (#3112) - Fix horizontal scrolling inside the
Dialogcomponent (#2889)
Changed
- Require React 18 (#2887, #3092, #3131)
- Always render hidden form input fields for
Checkbox,SwitchandRadioGroupcomponents (#3095) - Deprecate the
RadioGroup.Optioncomponent in favor of newRadiocomponent (#2887) - Deprecate the
activeprop in favor of newfocusprop (#2887) - Dialog is now focused by default instead of the first focusable element (#2887)
- Change default tags for
ListboxOptions,ListboxOption,ComboboxOptions,ComboboxOption, andTabGroupcomponents (#3109) - Change default tag from
divtoFragmentonTransitioncomponents (#3110, #3147) - Allow
Comboboxcomponent to havenullvalue (#3064, #3100) - Attempt form submission when pressing enter on the
ListboxButtoncomponent (#2972) - Deprecate the
enteredprop on theTransitioncomponent (#3089) - Add frozen value to
ComboboxOptionscomponent (#3126)
<h2 id="upgrading-from-v1">Upgrading from v1</h2>
Update dependencies
Install the latest version of the package via npm:
npm install @headlessui/react@latestDefault element changes
The default rendered element has changed for a number of components in v2.0:
Component v1.x element v2.0 element TransitiondivFragmentTransitionChilddivFragmentListboxOptionsuldivListboxOptionlidivComboboxOptionsuldivComboboxOptionlidivTabGroupFragmentdivIf you are using any of these components without the
asprop, you'll need to add theasprop and render the component with the element you need:- <Transition ...> + <Transition as="div" ...>Comboboxes now always support empty values
Previously the
Comboboxcomponent required an option to always be set, and you could opt out of this behavior using thenullableprop. In v2.0 comboboxes support empty values by default so you can remove this prop:- <Combobox value={selected} onChange={setSelected} nullable> + <Combobox value={selected} onChange={setSelected}>If you'd like to keep the previous behavior, update your
onChangecallback to only set the selected value if an option has actually been selected:<Combobox value={selected} - onChange={setSelected} + onChange={(newValue) => setSelected((oldValue) => newValue ?? oldValue)} onClose={() => setQuery('')} >Dialogs no longer require a focusable child
Previously the
Dialogcomponent would automatically focus the first focusable child on open. This meant that you had to have at least one focusable element within your dialog, otherwise you would see a warning in your console.In v2.0 that is no longer the case and the dialog's root element is focused instead on open.
If you'd like a child element to receive focus when your dialog is opened, you can add the
autoFocusprop to any Headless UI form control:<Dialog> <DialogPanel> - <Listbox ... /> + <Listbox autoFocus ... /> </DialogPanel> </Dialog>For non-Headless UI components, you can add the
data-autofocusattribute to any focusable element:<Dialog> <DialogPanel> - <button>...</button> + <button data-autofocus>...</button> </DialogPanel> </Dialog>Dropdown components are now modal by default
The
Menu,Combobox, andListboxdropdowns are now rendered modal by default. When the dropdown is open the page is scroll-locked and all other page content is madeinert.While this is generally recommended behavior for these components, you can disable this using the
modalprop:- <ComboboxOptions ...> + <ComboboxOptions modal={false} ...>Dialog.OverlayandDialog.Backdropcomponents removedIn Headless UI v1.6 we deprecated the
Dialog.OverlayandDialog.Backdropcomponents. These have now been removed in v2.0.If you're using either of these components, you can update your app to use the new
DialogPanelapproach:<Dialog> - <Dialog.Overlay className="..." /> + <div className="..." /> + <DialogPanel> {/* ... */} + </DialogPanel> </Dialog>Deprecated component dot-notation
The previous component dot-notation has been deprecated in favor of using explicit imports for each individual component. This is to improve compatibility with RSC (React Server Components) and tree-shaking.
We recommend updating to this new API:
- import { Menu } from '@headlessui/react' + import { Menu, MenuButton, MenuItems, MenuItem } from '@headlessui/react' function Example() { return ( <Menu> - <Menu.Button>My account</Menu.Button> - <Menu.Items> - <Menu.Item><a href="/settings">Settings</a></Menu.Item> - <Menu.Item><a href="/support">Support</a></Menu.Item> - <Menu.Item><a href="/license">License</a></Menu.Item> - </Menu.Items> + <MenuButton>My account</MenuButton> + <MenuItems> + <MenuItem><a href="/settings">Settings</a></MenuItem> + <MenuItem><a href="/support">Support</a></MenuItem> + <MenuItem><a href="/license">License</a></MenuItem> + </MenuItems> </Menu> ) }Deprecated component-specific label and description components
With the addition of the multi-purpose
Field,LabelandDescriptioncomponents in v2, we've deprecated the component-specific versions.v1.x component v2.0 replacement Combobox.LabelLabelDialog.DescriptionDescriptionListbox.LabelLabelRadioGroup.DescriptionDescriptionRadioGroup.LabelLabelSwitch.DescriptionDescriptionSwitch.GroupFieldSwitch.LabelLabelWe recommend updating to these new components:
- import { Combobox } from '@headlessui/react' + import { Combobox, ComboboxInput, ComboboxOptions, Field, Label } from '@headlessui/react' function Example() { return ( - <Combobox> - <Combobox.Label>Assignee:</Combobox.Label> - <Combobox.Input /> - <Combobox.Options>{/* ... */}</Combobox.Options> - </Combobox> + <Field> + <Label>Assignee:</Label> + <Combobox> + <ComboboxInput /> + <ComboboxOptions>{/* ... */}</ComboboxOptions> + </Combobox> + <Field> ) }Deprecated
RadioGroup.OptioncomponentWe've deprecated the
RadioGroup.Optionin favor of the more terseRadiocomponent.We recommend updating to this new component:
<RadioGroup> - <RadioGroup.Option>{*/ ...*/}</RadioGroup.Option> + <Radio>{*/ ...*/}</Radio> </RadioGroup>We've also changed the default tag from
divtospan.Deprecated
activeprop in favor offocusWe've deprecated the
activeprop in favor of the newfocusprop on theComboboxOption,ListboxOption,ListboxOption,MenuItem,MenuItem,RadioOption, andRadioOptioncomponents.We recommend updating to this new prop:
<MenuItem > - {({ active }) => ( + {({ focus }) => ( {/* ... */} )} </MenuItem>Deprecated
@headlessui/tailwindcsspackageWith the availability of the new
data-*attributes in v2.0, we've deprecated the@headlessui/tailwindcsspackage.We recommend updating to use the new
data-*attributes instead. Start by removing this package:npm remove @headlessui/tailwindcssNext, replace the
ui-*class modifiers withdata-[*]modifiers:<MenuItem as="a" href="#" - className="ui-active:bg-blue-500 ui-active:text-white" + className="data-[active]:bg-blue-500 data-[active]:text-white" > {*/ ...*/} </MenuItem>Additional notes
Open source →Added
- Add new
Checkboxcomponent (#2887, #2962) - Add new
Buttoncomponent (#2887) - Add new
Inputcomponent (#2887, #2902, #2940) - Add new
Textareacomponent (#2887, #2902, #2940) - Add new
Selectcomponent (#2887, #2902) - Add new
FieldsetandLegendcomponents (#2887) - Add new
Field,Label, andDescriptioncomponents (#2887, #2941) - Add new
MenuSection,MenuHeading, andMenuSeparatorcomponents (#2887) - Add new
ListboxSelectedOptioncomponent (#2887) - Add new
DataInteractivecomponent (#2887) - Add new
CloseButtoncomponent anduseClosehook (#3096) - Add new
anchor,modal, andportalprops toCombobox,Listbox,MenuandPopovercomponents (#2887, #3075, #3097, #3111, #3115, #3121, #3124, #3133, #3138, #3148, #3152, #3154, #3157) - Add new
autoFocusprop to focusable components (#2887) - Add new
virtualprop toComboboxcomponent (#2779, #3128, #3160, #3161, #3163) - Add new
onCloseprop toComboboxcomponent (#3122) - Add new
immediateprop toComboboxfor immediately opening the Combobox when theinputreceives focus (#2686) - Add new
--button-widthCSS variable on theListboxOptions,MenuItems, andPopoverPanelcomponents (#2887, #3058) - Add new
--input-widthand--button-widthCSS variables on theComboboxOptionscomponent (#3057) - Add new
data-*attributes as an alternative to the existingdata-headlessui-stateattribute (#2887, #3035, #3061)
Fixed
- Fix scroll-locking on iOS (#2891)
- Fix cancellation of events when using
disabledoraria-disabledattributes (#2890) - Fix unnecessary execution of the
displayValuecallback inComboboxInputcomponent (#3048) - Fix types for
multipleprop inComboboxcomponent (#3099) - Fix focus handling in
ComboboxInputcomponent (#3065, #3073) - Fix enter transitions in
Transitioncomponent (#3074) - Fix focus handling in
ListboxOptionsandMenuItemscomponents (#3112) - Fix horizontal scrolling inside the
Dialogcomponent (#2889) - Don’t cancel
touchmoveoninputelements inside a dialog (#3166)
Changed
- Require React 18 (#2887, #3092, #3131)
- Always render hidden form input fields for
Checkbox,Switch, andRadioGroupcomponents (#3095) - Deprecate the
RadioGroup.Optioncomponent in favor of newRadiocomponent (#2887) - Deprecate the
activeprop in favor of newfocusprop (#2887) - Dialog is now focused by default instead of the first focusable element (#2887)
- Change default tags for
ListboxOptions,ListboxOption,ComboboxOptions,ComboboxOption, andTabGroupcomponents (#3109) - Change default tag from
divtoFragmentonTransitioncomponents (#3110, #3147) - Allow
Comboboxcomponent to have anullvalue (#3064, #3100) - Attempt form submission when pressing enter on the
ListboxButtoncomponent (#2972) - Deprecate the
enteredprop on theTransitioncomponent (#3089) - Deprecate dot notation for components (#2887, #3170)
- Add frozen value to
ComboboxOptionscomponent (#3126) - Remove deprecated
DialogBackdropandDialogOverlaycomponents (#3171)
- Built-in anchor positioning — using Floating UI, components like
- 2.0.0-alpha.43 Jan 2024pre-release
Release notes2 sources agree
Open source →Fixed
- Ensure
Input,SelectandTextareaexposeRefrelated types (#2902)
- Ensure
- 2.0.0-alpha.321 Dec 2023pre-release
- 2.0.0-alpha.220 Dec 2023pre-release
- 2.0.0-alpha.120 Dec 2023pre-release
Release notes
Open source →Added
- Add
immediateprop to<Combobox />for immediately opening the Combobox when theinputreceives focus (#2686) - Add
virtualprop toComboboxcomponent (#2779) - Add new
Checkboxcomponent - Add new
Radiocomponent as an alternative to the existingRadioGroup.Optioncomponent - Add new
Buttoncomponent - Add new
Inputcomponent - Add new
Textareacomponent - Add new
Selectcomponent - Add new
Field,Label,Description,FieldsetandLegendcomponents - Add new
DataInteractivecomponent - Add new
anchorandmodalprop toComboboxOptions,ListboxOptions,MenuItemsandPopoverPanelcomponents - Add new
ListboxSelectedOptioncomponent - Add new
MenuSection,MenuHeading, andMenuSeparatorcomponents - Add new simplified
data-*attributes as an alternative to the existingdata-headlessui-state="..."attribute - Add
autoFocusprop on focusable components (which maps todata-autofocus)
Changed
- Bumped to React and React DOM 18
- Dialog is focused by default instead of the first focusable element (unless an element exists with a
data-autofocusin the dialog)
Fixed
- Don't call
<Dialog>'sonClosetwice on mobile devices (#2690) - Lazily resolve default containers in
<Dialog>(#2697) - Ensure hidden
Tab.Panelcomponents are hidden from the accessibility tree (#2708) - Add support for
role="alertdialog"to<Dialog>component (#2709) - Ensure blurring the
Combobox.Inputcomponent closes theCombobox(#2712) - Allow changes to the
classNameprop when the<Transition />component is currently not transitioning (#2722) - Export (internal-only) component interfaces for TypeScript compiler (#2313)
- Fix infinite render-loop for
<Disclosure.Panel>and<Popover.Panel>whenas={Fragment}(#2760) - Fix VoiceOver bug for
Listboxcomponent in Chrome (#2824) - Fix outside click detection when component is mounted in the Shadow DOM (#2866)
- Fix CJS types (#2880)
- Fix error when transition classes contain new lines (#2871)
- Fix iOS scroll lock glitches
Additional notes
Open source →Added
- Add
immediateprop toComboboxfor immediately opening the Combobox when theinputreceives focus (#2686) - Add
virtualprop toComboboxcomponent (#2779) - Add new
Checkboxcomponent - Add new
Radiocomponent as an alternative to the existingRadioGroup.Optioncomponent - Add new
Buttoncomponent - Add new
Inputcomponent - Add new
Textareacomponent - Add new
Selectcomponent - Add new
Field,Label,Description,FieldsetandLegendcomponents - Add new
DataInteractivecomponent - Add new
anchorandmodalprop toComboboxOptions,ListboxOptions,MenuItemsandPopoverPanelcomponents - Add new
ListboxSelectedOptioncomponent - Add new
MenuSection,MenuHeading, andMenuSeparatorcomponents - Add new simplified
data-*attributes as an alternative to the existingdata-headlessui-state="..."attribute - Add
autoFocusprop on focusable components (which maps todata-autofocus)
Changed
- Bumped to React and React DOM 18
- Dialog is focused by default instead of the first focusable element (unless an element exists with a
data-autofocusin the dialog)
- Add
- 1.7.1915 Apr 2024
Additional notes
Open source →Fixed
- Make sure panels re-register when IDs are calculated in React < 18 (#2883)
- Expose
disabledstate onTabcomponent (#2918) - Prevent default behaviour when clicking outside of a
Dialog.Panel(#2919) - Add
hiddenattribute to internalHiddencomponent when theFeatures.Hiddenfeature is used (#2955) - Allow setting custom
tabIndexon theSwitchcomponent (#2966) - Forward
disabledstate to hidden inputs in form-like components (#3004) - Respect
selectedIndexfor controlledTabcomponents (#3037)
Additional notes
Open source →Fixed
- Make sure panels re-register when IDs are calculated in React < 18 (#2883)
- Expose
disabledstate onTabcomponent (#2918) - Prevent default behavior when clicking outside of a
Dialog.Panel(#2919) - Add
hiddenattribute to internalHiddencomponent when theFeatures.Hiddenfeature is used (#2955) - Allow setting custom
tabIndexon theSwitchcomponent (#2966) - Forward
disabledstate to hidden inputs in form-like components (#3004) - Respect
selectedIndexfor controlledTabcomponents (#3037)
- 1.7.188 Jan 2024
Additional notes
Open source →Fixed
- Don't call
<Dialog>'sonClosetwice on mobile devices (#2690) - Lazily resolve default containers in
<Dialog>(#2697) - Ensure hidden
Tab.Panelcomponents are hidden from the accessibility tree (#2708) - Add support for
role="alertdialog"to<Dialog>component (#2709) - Ensure blurring the
Combobox.Inputcomponent closes theCombobox(#2712) - Allow changes to the
classNameprop when the<Transition />component is currently not transitioning (#2722) - Export (internal-only) component interfaces for TypeScript compiler (#2313)
- Fix infinite render-loop for
<Disclosure.Panel>and<Popover.Panel>whenas={Fragment}(#2760) - Fix VoiceOver bug for
Listboxcomponent in Chrome (#2824) - Fix outside click detection when component is mounted in the Shadow DOM (#2866)
- Fix CJS types (#2880)
- Fix error when transition classes contain new lines (#2871)
- Improve iOS locking (7721aca)
Additional notes
Open source →Fixed
- Don't call
Dialog'sonClosetwice on mobile devices (#2690) - Lazily resolve default containers in
Dialog(#2697) - Ensure hidden
Tab.Panelcomponents are hidden from the accessibility tree (#2708) - Add support for
role="alertdialog"toDialogcomponent (#2709) - Ensure blurring the
Combobox.Inputcomponent closes theCombobox(#2712) - Allow changes to the
classNameprop when theTransitioncomponent is currently not transitioning (#2722) - Export (internal-only) component interfaces for TypeScript compiler (#2313)
- Fix infinite render-loop for
Disclosure.PanelandPopover.Panelwhenas={Fragment}(#2760) - Fix VoiceOver bug for
Listboxcomponent in Chrome (#2824) - Fix outside click detection when component is mounted in the Shadow DOM (#2866)
- Fix CJS types (#2880)
- Fix error when transition classes contain new lines (#2871)
- Improve iOS locking (7721aca)
- Don't call
- 1.7.1717 Aug 2023
Release notes
Open source →Fixed
- Don't call
<Dialog>'sonClosetwice on mobile devices (#2690) - Fix Portal SSR hydration mismatches (#2700)
- Ensure hidden
TabPanelcomponents are hidden from the accessibility tree (#2708) - Add support for
role="alertdialog"to<Dialog>component (#2709) - Ensure blurring the
ComboboxInputcomponent closes theCombobox(#2712) - Allow
<button>to be in nested components in<PopoverButton>(#2715) - Don't overwrite user-defined template refs when rendering (#2720)
- Fix missing
data-headlessui-stateattribute whenas="template"(#2787) - Fix VoiceOver bug for
Listboxcomponent in Chrome (#2824) - Fix outside click detection when component is mounted in the Shadow DOM (6846231)
- Fix CJS types (#2880)
- Fix error when transition classes contain new lines (#2871)
Additional notes
Open source →Fixed
- Use correct value when resetting
<Listbox multiple>and<Combobox multiple>(#2626) - Render
<MainTreeNode />inPopover.Groupcomponent only (#2634) - Disable smooth scrolling when opening/closing
Dialogcomponents on iOS (#2635) - Don't assume
<Tab />components are available when setting the next index (#2642) - Fix incorrectly focused
Combobox.Inputcomponent on page load (#2654) - Ensure
appearworks using theTransitioncomponent (even when used with SSR) (#2646) - Improve resetting values when using the
nullableprop on theComboboxcomponent (#2660) - Fix hydration of components inside
<Suspense>(#2663) - Prevent scrolling when focusing a tab (#2674)
Additional notes
Open source →Fixed
- Use correct value when resetting
<Listbox multiple>and<Combobox multiple>(#2626) - Render
MainTreeNodeinPopover.Groupcomponent only (#2634) - Disable smooth scrolling when opening/closing
Dialogcomponents on iOS (#2635) - Don't assume
Tabcomponents are available when setting the next index (#2642) - Fix incorrectly focused
Combobox.Inputcomponent on page load (#2654) - Ensure
appearworks using theTransitioncomponent (even when used with SSR) (#2646) - Improve resetting values when using the
nullableprop on theComboboxcomponent (#2660) - Fix hydration of components inside
Suspense(#2663) - Prevent scrolling when focusing a tab (#2674)
- Don't call
- 1.7.1627 Jul 2023
Release notes
Open source →Fixed
- Fix form elements for uncontrolled
<Listbox multiple>and<Combobox multiple>(#2626) - Use correct value when resetting
<Listbox multiple>and<Combobox multiple>(#2626) - Render
<MainTreeNode />inPopoverGroupcomponent only (#2634) - Disable smooth scrolling when opening/closing
Dialogcomponents on iOS (#2635) - Don't assume
<Tab />components are available when setting the next index (#2642) - Improve SSR of the
Disclosurecomponent (#2645) - Fix incorrectly focused
ComboboxInputcomponent on page load (#2654) - Improve resetting values when using the
nullableprop on theComboboxcomponent (#2660) - Prevent scrolling when focusing a tab (#2674)
Additional notes
Open source →Fixed
- Ensure the caret is in a consistent position when syncing the
Combobox.Inputvalue (#2568) - Improve "outside click" behaviour in combination with 3rd party libraries (#2572)
- Ensure IME works on Android devices (#2580)
- Calculate
aria-expandedpurely based on the open/closed state (#2610) - Submit form on
Entereven if no submit-like button was found (#2613)
Additional notes
Open source →Fixed
- Ensure the caret is in a consistent position when syncing the
Combobox.Inputvalue (#2568) - Improve "outside click" behavior in combination with 3rd party libraries (#2572)
- Ensure IME works on Android devices (#2580)
- Calculate
aria-expandedpurely based on the open/closed state (#2610) - Submit form on
Entereven if no submit-like button was found (#2613)
- Fix form elements for uncontrolled
- 1.7.151 Jun 2023
Release notes
Open source →Fixed
- Ensure the caret is in a consistent position when syncing the
Combobox.Inputvalue (#2568) - Improve "outside click" behaviour in combination with 3rd party libraries (#2572)
- Improve performance of
Comboboxcomponent (#2574) - Ensure IME works on Android devices (#2580)
- Calculate
aria-expandedpurely based on the open/closed state (#2610) - Submit form on
Entereven if no submit-like button was found (#2613)
Additional notes2 sources agree
Open source →Added
- [internal] add demo mode to
MenuandPopovercomponents (#2448)
Fixed
- Ensure
FocusTrapis only active when the givenenabledvalue istrue(#2456) - Stop
<Transition appear>from overwriting classes on re-render (#2457) - Improve control over
MenuandListboxoptions while searching (#2471) - Consider clicks inside iframes to be "outside" (#2485)
- Ensure moving focus within a
Portalcomponent, does not close thePopovercomponent (#2492)
Changed
- Move
typescondition to the front (#2469)
- Ensure the caret is in a consistent position when syncing the
- 1.7.1412 Apr 2023
Release notes
Open source →Fixed
- Fix memory leak in
Popovercomponent (#2430) - Ensure
FocusTrapis only active when the givenenabledvalue istrue(#2456) - Ensure the exposed
activeIndexis up to date for theComboboxcomponent (#2463) - Improve control over
MenuandListboxoptions while searching (#2471) - Consider clicks inside iframes to be "outside" (#2485)
- Ensure moving focus within a
Portalcomponent, does not close thePopovercomponent (#2492)
Changed
- Move
typescondition to the front (#2469)
Additional notes
Open source →Fixed
- Fix focus styles showing up when using the mouse (#2347)
- Fix "Can't perform a React state update on an unmounted component." when using the
Transitioncomponent (#2374) - Add
FocusTrapevent listeners once document has loaded (#2389) - Fix
classNamehydration for<Transition appear>(#2390) - Improve
Comboboxtypes to improve false positives (#2411) - Merge
classNamecorrectly when it’s a function (#2412)
Added
- Add
formprop to form-like components such asRadioGroup,Switch,Listbox, andCombobox(#2356)
Additional notes
Open source →Fixed
- Fix focus styles showing up when using the mouse (#2347)
- Fix "Can't perform a React state update on an unmounted component." when using the
Transitioncomponent (#2374) - Add
FocusTrapevent listeners once document has loaded (#2389) - Fix
classNamehydration for<Transition appear>(#2390) - Improve
Comboboxtypes to improve false positives (#2411) - Merge
classNamecorrectly when it’s a function (#2412) - Correctly handle IME composition in
Combobox.Input(#2426)
Added
- Add
formprop to form-like components such asRadioGroup,Switch,Listbox, andCombobox(#2356)
- Fix memory leak in
- 1.7.133 Mar 2023
Release notes
Open source →Fixed
- Fix focus styles showing up when using the mouse (#2347)
- Disable
ComboboxInputwhen itsComboboxis disabled (#2375) - Add
FocusTrapevent listeners once document has loaded (#2389) - Don't scroll-lock
<Dialog>when wrapping transition isn't showing (#2422) - Ensure DOM
refis properly handled in theRadioGroupcomponent (#2424)
Added
- Add
formprop to form-like components such asRadioGroup,Switch,Listbox, andCombobox(#2356)
Additional notes
Open source →Fixed
- Ensure
Transitioncomponent completes if nothing is transitioning (#2318) - Enable native label behavior for
<Switch>where possible (#2265) - Allow root containers from the
Dialogcomponent in theFocusTrapcomponent (#2322) - Fix
XYZPropsWeControland cleanup internal TypeScript types (#2329) - Fix invalid warning when using multiple
Popover.Buttoncomponents inside aPopover.Panel(#2333) - Fix restore focus to buttons in Safari, when
Dialogcomponent closes (#2326)
Additional notes
Open source →Fixed
- Ensure
Transitioncomponent completes if nothing is transitioning (#2318) - Enable native label behavior for
Switchwhere possible (#2265) - Allow root containers from the
Dialogcomponent in theFocusTrapcomponent (#2322) - Fix
XYZPropsWeControland cleanup internal TypeScript types (#2329) - Fix invalid warning when using multiple
Popover.Buttoncomponents inside aPopover.Panel(#2333) - Fix restore focus to buttons in Safari, when
Dialogcomponent closes (#2326)
- 1.7.1224 Feb 2023
Release notes
Open source →Fixed
- Enable native label behavior for
<Switch>where possible (#2265) - Allow root containers from the
Dialogcomponent in theFocusTrapcomponent (#2322) - Cleanup internal TypeScript types (#2329)
- Fix restore focus to buttons in Safari, when
Dialogcomponent closes (#2326) - Ensure hooks in the
FocusTrapcomponent only apply when mounted (#2331)
Additional notes2 sources agree
Open source → - Enable native label behavior for
- 1.7.1115 Feb 2023
Additional notes2 sources agree
Open source →Fixed
- Ensure we handle
nullvalues for thedataRefcorrectly (#2258) - Move
aria-multiselectableto[role=listbox]in theComboboxcomponent (#2271) - Re-focus
Combobox.Inputwhen aCombobox.Optionis selected (#2272) - Ensure we reset the
activeOptionIndexif the active option is unmounted (#2274) - Improve
Reftype for forwardedSwitch's ref (#2277) - Start cleanup phase of the
Dialogcomponent when going into theClosingstate (#2264)
- Ensure we handle
- 1.7.106 Feb 2023
Release notes
Open source →Fixed
- Don’t fire
afterLeaveevent more than once for a given transition (#2267) - Move
aria-multiselectableto[role=listbox]in theComboboxcomponent (#2271) - Re-focus
Combobox.Inputwhen aCombobox.Optionis selected (#2272) - Ensure we reset the
activeOptionIndexif the active option is unmounted (#2274) - Start cleanup phase of the
Dialogcomponent when going into theClosingstate (#2264)
Additional notes2 sources agree
Open source →Fixed
- Revert "Use the
import * as React from 'react'pattern (#2242)
- Don’t fire
- 1.7.93 Feb 2023
Release notes
Open source →Fixed
- Don't break overflow when multiple dialogs are open at the same time (#2215)
Additional notes2 sources agree
Open source →Fixed
- Fix SSR tab hydration when using Strict Mode in development (#2231)
- Don't break overflow when multiple dialogs are open at the same time (#2215)
- Fix "This
Suspenseboundary received an update before it finished hydrating" error in theDisclosurecomponent (#2238) - Use the
import * as React from 'react'pattern (#2242)
- 1.7.827 Jan 2023
Release notes
Open source →Fixed
- Ensure
disabled="false"is not incorrectly passed to the underlying DOM Node (#2138) - Fix arrow key handling in
Tab(after DOM order changes) (#2145) - Fix
Tabkey with non focusable elements inPopover.Panel(#2147) - Don’t overwrite classes during SSR when rendering fragments (#2173)
- Improve
Comboboxaccessibility (#2153) - Fix crash when reading
headlessuiFocusGuardofrelatedTargetin theFocusTrapcomponent (#2203) - Fix
FocusTrapinDialogwhen there is only 1 focusable element (#2172) - Improve
Tabswrapping around when controlling the component and overflowing theselectedIndex(#2213) - Fix
shadow-rootbug closingDialogcontainers (#2217)
Added
- Allow setting
tabIndexon theTab.Panel(#2214)
Changed
- Adjust SSR detection mechanism (#2102)
Additional notes
Open source →Fixed
- Fix SSR tab rendering on React 17 (#2102)
- Fix arrow key handling in
Tab(after DOM order changes) (#2145) - Fix false positive warning about using multiple
<Popover.Button>components (#2146) - Fix
Tabkey with non focusable elements inPopover.Panel(#2147) - Fix false positive warning when using
<Popover.Button />in React 17 (#2163) - Fix
failed to removeChild on Nodebug (#2164) - Don’t overwrite classes during SSR when rendering fragments (#2173)
- Improve
Comboboxaccessibility (#2153) - Fix crash when reading
headlessuiFocusGuardofrelatedTargetin theFocusTrapcomponent (#2203) - Fix
FocusTrapinDialogwhen there is only 1 focusable element (#2172) - Improve
Tabswrapping around when controlling the component and overflowing theselectedIndex(#2213) - Fix
shadow-rootbug closingDialogcontainers (#2217)
Added
- Allow setting
tabIndexon theTab.Panel(#2214)
Additional notes
Open source →Fixed
- Fix SSR tab rendering on React 17 (#2102)
- Fix arrow key handling in
Tab(after DOM order changes) (#2145) - Fix false positive warning about using multiple
Popover.Buttoncomponents (#2146) - Fix
Tabkey with non focusable elements inPopover.Panel(#2147) - Fix false positive warning when using
Popover.Buttonin React 17 (#2163) - Fix
failed to removeChild on Nodebug (#2164) - Don’t overwrite classes during SSR when rendering fragments (#2173)
- Improve
Comboboxaccessibility (#2153) - Fix crash when reading
headlessuiFocusGuardofrelatedTargetin theFocusTrapcomponent (#2203) - Fix
FocusTrapinDialogwhen there is only 1 focusable element (#2172) - Improve
Tabswrapping around when controlling the component and overflowing theselectedIndex(#2213) - Fix
shadow-rootbug closingDialogcontainers (#2217)
Added
- Allow setting
tabIndexon theTab.Panel(#2214)
- Ensure
- 1.7.716 Dec 2022
Release notes3 sources agree
Open source →Fixed
- Improve scroll restoration after
Dialogcloses (b20e48dd)
- Improve scroll restoration after
- 1.7.615 Dec 2022
- 1.7.58 Dec 2022
Release notes
Open source →Fixed
- Reset form-like components when the parent
<form>resets (#2004) - Ensure Popover doesn't crash when
focusis going towindow(#2019) - Ensure
shift+homeandshift+endworks as expected in theComboboxInputcomponent (#2024) - Improve syncing of the
ComboboxInputvalue (#2042) - Fix crash when using
multiplemode withoutvalueprop (uncontrolled) forListboxandComboboxcomponents (#2058) - Allow passing in your own
idprop (#2060) - Add
nullas a valid type for Listbox and Combobox in Vue (#2064, #2067) - Improve SSR for Tabs in Vue (#2068)
- Ignore pointer events in Listbox, Menu, and Combobox when cursor hasn't moved (#2069)
- Allow clicks inside dialog panel when target is inside shadow root (#2079)
Additional notes
Open source →Fixed
- Reset form-like components when the parent
<form>resets (#2004) - Add warning when using
<Popover.Button />multiple times (#2007) - Ensure Popover doesn't crash when
focusis going towindow(#2019) - Ensure
shift+homeandshift+endworks as expected in theCombobox.Inputcomponent (#2024) - Improve syncing of the
Combobox.Inputvalue (#2042) - Fix crash when using
multiplemode withoutvalueprop (uncontrolled) forListboxandComboboxcomponents (#2058) - Apply
enterandenterFromclasses in SSR forTransitioncomponent (#2059) - Allow passing in your own
idprop (#2060) - Fix
Dialogunmounting problem due to incorrecttransitioncancelevent in theTransitioncomponent on Android (#2071) - Ignore pointer events in Listbox, Menu, and Combobox when cursor hasn't moved (#2069)
- Allow clicks inside dialog panel when target is inside shadow root (#2079)
Additional notes
Open source →Fixed
- Reset form-like components when the parent
formresets (#2004) - Add warning when using
Popover.Buttonmultiple times (#2007) - Ensure Popover doesn't crash when
focusis going towindow(#2019) - Ensure
shift+homeandshift+endworks as expected in theCombobox.Inputcomponent (#2024) - Improve syncing of the
Combobox.Inputvalue (#2042) - Fix crash when using
multiplemode withoutvalueprop (uncontrolled) forListboxandComboboxcomponents (#2058) - Apply
enterandenterFromclasses in SSR forTransitioncomponent (#2059) - Allow passing in your own
idprop (#2060) - Fix
Dialogunmounting problem due to incorrecttransitioncancelevent in theTransitioncomponent on Android (#2071) - Ignore pointer events in Listbox, Menu, and Combobox when cursor hasn't moved (#2069)
- Allow clicks inside dialog panel when target is inside shadow root (#2079)
- Reset form-like components when the parent
- 1.7.43 Nov 2022
Additional notes
Open source →Fixed
- Fix
<Popover.Button as={Fragment} />crash (#1889) - Expose
closefunction forMenuandMenu.Itemcomponents (#1897) - Fix
useOutsideClick, add improvements for ShadowDOM (#1914) - Fire
<Combobox.Input>'sonChangehandler when changing the value internally (#1916) - Add
client-onlyto mark everything as client components (#1981)
Added
- Warn when changing components between controlled and uncontrolled (#1878)
Additional notes
Open source →Fixed
- Fix
<Popover.Button as={Fragment} />crash (#1889) - Expose
closefunction forMenuandMenu.Itemcomponents (#1897) - Fix
useOutsideClick, add improvements for ShadowDOM (#1914) - Fire
Combobox.Input'sonChangehandler when changing the value internally (#1916) - Add
client-onlyto mark everything as client components (#1981)
Added
- Warn when changing components between controlled and uncontrolled (#1878)
- Fix
- 1.7.330 Sept 2022
- 1.7.215 Sept 2022
- 1.7.112 Sept 2022
Additional notes2 sources agree
Open source →Fixed
- Improve iOS scroll locking (#1830)
- Add
<fieldset disabled>check to radio group options in React (#1835) - Ensure
Taborder stays consistent, and the currently activeTabstays active (#1837) - Ensure
Combobox.Labelis properly linked when rendered afterCombobox.ButtonandCombobox.Inputcomponents (#1838) - Remove
forceRerenderfromTabcomponent (#1846)
- 1.7.06 Sept 2022
Release notes
Open source →Added
- Add
byprop forListbox,ComboboxandRadioGroup(#1482, #1717, #1814, #1815) - Make form components uncontrollable (#1683)
- Add
@headlessui/tailwindcssplugin (#1487)
Fixed
- Fixed SSR support on Deno (#1671)
- Don’t close dialog when opened during mouse up event (#1667)
- Don’t close dialog when drag ends outside dialog (#1667)
- Fix outside clicks to close dialog when nested, unopened dialogs are present (#1667)
- Close
Menucomponent when usingtabkey (#1673) - Resync input when display value changes (#1679, #1755)
- Ensure controlled
Tabsdon't change automagically (#1680) - Improve outside click on Safari iOS (#1712)
- Improve event handler merging (#1715)
- Fix incorrect scrolling to the bottom when opening a
Dialog(#1716) - Don't overwrite
element.focus()on<PopoverPanel>(#1719) - Improve
Comboboxre-opening keyboard issue on mobile (#1732) - Only select the active option when using "singular" mode when pressing
<tab>in theComboboxcomponent (#1750) - Only restore focus to the
MenuButtonif necessary when activating aMenuOption(#1782) - Don't scroll when wrapping around in focus trap (#1789)
- Improve accessibility when announcing
ListboxOptionandComboboxOptioncomponents (#1812) - Expose the
valuefrom theComboboxandListboxcomponents slot (#1822) - Improve
scroll lockon iOS (#1824)
Additional notes
Open source →Added
- Add
byprop forListbox,ComboboxandRadioGroup(#1482, #1717, #1814, #1815) - Make form components uncontrollable (#1683)
- Add
@headlessui/tailwindcssplugin (#1487)
Fixed
- Fixed SSR support on Deno (#1671)
- Don’t close dialog when opened during mouse up event (#1667)
- Don’t close dialog when drag ends outside dialog (#1667)
- Fix outside clicks to close dialog when nested, unopened dialogs are present (#1667)
- Close
Menucomponent when usingtabkey (#1673) - Resync input when display value changes (#1679, #1755)
- Ensure controlled
Tabsdon't change automagically (#1680) - Don't scroll lock when a Transition + Dialog is mounted but hidden (#1681)
- Allow
Popovercloseto be passed directly toonClickhandlers (#1696) - Improve outside click on Safari iOS (#1712)
- Improve event handler merging (#1715)
- Fix incorrect scrolling to the bottom when opening a
Dialog(#1716) - Improve
Comboboxre-opening keyboard issue on mobile (#1732) - Ensure
Disclosure.Panelis properly linked (#1747) - Only select the active option when using "singular" mode when pressing
<tab>in theComboboxcomponent (#1750) - Improve the types of the
Comboboxcomponent (#1761) - Only restore focus to the
Menu.Buttonif necessary when activating aMenu.Option(#1782) - Don't scroll when wrapping around in focus trap (#1789)
- Fix
Transitioncomponent's incorrect cleanup and order of events (#1803) - Ensure enter transitions work when using
unmount={false}(#1811) - Improve accessibility when announcing
Listbox.OptionandCombobox.Optioncomponents (#1812) - Fix
refstealing from children (#1820) - Expose the
valuefrom theComboboxandListboxcomponents render prop (#1822) - Improve
scroll lockon iOS (#1824) - Fix maximum call stack size exceeded error on
Tabcomponent when usingas={Fragment}(#1826) - Fix "blank" screen on initial load of
Transitioncomponent (#1823)
Additional notes
Open source →Added
- Add
byprop forListbox,ComboboxandRadioGroup(#1482, #1717, #1814, #1815) - Make form components uncontrollable (#1683)
- Add
@headlessui/tailwindcssplugin (#1487)
Fixed
- Fixed SSR support on Deno (#1671)
- Don’t close dialog when opened during mouse up event (#1667)
- Don’t close dialog when drag ends outside dialog (#1667)
- Fix outside clicks to close dialog when nested, unopened dialogs are present (#1667)
- Close
Menucomponent when usingtabkey (#1673) - Resync input when display value changes (#1679, #1755)
- Ensure controlled
Tabsdon't change automagically (#1680) - Don't scroll lock when a Transition + Dialog is mounted but hidden (#1681)
- Allow
Popovercloseto be passed directly toonClickhandlers (#1696) - Improve outside click on Safari iOS (#1712)
- Improve event handler merging (#1715)
- Fix incorrect scrolling to the bottom when opening a
Dialog(#1716) - Improve
Comboboxre-opening keyboard issue on mobile (#1732) - Ensure
Disclosure.Panelis properly linked (#1747) - Only select the active option when using "singular" mode when pressing
tabin theComboboxcomponent (#1750) - Improve the types of the
Comboboxcomponent (#1761) - Only restore focus to the
Menu.Buttonif necessary when activating aMenu.Option(#1782) - Don't scroll when wrapping around in focus trap (#1789)
- Fix
Transitioncomponent's incorrect cleanup and order of events (#1803) - Ensure enter transitions work when using
unmount={false}(#1811) - Improve accessibility when announcing
Listbox.OptionandCombobox.Optioncomponents (#1812) - Fix
refstealing from children (#1820) - Expose the
valuefrom theComboboxandListboxcomponents render prop (#1822) - Improve
scroll lockon iOS (#1824) - Fix maximum call stack size exceeded error on
Tabcomponent when usingas={Fragment}(#1826) - Fix "blank" screen on initial load of
Transitioncomponent (#1823)
- Add
- 1.6.67 Jul 2022
Additional notes2 sources agree
Open source →Fixed
- Ensure
CMD+Backspaceworks in nullable mode forComboboxcomponent (#1617)
- Ensure
- 1.6.520 Jun 2022
Release notes
Open source →Fixed
- Support
<slot>children when usingas="template"(#1548) - Improve outside click of
Dialogcomponent (#1546) - Detect outside clicks from within
<iframe>elements (#1552) - Only render the
Dialogon the client (#1566) - Improve Combobox input cursor position (#1574)
- Fix scrolling issue in
Tabcomponent when using arrow keys (#1584) - Fix missing
aria-expandedforComboboxInputcomponent (#1605)
Additional notes
Open source →Fixed
- Fix incorrect transitionend/transitioncancel events for the Transition component (#1537)
- Improve outside click of
Dialogcomponent (#1546) - Detect outside clicks from within
<iframe>elements (#1552) - Improve Combobox input cursor position (#1574)
- Fix scrolling issue in
Tabcomponent when using arrow keys (#1584)
Additional notes
Open source →Fixed
- Fix incorrect transitionend/transitioncancel events for the Transition component (#1537)
- Improve outside click of
Dialogcomponent (#1546) - Detect outside clicks from within
iframeelements (#1552) - Improve Combobox input cursor position (#1574)
- Fix scrolling issue in
Tabcomponent when using arrow keys (#1584)
- Support
- 1.6.429 May 2022
- 1.6.325 May 2022
- 1.6.219 May 2022
Release notes
Open source →Fixed
- Ensure
DialogPanelexposes its ref (#1404) - Ignore
Escapewhen event got prevented inDialogcomponent (#1424) - Improve
FocusTrapbehaviour (#1432) - Simplify
PopoverTab logic by using sentinel nodes instead of keydown event interception (#1440) - Ensure the
PopoverPanelis clickable without closing thePopover(#1443) - Improve "Scroll lock" scrollbar width for
Dialogcomponent (#1457) - Don’t throw when SSR rendering internal portals in Vue (#1459)
Additional notes
Open source →Fixed
- Fix closing of
Popover.Panelin React 18 (#1409) - Ignore
Escapewhen event got prevented inDialogcomponent (#1424) - Improve
FocusTrapbehaviour (#1432) - Simplify
PopoverTab logic by using sentinel nodes instead of keydown event interception (#1440) - Ensure the
Popover.Panelis clickable without closing thePopover(#1443) - Improve "Scroll lock" scrollbar width for
Dialogcomponent (#1457) - Make the
refoptional in thePopovercomponent (#1465) - Ensure the
refis forwarded on theTransition.Childcomponent (#1473)
Additional notes
Open source →Fixed
- Fix closing of
Popover.Panelin React 18 (#1409) - Ignore
Escapewhen event got prevented inDialogcomponent (#1424) - Improve
FocusTrapbehavior (#1432) - Simplify
PopoverTab logic by using sentinel nodes instead of keydown event interception (#1440) - Ensure the
Popover.Panelis clickable without closing thePopover(#1443) - Improve "Scroll lock" scrollbar width for
Dialogcomponent (#1457) - Make the
refoptional in thePopovercomponent (#1465) - Ensure the
refis forwarded on theTransition.Childcomponent (#1473)
- Ensure
- 1.6.13 May 2022
- 1.6.025 Apr 2022
Release notes
Open source →Fixed
- Make sure that the input syncs when the combobox closes (#1137)
- Ensure that you can close the
Comboboxinitially (#1148) - Fix
Dialogusage inTabcomponent (#1149) - Ensure links are triggered inside
PopoverPanelcomponents (#1153) - Fix
hoverscroll issue inListbox,ComboboxandMenucomponents (#1161) - Guarantee DOM sort order when performing
Listbox,ComboboxandMenuactions (#1168) - Improve outside click support (#1175)
- Reset
ComboboxInputwhen the value gets reset (#1181) - Adjust active
item/optionindex onListbox,ComboboxandMenucomponents (#1184) - Fix re-focusing element after close (#1186)
- Fix
Dialogcycling (#553) - Only activate the
Tabon mouseup (#1192) - Ignore "outside click" on removed elements (#1193)
- Remove
focus()fromListbox.Option(#1218) - Improve some internal code (#1221)
- Don't drop initial character when searching in Combobox (#1223)
- Use
ownerDocumentinstead ofdocument(#1158) - Fix, re-expose
elfrom each component (#1230) - Ensure focus trapping plays well with the
TabandDialogcomponents (#1231) - Improve syncing of
ComboboxInputvalue (#1248) - Fix tree-shaking support (#1247)
- Stop propagation on the
PopoverButton(#1263) - Fix incorrect closing while interacting with third party libraries in
Dialogcomponent (#1268) - Mimic browser select on focus when navigating via
Tab(#1272) - Resolve
initialFocusRefcorrectly (#1276) - Ensure that there is always an active option in the
Combobox(#1279, #1281) - Support classic form submissions in
RadioGroup,SwitchandComboboxcomponents (#1285) - Fix
nullableprop for Vue (2b109548b1a94a30858cf58c8f525554a1c12cbb) - Prefer incoming
openprop over OpenClosed state (#1360)
Added
- Add classic form submission compatibility via new hidden inputs (#1214)
- Add multiple value support to
ListboxandComboboxcomponents (#1243, #1355) - Add support for clearing the value of a
Combobox(#1295) - Add
DialogPanelto resolve issues when scrolling long dialogs that useDialogOverlay(#1333)
Changes that might affect you
Migrating from
DialogOverlaytoDialogPanelIn previous versions of Headless UI, closing a dialog was handled by a click handler that lived on the
DialogOverlaycomponent, so as long as your overlay was rendered behind your panel, clicking outside the panel would close the dialog.This created an issue with scrollable dialogs, because it became easy to accidentally position your overlay on top of the scrollbar, which made it impossible to click the scrollbar without closing the dialog. You also couldn't scroll the dialog when your mouse was hovering over the overlay — only when your mouse was hovering over the actual panel.
We've fixed this in Headless UI v1.6 by adding a dedicated
DialogPanelcomponent, and changing how "click outside" is handled. Now, if you're using aDialogPanel, the dialog is closed any time you click any element outside of it, rather than closing only when aDialogOverlayis explicitly clicked.If you're using
DialogOverlayand not usingDialogPanel, everything will continue to work exactly as it did before (including the bug I described above) to preserve backwards compatibility, but we highly encourage you to migrate to usingDialogPanel, and to stop usingDialogOverlay, instead using a simpledivelement:<Dialog :open="isOpen" @close="closeModal" class="fixed inset-0 flex items-center justify-center ..." > - <DialogOverlay class="fixed inset-0 bg-black/25" /> + <div class="fixed inset-0 bg-black/25" /> - <div class="bg-white shadow-xl rounded-2xl ..."> + <DialogPanel class="bg-white shadow-xl rounded-2xl ..."> <DialogTitle>Payment successful</DialogTitle> <!-- ... --> - </div> + </DialogPanel> </Dialog>Read through the updated Dialog documentation for more examples of using
DialogPanel.Multiple value support for
ListboxandComboboxIf you have been using the insiders build for the new multiple value support for the
Listboxand/orComboboxcomponent, then you will have to add a newmultipleprop to those components to tell the component that you are using multiple values. Previously this was automatically detected based on whether you were passing an array to thevalueprop or not.- <Listbox v-model="selectedPeople" /> + <Listbox v-model="selectedPeople" multiple />Additional notes
Open source →Fixed
- Ensure that you can add the
refprop to all components (#1116) - Ensure links are triggered inside
Popover.Panelcomponents (#1153) - Improve SSR for
Tabcomponent (#1155) - Fix
hoverscroll issue inListbox,ComboboxandMenucomponents (#1161) - Guarantee DOM sort order when performing
Listbox,ComboboxandMenuactions (#1168) - Fix
<Transition>flickering issue (#1118) - Improve outside click support (#1175)
- Ensure that
appearprop on the<Transition>component works regardless of multiple rerenders (#1179) - Reset
Combobox.Inputwhen the value gets reset (#1181) - Fix double
beforeEntercallback on the<Transition>component caused by SSR (#1183) - Adjust active
item/optionindex onListbox,ComboboxandMenucomponents (#1184) - Only activate the
Tabon mouseup (#1192) - Ignore "outside click" on removed elements (#1193)
- Remove
focus()fromListbox.Option(#1218) - Improve some internal code (#1221)
- Use
ownerDocumentinstead ofdocument(#1158) - Ensure focus trapping plays well with the
TabandDialogcomponents (#1231) - Improve syncing of
Combobox.Inputvalue (#1248) - Fix tree-shaking support (#1247)
- Stop propagation on the
Popover.Button(#1263) - Fix incorrect
activeoption in theListboxandComboboxcomponents (#1264) - Properly merge incoming props (#1265)
- Fix incorrect closing while interacting with third party libraries in
Dialogcomponent (#1268) - Mimic browser select on focus when navigating the
Tabcomponent (#1272) - Ensure that there is always an active option in the
Combobox(#1279, #1281) - Support classic form submissions in
RadioGroup,SwitchandComboboxcomponents (#1285) - Add React 18 compatibility (#1326)
- Fix open/closed state issue in
Dialog(#1360)
Added
- Add classic form submission compatibility via new hidden inputs (#1214)
- Add multiple value support to
ListboxandComboboxcomponents (#1243, #1355) - Add support for clearing the value of a
Combobox(#1295) - Add
Dialog.Panelto resolve issues when scrolling long dialogs that useDialog.Overlay(#1333)
Changes that might affect you
Migrating from
Dialog.OverlaytoDialog.PanelIn previous versions of Headless UI, closing a dialog was handled by a click handler that lived on the
Dialog.Overlaycomponent, so as long as your overlay was rendered behind your panel, clicking outside the panel would close the dialog.This created an issue with scrollable dialogs, because it became easy to accidentally position your overlay on top of the scrollbar, which made it impossible to click the scrollbar without closing the dialog. You also couldn't scroll the dialog when your mouse was hovering over the overlay — only when your mouse was hovering over the actual panel.
We've fixed this in Headless UI v1.6 by adding a dedicated
Dialog.Panelcomponent, and changing how "click outside" is handled. Now, if you're using aDialog.Panel, the dialog is closed any time you click any element outside of it, rather than closing only when aDialog.Overlayis explicitly clicked.If you're using
Dialog.Overlayand not usingDialog.Panel, everything will continue to work exactly as it did before (including the bug I described above) to preserve backwards compatibility, but we highly encourage you to migrate to usingDialog.Panel, and to stop usingDialog.Overlay, instead using a simpledivelement:<Dialog open={isOpen} onClose={closeModal} className="fixed inset-0 flex items-center justify-center ..." > - <Dialog.Overlay className="fixed inset-0 bg-black/25" /> + <div className="fixed inset-0 bg-black/25" /> - <div className="bg-white shadow-xl rounded-2xl ..."> + <Dialog.Panel className="bg-white shadow-xl rounded-2xl ..."> <Dialog.Title>Payment successful</Dialog.Title> {/* ... */} - </div> + </Dialog.Panel> </Dialog>Read through the updated Dialog documentation for more examples of using
Dialog.Panel.Multiple value support for
ListboxandComboboxIf you have been using the insiders build for the new multiple value support for the
Listboxand/orComboboxcomponent, then you will have to add a newmultipleprop to those components to tell the component that you are using multiple values. Previously this was automatically detected based on whether you were passing an array to thevalueprop or not.- <Listbox value={selectedPeople} onChange={setSelectedPeople} /> + <Listbox value={selectedPeople} onChange={setSelectedPeople} multiple />Additional notes
Open source →Fixed
- Ensure that you can add the
refprop to all components (#1116) - Ensure links are triggered inside
Popover.Panelcomponents (#1153) - Improve SSR for
Tabcomponent (#1155) - Fix
hoverscroll issue inListbox,ComboboxandMenucomponents (#1161) - Guarantee DOM sort order when performing
Listbox,ComboboxandMenuactions (#1168) - Fix
Transitionflickering issue (#1118) - Improve outside click support (#1175)
- Ensure that
appearprop on theTransitioncomponent works regardless of multiple rerenders (#1179) - Reset
Combobox.Inputwhen the value gets reset (#1181) - Fix double
beforeEntercallback on theTransitioncomponent caused by SSR (#1183) - Adjust active
item/optionindex onListbox,ComboboxandMenucomponents (#1184) - Only activate the
Tabon mouseup (#1192) - Ignore "outside click" on removed elements (#1193)
- Remove
focus()fromListbox.Option(#1218) - Improve some internal code (#1221)
- Use
ownerDocumentinstead ofdocument(#1158) - Ensure focus trapping plays well with the
TabandDialogcomponents (#1231) - Improve syncing of
Combobox.Inputvalue (#1248) - Fix tree-shaking support (#1247)
- Stop propagation on the
Popover.Button(#1263) - Fix incorrect
activeoption in theListboxandComboboxcomponents (#1264) - Properly merge incoming props (#1265)
- Fix incorrect closing while interacting with third party libraries in
Dialogcomponent (#1268) - Mimic browser select on focus when navigating the
Tabcomponent (#1272) - Ensure that there is always an active option in the
Combobox(#1279, #1281) - Support classic form submissions in
RadioGroup,SwitchandComboboxcomponents (#1285) - Add React 18 compatibility (#1326)
- Fix open/closed state issue in
Dialog(#1360)
Added
- 1.5.017 Feb 2022
Release notes
Open source →Fixed
- Ensure correct order when conditionally rendering
MenuItem,ListboxOptionandRadioGroupOption(#1045) - Improve typeahead search logic (#1051)
- Improve overall codebase, use modern tech like
esbuildand TypeScript 4! (#1055) - Improve build files (#1078)
- Ensure typeahead stays on same item if it still matches (#1098)
Added
Additional notes
Open source →Fixed
- Ensure correct order when conditionally rendering
Menu.Item,Listbox.OptionandRadioGroup.Option(#1045) - Improve controlled Tabs behaviour (#1050)
- Improve typeahead search logic (#1051)
- Improve overall codebase, use modern tech like
esbuildand TypeScript 4! (#1055) - Improve build files (#1078)
- Ensure typeahead stays on same item if it still matches (#1098)
- Fix off-by-one frame issue causing flicker (#1111)
- Trigger scrollIntoView effect when position changes (#1113)
Added
Additional notes
Open source →Fixed
- Ensure correct order when conditionally rendering
Menu.Item,Listbox.OptionandRadioGroup.Option(#1045) - Improve controlled Tabs behavior (#1050)
- Improve typeahead search logic (#1051)
- Improve overal codebase, use modern tech like
esbuildand TypeScript 4! (#1055) - Improve build files (#1078)
- Ensure typeahead stays on same item if it still matches (#1098)
- Fix off-by-one frame issue causing flicker (#1111)
- Trigger scrollIntoView effect when position changes (#1113)
Added
- Ensure correct order when conditionally rendering
- 1.4.314 Jan 2022
Release notes
Open source →Fixes
- Fix missing key binding in examples (#1036, #1006)
- Fix slice => splice typo in
Tabscomponent (#1037, #986) - Ensure correct DOM node order when performing focus actions (#1038)
Added
Additional notes2 sources agree
Open source →Fixes
- Ensure portal root exists in the DOM (#950)
- Ensure correct DOM node order when performing focus actions (#1038)
Added