import React, { useState } from "react";
import { motion, AnimatePresence } from "motion/react";
import { Heart, Sparkles, Gift, HeartHandshake, Eye, ArrowRight } from "lucide-react";
interface OpeningAnimationProps {
gfNickname: string;
bfName: string;
customLetter: string;
onOpenComplete: () => void;
}
export default function OpeningAnimation({
gfNickname,
bfName,
customLetter,
onOpenComplete,
}: OpeningAnimationProps) {
const [stage, setStage] = useState<"heybaby" | "envelope" | "letter">("heybaby");
// Stabilize little floating hearts inside the view with useMemo to prevent lag/re-eval on every render.
const particles = React.useMemo(() => {
return Array.from({ length: 8 }, (_, i) => ({
id: i,
left: `${(i * 12) + 8}%`, // evenly staggered distribution across the screen
delay: i * 0.6,
size: (i % 3 === 0) ? 14 : (i % 3 === 1) ? 18 : 22,
duration: 12 + (i % 3) * 3,
}));
}, []);
// Clean the letter message into paragraphs
const letterParagraphs = customLetter.split("\n\n");
return (
{/* Decorative Floating Hearts Backdrop */}
{particles.map((p) => (
❤️
))}
{/* Stage 0: The Sweet Greeting 'hey baby...' */}
{stage === "heybaby" && (
{/* Pulsating central love anchor */}
{/* Title requested by client */}
hey baby...
It's your special day, and i built something sweet just for you
setStage("envelope")}
className="bg-white hover:bg-rose-50 text-rose-600 font-display font-semibold text-sm md:text-base px-8 py-4 rounded-full shadow-lg border border-rose-100 flex items-center gap-2.5 cursor-pointer animate-heartbeat"
id="view-gift-button"
>
Tap to see my surprise
)}
{/* Stage 1: Closed Envelope / Pulsing Gift Card */}
{stage === "envelope" && (
)}
{/* Stage 2: Revealing the Love Letter */}
{stage === "letter" && (
{/* Top golden crest */}
{/* Corner floral motifs using shapes */}
{/* Letter Header */}
Dearest {gfNickname},
{/* Letter Content Pane (Scrollable within paper) */}
{letterParagraphs.map((para, idx) => (
{para}
))}
For you, with love,