import { useState } from 'react'; type Step = 'initial' | 'confirm1' | 'confirm2' | 'confirm3' | 'confirm4' | 'confirm5' | 'final'; // Floating hearts data const hearts = [ { x: '8%', t: '11s' }, { x: '18%', t: '9s' }, { x: '30%', t: '13s' }, { x: '42%', t: '10s' }, { x: '55%', t: '12s' }, { x: '66%', t: '9.5s' }, { x: '78%', t: '12.5s' }, { x: '90%', t: '10.5s' }, ]; // Confirmation step data - 5 steps with increasing urgency const confirmationSteps = [ { title: "Are you sure? πŸ₯Ί", message: "Like… really sure you want to say \"No\" to this?", tip: "Think again... my heart is waiting!", yesText: "Okay, YES! πŸ’•", noText: "I'm sure", }, { title: "Please say yes! πŸ’”", message: "You're breaking my heart here... Are you absolutely certain?", tip: "The Yes button is right there...", yesText: "Fine, YES! πŸ’–", noText: "Still no", }, { title: "Pretty please? πŸ™", message: "I promise to make you smile every day. Won't you reconsider?", tip: "Just one little click on Yes...", yesText: "Okay okay, YES! πŸ’—", noText: "Nope", }, { title: "Last chance! 😒", message: "My heart can only take so much rejection. Please?", tip: "The Yes button is getting bigger for a reason!", yesText: "YESSS! πŸ’", noText: "No...", }, { title: "I won't give up! πŸ’ͺ❀️", message: "You've clicked No 5 times but my love is stronger! There's only one right answer now...", tip: "You know what to do! πŸ˜‰", yesText: "YES YES YES! πŸ’˜", noText: "...", }, ]; // Yes button sizes that increase with each step const yesSizes = [ "py-3 px-5 text-base min-w-[150px]", "py-3.5 px-6 text-lg min-w-[170px]", "py-4 px-8 text-xl min-w-[200px]", "py-5 px-10 text-2xl min-w-[240px]", "py-6 px-12 text-3xl min-w-[300px]", ]; function FloatingHearts() { return ( ); } function Heart({ className = '' }: { className?: string }) { return (
); } function YesButton({ onClick, className = '', children }: { onClick: () => void; className?: string; children: React.ReactNode }) { return ( ); } function NoButton({ onClick, children, className = '' }: { onClick: () => void; children: React.ReactNode; className?: string }) { return ( ); } function InitialStep({ onYes, onNo }: { onYes: () => void; onNo: () => void }) { return (

Jai, will you be my Valentine?

I have something sweet to ask you today. Choose carefully.

Yes No

Tip: This page is made only for Jai.

); } function ConfirmationStep({ stepIndex, onYes, onNo }: { stepIndex: number; onYes: () => void; onNo: () => void; }) { const step = confirmationSteps[stepIndex]; const yesSize = yesSizes[stepIndex]; return (

{step.title}

{step.message}

{step.yesText} {stepIndex < 4 && ( {step.noText} )}

{step.tip}

{[0, 1, 2, 3, 4].map((i) => ( ))}
); } function FinalStep({ onRestart }: { onRestart: () => void }) { return (

Yay, Jai! πŸŽ‰πŸ’•

You just turned my Valentine's Day into my favorite day!

Jai, I like you in the quiet moments and in the loud ones. In the silly conversations, in the long talks, and even in the comfortable silence.

If love is a choice, then I'm choosing youβ€”today and every day I get the chance.

Happy Valentine's Day, Jai. Let's make this one unforgettable. πŸ’

With love. ❀️

Replay πŸ”„
); } export function App() { const [currentStep, setCurrentStep] = useState('initial'); const handleNo = () => { switch (currentStep) { case 'initial': setCurrentStep('confirm1'); break; case 'confirm1': setCurrentStep('confirm2'); break; case 'confirm2': setCurrentStep('confirm3'); break; case 'confirm3': setCurrentStep('confirm4'); break; case 'confirm4': setCurrentStep('confirm5'); break; default: break; } }; const handleYes = () => { setCurrentStep('final'); }; const handleRestart = () => { setCurrentStep('initial'); }; const getConfirmIndex = (): number => { switch (currentStep) { case 'confirm1': return 0; case 'confirm2': return 1; case 'confirm3': return 2; case 'confirm4': return 3; case 'confirm5': return 4; default: return 0; } }; return (
{/* Radial gradient overlays */}
{currentStep === 'initial' && ( )} {(currentStep === 'confirm1' || currentStep === 'confirm2' || currentStep === 'confirm3' || currentStep === 'confirm4' || currentStep === 'confirm5') && ( )} {currentStep === 'final' && ( )}
); }