{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "banner-cookie", "type": "registry:ui", "title": "Banner Cookie", "description": "A frosted-glass cookie consent card with rise entrance and shrink-drop dismiss.", "files": [ { "path": "registry/ruixenui/banner-cookie.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface BannerCookieProps {\n description?: string;\n onAccept?: () => void;\n onDecline?: () => void;\n className?: string;\n}\n\nexport function BannerCookie({\n description = \"This site uses cookies to improve your experience.\",\n onAccept,\n onDecline,\n className,\n}: BannerCookieProps) {\n const [leaving, setLeaving] = React.useState(false);\n const [gone, setGone] = React.useState(false);\n\n const dismiss = (cb?: () => void) => {\n setLeaving(true);\n setTimeout(() => {\n setGone(true);\n cb?.();\n }, 300);\n };\n\n if (gone) return null;\n\n return (\n \n

\n {description}\n

\n\n
\n {/* ── Decline: ghost + sliding underline reveal ── */}\n dismiss(onDecline)}\n className=\"group relative h-8 px-3 text-sm font-medium text-muted-foreground transition-colors duration-200 hover:text-foreground\"\n >\n Decline\n \n \n\n {/* ── Accept: pill + shadow elevator + press scale ── */}\n dismiss(onAccept)}\n className=\"h-8 rounded-full bg-primary px-4 text-sm font-medium text-primary-foreground shadow-sm transition-all duration-200 hover:brightness-110 hover:shadow-md active:scale-[0.96]\"\n >\n Accept\n \n
\n \n );\n}\n", "type": "registry:ui", "target": "components/ruixen/banner-cookie.tsx" } ] }