00fdb7e3cd
* simplify `isComposing` We had an issue #2409 where typing using an IME (Input Method Editor, E.g.: Japanese — Romaji) already submitted characters while the user was still composing the characters together. 1. Type `wa` 2. Expected result: `わ` 3. Actual result: `wあ` (where `あ` is the character `a`) This was solved by not triggering change events at all until the `compositionend` event was triggered. This worked fine for this use case. However this also meant that only at the end of your typing session (when you press `enter`/`space`) the actual value was submitted. Fast forward to today, we received a new issue #2575 where this behaviour completely broke on Android devices. Android _always_ use the IME APIs for handling input... if we think about our solution form above, it also means that while you are typing on an Android device no options are being filtered at all. The moment you hit enter/space the combobox will open and results will be filtered. This is where this fix comes in. The goals are simple: 1. Make it work 2. Try to make the current code simpler I started digging to see _why_ this `wあ` was even submitted. A normal input field doesn't do that?! We have some code that does the following things: 1. Sync the selected value with the `input` such that if you update the value from the outside, then the value in the `input` is up-to-date with the `displayValue` of that incoming value. 2. A fix for macOS VoiceOver to improve the VoiceOver experience when opening the `Combobox` component. This is done by manually resetting the value of the `input` field. 1. Keep track of the current value 2. Keep track of the current selection range (start/end) state 3. Reset the input to an empty string `''` 4. Restore the value to the captured value 5. Restore the selection range When you are typing, the input field doesn't have to update yet because typing doesn't cause an option to become the `selected` option, therefore it doesn't have to sync the value yet. So (1.) isn't the issue here. However, when you start typing, the Combobox should open and then we trigger the macOS VoiceOver fix. This is touching the `input` field because we change the value & selection. Because we touched the `input` while the user was still in a composing mode, it bailed and submitted whatever characters it had. This is the part that we don't want. Not applying the macOS VoiceOver fix while typing solves this issue. In addition, because _we_ are touching the input field, VoiceOver is acting normally. In hindsight, the solution is very simple: do not touch the input field when the user is typing. We still keep track whether the user `isComposing` so that we can bail on the default `Enter` behaviour (marking the current option as the selected option) because pressing `Enter` while composing should get out of the IME. Fixes: #2575 * update changelog
33 KiB
33 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
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)
1.7.14 - 2023-06-01
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)
1.7.13 - 2023-04-12
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) - Correctly handle IME composition in
<Combobox.Input>(#2426)
Added
- Add
formprop to form-like components such asRadioGroup,Switch,Listbox, andCombobox(#2356)
1.7.12 - 2023-03-03
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)
1.7.11 - 2023-02-24
Fixed
- Ensure the main tree and parent
Dialogcomponents are marked asinert(#2290) - Fix nested
Popovercomponents not opening (#2293) - Fix
changeevent incorrectly getting called onblur(#2296) - Fix
Dialogcleanup when theDialogbecomes hidden (#2303)
1.7.10 - 2023-02-15
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)
1.7.9 - 2023-02-03
Fixed
- Don't break overflow when multiple dialogs are open at the same time (#2215)
1.7.8 - 2023-01-27
Changed
- Adjust SSR detection mechanism (#2102)
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)
1.7.7 - 2022-12-16
Fixed
- Improve scroll restoration after
Dialogcloses (b20e48dd)
1.7.6 - 2022-12-15
Fixed
- Fix regression where
displayValuecrashes (#2087) - Fix
displayValuesyncing whenCombobox.Inputis unmounted and re-mounted in different trees (#2090) - Fix FocusTrap escape due to strange tabindex values (#2093)
- Improve scroll locking on iOS (#2100, 28234b0e)
1.7.5 - 2022-12-08
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)
1.7.4 - 2022-11-03
Fixed
- Expose
closefunction forMenuandMenuItemcomponents (#1897) - Fix
useOutsideClick, add improvements for ShadowDOM (#1914) - Prevent default slot warning when using a component for
asprop (#1915) - Fire
<ComboboxInput>'s@changehandler when changing the value internally (#1916)
1.7.3 - 2022-09-30
Fixed
- Call
displayValuewith a v-model ofref(undefined)onComboboxInput(#1865) - Improve
Portaldetection forPopovercomponents (#1842) - Fix crash when
childrenareundefined(#1885) - Fix
useOutsideClickswallowing events inside ShadowDOM (#1876) - Fix
Tabincorrectly activating onfocusevent (#1887)
1.7.2 - 2022-09-15
Fixed
- Prevent option selection in
ComboboxInputwhile composing (#1850) - Ensure we handle the
staticprop inTabPanelcomponents correctly (#1856)
1.7.1 - 2022-09-12
Fixed
- Improve iOS scroll locking (#1830)
- Ensure
Taborder stays consistent, and the currently activeTabstays active (#1837)
1.7.0 - 2022-09-06
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)
1.6.7 - 2022-07-12
Fixed
- Prevent cancelling transitions due to focus trap (#1664)
1.6.6 - 2022-07-07
Fixed
- Fix getting Vue dom elements (#1610)
- Ensure
CMD+Backspaceworks in nullable mode forComboboxcomponent (#1617) - Properly merge incoming props with own props (#1651)
- Ensure
PopoverPanelcan be used inside<transition>(#1653)
1.6.5 - 2022-06-20
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)
1.6.4 - 2022-05-29
Fixed
- Ensure
Escapepropagates correctly inComboboxcomponent (#1511) - Remove leftover code in Combobox component (#1514)
1.6.3 - 2022-05-25
Fixed
- Allow to override the
typeon theComboboxInput(#1476) - Ensure the the
<PopoverPanel focus>closes correctly (#1477) - Only render the
FocusSentinelif required in theTabscomponent (#1493)
1.6.2 - 2022-05-19
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)
1.6.1 - 2022-05-03
Fixed
- Manually passthrough
attrsforCombobox,ListboxandTabsGroupcomponent (#1372) - Fix enter transitions in Vue (#1395)
1.6.0 - 2022-04-25
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
DialogBackdropandDialogPanelcomponents (#1333)
1.5.0 - 2022-02-17
Fixed
- Ensure correct order when conditionally rendering
MenuItem,ListboxOptionandRadioGroupOption(#1045) - 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)
Added
1.4.3 - 2022-01-14
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
1.4.2 - 2021-11-08
Fixes
- Stop the event from propagating in the
Popovercomponent (#798) - Allow clicking on elements inside a
DialogOverlay(#816) - Fix SSR crash because of
useWindowEvent(#817) - Improve tree shaking (#859)
- Add
type="button"toTabscomponent (#912)
1.4.1 - 2021-08-30
Fixes
- Only add
type=buttonto real buttons (#709) - Add Vue emit types (#679, #712)
- Fix
escapebug not closing Dialog after clicking in Dialog (#754) - Use
console.warninstead of throwing an error when there are no focusable elements (#775)
1.4.0 - 2021-07-29
Added
- Add new
Tabscomponent (#674, #698) - Make
DisclosureButtonclose the disclosure inside aDisclosurePanel(#682) - Add
aria-orientationtoListbox, which swaps Up/Down with Left/Right keys (#683) - Expose
closefunction from the scoped slot forDisclosure,DisclosurePanel,PopoverandPopoverPanel(#697)
1.3.0 - 2021-06-21
Added
- Ensure that you can use
TransitionChildwhen using implicit Transitions (#503) - Add new
enteredprop forTransitionandTransitionChildcomponents (#504)
Fixes
- Add
aria-disabledon disabledRadioGroup.Optioncomponents (#543) - Improve
disabledandtabindexprop handling (#512) - Improve reactivity when destructuring from props (#512)
- Improve
aria-expandedlogic (#592)
1.2.0 - 2021-05-10
Added
- Introduce Open/Closed state, to simplify component communication (#466)
1.1.1 - 2021-04-28
Fixes
Added
- Add
disabledprop toRadioGroupandRadioGroup.Option(#401) - Add
defaultOpenprop to theDisclosurecomponent (#447)
1.1.0 - 2021-04-26
Fixes
- Improve search, make searching case insensitive (#385)
- Fix unreachable
RadioGroup(#401) - Fix
RadioGroupOptionvalue type (#400) - Fix closing nested
Dialogcomponents when pressingEscape(#430)
Added
- Add
disabledprop toRadioGroupandRadioGroupOption(#401) - Add
defaultOpenprop to theDisclosurecomponent (#447)
1.0.0 - 2021-04-14
Fixes
Added
- Add
SwitchDescriptioncomponent, which adds thearia-describedbyto the actual Switch (#220) - Add
Disclosure,DisclosureButton,DisclosurePanelcomponents (#282) - Add
Dialog,DialogOverlay,DialogTitleandDialogDescriptioncomponents (#282) - Add
PortalandPortalGroupcomponents (#282) - Add
FocusTrapcomponent (#282) - Add
Popover,PopoverButton,PopoverOverlay,PopoverPanelandPopoverGroupcomponents (#282) - Add
RadioGroup,RadioGroupOption,RadioGroupLabelandRadioGroupDescriptioncomponents (#282) - Add
TransitionRootandTransitionChildcomponents (#326)
0.3.1 - 2021-04-02
Fixes
- Fix broken behaviour since Vue 3.0.5 (#279)
0.3.0 - 2021-02-06
Fixes
- Ensure that you can't use Enter to invoke the Switch
- Fix outside click refocus bug (#114)
- Prevent scrolling when refocusing items
- Ensure
Switchhastype="button"(#192) - Added
emitsproperty to Vue components (#199) - Fix
disablednot working when inside a disabled fieldset (#202) - Trigger "outside click" behaviour on mousedown (#212)
- Ensure the
activeMenuItem is scrolled into view - Ensure valid Menu accessibility tree (#228)
Added
- Add render features + render strategy (
staticandunmount={true | false}) (#106) - Add
disabledprop toListboxitself, instead of theListboxButton(#229)
0.2.0 - 2020-10-06
Added
- Add
Listboxcomponent - Add
Switchcomponent
0.1.3 - 2020-09-29
Fixes
- Fix an issue where you couldn't click on menu items that were links.
- Fix outside click behaviour. If you had multiple menu's, when menu 1 is open, menu 2 is closed and you click on menu button 2 it will open both menu's. This is now fixed.
- Ensure when using keyboard navigation we prevent the default behaviour.
0.1.2 - 2020-09-25
Fixes
- Fix issue where button
MenuIteminstances didn't properly fire click events - Don't pass
disabledprop through to children, only addaria-disabled
0.1.1 - 2020-09-24
Added
- Everything!