{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "banner-announcement", "type": "registry:ui", "title": "Banner Announcement", "description": "A dismissible announcement banner with multiple variants and action links.", "dependencies": [ "lucide-react" ], "files": [ { "path": "registry/ruixenui/banner-announcement.tsx", "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { ArrowRight, X } from \"lucide-react\";\n\nexport interface BannerAnnouncementProps {\n children: React.ReactNode;\n badge?: string;\n action?: { label: string; href: string };\n dismissible?: boolean;\n onDismiss?: () => void;\n className?: string;\n}\n\nexport function BannerAnnouncement({\n children,\n badge,\n action,\n dismissible = true,\n onDismiss,\n className,\n}: BannerAnnouncementProps) {\n const [mounted, setMounted] = React.useState(false);\n const [dismissed, setDismissed] = React.useState(false);\n\n React.useEffect(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => setMounted(true));\n });\n }, []);\n\n const handleDismiss = () => {\n setDismissed(true);\n if (onDismiss) setTimeout(onDismiss, 350);\n };\n\n return (\n
\n {children}\n
\n\n {action && (\n \n {action.label}\n