import * as React from "react"; import { cn } from "@/lib/utils"; const SelectContext = React.createContext<{ value: string; setValue: (v: string) => void; open: boolean; setOpen: (o: boolean) => void; labels: React.MutableRefObject>; }>({ value: "", setValue: () => {}, open: false, setOpen: () => {}, labels: { current: {} } as any }); export function Select({ defaultValue = "", value: controlled, onValueChange, children }: { defaultValue?: string; value?: string; onValueChange?: (v: string) => void; children?: React.ReactNode }) { const [internal, setInternal] = React.useState(defaultValue); const [open, setOpen] = React.useState(false); const labels = React.useRef>({}); const value = controlled ?? internal; const setValue = (v: string) => { setInternal(v); onValueChange?.(v); setOpen(false); }; return (
{children}
); } export function SelectTrigger({ className, children, ...props }: React.ButtonHTMLAttributes) { const ctx = React.useContext(SelectContext); return ( ); } export function SelectValue({ placeholder }: { placeholder?: string }) { const ctx = React.useContext(SelectContext); return {ctx.value ? (ctx.labels.current[ctx.value] ?? ctx.value) : (placeholder || "Select...")}; } export function SelectContent({ className, children, ...props }: React.HTMLAttributes) { const ctx = React.useContext(SelectContext); if (!ctx.open) return null; return (
{children}
); } export function SelectItem({ value, className, children, ...props }: React.HTMLAttributes & { value: string }) { const ctx = React.useContext(SelectContext); ctx.labels.current[value] = children; return (
ctx.setValue(value)} className={cn("cursor-pointer px-3 py-2 text-sm hover:bg-slate-100", ctx.value === value && "bg-slate-50 font-medium", className)} {...props} > {children}
); } export function SelectGroup({ children }: { children?: React.ReactNode }) { return
{children}
; } export function SelectLabel({ className, ...props }: React.HTMLAttributes) { return
; } export default Select;