@import "https://fonts.googleapis.com/css2?family=Dancing+Script:wght@500;700&family=Great+Vibes&family=Poppins:wght@300;400;600&display=swap";
*{box-sizing:border-box;margin:0;padding:0}:root{--bg-deep:#07020f;--violet:#7b2ff7;--rose:#ff3fa4;--pink-soft:#ff8ad6;--neon:#ff4f9a;--neon2:#b14cff;--glow:#ff4f9ad9;--glow2:#b14cffa6;--pulse-duration:2.4s;--pulse-delay:1.4s}html,body{height:100%}body{background:var(--bg-deep);color:#fff;-webkit-font-smoothing:antialiased;font-family:Poppins,system-ui,-apple-system,sans-serif;overflow-x:hidden}body.cursor-fx-active{cursor:none}@media (pointer:coarse){body{cursor:auto}}.scene{isolation:isolate;justify-content:center;align-items:center;min-height:100svh;padding:clamp(24px,6vh,64px) 20px;display:flex;position:relative}.aurora{z-index:0;pointer-events:none;filter:saturate(1.15);background:radial-gradient(60% 50% at 20% 18%,#7b2ff78c,#0000 60%),radial-gradient(55% 45% at 82% 22%,#ff3fa473,#0000 60%),radial-gradient(45% 40% at 75% 80%,#b14cff66,#0000 60%),radial-gradient(70% 60% at 50% 95%,#1b1452d9,#0000 65%),linear-gradient(160deg,#0a0320 0%,#14082e 45%,#1b1452 100%);animation:16s ease-in-out infinite auroraShift;position:fixed;inset:0}.hearts{z-index:1;pointer-events:none;transform:translate3d(calc(var(--mx,0) * 8px), calc(var(--my,0) * 8px), 0);transition:transform .5s cubic-bezier(.22,.61,.36,1);position:fixed;inset:0}.heart-wrap{transform:translate3d(var(--rx,0px), var(--ry,0px), 0) rotate(var(--rr,0deg));will-change:transform;transition:filter .25s;position:absolute;bottom:-8vh}.heart-wrap.is-repelled{filter:brightness(1.3)}.heart{color:var(--rose);text-shadow:0 0 6px var(--glow), 0 0 14px var(--glow), 0 0 24px var(--glow2);will-change:transform, opacity;-webkit-user-select:none;user-select:none;line-height:1;animation:14s linear infinite floatUp;display:block}.heart.alt{color:var(--violet);text-shadow:0 0 6px var(--glow2), 0 0 16px var(--glow2), 0 0 26px var(--glow)}.particles{z-index:2;pointer-events:none;transform:translate3d(calc(var(--mx,0) * -12px), calc(var(--my,0) * -12px), 0);transition:transform .5s cubic-bezier(.22,.61,.36,1);position:fixed;inset:0}.particle-wrap{transform:translate3d(var(--px,0px), var(--py,0px), 0);will-change:transform;position:absolute}.particle{width:var(--s);height:var(--s);box-shadow:0 0 8px #ffffffd9, 0 0 14px var(--glow);will-change:opacity, transform;background:radial-gradient(circle,#fff 0%,#ffffffa6 40%,#0000 72%);border-radius:50%;animation:3s ease-in-out infinite twinkle;display:block}.cursor-glow{pointer-events:none;z-index:3;mix-blend-mode:screen;filter:blur(6px);opacity:0;will-change:transform, opacity;background:radial-gradient(circle,#ff4f9a59 0%,#b14cff38 38%,#0000 70%);border-radius:50%;width:280px;height:280px;transition:opacity .45s;position:fixed;top:0;left:0;transform:translate(-200px,-200px)translate(-50%,-50%)}.cursor-glow.is-active{opacity:1}.cursor-dot{pointer-events:none;z-index:7;width:10px;height:10px;box-shadow:0 0 8px #fff, 0 0 16px var(--glow), 0 0 28px var(--glow2);opacity:0;will-change:transform;background:#fff;border-radius:50%;transition:opacity .3s;position:fixed;top:0;left:0;transform:translate(-200px,-200px)translate(-50%,-50%)}.cursor-dot.is-active{opacity:1}.cursor-trail{z-index:6;pointer-events:none;position:fixed;inset:0}.trail{pointer-events:none;will-change:transform, opacity;animation:.95s ease-out forwards trailFade;position:fixed}.trail-spark{background:radial-gradient(circle, #fff 0%, var(--pink-soft) 45%, transparent 72%);width:7px;height:7px;box-shadow:0 0 8px #fff, 0 0 14px var(--glow);border-radius:50%}.trail-heart{color:var(--neon);text-shadow:0 0 8px var(--glow), 0 0 16px var(--glow2);font-size:15px;line-height:1}.cursor-burst{z-index:6;pointer-events:none;position:fixed;inset:0}.burst-heart{pointer-events:none;color:var(--rose);text-shadow:0 0 8px var(--glow), 0 0 16px var(--glow), 0 0 28px var(--glow2);will-change:transform, opacity;line-height:1;animation:1.1s ease-out forwards burstFade;position:fixed}.burst-heart.alt{color:var(--violet);text-shadow:0 0 8px var(--glow2), 0 0 18px var(--glow2), 0 0 30px var(--glow)}.burst-shockwave{pointer-events:none;width:40px;height:40px;box-shadow:0 0 20px var(--glow), 0 0 40px var(--glow2);will-change:transform, opacity;border:2px solid #ff4f9ab3;border-radius:50%;animation:.6s ease-out forwards shockwaveExpand;position:fixed;transform:translate(-50%,-50%)scale(0)}.vignette{z-index:4;pointer-events:none;background:radial-gradient(120% 120%,#0000 52%,#05020f99 100%);position:fixed;inset:0}.hero{z-index:5;text-align:center;flex-direction:column;align-items:center;animation:1.2s both heroFade;display:flex;position:relative}.heart-stage{aspect-ratio:1;cursor:pointer;width:clamp(150px,34vw,280px);transform:translate3d(calc(var(--mx,0) * 18px), calc(var(--my,0) * 18px), 0);place-items:center;margin-bottom:clamp(18px,4vw,40px);transition:transform .35s cubic-bezier(.22,.61,.36,1);display:grid;position:relative}.heart-stage--pop{animation:.5s cubic-bezier(.2,.8,.2,1) heartStagePop}.heart-stage--pop .halo{animation:.5s ease-out haloFlash}.halo{filter:blur(16px);z-index:-1;background:radial-gradient(circle,#ff4f9a8c 0%,#b14cff4d 40%,#0000 72%);border-radius:50%;animation:3.4s ease-in-out infinite haloPulse;position:absolute;inset:-10%}.heart-svg{width:80%;height:auto;filter:drop-shadow(0 0 16px var(--glow)) drop-shadow(0 0 38px var(--glow2));will-change:transform, filter}.scene--revealed .heart-svg{animation:heartIn 1s cubic-bezier(.2, .8, .2, 1) .4s both, heartPulse var(--pulse-duration) ease-in-out var(--pulse-delay) infinite}.scene--revealed .orbit-spark{animation-name:orbit,fadeIn;animation-timing-function:linear,ease;animation-iteration-count:infinite,1;animation-fill-mode:none,both}.orbit-spark{width:9px;height:9px;box-shadow:0 0 8px #fff, 0 0 16px var(--glow);opacity:0;background:#fff;border-radius:50%;margin:-4.5px 0 0 -4.5px;position:absolute;top:50%;left:50%}.s1{--r:clamp(86px, 17vw, 140px);animation-duration:9s,.9s;animation-delay:0s,1.4s}.s2{--r:clamp(98px, 19vw, 156px);animation-duration:13s,.9s;animation-delay:-3s,1.6s}.s3{--r:clamp(80px, 16vw, 130px);animation-duration:11s,.9s;animation-delay:-6s,1.8s}.s4{--r:clamp(106px, 20vw, 166px);animation-duration:16s,.9s;animation-delay:-9s,2s}.days-block{opacity:0;flex-direction:column;align-items:center;margin-bottom:clamp(12px,2.5vw,22px);transition:opacity .6s,transform .6s;display:flex;position:relative;transform:translateY(20px)}.days-block.is-visible{opacity:1;transform:translateY(0)}.days-block-inner{flex-direction:column;align-items:center;gap:2px;display:flex}.days-number{font-variant-numeric:tabular-nums;background:linear-gradient(135deg,#fff 0%,#ff9ad5 40%,#ff4f9a 70%,#b14cff 100%);color:#0000;filter:drop-shadow(0 0 12px var(--glow)) drop-shadow(0 0 28px var(--glow2));-webkit-background-clip:text;background-clip:text;font-family:Poppins,system-ui,sans-serif;font-size:clamp(52px,14vw,108px);font-weight:600;line-height:1}.days-block.is-visible .days-number{animation:.7s cubic-bezier(.2,.8,.2,1) both daysNumEntry}.days-number.tick{animation:.1s ease-out daysTick}.days-block.is-done .days-number{animation:daysNumPop .55s cubic-bezier(.2, .8, .2, 1) both, heartPulse var(--pulse-duration) ease-in-out calc(.55s - var(--pulse-sync,0s)) infinite}.days-label{letter-spacing:.38em;text-transform:uppercase;color:#ffc8e6e0;text-shadow:0 0 10px var(--glow);opacity:0;padding-left:.38em;font-size:clamp(11px,1.8vw,15px);font-weight:300}.days-block.is-visible .days-label{animation:.7s .2s both revealUp}.days-spark{width:6px;height:6px;box-shadow:0 0 8px #fff, 0 0 14px var(--glow);pointer-events:none;background:#fff;border-radius:50%;animation:.9s ease-out forwards daysSpark;position:absolute}.days-spark.s1{animation-delay:0s;top:18%;left:12%}.days-spark.s2{animation-delay:80ms;top:8%;right:10%}.days-spark.s3{animation-delay:.14s;bottom:22%;left:22%}.eyebrow{letter-spacing:.42em;text-transform:uppercase;color:#ffc8e6e6;text-shadow:0 0 10px var(--glow);opacity:0;margin-bottom:clamp(10px,2vw,18px);padding-left:.42em;font-size:clamp(11px,1.6vw,15px);font-weight:300}.scene--revealed .eyebrow{animation:.9s .4s both revealUp}.title{flex-direction:column;font-family:Dancing Script,cursive;font-size:clamp(36px,7.4vw,82px);font-weight:700;line-height:1.06;display:flex}.title-line{opacity:0;color:#fff;text-shadow:0 0 12px var(--glow), 0 0 26px var(--glow2)}.scene--revealed .title-line{animation:1s .8s both revealUp}.finale{flex-wrap:wrap;justify-content:center;align-items:baseline;gap:.02em;margin-top:clamp(14px,3vw,30px);font-family:Great Vibes,cursive;font-size:clamp(58px,13vw,152px);font-weight:400;line-height:1;display:flex}.finale-char{color:#fff;opacity:0;text-shadow:0 0 8px #fff, 0 0 22px var(--neon), 0 0 44px var(--neon), 0 0 80px var(--neon2);display:inline-block}.scene--revealed .finale-char{animation:.7s cubic-bezier(.2,.8,.2,1) both revealUp,2.6s ease-in-out 1.2s infinite neonGlow}.surprise-gate:not(.scene--revealed) .hero{opacity:0;visibility:hidden}.surprise-overlay{z-index:20;cursor:pointer;background:#000;place-items:center;transition:opacity 1.2s,visibility 1.2s;display:grid;position:fixed;inset:0}.surprise-overlay.is-hidden{opacity:0;visibility:hidden;pointer-events:none}.surprise-hint{letter-spacing:.35em;text-transform:uppercase;color:#ffb4dc99;text-shadow:0 0 12px var(--glow);padding-left:.35em;font-size:clamp(11px,1.8vw,14px);font-weight:300;animation:2.4s ease-in-out infinite hintPulse}@keyframes auroraShift{0%,to{transform:scale(1)translate(0,0)}50%{transform:scale(1.08)translateY(-2%)}}@keyframes twinkle{0%,to{opacity:.12;transform:scale(.6)}50%{opacity:1;transform:scale(1.15)}}@keyframes floatUp{0%{opacity:0;transform:translateY(0)translate(0)rotate(-6deg)}8%{opacity:var(--o,.8)}92%{opacity:var(--o,.8)}to{transform:translateY(-118vh) translateX(var(--sway,0)) rotate(8deg);opacity:0}}@keyframes heroFade{0%{opacity:0}to{opacity:1}}@keyframes heartIn{0%{opacity:0;transform:scale(.4)rotate(-8deg)}70%{opacity:1;transform:scale(1.08)rotate(2deg)}to{opacity:1;transform:scale(1)rotate(0)}}@keyframes heartPulse{0%,to{filter:drop-shadow(0 0 16px var(--glow)) drop-shadow(0 0 38px var(--glow2));transform:scale(1)}50%{filter:drop-shadow(0 0 26px var(--glow)) drop-shadow(0 0 68px var(--glow2));transform:scale(1.06)}}@keyframes haloPulse{0%,to{opacity:.5;transform:scale(1)}50%{opacity:.85;transform:scale(1.12)}}@keyframes orbit{0%{transform:rotate(0deg) translateX(var(--r)) rotate(0deg)}to{transform:rotate(360deg) translateX(var(--r)) rotate(-360deg)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes revealUp{0%{opacity:0;filter:blur(8px);transform:translateY(30px)}to{opacity:1;filter:blur();transform:translateY(0)}}@keyframes neonGlow{0%,to{text-shadow:0 0 8px #fff, 0 0 22px var(--neon), 0 0 44px var(--neon), 0 0 80px var(--neon2)}50%{text-shadow:0 0 14px #fff, 0 0 34px var(--neon), 0 0 70px var(--neon), 0 0 130px var(--neon2)}}@keyframes trailFade{0%{opacity:0;transform:translate(-50%, -50%) scale(calc(var(--sc,1) * .4))}18%{opacity:1}to{opacity:0;transform:translate(calc(-50% + var(--dx,0px)), calc(-50% + var(--dy,-22px))) scale(var(--sc,1))}}@keyframes burstFade{0%{opacity:0;transform:translate(-50%,-50%)scale(.3)}15%{opacity:1}to{opacity:0;transform:translate(calc(-50% + var(--bx,0px)), calc(-50% + var(--by-grav,var(--by,0px)))) scale(1)}}@keyframes shockwaveExpand{0%{opacity:.9;transform:translate(-50%,-50%)scale(0)}to{opacity:0;transform:translate(-50%,-50%)scale(2.5)}}@keyframes heartStagePop{0%{transform:translate3d(calc(var(--mx,0) * 18px), calc(var(--my,0) * 18px), 0) scale(1)}40%{transform:translate3d(calc(var(--mx,0) * 18px), calc(var(--my,0) * 18px), 0) scale(1.15)}to{transform:translate3d(calc(var(--mx,0) * 18px), calc(var(--my,0) * 18px), 0) scale(1)}}@keyframes haloFlash{0%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.35)}to{opacity:.5;transform:scale(1)}}@keyframes touchHeartPulse{0%,to{transform:scale(1)}50%{transform:scale(1.12)}}@keyframes hintPulse{0%,to{opacity:.45}50%{opacity:.9}}@keyframes daysNumEntry{0%{opacity:0;filter:blur(6px);transform:scale(.6)translateY(16px)}to{opacity:1;filter:blur();transform:scale(1)translateY(0)}}@keyframes daysTick{0%{transform:scale(1.08)}to{transform:scale(1)}}@keyframes daysNumPop{0%{transform:scale(1)}45%{transform:scale(1.14)}to{transform:scale(1)}}@keyframes daysSpark{0%{opacity:0;transform:scale(0)}30%{opacity:1;transform:scale(1.2)}to{opacity:0;transform:scale(0)translateY(-18px)}}@media (max-width:420px){.eyebrow{letter-spacing:.3em;padding-left:.3em}}@media (max-height:600px){.heart-stage{width:clamp(110px,22vh,180px);margin-bottom:14px}.title{font-size:clamp(28px,6.4vh,52px)}.finale{font-size:clamp(44px,11vh,92px)}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}.eyebrow,.title-line,.finale-char,.days-block,.heart-svg,.halo,.hero{opacity:1!important}.cursor-glow,.cursor-trail,.cursor-dot,.cursor-burst,.touch-glow,.touch-heart,.touch-trail,.surprise-overlay{display:none!important}.scene .hero,.scene .heart-stage{opacity:1!important;visibility:visible!important}body{cursor:auto}}@media (pointer:coarse){.cursor-glow,.cursor-trail,.cursor-dot{display:none!important}body{cursor:auto}}.touch-glow,.touch-heart,.touch-trail{display:none}@media (pointer:coarse){.touch-trail{z-index:6;pointer-events:none;display:block;position:fixed;inset:0}.touch-glow{pointer-events:none;z-index:3;mix-blend-mode:screen;filter:blur(6px);opacity:0;will-change:transform, opacity;background:radial-gradient(circle,#ff4f9a4d 0%,#b14cff2e 38%,#0000 70%);border-radius:50%;width:220px;height:220px;transition:opacity .35s;display:block;position:fixed;top:0;left:0;transform:translate(-200px,-200px)translate(-50%,-50%)}.touch-glow.is-active{opacity:1}.touch-heart{pointer-events:none;z-index:7;opacity:0;will-change:transform;line-height:1;transition:opacity .2s;display:block;position:fixed;top:0;left:0;transform:translate(-200px,-200px)translate(-50%,-50%)}.touch-heart.is-active{opacity:1}.touch-heart-icon{color:var(--neon);text-shadow:0 0 10px #fff, 0 0 18px var(--glow), 0 0 32px var(--glow2);animation:touchHeartPulse var(--pulse-duration) ease-in-out infinite;font-size:28px;display:block}}
