BabyReady Protocol | Fertility Clinic & Surrogacy Agency B2B Partner Program tailwind.config = { theme: { extend: { fontFamily: { sans: ['"Plus Jakarta Sans"', 'sans-serif'], display: ['"Instrument Sans"', 'sans-serif'], }, colors: { creme: { 50: '#FFFDFB', 100: '#FAF6F0', 200: '#F5ECE3', 300: '#EBDCD0', 400: '#D9C3B0', }, roseGold: { 50: '#FFF5F6', 100: '#FCE8EA', 300: '#F4B8C1', 500: '#E26D82', 600: '#C84B62', 700: '#9E2D43', dark: '#5C1422' }, emeraldCustom: { 50: '#F0FDF4', 600: '#16A34A', 700: '#15803D' } } } } } body { background-color: #FAF6F0; color: #2A2123; overflow-x: hidden; } /* Apple Translucent Frosted Glass Panel Styling */ .apple-glass { background: rgba(255, 255, 255, 0.42); backdrop-filter: blur(28px) saturate(190%); -webkit-backdrop-filter: blur(28px) saturate(190%); border: 1px solid rgba(255, 255, 255, 0.75); box-shadow: 0 24px 60px rgba(158, 45, 67, 0.06), 0 2px 6px rgba(0, 0, 0, 0.02), inset 0 1px 1px rgba(255, 255, 255, 0.9); } .apple-glass-card { background: linear-gradient(135deg, rgba(255, 255, 255, 0.52) 0%, rgba(255, 255, 255, 0.32) 100%); backdrop-filter: blur(24px) saturate(180%); -webkit-backdrop-filter: blur(24px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.75); box-shadow: 0 14px 38px rgba(158, 45, 67, 0.05), inset 0 1px 2px rgba(255, 255, 255, 0.9); transition: all 0.5s cubic-bezier(0.16, 1, 0.3, 1); position: relative; overflow: hidden; } /* Glass Reflection Specular Highlight Effect */ .apple-glass-card::before { content: ''; position: absolute; top: 0; left: -150%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.75), transparent); transform: skewX(-20deg); transition: left 0.8s cubic-bezier(0.16, 1, 0.3, 1); pointer-events: none; } .apple-glass-card:hover::before { left: 150%; } .apple-glass-card:hover { background: rgba(255, 255, 255, 0.75); border-color: rgba(226, 109, 130, 0.5); box-shadow: 0 28px 55px rgba(226, 109, 130, 0.16), 0 4px 12px rgba(0, 0, 0, 0.04); transform: translateY(-6px) scale(1.015); } /* Apple Range Sliders */ input[type=range] { -webkit-appearance: none; background: rgba(235, 220, 208, 0.7); backdrop-filter: blur(10px); border-radius: 9999px; height: 8px; } input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; height: 26px; width: 26px; border-radius: 50%; background: #FFFFFF; border: 2.5px solid #E26D82; cursor: pointer; box-shadow: 0 4px 14px rgba(226, 109, 130, 0.35); transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.2s ease; } input[type=range]::-webkit-slider-thumb:hover { transform: scale(1.2); box-shadow: 0 6px 20px rgba(226, 109, 130, 0.5); } /* Primary Glass Button */ .btn-apple-primary { position: relative; background: linear-gradient(135deg, rgba(226, 109, 130, 0.92) 0%, rgba(200, 75, 98, 0.95) 100%); backdrop-filter: blur(12px); box-shadow: 0 10px 25px rgba(226, 109, 130, 0.32); transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1); overflow: hidden; } .btn-apple-primary::after { content: ''; position: absolute; top: -50%; left: -50%; width: 200%; height: 200%; background: radial-gradient(circle, rgba(255,255,255,0.3) 0%, transparent 60%); opacity: 0; transition: opacity 0.4s ease; pointer-events: none; } .btn-apple-primary:hover::after { opacity: 1; } .btn-apple-primary:hover { box-shadow: 0 16px 38px rgba(226, 109, 130, 0.55); transform: translateY(-3px); } /* Scrollbar-free Carousels */ .no-scrollbar::-webkit-scrollbar { display: none; } .no-scrollbar { -ms-overflow-style: none; scrollbar-width: none; } .scroll-snap-carousel { scroll-snap-type: x mandatory; } .carousel-item { scroll-snap-align: center; } /* Scroll Reveal Animations */ .reveal-on-scroll { opacity: 0; transform: translateY(28px); transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1), transform 0.8s cubic-bezier(0.16, 1, 0.3, 1); } .reveal-on-scroll.active { opacity: 1; transform: translateY(0); } .delay-100 { transition-delay: 100ms; } .delay-200 { transition-delay: 200ms; } .delay-300 { transition-delay: 300ms; } .pulse-border-rose { animation: pulseBorderRose 3s infinite ease-in-out; } @keyframes pulseBorderRose { 0%, 100% { border-color: rgba(226, 109, 130, 0.35); box-shadow: 0 0 0 0 rgba(226, 109, 130, 0.1); } 50% { border-color: rgba(226, 109, 130, 0.7); box-shadow: 0 0 25px 4px rgba(226, 109, 130, 0.2); } } /* Calculator & Navigation Tab Styles */ .calc-tab.active { background-color: #E26D82; color: #FFFFFF; box-shadow: 0 6px 18px rgba(226, 109, 130, 0.35); }
BabyReadyProtocol B2B Clinic & Agency Partnership
B2B Direct Desk Calculate Revenue Gains
Turnkey High-BMI Candidate Recovery For Clinics & Agencies
STOP TURNING AWAY HIGH-BMI CANDIDATES. MONETIZE & CLEAR THEM SAFELY.
Up to 35% of prospective IVF patients and surrogacy applicants are turned away due to strict BMI cutoffs (32-35 BMI). We provide a medically aligned, white-glove metabolic protocol that converts turned-away candidates into cleared, high-receptivity transfers in 8-14 weeks.
Calculate Potential Earning Gains Inquire Agency / Clinic Partnership
Financial Projection Model
POTENTIAL EARNING GAINS CALCULATOR
Select your institution type to calculate how much annual lost revenue you can recover by routing high-BMI applicants into our protocol.
Fertility Clinics Surrogacy Agencies
High-BMI Turn-Aways / Month 6 Patients
Patients rejected or delayed due to clinic BMI limits (>32-35 BMI).
Avg. Revenue per IVF Cycle $18,000
Average clinical fee per full IVF/FET cycle.
Rejected Surrogate Applicants / Month 8 Applicants
Gestational carrier applicants disqualified solely due to high BMI.
Agency Match / Placement Fee $25,000
Agency fee realized per successful surrogate placement.
RECOVERED PATIENTS / YR
52 Candidates
Cleared for treatment after 8-12 week protocol
ADDITIONAL RECOVERED REVENUE
$936,000 / yr
Previously lost revenue captured directly by your institution
ADMINISTRATIVE COST TO YOU
$0.00
We manage 100% of candidate coaching
Become A Referral Partner
Clinical Optimization Framework
THE 4 PROTOCOL PHASES
Swipe through our 4-phase metabolic blueprint engineered to lower BMI, preserve thyroid & leptin levels, and optimize uterine receptivity.
Phase 01 • Weeks 1-2
Taste Bud Reset & Flavor Engineering
Drastic crash diets increase cortisol and ruin egg quality. We perform a gentle taste-bud reset across 5 flavor pillars without willpower depletion or extreme caloric starvation.
Clinical Focus: Dopamine balance & craving elimination.
Patient Feel: High compliance, zero hunger stress.
MOTIVATION SURPLUS
Phase 02 • Weeks 3-6
Frictionless Tracking & Macro Precision
Complex food logging leads to cognitive burnout. We implement intuitive visual portion rules and dedicated protein goals calibrated for follicle growth and uterine lining thickness.
Clinical Focus: Steady fat loss while protecting lean tissue.
Patient Feel: Effortless daily habits requiring <3 mins/day.
COGNITIVE EASE
Phase 03 • Weeks 7-8
Strategic Refeed & Metabolic Reset
Continuous caloric restriction slows T3 thyroid hormone and drops leptin. Mid-way through, we trigger a planned Diet Break to reignite metabolic speed prior to embryo transfer.
Clinical Focus: Endocrine recovery & thyroid stimulation.
Patient Feel: High energy and mood rebound.
HORMONAL SHIELD
Phase 04 • Weeks 9-12+
Clinical Clearance & Transfer Autonomy
Candidates reach target clinic BMI limits with sustained metabolic health. We transition candidates smoothly into pregnancy-safe nutrition fully approved by your medical team.
Clinical Focus: Clearance pass & optimal uterine environment.
Patient Feel: Total confidence walking into weigh-ins.
TRANSFER READY
System Feature
Maternal Love & Care Meal Matrix
Our proprietary 7-day nutritional framework categorizes fertility-dense foods (Choline, Folate, Zinc, Omega-3s) into seamless daily intake targets tailored for IVF outcomes.
Includes: LBS to KG converter & real-time daily protein tracker.
TURNKEY BLUEPRINT
Partner Competitive Advantage
WHY CLINICS & AGENCIES PARTNER WITH US
Provide a superior, compassionate care standard for your candidates while differentiating your brand from competing clinics and agencies.
1. A Powerful Unique Value Proposition (UVP)
While other clinics and agencies simply turn away high-BMI candidates with a harsh "Come back when you lose weight," your institution becomes the beacon of hope offering a structured, white-glove solution.
- Turn turn-aways into immediate warm partner enrollments
- Increase agency surrogate application conversion by up to 35%
- Stand out in patient acquisition marketing
2. Superior Clinical Conditions & Implantation
Crash dieting severely impairs uterine lining receptivity and elevates inflammatory markers. Our protocol lowers systemic inflammation while preserving metabolic rate.
- Reduced anesthesia risks during egg retrievals
- Lower risk of gestational diabetes and preeclampsia
- Higher first-time embryo transfer success rates
3. Zero Extra Burden On Your Clinical Staff
Nurses and clinical coordinators don't have the bandwidth to provide daily nutrition tracking or scale anxiety coaching. We manage 100% of candidate support and deliver weekly progress reports.
- Direct 24/7 WhatsApp candidate support handled by us
- Turnkey progress updates sent directly to your team
4. Compassionate Scale & Weigh-In Care
We shift candidate psychology away from guilt and shame toward empowerment. Candidates arrive at your clinic weigh-ins calm, compliant, and physically primed for clearance.
- Eliminates scale phobia & cancelled appointments
- Builds lifelong maternal health habits
Human-Centric B2B Integration
THE "LAST MILE" CANDIDATE ACCOUNTABILITY
We operate as a seamless extension of your clinical team, providing high-touch guidance until clearance.
Direct 24/7 Candidate Support
Candidates hold an open line to their dedicated coach. Whether navigating stress or grocery selections, questions are answered within hours.
Zero Staff Overhead
Weekly Clinic Progress Audits
We provide transparent weight and metabolic trajectory tracking so your clinical coordinators know exactly when to schedule the official weigh-in.
Predictable Clearance Timing
1-on-1 Video Coaching Calls
Weekly face-to-face video reviews adapt candidate meal structures around changing medication cycles and hormone suppression phases.
Medically Synchronized
Verified Partner Feedback
INDUSTRY ENDORSEMENT
Read how surrogacy agency founders and reproductive care directors value our metabolic precision.
Tonya C.
Tonya Canaday
Founder & CEO, Family Pathways Surrogacy
Surrogacy Partner
"What has impressed me most about Himanshu is not only his brilliance and depth of knowledge, but also the compassion and genuine passion he brings to his work. He understands that improving health is about so much more than reaching a number on a scale."
"His approach focuses on helping candidates develop realistic, sustainable habits. He approaches each person as an individual, encouraging progress in a way that feels empowering rather than judgmental."
"I am proud to have him as a trusted partner for our surrogacy agency."
Surrogacy Agency Partner FamilyPathways.com
Establish B2B Referral Pathway
AGENCY & CLINIC PARTNER INQUIRY
Submit your institutional details below. We set up turnkey candidate referral pathways within 24 hours.
1
Contact & Institutional Information
First Name
Last Name
Post / Role / Title
Institution Name
Work Email Address
Phone / Contact Number
2
Partner Model Context
Organization Type Fertility Clinic / IVF CenterGestational Surrogacy AgencyReproductive Endocrinology PracticeEgg Donation / Matching Agency
Enforced Candidate BMI Limit
3
Projected Earnings & Volume
Re-Evaluate Calculator
Calculated Potential Revenue Recoverable:
$936,000 / yr
Based on 6 candidates/mo at $18,000 avg fee
Re-Evaluate Gains
Estimated High-BMI Turn-Aways per Month: 1 - 5 Candidates / Month6 - 15 Candidates / Month15+ Candidates / Month
Key Partnership Goals & Notes
REQUEST B2B PARTNERSHIP BRIEF
🔒 100% Confidential B2B Inquiry • Response Within 24 Business Hours
The BabyReady Protocol B2B Alliance
Connecting fertility clinics & surrogacy agencies with medically synchronized metabolic optimization for high-BMI candidates.
© 2026 BabyReady Protocol. All Rights Reserved.
PARTNERSHIP INQUIRY RECEIVED
Thank you for reaching out. Our B2B partnership coordinator will contact your institution via Email / Phone within 24 hours with our partner brief.
Close Window
const GOOGLE_SCRIPT_URL = "https://script.google.com/macros/s/AKfycbxWjFtpCAEkqOMWg9vodhsO9OVFrh9OGi-i4gMXiOFUHAummwUK6y2QUnIWPDNbthzF/exec"; function scrollToCalculator() { document.getElementById('calculator').scrollIntoView({ behavior: 'smooth' }); } function scrollToForm() { document.getElementById('application').scrollIntoView({ behavior: 'smooth' }); } function scrollPhaseCarousel(direction) { const container = document.getElementById('phaseCarousel'); const scrollAmount = container.clientWidth * 0.75; container.scrollBy({ left: direction * scrollAmount, behavior: 'smooth' }); } /* ------------------------------------------------------------- * POTENTIAL EARNING GAINS CALCULATOR LOGIC (2 TABS) * ------------------------------------------------------------- */ let currentCalcMode = 'clinic'; let calculatedAnnualGainString = "$936,000 / yr"; function setCalcMode(mode) { currentCalcMode = mode; const tabClinic = document.getElementById('calcTabClinic'); const tabAgency = document.getElementById('calcTabAgency'); const viewClinic = document.getElementById('clinicCalcView'); const viewAgency = document.getElementById('agencyCalcView'); if (mode === 'clinic') { tabClinic.classList.add('active'); tabClinic.classList.remove('text-stone-700'); tabAgency.classList.remove('active'); tabAgency.classList.add('text-stone-700'); viewClinic.classList.remove('hidden'); viewAgency.classList.add('hidden'); } else { tabAgency.classList.add('active'); tabAgency.classList.remove('text-stone-700'); tabClinic.classList.remove('active'); tabClinic.classList.add('text-stone-700'); viewAgency.classList.remove('hidden'); viewClinic.classList.add('hidden'); } updateGainsCalculator(); } const formatCurrency = (val) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }).format(val); }; function updateGainsCalculator() { if (currentCalcMode === 'clinic') { const turnaways = parseInt(document.getElementById('clinicTurnawayInput').value); const revenuePerCycle = parseInt(document.getElementById('clinicRevenueInput').value); document.getElementById('clinicTurnawayDisplay').textContent = `${turnaways} Patients / Mo`; document.getElementById('clinicRevenueDisplay').textContent = formatCurrency(revenuePerCycle); const totalAnnualTurnaways = turnaways * 12; const recoveredCandidates = Math.round(totalAnnualTurnaways * 0.72); const addedAnnualRevenue = recoveredCandidates * revenuePerCycle; calculatedAnnualGainString = `${formatCurrency(addedAnnualRevenue)} / yr`; document.getElementById('calcMetric1Title').textContent = 'RECOVERED IVF PATIENTS / YR'; document.getElementById('calcMetric1Val').textContent = `${recoveredCandidates} Patients`; document.getElementById('calcMetric2Val').textContent = calculatedAnnualGainString; // Sync with form earnings display if (document.getElementById('formEarningsDisplay')) { document.getElementById('formEarningsDisplay').textContent = calculatedAnnualGainString; document.getElementById('formEarningsDetail').textContent = `Based on ${turnaways} patients/mo @ ${formatCurrency(revenuePerCycle)} per IVF cycle`; } } else { const turnaways = parseInt(document.getElementById('agencyTurnawayInput').value); const agencyFee = parseInt(document.getElementById('agencyFeeInput').value); document.getElementById('agencyTurnawayDisplay').textContent = `${turnaways} Applicants / Mo`; document.getElementById('agencyFeeDisplay').textContent = formatCurrency(agencyFee); const totalAnnualApplicants = turnaways * 12; const recoveredSurrogates = Math.round(totalAnnualApplicants * 0.68); const addedAnnualRevenue = recoveredSurrogates * agencyFee; calculatedAnnualGainString = `${formatCurrency(addedAnnualRevenue)} / yr`; document.getElementById('calcMetric1Title').textContent = 'QUALIFIED SURROGATES / YR'; document.getElementById('calcMetric1Val').textContent = `${recoveredSurrogates} Surrogates`; document.getElementById('calcMetric2Val').textContent = calculatedAnnualGainString; // Sync with form earnings display if (document.getElementById('formEarningsDisplay')) { document.getElementById('formEarningsDisplay').textContent = calculatedAnnualGainString; document.getElementById('formEarningsDetail').textContent = `Based on ${turnaways} surrogate applicants/mo @ ${formatCurrency(agencyFee)} placement fee`; } } } // Add event listeners to sliders ['clinicTurnawayInput', 'clinicRevenueInput', 'agencyTurnawayInput', 'agencyFeeInput'].forEach(id => { document.getElementById(id).addEventListener('input', updateGainsCalculator); }); updateGainsCalculator(); // Scroll Reveal Observer const revealElements = document.querySelectorAll('.reveal-on-scroll'); const revealObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { entry.target.classList.add('active'); } }); }, { threshold: 0.1 }); revealElements.forEach(el => revealObserver.observe(el)); // B2B Partner Form Submit Handler async function handlePartnerSubmit(e) { e.preventDefault(); const submitBtn = document.getElementById('submitBtn'); const submitBtnText = document.getElementById('submitBtnText'); const submitBtnIcon = document.getElementById('submitBtnIcon'); submitBtn.disabled = true; submitBtnText.textContent = "SENDING INQUIRY..."; submitBtnIcon.className = "fa-solid fa-spinner animate-spin text-xs"; const payload = { firstName: document.getElementById('firstNameInput').value, lastName: document.getElementById('lastNameInput').value, postTitle: document.getElementById('postInput').value, institutionName: document.getElementById('institutionInput').value, email: document.getElementById('emailInput').value, phone: document.getElementById('phoneInput').value, orgType: document.getElementById('orgTypeInput').value, cutoffThreshold: document.getElementById('cutoffInput').value, projectedEarningPotential: calculatedAnnualGainString, estimatedVolume: document.getElementById('volumeInput').value, notes: document.getElementById('notesInput').value, calcMode: currentCalcMode }; try { await fetch(GOOGLE_SCRIPT_URL, { method: 'POST', headers: { 'Content-Type': 'text/plain;charset=utf-8' }, body: JSON.stringify(payload) }); document.getElementById('successModal').classList.remove('hidden'); document.getElementById('partnerForm').reset(); } catch (err) { console.error("Submission Error:", err); alert("There was an issue submitting your inquiry. Please try again or email us directly."); } finally { submitBtn.disabled = false; submitBtnText.textContent = "REQUEST B2B PARTNERSHIP BRIEF"; submitBtnIcon.className = "fa-solid fa-paper-plane text-xs group-hover:translate-x-1 group-hover:-translate-y-1 transition-transform inline-block"; } } function closeModal() { document.getElementById('successModal').classList.add('hidden'); } /* ------------------------------------------------------------- * ENHANCED 3D FROSTED GLASS FLOATING HEART ORBS CANVAS ANIMATION * ------------------------------------------------------------- */ const canvas = document.getElementById('heartOrbCanvas'); const ctx = canvas.getContext('2d'); let width, height; let lastScrollY = window.scrollY; let scrollSpeed = 0; let targetScrollSpeed = 0; function resizeCanvas() { width = canvas.width = window.innerWidth; height = canvas.height = window.innerHeight; } window.addEventListener('resize', resizeCanvas); resizeCanvas(); window.addEventListener('scroll', () => { const currentScrollY = window.scrollY; targetScrollSpeed = currentScrollY - lastScrollY; lastScrollY = currentScrollY; }, { passive: true }); // Helper function to draw a rich 3D frosted glass heart function draw3DFrostedHeart(ctx, x, y, size, colorHex, alpha, angle) { ctx.save(); ctx.translate(x, y); ctx.rotate(angle); ctx.scale(size / 30, size / 30); // Path for heart geometry const drawPath = () => { ctx.beginPath(); ctx.moveTo(0, 0); ctx.bezierCurveTo(-16, -16, -26, 6, 0, 24); ctx.bezierCurveTo(26, 6, 16, -16, 0, 0); ctx.closePath(); }; // 1. Soft Ambient Depth Glow & Shadow ctx.shadowColor = 'rgba(226, 109, 130, 0.45)'; ctx.shadowBlur = 24; ctx.shadowOffsetY = 8; // 2. Volumetric 3D Glass Gradient Fill const grad = ctx.createRadialGradient(-4, -6, 2, 0, 5, 26); grad.addColorStop(0, 'rgba(255, 255, 255, 0.85)'); // Top glossy reflection grad.addColorStop(0.3, colorHex); grad.addColorStop(0.85, 'rgba(158, 45, 67, 0.85)'); // Deep crimson glass core grad.addColorStop(1, 'rgba(92, 20, 34, 0.95)'); ctx.fillStyle = grad; ctx.globalAlpha = alpha; drawPath(); ctx.fill(); // 3. Frosted Edge Highlight ctx.shadowColor = 'transparent'; ctx.lineWidth = 1.2; const rimGrad = ctx.createLinearGradient(-15, -15, 15, 25); rimGrad.addColorStop(0, 'rgba(255, 255, 255, 0.9)'); rimGrad.addColorStop(0.5, 'rgba(244, 184, 193, 0.3)'); rimGrad.addColorStop(1, 'rgba(255, 255, 255, 0.6)'); ctx.strokeStyle = rimGrad; drawPath(); ctx.stroke(); // 4. Glossy Specular Reflection Patch ctx.beginPath(); ctx.ellipse(-7, -6, 5, 2.5, -Math.PI / 4, 0, Math.PI * 2); ctx.fillStyle = 'rgba(255, 255, 255, 0.75)'; ctx.globalAlpha = alpha * 1.2; ctx.fill(); ctx.restore(); } class FloatingHeartOrb { constructor() { this.reset(); } reset() { this.x = Math.random() * width; this.y = Math.random() * height; this.size = Math.random() * 45 + 24; this.baseVx = (Math.random() - 0.5) * 0.35; this.baseVy = (Math.random() - 0.5) * 0.35; this.vx = this.baseVx; this.vy = this.baseVy; this.alpha = Math.random() * 0.22 + 0.1; this.parallaxFactor = Math.random() * 0.5 + 0.2; this.angle = (Math.random() - 0.5) * 0.4; this.rotSpeed = (Math.random() - 0.5) * 0.003; const colors = [ 'rgba(226, 109, 130, 0.8)', // Rose gold primary 'rgba(200, 75, 98, 0.85)', // Deep rose 'rgba(158, 45, 67, 0.85)', // Crimson heart 'rgba(244, 184, 193, 0.75)' // Soft pink accent ]; this.color = colors[Math.floor(Math.random() * colors.length)]; } update(scrollVel) { const scrollEffect = scrollVel * this.parallaxFactor * 0.12; this.x += this.vx; this.y -= (this.vy + scrollEffect); this.angle += this.rotSpeed; if (this.y < -80) this.y = height + 80; if (this.y > height + 80) this.y = -80; if (this.x < -80) this.x = width + 80; if (this.x > width + 80) this.x = -80; } draw() { draw3DFrostedHeart(ctx, this.x, this.y, this.size, this.color, this.alpha, this.angle); } } // Spawn 14 Floating 3D Heart Orbs const heartOrbs = Array.from({ length: 14 }, () => new FloatingHeartOrb()); function animateHeartOrbs() { ctx.clearRect(0, 0, width, height); scrollSpeed += (targetScrollSpeed - scrollSpeed) * 0.1; targetScrollSpeed *= 0.88; heartOrbs.forEach(orb => { orb.update(scrollSpeed); orb.draw(); }); requestAnimationFrame(animateHeartOrbs); } animateHeartOrbs();