"use client"; import { gsap } from "gsap"; import { useEffect, useRef, useState } from "react"; interface HeroSectionProps { tutorialsCount: number; categoriesCount: number; title?: string | null; filtered?: boolean; } // Effet de décryptage function useScrambleText( text: string, options: { duration?: number; delay?: number; chars?: string; } = {} ) { const [displayText, setDisplayText] = useState(""); const { duration = 1.5, delay = 0.3, chars = "!@#$%^&*()_+-=[]{}|;:,.<>?/~`0123456789", } = options; useEffect(() => { const finalText = text; const length = finalText.length; let currentIndex = 0; // Délai initial const startTimeout = setTimeout(() => { const scrambleInterval = setInterval(() => { let result = ""; for (let i = 0; i < length; i++) { if (i < currentIndex) { result += finalText[i]; } else if (finalText[i] === " ") { result += " "; } else { // Caractère aléatoire result += chars[Math.floor(Math.random() * chars.length)]; } } setDisplayText(result); }, 30); // Animation gsap pour révéler progressivement gsap.to( { value: 0 }, { value: length, duration, ease: "power2.inOut", onUpdate: function () { currentIndex = Math.floor(this.targets()[0].value); }, onComplete: () => { clearInterval(scrambleInterval); setDisplayText(finalText); }, } ); return () => clearInterval(scrambleInterval); }, delay * 1000); return () => clearTimeout(startTimeout); }, [text, duration, delay, chars]); return displayText; } export function HeroSection({ tutorialsCount, categoriesCount, title, filtered = false, }: HeroSectionProps) { const commandText = filtered ? `ls --filter="${title}"` : "cat hello_world.txt"; const scrambledText = useScrambleText(commandText, { duration: 1.2, delay: 0.5, chars: "█▓▒░!@#$%&*<>[]{}|", }); // Animation du curseur clignotant const cursorRef = useRef(null); useEffect(() => { if (cursorRef.current) { gsap.to(cursorRef.current, { opacity: 0, duration: 0.5, repeat: -1, yoyo: true, ease: "power2.inOut", }); } }, []); return (
$ {scrambledText}

{title || "Mes Tutoriels"}

{filtered ? `${tutorialsCount} tutoriel${ tutorialsCount > 1 ? "s" : "" } dans cette catégorie.` : "Une collection de guides pratiques. Apprenez à votre rythme avec des exemples concrets."}

{/* Stats */}
{tutorialsCount}
tutoriel{tutorialsCount > 1 ? "s" : ""} {filtered ? " (filtrés)" : ""}
{categoriesCount}
catégories
); }