{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "spinner",
  "title": "Spinner",
  "description": "Loading indicator with border/grow variants, theme colors, and sm/md/lg sizes.",
  "dependencies": ["class-variance-authority"],
  "registryDependencies": [
    "https://indiacn.in/r/theme.json",
    "https://indiacn.in/r/typography.json"
  ],
  "files": [
    {
      "path": "components/ui/spinner.tsx",
      "content": "import { cva, type VariantProps } from 'class-variance-authority';\nimport { ComponentProps } from 'react';\n\nimport { Label2 } from '@/components/ui/typography';\nimport { cn } from '@/lib/utils';\n\n/* UX4G spinner: border-width 0.3em, size 2rem, animation 0.75s, sm size 1rem, sm border 0.2em */\nconst SPINNER_VARIANTS = cva('inline-block rounded-full align-[-0.125em]', {\n  variants: {\n    theme: {\n      primary: 'text-primary',\n      secondary: 'text-secondary',\n      success: 'text-success',\n      danger: 'text-danger',\n      warning: 'text-warning',\n      info: 'text-info',\n      light: 'text-neutral-100',\n      dark: 'text-neutral-800',\n      neutral: 'text-neutral',\n    },\n    variant: {\n      border: 'animate-spin border-[0.3em] border-current border-r-transparent',\n      grow: 'bg-current [animation:spinner-grow_0.75s_linear_infinite]',\n    },\n    size: {\n      sm: 'size-4',\n      md: 'size-8',\n      lg: 'size-12',\n    },\n  },\n  compoundVariants: [{ variant: 'border', size: 'sm', className: 'border-[0.2em]' }],\n  defaultVariants: {\n    theme: 'primary',\n    variant: 'border',\n    size: 'md',\n  },\n});\n\ninterface ISpinnerProps\n  extends Omit<ComponentProps<'div'>, 'children'>,\n    VariantProps<typeof SPINNER_VARIANTS> {\n  label?: string;\n}\n\n/**\n * A loading spinner component for indicating async operations.\n * Matches the UX4G 2.0 Spinner specification.\n *\n * Supports:\n * - Theme colors: primary, secondary, success, danger, warning, info, light, dark, neutral\n * - Animation variants: border (spin) or grow (pulse)\n * - Three sizes: sm (1rem), md (2rem), lg (3rem)\n * - Accessible with screen reader label\n */\nfunction Spinner({\n  className,\n  theme,\n  variant,\n  size,\n  label = 'Loading...',\n  ...props\n}: ISpinnerProps) {\n  return (\n    <div\n      role='status'\n      className={cn(SPINNER_VARIANTS({ theme, variant, size, className }))}\n      {...props}\n    >\n      <Label2 className='sr-only'>{label}</Label2>\n    </div>\n  );\n}\n\nexport { Spinner, SPINNER_VARIANTS };\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}
