diff --git a/packages/@headlessui-react/src/components/listbox/listbox.tsx b/packages/@headlessui-react/src/components/listbox/listbox.tsx index aa59f2606..6d5aa042c 100644 --- a/packages/@headlessui-react/src/components/listbox/listbox.tsx +++ b/packages/@headlessui-react/src/components/listbox/listbox.tsx @@ -441,11 +441,21 @@ function ButtonFn( flushSync(() => machine.actions.closeListbox()) machine.state.buttonElement?.focus({ preventScroll: true }) } else { + if (event.pointerType !== 'mouse') return event.preventDefault() machine.actions.openListbox({ focus: Focus.Nothing }) } }) + let handleClick = useEvent((event: ReactPointerEvent) => { + if (event.button !== 0) return // Only handle left clicks + if (isDisabledReactIssue7711(event.currentTarget)) return event.preventDefault() + if (machine.state.listboxState !== ListboxStates.Closed) return + if (event.pointerType === 'mouse') return + event.preventDefault() + machine.actions.openListbox({ focus: Focus.Nothing }) + }) + // This is needed so that we can "cancel" the click event when we use the `Enter` key on a button. let handleKeyPress = useEvent((event: ReactKeyboardEvent) => event.preventDefault()) @@ -487,6 +497,7 @@ function ButtonFn( onKeyUp: handleKeyUp, onKeyPress: handleKeyPress, onPointerDown: handlePointerDown, + onClick: handleClick, }, focusProps, hoverProps, diff --git a/playgrounds/react/pages/listbox/listbox-overlaps.tsx b/playgrounds/react/pages/listbox/listbox-overlaps.tsx new file mode 100644 index 000000000..14b48314e --- /dev/null +++ b/playgrounds/react/pages/listbox/listbox-overlaps.tsx @@ -0,0 +1,81 @@ +import { Label, Listbox, ListboxButton, ListboxOption, ListboxOptions } from '@headlessui/react' +import { useState } from 'react' + +let people = [ + 'Wade Cooper', + 'Arlene Mccoy', + 'Devon Webb', + 'Tom Cook', + 'Tanya Fox', + 'Hellen Schmidt', + 'Caroline Schultz', + 'Mason Heaney', + 'Claudie Smitham', + 'Emil Schaefer', +] + +export default function Home() { + let [active, setActivePerson] = useState(people[0]) + + return ( +
+
+
+ + + +
+ + + {active} + + + + + + + + + + {people.map((name) => ( + + + {name} + + + + + + + + ))} + +
+
+
+
+
+ ) +}