.birthday-panel{width:min(680px,94vw);max-height:90dvh;overflow:auto;padding:28px;background:#fff6e5;color:#554a42;border:2px solid #8b7868;border-radius:12px;font:17px/1.8 'Microsoft YaHei',sans-serif}.birthday-panel::backdrop{background:#31251fc9;backdrop-filter:blur(5px)}.birthday-panel button{min-height:44px;padding:8px 14px;margin:5px;border:1px solid #8b7868;border-radius:8px;background:#ede3ce;cursor:pointer}.birthday-panel [data-close]{float:right}.puzzle-slots{display:grid;grid-template-columns:repeat(3,1fr)}.cake,.memory{display:block;width:min(100%,400px);margin:auto}.birthday-gift{position:absolute;left:40.5%;top:55%;width:11.5%;height:12%;min-width:44px;min-height:44px;z-index:10}.angel-dog__progress{display:none!important}
.memory-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}.memory-grid button{min-height:90px;background:#d9dfc5}.chat-1{text-align:right;background:#eee5d5;padding:10px;border-radius:12px}@media(max-width:500px){.memory-grid{grid-template-columns:repeat(2,1fr)}}
.drawer-table{position:relative;aspect-ratio:1.45;background:#c8b79a;border:12px solid #87966e;overflow:hidden;border-radius:12px}.ticket{position:absolute;margin:0!important;padding:4px!important;min-height:44px;background:#fff5dc!important;box-shadow:2px 4px 7px #554a4244;touch-action:none;user-select:none;font-size:12px!important}.ticket img{width:100%;height:55%;object-fit:contain;pointer-events:none}.ticket span{display:block;pointer-events:none}.drawer-piece{position:absolute;margin:0!important;min-width:44px;z-index:0;font-size:12px}.finale-stage{position:fixed;inset:0;width:100vw;height:100dvh;max-width:none;max-height:none;margin:0;border:0;padding:0;background:transparent;color:#fff7db;overflow:auto}.finale-stage::backdrop{background:transparent}.night-layer{position:fixed;inset:0;background:#100d18;opacity:0;transition:opacity .4s}.dark .night-layer{opacity:.97}.cake-scene{position:relative;min-height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:24px;opacity:0;transition:opacity .8s}.revealed .cake-scene{opacity:1}.cake-wrap{position:relative;width:min(440px,80vw);filter:drop-shadow(0 0 35px #e9b66d66);touch-action:none}.cake-wrap img{width:100%;display:block}.flames{position:absolute;top:23%;left:37%;width:25%;display:flex;justify-content:space-between;transform:scale(calc(1 - var(--blow,0)*.9));transform-origin:center bottom}.flames i{display:block;width:13px;height:27px;border-radius:70% 35% 65% 40%;background:#fff3a4;box-shadow:0 0 18px 9px #f5b34f99;animation:flicker 1s ease-in-out infinite alternate}.flames i:nth-child(2){animation-delay:.3s}.extinguished .flames{display:none}.extinguished .cake-scene{background:radial-gradient(ellipse at top,#b5824c55,transparent 75%)}.extinguished .smoke{position:absolute;top:10%;left:48%;width:10px;height:45px;border-radius:50%;background:#ddd9;filter:blur(8px);animation:smoke 1.4s both}.finale-stage button{min-height:48px;padding:12px 24px;border:1px solid #e1cfaa;border-radius:24px;background:#f9eedb;color:#554a42;margin:8px;touch-action:none}.finale-stage progress{width:180px;margin:12px}.in-finale .angel-dog{display:none!important}.in-finale .topbar,.in-finale .room-nav{opacity:0}@keyframes flicker{to{transform:rotate(8deg) scale(.88,1.06)}}@keyframes smoke{to{transform:translateY(-50px);opacity:0}}@media(prefers-reduced-motion:reduce){.flames i{animation:none}.night-layer,.cake-scene{transition:none}}
.art-puzzle{gap:0;max-width:480px;margin:auto;border:7px solid #aa9475;border-radius:8px;overflow:hidden}.art-puzzle button{aspect-ratio:1;margin:0!important;border-radius:0!important;background-color:#e8ddc7!important;border:1px dashed #998772!important;background-repeat:no-repeat}.art-puzzle button:disabled{opacity:1;cursor:default}.piece-tray{display:flex;justify-content:center;gap:16px;flex-wrap:wrap;padding:22px 0}.piece-tray button{position:relative;width:100px;height:90px;background-repeat:no-repeat;touch-action:none}.piece-tray span{position:absolute;bottom:0;left:0;right:0;font-size:12px;background:#fff7e5e8}.piece-tray [aria-pressed=true]{outline:3px solid #87966e}.letter-copy{font-size:18px;line-height:2;white-space:pre-wrap}.image-failed{min-height:80px;background:#e7dcc6;border:1px dashed #8b7868}.birthday-panel button{min-width:44px}.bed-quilt-hotspot[aria-pressed=true]{height:16%!important;top:auto!important;bottom:0!important}.birthday-gift{padding:0;border:0;background:transparent;border-radius:10px;cursor:pointer}.birthday-gift:is(:hover,:focus-visible,:active){outline:none;filter:brightness(1.15)}.birthday-gift[hidden]{display:none}.topbar .hint{flex:1;min-width:0}@media(max-width:600px){.topbar{flex-wrap:wrap;padding:8px}.topbar .brand{font-size:14px}.topbar .hint{display:none}.birthday-panel{padding:18px;width:96vw}.ticket span{font-size:10px}.room-nav{gap:0;padding:4px}.room-nav .nav-item{padding:8px;font-size:13px;min-width:44px}}
.memory-grid button{display:flex;flex-direction:column;align-items:center;justify-content:center;aspect-ratio:1;overflow:hidden}.memory-grid img{width:100%;height:70px;object-fit:contain}.flames{left:29.5%;width:42%;top:15%}.flames i:nth-child(1){transform:translateY(5px)}.flames i:nth-child(3){transform:translateY(-2px)}
.journal-reading{display:grid;grid-template-columns:1fr 1fr;gap:24px;background-size:100% 100%;padding:35px 28px;min-height:360px}.journal-reading.single{grid-template-columns:1fr;background-image:none!important;background:#faf0d9;padding:20px}.journal-reading section{min-width:0}.journal-reading h3{font-size:17px}.journal-reading p{white-space:pre-line;font-size:16px;line-height:1.8}.journal-zoom{background:transparent!important;border:0!important;padding:0!important;display:block;width:100%;margin:0!important}.journal-zoom img{width:100%;height:120px;object-fit:contain}
.storage-note{position:fixed;bottom:6px;left:10px;right:10px;z-index:9999;background:#fff3d7;color:#554a42;padding:8px;border:1px solid #8b7868;font-size:13px;text-align:center}
.room-nav button,.topbar button{min-height:44px;min-width:44px}.memory-board{position:relative;aspect-ratio:1.3;background:url('assets/pegboard-animal-charms-crayon.webp') center/contain no-repeat}.memory-board button{position:absolute;margin:0;padding:6px;background:#fff8e7;transform:rotate(-3deg);border:1px solid #b8a890;box-shadow:2px 4px 6px #554a4255}.memory-board img{width:100%;height:70%;object-fit:contain}.memory-board span{display:block;font-size:12px}.photo-back{min-height:260px;background:#f1e5cd;padding:30px;border:1px solid #baa88a;display:grid;place-content:center}
.chat-scroll article{padding:12px 16px;margin:12px 0;max-width:85%;border-radius:12px;background:#e7ecd9}.chat-scroll .chat-1{margin-left:auto;background:#efe0d5}.chat-scroll p{margin:4px 0}.chat-image{max-width:200px;max-height:180px;object-fit:contain}.avatar{width:36px;height:36px;object-fit:cover;border-radius:50%;vertical-align:middle;margin-right:8px}
.celebrating .cake-scene{background:radial-gradient(ellipse at top,#b5824c55,transparent 75%)}.finale-stage h2{font-size:clamp(22px,3vw,32px)}.finale-stage .cake-wrap:is(:hover,:focus-visible,:active){outline:none;filter:brightness(1.15)}
/* Preserve the actual room behind the transparent three-dimensional cake. */
.finale-stage::backdrop{background:rgba(47,36,35,.20);backdrop-filter:blur(9px);-webkit-backdrop-filter:blur(9px)}
.night-layer,.dark .night-layer{background:transparent;opacity:0;pointer-events:none}
.cake-wrap{width:min(620px,94vw);height:clamp(280px,49dvh,520px);filter:none}
.cake-model{display:block;width:100%;height:100%;border:0;background:transparent}
.finale-stage{color:#55443c;text-shadow:0 1px 8px #fff8e5}
.extinguished .cake-scene,.celebrating .cake-scene{background:transparent}
.flames{top:21%;left:44%;width:12%;pointer-events:none}
.cake-wrap{flex-shrink:0;width:min(680px,94vw);height:clamp(310px,52dvh,580px)}
.cake-scene{justify-content:flex-start;gap:8px;padding-top:24px;padding-bottom:28px}
.cake-scene>h2,.cake-scene>p{margin:8px 0}
#birthday-result{position:relative;margin-top:8px}
/* Larger model viewport: enlarge the available canvas instead of cropping the camera. */
.cake-wrap{width:min(920px,96vw);height:clamp(410px,66dvh,800px);flex-shrink:0}
@media(max-width:600px){.cake-wrap{width:96vw;height:min(64dvh,110vw)}}

/* Immediate cake entrance and birthday ribbon spray. */
.finale-stage .cake-scene{opacity:1;transition:none}
.finale-stage[open].cake-ready .cake-wrap{animation:cake-arrive .85s cubic-bezier(.16,1,.3,1) both;transform-origin:50% 65%}
.birthday-confetti{position:fixed;inset:0;width:100%;height:100%;pointer-events:none;z-index:3}
@keyframes cake-arrive{from{transform:scale(.16);opacity:0}to{transform:scale(1);opacity:1}}
@media(prefers-reduced-motion:reduce){.finale-stage[open].cake-ready .cake-wrap{animation:none;opacity:1}}

.finale-stage:not(.cake-ready) .cake-wrap{opacity:0}
.topbar .surprise-heading{display:flex;flex-direction:column;gap:5px;text-align:left;line-height:1.25;font-size:17px}
.surprise-heading>span{display:flex;align-items:center;justify-content:space-between;gap:18px}
#surprisePercent{font-size:13px;font-weight:400;color:var(--ink-soft)}
#surpriseProgress{appearance:none;display:block;width:100%;height:4px;border:0;border-radius:9px;background:#ecded1;overflow:hidden}
#surpriseProgress::-webkit-progress-bar{background:#e7dcc7;border-radius:9px}
#surpriseProgress::-webkit-progress-value{background:#bd7883;border-radius:9px}
#surpriseProgress::-moz-progress-bar{background:#bd7883;border-radius:9px}
@media(max-width:600px){.topbar .surprise-heading{font-size:14px}.surprise-heading>span{gap:8px}}
/* Physical gifts float directly over the softly defocused original room. */
.birthday-panel.gift-experience{width:min(1080px,98vw);max-width:98vw;max-height:94dvh;padding:48px 20px 24px;border:0;border-radius:0;background:transparent;box-shadow:none;overflow:auto;color:#514036}
.birthday-panel.gift-experience::backdrop{background:#43352d38;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}
.gift-experience>h2{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
.birthday-panel.gift-experience>[data-close]{position:fixed;right:22px;top:18px;width:46px;height:46px;border:1px solid #ffffff90;border-radius:50%;background:#fff7e5b8;color:#514036;font-size:26px;z-index:5}
.gift-still-life{display:grid;grid-template-columns:1.4fr 1fr;align-items:center;gap:20px;min-height:min(560px,70dvh)}
.opened-gift{position:relative;isolation:isolate;aspect-ratio:1;animation:gift-unpack .85s cubic-bezier(.16,1,.3,1) both}
.gift-box-art{width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 18px 15px #46312830)}
.gift-camera-art{position:absolute;left:21%;top:28%;width:65%;height:40%;object-fit:contain;filter:drop-shadow(0 18px 12px #241b1940);animation:camera-unpack 1.1s cubic-bezier(.16,1,.3,1) both}
.gift-caption{text-align:center;margin:0;font-size:16px;text-shadow:0 1px 12px #fff9e9,0 0 20px #fff9e9}
.birthday-panel .real-envelope{padding:0;margin:0;border:0;background:transparent;box-shadow:none;transform:rotate(-8deg);transition:transform .45s,opacity .45s;width:100%;color:#514036}
.real-envelope img{width:100%;display:block;filter:drop-shadow(0 16px 14px #46312838)}
.real-envelope span{display:block;margin-top:8px;font-size:15px;text-shadow:0 1px 12px #fff9e9,0 0 20px #fff9e9}
.real-envelope:hover{transform:rotate(-3deg) translateY(-8px)}
.real-envelope.is-opening{transform:translateY(-35px) rotate(0deg) scale(1.08);opacity:0}
.gift-experience button:focus-visible{outline:3px solid #8d5c4c;outline-offset:6px}
.handwritten-sheet{width:min(660px,100%);margin:0 auto;padding:clamp(48px,8vw,84px) clamp(32px,8vw,76px);min-height:660px;background:url('assets/letter-paper.webp') center/100% 100% no-repeat;filter:drop-shadow(0 12px 18px #46312830);animation:letter-unfold .65s ease both}
.handwritten-copy{font-family:'KaiTi','STKaiti','Kaiti SC','楷体',cursive;font-size:clamp(21px,3.7vw,27px);line-height:2.1;letter-spacing:1px;color:#3f3935;white-space:pre-wrap;overflow-wrap:anywhere;transform:rotate(-.6deg)}
.topbar-action{min-height:44px;padding:6px 8px;border:0;border-radius:6px;background:transparent;cursor:pointer;white-space:nowrap}
.topbar-action:hover{background:#efe3d6}
@media(max-width:600px){.topbar{gap:4px;justify-content:space-between}.topbar .brand{padding-inline:0;gap:4px}.topbar-action{font-size:13px;padding-inline:5px}}
.room-restart-actions{display:flex;justify-content:flex-end;gap:12px;flex-wrap:wrap}.room-restart:focus-visible,.room-restart-dialog button:focus-visible{outline:3px solid #73654e;outline-offset:3px}
.handwritten-copy p{margin:0 0 22px}.handwritten-copy footer{text-align:right;margin-top:36px}
.letter-actions{display:flex;justify-content:center;gap:12px;flex-wrap:wrap;margin:18px auto 0}.birthday-panel .letter-actions button{border:1px solid #ac9580;background:#fff6e6e8;border-radius:24px;padding:12px 22px;min-height:48px}
@keyframes gift-unpack{from{opacity:0;transform:translateY(45px) scale(.8)}to{opacity:1;transform:none}}
@keyframes camera-unpack{0%,20%{opacity:0;transform:translateY(70px) scale(.65)}100%{opacity:1;transform:translateY(-14px) rotate(-5deg)}}
@keyframes letter-unfold{from{opacity:0;transform:translateY(35px) scale(.9)}to{opacity:1;transform:none}}
@media(max-width:600px){.birthday-panel.gift-experience{padding:48px 12px 24px}.gift-still-life{grid-template-columns:1fr;gap:14px;min-height:0}.opened-gift{width:min(380px,90vw);margin:auto}.birthday-panel .real-envelope{width:min(260px,65vw);margin:0 auto 22px}.handwritten-sheet{min-height:570px;padding:50px 34px}.handwritten-copy{font-size:21px;line-height:1.9}}
@media(prefers-reduced-motion:reduce){.opened-gift,.gift-camera-art,.handwritten-sheet{animation:none}.gift-camera-art{transform:translateY(-14px) rotate(-5deg)}.birthday-panel .real-envelope{transition:none}}

.finale-stage:not(.cake-ready) .cake-wrap{opacity:1}
.finale-stage[open].cake-ready .cake-wrap{animation-duration:.35s}
.cake-wrap .cake-model{position:relative;opacity:0}
.model-ready .cake-model{opacity:1}
.fragment-popup{position:fixed;inset:0;width:100vw;max-width:none;height:100dvh;max-height:none;margin:0;padding:0;border:0;background:transparent;box-shadow:none;overflow:hidden}
.fragment-popup[open]{display:grid;place-items:center}
.fragment-popup::backdrop{background:transparent;backdrop-filter:none}
.fragment-popup__piece{width:min(210px,60vw);aspect-ratio:1;padding:0;border:0;border-radius:0;background-color:transparent;background-repeat:no-repeat;background-size:300% 200%;cursor:pointer;animation:fragment-pop-in .38s cubic-bezier(.16,1,.3,1) both}
@keyframes fragment-pop-in{from{opacity:0;transform:translateY(28px) scale(.65)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.fragment-popup__piece{animation:none}}

.chair-letter-envelope{display:grid;place-items:center;min-height:min(520px,65dvh);padding:35px 18px}.birthday-panel .chair-letter-envelope .real-envelope{width:min(430px,75vw)}
