{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "input",
  "title": "Input",
  "description": "Text field with sizes, validation states, leading icon and clear button.",
  "dependencies": ["class-variance-authority", "lucide-react"],
  "registryDependencies": [
    "https://indiacn.in/r/theme.json",
    "https://indiacn.in/r/typography.json"
  ],
  "files": [
    {
      "path": "components/ui/input.tsx",
      "content": "'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertTriangle, CheckCircle2, Info, OctagonAlert, X } from 'lucide-react';\nimport { ComponentProps, ReactNode } from 'react';\n\nimport { Body3 } from '@/components/ui/typography';\nimport { cn } from '@/lib/utils';\n\n/*\n * UX4G input: 44px (default) and 48px (large), 1px border at radius 8px, and a\n * 4px focus ring. Validation states colour the border from the -500 step.\n *\n * UX4G also lists a Small size, but its Figma symbol renders byte-identically\n * to Default, so there is nothing to ship — see the docs page.\n */\nconst INPUT_VARIANTS = cva(\n  'flex w-full items-center gap-2 rounded-md border bg-neutral-0 transition-[color,background-color,border-color,box-shadow] duration-150 has-[input:disabled]:pointer-events-none has-[input:disabled]:opacity-50 [&>svg]:shrink-0 [&>svg]:text-neutral-600',\n  {\n    variants: {\n      size: {\n        md: 'h-11 px-3 text-sm [&>svg]:size-[18px]',\n        lg: 'h-12 px-3.5 text-base [&>svg]:size-5',\n      },\n      state: {\n        default:\n          'border-neutral-200 hover:border-primary focus-within:border-primary focus-within:shadow-focus-primary',\n        error: 'border-danger-500 focus-within:shadow-focus-danger',\n        success: 'border-success-500 focus-within:shadow-focus-success',\n        warning: 'border-warning-500 focus-within:shadow-focus-warning',\n      },\n    },\n    defaultVariants: {\n      size: 'md',\n      state: 'default',\n    },\n  },\n);\n\ntype TInputState = NonNullable<VariantProps<typeof INPUT_VARIANTS>['state']>;\n\nconst ICON_SIZES = {\n  md: 'size-[18px]',\n  lg: 'size-5',\n} as const;\n\ninterface IInputProps\n  extends Omit<ComponentProps<'input'>, 'size'>,\n    VariantProps<typeof INPUT_VARIANTS> {\n  prefixIcon?: ReactNode;\n  suffix?: ReactNode;\n  onClear?: () => void;\n  containerClassName?: string;\n}\n\n/**\n * Text field with optional leading icon, clear button and trailing slot.\n *\n * The field is a label element, so clicking anywhere inside focuses the input\n * without a click handler.\n */\nfunction Input({\n  className,\n  containerClassName,\n  size,\n  state,\n  prefixIcon,\n  suffix,\n  onClear,\n  value,\n  ...props\n}: IInputProps) {\n  const iconSize = ICON_SIZES[size ?? 'md'];\n\n  return (\n    <label className={cn(INPUT_VARIANTS({ size, state, className: containerClassName }))}>\n      {prefixIcon}\n      <input\n        className={cn(\n          'placeholder:text-neutral-500 min-w-0 flex-1 bg-transparent outline-none',\n          className,\n        )}\n        value={value}\n        {...props}\n      />\n      {value && onClear && (\n        <button\n          type='button'\n          onClick={onClear}\n          aria-label='Clear'\n          className='text-neutral-600 hover:text-neutral shrink-0 cursor-pointer rounded-sm transition-colors focus:outline-none'\n        >\n          <X className={iconSize} aria-hidden />\n        </button>\n      )}\n      {suffix}\n    </label>\n  );\n}\n\nconst MESSAGE_ICONS = {\n  default: Info,\n  error: OctagonAlert,\n  success: CheckCircle2,\n  warning: AlertTriangle,\n} as const;\n\nconst MESSAGE_COLORS = {\n  default: 'text-neutral-600',\n  error: 'text-danger',\n  success: 'text-success',\n  warning: 'text-warning',\n} as const;\n\n/** Description or validation message shown beneath an Input or Textarea. */\nfunction InputMessage({\n  className,\n  state = 'default',\n  children,\n  ...props\n}: ComponentProps<typeof Body3> & { state?: TInputState }) {\n  const Icon = MESSAGE_ICONS[state];\n\n  return (\n    <Body3\n      className={cn('mt-2 flex items-center gap-1.5', MESSAGE_COLORS[state], className)}\n      {...props}\n    >\n      <Icon className='size-3.5 shrink-0' aria-hidden />\n      {children}\n    </Body3>\n  );\n}\n\nexport type { TInputState };\n\nexport { Input, InputMessage, INPUT_VARIANTS };\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}
