{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "camaleon-button",
  "title": "Camaleon Button",
  "description": "Botao base com variantes semanticas e theme contract white-label.",
  "dependencies": [
    "@radix-ui/react-slot",
    "class-variance-authority",
    "clsx",
    "tailwind-merge"
  ],
  "registryDependencies": [
    "camaleon-utils"
  ],
  "files": [
    {
      "path": "registry/ui/button.tsx",
      "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n  \"relative inline-flex shrink-0 items-center justify-center whitespace-nowrap rounded-[calc(var(--radius)*0.95)] font-semibold outline-none transition-[background-color,color,border-color,box-shadow,transform] ring-offset-background focus-visible:ring-2 focus-visible:ring-ring/35 focus-visible:ring-offset-2 disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        primary:\n          \"border border-transparent bg-primary text-primary-foreground shadow-[0_16px_40px_-22px_hsl(var(--shadow-color))] hover:brightness-95 disabled:border-transparent disabled:bg-muted disabled:text-muted-foreground\",\n        secondary:\n          \"border bg-background/95 text-foreground shadow-[0_16px_40px_-26px_hsl(var(--shadow-color))] hover:bg-surface disabled:border-border/80 disabled:bg-background disabled:text-muted-foreground\",\n        tertiary:\n          \"border border-transparent bg-transparent text-foreground hover:bg-secondary/70 disabled:text-muted-foreground\",\n        linkColor:\n          \"rounded-none border-0 bg-transparent text-primary shadow-none hover:text-primary/80 disabled:text-muted-foreground\",\n        linkGray:\n          \"rounded-none border-0 bg-transparent text-muted-foreground shadow-none hover:text-foreground disabled:text-muted-foreground/80\",\n        destructive:\n          \"border border-transparent bg-[hsl(var(--danger))] text-white shadow-[0_16px_40px_-22px_hsl(var(--shadow-color))] hover:brightness-95 disabled:bg-muted disabled:text-muted-foreground\",\n        destructiveSecondary:\n          \"border border-[color-mix(in_srgb,hsl(var(--danger))_22%,white)] bg-background/95 text-[hsl(var(--danger))] shadow-[0_16px_40px_-26px_hsl(var(--shadow-color))] hover:bg-[color-mix(in_srgb,hsl(var(--danger))_6%,white)] disabled:border-border/80 disabled:bg-background disabled:text-muted-foreground\",\n        destructiveTertiary:\n          \"border border-transparent bg-transparent text-[hsl(var(--danger))] hover:bg-[color-mix(in_srgb,hsl(var(--danger))_8%,transparent)] disabled:text-muted-foreground\",\n        destructiveLink:\n          \"rounded-none border-0 bg-transparent text-[hsl(var(--danger))] shadow-none hover:text-[color-mix(in_srgb,hsl(var(--danger))_78%,black)] disabled:text-muted-foreground\"\n      },\n      size: {\n        sm: \"min-h-9 gap-1.5 px-3 py-2 text-sm\",\n        md: \"min-h-10 gap-1.5 px-3.5 py-2.5 text-sm\",\n        lg: \"min-h-11 gap-2 px-4 py-2.5 text-base\",\n        xl: \"min-h-12 gap-2 px-4.5 py-3 text-base\"\n      },\n      iconOnly: {\n        false: \"\",\n        true: \"\"\n      }\n    },\n    compoundVariants: [\n      {\n        iconOnly: true,\n        size: \"sm\",\n        className: \"size-9 p-2\"\n      },\n      {\n        iconOnly: true,\n        size: \"md\",\n        className: \"size-10 p-2.5\"\n      },\n      {\n        iconOnly: true,\n        size: \"lg\",\n        className: \"size-11 p-3\"\n      },\n      {\n        iconOnly: true,\n        size: \"xl\",\n        className: \"size-12 p-3.5\"\n      },\n      {\n        iconOnly: true,\n        variant: \"linkColor\",\n        className: \"size-auto p-0\"\n      },\n      {\n        iconOnly: true,\n        variant: \"linkGray\",\n        className: \"size-auto p-0\"\n      },\n      {\n        iconOnly: true,\n        variant: \"destructiveLink\",\n        className: \"size-auto p-0\"\n      },\n      {\n        iconOnly: false,\n        variant: \"linkColor\",\n        className: \"min-h-0 px-0 py-0\"\n      },\n      {\n        iconOnly: false,\n        variant: \"linkGray\",\n        className: \"min-h-0 px-0 py-0\"\n      },\n      {\n        iconOnly: false,\n        variant: \"destructiveLink\",\n        className: \"min-h-0 px-0 py-0\"\n      }\n    ],\n    defaultVariants: {\n      variant: \"primary\",\n      size: \"sm\",\n      iconOnly: false\n    }\n  }\n)\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean\n  leadingIcon?: React.ReactNode\n  trailingIcon?: React.ReactNode\n  loading?: boolean\n  loadingLabel?: string\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  (\n    {\n      className,\n      variant,\n      size,\n      iconOnly,\n      asChild = false,\n      leadingIcon,\n      trailingIcon,\n      loading = false,\n      loadingLabel,\n      children,\n      disabled,\n      ...props\n    },\n    ref\n  ) => {\n    const Comp = asChild ? Slot : \"button\"\n    const isDisabled = disabled || loading\n    const contentLabel = loading ? loadingLabel ?? children : children\n\n    return (\n      <Comp\n        className={cn(buttonVariants({ variant, size, iconOnly, className }))}\n        data-loading={loading ? \"true\" : undefined}\n        disabled={isDisabled}\n        ref={ref}\n        {...props}\n      >\n        {loading ? <ButtonSpinner size={size} /> : !iconOnly ? leadingIcon : leadingIcon ?? children}\n        {!iconOnly && <span className=\"px-0.5\">{contentLabel}</span>}\n        {!loading && !iconOnly && trailingIcon}\n      </Comp>\n    )\n  }\n)\n\nButton.displayName = \"Button\"\n\nfunction ButtonSpinner({ size = \"sm\" }: { size?: ButtonProps[\"size\"] }) {\n  const dimension = size === \"xl\" || size === \"lg\" ? \"size-4.5\" : \"size-4\"\n\n  return (\n    <span\n      aria-hidden=\"true\"\n      className={cn(\"inline-flex animate-spin rounded-full border-2 border-current border-b-transparent\", dimension)}\n    />\n  )\n}\n\nexport { Button, ButtonSpinner, buttonVariants }\n",
      "type": "registry:ui",
      "target": "@ui/button.tsx"
    }
  ],
  "type": "registry:ui"
}