@font-face{font-family:BirthdayScript;src:url('./assets/birthday/great-vibes.ttf') format('truetype');font-display:swap}*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:#100c1c;color:#fff4e7;font-family:Georgia,'Times New Roman',serif}button{font:inherit;cursor:pointer;color:inherit}button:focus-visible{outline:2px solid #ffcf91;outline-offset:5px}button:disabled{opacity:.4;cursor:wait}[hidden]{display:none!important}.birthday{position:relative;width:100%;height:100svh;min-height:620px;overflow:hidden;isolation:isolate}.room-fallback{position:absolute;inset:0;background:#160e28 url('./assets/birthday/room.webp') center/cover no-repeat;z-index:-2}#canvas-host{position:absolute;inset:0;touch-action:pan-y}#canvas-host canvas{display:block;width:100%;height:100%;touch-action:pan-y}.vignette{position:absolute;inset:0;background:linear-gradient(180deg,#08051238,transparent 19%,transparent 75%,#070510a6),radial-gradient(ellipse at center,transparent 47%,#06040c5e 100%);pointer-events:none;z-index:1}.scene-header{position:absolute;top:38px;left:42px;z-index:3;text-shadow:0 2px 16px #110718;pointer-events:none}.scene-header h1{font-size:42px;font-weight:600;line-height:1.05;letter-spacing:.2px;margin:0 0 12px}.scene-header p{font-size:18px;line-height:1.35;margin:0;color:#e9ddee}.utilities{position:absolute;top:35px;right:35px;display:flex;gap:10px;z-index:4}.round-button{width:43px;height:43px;border-radius:50%;border:1px solid #cda4c533;background:#24162673;backdrop-filter:blur(12px);display:grid;place-items:center;font:25px Arial,sans-serif;color:#efdbc9;transition:background .2s}.round-button:hover{background:#5c355563}.round-button svg{width:19px;height:19px}#music[aria-pressed=false] .waves{opacity:.3}.bottom-ui{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);width:max-content;max-width:100%;z-index:4;text-align:center;font-family:Arial,sans-serif}.open-button{border:1px solid #e7b47877;border-radius:999px;padding:17px 27px;display:inline-flex;align-items:center;gap:30px;font-family:Arial,sans-serif;font-size:15px;color:#ffe4ba;background:linear-gradient(120deg,#51342abf,#402131c9);box-shadow:0 0 30px #ec924a22,inset 0 0 20px #eca76010;backdrop-filter:blur(15px);transition:box-shadow .25s,transform .25s}.open-button:hover{box-shadow:0 0 45px #ee9c4f50;transform:translateY(-2px)}.open-button>span:last-child{font-size:26px}.bottom-ui>p{color:#e5d4df;font-family:Georgia,serif;font-size:15px;text-shadow:0 1px 8px #000;margin:18px 0 13px}.surprises{display:flex;justify-content:center;align-items:center;gap:4px;padding:5px;border:1px solid #c7a1b932;border-radius:18px;background:#170f2377;backdrop-filter:blur(18px);box-shadow:0 6px 30px #03010c36}.surprises button{display:flex;align-items:center;gap:9px;padding:12px 15px;font:14px Arial,sans-serif;background:transparent;border:0;border-radius:12px;color:#f5e4d7;transition:background .2s}.surprises button:hover{background:#a4707240}.surprises svg{width:19px;height:19px;color:#f4cba0}.surprises button.seen{color:#f5c77e}.home-indicator{display:block;width:84px;height:3px;border-radius:8px;background:#e9ddeb80;margin:0 auto}.brand{position:absolute;bottom:27px;right:34px;font-size:23px;color:#ddcbbd8a;z-index:3;pointer-events:none}.brand span{color:#edb572}.hover-label{position:absolute;transform:translate(-50%,-160%);z-index:5;padding:9px 13px;border:1px solid #d1a76a66;border-radius:7px;background:#231625ce;backdrop-filter:blur(15px);color:#fbe5c8;font:13px Arial,sans-serif;pointer-events:none;white-space:nowrap}.balloon-note{position:absolute;z-index:6;left:50%;top:19%;transform:translateX(-50%);max-width:80%;width:330px;text-align:center;border:1px solid #f9d69548;background:#321f34d9;box-shadow:0 0 60px #f19a4822;padding:24px 30px;border-radius:12px;backdrop-filter:blur(20px);font:21px/1.45 Georgia,serif;color:#ffdda8;animation:note-in .5s ease-out}.loading{position:absolute;inset:0;background:#120d1fd9;backdrop-filter:blur(20px);z-index:9;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:25px;font:16px Georgia,serif;color:#dfb98e}.loader{height:36px;width:36px;border-radius:50%;border:1px solid #bd957e40;border-top-color:#ffd29a;animation:spin 1.2s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@keyframes note-in{from{opacity:0;margin-top:12px}to{opacity:1;margin-top:0}}.simple-view{position:absolute;left:50%;top:42%;transform:translate(-50%,-50%);text-align:center}.simple-view .script{font-size:90px;color:#ffd398;text-shadow:0 0 25px #ff9900}.simple-view p{font-size:16px}.script{font-family:BirthdayScript,Georgia,serif;font-weight:400}
dialog{width:min(500px,calc(100vw - 26px));max-height:91svh;overflow:auto;scrollbar-width:thin;scrollbar-color:#8d5e7b transparent;padding:38px 32px 20px;border:1px solid #ae859968;border-radius:14px;background:linear-gradient(155deg,#302033,#160f23);color:#faeadf;box-shadow:0 30px 120px #0009,0 0 80px #dd946519;animation:unfold .5s cubic-bezier(.2,.8,.2,1)}dialog::backdrop{background:#080510bb;backdrop-filter:blur(13px)}@keyframes unfold{from{opacity:0;transform:translateY(30px) scale(.94)}to{opacity:1;transform:none}}.close-dialog{position:absolute;top:8px;right:12px;border:0;background:none;font:28px Arial,sans-serif;width:36px;height:36px;color:#cfb9cd}.eyebrow{font:12px Arial,sans-serif;letter-spacing:2px;color:#cfaab5}.photo-panel,.cake-panel{text-align:center}dialog h2{font:34px/1.12 Georgia,serif;letter-spacing:-.4px;font-weight:400;margin:18px 0 23px}dialog h2 em{font-family:BirthdayScript;font-style:normal;font-size:1.5em;color:#ffcc99}.photo-card{position:relative;width:100%;aspect-ratio:.94;transform-style:preserve-3d;transition:transform .7s cubic-bezier(.2,.7,.3,1);margin:28px 0}.photo-card.flipped{transform:rotateY(180deg)}.photo-front,.photo-back{position:absolute;inset:0;backface-visibility:hidden;-webkit-backface-visibility:hidden;background:#fff2e5;border:1px solid #f4d3b9;padding:14px 14px 27px;box-shadow:0 0 30px #fbc87f12,0 12px 20px #06030a44}.photo-front{transform:rotate(-2deg)}.photo-front img{width:100%;height:83%;object-fit:cover;display:block}.photo-front>span{font:26px BirthdayScript,Georgia,serif;color:#804f4c;display:block;margin-top:19px}.photo-back{transform:rotateY(180deg);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;color:#734d4e}.photo-back>span:first-child{font:12px Arial,sans-serif;letter-spacing:2px;text-transform:uppercase}.photo-back p{font:21px/1.6 Georgia,serif;margin:23px 0}.photo-back .script{font-size:29px}.photo-actions{display:flex;justify-content:space-between;gap:15px}.photo-actions button{border:0;background:transparent;font:14px Arial,sans-serif;color:#efc7a3;padding:10px 0}.photo-count{font:12px Arial,sans-serif;letter-spacing:2px;color:#b89cae}.back-button{display:block;width:100%;margin-top:25px;padding:17px 0 2px;border:0;border-top:1px solid #94677e55;background:none;font:14px Arial,sans-serif;color:#c7adbe}.cake-photo{height:330px;margin:10px 0 24px;overflow:hidden;border-radius:8px;border:1px solid #c49a712e;box-shadow:0 0 45px #ed915518}.cake-photo img{width:100%;height:100%;object-fit:cover;object-position:center 55%}.gold-button{border:1px solid #ffe0ad6b;background:linear-gradient(125deg,#a87646,#68412e);color:#fff3db;font:15px Arial,sans-serif;padding:15px 26px;border-radius:999px;box-shadow:0 0 25px #e0a05222;display:inline-flex;gap:20px;align-items:center}.gold-button span{font-size:24px}.quiet-copy{font:13px/1.5 Arial,sans-serif;color:#b49ba8;margin:17px 0 0}.wish-reveal{min-height:310px;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px 0;animation:unfold .65s ease-out}.wish-reveal .script{font-size:76px;line-height:1.03;color:#ffd199;text-shadow:0 0 35px #f4a84d44}.wish-reveal p{font:17px/1.75 Georgia,serif;color:#dfc6bc;margin:20px 0}.wish-star{font-size:45px;color:#ffd493;text-shadow:0 0 25px #ffc369}.letter-panel{padding-top:10px}.letter-panel h2{font-size:42px;margin-bottom:30px}.letter-paper{background:linear-gradient(120deg,#f4dfca,#edd0bc);padding:25px 28px;border-radius:3px;color:#684447;box-shadow:0 6px 40px #08020b33;transform:rotate(-.8deg)}.letter-paper p{font:16px/1.8 Georgia,serif;margin:0 0 17px}.signature{display:block;font:30px/1.2 BirthdayScript,Georgia,serif;color:#974d59;padding:10px 0}.sr-only{position:absolute;width:1px;height:1px;clip:rect(0,0,0,0);overflow:hidden;white-space:nowrap}
@media(max-width:700px){.scene-header{top:28px;left:26px}.scene-header h1{font-size:32px}.scene-header p{font-size:16px}.utilities{top:25px;right:23px;gap:7px}.round-button{width:36px;height:36px;font-size:23px}.round-button svg{width:17px}.brand{display:none}.surprises{gap:1px;padding:5px}.surprises button{flex-direction:column;gap:8px;padding:10px 12px;font-size:12px}.surprises svg{width:20px;height:20px}.bottom-ui{bottom:max(18px,env(safe-area-inset-bottom))}.bottom-ui>p{font-size:14px;margin:14px 0 13px}.open-button{font-size:14px;padding:15px 24px}.birthday{min-height:650px}.balloon-note{top:23%}.hover-label{display:none}dialog{padding:36px 25px 18px}.photo-back p{font-size:18px}.letter-paper{padding:23px 22px}.cake-photo{height:310px}}
@media(max-width:380px){.scene-header{left:20px;top:25px}.scene-header h1{font-size:29px}.scene-header p{font-size:15px}.utilities{right:17px}.surprises button{font-size:12px;padding:9px}.surprises svg{width:18px}dialog h2{font-size:29px}.cake-photo{height:270px}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}}


.template-home{position:absolute;left:28px;bottom:28px;z-index:5;color:#efdbc9;text-decoration:none;font:14px Arial,sans-serif;padding:10px 14px;border:1px solid #cda4c533;border-radius:30px;background:#24162673;backdrop-filter:blur(12px)}.template-home:hover{background:#5c355563}.template-home:focus-visible{outline:2px solid #ffcf91;outline-offset:3px}@media(max-width:700px){.template-home{top:22px;left:24px;bottom:auto;padding:8px 11px;font-size:12px}.scene-header{top:76px}.scene-header h1{font-size:29px}.scene-header p{font-size:14px}}

/* A personal opening, with no light leaking through the closed lid. */
.dedication{position:absolute;top:20%;left:50%;transform:translateX(-50%);z-index:3;text-align:center;width:min(480px,90%);pointer-events:none;transition:opacity .55s ease,filter .55s ease;color:#fce6cf;text-shadow:0 3px 25px #140b25}.dedication-eyebrow{font:11px Arial,sans-serif;letter-spacing:2.7px;color:#caa990}.dedication h2{font:55px/1.02 Georgia,serif;letter-spacing:-1.5px;margin:19px 0 13px}.dedication h2 em{font:67px/1.2 BirthdayScript,serif;letter-spacing:0;color:#f6c99e}.dedication p{font:16px/1.65 Georgia,serif;color:#cdb9c8;margin:0}.birthday[data-open=true] .dedication{opacity:0;filter:blur(6px);visibility:hidden;transition:opacity .55s,filter .55s,visibility 0s .55s}.skip-reveal{border:1px solid #c79e7d55;border-radius:30px;background:#25162d99;color:#dfc3ac;padding:13px 22px;font:14px Arial,sans-serif;min-height:44px;backdrop-filter:blur(12px)}.surprises[aria-busy=true]{opacity:.5}.surprises button:disabled{cursor:default}.photo-card{touch-action:pan-y;perspective:1000px}.photo-actions{align-items:center;gap:10px}.photo-actions button{min-height:44px}.photo-actions #previous-photo{font-size:23px;min-width:44px}.photo-actions #next-photo{min-width:100px}.swipe-hint{font:12px Arial,sans-serif;color:#ae91a5;margin:10px 0 0}.photo-count{margin:10px 0}.photo-panel{perspective:1100px}.photo-back p{font-size:19px;line-height:1.5}.balloon-note{pointer-events:none}.balloon-note::before{content:'A little wish for Anna';display:block;font:10px Arial,sans-serif;text-transform:uppercase;letter-spacing:1.6px;color:#c49bac;margin-bottom:10px}#celebration-layer{position:absolute;inset:0;z-index:7;pointer-events:none;overflow:hidden}.pop-ring{position:absolute;width:70px;height:70px;margin:-35px;border:2px solid #ffc8a8;border-radius:50%;box-shadow:0 0 22px #ffd59844}.pop-confetti{position:absolute;width:7px;height:12px;border-radius:2px}.candle-scene{height:auto!important;aspect-ratio:2/3;max-height:none;margin-bottom:15px;position:relative;overflow:hidden}.candle-scene>img{width:100%;height:100%;object-fit:contain;display:block;transition:filter .7s}.candle-scene.all-out>img{filter:brightness(.8)}#candle-controls{position:absolute;inset:0}.candle-button{position:absolute;transform:translate(-50%,-50%);width:44px;height:58px;padding:0;border:0;background:transparent;border-radius:50%;touch-action:manipulation}.candle-button:focus-visible{outline:2px solid #ffd49c;outline-offset:0;background:#ffd49c12}.candle-flame{position:absolute;left:50%;top:50%;width:9px;height:22px;border-radius:70% 30% 50% 50%;background:radial-gradient(ellipse at 50% 80%,#fff 0%,#fff0a6 28%,#ffb449 62%,#f36e24 100%);box-shadow:0 0 9px 4px #ffac4c66,0 0 24px 12px #ffaf4b22;transform:translate(-50%,-50%);transform-origin:50% 100%;animation:candle-flicker 1.2s ease-in-out infinite alternate;pointer-events:none}.candle-button:nth-child(2n) .candle-flame{animation-delay:-.6s}.candle-button:nth-child(3n) .candle-flame{animation-delay:-.3s}.candle-button.extinguished{cursor:default}.candle-button.extinguished .candle-flame{opacity:0;animation:none;transition:opacity .18s}.candle-smoke{position:absolute;left:50%;top:42%;width:10px;height:24px;border-left:2px solid #e2d1cb9c;border-radius:50%;opacity:0;pointer-events:none}.candle-button.extinguished .candle-smoke{animation:candle-smoke 1s ease-out forwards}.candle-status{color:#d4b3b4;font:14px/1.5 Georgia,serif;margin:12px 0 19px}.cake-panel .quiet-copy{font-size:14px}.cake-panel h2{font-size:29px}.wish-reveal{position:relative}.wish-reveal .script{font-size:70px}.wish-reveal[hidden]+.gold-button{margin-top:0}@keyframes candle-flicker{from{transform:translate(-50%,-50%) rotate(-3deg) scale(1,.93)}to{transform:translate(-50%,-50%) rotate(4deg) scale(.93,1.05)}}@keyframes candle-smoke{10%{opacity:.7}to{opacity:0;transform:translate(-7px,-55px) scale(2)}}
@media(max-width:700px){.dedication{top:22%;width:90%}.dedication-eyebrow{font-size:9px;letter-spacing:2px}.dedication h2{font-size:44px;margin-top:17px}.dedication h2 em{font-size:56px}.dedication p{font-size:15px}.round-button{width:44px;height:44px}.utilities{gap:7px;right:20px;top:20px}.bottom-ui{width:calc(100% - 32px);max-width:420px}.surprises{width:100%;gap:0}.surprises button{flex:1;min-width:0;padding:11px 5px;font-size:12px;min-height:64px}.bottom-ui>p{font-size:13px}.photo-back{padding:22px}.photo-back p{font-size:16px;line-height:1.6}.photo-back .script{font-size:25px}.photo-actions{gap:5px}.photo-actions button{font-size:13px}.photo-actions #next-photo{min-width:90px}.photo-actions #previous-photo{min-width:35px}.close-dialog{width:44px;height:44px;top:3px;right:6px}.back-button{min-height:44px;padding-bottom:7px}.candle-scene{max-width:300px;margin-inline:auto}.cake-panel h2{font-size:25px;margin:14px 0 18px}.cake-panel h2 em{font-size:1.55em}.candle-button{width:44px;height:54px}.candle-flame{width:7px;height:17px}.candle-status{font-size:14px}.balloon-note{top:22%;font-size:18px;padding:20px 23px}}
@media(max-height:720px) and (max-width:700px){.dedication{top:24%}.dedication h2{font-size:36px;margin:12px 0}.dedication h2 em{font-size:47px}.dedication p{font-size:14px}}
@media(prefers-reduced-motion:reduce){.birthday[data-open=true] .dedication{visibility:hidden;filter:none}.candle-button.extinguished .candle-smoke{display:none}}

.cake-panel[data-wished=true]>h2{display:none}.cake-panel[data-wished=true] .candle-status{margin:25px 0 10px}.wish-reveal:focus{outline:none}
button,a{touch-action:manipulation}
.balloon-note{pointer-events:auto}.close-balloon-note{position:absolute;top:0;right:0;width:44px;height:44px;display:grid;place-items:center;padding:0;border:0;border-radius:50%;background:transparent;color:#d3b3c3;font:20px/1 Arial,sans-serif;opacity:.8}.close-balloon-note:hover,.close-balloon-note:focus-visible{opacity:1;color:#ffe0bb;background:#ffffff08}
