@import"https://fonts.googleapis.com/css2?family=Quicksand:wght@500;600;700&family=Dancing+Script:wght@600;700&display=swap";:root{--rose: #ff5e87;--mauve: #c9a0ad;--cream: #fff6ea;--ink: #6b4a55}*{margin:0;padding:0;box-sizing:border-box}html,body{width:100%;height:100%;overflow:hidden}body{font-family:Quicksand,system-ui,sans-serif;background:#f3e3d3;color:var(--ink);-webkit-user-select:none;user-select:none}#scene{position:fixed;inset:0}#scene canvas{display:block;touch-action:none}#ui{position:fixed;inset:0;pointer-events:none}#ui>*{pointer-events:auto}.hidden{display:none!important}.overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:radial-gradient(circle at 50% 40%,#ffeef2,#f6dfe6 60%,#efd2c6);transition:opacity .8s ease;z-index:10}.overlay.dark{background:#281820c7;backdrop-filter:blur(6px)}.overlay.gone{opacity:0;visibility:hidden;pointer-events:none!important;transition:opacity .8s ease,visibility 0s linear .8s}#ui .hidden{pointer-events:none!important}.intro-card,.final-card{text-align:center;padding:40px 34px;background:#ffffffb8;border-radius:28px;box-shadow:0 18px 60px #965a6e47;max-width:90vw;animation:pop .7s cubic-bezier(.2,.9,.3,1.2) both}.intro-hearts{font-size:46px;color:var(--rose);animation:beat 1.6s ease-in-out infinite}.intro-hearts.big{font-size:64px}h1{font-size:clamp(26px,5vw,42px);margin:8px 0 4px;color:#b5556b}.names{font-family:Dancing Script,cursive;font-size:clamp(28px,6vw,44px);color:var(--mauve);margin:6px 0}.names span{color:var(--rose);margin:0 6px}.subtitle{font-size:16px;opacity:.8;margin:6px 0 22px}.tiny{font-size:12px;opacity:.6;margin-top:14px}.btn{font-family:inherit;font-weight:700;font-size:17px;color:#fff;background:linear-gradient(135deg,#ff7aa0,#ff5e87);border:none;border-radius:999px;padding:14px 30px;cursor:pointer;box-shadow:0 10px 26px #ff5e8773;transition:transform .15s ease,box-shadow .15s ease}.btn:hover{transform:translateY(-2px) scale(1.03);box-shadow:0 14px 32px #ff5e878c}.btn:active{transform:scale(.98)}.toast{position:fixed;top:22px;left:50%;transform:translate(-50%);background:#ffffffeb;color:var(--ink);padding:14px 20px;border-radius:16px;font-size:15px;box-shadow:0 10px 30px #965a6e40;z-index:8;max-width:90vw;text-align:center;animation:dropIn .5s ease both}.link{background:none;border:none;color:var(--rose);font-weight:700;cursor:pointer;font-family:inherit;margin-left:8px}#hud{position:fixed;top:16px;left:0;right:0;display:flex;align-items:center;justify-content:space-between;padding:0 18px;z-index:7}.progress{display:flex;gap:4px;background:#fff9;padding:8px 14px;border-radius:999px}.pheart{color:#e7c2cf;font-size:18px;transition:transform .3s ease,color .3s ease}.pheart.on{color:var(--rose);transform:scale(1.15)}.hud-buttons{display:flex;gap:8px}.round{width:44px;height:44px;border-radius:50%;border:none;cursor:pointer;background:#fffc;color:var(--ink);font-size:18px;box-shadow:0 6px 18px #965a6e38;font-family:inherit;transition:transform .15s ease}.round:hover{transform:scale(1.08)}.advance{position:fixed;left:50%;bottom:22px;transform:translate(-50%);z-index:7;font-size:16px;padding:13px 26px}.advance:hover{transform:translate(-50%) translateY(-2px) scale(1.03)}.advance:active{transform:translate(-50%) scale(.98)}.caption{position:fixed;left:50%;bottom:88px;transform:translate(-50%,20px);width:min(620px,92vw);background:#fffcf8eb;backdrop-filter:blur(8px);border-radius:22px;padding:18px 26px;text-align:center;box-shadow:0 16px 44px #965a6e47;opacity:0;transition:opacity .6s ease,transform .6s ease;z-index:6;border:2px solid rgba(255,255,255,.7)}.caption.show{opacity:1;transform:translate(-50%)}.cap-date{font-size:13px;letter-spacing:1px;text-transform:uppercase;color:var(--mauve)}.cap-title{font-family:Dancing Script,cursive;font-size:32px;color:#b5556b;margin:2px 0 6px}.cap-text{font-size:16px;line-height:1.5}.cap-hint{display:block;margin-top:12px;font-size:12px;opacity:.6}.lb-inner{display:flex;gap:24px;align-items:center;max-width:92vw;max-height:86vh;background:#fffffff5;padding:22px;border-radius:22px;flex-wrap:wrap;justify-content:center}.lb-photo img{max-width:min(60vw,540px);max-height:70vh;border-radius:14px;display:block;box-shadow:0 12px 30px #00000040}.lb-placeholder{width:min(60vw,420px);aspect-ratio:1;border-radius:14px;display:flex;flex-direction:column;align-items:center;justify-content:center;background:linear-gradient(135deg,#ffd3dd,#ffb0c4);color:#fff;font-size:40px;text-align:center}.lb-placeholder b{font-size:24px}.lb-placeholder small{font-size:14px;opacity:.85}.lb-text{max-width:320px}.lb-text h2{font-family:Dancing Script,cursive;font-size:30px;color:#b5556b}.lb-text p{margin-top:8px;line-height:1.55}.lb-close{position:fixed;top:18px;right:18px;z-index:12}#final{background:linear-gradient(to top,rgba(40,24,32,.5),rgba(40,24,32,.06) 52%,transparent)!important;backdrop-filter:none!important;align-items:flex-end;justify-content:flex-end}.final-card{margin:0 30px 28px;background:#ffffffeb;padding:18px 24px;max-width:360px}.final-card .intro-hearts.big{font-size:40px}.final-photo{margin:10px auto 4px}.final-photo img{width:min(78vw,360px);max-height:46vh;object-fit:cover;border-radius:18px;box-shadow:0 12px 30px #965a6e59;display:block;margin:0 auto}.final-photo-ph{width:min(78vw,360px);padding:40px 0;margin:0 auto;border-radius:18px;background:linear-gradient(135deg,#ffd1dc,#ff9cba);color:#fff;font-size:40px;text-align:center}.final-photo-ph small{font-size:16px;opacity:.9}.final-title{font-size:clamp(22px,4.5vw,34px)!important}.final-text{font-size:15px!important;margin:8px auto 14px!important;max-width:380px}.final-card .names{font-size:clamp(24px,5vw,34px);margin:4px 0}#final.show .final-card{animation:pop .9s cubic-bezier(.2,.9,.3,1.2) both}.final-title{font-size:clamp(28px,6vw,48px)}.final-text{font-size:17px;line-height:1.6;margin:12px auto 18px;max-width:440px}#confetti{position:absolute;inset:0;overflow:hidden;pointer-events:none}.confetti-heart{position:absolute;top:-30px;animation:fall linear infinite}@keyframes beat{0%,to{transform:scale(1)}50%{transform:scale(1.18)}}@keyframes pop{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}@keyframes dropIn{0%{opacity:0;transform:translate(-50%,-16px)}to{opacity:1;transform:translate(-50%)}}@keyframes fall{to{transform:translateY(110vh) rotate(360deg)}}@media (max-width: 560px){.lb-inner{flex-direction:column;gap:14px}.cap-title{font-size:26px}#final{justify-content:center}.final-card{margin:0 16px 18px}}
