import { useEffect, useRef, useState } from "react"; import { AnimatePresence, motion } from "framer-motion"; import { useUIStore } from "../../stores/useUIStore"; export function CommandPalette() { const { paletteOpen, setPalette } = useUIStore(); const [q, setQ] = useState(""); const inputRef = useRef(null); useEffect(() => { const h = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key === "k") { e.preventDefault(); setPalette(!paletteOpen); } if (e.key === "Escape") setPalette(false); }; window.addEventListener("keydown", h); return () => window.removeEventListener("keydown", h); }, [paletteOpen]); useEffect(() => { if (paletteOpen) inputRef.current?.focus(); }, [paletteOpen]); const COMMANDS = [ "New Chat", "Toggle Terminal", "Open File", "Deploy", "Settings", ]; return ( {paletteOpen && ( setPalette(false)} > e.stopPropagation()} > setQ(e.target.value)} placeholder="Type a command or search…" className="w-full border-b bg-transparent px-4 py-3 text-sm outline-none" style={{ borderColor: 'var(--border)', color: 'var(--text)', }} />
{COMMANDS.filter((c) => c.toLowerCase().includes(q.toLowerCase()), ).map((c) => (
{ e.currentTarget.style.background = 'var(--surface-hover)'; e.currentTarget.style.color = 'var(--text)'; }} onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = 'var(--text-subtle)'; }} > {c}
))}
)}
); }