import { useEffect, useMemo, useRef, useState } from "react"; import { Check, ChevronDown, Search } from "lucide-react"; /** Select con búsqueda (autocomplete) accesible y ligero. */ export function BuscadorSelect({ opciones, valor, onChange, placeholder = "Selecciona una opción", buscarPlaceholder = "Buscar lugar de cita…", cargando = false, vacioTexto = "Sin resultados", id, }: { opciones: string[]; valor: string; onChange: (v: string) => void; placeholder?: string; buscarPlaceholder?: string; cargando?: boolean; vacioTexto?: string; id?: string; }) { const [abierto, setAbierto] = useState(false); const [query, setQuery] = useState(""); const ref = useRef(null); useEffect(() => { const fuera = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setAbierto(false); }; document.addEventListener("mousedown", fuera); return () => document.removeEventListener("mousedown", fuera); }, []); const filtradas = useMemo(() => { const q = query.trim().toLowerCase(); if (!q) return opciones; return opciones.filter((o) => o.toLowerCase().includes(q)); }, [opciones, query]); return (
{abierto && (
setQuery(e.target.value)} placeholder={buscarPlaceholder} className="w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground" />
    {cargando &&
  • Cargando…
  • } {!cargando && filtradas.length === 0 && (
  • {vacioTexto}
  • )} {filtradas.map((o) => (
  • ))}
)}
); }