{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "cta-banner-section-shadcnui", "type": "registry:page", "title": "CTA Banner Section", "description": "Animated call-to-action banner with gradient background and button animations", "dependencies": [ "framer-motion", "react" ], "files": [ { "path": "@uitripled/react-shadcn/src/components/sections/cta-banner-section.tsx", "content": "\"use client\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n AnimatePresence,\n motion,\n MotionConfig,\n useInView,\n useReducedMotion,\n type Variants,\n} from \"framer-motion\";\nimport { ArrowRight, ChevronRight, Sparkles, Zap } from \"lucide-react\";\nimport { useId, useMemo, useRef, useState } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nconst motionPresets = {\n smooth: { type: \"spring\" as const, bounce: 0.3, duration: 0.4 },\n bounce: { type: \"spring\" as const, bounce: 0.5, duration: 0.35 },\n fade: { type: \"tween\" as const, ease: [0.26, 0.08, 0.25, 1] as const, duration: 0.2 },\n};\n\n\nconst highlights = [\n { id: \"highlight-free\", label: \"Free Forever\", icon: Zap },\n { id: \"highlight-credit\", label: \"No Credit Card\", icon: Sparkles },\n { id: \"highlight-oss\", label: \"Open Source\", icon: ChevronRight },\n];\n\ninterface CTABannerSectionProps {\n motionPreset?: keyof typeof motionPresets;\n className?: string;\n}\n\nexport function CTABannerSection({\n motionPreset = \"smooth\",\n className,\n}: CTABannerSectionProps) {\n const ref = useRef(null);\n const isInView = useInView(ref, { once: true, margin: \"-10% 0px\" });\n const shouldReduceMotion = useReducedMotion();\n const [hoveredButton, setHoveredButton] = useState<\"primary\" | \"secondary\" | null>(null);\n\n const titleId = useId();\n const descriptionId = useMemo(() => `${titleId}-description`, [titleId]);\n\n const reducedMotionVariants: Variants = {\n hidden: { opacity: 0 },\n visible: { opacity: 1 },\n };\n\n const containerVariants: Variants = useMemo(\n () =>\n shouldReduceMotion\n ? reducedMotionVariants\n : {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.1,\n delayChildren: 0.2,\n },\n },\n },\n [shouldReduceMotion]\n );\n\n const itemVariants: Variants = useMemo(\n () =>\n shouldReduceMotion\n ? reducedMotionVariants\n : {\n hidden: { opacity: 0, y: 20 },\n visible: {\n opacity: 1,\n y: 0,\n transition: { duration: 0.4 },\n },\n },\n [shouldReduceMotion]\n );\n\n // Button micro-interaction variants\n const buttonVariants: Variants = {\n idle: { y: 0 },\n hover: { y: -4 },\n tap: { y: 0, scale: 0.98 },\n };\n\n return (\n \n \n\n
\n \n {/* Main CTA Card - Dashboard style */}\n \n {/* Hover gradient overlay - dashboard pattern */}\n
\n\n
\n {/* Status Badge - Dashboard style with live indicator */}\n \n \n \n Ready to Ship\n \n \n\n {/* Heading - Vercel style typography */}\n \n \n Ready to ship motion-rich UIs in minutes?\n \n \n Access a curated library of glassmorphic components,\n production-grade motion recipes, and accessibility-first\n patterns. Start building products that feel alive.\n

\n
\n\n {/* CTA Buttons - Dashboard toolbar style */}\n \n setHoveredButton(\"primary\")}\n onHoverEnd={() => setHoveredButton(null)}\n transition={{ duration: 0.2 }}\n className=\"w-full sm:w-auto\"\n >\n \n \n Get Started\n \n \n \n \n \n \n\n \n \n \n View Docs\n \n \n \n \n
\n \n\n {/* Feature highlights - Dashboard metric cards style */}\n \n \n {highlights.map((item, index) => {\n const Icon = item.icon;\n return (\n \n {/* Hover gradient */}\n
\n\n
\n
\n \n
\n
\n

\n {item.label}\n

\n

\n No strings attached\n

\n
\n
\n \n );\n })}\n \n \n\n {/* Trust statement - Vercel subtle footer */}\n \n Trusted by teams shipping dashboards, finance tools, and modern SaaS\n \n \n
\n \n \n );\n}\n", "type": "registry:page", "target": "components/uitripled/cta-banner-section-shadcnui.tsx" } ] }