{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "animated-hero", "type": "registry:ui", "dependencies": [ "framer-motion", "lucide-react" ], "files": [ { "path": "components/ui/animated-hero.tsx", "content": "\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport { motion } from \"framer-motion\";\r\nimport { Sun, Moon } from \"lucide-react\";\r\nimport { cn } from \"@/lib/utils\";\r\n\r\ninterface AnimatedHeroProps {\r\n /** Hero title text */\r\n title?: string;\r\n /** Whether to show the theme toggle button */\r\n showThemeToggle?: boolean;\r\n /** Additional CSS classes */\r\n className?: string;\r\n /** Force specific theme rendering */\r\n forceTheme?: \"dark\" | \"light\";\r\n}\r\n\r\nexport function AnimatedHero({\r\n title = \"AN AWESOME TITLE\",\r\n showThemeToggle = true,\r\n className = \"\",\r\n forceTheme,\r\n}: AnimatedHeroProps) {\r\n const [isDark, setIsDark] = useState(false);\r\n const [mounted, setMounted] = useState(false);\r\n\r\n useEffect(() => {\r\n setMounted(true);\r\n\r\n const checkDarkMode = () => {\r\n if (forceTheme) return forceTheme === \"dark\";\r\n return document.documentElement.classList.contains(\"dark\");\r\n };\r\n setIsDark(checkDarkMode());\r\n\r\n const observer = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n if (mutation.attributeName === \"class\") {\r\n setIsDark(checkDarkMode());\r\n }\r\n });\r\n });\r\n\r\n observer.observe(document.documentElement, {\r\n attributes: true,\r\n attributeFilter: [\"class\"],\r\n });\r\n\r\n return () => observer.disconnect();\r\n }, []);\r\n\r\n const toggleTheme = () => {\r\n document.documentElement.classList.toggle(\"dark\");\r\n };\r\n\r\n if (!mounted) {\r\n return null;\r\n }\r\n\r\n return (\r\n
\r\n {/* Animated Background */}\r\n \r\n \r\n \r\n\r\n {/* Content */}\r\n \r\n \r\n {title}\r\n \r\n {title}\r\n \r\n \r\n\r\n {showThemeToggle && (\r\n \r\n \r\n {isDark ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n \r\n
\r\n );\r\n}\r\n\r\nexport default AnimatedHero;\r\n", "type": "registry:ui", "target": "components/ui/animated-hero.tsx" } ] }