--- import type { HTMLAttributes } from "astro/types"; import { cn } from "../utils/cn"; import { Icon } from "astro-icon/components"; interface Option { value: string; label: string; disabled?: boolean; } interface Props extends HTMLAttributes<"div"> { id?: string; name: string; label?: string; description?: string; error?: string; required?: boolean; disabled?: boolean; options: Option[]; value?: string[]; placeholder?: string; searchable?: boolean; clearable?: boolean; maxSelections?: number; size?: "sm" | "md" | "lg"; display?: "text" | "chips"; class?: string; } const p = Astro.props as Props; const fieldId = p.id ?? p.name; const descId = p.description ? `${fieldId}-desc` : undefined; const errId = `${fieldId}-err`; const selected = new Set(p.value ?? []); const summarySSR = selected.size ? Array.from(selected) .map((v) => p.options.find((o) => o.value === v)?.label ?? v) .join(", ") : ""; const sizeCls = p.size === "sm" ? "wr:h-9 wr:px-3 wr:text-sm" : p.size === "lg" ? "wr:h-11 wr:px-4 wr:text-base" : "wr:h-10 wr:px-3 wr:text-sm"; const controlCls = "wr:py-2.5 wr:sm:py-3 wr:px-4 wr:block wr:w-full wr:border-gray-200 wr:rounded-lg wr:sm:text-sm " + "wr:focus:border-blue-500 wr:focus:ring-blue-500 wr:disabled:opacity-50 wr:disabled:pointer-events-none " + "wr:dark:bg-input wr:dark:border-border wr:dark:text-neutral-400 wr:dark:placeholder-neutral-500 wr:dark:focus:ring-neutral-600"; const chipBase = "wr:inline-flex wr:items-center wr:gap-1 wr:rounded-full wr:px-2 wr:py-0.5 wr:text-xs wr:bg-muted wr:text-foreground"; const containerId = `ms-${Math.random().toString(36).slice(2)}`; const displayMode = p.display ?? "text"; ---
{p.description}
) }{p.error ?? ""}