Watch
0
0
Fork
You've already forked hyperhive
0

swarm-ui: an open dropdown closes only on a scroll that moves it

This commit is contained in:
iris 2026-10-25 17:19:51 +01:00
commit 32a4821cb4

View file

@ -15,8 +15,8 @@
// layer: it is not clipped by a scrolling ancestor, and inside a modal // layer: it is not clipped by a scrolling ancestor, and inside a modal
// `<dialog>` it shows above the dialog (it is a descendant of the control, so // `<dialog>` it shows above the dialog (it is a descendant of the control, so
// the dialog's inertness leaves it alone). `position: fixed` coordinates come // the dialog's inertness leaves it alone). `position: fixed` coordinates come
// from the control's box (`placePopup`). A scroll or resize elsewhere, or a // from the control's box (`placePopup`). A scroll that moves the control, a
// click outside, closes it, as a native select's list closes. // resize, or a click outside closes it, as a native select's list closes.
// //
// Not a native control, so there is no form validation: `required` is only // Not a native control, so there is no form validation: `required` is only
// `aria-required`, and a caller that needs a choice checks it itself. // `aria-required`, and a caller that needs a choice checks it itself.
@ -129,8 +129,11 @@ export function Listbox({
if (!triggerRef.current?.contains(t) && !listRef.current?.contains(t)) if (!triggerRef.current?.contains(t) && !listRef.current?.contains(t))
closeList(); closeList();
} }
// Only a scroll that moves the control closes it: the page, or a box the
// control sits in. A live terminal scrolling itself elsewhere on the page
// must not shut it under the pointer.
function onScroll(e: Event) { function onScroll(e: Event) {
if (!listRef.current?.contains(e.target as Node)) closeList(); if ((e.target as Node).contains(triggerRef.current)) closeList();
} }
document.addEventListener("pointerdown", onPointerDown); document.addEventListener("pointerdown", onPointerDown);
window.addEventListener("scroll", onScroll, true); window.addEventListener("scroll", onScroll, true);