From cfe8348b107b7c9a37da6e5849d789b1dc09d319 Mon Sep 17 00:00:00 2001 From: jyswee Date: Thu, 23 Jul 2026 22:12:15 +0000 Subject: [PATCH] Seed: healthcare template (18 files) --- src/components/ui/select.tsx | 72 ++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/components/ui/select.tsx diff --git a/src/components/ui/select.tsx b/src/components/ui/select.tsx new file mode 100644 index 0000000..d7f2e80 --- /dev/null +++ b/src/components/ui/select.tsx @@ -0,0 +1,72 @@ +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;