From 7bc046c7e77c726013ca28731d9f4c16f3a9346f Mon Sep 17 00:00:00 2001 From: Grug Date: Fri, 23 Oct 2026 14:52:16 +0800 Subject: [PATCH] Keep parent popovers open when a nested one opens (#213) Opening a popover, dropdown menu, select or combobox closed every other open one, including the popover it sits in. Only close the ones that don't contain the source, like native popover=auto. Co-authored-by: grugbraindev <178141691+grugbraindev@users.noreply.github.com> --- src/js/combobox.js | 2 +- src/js/dropdown-menu.js | 2 +- src/js/popover.js | 2 +- src/js/select.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/js/combobox.js b/src/js/combobox.js index 5976b75..8af4ce9 100644 --- a/src/js/combobox.js +++ b/src/js/combobox.js @@ -507,7 +507,7 @@ if (!root.contains(event.target)) root.close(false); }; const handleDocumentPopover = (event) => { - if (event.detail.source !== root) root.close(false); + if (!root.contains(event.detail.source)) root.close(false); }; state.input.addEventListener('focus', handleInputFocus); diff --git a/src/js/dropdown-menu.js b/src/js/dropdown-menu.js index 04c7e0e..7edb92e 100644 --- a/src/js/dropdown-menu.js +++ b/src/js/dropdown-menu.js @@ -165,7 +165,7 @@ }; const handleDocumentPopover = (event) => { - if (event.detail.source !== root) root.close(false); + if (!root.contains(event.detail.source)) root.close(false); }; state.trigger.addEventListener('click', handleTriggerClick); diff --git a/src/js/popover.js b/src/js/popover.js index 69dd4ff..c789baa 100644 --- a/src/js/popover.js +++ b/src/js/popover.js @@ -60,7 +60,7 @@ }; const handleDocumentPopover = (event) => { - if (event.detail.source !== popoverComponent) { + if (!popoverComponent.contains(event.detail.source)) { closePopover(false); } }; diff --git a/src/js/select.js b/src/js/select.js index c42ce1d..19b04d9 100644 --- a/src/js/select.js +++ b/src/js/select.js @@ -373,7 +373,7 @@ if (!root.contains(event.target)) root.close(false); }; const handleDocumentPopover = (event) => { - if (event.detail.source !== root) root.close(false); + if (!root.contains(event.detail.source)) root.close(false); }; state.trigger.addEventListener('keydown', handleTriggerKeydown);