{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "button",
  "title": "Purple Rain Button",
  "description": "A 44px tactile button with seated depth, visible focus, and complete loading, error, and success states.",
  "dependencies": [
    "class-variance-authority"
  ],
  "registryDependencies": [
    "https://kit.scottelling.com/r/tokens.json"
  ],
  "files": [
    {
      "path": "registry/purple-rain/button.tsx",
      "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n  \"inline-flex min-h-11 shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-control)] border border-transparent px-4 text-sm font-semibold tracking-[-0.008em] shadow-[var(--shadow-control)] outline-none transition-[background-color,color,border-color,transform,opacity] [transition-duration:var(--dur-micro)] [transition-timing-function:var(--ease-standard)] focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background active:translate-y-px disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:text-destructive data-[loading=true]:cursor-wait data-[loading=true]:opacity-70 data-[status=success]:border-positive data-[status=error]:border-destructive motion-reduce:transition-none motion-reduce:active:translate-y-0\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground hover:bg-[color-mix(in_oklch,var(--primary),var(--foreground)_8%)]\",\n        secondary: \"bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_6%)]\",\n        outline: \"border-border bg-background text-foreground shadow-none hover:bg-muted\",\n        ghost: \"bg-transparent text-foreground shadow-none hover:bg-muted\",\n        destructive: \"bg-destructive text-destructive-foreground hover:bg-[color-mix(in_oklch,var(--destructive),var(--foreground)_8%)]\",\n        link: \"min-h-0 rounded-none bg-transparent p-0 text-primary shadow-none underline-offset-4 hover:underline\",\n      },\n      size: {\n        default: \"h-11\",\n        sm: \"h-11 px-3 text-xs\",\n        lg: \"h-12 px-6 text-base\",\n        icon: \"size-11 p-0\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  },\n)\n\ntype ButtonProps = React.ComponentProps<\"button\"> &\n  VariantProps<typeof buttonVariants> & {\n    loading?: boolean\n    status?: \"idle\" | \"error\" | \"success\"\n    loadingLabel?: string\n  }\n\nfunction Button({\n  className,\n  variant,\n  size,\n  loading = false,\n  status = \"idle\",\n  loadingLabel = \"Working…\",\n  children,\n  disabled,\n  ...props\n}: ButtonProps) {\n  return (\n    <button\n      data-slot=\"button\"\n      data-loading={loading}\n      data-status={status}\n      aria-busy={loading}\n      disabled={disabled || loading}\n      className={cn(buttonVariants({ variant, size, className }))}\n      {...props}\n    >\n      {loading ? loadingLabel : children}\n    </button>\n  )\n}\n\nexport { Button, buttonVariants }\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}