--- import type { HTMLAttributes } from "astro/types"; import { cva } from "class-variance-authority"; import { cn } from "../utils/cn"; import { Icon } from "astro-icon/components"; type Kind = | "text" | "email" | "password" | "number" | "textarea" | "select" | "datetime-local" | "date" | "time" | "file" | "checkbox" | "radio" | "switch"; interface Option { value: string; label: string; disabled?: boolean; } interface Props extends HTMLAttributes<"div"> { id?: string; name: string; label?: string; kind?: Kind; placeholder?: string; description?: string; error?: string; required?: boolean; disabled?: boolean; value?: string | number | boolean; options?: Option[]; multiple?: boolean; rows?: number; prefixText?: string; suffixText?: string; iconLeft?: string; iconRight?: string; min?: number; max?: number; step?: number; size?: "sm" | "md" | "lg"; 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 inputBase = cva( "wr:py-2.5 wr:sm:py-3 wr:px-4 wr:block wr:w-full wr:border-border wr:rounded-lg wr:sm:text-sm wr:focus:border-border 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", { variants: { size: { sm: "wr:h-10 wr:px-3 wr:text-sm", md: "wr:h-11 wr:px-3 wr:text-sm", lg: "wr:h-12 wr:px-4 wr:text-base", }, withIconLeft: { true: "wr:pl-10" }, withIconRight: { true: "wr:pr-10" }, }, }, ); const textareaBase = cva( "wr:py-2.5 wr:sm:py-3 wr:px-4 wr:block wr:w-full wr:h-[350px] wr:border-border wr:rounded-lg wr:sm:text-sm wr:focus:border-border 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", { variants: { size: { sm: "wr:px-3 wr:text-sm", md: "wr:px-3 wr:text-sm", lg: "wr:px-4 wr:text-base", }, withIconLeft: { true: "wr:pl-10" }, withIconRight: { true: "wr:pr-10" }, }, }, ); const selectBase = cva( "wr:py-3 wr:px-4 wr:pe-9 wr:block wr:w-full wr:border-border wr:rounded-lg wr:text-sm wr:focus:border-border 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", { variants: { size: { sm: "wr:h-10 wr:px-3 wr:text-sm", md: "wr:h-11 wr:px-3 wr:text-sm", lg: "wr:h-12 wr:px-4 wr:text-base", }, withIconLeft: { true: "wr:pl-10" }, withIconRight: { true: "wr:pr-10" }, }, }, ); const iconSize = p.size === "sm" ? "wr:size-4" : p.size === "lg" ? "wr:size-5" : "wr:size-5"; const labelCls = "wr:block wr:text-sm wr:font-medium wr:mb-2 wr:dark:text-white"; const helpCls = "wr:mt-2 wr:text-sm wr:text-gray-500 wr:dark:text-neutral-500"; const errCls = "wr:text-sm wr:text-red-600 wr:mt-2 wr:capitalize"; const groupCls = "wr:relative wr:flex wr:items-stretch"; const addonBase = "wr:px-4 wr:inline-flex wr:items-center wr:min-w-fit wr:rounded-md wr:border wr:border-border wr:bg-gray-200 wr:text-sm wr:text-gray-500 wr:dark:bg-card wr:dark:border-border wr:dark:text-neutral-400"; const controlWrap = "wr:relative"; ---
{p.description}
) }{p.error ?? ""}