This commit is contained in:
Timothy Jaeryang Baek 2026-09-27 23:15:13 +04:00
parent 6e5e5fe6e9
commit 8fc416ee78
2 changed files with 12 additions and 11 deletions

View file

@ -159,8 +159,8 @@
}
};
const handlePointerDown = (e: PointerEvent) => {
if (!show) return;
const handleWindowClick = (e: MouseEvent) => {
if (!show || e.detail === 0) return;
const target = e.target as Node;
if (
(triggerElement && triggerElement.contains(target)) ||
@ -169,6 +169,8 @@
) {
return;
}
e.preventDefault();
e.stopPropagation();
show = false;
document.getElementById(`model-selector-${id}-button`)?.blur();
};
@ -901,7 +903,7 @@
}}
/>
<svelte:window on:pointerdown={handlePointerDown} on:keydown={handleKeydown} />
<svelte:window on:click|capture={handleWindowClick} on:keydown={handleKeydown} />
<div class="relative w-full">
<button

View file

@ -281,11 +281,15 @@
afterOpen();
}
function handleWindowPointerDown(event: PointerEvent) {
if (!show || !closeOnOutsideClick) return;
function handleWindowClick(event: MouseEvent) {
if (!show || !closeOnOutsideClick || event.detail === 0) return;
if (!(event.target instanceof Node)) return;
if (triggerEl?.contains(event.target)) return;
if (contentEl?.contains(event.target)) return;
// Submenu content is portaled outside contentEl.
if (event.target instanceof Element && event.target.closest('[role="menu"]')) return;
event.preventDefault();
event.stopPropagation();
closeDropdown(false);
}
@ -302,10 +306,7 @@
import { onMount, onDestroy } from 'svelte';
let onPointerDown: ((e: PointerEvent) => void) | undefined;
onMount(() => {
onPointerDown = (e) => handleWindowPointerDown(e);
document.addEventListener('pointerdown', onPointerDown, true);
if (visualViewportAware) {
window.visualViewport?.addEventListener('resize', scheduleSettledPositionUpdates);
window.visualViewport?.addEventListener('scroll', schedulePositionUpdate);
@ -314,9 +315,6 @@
onDestroy(() => {
if (positionFrame != null) cancelAnimationFrame(positionFrame);
for (const timer of settleTimers) window.clearTimeout(timer);
if (onPointerDown) {
document.removeEventListener('pointerdown', onPointerDown, true);
}
if (visualViewportAware) {
window.visualViewport?.removeEventListener('resize', scheduleSettledPositionUpdates);
window.visualViewport?.removeEventListener('scroll', schedulePositionUpdate);
@ -325,6 +323,7 @@
</script>
<svelte:window
on:click|capture={handleWindowClick}
on:keydown={handleKeydown}
on:scroll|capture={positionContent}
on:resize={positionContent}