{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "camaleon-input",
  "title": "Camaleon Input",
  "description": "Campo base com label, addons, validacao e composicoes prontas para formularios e filtros.",
  "registryDependencies": [
    "camaleon-utils"
  ],
  "files": [
    {
      "path": "registry/ui/input.tsx",
      "content": "import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst inputFieldVariants = cva(\n  \"group relative flex w-full items-stretch overflow-hidden rounded-[calc(var(--radius)*0.95)] border bg-background/82 text-foreground shadow-[0_10px_34px_-26px_hsl(var(--shadow-color))] transition-[border-color,box-shadow,background-color] focus-within:bg-background\",\n  {\n    variants: {\n      size: {\n        sm: \"min-h-11\",\n        md: \"min-h-12\",\n      },\n      tone: {\n        default:\n          \"border-input focus-within:border-ring/65 focus-within:ring-4 focus-within:ring-ring/12\",\n        danger:\n          \"border-[color-mix(in_srgb,hsl(var(--danger))_28%,hsl(var(--input)))] bg-[color-mix(in_srgb,hsl(var(--danger))_3%,white)] focus-within:border-[hsl(var(--danger))] focus-within:ring-4 focus-within:ring-[color-mix(in_srgb,hsl(var(--danger))_18%,white)]\",\n        success:\n          \"border-[color-mix(in_srgb,hsl(var(--success))_24%,hsl(var(--input)))] bg-[color-mix(in_srgb,hsl(var(--success))_3%,white)] focus-within:border-[hsl(var(--success))] focus-within:ring-4 focus-within:ring-[color-mix(in_srgb,hsl(var(--success))_16%,white)]\",\n      },\n    },\n    defaultVariants: {\n      size: \"md\",\n      tone: \"default\",\n    },\n  },\n);\n\nconst inputAddonVariants = cva(\n  \"flex shrink-0 items-center gap-2 text-muted-foreground\",\n  {\n    variants: {\n      size: {\n        sm: \"px-3 text-sm\",\n        md: \"px-3.5 text-sm\",\n      },\n      side: {\n        leading: \"border-r border-border/80 bg-surface/70\",\n        trailing: \"border-l border-border/80 bg-surface/70\",\n      },\n    },\n    defaultVariants: {\n      size: \"md\",\n      side: \"leading\",\n    },\n  },\n);\n\nconst inputControlVariants = cva(\"flex min-w-0 flex-1 items-center gap-2\", {\n  variants: {\n    size: {\n      sm: \"px-3 py-2\",\n      md: \"px-3.5 py-2.5\",\n    },\n  },\n  defaultVariants: {\n    size: \"md\",\n  },\n});\n\nconst inputElementVariants = cva(\n  \"min-w-[8rem] flex-1 border-0 bg-transparent p-0 text-foreground outline-none placeholder:text-muted-foreground/78 disabled:cursor-not-allowed\",\n  {\n    variants: {\n      size: {\n        sm: \"text-sm\",\n        md: \"text-base\",\n      },\n    },\n    defaultVariants: {\n      size: \"md\",\n    },\n  },\n);\n\nexport interface InputProps\n  extends\n    Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n    VariantProps<typeof inputFieldVariants> {\n  label?: React.ReactNode;\n  hint?: React.ReactNode;\n  error?: React.ReactNode;\n  labelAdornment?: React.ReactNode;\n  leadingAddon?: React.ReactNode;\n  trailingAddon?: React.ReactNode;\n  leadingText?: React.ReactNode;\n  trailingText?: React.ReactNode;\n  tags?: React.ReactNode;\n  fieldClassName?: string;\n  wrapperClassName?: string;\n  hideRequiredIndicator?: boolean;\n}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n  (\n    {\n      className,\n      fieldClassName,\n      wrapperClassName,\n      type,\n      size,\n      tone,\n      label,\n      hint,\n      error,\n      labelAdornment,\n      leadingAddon,\n      trailingAddon,\n      leadingText,\n      trailingText,\n      tags,\n      id,\n      required,\n      disabled,\n      hideRequiredIndicator = false,\n      \"aria-describedby\": ariaDescribedBy,\n      ...props\n    },\n    ref,\n  ) => {\n    const generatedId = React.useId();\n    const inputId = id ?? generatedId;\n    const resolvedTone = error ? \"danger\" : (tone ?? \"default\");\n    const description = error ?? hint;\n    const descriptionId = description ? `${inputId}-description` : undefined;\n    const describedBy =\n      [ariaDescribedBy, descriptionId].filter(Boolean).join(\" \") || undefined;\n\n    return (\n      <div className={cn(\"grid gap-1.5\", wrapperClassName)}>\n        {(label || labelAdornment) && (\n          <div className=\"flex items-center justify-between gap-3\">\n            <label\n              className=\"text-sm font-medium text-foreground\"\n              htmlFor={inputId}\n            >\n              {label}\n              {required && !hideRequiredIndicator ? (\n                <span\n                  aria-hidden=\"true\"\n                  className=\"ml-1 text-[hsl(var(--danger))]\"\n                >\n                  *\n                </span>\n              ) : null}\n            </label>\n            {labelAdornment ? (\n              <div className=\"text-sm text-muted-foreground\">\n                {labelAdornment}\n              </div>\n            ) : null}\n          </div>\n        )}\n\n        <div\n          className={cn(\n            inputFieldVariants({ size, tone: resolvedTone }),\n            disabled && \"cursor-not-allowed bg-muted/55 text-muted-foreground\",\n            fieldClassName,\n          )}\n          data-disabled={disabled ? \"true\" : \"false\"}\n        >\n          {leadingAddon ? (\n            <div className={cn(inputAddonVariants({ size, side: \"leading\" }))}>\n              {leadingAddon}\n            </div>\n          ) : null}\n\n          <div\n            className={cn(\n              inputControlVariants({ size }),\n              tags && \"flex-wrap gap-y-2\",\n            )}\n          >\n            {leadingText ? (\n              <span className=\"shrink-0 text-sm text-muted-foreground\">\n                {leadingText}\n              </span>\n            ) : null}\n            {tags ? (\n              <div className=\"flex shrink-0 flex-wrap items-center gap-1.5\">\n                {tags}\n              </div>\n            ) : null}\n            <input\n              aria-describedby={describedBy}\n              aria-invalid={resolvedTone === \"danger\" ? true : undefined}\n              className={cn(inputElementVariants({ size }), className)}\n              disabled={disabled}\n              id={inputId}\n              ref={ref}\n              required={required}\n              type={type}\n              {...props}\n            />\n            {trailingText ? (\n              <span className=\"shrink-0 text-sm text-muted-foreground\">\n                {trailingText}\n              </span>\n            ) : null}\n          </div>\n\n          {trailingAddon ? (\n            <div className={cn(inputAddonVariants({ size, side: \"trailing\" }))}>\n              {trailingAddon}\n            </div>\n          ) : null}\n        </div>\n\n        {description ? (\n          <p\n            className={cn(\n              \"text-sm leading-6\",\n              error ? \"text-[hsl(var(--danger))]\" : \"text-muted-foreground\",\n            )}\n            id={descriptionId}\n          >\n            {description}\n          </p>\n        ) : null}\n      </div>\n    );\n  },\n);\n\nInput.displayName = \"Input\";\n\nexport { Input, inputFieldVariants };\n",
      "type": "registry:ui",
      "target": "@ui/input.tsx"
    }
  ],
  "type": "registry:ui"
}