{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "spinner",
  "type": "registry:ui",
  "title": "Spinner",
  "description": "Accessible loading indicator for pending buttons, panels, and inline waits.",
  "dependencies": [
    "lucide-react@^1.31.0"
  ],
  "registryDependencies": [
    "https://control-ui.dev/r/core.json"
  ],
  "files": [
    {
      "path": "src/registry/knob-contracts/spinner-knobs.ts",
      "target": "@components/control-ui/knob-contracts/spinner-knobs.ts",
      "type": "registry:component",
      "content": "// Generated from src/registry/sources/control-ui/recipes/spinner.css by scripts/gen-knob-contracts.ts — run `bun run sync:knobs`.\nexport const spinnerKnobs = [\"--cui-spinner-foreground\"] as const;\nexport type SpinnerKnobStyle = Partial<Record<(typeof spinnerKnobs)[number], string>>;\n"
    },
    {
      "path": "src/registry/sources/control-ui/recipes/spinner.css",
      "target": "@components/control-ui/styles/recipes/spinner.css",
      "type": "registry:file",
      "content": "@layer components {\n  :where([data-control-family=\"spinner\"][data-slot=\"root\"]) {\n    --cui-spinner-foreground: var(--muted-foreground);\n    color: var(--cui-spinner-foreground);\n  }\n\n  :where([data-control-family=\"spinner\"][data-slot=\"indicator\"]) {\n    animation: spin calc(var(--duration-slow) * 3.333) linear infinite;\n  }\n}\n\n@property --cui-spinner-foreground {\n  syntax: \"<color>\";\n  inherits: true;\n  initial-value: transparent;\n}\n"
    },
    {
      "path": "src/registry/sources/control-ui/ui/spinner.tsx",
      "target": "@components/control-ui/ui/spinner.tsx",
      "type": "registry:ui",
      "content": "import { Loader2 } from \"lucide-react\";\nimport type { ComponentProps, CSSProperties } from \"react\";\nimport type { ControlSize } from \"@/components/control-ui/control-variants\";\nimport type { SpinnerKnobStyle } from \"@/components/control-ui/knob-contracts/spinner-knobs\";\nimport { cn } from \"@/components/control-ui/lib/cn\";\n\nexport type SpinnerProps = Omit<\n  ComponentProps<\"span\"> & {\n    size?: ControlSize;\n  },\n  \"style\"\n> & { style?: CSSProperties & SpinnerKnobStyle };\n\n// Deliberately outside motion kill-switch — loader must keep turning under reduced motion.\nconst spinnerSize = {\n  xs: \"size-3\",\n  sm: \"size-4\",\n  md: \"size-5\",\n  lg: \"size-6\",\n} as const;\n\nexport function Spinner({ size = \"sm\", className, ...props }: SpinnerProps) {\n  return (\n    <span\n      role=\"status\"\n      data-control-ui=\"spinner\"\n      data-control-family=\"spinner\"\n      data-slot=\"root\"\n      className={cn(\"inline-flex\", className)}\n      {...props}\n    >\n      <Loader2\n        aria-hidden=\"true\"\n        data-control-ui=\"spinner\"\n        data-control-family=\"spinner\"\n        data-slot=\"indicator\"\n        className={spinnerSize[size]}\n      />\n      <span className=\"sr-only\">Loading</span>\n    </span>\n  );\n}\n"
    }
  ],
  "css": {
    "@import \"../components/control-ui/styles/recipes/spinner.css\"": {}
  },
  "meta": {}
}
