Spaces:
Running
Running
Ctrl+K
- 1.52 kB initial commit
- 210 Bytes <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Zivvy - Your Hidden Revenue Opportunities</title> <style> :root { --zivvy-black: #000000; --zivvy-white: #ffffff; --zivvy-purple: #6b47eb; --zivvy-dark-purple: #510d54; --zivvy-darkest-purple: #302326; --zivvy-yellow: #f9c80e; --zivvy-blue: #256eff; --zivvy-light-blue: #cddeff; --zivvy-light-yellow: #efe3ac; --retention-red: #ff4757; --winback-gold: #ffa502; --referral-blue: #3742fa; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: linear-gradient(135deg, var(--zivvy-darkest-purple) 0%, var(--zivvy-dark-purple) 100%); min-height: 100vh; display: flex; flex-direction: column; overflow-x: hidden; position: relative; } /* Animated background shapes */ .bg-shape { position: fixed; border-radius: 50%; filter: blur(100px); opacity: 0.3; animation: float 20s infinite ease-in-out; pointer-events: none; } .bg-shape-1 { width: 400px; height: 400px; background: var(--zivvy-purple); top: -200px; left: -200px; animation-delay: 0s; } .bg-shape-2 { width: 300px; height: 300px; background: var(--zivvy-blue); bottom: -150px; right: -150px; animation-delay: 5s; } @keyframes float { 0%, 100% { transform: translate(0, 0) scale(1); } 33% { transform: translate(30px, -30px) scale(1.1); } 66% { transform: translate(-20px, 20px) scale(0.9); } } /* Progress indicator */ .progress-container { padding: 30px 20px 20px; display: flex; justify-content: center; align-items: center; gap: 15px; } .progress-coin { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, #444, #222); display: flex; align-items: center; justify-content: center; font-weight: bold; transition: all 0.3s ease; position: relative; cursor: pointer; } .progress-coin.completed { background: linear-gradient(135deg, var(--zivvy-yellow), #f39c12); transform: scale(1.1); box-shadow: 0 0 20px rgba(249, 200, 14, 0.5); } .progress-coin.active { background: linear-gradient(135deg, var(--zivvy-yellow), #f39c12); animation: coinPulse 2s infinite; } @keyframes coinPulse { 0%, 100% { transform: scale(1); box-shadow: 0 0 20px rgba(249, 200, 14, 0.5); } 50% { transform: scale(1.15); box-shadow: 0 0 30px rgba(249, 200, 14, 0.8); } } .progress-coin span { color: var(--zivvy-white); font-size: 18px; } /* Main container */ .container { flex: 1; padding: 20px; max-width: 1200px; margin: 0 auto; width: 100%; animation: fadeInUp 0.6s ease-out; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Celebration banner */ .celebration-banner { background: linear-gradient(135deg, var(--zivvy-yellow), var(--winback-gold)); color: var(--zivvy-darkest-purple); padding: 15px 20px; border-radius: 15px; margin-bottom: 30px; text-align: center; font-size: 20px; font-weight: bold; animation: celebrationSlide 0.6s ease-out; position: relative; overflow: hidden; } .celebration-banner::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); animation: shimmer 3s infinite; } @keyframes celebrationSlide { from { transform: translateY(-20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes shimmer { 0% { transform: translateX(-100%) rotate(45deg); } 100% { transform: translateX(100%) rotate(45deg); } } /* Carried over value */ .carried-value { text-align: center; margin-bottom: 40px; animation: fadeIn 0.8s ease-out 0.3s both; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .carried-value-label { color: var(--zivvy-light-blue); font-size: 18px; margin-bottom: 10px; } .carried-value-amount { font-size: 48px; font-weight: bold; background: linear-gradient(135deg, var(--zivvy-yellow), var(--zivvy-white)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; text-shadow: 0 0 30px rgba(249, 200, 14, 0.5); } /* Main headline */ .headline { text-align: center; margin-bottom: 50px; animation: fadeIn 0.8s ease-out 0.5s both; } .headline h1 { font-size: 42px; color: var(--zivvy-white); margin-bottom: 10px; } .headline h1 .highlight { color: var(--zivvy-yellow); text-shadow: 0 0 20px rgba(249, 200, 14, 0.5); } /* Opportunity cards */ .opportunity-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 30px; margin-bottom: 50px; } .opportunity-card { background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 20px; padding: 30px; position: relative; overflow: hidden; transform: translateY(50px); opacity: 0; animation: cardSlideIn 0.6s ease-out forwards; transition: all 0.3s ease; } .opportunity-card:nth-child(1) { animation-delay: 0.7s; } .opportunity-card:nth-child(2) { animation-delay: 0.9s; } .opportunity-card:nth-child(3) { animation-delay: 1.1s; } @keyframes cardSlideIn { to { transform: translateY(0); opacity: 1; } } .opportunity-card:hover { transform: translateY(-5px) scale(1.02); box-shadow: 0 20px 40px rgba(0,0,0,0.3); } .opportunity-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; } .opportunity-card.retention::before { background: var(--retention-red); } .opportunity-card.winback::before { background: var(--winback-gold); } .opportunity-card.referral::before { background: var(--referral-blue); } .card-icon { width: 60px; height: 60px; margin-bottom: 20px; display: flex; align-items: center; justify-content: center; border-radius: 15px; font-size: 30px; } .retention .card-icon { background: linear-gradient(135deg, var(--retention-red), #ff6b7a); } .winback .card-icon { background: linear-gradient(135deg, var(--winback-gold), #ffc048); } .referral .card-icon { background: linear-gradient(135deg, var(--referral-blue), #5f65ff); } .card-title { font-size: 24px; font-weight: bold; color: var(--zivvy-white); margin-bottom: 15px; text-transform: uppercase; letter-spacing: 1px; } .card-input-group { margin: 20px 0; } .card-input-label { color: var(--zivvy-light-blue); font-size: 14px; margin-bottom: 10px; display: block; } .card-input { width: 100%; padding: 12px 15px; background: rgba(255, 255, 255, 0.1); border: 2px solid rgba(255, 255, 255, 0.2); border-radius: 10px; color: var(--zivvy-white); font-size: 18px; transition: all 0.3s ease; } .card-input:focus { outline: none; background: rgba(255, 255, 255, 0.15); border-color: var(--zivvy-yellow); box-shadow: 0 0 20px rgba(249, 200, 14, 0.3); } .card-calculation { margin-top: 20px; padding: 15px; background: rgba(0, 0, 0, 0.3); border-radius: 10px; text-align: center; } .calculation-label { color: var(--zivvy-light-blue); font-size: 14px; margin-bottom: 5px; } .calculation-amount { font-size: 28px; font-weight: bold; color: var(--zivvy-yellow); text-shadow: 0 0 10px rgba(249, 200, 14, 0.5); } /* Total calculation box */ .total-box { background: linear-gradient(135deg, rgba(249, 200, 14, 0.1), rgba(249, 200, 14, 0.05)); border: 2px solid var(--zivvy-yellow); border-radius: 20px; padding: 40px; text-align: center; margin-bottom: 40px; position: relative; overflow: hidden; opacity: 0; animation: totalReveal 1s ease-out 1.5s forwards; } @keyframes totalReveal { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } .total-box::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle, rgba(249, 200, 14, 0.1), transparent); animation: rotate 10s linear infinite; } @keyframes rotate { 100% { transform: rotate(360deg); } } .total-label { font-size: 24px; color: var(--zivvy-white); margin-bottom: 20px; position: relative; z-index: 1; } .total-amount { font-size: 72px; font-weight: bold; background: linear-gradient(135deg, var(--zivvy-yellow), var(--zivvy-white)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; position: relative; z-index: 1; animation: totalPulse 2s ease-in-out infinite; } @keyframes totalPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } /* Urgency ticker */ .urgency-ticker { text-align: center; margin-bottom: 30px; padding: 15px; background: rgba(255, 71, 87, 0.1); border-radius: 10px; border: 1px solid rgba(255, 71, 87, 0.3); } .urgency-label { color: var(--retention-red); font-size: 16px; margin-bottom: 5px; } .urgency-amount { color: var(--retention-red); font-size: 24px; font-weight: bold; } /* CTA Button */ .cta-container { text-align: center; margin-top: 40px; } .cta-button { display: inline-block; padding: 20px 60px; background: linear-gradient(135deg, var(--zivvy-yellow), var(--winback-gold)); color: var(--zivvy-darkest-purple); font-size: 20px; font-weight: bold; text-decoration: none; border-radius: 50px; position: relative; overflow: hidden; transition: all 0.3s ease; animation: ctaGlow 2s ease-in-out infinite; cursor: pointer; border: none; } @keyframes ctaGlow { 0%, 100% { box-shadow: 0 5px 30px rgba(249, 200, 14, 0.4); } 50% { box-shadow: 0 5px 50px rgba(249, 200, 14, 0.8); } } .cta-button::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient(45deg, transparent, rgba(255,255,255,0.4), transparent); animation: shimmer 3s infinite; } .cta-button:hover { transform: scale(1.05); box-shadow: 0 10px 50px rgba(249, 200, 14, 0.8); } .cta-button:active { transform: scale(0.98); } /* Confetti animation */ .confetti { position: fixed; width: 10px; height: 10px; background: var(--zivvy-yellow); position: absolute; animation: confettiFall 3s ease-out; pointer-events: none; } @keyframes confettiFall { 0% { transform: translateY(-100vh) rotate(0deg); opacity: 1; } 100% { transform: translateY(100vh) rotate(720deg); opacity: 0; } } /* Mobile responsiveness */ @media (max-width: 768px) { .headline h1 { font-size: 32px; } .opportunity-cards { grid-template-columns: 1fr; gap: 20px; } .total-amount { font-size: 48px; } .cta-button { padding: 15px 40px; font-size: 18px; } } </style> </head> <body> <!-- Background shapes --> <div class="bg-shape bg-shape-1"></div> <div class="bg-shape bg-shape-2"></div> <!-- Progress indicator --> <div class="progress-container"> <div class="progress-coin completed"><span>$</span></div> <div class="progress-coin completed"><span>$</span></div> <div class="progress-coin completed"><span>$</span></div> <div class="progress-coin active"><span>$</span></div> <div class="progress-coin"><span>$</span></div> <div class="progress-coin"><span>$</span></div> </div> <!-- Main container --> <div class="container"> <!-- Celebration banner --> <div class="celebration-banner"> π You're sitting on a goldmine! </div> <!-- Carried over value --> <div class="carried-value"> <div class="carried-value-label">Based on your school profile:</div> <div class="carried-value-amount" id="carriedAmount">$32,847</div> </div> <!-- Main headline --> <div class="headline"> <h1>Let's Find <span class="highlight">ALL</span> Your Hidden Money</h1> </div> <!-- Opportunity cards --> <div class="opportunity-cards"> <!-- Retention Card --> <div class="opportunity-card retention"> <div class="card-icon">β οΈ</div> <div class="card-title">The Quiet Quitters</div> <div class="card-input-group"> <label class="card-input-label">Estimate students who left last year:</label> <input type="number" class="card-input" id="retentionInput" placeholder="0" min="0" max="100"> </div> <div class="card-calculation"> <div class="calculation-label">Worth approximately:</div> <div class="calculation-amount" id="retentionAmount">$0</div> </div> </div> <!-- Winback Card --> <div class="opportunity-card winback"> <div class="card-icon">π°</div> <div class="card-title">The Sleeping Gold</div> <div class="card-input-group"> <label class="card-input-label">Former students in your records:</label> <input type="number" class="card-input" id="winbackInput" placeholder="0" min="0" max="500"> </div> <div class="card-calculation"> <div class="calculation-label">Reactivation potential:</div> <div class="calculation-amount" id="winbackAmount">$0</div> </div> </div> <!-- Referral Card --> <div class="opportunity-card referral"> <div class="card-icon">π’</div> <div class="card-title">The Silent Advocates</div> <div class="card-input-group"> <label class="card-input-label">Families who love you:</label> <input type="number" class="card-input" id="referralInput" placeholder="0" min="0" max="200"> </div> <div class="card-calculation"> <div class="calculation-label">Referral revenue hiding:</div> <div class="calculation-amount" id="referralAmount">$0</div> </div> </div> </div> <!-- Total calculation box --> <div class="total-box"> <div class="total-label">Your Total Hidden Revenue:</div> <div class="total-amount" id="totalAmount">$0</div> </div> <!-- Urgency ticker --> <div class="urgency-ticker"> <div class="urgency-label">While you read this, you've lost:</div> <div class="urgency-amount" id="urgencyAmount">$0</div> </div> <!-- CTA Button --> <div class="cta-container"> <button class="cta-button" onclick="proceedToPayment()"> I Want to Recover This Money β </button> </div> </div> <script> // Get carried over values from previous page (would come from session/localStorage) const studentCount = localStorage.getItem('studentCount') || 250; const tuitionAmount = localStorage.getItem('tuitionAmount') || 200; // Calculate base opportunity from previous page const baseOpportunity = Math.round((studentCount * tuitionAmount * 0.65)); document.getElementById('carriedAmount').textContent = '$' + baseOpportunity.toLocaleString(); // Calculation variables let retentionValue = 0; let winbackValue = 0; let referralValue = 0; let totalValue = baseOpportunity; // Average values for calculations const avgMonthlyTuition = tuitionAmount || 200; const retentionMonths = 12; // Value of keeping a student for a year const winbackRate = 0.3; // 30% of former students can be won back const referralConversionRate = 0.5; // 50% of happy families will refer const referralValue = avgMonthlyTuition * 6; // 6 months value per referral // Input handlers document.getElementById('retentionInput').addEventListener('input', function(e) { const students = parseInt(e.target.value) || 0; retentionValue = students * avgMonthlyTuition * retentionMonths; document.getElementById('retentionAmount').textContent = '$' + retentionValue.toLocaleString(); updateTotal(); // Add animation when value changes if (students > 0) { this.parentElement.parentElement.style.transform = 'scale(1.02)'; setTimeout(() => { this.parentElement.parentElement.style.transform = ''; }, 200); } }); document.getElementById('winbackInput').addEventListener('input', function(e) { const students = parseInt(e.target.value) || 0; winbackValue = Math.round(students * winbackRate * avgMonthlyTuition * 6); document.getElementById('winbackAmount').textContent = '$' + winbackValue.toLocaleString(); updateTotal(); // Add animation if (students > 0) { this.parentElement.parentElement.style.transform = 'scale(1.02)'; setTimeout(() => { this.parentElement.parentElement.style.transform = ''; }, 200); } }); document.getElementById('referralInput').addEventListener('input', function(e) { const families = parseInt(e.target.value) || 0; referralValue = Math.round(families * referralConversionRate * referralValue); document.getElementById('referralAmount').textContent = '$' + referralValue.toLocaleString(); updateTotal(); // Add animation if (families > 0) { this.parentElement.parentElement.style.transform = 'scale(1.02)'; setTimeout(() => { this.parentElement.parentElement.style.transform = ''; }, 200); } }); // Update total with animation function updateTotal() { const newTotal = baseOpportunity + retentionValue + winbackValue + referralValue; // Animate the number counting up const currentTotal = parseInt(document.getElementById('totalAmount').textContent.replace(/[$,]/g, '')) || 0; const difference = newTotal - currentTotal; const steps = 30; const increment = difference / steps; let currentStep = 0; const interval = setInterval(() => { currentStep++; const displayValue = Math.round(currentTotal + (increment * currentStep)); document.getElementById('totalAmount').textContent = '$' + displayValue.toLocaleString(); if (currentStep >= steps) { clearInterval(interval); document.getElementById('totalAmount').textContent = '$' + newTotal.toLocaleString(); // Trigger confetti if over $50k if (newTotal > 50000 && !this.confettiTriggered) { triggerConfetti(); this.confettiTriggered = true; } } }, 30); totalValue = newTotal; } // Urgency ticker let urgencyLoss = 0; setInterval(() => { urgencyLoss += 11; // Lose about $11 per second ($950k per day / 86400 seconds) document.getElementById('urgencyAmount').textContent = '$' + urgencyLoss.toLocaleString(); }, 1000); // Confetti effect function triggerConfetti() { const colors = ['#f9c80e', '#ffa502', '#ff6b7a', '#5f65ff', '#ffffff']; for (let i = 0; i < 50; i++) { setTimeout(() => { const confetti = document.createElement('div'); confetti.className = 'confetti'; confetti.style.left = Math.random() * 100 + '%'; confetti.style.background = colors[Math.floor(Math.random() * colors.length)]; confetti.style.animationDelay = Math.random() * 0.5 + 's'; confetti.style.animationDuration = (Math.random() * 2 + 2) + 's'; document.body.appendChild(confetti); setTimeout(() => confetti.remove(), 4000); }, i * 30); } } // Proceed to payment function proceedToPayment() { // Store the total for next page localStorage.setItem('totalOpportunity', totalValue); // Add click animation event.target.style.transform = 'scale(0.95)'; setTimeout(() => { // Navigate to next page window.location.href = 'page5-payment.html'; }, 200); } // Auto-fill some values after delay for demo effect setTimeout(() => { // Simulate user entering values const retentionInput = document.getElementById('retentionInput'); retentionInput.value = 15; retentionInput.dispatchEvent(new Event('input')); }, 2000); setTimeout(() => { const winbackInput = document.getElementById('winbackInput'); winbackInput.value = 45; winbackInput.dispatchEvent(new Event('input')); }, 2500); setTimeout(() => { const referralInput = document.getElementById('referralInput'); referralInput.value = 30; referralInput.dispatchEvent(new Event('input')); }, 3000); </script> </body> </html> - Initial Deployment
- 14.9 kB <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Zivvy - Your Hidden Revenue Opportunities</title> <style> :root { --zivvy-black: #000000; --zivvy-white: #ffffff; --zivvy-purple: #6b47eb; --zivvy-dark-purple: #510d54; --zivvy-darkest-purple: #302326; --zivvy-yellow: #f9c80e; --zivvy-blue: #256eff; --zivvy-light-blue: #cddeff; --zivvy-light-yellow: #efe3ac; --retention-red: #ff4757; --winback-gold: #ffa502; --referral-blue: #3742fa; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; background: linear-gradient(135deg, var(--zivvy-darkest-purple) 0%, var(--zivvy-dark-purple) 100%); min-height: 100vh; display: flex; flex-direction: column; overflow-x: hidden; position: relative; } /* Animated background shapes */ .bg-shape { position: fixed; border-radius: 50%; filter: blur(100px); opacity: 0.3; animation: float 20s infinite ease-in-out; pointer-events: none; } .bg-shape-1 { width: 400px; height: 400px; background: var(--zivvy-purple); top: -200px; left: -200px; animation-delay: 0s; } .bg-shape-2 { width: 300px; height: 300px; background: var(--zivvy-blue); bottom: -150px; right: -150px; animation-delay: 5s; } @keyframes float { 0%, 100% { transform: translate(0, 0) scale(1); } 33% { transform: translate(30px, -30px) scale(1.1); } 66% { transform: translate(-20px, 20px) scale(0.9); } } /* Progress indicator */ .progress-container { padding: 30px 20px 20px; display: flex; justify-content: center; align-items: center; gap: 15px; } .progress-coin { width: 40px; height: 40px; border-radius: 50%; background: linear-gradient(135deg, #444, #222); display: flex; align-items: center; justify-content: center; font-weight: bold; transition: all 0.3s ease; position: relative; cursor: pointer; } .progress-coin.completed { background: linear-gradient(135deg, var(--zivvy-yellow), #f39c12); transform: scale(1.1); box-shadow: 0 0 20px rgba(249, 200, 14, 0.5); } .progress-coin.active { background: linear-gradient(135deg, var(--zivvy-yellow), #f39c12); animation: coinPulse 2s infinite; } @keyframes coinPulse { 0%, 100% { transform: scale(1); box-shadow: 0 0 20px rgba(249, 200, 14, 0.5); } 50% { transform: scale(1.15); box-shadow: 0 0 30px rgba(249, 200, 14, 0.8); } } .progress-coin span { color: var(--zivvy-white); font-size: 18px; } /* Main container */ .container { flex: 1; padding: 20px; max-width: 1200px; margin: 0 auto; width: 100%; animation: fadeInUp 0.6s ease-out; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Celebration banner */ .celebration-banner { background: linear-gradient(135deg, var(--zivvy-yellow), var(--winback-gold)); color: var(--zivvy-darkest-purple); padding: 15px 20px; border-radius: 15px; margin-bottom: 30px; text-align: center; font-size: 20px; font-weight: bold; animation: celebrationSlide 0.6s ease-out; position: relative; overflow: hidden; } .celebration-banner::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient(45deg, transparent, rgba(255,255,255,0.3), transparent); animation: shimmer 3s infinite; } @keyframes celebrationSlide { from { transform: translateY(-20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes shimmer { 0% { transform: translateX(-100%) rotate(45deg); } 100% { transform: translateX(100%) rotate(45deg); } } /* Carried over value */ .carried-value { text-align: center; margin-bottom: 40px; animation: fadeIn 0.8s ease-out 0.3s both; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .carried-value-label { color: var(--zivvy-light-blue); font-size: 18px; margin-bottom: 10px; } .carried-value-amount { font-size: 48px; font-weight: bold; background: linear-gradient(135deg, var(--zivvy-yellow), var(--zivvy-white)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; text-shadow: 0 0 30px rgba(249, 200, 14, 0.5); } /* Main headline */ .headline { text-align: center; margin-bottom: 50px; animation: fadeIn 0.8s ease-out 0.5s both; } .headline h1 { font-size: 42px; color: var(--zivvy-white); margin-bottom: 10px; } .headline h1 .highlight { color: var(--zivvy-yellow); text-shadow: 0 0 20px rgba(249, 200, 14, 0.5); } /* Opportunity cards */ .opportunity-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 30px; margin-bottom: 50px; } .opportunity-card { background: rgba(255, 255, 255, 0.05); backdrop-filter: blur(10px); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 20px; padding: 30px; position: relative; overflow: hidden; transform: translateY(50px); opacity: 0; animation: cardSlideIn 0.6s ease-out forwards; transition: all 0.3s ease; } .opportunity-card:nth-child(1) { animation-delay: 0.7s; } .opportunity-card:nth-child(2) { animation-delay: 0.9s; } .opportunity-card:nth-child(3) { animation-delay: 1.1s; } @keyframes cardSlideIn { to { transform: translateY(0); opacity: 1; } } .opportunity-card:hover { transform: translateY(-5px) scale(1.02); box-shadow: 0 20px 40px rgba(0,0,0,0.3); } .opportunity-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; } .opportunity-card.retention::before { background: var(--retention-red); } .opportunity-card.winback::before { background: var(--winback-gold); } .opportunity-card.referral::before { background: var(--referral-blue); } .card-icon { width: 60px; height: 60px; margin-bottom: 20px; display: flex; align-items: center; justify-content: center; border-radius: 15px; font-size: 30px; } .retention .card-icon { background: linear-gradient(135deg, var(--retention-red), #ff6b7a); } .winback .card-icon { background: linear-gradient(135deg, var(--winback-gold), #ffc048); } .referral .card-icon { background: linear-gradient(135deg, var(--referral-blue), #5f65ff); } .card-title { font-size: 24px; font-weight: bold; color: var(--zivvy-white); margin-bottom: 15px; text-transform: uppercase; letter-spacing: 1px; } .card-input-group { margin: 20px 0; } .card-input-label { color: var(--zivvy-light-blue); font-size: 14px; margin-bottom: 10px; display: block; } .card-input { width: 100%; padding: 12px 15px; background: rgba(255, 255, 255, 0.1); border: 2px solid rgba(255, 255, 255, 0.2); border-radius: 10px; color: var(--zivvy-white); font-size: 18px; transition: all 0.3s ease; } .card-input:focus { outline: none; background: rgba(255, 255, 255, 0.15); border-color: var(--zivvy-yellow); box-shadow: 0 0 20px rgba(249, 200, 14, 0.3); } .card-calculation { margin-top: 20px; padding: 15px; background: rgba(0, 0, 0, 0.3); border-radius: 10px; text-align: center; } .calculation-label { color: var(--zivvy-light-blue); font-size: 14px; margin-bottom: 5px; } .calculation-amount { font-size: 28px; font-weight: bold; color: var(--zivvy-yellow); text-shadow: 0 0 10px rgba(249, 200, 14, 0.5); } /* Total calculation box */ .total-box { background: linear-gradient(135deg, rgba(249, 200, 14, 0.1), rgba(249, 200, 14, 0.05)); border: 2px solid var(--zivvy-yellow); border-radius: 20px; padding: 40px; text-align: center; margin-bottom: 40px; position: relative; overflow: hidden; opacity: 0; animation: totalReveal 1s ease-out 1.5s forwards; } @keyframes totalReveal { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } .total-box::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle, rgba(249, 200, 14, 0.1), transparent); animation: rotate 10s linear infinite; } @keyframes rotate { 100% { transform: rotate(360deg); } } .total-label { font-size: 24px; color: var(--zivvy-white); margin-bottom: 20px; position: relative; z-index: 1; } .total-amount { font-size: 72px; font-weight: bold; background: linear-gradient(135deg, var(--zivvy-yellow), var(--zivvy-white)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; position: relative; z-index: 1; animation: totalPulse 2s ease-in-out infinite; } @keyframes totalPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } } /* Urgency ticker */ .urgency-ticker { text-align: center; margin-bottom: 30px; padding: 15px; background: rgba(255, 71, 87, 0.1); border-radius: 10px; border: 1px solid rgba(255, 71, 87, 0.3); } .urgency-label { color: var(--retention-red); font-size: 16px; margin-bottom: 5px; } .urgency-amount { color: var(--retention-red); font-size: 24px; font-weight: bold; } /* CTA Button */ .cta-container { text-align: center; margin-top: 40px; } .cta-button { display: inline-block; padding: 20px 60px; background: linear-gradient(135deg, var(--zivvy-yellow), var(--winback-gold)); color: var(--zivvy-darkest-purple); font-size: 20px; font-weight: bold; text-decoration: none; border-radius: 50px; position: relative; overflow: hidden; transition: all 0.3s ease; animation: ctaGlow 2s ease-in-out infinite; cursor: pointer; border: none; } @keyframes ctaGlow { 0%, 100% { box-shadow: 0 5px 30px rgba(249, 200, 14, 0.4); } 50% { box-shadow: 0 5px 50px rgba(249, 200, 14, 0.8); } } .cta-button::before { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: linear-gradient(45deg, transparent, rgba(255,255,255,0.4), transparent); animation: shimmer 3s infinite; } .cta-button:hover { transform: scale(1.05); box-shadow: 0 10px 50px rgba(249, 200, 14, 0.8); } .cta-button:active { transform: scale(0.98); } /* Confetti animation */ .confetti { position: fixed; width: 10px; height: 10px; background: var(--zivvy-yellow); position: absolute; animation: confettiFall 3s ease-out; pointer-events: none; } @keyframes confettiFall { 0% { transform: translateY(-100vh) rotate(0deg); opacity: 1; } 100% { transform: translateY(100vh) rotate(720deg); opacity: 0; } } /* Mobile responsiveness */ @media (max-width: 768px) { .headline h1 { font-size: 32px; } .opportunity-cards { grid-template-columns: 1fr; gap: 20px; } .total-amount { font-size: 48px; } .cta-button { padding: 15px 40px; font-size: 18px; } } </style> </head> <body> <!-- Background shapes --> <div class="bg-shape bg-shape-1"></div> <div class="bg-shape bg-shape-2"></div> <!-- Progress indicator --> <div class="progress-container"> <div class="progress-coin completed"><span>$</span></div> <div class="progress-coin completed"><span>$</span></div> <div class="progress-coin completed"><span>$</span></div> <div class="progress-coin active"><span>$</span></div> <div class="progress-coin"><span>$</span></div> <div class="progress-coin"><span>$</span></div> </div> <!-- Main container --> <div class="container"> <!-- Celebration banner --> <div class="celebration-banner"> π You're sitting on a goldmine! </div> <!-- Carried over value --> <div class="carried-value"> <div class="carried-value-label">Based on your school profile:</div> <div class="carried-value-amount" id="carriedAmount">$32,847</div> </div> <!-- Main headline --> <div class="headline"> <h1>Let's Find <span class="highlight">ALL</span> Your Hidden Money</h1> </div> <!-- Opportunity cards --> <div class="opportunity-cards"> <!-- Retention Card --> <div class="opportunity-card retention"> <div class="card-icon">β οΈ</div> <div class="card-title">The Quiet Quitters</div> <div class="card-input-group"> <label class="card-input-label">Estimate students who left last year:</label> <input type="number" class="card-input" id="retentionInput" placeholder="0" min="0" max="100"> </div> <div class="card-calculation"> <div class="calculation-label">Worth approximately:</div> <div class="calculation-amount" id="retentionAmount">$0</div> </div> </div> <!-- Winback Card --> <div class="opportunity-card winback"> <div class="card-icon">π°</div> <div class="card-title">The Sleeping Gold</div> <div class="card-input-group"> <label class="card-input-label">Former students in your records:</label> <input type="number" class="card-input" id="winbackInput" placeholder="0" min="0" max="500"> </div> <div class="card-calculation"> <div class="calculation-label">Reactivation potential:</div> <div class="calculation-amount" id="winbackAmount">$0</div> </div> </div> <!-- Referral Card --> <div class="opportunity-card referral"> <div class="card-icon">π’</div> <div class="card-title">The Silent Advocates</div> <div class="card-input-group"> <label class="card-input-label">Families who love you:</label> <input type="number" class="card-input" id="referralInput" placeholder="0" min="0" max="200"> </div> <div class="card-calculation"> <div class="calculation-label">Referral revenue hiding:</div> <div class="calculation-amount" id="referralAmount">$0</div> </div> </div> </div> <!-- Total calculation box --> <div class="total-box"> <div class="total-label">Your Total Hidden Revenue:</div> <div class="total-amount" id="totalAmount">$0</div> </div> <!-- Urgency ticker --> <div class="urgency-ticker"> <div class="urgency-label">While you read this, you've lost:</div> <div class="urgency-amount" id="urgencyAmount">$0</div> </div> <!-- CTA Button --> <div class="cta-container"> <button class="cta-button" onclick="proceedToPayment()"> I Want to Recover This Money β </button> </div> </div> <script> // Get carried over values from previous page (would come from session/localStorage) const studentCount = localStorage.getItem('studentCount') || 250; const tuitionAmount = localStorage.getItem('tuitionAmount') || 200; // Calculate base opportunity from previous page const baseOpportunity = Math.round((studentCount * tuitionAmount * 0.65)); document.getElementById('carriedAmount').textContent = '$' + baseOpportunity.toLocaleString(); // Calculation variables let retentionValue = 0; let winbackValue = 0; let referralValue = 0; let totalValue = baseOpportunity; // Average values for calculations const avgMonthlyTuition = tuitionAmount || 200; const retentionMonths = 12; // Value of keeping a student for a year const winbackRate = 0.3; // 30% of former students can be won back const referralConversionRate = 0.5; // 50% of happy families will refer const referralValue = avgMonthlyTuition * 6; // 6 months value per referral // Input handlers document.getElementById('retentionInput').addEventListener('input', function(e) { const students = parseInt(e.target.value) || 0; retentionValue = students * avgMonthlyTuition * retentionMonths; document.getElementById('retentionAmount').textContent = '$' + retentionValue.toLocaleString(); updateTotal(); // Add animation when value changes if (students > 0) { this.parentElement.parentElement.style.transform = 'scale(1.02)'; setTimeout(() => { this.parentElement.parentElement.style.transform = ''; }, 200); } }); document.getElementById('winbackInput').addEventListener('input', function(e) { const students = parseInt(e.target.value) || 0; winbackValue = Math.round(students * winbackRate * avgMonthlyTuition * 6); document.getElementById('winbackAmount').textContent = '$' + winbackValue.toLocaleString(); updateTotal(); // Add animation if (students > 0) { this.parentElement.parentElement.style.transform = 'scale(1.02)'; setTimeout(() => { this.parentElement.parentElement.style.transform = ''; }, 200); } }); document.getElementById('referralInput').addEventListener('input', function(e) { const families = parseInt(e.target.value) || 0; referralValue = Math.round(families * referralConversionRate * referralValue); document.getElementById('referralAmount').textContent = '$' + referralValue.toLocaleString(); updateTotal(); // Add animation if (families > 0) { this.parentElement.parentElement.style.transform = 'scale(1.02)'; setTimeout(() => { this.parentElement.parentElement.style.transform = ''; }, 200); } }); // Update total with animation function updateTotal() { const newTotal = baseOpportunity + retentionValue + winbackValue + referralValue; // Animate the number counting up const currentTotal = parseInt(document.getElementById('totalAmount').textContent.replace(/[$,]/g, '')) || 0; const difference = newTotal - currentTotal; const steps = 30; const increment = difference / steps; let currentStep = 0; const interval = setInterval(() => { currentStep++; const displayValue = Math.round(currentTotal + (increment * currentStep)); document.getElementById('totalAmount').textContent = '$' + displayValue.toLocaleString(); if (currentStep >= steps) { clearInterval(interval); document.getElementById('totalAmount').textContent = '$' + newTotal.toLocaleString(); // Trigger confetti if over $50k if (newTotal > 50000 && !this.confettiTriggered) { triggerConfetti(); this.confettiTriggered = true; } } }, 30); totalValue = newTotal; } // Urgency ticker let urgencyLoss = 0; setInterval(() => { urgencyLoss += 11; // Lose about $11 per second ($950k per day / 86400 seconds) document.getElementById('urgencyAmount').textContent = '$' + urgencyLoss.toLocaleString(); }, 1000); // Confetti effect function triggerConfetti() { const colors = ['#f9c80e', '#ffa502', '#ff6b7a', '#5f65ff', '#ffffff']; for (let i = 0; i < 50; i++) { setTimeout(() => { const confetti = document.createElement('div'); confetti.className = 'confetti'; confetti.style.left = Math.random() * 100 + '%'; confetti.style.background = colors[Math.floor(Math.random() * colors.length)]; confetti.style.animationDelay = Math.random() * 0.5 + 's'; confetti.style.animationDuration = (Math.random() * 2 + 2) + 's'; document.body.appendChild(confetti); setTimeout(() => confetti.remove(), 4000); }, i * 30); } } // Proceed to payment function proceedToPayment() { // Store the total for next page localStorage.setItem('totalOpportunity', totalValue); // Add click animation event.target.style.transform = 'scale(0.95)'; setTimeout(() => { // Navigate to next page window.location.href = 'page5-payment.html'; }, 200); } // Auto-fill some values after delay for demo effect setTimeout(() => { // Simulate user entering values const retentionInput = document.getElementById('retentionInput'); retentionInput.value = 15; retentionInput.dispatchEvent(new Event('input')); }, 2000); setTimeout(() => { const winbackInput = document.getElementById('winbackInput'); winbackInput.value = 45; winbackInput.dispatchEvent(new Event('input')); }, 2500); setTimeout(() => { const referralInput = document.getElementById('referralInput'); referralInput.value = 30; referralInput.dispatchEvent(new Event('input')); }, 3000); </script> </body> </html> - Initial Deployment
- 388 Bytes initial commit