{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "field",
  "title": "Field",
  "description": "Quiet Field spine — label, description, Motion error reveal, control.",
  "dependencies": [
    "@base-ui/react",
    "motion"
  ],
  "registryDependencies": [
    "@atroui/utils",
    "@atroui/motion"
  ],
  "files": [
    {
      "path": "registry/default/ui/field.tsx",
      "content": "\"use client\"\n\nimport { Field as FieldPrimitive } from \"@base-ui/react/field\"\nimport { motion, useReducedMotion } from \"motion/react\"\n\nimport { revealTween } from \"@/lib/motion\"\nimport { cn } from \"@/lib/utils\"\n\n/** Drop DOM animation handlers that clash with Motion's identically named props. */\nfunction withoutDomAnimationHandlers<T extends Record<string, unknown>>(\n  props: T\n) {\n  const {\n    onAnimationStart: _onAnimationStart,\n    onDrag: _onDrag,\n    onDragStart: _onDragStart,\n    onDragEnd: _onDragEnd,\n    ...rest\n  } = props\n  return rest\n}\n\nfunction Field({ className, ...props }: FieldPrimitive.Root.Props) {\n  return (\n    <FieldPrimitive.Root\n      data-slot=\"field\"\n      className={cn(\"flex w-full flex-col gap-1\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction FieldLabel({ className, ...props }: FieldPrimitive.Label.Props) {\n  return (\n    <FieldPrimitive.Label\n      data-slot=\"field-label\"\n      className={cn(\n        \"text-[0.8125rem] leading-none font-medium text-foreground/90 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction FieldDescription({\n  className,\n  ...props\n}: FieldPrimitive.Description.Props) {\n  return (\n    <FieldPrimitive.Description\n      data-slot=\"field-description\"\n      className={cn(\"text-xs leading-relaxed text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\n/**\n * Error reveal — height:auto settle (Family Values: careful delight on rare path).\n * Presence is owned by Base UI transitionStatus; Motion only animates chrome.\n */\nfunction FieldError({ className, ...props }: FieldPrimitive.Error.Props) {\n  const reduce = useReducedMotion()\n\n  return (\n    <FieldPrimitive.Error\n      data-slot=\"field-error\"\n      {...props}\n      className={cn(\n        \"overflow-hidden text-xs leading-relaxed text-destructive\",\n        className\n      )}\n      render={\n        reduce\n          ? undefined\n          : (htmlProps, state) => (\n              <motion.div\n                {...withoutDomAnimationHandlers(\n                  htmlProps as Record<string, unknown>\n                )}\n                initial={{ opacity: 0, height: 0, y: -2 }}\n                animate={\n                  state.transitionStatus === \"ending\"\n                    ? { opacity: 0, height: 0, y: -2 }\n                    : { opacity: 1, height: \"auto\", y: 0 }\n                }\n                transition={revealTween}\n              />\n            )\n      }\n    />\n  )\n}\n\nfunction FieldControl({ className, ...props }: FieldPrimitive.Control.Props) {\n  return (\n    <FieldPrimitive.Control\n      data-slot=\"field-control\"\n      className={cn(\n        \"atro-field-type flex h-[var(--atro-control-height,2.25rem)] w-full min-w-0 rounded-[var(--atro-control-radius,var(--radius))] border border-border-subtle bg-background px-3 text-base text-foreground outline-none transition-[border-color,box-shadow] duration-200 ease-[cubic-bezier(0.16,1,0.3,1)] sm:text-sm\",\n        \"placeholder:text-muted-foreground\",\n        \"focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/20\",\n        \"disabled:cursor-not-allowed disabled:opacity-50\",\n        \"aria-invalid:border-destructive aria-invalid:ring-2 aria-invalid:ring-destructive/20\",\n        \"data-invalid:border-destructive data-invalid:ring-2 data-invalid:ring-destructive/20\",\n        \"motion-reduce:transition-none\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction FieldValidity({ ...props }: FieldPrimitive.Validity.Props) {\n  return <FieldPrimitive.Validity data-slot=\"field-validity\" {...props} />\n}\n\nexport {\n  Field,\n  FieldControl,\n  FieldDescription,\n  FieldError,\n  FieldLabel,\n  FieldValidity,\n}\n",
      "type": "registry:ui",
      "target": "components/ui/field.tsx"
    }
  ],
  "type": "registry:ui"
}