:root{--text:#4a3a7a;--text-h:#3a2668;--bg:#ffe3ee;--bg-2:#ffd0e3;--border:#3a266826;--code-bg:#3a26680f;--accent:#7a2f8a;--accent-bg:#7a2f8a1a;--accent-border:#7a2f8a80;--social-bg:#7a2f8a0f;--shadow:#3a266826 0 10px 15px -3px, #3a26681a 0 4px 6px -2px;--sans:"Quicksand", system-ui, "Segoe UI", Roboto, sans-serif;--heading:"Baloo 2", system-ui, "Segoe UI", Roboto, sans-serif;--hand:"Caveat", "Segoe Script", cursive;--mono:ui-monospace, Consolas, monospace;font:18px/145% var(--sans);letter-spacing:.18px;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;color:var(--text);background:radial-gradient(1200px 800px at 50% -10%, var(--bg-2), transparent 70%), linear-gradient(180deg, var(--bg) 0%, #ffcfe1 100%);font-synthesis:none;text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-attachment:fixed}@media (width<=1024px){:root{font-size:16px}}#root{text-align:center;box-sizing:border-box;flex-direction:column;width:100%;min-height:100svh;margin:0 auto;display:flex}body{margin:0}h1,h2{font-family:var(--heading);color:var(--text-h);font-weight:500}h1{letter-spacing:-1.68px;margin:32px 0;font-size:56px}@media (width<=1024px){h1{margin:20px 0;font-size:36px}}h2{letter-spacing:-.24px;margin:0 0 8px;font-size:24px;line-height:118%}@media (width<=1024px){h2{font-size:20px}}p{margin:0}code,.counter{font-family:var(--mono);color:var(--text-h);border-radius:4px;display:inline-flex}code{background:var(--code-bg);padding:4px 8px;font-size:15px;line-height:135%}.page{flex:1;padding-bottom:40px;position:relative;overflow-x:hidden}.web-hangers{z-index:5;pointer-events:none;height:0;position:absolute;top:0;left:0;right:0}.hanger{transform-origin:top;animation:hanger-drop 1s cubic-bezier(.34, 1.4, .5, 1) var(--delay) both, hanger-sway 4s ease-in-out calc(var(--delay) + 1s) infinite;flex-direction:column;align-items:center;display:flex;position:absolute;top:0;transform:translate(-50%)}@keyframes hanger-drop{0%{transform:translateX(-50%) translateY(calc(-1 * (var(--drop) + 160px)));opacity:0}to{opacity:1;transform:translate(-50%)translateY(0)}}@keyframes hanger-sway{0%,to{rotate:calc(var(--tilt) - 3deg)}50%{rotate:calc(var(--tilt) + 3deg)}}.thread{background:linear-gradient(#7a2f8a59,#7a2f8a8c);width:2px;position:relative}.hanger-frame{aspect-ratio:4/5;width:96px;box-shadow:var(--shadow);border-radius:8px;place-items:center;display:grid;position:relative;overflow:hidden}.hanger-frame img{object-fit:cover;z-index:1;border-radius:2px;width:100%;height:100%;position:relative}.hanger-placeholder{opacity:.6;font-size:22px;position:absolute}.hanger-frame:not(.is-empty) .hanger-placeholder{display:none}@media (width<=720px){.hanger-frame{width:68px}}@media (prefers-reduced-motion:reduce){.hanger{animation:hanger-drop .6s ease var(--delay) both}}.intro{z-index:50;background:radial-gradient(1200px 800px at 50% 40%, var(--bg-2), transparent 75%), linear-gradient(180deg, var(--bg) 0%, #ffcfe1 100%);justify-content:center;align-items:center;padding:24px;animation:.6s both intro-in;display:flex;position:fixed;inset:0;overflow:hidden}.intro-leaving{animation:1s cubic-bezier(.4,0,.2,1) forwards intro-out}@keyframes intro-in{0%{opacity:0}to{opacity:1}}@keyframes intro-out{0%{opacity:1;filter:blur();transform:scale(1)}to{opacity:0;filter:blur(6px);visibility:hidden;transform:scale(1.1)}}.intro-glow{filter:blur(10px);background:radial-gradient(circle,#ff78b359,#ff78b300 70%);border-radius:50%;width:min(70vw,620px);height:min(70vw,620px);animation:3.5s ease-in-out infinite glow-pulse;position:absolute}@keyframes glow-pulse{0%,to{opacity:.7;transform:scale(.9)}50%{opacity:1;transform:scale(1.15)}}.intro-start{font-family:var(--sans);letter-spacing:2px;cursor:pointer;color:#ff6b81;text-shadow:0 0 6px #ff6b8199,0 2px 3px #c7101f59;background:0 0;border:2px solid #ff6b81;border-radius:16px;padding:18px 40px;font-size:clamp(22px,5vw,30px);font-weight:800;transition:transform .15s,box-shadow .2s;display:inline-block;position:relative;box-shadow:0 0 10px #ff6b8166,inset 0 0 8px #ff6b8126}.intro-start:before,.intro-start:after{content:"<3";color:#ff6b81;opacity:0;pointer-events:none;z-index:0;font-size:16px;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.intro-start:before{animation:2s linear infinite float-heart-1}.intro-start:after{font-size:22px;animation:2s linear 1s infinite float-heart-2}.intro-start:hover{transform:translateY(-2px)scale(1.05);box-shadow:0 0 18px #ff6b8199,inset 0 0 12px #ff6b8140}.intro-start:active{transform:translateY(2px)scale(.98)}.heart-fx{position:relative}.heart-fx:before,.heart-fx:after{content:"<3";color:#ff6b81;-webkit-text-fill-color:#ff6b81;opacity:0;pointer-events:none;z-index:2;font-size:50px;position:absolute;top:50%;left:40%;transform:translate(-50%,-50%)}.heart-fx:before{animation:2s linear infinite float-heart-1}.heart-fx:after{font-size:22px;animation:2s linear 1s infinite float-heart-2}@keyframes rainbow-scroll{0%{background-position:0%}to{background-position:200%}}@keyframes float-heart-1{0%{opacity:0;transform:translate(-50%,-50%)scale(.5)}20%{opacity:1}to{opacity:0;transform:translate(-80%,-250%)scale(1.2)rotate(-15deg)}}@keyframes float-heart-2{0%{opacity:0;transform:translate(-50%,-50%)scale(.5)}20%{opacity:1}to{opacity:0;transform:translate(20%,-220%)scale(1)rotate(15deg)}}.intro-text{font-family:var(--heading);color:var(--text-h);text-align:center;text-shadow:0 6px 22px #ff65a34d;min-height:1.5em;font-size:clamp(30px,7vw,60px);font-weight:700;line-height:1.25;position:relative}.pass-card{z-index:1;box-sizing:border-box;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#ffffffb3;border:1px solid #fffffff2;border-radius:26px;flex-direction:column;align-items:center;gap:12px;width:min(92vw,380px);padding:32px 26px 24px;animation:.5s cubic-bezier(.2,.9,.25,1.25) both pass-in;display:flex;position:relative;box-shadow:0 26px 56px -22px #c7101f66,inset 0 1px #ffffffe6}@keyframes pass-in{0%{opacity:0;transform:translateY(26px)scale(.94)}to{opacity:1;transform:translateY(0)scale(1)}}.pass-input{box-sizing:border-box;width:100%;font-family:var(--sans);letter-spacing:1px;text-align:center;color:var(--text-h);background:#ffffffe6;border:2px solid #ff6b8159;border-radius:14px;outline:none;padding:13px 16px;font-size:17px;font-weight:600;transition:border-color .2s,box-shadow .2s}.pass-input::placeholder{color:#7a2f8a66;letter-spacing:.5px;font-weight:500}.pass-input:focus{border-color:#ff6b81;box-shadow:0 0 0 4px #ff6b812e}.pass-btn{width:100%;font-family:var(--sans);letter-spacing:2px;color:#fff;cursor:pointer;background:linear-gradient(135deg,#ff6b81 0%,#ff2e86 100%);border:none;border-radius:14px;margin-top:4px;padding:14px 20px;font-size:16px;font-weight:800;transition:transform .15s,filter .2s,box-shadow .2s;box-shadow:0 12px 24px -10px #ff2e86bf}.pass-btn:hover{filter:brightness(1.07);box-shadow:0 16px 28px -10px #ff2e86d9}.pass-btn:active{transform:translateY(1px)scale(.99)}.pass-error{min-height:18px;font-family:var(--sans);color:#d3204a;opacity:0;font-size:13px;font-weight:600;transition:opacity .2s}.pass-error.is-visible{opacity:1}.pass-wrong{border-color:#d3204a80;animation:.5s cubic-bezier(.36,.07,.19,.97) both pass-shake}@keyframes pass-shake{10%,90%{transform:translate(-3px)}20%,80%{transform:translate(4px)}30%,50%,70%{transform:translate(-7px)}40%,60%{transform:translate(7px)}}.line-in{animation:.6s cubic-bezier(.2,.8,.2,1) both line-in}@keyframes line-in{0%{opacity:0;letter-spacing:2px;transform:translateY(18px)}to{opacity:1;letter-spacing:normal;transform:translateY(0)}}.intro-final{background:linear-gradient(100deg,#ff3d8b 0%,#ff1e79 20%,#ff5fa8 40%,#ff96c9 55%,#ff2e86 75%,#ff3d8b 100%) 0 0/250%;-webkit-text-fill-color:transparent;color:#0000;text-shadow:none;filter:drop-shadow(0 4px 14px #ff1e7973);-webkit-background-clip:text;background-clip:text;font-size:clamp(38px,9vw,78px);animation:.6s both final-in,4s linear infinite shimmer,1.4s ease-in-out .6s infinite heartbeat}@keyframes final-in{0%{opacity:0}to{opacity:1}}@keyframes heartbeat{0%,to{transform:scale(1)}25%{transform:scale(1.06)}40%{transform:scale(1)}}.hearts{pointer-events:none;z-index:0;position:fixed;inset:0}.heart{opacity:.28;animation:linear infinite float-up;position:absolute;bottom:-40px}@keyframes float-up{0%{opacity:0;transform:translateY(0)rotate(0)}10%{opacity:.32}90%{opacity:.22}to{opacity:0;transform:translateY(-110svh)rotate(40deg)}}.confetti{pointer-events:none;z-index:20;position:fixed;inset:0}.confetti-bit{font-size:22px;animation:ease-in forwards confetti-fall;position:absolute;top:-30px}@keyframes confetti-fall{0%{opacity:1;transform:translateY(0)rotate(0)}to{opacity:0;transform:translateY(105svh)rotate(360deg)}}.balloons{pointer-events:none;z-index:19;position:fixed;inset:0;overflow:hidden}.balloon{will-change:transform, opacity, margin-left;border-radius:50%/55% 55% 45% 45%;width:46px;height:58px;animation:linear forwards balloon-rise,3.5s ease-in-out infinite alternate balloon-sway;position:absolute;bottom:-140px;box-shadow:inset -6px -6px 10px #0000001f}.balloon:before{content:"";background:#00000040;width:1px;height:60px;position:absolute;top:100%;left:50%;transform:translate(-50%)}.balloon:after{content:"";background:inherit;border-radius:2px;width:8px;height:8px;position:absolute;top:100%;left:50%;transform:translate(-50%,-40%)rotate(45deg)}@keyframes balloon-rise{0%{opacity:0;transform:translateY(0)}8%{opacity:1}92%{opacity:1}to{opacity:0;transform:translateY(-125svh)}}@keyframes balloon-sway{0%{margin-left:-14px}to{margin-left:14px}}.cake-pop{z-index:21;pointer-events:none;flex-direction:column;align-items:center;gap:12px;animation:.75s cubic-bezier(.34,1.56,.64,1) both cake-in;display:flex;position:fixed;bottom:8svh;left:50%;transform:translate(-50%)}.cake-pop.cake-leaving{animation:.6s cubic-bezier(.4,0,.2,1) forwards cake-out}@keyframes cake-in{0%{opacity:0;transform:translate(-50%)translateY(80px)scale(.55)}60%{opacity:1}to{opacity:1;transform:translate(-50%)translateY(0)scale(1)}}@keyframes cake-out{0%{opacity:1;filter:blur();transform:translate(-50%)translateY(0)scale(1)}to{opacity:0;filter:blur(4px);transform:translate(-50%)translateY(-40px)scale(.9)}}.cake{width:200px;position:relative}.cake-base,.cake-mid,.cake-top{box-shadow:var(--shadow);border-radius:12px 12px 8px 8px;margin:0 auto}.cake-base{background:linear-gradient(#ffb3c7,#ff86a8);width:200px;height:60px}.cake-mid{background:linear-gradient(#ffd0dd,#ffa7c1);width:160px;height:46px;margin-top:-8px}.cake-top{background:linear-gradient(#fff0f5,#ffc2d6);width:120px;height:38px;margin-top:-8px}.cake-top:after{content:"";background:radial-gradient(8px at 12px 0,#fff0f5 60%,#0000 62%) 0 0/24px 14px repeat-x;width:120px;height:14px;position:absolute;top:30%;left:50%;transform:translate(-50%)}.cake-candles{gap:30px;display:flex;position:absolute;top:-34px;left:50%;transform:translate(-50%)}.candle{background:repeating-linear-gradient(45deg,#ff5fa8 0 6px,#fff 6px 12px);border-radius:3px;width:6px;height:34px}.cake-flames{gap:30px;display:flex;position:absolute;top:-52px;left:50%;transform:translate(-50%)}.flame{transform-origin:bottom;background:radial-gradient(circle at 50% 70%,#fff59d,#ff9f1c 55%,#ff5400);border-radius:50%/60% 60% 40% 40%;width:12px;height:18px;margin:0 -3px;animation:.5s ease-in-out infinite alternate flicker;box-shadow:0 0 12px #ff9f1ccc}.flame:nth-child(2){animation-delay:.15s}.flame:nth-child(3){animation-delay:.3s}@keyframes flicker{0%{opacity:.9;transform:scale(1)rotate(-3deg)}to{opacity:1;transform:scale(1.15)rotate(3deg)}}.cake-caption{font-family:var(--hand,var(--heading));color:var(--accent);text-shadow:0 2px 6px #ff65a34d;font-size:22px}@media (prefers-reduced-motion:reduce){.balloon{animation-duration:6s!important}.flame{animation:none}}.page>section{z-index:1;max-width:1000px;margin:0 auto;padding:48px 24px;position:relative}.section-title{font-family:var(--heading);margin-bottom:28px;font-size:30px}.hero{z-index:6;box-sizing:border-box;flex-direction:column;justify-content:center;align-items:center;gap:14px;min-height:92svh;padding-top:clamp(160px,34vw,240px);display:flex;position:relative}.eyebrow{color:var(--text);opacity:.85;font-size:18px}.title{font-family:var(--heading);text-shadow:0 2px 14px #fff6faa6;flex-direction:column;gap:4px;margin:4px 0;font-size:clamp(44px,9vw,88px);font-weight:700;line-height:1.05;display:flex}.title .name{background:linear-gradient(100deg,#ff3d8b 0%,#ff1e79 20%,#ff5fa8 40%,#ff96c9 55%,#ff2e86 75%,#ff3d8b 100%) 0 0/250%;-webkit-text-fill-color:transparent;color:#0000;text-shadow:none;filter:drop-shadow(0 4px 10px #ff1e7973)drop-shadow(0 0 22px #ff5fa873);-webkit-background-clip:text;background-clip:text;font-size:clamp(56px,12vw,120px);animation:4s linear infinite shimmer,4.5s ease-in-out infinite float-wobble}@keyframes shimmer{to{background-position:250%}}@keyframes float-wobble{0%,to{transform:translateY(0)rotate(-1.5deg)}50%{transform:translateY(-10px)rotate(1.5deg)}}@keyframes pop-bounce{0%,to{transform:translateY(0)scale(1)}50%{transform:translateY(-8px)scale(1.03)}}.nickname{font-family:var(--hand);color:var(--text-h);font-size:clamp(26px,5vw,40px)}.wish-btn{font-family:var(--sans);color:#fff;background:var(--accent);cursor:pointer;box-shadow:var(--shadow);z-index:2;border:none;border-radius:999px;margin-top:18px;padding:14px 30px;font-size:18px;font-weight:600;transition:transform .35s cubic-bezier(.34,1.56,.64,1),filter .2s;position:relative}.wish-btn:hover{filter:brightness(1.08)}.wish-btn:active{filter:brightness(.95)}.scroll-hint{opacity:.7;margin-top:34px;font-size:16px;animation:1.8s ease-in-out infinite nudge}@keyframes nudge{0%,to{transform:translateY(0)}50%{transform:translateY(6px)}}.letter-section{text-align:center}.envelope{border:2px dashed var(--accent-border);cursor:pointer;background:#ffffff8c;border-radius:20px;flex-direction:column;align-items:center;gap:10px;padding:36px 48px;transition:transform .2s,box-shadow .2s;display:inline-flex}.envelope:hover{box-shadow:var(--shadow);transform:translateY(-4px)scale(1.03)}.envelope-emoji{object-fit:contain;width:72px;height:72px;animation:2s ease-in-out infinite pop-bounce}.envelope-text{font-family:var(--hand);color:var(--accent);font-size:28px}.letter{border:1px solid var(--border);max-width:640px;box-shadow:var(--shadow);text-align:left;background:#ffffffa6;border-radius:22px;margin:0 auto;padding:36px 40px;animation:.6s both letter-in}.letter p{font-family:var(--hand);color:var(--text-h);margin-bottom:16px;font-size:26px;line-height:1.5}.letter .signoff{text-align:right;margin-top:8px}@keyframes letter-in{0%{opacity:0;transform:translateY(16px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.gallery{grid-template-columns:repeat(3,1fr);place-items:center;gap:28px 20px;display:grid}.polaroid{box-shadow:var(--shadow);transform:rotate(var(--tilt));cursor:pointer;background:#fff;border-radius:6px;flex-direction:column;align-items:center;width:240px;max-width:60vw;margin:0;padding:12px 12px 0;transition:transform .25s,box-shadow .25s;display:flex}.polaroid:hover{transform:rotate(0)scale(1.05);box-shadow:0 18px 30px -6px #3a266840}.polaroid-img{aspect-ratio:4/5;background:linear-gradient(135deg, var(--bg-2), #ffe9f2);border-radius:4px;place-items:center;width:100%;display:grid;position:relative;overflow:hidden}.polaroid-img img,.polaroid-img video{object-fit:cover;z-index:1;width:100%;height:100%;position:relative}.placeholder-emoji{opacity:.6;font-size:40px;position:absolute}.polaroid-img:not(.is-empty) .placeholder-emoji{display:none}.polaroid figcaption{font-family:var(--hand);color:var(--text-h);text-align:center;overflow-wrap:break-word;width:100%;padding:8px 4px 14px;font-size:22px;line-height:1.25}.gallery-hint{opacity:.7;margin-top:28px;font-size:14px}.footer{text-align:center;font-family:var(--hand);color:var(--accent);z-index:1;padding:24px;font-size:24px;position:relative}@media (width<=720px){.gallery{grid-template-columns:repeat(2,1fr);gap:20px 12px}.letter{padding:26px 22px}.letter p{font-size:22px}}@media (width<=420px){.gallery{grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){.heart,.confetti-bit,.title .name,.envelope-emoji,.scroll-hint,.intro-glow,.intro-final,.line-in{animation:none}.title .name,.intro-final{background-position:0}}
