From f880840f73b69dc07d08f0a246e5bd887cc46a12 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 14 May 2025 01:32:56 -0700 Subject: feat(CommandPalette): Global toggle fading --- src/lib/CommandPalette/CommandPalette.svelte | 96 ++++++++++++++++++++++++---- 1 file changed, 84 insertions(+), 12 deletions(-) diff --git a/src/lib/CommandPalette/CommandPalette.svelte b/src/lib/CommandPalette/CommandPalette.svelte index 02616ba9..56542270 100644 --- a/src/lib/CommandPalette/CommandPalette.svelte +++ b/src/lib/CommandPalette/CommandPalette.svelte @@ -15,6 +15,8 @@ let filtered: CommandPaletteItem[] = []; let selectedIndex = -1; let inputRef: HTMLInputElement; + let isVisible = false; + let timeoutID: ReturnType | null = null; $: filtered = items .filter((item) => item.name.toLowerCase().includes(search.toLowerCase())) @@ -23,6 +25,23 @@ $: if (selectedIndex >= filtered.length) selectedIndex = filtered.length - 1; $: if (selectedIndex < 0 && filtered.length > 0) selectedIndex = 0; + $: if (open && !isVisible) { + isVisible = true; + + if (timeoutID !== null) { + clearTimeout(timeoutID); + + timeoutID = null; + } + } else if (!open && isVisible) { + if (timeoutID === null) { + timeoutID = setTimeout(() => { + isVisible = false; + timeoutID = null; + }, 200); + } + } + const executeItem = (item: CommandPaletteItem) => { if (item.onClick) item.onClick(); if (!item.preventDefault) window.location.href = item.url; @@ -53,17 +72,18 @@ onMount(() => { window.addEventListener('keydown', handleGlobalKey); - return () => window.removeEventListener('keydown', handleGlobalKey); + return () => { + window.removeEventListener('keydown', handleGlobalKey); + + if (timeoutID !== null) clearTimeout(timeoutID); + }; }); const handleClickOutside = (event: MouseEvent) => { const target = event.target as HTMLElement; - if (target.classList.contains('command-palette-overlay')) { - open = false; - } else if (!target.closest('.dropdown')) { + if (target.classList.contains('command-palette-overlay') || !target.closest('.dropdown')) open = false; - } }; const handleGlobalKey = (e: KeyboardEvent) => { @@ -79,14 +99,13 @@ -{#if open} +{#if isVisible}
(open = false)} - on:keydown={(e) => e.key === 'Escape' && (open = false)} /> -