NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #4495 most downloaded on npm
A set of completely unstyled, fully accessible UI components for React, designed to integrate beautifully with Tailwind CSS.
Last release 5 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
One column per quarter.
Stop the event from propagating in the Popover component
Only add type=button to real buttons
Add new Tabs component (#674, #698)
Tabs component (#674, #698)Disclosure.Button close the disclosure inside a Disclosure.Panel (#682)aria-orientation to Listbox, which swaps Up/Down with Left/Right keys (#683)close function from the render prop for Disclosure, Disclosure.Panel, Popover and Popover.Panel (#697)Ensure that you can use TransitionChild when using implicit Transitions
Transition.Child when using implicit Transitions (#503)entered prop for Transition and Transition.Child components (#504)aria-disabled on disabled RadioGroup.Option components (#543)disabled and tabindex prop handling (#512)open prop in the Dialog component (#550)aria-expanded logic (#592):className prop (#607)Listbox component (#576):class prop (#608)react-dom, and for the future version 18 (#622)Introduce Open/Closed state, to simplify component communication
Dialog (#477)Dialog components (#560)The Open/Closed state unlocks a feature where all our components can interact with each other. This means that you don't need to use the render prop function, and that you also don't need the static prop anymore for transitions. Here is an example in the docs that explains this: https://headlessui.dev/react/menu#transitions
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix form submission within Dialog
Nothing published for this version
Nothing published for this version
Nothing published for this version
Improve search, make searching case insensitive
RadioGroup (#401)Dialog components when pressing Escape (#430)This is the v1 release of Headless UI - Vue
This is the v1 release of Headless UI - Vue
We introduced a bunch of new components for this release:
We also created a beautiful new documentation website: https://headlessui.dev/vue
SwitchDescription component, which adds the aria-describedby to the actual Switch (#220)Disclosure, DisclosureButton, DisclosurePanel components (#282)Dialog, DialogOverlay, DialogTitle and DialogDescription components (#282)Portal and PortalGroup components (#282)FocusTrap component (#282)Popover, PopoverButton, PopoverOverlay, PopoverPanel and PopoverGroup components (#282)RadioGroup, RadioGroupOption, RadioGroupLabel and RadioGroupDescription components (#282)TransitionRoot and TransitionChild components (#326)This is the v1 release of Headless UI - React
We introduced a bunch of new components for this release:
We also created a beautiful new documentation website: https://headlessui.dev/react
outside click not re-focusing the Menu.Button (#220, #256)outside click not re-focusing the Listbox.Button (#220, #256)Menu.Items and Listbox.Options from within the component itself (#261)Disclosure, Disclosure.Button and Disclosure.Panel components (#220)Dialog, Dialog.Overlay, Dialog.Tile and Dialog.Description components (#220)Portal and Portal.Group component (#220)Switch.Description component, which adds the aria-describedby to the actual Switch (#220)FocusTrap component (#220)Popover, Popover.Button, Popover.Overlay, Popover.Panel and Popover.Group components (#220)className, can now also receive a function with the renderProp argument (#257)RadioGroup, RadioGroup.Option, RadioGroup.Label and RadioGroup.Description components (#274)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix incorrect type error unique symbol (#248, #240)
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Fix broken behaviour since Vue 3.0.5
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Ensure that you can't use Enter to invoke the Switch
Switch has type="button" (#192)emits property to Vue components (#199)disabled not working when inside a disabled fieldset (#202)active MenuItem is scrolled into viewSwitch has type="button" (#192)useId() hook returning undefined on the clientdisabled not working when inside a disabled fieldset (#202)active MenuItem is scrolled into viewbeforeEnter, afterEnter, beforeLeave and afterLeave) (#57)static and unmount={true | false}) (#106)
div by default (unless you change this using the as={...} prop).ref anymore.unmount prop to the Transition and Transition.Child components.disabled prop to Listbox itself, instead of the Listbox.Button (#229)We changed the API of the Transition component to be more inline with the other API's of the various components. We now always render a div for the Transition and Transition.Child component. If you want to use a render function, then we still render a div. The render function also used do expose a ref prop, which is now not the case anymore.
You can still use the as prop to change the underlying div to another element or component.
// From
<Transition
show={true}
enter=".."
enterFrom=".."
enterTo=".."
leave=".."
leaveFrom=".."
leaveTo=".."
>
{ref => (
<div ref={ref} className="these classes always apply">
<span>Child</span>
</div>
)}
</Transition>
// To (option 1) - Hoist attributes from the first child `div` to the `Transition` itself
<Transition
show={true}
enter=".."
enterFrom=".."
enterTo=".."
leave=".."
leaveFrom=".."
leaveTo=".."
className="these classes always apply"
>
<span>Child</span>
</Transition>
// To (option 2) - Add `as={Fragment}` to the `Transition` component.
<Transition
as={React.Fragment}
show={true}
enter=".."
enterFrom=".."
enterTo=".."
leave=".."
leaveFrom=".."
leaveTo=".."
>
<div className="these classes always apply">
<span>Child</span>
</div>
</Transition>
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Add ui-focus-visible variant to Tailwind plugin
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →