// fallow-ignore-file unused-export import * as React from "react"; import * as SelectPrimitive from "@radix-ui/react-select"; import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"; import { cn } from "~/client/lib/utils"; const SelectSsrValueContext = React.createContext<{ hydrated: boolean; items: Map; value: string | undefined; } | null>(null); function collectSelectItems(children: React.ReactNode, items = new Map()) { for (const child of React.Children.toArray(children)) { if (!React.isValidElement<{ children?: React.ReactNode; value?: string }>(child)) { continue; } if ((child.type === SelectItem || child.type === SelectPrimitive.Item) && typeof child.props.value === "string") { items.set(child.props.value, child.props.children); } if (child.props.children) { collectSelectItems(child.props.children, items); } } return items; } function Select({ children, value, ...props }: React.ComponentProps) { const [hydrated, setHydrated] = React.useState(false); const items = collectSelectItems(children); React.useEffect(() => { setHydrated(true); }, []); return ( {children} ); } function SelectGroup({ ...props }: React.ComponentProps) { return ; } function SelectValue({ children, placeholder, style, ...props }: React.ComponentProps) { const context = React.useContext(SelectSsrValueContext); const selectedItem = context?.value !== undefined && context.value !== "" ? context.items.get(context.value) : undefined; if (!context?.hydrated) { return ( {children ?? selectedItem ?? placeholder} ); } return ( {children} ); } function SelectTrigger({ className, size = "default", children, ...props }: React.ComponentPropsWithoutRef & { size?: "sm" | "default"; }) { const context = React.useContext(SelectSsrValueContext); const hasValue = context?.value !== undefined && context.value !== ""; const triggerClassName = cn( "border-input data-placeholder:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&+select[aria-hidden=true]]:hidden [&:has(+select[aria-hidden=true]:last-child)]:mb-0", className, ); if (!context?.hydrated) { return (
{children}
); } return ( {children} ); } function SelectContent({ className, children, position = "popper", ...props }: React.ComponentProps) { return ( {children} ); } function SelectLabel({ className, ...props }: React.ComponentProps) { return ( ); } function SelectItem({ className, children, ...props }: React.ComponentProps) { return ( {children} ); } function SelectSeparator({ className, ...props }: React.ComponentProps) { return ( ); } function SelectScrollUpButton({ className, ...props }: React.ComponentProps) { return ( ); } function SelectScrollDownButton({ className, ...props }: React.ComponentProps) { return ( ); } export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };