{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"cookie-consent","title":"Cookie Consent","description":"A compact cookie consent card with pluggable accept and decline handlers.","files":[{"path":"ui/cookie-consent.tsx","type":"registry:ui","content":"\"use client\";\n\nimport * as React from \"react\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\n\ntype CookieConsentDecision = \"accepted\" | \"declined\";\n\ntype CookieConsentProps = React.ComponentProps<\"div\"> & {\n  acceptLabel?: React.ReactNode;\n  defaultOpen?: boolean;\n  declineLabel?: React.ReactNode;\n  dismissOnConsent?: boolean;\n  learnMoreHref?: string;\n  learnMoreLabel?: React.ReactNode;\n  onAccept?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n  onConsentChange?: (\n    decision: CookieConsentDecision,\n    event: React.MouseEvent<HTMLButtonElement>,\n  ) => void;\n  onDecline?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n  onOpenChange?: (open: boolean) => void;\n  open?: boolean;\n};\n\nfunction CookieConsent({\n  acceptLabel = \"Accept\",\n  defaultOpen = true,\n  declineLabel = \"Decline\",\n  dismissOnConsent = true,\n  learnMoreHref = \"#\",\n  learnMoreLabel = \"Learn more.\",\n  onAccept,\n  onConsentChange,\n  onDecline,\n  onOpenChange,\n  open,\n  className,\n  children,\n  ...props\n}: CookieConsentProps) {\n  const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n  const isControlled = open !== undefined;\n  const isOpen = isControlled ? open : uncontrolledOpen;\n\n  const setOpen = React.useCallback(\n    (nextOpen: boolean) => {\n      if (!isControlled) {\n        setUncontrolledOpen(nextOpen);\n      }\n\n      onOpenChange?.(nextOpen);\n    },\n    [isControlled, onOpenChange],\n  );\n\n  const handleConsent = React.useCallback(\n    (decision: CookieConsentDecision, event: React.MouseEvent<HTMLButtonElement>) => {\n      if (decision === \"accepted\") {\n        onAccept?.(event);\n      } else {\n        onDecline?.(event);\n      }\n\n      onConsentChange?.(decision, event);\n\n      if (dismissOnConsent && !event.defaultPrevented) {\n        setOpen(false);\n      }\n    },\n    [dismissOnConsent, onAccept, onConsentChange, onDecline, setOpen],\n  );\n\n  if (!isOpen) {\n    return null;\n  }\n\n  return (\n    <div\n      role=\"dialog\"\n      aria-label=\"Cookie consent\"\n      data-slot=\"cookie-consent\"\n      className={cn(\"max-w-[260px] rounded-lg border bg-card p-3 shadow-md\", className)}\n      {...props}\n    >\n      <p className=\"text-xs leading-relaxed text-pretty text-muted-foreground\">\n        {children ?? (\n          <>\n            We use cookies to understand how you use our service.{\" \"}\n            <a\n              href={learnMoreHref}\n              className=\"text-foreground/80 underline underline-offset-2 hover:text-foreground\"\n            >\n              {learnMoreLabel}\n            </a>\n          </>\n        )}\n      </p>\n      <div className=\"mt-2.5 flex items-center gap-1.5\">\n        <Button\n          type=\"button\"\n          variant=\"ghost\"\n          size=\"xs\"\n          onClick={(event) => handleConsent(\"declined\", event)}\n        >\n          {declineLabel}\n        </Button>\n        <Button type=\"button\" size=\"xs\" onClick={(event) => handleConsent(\"accepted\", event)}>\n          {acceptLabel}\n        </Button>\n      </div>\n    </div>\n  );\n}\n\nexport { CookieConsent, type CookieConsentDecision, type CookieConsentProps };","target":"@ui/cookie-consent.tsx"}],"type":"registry:ui","registryDependencies":["button"]}