'use client'; import { CSSProperties, useEffect, useState } from 'react'; import { motion } from 'framer-motion'; import { cn } from '@/lib/utils'; interface Sparkle { id: string; x: string; y: string; color: string; delay: number; scale: number; lifespan: number; } interface SparklesTextProps { className?: string; text: string; sparklesCount?: number; colors?: { first: string; second: string; }; } const SparklesText: React.FC = ({ text, colors = { first: '#9E7AFF', second: '#FE8BBB' }, className, sparklesCount = 10, ...props }) => { const [sparkles, setSparkles] = useState([]); useEffect(() => { const generateStar = (): Sparkle => { const starX = `${Math.random() * 100}%`; const starY = `${Math.random() * 100}%`; const color = Math.random() > 0.5 ? colors.first : colors.second; const delay = Math.random() * 2; const scale = Math.random() * 1 + 0.3; const lifespan = Math.random() * 10 + 5; const id = `${starX}-${starY}-${Date.now()}-${Math.random()}`; return { id, x: starX, y: starY, color, delay, scale, lifespan }; }; const initializeStars = () => { const newSparkles = Array.from({ length: sparklesCount }, generateStar); setSparkles(newSparkles); }; const updateStars = () => { setSparkles((currentSparkles) => currentSparkles.map((star) => { if (star.lifespan <= 0) { return generateStar(); } return { ...star, lifespan: star.lifespan - 0.1 }; }), ); }; initializeStars(); const interval = setInterval(updateStars, 100); return () => clearInterval(interval); }, [colors.first, colors.second, sparklesCount]); return (
{sparkles.map((sparkle) => ( ))} {text}
); }; const SparkleEl: React.FC = ({ id, x, y, color, delay, scale }) => { return ( ); }; interface SparklesOverlayProps { className?: string; sparklesCount?: number; colors?: { first: string; second: string }; } const SparklesOverlay: React.FC = ({ className, sparklesCount = 18, colors = { first: '#9E7AFF', second: '#FE8BBB' }, }) => { const [sparkles, setSparkles] = useState([]); useEffect(() => { const generateStar = (): Sparkle => { const starX = `${Math.random() * 100}%`; const starY = `${Math.random() * 100}%`; const color = Math.random() > 0.5 ? colors.first : colors.second; const delay = Math.random() * 4; const scale = Math.random() * 0.9 + 0.4; const lifespan = Math.random() * 14 + 8; const id = `${starX}-${starY}-${Date.now()}-${Math.random()}`; return { id, x: starX, y: starY, color, delay, scale, lifespan }; }; setSparkles(Array.from({ length: sparklesCount }, generateStar)); const interval = setInterval(() => { setSparkles((cur) => cur.map((s) => (s.lifespan <= 0 ? generateStar() : { ...s, lifespan: s.lifespan - 0.1 })), ); }, 100); return () => clearInterval(interval); }, [colors.first, colors.second, sparklesCount]); return (
{sparkles.map((s) => ( ))}
); }; const SlowSparkle: React.FC = ({ id, x, y, color, delay, scale }) => { return ( ); }; export { SparklesText, SparklesOverlay };