:root{--bg:#f8eeea;--bg-deep:#f0e0da;--ink:#4a3a2c;--ink-soft:#8a7663;--panel:#fffcf5db;--line:#78604624;--sage:#e391a6;--sage-deep:#d67a93;--active:#f8e4e8;--font:"Zen Maru Gothic", "PingFang TC", "Noto Sans TC", sans-serif;--latin:"Montserrat", var(--font)}@property --bg{syntax:"<color>";inherits:true;initial-value:#f8eeea}@property --bg-deep{syntax:"<color>";inherits:true;initial-value:#f0e0da}body{transition:--bg 1.6s,--bg-deep 1.6s}body.lights-off{--bg:#f6e4d8;--bg-deep:#ead2c4}*{box-sizing:border-box}html,body{background:radial-gradient(120% 90% at 70% 45%, var(--bg) 0%, var(--bg-deep) 100%);height:100%;color:var(--ink);font-family:var(--font);-webkit-font-smoothing:antialiased;margin:0;overflow:hidden}#scene{touch-action:none;width:100%;height:100%;display:block;position:fixed;inset:0}p{margin:0}.eyebrow{font-family:var(--latin);letter-spacing:.22em;color:var(--ink-soft);font-size:10px;font-weight:600}.hero{pointer-events:none;position:fixed;top:clamp(20px,4vh,44px);left:clamp(16px,3vw,40px)}.hero h1{letter-spacing:.06em;margin:10px 0 8px;font-size:clamp(20px,2.3vw,30px);font-weight:700}.title-card{filter:drop-shadow(0 2px 3px #6e563a47);margin-left:.2em;font-size:.9em;line-height:1;display:inline-block;transform:rotate(-12deg)}.lead{color:var(--ink-soft);letter-spacing:.04em;font-size:13px}.about-link{border:1px solid var(--line);background:var(--panel);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:var(--ink);border-radius:999px;padding:6px 14px;font-size:12px;text-decoration:none;transition:background .2s;position:fixed;top:clamp(20px,4vh,44px);right:clamp(16px,3vw,40px)}.about-link:hover{background:var(--active)}.about-link:focus-visible{outline:2px solid var(--sage);outline-offset:2px}.card{background:var(--panel);border:1px solid var(--line);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:18px;width:248px;padding:16px 18px;position:fixed;bottom:132px;left:clamp(16px,3vw,40px);box-shadow:0 10px 30px #6e563a1a}.card-head{align-items:center;gap:12px;display:flex}.avatar{background:#f8ebe4;border-radius:50%;flex:none;place-items:center;width:44px;height:44px;font-size:22px;display:grid;overflow:hidden}.avatar img{object-fit:cover;width:100%;height:100%}.name{white-space:nowrap;font-size:16px;font-weight:700}.name span{font-family:var(--latin);letter-spacing:.2em;color:var(--ink-soft);margin-left:6px;font-size:9px}.name b{font-weight:700}.name-row{align-items:center;gap:4px;display:flex}.name-edit{width:22px;height:22px;color:var(--ink-soft);cursor:pointer;background:0 0;border:0;border-radius:50%;flex:none;place-items:center;padding:0;transition:background .2s,color .2s;display:grid}.name-edit svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.name-edit:hover{background:var(--active);color:var(--ink)}.name-form{align-items:center;gap:4px;display:flex}.name-row[hidden],.name-form[hidden]{display:none}.name-form input{border:1px solid var(--line);min-width:0;color:var(--ink);font:inherit;background:#fffdf9;border-radius:7px;padding:3px 4px}.name-form input:focus{outline:2px solid var(--sage);outline-offset:0;border-color:#0000}#name-zh-input{width:54px;font-size:14px;font-weight:700}#name-en-input{width:56px;font-family:var(--latin);letter-spacing:.1em;text-transform:uppercase;font-size:9px}.name-form button{background:var(--sage);color:#fff;cursor:pointer;border:0;border-radius:50%;flex:none;width:22px;height:22px;padding:0;font-size:11px}.name-form button:hover{background:var(--sage-deep)}.tagline{color:var(--ink-soft);margin-top:2px;font-size:11px}.avatar-wrap{flex:none;position:relative}.dot{background:var(--sage);border:2px solid #fffcf5;border-radius:50%;width:9px;height:9px;transition:background .3s;position:absolute;top:1px;right:1px}.dot.paused{background:#c9b79c}.card-body{border-top:1px solid var(--line);margin-top:12px;padding-top:12px}.status{font-size:13px;font-weight:700}.status-sub{color:var(--ink-soft);margin-top:4px;font-size:11px}.card-body.swap .status,.card-body.swap .status-sub{animation:.45s fade}@keyframes fade{0%{opacity:0;transform:translateY(3px)}to{opacity:1;transform:none}}.hint{color:var(--ink-soft);opacity:.8;pointer-events:none;white-space:nowrap;font-size:11px;position:fixed;bottom:104px;left:50%;transform:translate(-50%)}.dock{background:var(--panel);border:1px solid var(--line);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:22px;align-items:center;gap:8px;max-width:calc(100vw - 24px);padding:10px 12px 10px 22px;display:flex;position:fixed;bottom:clamp(14px,3vh,28px);left:50%;transform:translate(-50%);box-shadow:0 10px 30px #6e563a1f}.dock-label{white-space:nowrap;margin-right:14px}.dock-title{margin-top:4px;font-size:13px;font-weight:700}.dock-actions{scrollbar-width:none;gap:2px;display:flex;overflow-x:auto}.dock-actions::-webkit-scrollbar{display:none}.act{width:58px;color:var(--ink);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:12px;flex:none;justify-items:center;gap:3px;padding:6px 0 5px;transition:background .2s,transform .2s;display:grid}.act .ic{font-size:20px;line-height:1}.act .lb{color:var(--ink-soft);font-size:10px}.act:hover{background:#ece3d099}.act:active{transform:scale(.95)}.act.on{background:var(--active)}.act.on .lb{color:var(--ink);font-weight:700}.auto{background:var(--sage);color:#fdfbf5;height:40px;font:inherit;cursor:pointer;border:0;border-radius:12px;flex:none;align-items:center;gap:6px;margin-left:6px;padding:0 16px;font-size:13px;font-weight:700;transition:background .2s,opacity .2s;display:flex}.auto:hover{background:var(--sage-deep)}.auto.off{color:#fff;background:#cfc4ad}.auto span{font-size:11px}.pause{width:40px;height:40px;color:var(--ink);cursor:pointer;background:0 0;border:0;border-radius:12px;flex:none;place-items:center;display:grid}.pause:hover{background:#ece3d099}.pause svg{fill:currentColor}.pause .i-play,.pause.paused .i-pause{display:none}.pause.paused .i-play{display:block}button:focus-visible{outline:2px solid var(--sage);outline-offset:2px}.tip{color:#fdf8ee;pointer-events:none;white-space:nowrap;background:#4a3a2ce0;border-radius:999px;padding:5px 10px;font-size:12px;position:fixed;transform:translate(-50%,calc(-100% - 14px))}.door-bubble{pointer-events:none;transform-origin:50% 100%;z-index:5;filter:drop-shadow(0 4px 10px #7860a038);width:168px;position:fixed;transform:translate(-50%,-100%)}.door-bubble svg{width:100%;height:auto;display:block;overflow:visible}.door-bubble .db-shape{fill:#fffaf3;stroke:#b9a6dd;stroke-width:1.6px;stroke-dasharray:5 3.5}.door-bubble text{font-family:var(--font);letter-spacing:.08em;fill:#6b5a8a;font-size:15px;font-weight:600}.door-bubble .db-spark{fill:#c7b3ef;transform-box:fill-box;transform-origin:50%;animation:1.4s ease-in-out infinite db-twinkle}.door-bubble .db-spark.s2{fill:#f2c45a;animation-delay:.45s}.door-bubble .db-spark.s3{animation-delay:.9s}.door-bubble.pop svg{animation:.42s cubic-bezier(.34,1.56,.64,1) both db-pop,2.4s ease-in-out .42s infinite db-float}.door-bubble.leaving{opacity:0;transition:opacity .3s}@keyframes db-pop{0%{opacity:0;transform:scale(.4)translateY(10px)}}@keyframes db-float{50%{transform:translateY(-3px)}}@keyframes db-twinkle{50%{opacity:.5;transform:scale(.55)}}@media (width<=760px){.hero .lead{display:none}.card{width:210px;padding:12px 14px;top:96px;bottom:auto;left:16px}.card-body{margin-top:10px;padding-top:10px}.dock{max-width:none;padding:8px;left:12px;right:12px;transform:none}.dock-label{display:none}.dock-actions{flex:1;gap:0;min-width:0}.act{flex:1 1 0;width:auto;min-width:0}.act .ic{font-size:18px}.auto{justify-content:center;width:40px;margin-left:2px;padding:0}.auto .tx{display:none}.pause{width:34px}.hint{bottom:92px}}@media (prefers-reduced-motion:reduce){.card-body.swap .status,.card-body.swap .status-sub,.door-bubble.pop svg,.door-bubble .db-spark{animation:none}}.wardrobe{background:var(--panel);border:1px solid var(--line);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;border-radius:22px;width:320px;padding:18px;transition:opacity .25s,transform .25s;position:fixed;top:50%;right:clamp(16px,3vw,40px);transform:translate(16px,-50%);box-shadow:0 16px 40px #6e563a29}.wardrobe.show{opacity:1;transform:translateY(-50%)}.w-head{justify-content:space-between;align-items:flex-start;display:flex}.w-title{margin-top:4px;font-size:16px;font-weight:700}.w-x{color:var(--ink-soft);cursor:pointer;background:0 0;border:0;border-radius:8px;padding:4px 6px;font-size:14px}.w-x:hover{background:var(--active)}.w-tabs{background:#f0e1d799;border-radius:12px;gap:6px;margin:14px 0 12px;padding:4px;display:flex}.w-tab{font:inherit;color:var(--ink-soft);cursor:pointer;background:0 0;border:0;border-radius:9px;flex:1;padding:7px 0;font-size:13px}.w-tab.on{color:var(--ink);background:#fff;font-weight:700;box-shadow:0 2px 6px #6e563a14}.w-grid{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.w-item{font:inherit;cursor:pointer;background:#fff9;border:1.5px solid #0000;border-radius:14px;justify-items:center;gap:6px;padding:10px 4px 8px;transition:border-color .15s,transform .15s;display:grid}.w-item:hover{transform:translateY(-1px)}.w-item.on{border-color:var(--sage);background:#fff}.sw{border:1px solid #6e563a1f;border-radius:50%;width:34px;height:34px}.sw.emoji{background:#fbf1ea;border:0;place-items:center;font-size:20px;display:grid}.w-item img.sticker.art{vertical-align:0;width:40px;height:40px;margin:-3px 0}.w-lb{color:var(--ink);white-space:nowrap;font-size:11px}.w-foot{gap:8px;margin-top:14px;display:flex}.w-random,.w-done{height:40px;font:inherit;cursor:pointer;border:0;border-radius:12px;flex:1;font-size:13px;font-weight:700}.w-random{background:var(--active);color:var(--ink)}.w-done{background:var(--sage);color:#fff}.greeting{z-index:10;opacity:0;place-items:center;transition:opacity .25s;display:grid;position:fixed;inset:0}.greeting.show{opacity:1}.greeting[hidden],.wardrobe[hidden]{display:none}.g-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#5a403859;position:absolute;inset:0}.g-stage{place-items:center;width:min(360px,88vw);height:min(560px,82vh);display:grid;position:relative}.g-close{z-index:5;width:34px;height:34px;color:var(--ink);cursor:pointer;background:#fffaf4f2;border:0;border-radius:50%;position:absolute;top:-6px;right:-6px;box-shadow:0 4px 12px #0000001f}.g-hint{color:#fff;letter-spacing:.1em;font-size:12px;transition:opacity .3s;position:absolute;bottom:8%}.g-stage.opening .g-hint{opacity:0}.envelope{aspect-ratio:32/21;cursor:pointer;outline:none;width:min(320px,84vw);transition:transform .5s,opacity .5s;position:relative}.envelope:hover{transform:translateY(-3px)rotate(-1deg)}.env-back,.env-front,.env-flap{border-radius:20px;position:absolute;inset:0}.env-back{background:linear-gradient(#f4b4c3,#f7c3cf);box-shadow:0 14px 30px #963c5038,0 3px 8px #963c501f}.envelope:after{content:"";z-index:5;pointer-events:none;border-radius:20px;transition:opacity .2s;position:absolute;inset:0;box-shadow:inset 0 0 0 1.5px #ffffff59}.g-stage.flap .envelope:after{opacity:0}.env-front{z-index:2;pointer-events:none}.env-front svg,.env-flap svg{width:100%;height:100%;display:block;overflow:visible}.env-flap{transform-origin:top;z-index:3;transition:transform .45s,z-index 0s .22s;transform:perspective(700px)rotateX(0)}.seal{z-index:4;background:radial-gradient(circle at 38% 32%,#ec7f92,#d9566e 60%,#c9465f);border-radius:50%;place-items:center;width:58px;height:58px;margin:-33px 0 0 -29px;transition:opacity .3s .15s;display:grid;position:absolute;top:61%;left:50%;box-shadow:0 4px 10px #a0284652,0 1px 2px #a028464d}.seal i{background:inherit;border-radius:50%;transition:transform .35s;position:absolute;inset:0;box-shadow:inset 0 0 0 6px #be324e8c,inset 0 2px 1px 6px #ffffff2e,inset 0 -2px 3px 8px #961e3c2e}.seal i:first-child{clip-path:polygon(0 0,55% 0,45% 100%,0 100%)}.seal i:nth-child(2){clip-path:polygon(55% 0,100% 0,100% 100%,45% 100%)}.seal img{object-fit:cover;filter:drop-shadow(0 1.5px 1px #781e2d66);border-radius:50%;width:44px;height:44px;position:relative;transform:scale(1.12)}.peek{z-index:1;background:linear-gradient(160deg, var(--c1), var(--c2));color:#8a3f48;letter-spacing:.2em;opacity:0;border-radius:8px;place-items:start center;height:80%;padding-top:10px;font-weight:700;transition:transform .55s;display:grid;position:absolute;top:10%;left:8%;right:8%}.g-stage.cracked .seal i:first-child{transform:translate(-6px,4px)rotate(-18deg)}.g-stage.cracked .seal i:nth-child(2){transform:translate(6px,4px)rotate(18deg)}.g-stage.cracked .seal img{opacity:0;transition:opacity .2s}.g-stage.flap .seal{opacity:0}.g-stage.flap .env-flap{z-index:0;transform:perspective(700px)rotateX(180deg)}.g-stage.flap .peek{opacity:1}.g-stage.pulled .peek{transform:translateY(-62%)}.g-stage.opened .envelope{opacity:0;pointer-events:none;transform:translateY(40%)scale(.9)}.g-card{perspective:1400px;opacity:0;pointer-events:none;width:min(330px,86vw);height:min(470px,74vh);transition:opacity .45s,transform .45s;position:absolute;transform:scale(.7)translateY(-10%)}.g-stage.opened .g-card{opacity:1;pointer-events:auto;transform:none}.cover,.page{border-radius:18px;position:absolute;inset:0;box-shadow:0 18px 40px #5a323240}.cover{background:linear-gradient(165deg, var(--c1), var(--c2));transform-origin:top;backface-visibility:hidden;color:#7a3a42;flex-direction:column;justify-content:center;align-items:center;transition:transform .6s cubic-bezier(.5,.05,.3,1),opacity .2s .45s;display:flex}.g-stage.done .cover{opacity:0;pointer-events:none;transform:rotateX(178deg)}.g-stage.opened:not(.done) .cover{cursor:pointer;touch-action:none;outline:none;animation:2.6s ease-in-out .8s infinite cover-nudge}.cover.dragging{transition:none;animation:none!important}.cover:focus-visible{box-shadow:0 0 0 3px #fff,0 18px 40px #5a323240}@keyframes cover-nudge{0%,70%,to{transform:rotateX(0)}82%{transform:rotateX(14deg)}}.cover-hint{letter-spacing:.12em;opacity:.7;flex-direction:column;align-items:center;gap:2px;font-size:11px;display:flex;position:absolute;bottom:16px}.cover-hint span{font-size:14px;line-height:1;animation:1.6s ease-in-out infinite hint-up}@keyframes hint-up{50%{transform:translateY(-4px)}}.cover-year{font-family:var(--latin);letter-spacing:.25em;opacity:.75;font-size:11px}.cover-sheep{aspect-ratio:1;object-fit:contain;filter:drop-shadow(0 10px 14px #78323c2e);width:74%}.cover-title{letter-spacing:.25em;text-indent:.25em;font-size:30px;font-weight:700}.cover-scene{opacity:.75;letter-spacing:.15em;margin-top:6px;font-size:12px}.page{background:#fffaf3;flex-direction:column;padding:30px 26px 20px;display:flex;overflow:auto}.salute{color:#5c4038;font-size:17px;font-weight:700}.body{color:#5c4038;flex:1;margin-top:14px;font-size:16px;line-height:2}.sign{text-align:right;color:#8a5a50;margin-bottom:16px;font-size:15px;font-weight:700}.sticker{vertical-align:-.45em;isolation:isolate;background:#fdeef0;border-radius:50%;place-items:center;width:1.7em;height:1.7em;margin:0 .1em;font-size:1em;font-style:normal;display:inline-grid;position:relative}.sticker.word{color:#ffe2a8;background:0 0;font-size:.85em;font-weight:700}.sticker.word:before{content:"";z-index:-1;background:#e4525d;border-radius:4px;position:absolute;inset:.22em;transform:rotate(45deg)}img.sticker.art{vertical-align:-.7em;object-fit:contain;background:0 0;border-radius:0;width:2.3em;height:2.3em;margin:0 .05em}img.sticker.art.pending{background:#ffffff8c;border-radius:50%;animation:1s ease-in-out infinite alternate sticker-wait}@keyframes sticker-wait{to{opacity:.4}}.c-st img.sticker.art{vertical-align:0;width:34px;height:34px;margin:0}.reply{color:#fff;height:44px;font:inherit;cursor:pointer;background:#e391a6;border:0;border-radius:14px;font-size:15px;font-weight:700}.reply:hover{background:#d67a93}.brand{text-align:center;color:var(--ink-soft);margin-top:12px;font-size:11px}.brand a{color:inherit}.g-stage.instant .envelope,.g-stage.instant .g-card,.g-stage.instant .cover{transition:opacity .3s}@media (width<=760px){.wardrobe{width:auto;padding:12px;inset:auto 12px 86px;transform:translateY(16px)}.wardrobe.show{transform:none}.wardrobe .eyebrow{display:none}.w-title{margin:0;font-size:14px}.w-tabs{margin:8px 0}.w-tab{padding:5px 0}.w-grid{grid-template-columns:repeat(5,1fr);gap:4px;max-height:30vh;overflow-y:auto}.w-item{gap:3px;padding:6px 2px}.sw{width:26px;height:26px}.sw.emoji{font-size:16px}.w-item img.sticker.art{width:30px;height:30px;margin:-2px 0}.w-lb{font-size:10px}.w-foot{margin-top:8px}.w-random,.w-done{height:34px}}@media (prefers-reduced-motion:reduce){.envelope,.g-card,.cover,.peek,.env-flap,.seal,.seal i{transition:opacity .3s!important}.g-stage.opened:not(.done) .cover,.cover-hint span{animation:none}}.composer{flex-direction:column;width:360px;max-height:calc(100vh - 160px);display:flex}.composer .c-body{margin:0 -4px;padding:0 4px 2px;overflow-y:auto}.c-scenes{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.c-scene{background:linear-gradient(165deg, var(--c1), var(--c2));font:inherit;color:#7a3a42;cursor:pointer;border:2px solid #0000;border-radius:14px;justify-items:center;gap:2px;padding:6px 4px 8px;display:grid}.c-scene img{aspect-ratio:1;object-fit:contain;width:100%}.c-scene b{letter-spacing:.1em;font-size:12px}.c-scene span{opacity:.75;font-size:10px}.c-scene.on{box-shadow:0 0 0 2px var(--sage);border-color:#fff}.c-field{color:var(--ink);gap:6px;margin-top:12px;font-size:12px;font-weight:700;display:grid}.c-field small{color:var(--ink-soft);margin-left:4px;font-weight:400}.c-field input,.c-editor{width:100%;font:inherit;color:var(--ink);background:#fffdf9;border:1px solid #6e563a2e;border-radius:12px;padding:9px 12px;font-size:14px;font-weight:400}.c-field input:focus,.c-editor:focus{outline:2px solid var(--sage);outline-offset:0;border-color:#0000}.c-editor{white-space:pre-wrap;word-break:break-word;min-height:110px;max-height:180px;line-height:1.9;overflow-y:auto}.c-editor:empty:before{content:attr(data-placeholder);color:#b9a898}.c-meta{color:var(--ink-soft);align-items:center;gap:10px;font-size:11px;font-weight:400;display:flex}.c-meta .over{color:#d34a5a;font-weight:700}.c-link{font:inherit;color:#c46a82;cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0;font-size:11px;text-decoration:underline}.c-stickers{flex-wrap:wrap;gap:4px;display:flex}.c-st{cursor:pointer;background:#ffffffb3;border:0;border-radius:10px;place-items:center;width:42px;height:42px;font-size:15px;display:grid}.c-st:hover{background:#fff}.c-nav,.c-row{justify-content:space-between;gap:8px;margin-top:14px;display:flex}.c-row>*{flex:1}.c-next,.c-back,.c-line{height:40px;font:inherit;cursor:pointer;border:0;border-radius:12px;padding:0 14px;font-size:13px;font-weight:700}.c-next{background:var(--sage);color:#fff}.c-back{background:var(--active);color:var(--ink)}.c-line{color:#fff;background:#06c755}.c-next:disabled,.c-back:disabled,.c-line:disabled{opacity:.4;cursor:not-allowed}.c-summary{align-items:center;gap:12px;margin-top:4px;display:flex}.c-summary img{aspect-ratio:1;background:linear-gradient(165deg, var(--c1), var(--c2));border-radius:14px;width:84px}.c-sum-t{letter-spacing:.15em;font-size:16px;font-weight:700}.c-problems{color:#b8404f;background:#fdecee;border-radius:12px;margin:12px 0 0;padding:10px 12px 10px 28px;font-size:12px;line-height:1.7}.c-login,.c-done{text-align:center;gap:10px;margin-top:4px;display:grid}.c-login-t,.c-done-t{font-size:16px;font-weight:700}.c-login-s{color:var(--ink-soft);font-size:12px;line-height:1.7}.c-proto{color:#b09080;background:#fbf3ea;border-radius:10px;padding:8px 10px;font-size:11px;line-height:1.6}.c-done .c-field{text-align:left}body.recipient #scene{filter:blur(7px)saturate(1.05);transform:scale(1.05)}body.recipient .hero,body.recipient .card,body.recipient .dock,body.recipient .hint,body.recipient .tip,body.recipient .door-bubble,body.recipient .wardrobe,body.recipient .about-link{display:none}.greeting.recipient .g-backdrop{-webkit-backdrop-filter:none;backdrop-filter:none;background:#fff4f040}.g-top{color:#6b4a45;letter-spacing:.05em;text-align:center;font-size:14px;font-weight:700;transition:opacity .3s;position:absolute;top:4%}.greeting.preview .g-top{color:#fff;font-size:12px;font-weight:400}.g-stage.opened .g-top{opacity:0}.greeting.recipient .g-hint{color:#8a5a55}.reply.ghost{background:var(--active);color:var(--ink)}@media (width<=760px){.composer{width:auto;max-height:62vh}.c-scenes{grid-template-columns:repeat(6,1fr);gap:4px}.c-scene b{letter-spacing:0;font-size:10px}.c-scene span{display:none}}
