:root{--forest:#183c31;--dark:#102820;--cream:#fff7e6;--paper:#fffaf0;--gold:#e7c47e;--ink:#243d32;--green:#557358}
*{box-sizing:border-box}html{-webkit-text-size-adjust:100%}html,body{margin:0;min-height:100%;background:#0b221c;color:var(--cream);font-family:"PingFang SC","Noto Sans CJK SC","Microsoft YaHei",sans-serif}button{font:inherit;cursor:pointer}button:focus-visible{outline:3px solid #ffdf84;outline-offset:3px}button:disabled{cursor:wait}img{display:block;max-width:100%}[hidden]{display:none!important}
.app{position:relative;isolation:isolate;width:min(100%,480px);min-height:100vh;min-height:100dvh;margin:auto;overflow:hidden;background:#1d4735;box-shadow:0 0 60px #0008}
.entry-gate{position:absolute;inset:0;z-index:60;display:grid;place-items:center;padding:24px;background:linear-gradient(180deg,#102d25a8,#0a211be8);backdrop-filter:blur(2px)}.entry-card{position:relative;width:min(100%,390px);padding:27px 25px 24px;text-align:center;color:var(--ink);background:#fff8e8;border:3px solid #d9b875;box-shadow:0 12px 0 #153629,0 24px 52px #061d18c9}.entry-card:before{content:"";position:absolute;inset:7px;border:1px solid #ddc99d;pointer-events:none}.entry-kicker{position:relative;color:#688662;font-size:13px;font-weight:800;letter-spacing:.12em}.entry-card h1{position:relative;margin:10px 0 7px;font:600 30px/1.25 "Songti SC","STSong",serif}.entry-card p{position:relative;margin:0 0 22px;font:600 18px "Songti SC","STSong",serif;letter-spacing:.08em}.entry-card p span{color:#b78d4f;margin:0 8px}.entry-primary{position:relative;width:100%;min-height:62px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;border:2px solid #9d7940;background:#e9c77f;color:#213e31;box-shadow:inset 0 -5px #d4aa60;font-size:18px;font-weight:850}.entry-primary small{font-size:13px;font-weight:700;color:#4f684f}.entry-primary:active{transform:translateY(2px)}.entry-muted{position:relative;min-width:120px;min-height:44px;margin-top:10px;border:0;background:transparent;color:#4f6d59;text-decoration:underline;text-underline-offset:4px;font-size:14px;font-weight:750}.entry-note{position:relative;min-height:20px;margin-top:7px;color:#687d68;font-size:13px}.entry-primary:disabled,.entry-muted:disabled{cursor:wait;opacity:.72}
.opening-art,.opening-arrived,.forest-art{position:absolute;inset:0;background-position:center center;background-size:cover;transition:opacity 850ms ease,transform 1200ms ease;pointer-events:none}
.opening-art{background-image:url('assets/opening-pre.webp');opacity:1;transform:scale(1.03);animation:opening-breathe 4.5s ease-in-out infinite alternate}.opening-arrived{background-image:url('assets/opening.webp');opacity:0;transform:scale(1.03)}.app[data-arrived="true"] .opening-arrived{opacity:1}.forest-art{background-image:url('assets/forest.webp');opacity:0;transform:scale(1.05)}
.app[data-view="pov"] .opening-art,.app[data-view="pov"] .opening-arrived{opacity:0;transform:scale(1.22)}.app[data-view="pov"] .forest-art{opacity:1;transform:scale(1)}
.app:before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(to bottom,#0a241d80 0%,transparent 22%,transparent 53%,#0d2d2577 69%,#0c2b24de 100%)}
.light-particles{position:absolute;inset:0;z-index:2;pointer-events:none;overflow:hidden}.light-particles i{position:absolute;top:17%;left:17%;width:3px;height:3px;background:#ffebad99;box-shadow:0 0 9px #ffe3a6;animation:drift 7s linear infinite}.light-particles i:nth-child(2){top:35%;left:84%;animation-delay:-2.2s}.light-particles i:nth-child(3){top:54%;left:63%;animation-delay:-4.5s}
.ground-shadow{position:absolute;z-index:2;left:15%;right:12%;top:70%;height:5%;background:#0f281858;border-radius:50%;filter:blur(8px);opacity:0;transition:opacity .7s}.app[data-view="pov"] .ground-shadow{opacity:1}
.couple{position:absolute;z-index:3;left:50%;bottom:16%;width:min(91%,430px);max-width:none;object-fit:contain;transform:translateX(-50%) translateY(8px);opacity:0;filter:drop-shadow(0 5px 3px #071d1780);transition:opacity 380ms ease,transform 450ms cubic-bezier(.2,.65,.22,1);image-rendering:pixelated;pointer-events:none}
.app[data-view="pov"] .couple{opacity:1;transform:translateX(-50%) translateY(0)}.app[data-pose="wave-photo"] .couple{width:min(96%,455px);bottom:11%;transform:translateX(-50%) translateY(-5px) rotate(-.25deg)}.app[data-pose="heart-photo"] .couple{width:min(88%,420px);bottom:14%;transform:translateX(-50%) translateY(-5px)}.app[data-state="photo"] .couple{opacity:0}
.app[data-pose="handoff"] .couple{transform:translateX(-59%) translateY(0)}.app[data-pose^="walk-"] .couple{width:min(90%,430px);bottom:12%;transition:opacity 220ms ease,transform 680ms cubic-bezier(.22,.61,.36,1)}.app[data-pose="walk-1"] .couple{transform:translateX(-58%) translateY(-1px) rotate(-.2deg)}.app[data-pose="walk-2"] .couple{transform:translateX(-52%) translateY(-8px) rotate(.12deg)}.app[data-pose="walk-3"] .couple{transform:translateX(-46%) translateY(-2px) rotate(-.12deg)}.app[data-pose="walk-4"] .couple{transform:translateX(-40%) translateY(-7px) rotate(.08deg)}.app[data-pose^="walk-"] .forest-art{transform:scale(1.035) translateX(-1.1%)}.app[data-pose^="walk-"] .ground-shadow{transform:translateX(5%);transition:opacity .7s,transform 2.8s ease-out}.app[data-pose="bouquet-mid"] .couple,.app[data-pose="bouquet-final"] .couple{width:min(85%,405px);bottom:15%}.app[data-pose="bouquet-final"] .couple{transform:translateX(-50%) translateY(-8px)}
.finder{position:absolute;z-index:4;top:19%;left:6%;right:6%;height:41%;opacity:0;transform:scale(1.04);transition:opacity .5s,transform .7s;pointer-events:none}.app[data-view="pov"] .finder{opacity:1;transform:scale(1)}.finder i{position:absolute;width:28px;height:28px;border:solid var(--gold)}.finder i:nth-child(1){top:0;left:0;border-width:3px 0 0 3px}.finder i:nth-child(2){top:0;right:0;border-width:3px 3px 0 0}.finder i:nth-child(3){bottom:0;left:0;border-width:0 0 3px 3px}.finder i:nth-child(4){bottom:0;right:0;border-width:0 3px 3px 0}.finder-center{position:absolute;top:50%;left:50%;width:12px;height:12px;margin:-6px;border:1px solid #f9e7b5a0;border-radius:50%;opacity:.7}.app[data-state="acting"] .finder{animation:finder-focus 800ms ease-in-out 1}
.camera-focus{position:absolute;z-index:3;left:12%;top:47%;width:16px;height:16px;border:1px solid #f5d682a0;border-radius:50%;opacity:0;pointer-events:none;animation:camera-focus 1.5s ease-out 1}.shutter{position:absolute;inset:0;z-index:11;background:#fff6df;opacity:0;pointer-events:none}.app.shot .shutter{animation:shutter 360ms ease-out 1}
.topbar{position:absolute;top:0;left:0;right:0;z-index:20;padding:calc(12px + env(safe-area-inset-top)) 14px 0;display:flex;align-items:flex-start;justify-content:space-between;gap:5px}.names{font-weight:800;font-size:15px;line-height:44px;white-space:nowrap;text-shadow:0 2px 6px #10251c}.names span{font:normal 19px "Songti SC",serif;color:#f1ce8c;margin:0 2px}.top-actions{display:flex;gap:7px}.top-btn{min-height:44px;padding:0 9px;border:1px solid #f5e7bfaf;background:#173b32dc;color:#fff4d9;border-radius:4px;font-size:14px;font-weight:700;white-space:nowrap}.info-btn:before{content:"✦ ";color:#f5d189}.top-btn:active,.choice:active{transform:translateY(2px)}
.chapter{position:absolute;z-index:7;top:calc(73px + env(safe-area-inset-top));left:19px;border-left:3px solid var(--gold);background:#183c32ce;padding:7px 11px;font-size:14px;letter-spacing:.03em;font-weight:750;color:#fff5d9}.status-tag{position:absolute;z-index:7;right:20px;top:calc(123px + env(safe-area-inset-top));background:#fff5d9de;color:#294837;font-size:14px;font-weight:750;padding:6px 9px;opacity:0;transition:opacity .2s}.status-tag:not(:empty){opacity:1}
.dialogue{position:absolute;z-index:9;left:17px;right:17px;bottom:calc(58px + env(safe-area-inset-bottom));padding:15px 16px 13px;border:2px solid #c6a363;background:var(--cream);color:var(--ink);box-shadow:5px 6px 0 #132e24e0;min-height:154px}.dialogue:before{content:"";position:absolute;inset:5px;border:1px solid #e2d4a7;pointer-events:none}.dialogue-top{display:flex;align-items:center;justify-content:space-between;gap:10px}.dialogue-kicker{color:#547254;font-size:14px;font-weight:800}.tiny-star{color:#b8904f}.speaker-row{display:flex;gap:11px;align-items:center;margin:10px 0 6px}.portrait{flex:0 0 51px;height:51px;border:2px solid #bea06e;background:#e5dac0 url('assets/approved-characters.webp') no-repeat;background-size:400px 267px;image-rendering:pixelated}.portrait.bride{background-position:-213px -30px}.portrait.groom{background-position:-122px -22px}.speaker-row p{margin:0;font-size:17px;font-weight:650;line-height:1.4}.speaker-row strong{display:block;color:#60765a;font-size:14px;line-height:1.2;margin-bottom:3px}.choices{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-top:14px}.choice{min-height:55px;padding:6px 9px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;border:2px solid #af8b51;background:#eac981;color:#243b30;box-shadow:inset 0 -4px #d4ad64;border-radius:2px;text-align:center;font-size:17px;font-weight:800;transition:transform .1s,filter .15s}.choice small{font-size:14px;font-weight:650}.choice.secondary{background:#fff9e9;box-shadow:inset 0 -4px #e4d8ba}.choice[aria-pressed="true"]{filter:brightness(1.12);outline:2px solid #456a4d;outline-offset:2px}.dialogue-foot{font-size:14px;color:#60775d;text-align:center;margin-top:11px;line-height:1.3}.dialogue-foot:empty{display:none}
.lower-tools{position:absolute;z-index:10;left:17px;right:17px;bottom:calc(9px + env(safe-area-inset-bottom));display:flex;align-items:center;justify-content:center;gap:10px}.text-btn{border:0;background:#123a2dcb;color:#fff4db;text-decoration:underline;text-underline-offset:3px;font-size:14px;min-height:44px;padding:5px 8px;border-radius:3px}.tool-divider{color:#f1d893}
.app[data-state="photo"] .lower-tools,.app[data-state="photo-error"] .lower-tools{display:none}
.app[data-state="invite"] .lower-tools,.app[data-state="invite"] .chapter,.app[data-state="invite"] .status-tag,.app[data-state="invite"] .couple,.app[data-state="invite"] .finder,.app[data-state="invite"] .ground-shadow,.app[data-state="invite"] .dialogue,.app[data-state="invite"] .photo-panel{display:none}
.photo-panel{position:absolute;z-index:8;inset:calc(133px + env(safe-area-inset-top)) 15px calc(58px + env(safe-area-inset-bottom));display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:12px}.photo-card{margin:0;padding:9px 9px 12px;background:#fffaf0;color:#415e4b;box-shadow:0 10px 28px #0b261dc9;transform:rotate(-.6deg);animation:photo-enter .65s cubic-bezier(.18,.75,.22,1) both}.photo-card img{width:100%;height:min(39dvh,330px);min-height:180px;object-fit:contain;background:#244737}.photo-card figcaption{padding:9px 7px 0;font-size:16px;font-weight:750}.photo-actions{display:grid;grid-template-columns:1fr 1fr;gap:9px}.photo-actions .choice{min-height:49px;font-size:16px}
.photo-open{display:block;width:100%;padding:0;border:0;background:#244737}.photo-open:focus-visible{outline-offset:4px}
.veil{position:fixed;inset:0;z-index:29;background:#061d18ad;backdrop-filter:blur(2px)}.info-sheet{position:absolute;z-index:30;left:15px;right:15px;top:50%;max-height:calc(100dvh - 40px);overflow:auto;transform:translateY(-50%);background:var(--paper);color:var(--ink);border:3px solid #ddbc7e;padding:20px 19px 22px;text-align:center;box-shadow:0 13px 0 #153429,0 21px 40px #071d18b8}.info-sheet:before{content:"";position:absolute;inset:7px;border:1px solid #decda2;pointer-events:none}.sheet-top{display:flex;align-items:center;justify-content:space-between;color:#6c8b64;font-size:14px;font-weight:800;letter-spacing:.16em}.close-btn{min-width:44px;min-height:44px;border:1px solid #cfba8e;background:#f7e7c4;color:#294938;font-size:30px;line-height:1;border-radius:2px}.info-sheet h1{font:600 27px/1.2 "Songti SC","STSong",serif;margin:9px 0 4px}.invite-sentence{font:500 18px/1.3 "Songti SC","STSong",serif;margin:0}.rule{height:1px;width:72%;background:#d8bf91;margin:21px auto 19px;position:relative}.rule span{position:absolute;top:-10px;left:calc(50% - 12px);width:24px;background:var(--paper);color:#b9975f}.invite-names{font:600 20px "Songti SC","STSong",serif;letter-spacing:.05em}.invite-names span{color:#b18b4e;margin:0 7px}.date{display:flex;align-items:center;justify-content:center;gap:11px;margin-top:16px}.date b{font:600 43px/.95 "Songti SC",serif}.date span{font-size:15px;color:#59705a}.dinner{font-size:17px;font-weight:800;margin:16px 0 0}.venue{font-size:22px;font-weight:850;margin:15px 0 0}.info-sheet address{font-size:16px;font-style:normal;line-height:1.55;color:#506951;margin:7px 0 0}.sheet-end{font-size:15px;color:#657a63;margin:20px 0 0}
.image-sheet{position:absolute;z-index:30;inset:0;display:flex;align-items:center;justify-content:center;padding:62px 12px 26px}.image-sheet .close-btn{position:absolute;top:calc(13px + env(safe-area-inset-top));right:15px}.image-sheet img{max-height:100%;width:100%;object-fit:contain;box-shadow:0 12px 30px #0008}

.choices.stacked{grid-template-columns:1fr}.choices.stacked .choice{min-height:51px;flex-direction:row;justify-content:space-between;padding:7px 13px}.choices.stacked .choice small{font-size:14px}.finder>span{position:absolute;top:50%;left:50%;width:12px;height:12px;margin:-6px;border:1px solid #f9e7b5a0;border-radius:50%;opacity:.7}
.invite-screen{position:absolute;z-index:8;inset:calc(66px + env(safe-area-inset-top)) 12px calc(12px + env(safe-area-inset-bottom));overflow:auto;scrollbar-width:none;padding:4px 3px 3px}.invite-screen::-webkit-scrollbar{display:none}.app[data-state="invite"]:before{background:linear-gradient(#0b271fa3,#0b271fc9)}.app[data-state="invite"] .forest-art{filter:brightness(.42) saturate(.76) blur(.5px);transform:scale(1.04)}.chosen-strip{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin:0 7px 10px}.chosen-strip figure{margin:0;background:#f9f0d7;padding:5px 5px 6px;box-shadow:0 5px 13px #071f19aa;transform:rotate(-1deg)}.chosen-strip figure:nth-child(2){transform:rotate(1.3deg)}.chosen-strip img{width:100%;height:auto;aspect-ratio:3/2;object-fit:contain;object-position:center;background:#29493b}.chosen-strip figcaption{color:#506a54;font-size:14px;font-weight:800;padding:5px 3px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.invite-card{position:relative;background:var(--paper);color:var(--ink);border:3px solid #dcbc7f;box-shadow:0 9px 0 #153629,0 15px 30px #061d18aa;text-align:center;padding:14px 16px 16px}.invite-card:before{content:"";position:absolute;inset:7px;border:1px solid #ddcda3;pointer-events:none}.invite-script{color:#688763;font-size:13px;letter-spacing:.18em;font-weight:800}.invite-card h1{font:600 27px/1.12 "Songti SC","STSong",serif;margin:5px 0 2px}.invite-line{font:500 16px/1.3 "Songti SC","STSong",serif;margin:0;color:#526c57}.invite-rule{height:1px;width:67%;background:#d9bf90;margin:13px auto 11px;position:relative}.invite-rule span{position:absolute;top:-10px;left:calc(50% - 12px);width:24px;background:var(--paper);color:#b68f53}.invite-names{font:600 19px "Songti SC","STSong",serif;letter-spacing:.08em;margin:0}.invite-names span,.info-names span{color:#b88d4c;margin:0 7px}.date-row,.info-date{display:flex;align-items:center;justify-content:center;gap:11px;margin-top:11px}.date-row b,.info-date b{font:600 38px/.95 "Songti SC",serif}.date-row span,.info-date span{font-size:14px;color:#58705b;text-align:left}.invite-card .dinner{margin-top:10px}.invite-card .venue{margin-top:9px}.invite-card address,.info-sheet address{font-size:16px;font-style:normal;line-height:1.42;color:#506853;margin:5px 0 0}.invite-actions{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:13px 4px 0}.invite-action,.sheet-action{display:flex;min-height:46px;align-items:center;justify-content:center;border:2px solid #b08a4e;background:#fff9e9;color:#274334;text-decoration:none;font-size:15px;font-weight:800;box-shadow:inset 0 -3px #e4d7b5}.invite-action.primary,.sheet-action{background:#e9c77f;box-shadow:inset 0 -3px #d3aa61}.invite-action.wide{grid-column:1/-1}.replay-action{border-color:#58785d;background:#edf4df;box-shadow:inset 0 -3px #c8d7b9;color:#274c38}.copy-status{min-height:38px;margin:9px 4px 0;color:#667a64;font-size:14px;line-height:1.35}
.info-sheet h2{font:600 27px/1.2 "Songti SC","STSong",serif;margin:10px 0 5px}.info-names{font:600 19px "Songti SC","STSong",serif;letter-spacing:.06em;margin:13px 0}.sheet-action{width:100%;margin-top:17px;position:relative}.info-sheet .dinner{margin-top:13px}.info-sheet .venue{margin-top:10px}
.gallery-sheet{position:absolute;z-index:30;inset:calc(13px + env(safe-area-inset-top)) 11px calc(13px + env(safe-area-inset-bottom));background:#16372f;border:2px solid #d8b978;box-shadow:0 18px 42px #061b16df;padding:15px;display:flex;flex-direction:column;color:#fff4d9}.gallery-head{display:flex;align-items:center;justify-content:space-between}.gallery-head span{font-size:14px;letter-spacing:.14em;color:#d8ce9f;font-weight:800}.gallery-head h2{font:600 22px "Songti SC",serif;margin:3px 0 0}.gallery-sheet figure{flex:1;min-height:0;margin:13px 0 11px;background:#fff9e8;padding:8px;display:flex;flex-direction:column;justify-content:center}.gallery-sheet figure img{width:100%;height:calc(100% - 42px);min-height:0;object-fit:contain;background:#294a3c}.gallery-sheet figcaption{color:#3e5b48;font-size:15px;line-height:1.35;padding:10px 4px 3px;text-align:center;font-weight:700}.gallery-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}.gallery-actions button{min-height:48px;border:2px solid #d0ae6d;background:#fff5db;color:#244236;font-size:16px;font-weight:800}.gallery-actions button:disabled{opacity:.45}.close-btn.floating{position:absolute;top:calc(13px + env(safe-area-inset-top));right:15px}
@keyframes opening-breathe{to{transform:scale(1.07) translateX(-3px)}}@keyframes drift{50%{transform:translate(14px,16px);opacity:.2}to{transform:translate(1px,34px);opacity:0}}@keyframes camera-focus{30%{opacity:1;transform:scale(1.7)}100%{opacity:0;transform:scale(3)}}@keyframes finder-focus{35%{transform:scale(.97)}70%{transform:scale(1.015)}100%{transform:scale(1)}}@keyframes shutter{0%{opacity:0}17%{opacity:.84}55%{opacity:.55}100%{opacity:0}}@keyframes photo-enter{0%{opacity:0;transform:scale(.85) rotate(-2deg) translateY(45px)}75%{opacity:1;transform:scale(1.015) rotate(.2deg) translateY(-4px)}100%{transform:scale(1) rotate(-.6deg) translateY(0)}}
@media(orientation:portrait){.app[data-pose^="walk-"] .couple{width:auto;height:min(54dvh,520px);bottom:32%}.app[data-pose="handoff"] .couple{width:auto;height:min(53dvh,510px);bottom:31%}}
@media(max-height:700px){.entry-gate{padding:13px}.entry-card{padding:18px 20px 16px}.entry-card h1{font-size:25px;margin:6px 0 4px}.entry-card p{margin-bottom:13px}.entry-primary{min-height:56px}.entry-note{margin-top:3px}.couple{width:min(78%,375px);bottom:22%}.app[data-pose^="walk-"] .couple{width:auto;height:min(54dvh,370px);bottom:32%}.app[data-pose="handoff"] .couple{width:auto;height:min(53dvh,360px);bottom:31%}.chapter{top:66px}.dialogue{bottom:51px;padding:10px 13px}.speaker-row{margin:5px 0}.choices{margin-top:8px}.dialogue-foot{margin-top:6px}.photo-panel{top:100px}.photo-card img{height:min(32dvh,240px)}.info-sheet{padding:11px 17px}.info-sheet h2{font-size:24px}.dinner,.venue{margin-top:8px}.chosen-strip{margin-bottom:7px}.chosen-strip figcaption{font-size:13px;padding-top:3px}.invite-screen{inset:62px 8px 7px}.invite-card{min-height:0}.invite-card h1{font-size:23px}.invite-rule{margin:9px auto}.invite-actions{margin-top:9px}.copy-status{margin-top:6px}.gallery-sheet{inset:7px}}
@media(max-width:370px){.names{font-size:14px}.top-btn{padding:0 6px;font-size:14px}.dialogue{left:12px;right:12px;padding:12px}.choice{font-size:16px}.speaker-row p{font-size:16px}.couple{width:95%}}
@media(orientation:landscape){.app{width:100%;max-width:none;min-height:100dvh}.couple{width:auto;height:75%;bottom:6%;left:49%}.dialogue{left:auto;right:2%;width:min(38%,360px);bottom:60px}.photo-panel{left:52%;right:2%;top:80px;bottom:55px}.photo-card img{height:32dvh}.info-sheet{left:25%;right:25%}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
