'use client'; import { createContext, type ReactNode, useCallback, useContext, useEffect, useMemo, useState } from 'react'; const Ctx = createContext<{ open: boolean; setOpen: (v: boolean) => void }>({ open: false, setOpen: () => undefined }); /** Global ⌘K / "/" search dialog state. */ export function SearchProvider({ children }: { children: ReactNode }) { const [open, setOpen] = useState(false); useEffect(() => { const onKey = (e: KeyboardEvent) => { const target = e.target as HTMLElement | null; const typing = target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable); if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') { e.preventDefault(); setOpen((o) => !o); } else if (e.key === '/' && !typing && !e.metaKey && !e.ctrlKey) { e.preventDefault(); setOpen(true); } }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, []); const value = useMemo(() => ({ open, setOpen }), [open]); return {children}; } export function useSearch() { return useContext(Ctx); } export function useOpenSearch() { const { setOpen } = useContext(Ctx); return useCallback(() => setOpen(true), [setOpen]); }