:root{font-family:Songti SC,"Noto Serif CJK SC",STSong,serif;color:#393b30;background:#eae5d7;font-weight:400;--rust:#9a512f}*{box-sizing:border-box}html{scroll-behavior:smooth;scroll-padding-top:70px}body{margin:0}button,a{-webkit-tap-highlight-color:transparent}button{font:inherit;cursor:pointer;touch-action:manipulation}a{color:inherit}button:focus-visible,a:focus-visible{outline:2px solid #d38c4d;outline-offset:6px}::selection{background:#dca565;color:#24271e}.grain{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:10;opacity:.035;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Cpath fill='%23000' filter='url(%23n)' d='M0 0h180v180H0z'/%3E%3C/svg%3E")}header{position:absolute;top:0;left:0;width:100%;padding:24px 5vw;z-index:12;color:#e8dfc9;font-size:12px;letter-spacing:.15em}header a{text-decoration:none}.music{display:flex;align-items:center;gap:10px;border:1px solid #9a9c8255;color:#ede6d4;background:#25291fed;padding:12px 15px;position:fixed;right:5vw;top:17px;font-size:12px}.bars{display:flex;align-items:center;gap:3px;height:14px}.bars i{width:2px;height:6px;background:#d8af79}.bars i:nth-child(2){height:14px}.bars i:nth-child(3){height:10px}.playing i{animation:wave .9s ease-in-out infinite alternate}.playing i:nth-child(2){animation-delay:-.5s}@keyframes wave{to{transform:scaleY(.3)}}.opening{background:#292d24;color:#e9e0c9;min-height:100svh;padding:90px 5vw 25px;background-image:radial-gradient(ellipse at 15% 60%,#94764c22,transparent 65%)}.opening-layout{max-width:1340px;display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,1fr);gap:7vw;margin:auto;align-items:center}.cover{margin:0;max-width:650px}.cover img{display:block;width:100%;height:auto;box-shadow:0 20px 60px #10140d70}.cover figcaption{font-size:11px;letter-spacing:.14em;color:#d5c9aa;margin-top:13px}.eyebrow{font-size:12px;letter-spacing:.19em}.opening-copy .eyebrow{color:#d0ac77;margin:0 0 25px}.lyrics p{font-size:clamp(12px,1.05vw,15px);line-height:1.85;margin:0 0 6px;letter-spacing:.02em}.lyrics p:nth-child(8){margin-bottom:20px}.invitation{margin-top:26px;border-top:1px solid #c8bb972e;padding-top:18px}.invitation>p{font-size:12px;color:#c4bba2;margin:0}.guitar-button{position:relative;background:none;border:0;color:#eed8b0;width:270px;padding:0;display:block;margin-left:-10px}.guitar-button svg{display:block;width:100%;height:115px;filter:drop-shadow(0 8px 9px #080d0750);transition:transform .5s}.guitar-button:hover svg{transform:rotate(-4deg)}.guitar-button>span{display:block;font-size:13px;letter-spacing:.2em;margin-top:-5px}.opening-foot{max-width:1340px;margin:30px auto 0;border-top:1px solid #c8bb9726;padding-top:18px;display:flex;justify-content:space-between;font-size:11px;letter-spacing:.12em;color:#c5bda6}.chapter{padding:60px 7vw 100px}.chapter-top{display:flex;justify-content:space-between;border-bottom:1px solid #71674d30;padding-bottom:18px;font-size:11px;letter-spacing:.15em;margin-bottom:80px}.youth{background:#eee8da}.youth-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:9vw;align-items:center;max-width:1200px;margin:auto}h1,h2,h3,p{font-weight:400}h1,h2{font-size:clamp(32px,4vw,58px);line-height:1.65;letter-spacing:.04em;margin:20px 0 32px}em{font-style:normal;color:var(--rust)}.rust{color:var(--rust)}.prose{font-size:15px;line-height:2.3;max-width:600px}.prose p{margin:0 0 20px;text-wrap:pretty}.polaroid{position:relative;background:#faf6e9;padding:18px 18px 25px;transform:rotate(3deg);margin:30px 0;box-shadow:0 15px 35px #66543a25}.polaroid img{width:100%;aspect-ratio:4/5;object-fit:cover;filter:sepia(.25) saturate(.7)}.polaroid figcaption{font-size:12px;text-align:center;letter-spacing:.1em;margin-top:20px}.tape{position:absolute;top:-16px;left:35%;width:110px;height:33px;background:#cbbb8c60;transform:rotate(-6deg)}.margin-note{font-size:13px;letter-spacing:.15em;text-align:center;margin:100px 0 0;color:var(--rust)}.roles{background:#e1dac9}.roles>h2{max-width:1200px;margin:0 auto 60px}.role-grid{max-width:1200px;margin:auto;display:grid;grid-template-columns:repeat(4,1fr);gap:28px}.role{border-top:1px solid #82745780;padding-top:18px}.role-number{font-size:11px;color:#8a7152}.role-title{font-size:46px;margin:28px 0 32px;color:#665d45;writing-mode:vertical-rl;letter-spacing:.2em}.role h3{font-size:16px;margin-bottom:18px;color:var(--rust)}.role>p:last-child{font-size:14px;line-height:2.2}.reassurance{text-align:center;margin:130px auto 0;max-width:850px}.reassurance .prose{margin:auto}.big-line{font-size:clamp(30px,4.8vw,68px);line-height:1.6;margin:35px 0 50px}.family{background:#363d30;color:#e9dfc8}.family .chapter-top{border-color:#e9dfc833}.family-grid{max-width:1150px;margin:auto;display:grid;grid-template-columns:1fr 1fr;gap:9vw;align-items:center}.family-statement{position:relative;padding-top:90px}.family-statement>p{position:relative;font-size:13px;letter-spacing:.3em;color:#ead2b0}.family-statement h2{position:relative;font-size:clamp(36px,4.5vw,64px)}.sun{position:absolute;top:0;left:0;width:150px;height:150px;border-radius:50%;background:#bd7d43;box-shadow:0 0 90px #c9955530}.small-note{font-size:12px;letter-spacing:.1em;color:#c6bd9f}.family-last{margin:90px 0 0;text-align:center;font-size:clamp(16px,2vw,26px);letter-spacing:.1em}.letter-section{background:#af764d;padding-bottom:110px}.letter-section>.chapter-top{color:#f2e6cd;border-color:#f2e6cd40}.letter-paper{max-width:820px;margin:auto;background:#f1ead8;box-shadow:0 18px 55px #543a2929;padding:50px 75px 35px;position:relative}.letter-paper:before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:repeating-linear-gradient(90deg,#a15b39 0,#a15b39 20px,#efe7d6 20px,#efe7d6 40px,#6b7a65 40px,#6b7a65 60px,#efe7d6 60px,#efe7d6 80px)}.letter-heading{display:flex;justify-content:space-between;font-size:12px;color:var(--rust);letter-spacing:.2em;border-bottom:1px solid #9d876a40;padding-bottom:20px}.letter-paper h2{font-size:26px;margin:35px 0 25px}.letter-body{animation:pagein .5s ease;font-size:16px;line-height:2.5;min-height:590px}.letter-body p{margin:0 0 23px;text-wrap:pretty}.signature{text-align:right;font-size:18px;margin:40px 0}.letter-controls{display:flex;justify-content:space-between;align-items:center;border-top:1px solid #9d876a40;padding-top:25px;font-size:12px;color:#87684e}.letter-controls button{background:transparent;border:0;color:#76533a;padding:12px 0 12px 20px;min-height:44px}@keyframes pagein{0%{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}footer{text-align:center;background:#eae4d6;padding:100px 20px 40px}footer h2{font-size:clamp(36px,5vw,70px);margin-top:30px}footer>p{font-size:14px}footer a{display:block;font-size:12px;margin:55px 0;text-underline-offset:8px}footer small{display:block;font-size:10px;color:#786c58}.reveal{opacity:0;translate:0 20px;transition:opacity 1s ease,translate 1s ease}.reveal.visible{opacity:1;translate:0 0}.error{position:fixed;right:20px;top:65px;padding:15px;background:#eee8da;z-index:20;font-size:12px}main[hidden]{display:none}@media(max-width:900px){.opening-layout{gap:5vw}.lyrics p{font-size:11px}.opening-copy .eyebrow{font-size:10px}.guitar-button{width:220px}.role-grid{grid-template-columns:repeat(2,1fr)}.chapter{padding:45px 6vw 75px}.chapter-top{margin-bottom:55px}.youth-grid{gap:6vw}.prose{font-size:14px}.family-grid{gap:6vw}}@media(max-width:600px){header{padding:24px 6vw;font-size:10px}.music{right:5vw;top:15px;padding:10px 11px;font-size:10px}.opening{padding:78px 6vw 22px}.opening-layout{display:block}.cover{max-width:460px;margin:auto}.cover figcaption{font-size:10px}.opening-copy{padding-top:35px}.opening-copy .eyebrow{font-size:11px;margin-bottom:25px}.lyrics p{font-size:clamp(11px,3.05vw,15px);line-height:2;margin-bottom:7px;letter-spacing:0}.lyrics p:nth-child(8){margin-bottom:22px}.invitation{margin-top:30px}.guitar-button{width:250px;margin:10px auto}.invitation>p{text-align:center}.opening-foot{font-size:9px;letter-spacing:0;margin-top:30px}.chapter{padding:35px 7vw 65px}.chapter-top{font-size:10px;letter-spacing:.06em;margin-bottom:45px;gap:15px}.chapter-top>span:last-child{text-align:right;max-width:145px}.youth-grid,.family-grid{display:block}.youth h1{font-size:34px}.prose{font-size:15px;line-height:2.25}.polaroid{width:85%;margin:65px auto 0;padding:13px 13px 22px}.polaroid img{aspect-ratio:1}.polaroid figcaption{font-size:10px}.margin-note{margin-top:65px;font-size:11px;line-height:2}.role-grid{gap:30px 20px}.role-title{font-size:36px;margin:24px 0}.role h3{font-size:14px}.role>p:last-child{font-size:13px;line-height:2.1}.roles>h2{font-size:31px;margin-bottom:45px}.reassurance{margin-top:75px}.reassurance .prose{text-align:left}.big-line{font-size:33px;letter-spacing:0}.family-statement{padding-top:80px;margin-bottom:55px}.sun{width:120px;height:120px}.family-statement h2{font-size:42px}.family-last{font-size:17px;line-height:2;max-width:250px;margin:50px auto 0}.letter-section{padding-left:5vw;padding-right:5vw}.letter-paper{padding:33px 24px 25px}.letter-body{font-size:15px;line-height:2.35;min-height:720px}.letter-paper h2{font-size:24px}.letter-body p{margin-bottom:23px}.signature{font-size:16px}footer{padding-top:75px}footer h2{font-size:42px}footer .eyebrow{font-size:10px}footer>p{font-size:12px}}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*:before,*:after{animation:none!important;transition:none!important}.reveal{opacity:1;translate:none}}.music-hint{position:fixed;right:5vw;top:64px;z-index:12;max-width:270px;background:#292d24ed;color:#e9dfc8;font-size:11px;line-height:1.8;padding:10px 14px;border:1px solid #9a9c8240;margin:0}@media(max-width:600px){.music-hint{top:60px;max-width:210px;font-size:10px}}.personal-cover{position:relative;isolation:isolate}.personal-cover:after{content:"";position:absolute;top:35%;right:0;bottom:0;left:0;background:linear-gradient(transparent,#10140d26 30%,#10140dd1);pointer-events:none}.personal-cover-title{position:absolute;z-index:1;left:5%;right:5%;bottom:6%;color:#efbd68;text-align:center;text-shadow:0 2px 12px #15150c70}.personal-cover-title>span{display:block;font-family:STKaiti,Kaiti SC,KaiTi,Songti SC,serif;font-size:clamp(30px,4.9vw,70px);letter-spacing:.04em;white-space:nowrap;line-height:1.45}.personal-cover-title>small{display:block;font-size:18px;letter-spacing:.6em;text-indent:.6em;margin-top:12px;color:#f0dfbe}@media(max-width:600px){.personal-cover-title>span{font-size:clamp(27px,8.8vw,46px)}.personal-cover-title>small{font-size:14px;margin-top:7px}}@font-face{font-family:LetterBrush;src:url(/fonts/letter-title.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}.personal-cover-title{bottom:9%}.personal-cover-title>span{font-family:LetterBrush,cursive;font-size:clamp(36px,5.5vw,78px);font-weight:400;letter-spacing:.025em;transform:rotate(-3deg);line-height:1.3}@font-face{font-family:FlowingLetter;src:url(/fonts/flowing-title-yaoli.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}.personal-cover-title>span{font-family:FlowingLetter,cursive;font-size:clamp(39px,6vw,85px);letter-spacing:-.025em;transform:rotate(-5deg);line-height:1.3}@media(max-width:600px){.personal-cover-title>span{font-size:clamp(33px,10.8vw,56px)}}@font-face{font-family:ClearLetter;src:url(/fonts/clear-title-yaoli.ttf) format("truetype");font-weight:400;font-style:normal;font-display:swap}.personal-cover-title>span{font-family:ClearLetter,cursive;font-size:clamp(36px,5.5vw,78px);letter-spacing:.025em;transform:rotate(-3deg);line-height:1.3}@media(max-width:600px){.personal-cover-title>span{font-size:clamp(31px,10vw,52px)}}.personal-cover-title{left:7%;right:7%;bottom:7%;text-align:center}.cover-calligraphy{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));align-items:center;font-family:ClearLetter,cursive;font-size:clamp(48px,7.2vw,102px);line-height:1.15;letter-spacing:0;min-height:1.18em}.cover-calligraphy>span{display:block;font-weight:400}.cover-calligraphy>span:nth-child(1){font-size:1.08em;transform:rotate(-5deg) translateY(.025em)}.cover-calligraphy>span:nth-child(2){font-size:.87em;transform:rotate(3deg) translateY(.06em)}.cover-calligraphy>span:nth-child(3){font-size:1.01em;transform:rotate(-4deg) translateY(-.02em)}.cover-calligraphy>span:nth-child(4){font-size:1.12em;transform:rotate(4deg) translateY(-.035em)}.cover-pinyin{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin-top:7px;font-family:Georgia,Times New Roman,serif;font-size:clamp(12px,1.5vw,21px);letter-spacing:.07em;line-height:1.4;color:#eee1c4;text-shadow:0 1px 6px #111a}.personal-cover:after{top:35%;right:0;bottom:0;left:0;background:linear-gradient(transparent,#10140d1f 25%,#10140dd9)}@media(max-width:600px){.cover-calligraphy{font-size:clamp(48px,13vw,68px)}.cover-pinyin{font-size:clamp(12px,3.4vw,17px);margin-top:5px}}.polaroid img{aspect-ratio:670/502;object-fit:contain;filter:none}.role-photo{margin:22px 0;padding:7px;background:#f6efdf;box-shadow:0 5px 15px #66543a1a}.role-photo img{display:block;width:100%;height:auto}.role-identity{min-height:152px;display:flex;align-items:center;gap:16px}.role-identity .role-title{margin:22px 0}.role-identity .role-photo{flex:0 1 112px;width:112px;margin:0 0 0 auto;padding:4px;transform:rotate(3deg)}.role-identity .role-photo img{width:100%;height:auto;aspect-ratio:3/4;object-fit:contain}@media(max-width:600px){.role-identity{min-height:128px;gap:10px}.role-identity .role-photo{flex-basis:82px;width:82px;padding:3px}}.role-identity .role-photo{margin:0}.role-identity.has-photo{height:164px;min-height:164px;gap:16px;margin:14px 0 22px;align-items:stretch}.role-identity.has-photo .role-title{align-self:center;flex:0 0 auto;margin:0}.role-identity.has-photo .role-photo{flex:1 1 0;width:auto;min-width:0;margin:0;padding:4px;transform:none;height:100%}.role-identity.has-photo .role-photo img{width:100%;height:100%;aspect-ratio:auto;object-fit:cover;object-position:center 38%}@media(max-width:600px){.role-identity.has-photo{height:128px;min-height:128px;gap:10px;margin:14px 0 22px}.role-identity.has-photo .role-photo{flex:1 1 0;width:auto;padding:3px}}.role-identity.has-photo .role-photo img{object-position:center 20%}.family-walk{margin:30px 0 22px;max-width:420px;background:#fff;padding:10px;box-shadow:0 12px 30px #15201425}.family-walk img{display:block;width:100%;height:auto}.family-grid{align-items:center}.family-statement .sun{opacity:.5}@media(max-width:600px){.family-walk{max-width:100%;margin:25px 0 20px;padding:7px}}.family-statement{padding-top:0}.family-statement .family-walk{width:260px;max-width:100%;margin:0 0 26px;padding:0;box-shadow:none}.family-statement .family-walk img{width:100%;height:auto}@media(max-width:600px){.family-statement{padding-top:0}.family-statement .family-walk{width:230px;margin:0 0 25px}}.role-identity.has-photo .brother-photo img{object-position:center 15%}.brother-crop{display:block;width:100%;height:100%;overflow:hidden}.surprise-section{background:#e6edf1;color:#434a4d;padding-bottom:75px}.surprise-section .chapter-top{border-color:#7a858930}.surprise-invite{text-align:center}.surprise-invite>.eyebrow{color:#75818a}.surprise-invite h2{font-size:clamp(32px,4.2vw,58px);margin:23px 0 35px}.surprise-open{border:1px solid #8b969a;background:transparent;color:#434a4d;padding:17px 30px;letter-spacing:.12em;font-size:14px}.surprise-open span{margin-left:25px}.surprise-open:hover{background:#f5f8f7}.surprise-content{margin:20px auto 0;max-width:1100px;animation:pagein .7s ease}.surprise-frame{display:block;width:100%;height:780px;height:min(800px,90svh);min-height:550px;border:0;background:#e6edf1}.surprise-close{display:block;margin:25px auto 0;border:0;border-bottom:1px solid #99a3a7;background:none;padding:10px;color:#65737a;font-size:12px;letter-spacing:.1em}@media(max-width:600px){.surprise-section{padding-left:4vw;padding-right:4vw;padding-bottom:50px}.surprise-section .chapter-top{margin-left:3vw;margin-right:3vw}.surprise-frame{height:85svh;min-height:590px}.surprise-invite h2{font-size:34px}.surprise-open{font-size:13px;padding:15px 24px}}.role-identity.has-photo .brother-photo img{object-position:center 40%}.memories{background:#e9e0cf;padding-bottom:110px}.memories-intro{max-width:1200px;margin:0 auto 55px}.memories-intro h2{font-size:clamp(32px,4.5vw,62px);margin:18px 0 0}.memory-wall{columns:3;column-gap:28px;max-width:1200px;margin:auto}.memory-photo{display:block;break-inside:avoid;width:100%;margin:0 0 28px;padding:10px 10px 8px;border:0;background:#faf6eb;box-shadow:0 7px 20px #6553341a;text-align:right;color:#8c7a5b;cursor:zoom-in}.memory-photo img{display:block;width:100%;height:auto}.memory-number{display:block;font-family:Georgia,serif;font-size:11px;letter-spacing:.12em;margin:10px 3px 0}.memory-photo:hover{box-shadow:0 10px 26px #65533430}.memory-viewer{border:0;padding:20px;background:#252a24;color:#eee6d5;width:min(1100px,96vw);max-width:96vw;max-height:96svh;overflow:auto}.memory-viewer::backdrop{background:#161c17dd;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.memory-viewer>img{display:block;max-width:100%;width:auto;max-height:75svh;height:auto;object-fit:contain;margin:auto}.memory-viewer-top,.memory-viewer-controls{display:flex;justify-content:space-between;align-items:center;gap:15px;font-size:12px;letter-spacing:.08em}.memory-viewer-top{margin-bottom:15px}.memory-viewer button{background:none;border:0;padding:12px;color:#eee6d5;font-size:12px;min-height:44px}.memory-viewer-controls{margin-top:12px}.memory-viewer-controls>span{text-align:center;color:#c5bda7}@media(max-width:900px){.memory-wall{columns:2;column-gap:20px}.memory-photo{margin-bottom:20px}}@media(max-width:600px){.memories{padding-left:5vw;padding-right:5vw;padding-bottom:65px}.memories-intro{margin-bottom:35px}.memories-intro h2{font-size:32px}.memory-wall{columns:2;column-gap:12px}.memory-photo{padding:5px 5px 6px;margin-bottom:14px}.memory-number{font-size:10px;margin-top:7px}.memory-viewer{padding:10px}.memory-viewer-controls{gap:4px;font-size:10px}.memory-viewer-controls>span{max-width:120px;line-height:1.7}.memory-viewer button{font-size:11px;padding:10px 6px}}.role-identity.has-photo .role-photo .husband-image{object-position:43% 54%}
