import * as React from "react"; import { cn } from "../lib/utils"; import { cva, type VariantProps } from "class-variance-authority"; const inputVariants = cva( "flex w-full rounded-lg border bg-card px-4 py-2 text-sm transition-all duration-200 placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 file:border-0 file:bg-transparent file:font-medium file:text-sm", { variants: { variant: { default: "border-input focus:ring-ring", sandbox: "border-border focus:border-[var(--border-accent-hover)] focus:ring-[var(--border-accent)]", error: "border-[var(--surface-danger-border)] focus:ring-[var(--surface-danger-border)]", }, size: { default: "h-11", sm: "h-9 px-3", lg: "h-12 px-5", } }, defaultVariants: { variant: "default", size: "default", }, } ); export interface InputProps extends Omit, "size">, VariantProps { label?: string; error?: string; hint?: string; } const Input = React.forwardRef( ( { className, type, variant, size, label, error, hint, id, ...props }, ref, ) => { const inputId = id ?? label?.toLowerCase().replace(/\s+/g, "-"); const input = ( ); if (!label && !error && !hint) return input; return (
{label && ( )} {input} {error &&

{error}

} {hint && !error && (

{hint}

)}
); }, ); Input.displayName = "Input"; export interface TextareaProps extends React.TextareaHTMLAttributes { variant?: "default" | "sandbox"; label?: string; error?: string; hint?: string; } const Textarea = React.forwardRef( ( { className, variant = "default", label, error, hint, id, ...props }, ref, ) => { const textareaId = id ?? label?.toLowerCase().replace(/\s+/g, "-"); const variants = { default: "border-input focus:ring-ring", sandbox: "border-border focus:border-[var(--border-accent-hover)] focus:ring-[var(--border-accent)]", }; const textarea = (