'use client'; import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react'; interface Ctx { open: boolean; setOpen: (v: boolean) => void; } const SearchCtx = createContext({ open: false, setOpen: () => {} }); /** Global search state + ⌘K / Ctrl+K / "/" shortcuts. */ 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.altKey) { 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(SearchCtx); } export function useOpenSearch() { const { setOpen } = useSearch(); return useCallback(() => setOpen(true), [setOpen]); }