{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "switch",
  "type": "registry:ui",
  "dependencies": [
    "@base-ui/react",
    "clsx",
    "tailwind-merge",
    "class-variance-authority"
  ],
  "registryDependencies": [],
  "files": [
    {
      "path": "switch.tsx",
      "target": "components/ui/switch.tsx",
      "type": "registry:ui",
      "content": "\"use client\";\nimport { Field } from \"@base-ui/react/field\";\nimport { Switch as Base } from \"@base-ui/react/switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst trackVariants = cva(\n  \"relative inline-flex shrink-0 items-center rounded-full border border-border bg-surface-2 outline-none transition-control duration-base ease-soft before:absolute before:content-[''] data-[unchecked]:hover:border-border-strong data-[checked]:border-accent data-[checked]:bg-accent data-[checked]:bg-gradient-accent data-[checked]:glow-ring focus-visible:border-transparent focus-visible:ring-focus aria-invalid:border-danger data-[disabled]:cursor-not-allowed data-[disabled]:opacity-50\",\n  {\n    variants: {\n      size: {\n        sm: \"h-5 w-9 before:-inset-y-3 before:-inset-x-1\",\n        md: \"h-6 w-11 before:-inset-y-2.5 before:inset-x-0\",\n      },\n    },\n    defaultVariants: { size: \"md\" },\n  },\n);\n\nconst thumbVariants = cva(\n  \"block rounded-full bg-ink shadow-raised transition-layout duration-base ease-spring motion-reduce:transition-none motion-reduce:transform-none data-[checked]:bg-on-accent\",\n  {\n    variants: {\n      size: {\n        sm: \"h-4 w-4 translate-x-0.5 data-[checked]:translate-x-4\",\n        md: \"h-5 w-5 translate-x-0.5 data-[checked]:translate-x-5\",\n      },\n    },\n    defaultVariants: { size: \"md\" },\n  },\n);\n\n// Indent the description to line up under the label: track width + the row gap.\nconst descIndent: Record<NonNullable<SwitchProps[\"size\"]>, string> = {\n  sm: \"pl-12\",\n  md: \"pl-14\",\n};\n\nexport interface SwitchProps\n  extends Omit<\n      React.ComponentPropsWithoutRef<typeof Base.Root>,\n      \"render\" | \"className\"\n    >,\n    VariantProps<typeof trackVariants> {\n  className?: string;\n  label?: React.ReactNode;\n  description?: React.ReactNode;\n}\n\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n  ({ className, size, label, description, id, disabled, ...props }, ref) => {\n    const generatedId = React.useId();\n    const switchId = id ?? generatedId;\n\n    return (\n      <Field.Root className=\"flex flex-col gap-1\" disabled={disabled}>\n        <div className=\"flex items-center gap-3\">\n          <Base.Root\n            ref={ref}\n            id={switchId}\n            disabled={disabled}\n            className={cn(trackVariants({ size }), className)}\n            {...props}\n          >\n            <Base.Thumb className={thumbVariants({ size })} />\n          </Base.Root>\n          {label ? (\n            <Field.Label\n              htmlFor={switchId}\n              className=\"text-sm text-ink select-none data-[disabled]:opacity-50\"\n            >\n              {label}\n            </Field.Label>\n          ) : null}\n        </div>\n        {description ? (\n          <Field.Description\n            className={cn(\"text-xs text-muted\", descIndent[size ?? \"md\"])}\n          >\n            {description}\n          </Field.Description>\n        ) : null}\n      </Field.Root>\n    );\n  },\n);\nSwitch.displayName = \"Switch\";\n"
    }
  ]
}