"use client"; import { mergeProps } from "@base-ui/react/merge-props"; import { Select as SelectPrimitive } from "@base-ui/react/select"; import { useRender } from "@base-ui/react/use-render"; import { cva, type VariantProps } from "class-variance-authority"; import { ChevronDownIcon, ChevronsUpDownIcon, ChevronUpIcon } from "lucide-react"; import type * as React from "react"; import { cn } from "~/lib/utils"; const Select = SelectPrimitive.Root; const selectTriggerVariants = cva( "relative inline-flex cursor-pointer select-none items-center justify-between gap-2 border rounded-lg text-left text-base outline-none transition-[color,box-shadow,background-color] data-disabled:pointer-events-none data-disabled:opacity-64 sm:text-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4", { defaultVariants: { size: "default", variant: "default", }, variants: { variant: { default: "w-full min-w-36 border-input bg-background not-dark:bg-clip-padding text-foreground shadow-xs/5 ring-ring/24 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_1px_--theme(--color-black/4%)] pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 focus-visible:border-ring focus-visible:ring-[3px] aria-invalid:border-destructive/36 focus-visible:aria-invalid:border-destructive/64 focus-visible:aria-invalid:ring-destructive/16 dark:bg-input/32 dark:aria-invalid:ring-destructive/24 dark:not-data-disabled:not-focus-visible:not-aria-invalid:not-data-pressed:before:shadow-[0_-1px_--theme(--color-white/6%)] [&_svg:not([class*='opacity-'])]:opacity-80 [&_svg:not([class*='text-'])]:text-icon-muted [[data-disabled],:focus-visible,[aria-invalid],[data-pressed]]:shadow-none", ghost: "border-transparent text-secondary-label focus-visible:ring-2 focus-visible:ring-ring data-pressed:bg-accent [:hover,[data-pressed]]:bg-accent [:hover,[data-pressed]]:text-foreground", }, size: { compact: "h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-xs before:rounded-[calc(var(--radius-md)-1px)] [&_svg:not([class*='size-'])]:size-3.5", default: "min-h-9 px-[calc(--spacing(3)-1px)] sm:min-h-8", lg: "min-h-10 px-[calc(--spacing(3)-1px)] sm:min-h-9", sm: "min-h-8 gap-1.5 px-[calc(--spacing(2.5)-1px)] sm:min-h-7", xs: "h-7 gap-1 rounded-md px-[calc(--spacing(2)-1px)] text-sm before:rounded-[calc(var(--radius-md)-1px)] sm:h-6 sm:text-xs [&_svg:not([class*='size-'])]:size-4 sm:[&_svg:not([class*='size-'])]:size-3.5", }, }, }, ); const selectTriggerIconClassName = "-me-1 size-4.5 opacity-80 sm:size-4"; interface SelectButtonProps extends useRender.ComponentProps<"button"> { size?: VariantProps["size"]; variant?: VariantProps["variant"]; } function SelectButton({ className, size, variant, render, children, ...props }: SelectButtonProps) { const typeValue: React.ButtonHTMLAttributes["type"] = render ? undefined : "button"; const defaultProps = { children: ( <> {children} {variant === "ghost" ? ( ) : ( )} ), className: cn(selectTriggerVariants({ size, variant }), "min-w-none", className), "data-slot": "select-button", type: typeValue, }; return useRender({ defaultTagName: "button", props: mergeProps<"button">(defaultProps, props), render, }); } function SelectTrigger({ className, size = "default", variant = "default", children, icon, ...props }: SelectPrimitive.Trigger.Props & VariantProps & { icon?: React.ReactNode }) { return ( {children} {icon ?? } ); } function SelectValue({ className, ...props }: SelectPrimitive.Value.Props) { return ( ); } function SelectPopup({ className, popupClassName, children, side = "bottom", sideOffset = 4, align = "start", alignOffset = 0, alignItemWithTrigger = true, matchTriggerWidth = true, anchor, ...props }: SelectPrimitive.Popup.Props & { popupClassName?: string; side?: SelectPrimitive.Positioner.Props["side"]; sideOffset?: SelectPrimitive.Positioner.Props["sideOffset"]; align?: SelectPrimitive.Positioner.Props["align"]; alignOffset?: SelectPrimitive.Positioner.Props["alignOffset"]; alignItemWithTrigger?: SelectPrimitive.Positioner.Props["alignItemWithTrigger"]; matchTriggerWidth?: boolean; anchor?: SelectPrimitive.Positioner.Props["anchor"]; }) { return (
{children}
); } function SelectItem({ className, children, hideIndicator: _hideIndicator = false, ...props }: SelectPrimitive.Item.Props & { hideIndicator?: boolean; }) { return ( {children} ); } function SelectSeparator({ className, ...props }: SelectPrimitive.Separator.Props) { return ( ); } function SelectGroup(props: SelectPrimitive.Group.Props) { return ; } function SelectGroupLabel(props: SelectPrimitive.GroupLabel.Props) { return ( ); } export { Select, SelectTrigger, SelectButton, selectTriggerVariants, SelectValue, SelectPopup, SelectPopup as SelectContent, SelectItem, SelectSeparator, SelectGroup, SelectGroupLabel, };