@charset "UTF-8";
:root{color-scheme:light;--ink:#603d4b;--muted:#927782;--pink:#b4637a;--line:rgba(115,66,85,.15);--serif:"STKaiti","KaiTi","Noto Serif SC","Songti SC",serif;--sans:"Microsoft YaHei","PingFang SC",sans-serif}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-family:var(--sans)}body{background:#f8efeb;color:var(--ink);transition:background 1s,color .8s;overflow-x:hidden}button,input,textarea{font:inherit}button,a{-webkit-tap-highlight-color:transparent}button{color:inherit;cursor:pointer}button{border:0;background:none}a{color:inherit;text-decoration:none}button:focus-visible,a:focus-visible{outline:2px solid #b66182;outline-offset:5px}button:disabled{cursor:default}button,input,textarea{touch-action:manipulation}input,textarea{width:100%;border:1px solid var(--line);border-radius:12px;padding:12px;background:rgba(255,255,255,.65);color:#603d4b;resize:vertical;outline:none}input:focus,textarea:focus{border-color:#b4637a;box-shadow:0 0 0 3px #b4637a15}[hidden]{display:none!important}
.ambient{position:fixed;inset:0;overflow:hidden;pointer-events:none;background:radial-gradient(ellipse at 10% 85%,#fcf2d5 0,transparent 49%),radial-gradient(ellipse at 90% 40%,#f3d6df 0,transparent 52%),radial-gradient(ellipse at 25% 5%,#e8dff2 0,transparent 46%);transition:opacity 1s}.ambient:after{content:"";position:absolute;inset:0;opacity:.16;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%3Crect width='100%25' height='100%25' opacity='.25' filter='url(%23n)'/%3E%3C/svg%3E")}.ambient i{position:absolute;width:32vw;height:32vw;border-radius:50%;filter:blur(65px);opacity:.24;background:white;animation:cloud 15s ease-in-out infinite alternate}.ambient i:nth-child(2){left:60%;top:45%;background:#e5c9ef;animation-delay:-5s}.ambient i:nth-child(3){left:20%;top:70%;background:#ffe6bb;animation-delay:-10s}
.masthead{height:96px;position:relative;z-index:10;display:flex;justify-content:space-between;align-items:center;padding:20px 4.2vw}.brand{display:flex;align-items:center;gap:11px;font-size:15px;letter-spacing:4px}.brand-mark{font-size:36px;font-weight:300;color:var(--pink);line-height:1}.brand small{display:block;font-family:Georgia,serif;font-size:8px;letter-spacing:2px;margin-top:6px;color:var(--muted)}.tools{display:flex;gap:10px}.icon-button{display:flex;align-items:center;justify-content:center;gap:7px;height:44px;padding:0 13px;border:1px solid var(--line);border-radius:30px;background:#ffffff30;font-size:11px;transition:background .2s,transform .2s}.icon-button:hover{background:#ffffff88;transform:translateY(-2px)}.icon-button svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round}.icon-button[aria-pressed="true"]{color:#a2516c;background:#fff8}
main{position:relative;z-index:2}.scene{min-height:calc(100svh - 166px);position:relative;display:flex;flex-direction:column;align-items:center;animation:scene-in .9s both}.scene-intro{position:relative;z-index:3;text-align:center;padding-top:10px;pointer-events:none}.eyebrow{font-family:Georgia,serif;font-size:9px;font-weight:400;letter-spacing:3.3px;margin:0 0 15px;color:var(--muted)}h1,h2{font-family:var(--serif);font-weight:400;letter-spacing:4px;margin:0;font-size:34px}.dedication{font-size:11px;letter-spacing:3px;color:var(--muted);margin:17px 0 0}.dedication [data-recipient]{letter-spacing:2px;margin-left:6px;color:var(--ink)}.tiny-star{margin-left:12px;font-size:10px;color:#b3896c}.heart-stage{position:relative;width:min(780px,96vw);height:clamp(380px,53vh,530px);flex-shrink:0;margin:0 auto}.heart-halo{position:absolute;width:55%;height:58%;left:22.5%;top:20%;border-radius:50%;background:#fff6;filter:blur(40px)}.notes{position:absolute;inset:0}.wish-note{position:absolute;width:clamp(82px,14vw,122px);height:66px;padding:0;border:1px solid rgba(255,255,255,.9);border-radius:7px;background:var(--note);box-shadow:0 3px 7px #81677516,0 12px 24px #92708014;transform:translate(-50%,-50%) rotate(var(--rotation));opacity:0;animation:note-in .75s cubic-bezier(.2,.7,.25,1) forwards;animation-delay:var(--delay);transition:filter .3s,box-shadow .3s;z-index:var(--z);text-align:center}.wish-note:hover,.wish-note:focus-visible{z-index:100!important;filter:brightness(1.03);box-shadow:0 8px 26px #9b668744;outline:1px solid #b56f88;outline-offset:3px}.note-bar{height:18px;border-bottom:1px solid #fff8;display:flex;align-items:center;justify-content:space-between;padding:0 8px;font-family:Georgia,serif;font-size:10px;color:#826e7c99}.note-bar span:last-child{letter-spacing:2px;font-size:8px}.note-label{display:flex;align-items:center;justify-content:center;height:46px;padding:5px;font-size:10px;letter-spacing:.7px;line-height:1.5;color:#6f5c64}.heart-center{position:absolute;z-index:80;top:37%;left:50%;width:54%;text-align:center;transform:translate(-50%,-50%);animation:center-in 1.4s 2.4s both;pointer-events:none}.handwritten{font-family:"Segoe Script","Brush Script MT",cursive;font-style:italic;font-size:25px;color:#b87b90;display:block;transform:rotate(-8deg);opacity:.86}.heart-center>p{font-family:var(--serif);font-size:54px;letter-spacing:10px;margin:10px 0 16px;white-space:nowrap;color:#9b526b;text-shadow:0 2px 20px #fff8}.center-rule{display:block;width:28px;height:1px;background:#b58798;margin:0 auto 16px}.text-link{font-size:11px;letter-spacing:1px;line-height:1.8;padding:8px;pointer-events:auto}.text-link span{margin-left:7px}.heart-center .text-link{font-size:10px}.text-link:hover{color:#b4637a}.floating-spark{position:absolute;color:#b88c77;pointer-events:none;animation:twinkle 4s ease-in-out infinite}.spark-one{top:21%;left:5%;font-size:33px}.spark-two{right:4%;top:56%;font-size:16px;animation-delay:-2s}.spark-three{left:18%;bottom:15%;font-size:21px;animation-delay:-1s}.scene-bottom{z-index:3;text-align:center;margin-top:-24px;padding-bottom:20px}.hint{font-size:10px;letter-spacing:1.7px;color:var(--muted);margin:0 0 18px;line-height:1.6}.hint-dot{display:inline-block;width:4px;height:4px;border-radius:50%;background:#be8498;vertical-align:middle;margin-right:8px}.primary-button{min-height:47px;border-radius:40px;padding:14px 27px;background:#a85b73;color:#fffaf9;box-shadow:0 7px 21px #a85b7320;font-size:12px;letter-spacing:2px;display:inline-flex;justify-content:center;align-items:center;gap:26px;transition:background .3s,transform .3s,box-shadow .3s}.primary-button:hover{background:#964c64;transform:translateY(-2px);box-shadow:0 10px 25px #a85b7335}.primary-button:active{transform:translateY(0)}.primary-button span{font-size:18px;font-family:Georgia,serif}.footnote{display:block;font-size:9px;letter-spacing:2px;color:#a58a93;margin-top:17px}.page-footer{min-height:70px;display:flex;align-items:center;justify-content:space-between;position:relative;z-index:10;padding:10px 4.2vw;border-top:1px solid var(--line);gap:15px}.page-footer>span{font-family:Georgia,serif;font-size:8px;letter-spacing:2px;color:var(--muted)}.chapters{display:flex;align-items:center;gap:14px;font-size:10px;color:var(--muted)}.chapters button{padding:10px 0;font-size:10px;letter-spacing:1px;opacity:.65}.chapters button span{font-family:Georgia,serif;font-size:10px;margin-right:8px}.chapters .active{opacity:1;color:var(--ink)}.chapter-line{width:38px;height:1px;background:var(--line)}.footer-share{font-size:10px;letter-spacing:1px;padding:12px 0}
body.night{--ink:#f4e2df;--muted:#a99aaa;--line:#b5a4c222;--pink:#dab0bd;color-scheme:dark;background:#14121d}body.night .ambient{opacity:0}body.night .icon-button:hover{background:#ffffff18}body.night .icon-button[aria-pressed="true"]{color:#f3c8db;background:#ffffff15}body.night .primary-button{background:#e6b4c6;color:#3b293e;box-shadow:0 4px 28px #d395b327}body.night .primary-button:hover{background:#f3c5d6}body.night .brand-mark{color:#d6aebe}.cake-scene{min-height:max(700px,calc(100svh - 166px));isolation:isolate}.cake-scene:before{content:"";position:absolute;inset:0;z-index:-2;background:radial-gradient(ellipse at 50% 46%,#41213960,transparent 55%)}#cake-canvas{position:absolute;inset:0;width:100%;height:100%;z-index:-1;touch-action:pan-y}.cake-scene .scene-intro{padding-top:20px}.cake-bottom{margin-top:auto;z-index:3;text-align:center;padding-bottom:22px}.flavors{display:flex;gap:8px;justify-content:center;margin:0 0 20px}.flavor{border:1px solid #ffffff17;border-radius:30px;padding:10px 12px;font-size:10px;color:#c9bac8;letter-spacing:.6px;background:#211b2bb0}.flavor.selected{border-color:#ddbbd3aa;background:#e0bfdc12;color:#fcecf5}.flavor i{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:7px;background:#e5a7bb}.flavor[data-flavor="lavender"] i{background:#b1a2e1}.flavor[data-flavor="mint"] i{background:#a6d5c7}.cake-bottom .hint{margin:16px 0 2px;font-size:9px}.cake-bottom .text-link{font-size:10px;color:#c5b3c3}.cake-scene h2{font-size:34px}.cake-scene .dedication{font-size:11px;letter-spacing:1px}.cake-scene.wished h2{color:#f7d4df}
dialog{border:1px solid #fff8;border-radius:22px;background:#fcf7f2;color:#65454f;padding:48px 40px;box-shadow:0 24px 100px #25111f40;max-width:calc(100vw - 32px);max-height:calc(100svh - 40px);overflow:auto}dialog[open]{animation:dialog-in .4s both}dialog::backdrop{background:#4a33454d;backdrop-filter:blur(12px)}dialog h2{font-size:25px;letter-spacing:1px;line-height:1.5}dialog .eyebrow{color:#9c7a86;font-size:8px;letter-spacing:2.5px}dialog .primary-button{background:#a85b73!important;color:#fffaf9!important}.close-button{position:absolute;top:12px;right:14px;width:40px;height:40px;font-size:26px;font-weight:200;color:#987984;border-radius:50%}.close-button:hover{background:#eadce1}.letter-dialog{width:500px;background:radial-gradient(ellipse at 90% 0,#f7e4e8,transparent 65%),#fcf8f1}.letter-seal{font-family:Georgia,serif;font-size:33px;color:#ba7a8d;margin-bottom:25px}.letter-dialog h2{font-size:22px}.letter-copy{font-family:var(--serif);font-size:17px;line-height:2.1;letter-spacing:.7px;white-space:pre-line;overflow-wrap:anywhere}.letter-copy p{margin:20px 0}.letter-sign{display:flex;flex-direction:column;align-items:flex-end;gap:8px;font-size:11px;color:#a27988;line-height:1.7;margin:24px 0 30px}.letter-dialog .primary-button{display:flex;margin:auto}.note-dialog{text-align:center;width:390px;padding:48px 28px}.note-symbol{font-size:37px;color:#b27890;display:block;margin-bottom:20px}.note-dialog h2{font-size:26px;line-height:1.7;margin:25px 0}.note-end{font-size:10px;letter-spacing:1px;color:#987985;margin-bottom:25px}.edit-dialog{width:440px}.edit-dialog h2{font-size:24px;margin-bottom:28px}.edit-dialog label{display:block;font-size:11px;letter-spacing:1px;margin:18px 0;color:#886976}.edit-dialog input,.edit-dialog textarea{display:block;margin-top:9px;line-height:1.6;font-size:13px;letter-spacing:0;color-scheme:light}.edit-dialog .primary-button{width:100%;margin-top:10px}.form-hint,.share-copy{font-size:11px;color:#9a7d88;line-height:1.8;margin:20px 0 8px}.share-copy{font-size:13px;margin-bottom:25px}.toast{position:fixed;bottom:100px;left:50%;transform:translate(-50%,15px);z-index:2000;border:1px solid #fff5;background:#523d50e6;backdrop-filter:blur(12px);color:#fff4f8;border-radius:30px;padding:12px 22px;font-size:12px;letter-spacing:.5px;opacity:0;transition:opacity .3s,transform .3s;pointer-events:none;max-width:90vw;text-align:center}.toast.visible{opacity:1;transform:translate(-50%,0)}#confetti{position:fixed;inset:0;pointer-events:none;z-index:50;width:100%;height:100%}
.paused *,.paused *:before,.paused *:after{animation-play-state:paused!important}.paused .wish-note{animation:none;opacity:1}.paused .heart-center{animation:none;opacity:1}.paused .scene{animation:none;opacity:1}
@keyframes cloud{to{transform:translate(20vw,10vh)}}@keyframes twinkle{0%,100%{opacity:.35;transform:scale(.85) rotate(0)}50%{opacity:.8;transform:scale(1.1) rotate(15deg)}}@keyframes note-in{from{opacity:0;transform:translate(-50%,-20%) rotate(calc(var(--rotation) - 8deg)) scale(.75)}to{opacity:1;transform:translate(-50%,-50%) rotate(var(--rotation)) scale(1)}}@keyframes center-in{from{opacity:0;filter:blur(6px)}to{opacity:1;filter:blur(0)}}@keyframes scene-in{from{opacity:0;filter:blur(5px);transform:translateY(8px)}to{opacity:1;filter:blur(0);transform:translateY(0)}}@keyframes dialog-in{from{opacity:0;transform:translateY(15px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}
@media(min-width:1600px){.heart-stage{height:550px}.scene-intro{padding-top:30px}.scene-bottom{margin-top:0}}@media(max-width:700px){.masthead{height:82px;padding:17px 20px}.brand{font-size:13px;gap:6px;letter-spacing:2px}.brand-mark{font-size:29px}.brand small{font-size:6px;letter-spacing:1px}.tools{gap:6px}.icon-button{padding:0;width:36px;height:38px;border-color:#a56e8020}.icon-button span{display:none}.icon-button svg{width:16px;height:16px}.scene{min-height:calc(100svh - 160px)}.scene-intro{padding-top:15px}.eyebrow{font-size:8px;letter-spacing:2.2px;margin-bottom:16px}h1,.cake-scene h2{font-size:27px;letter-spacing:2px}.dedication{font-size:10px;margin-top:16px}.heart-stage{width:100%;height:clamp(335px,49svh,420px);margin-top:10px}.wish-note{width:83px;height:55px;border-radius:6px}.note-bar{height:15px;padding:0 6px;font-size:9px}.note-label{height:39px;font-size:8px;letter-spacing:0}.heart-center{top:38%;width:60%}.handwritten{font-size:20px}.heart-center>p{font-size:35px;letter-spacing:5px;margin:10px 0 12px}.center-rule{margin-bottom:9px;width:22px}.heart-center .text-link{font-size:8px;letter-spacing:.2px}.spark-one{left:3%;font-size:24px;top:6%}.spark-two{right:5%;top:87%}.spark-three{left:12%;bottom:12%}.scene-bottom{margin-top:-15px;padding-bottom:23px}.hint{font-size:9px;letter-spacing:.8px;margin-bottom:17px}.primary-button{min-height:47px;font-size:11px;padding:13px 24px;gap:22px}.footnote{font-size:8px;margin-top:18px;letter-spacing:1.5px}.page-footer{min-height:78px;padding:12px 20px;flex-wrap:wrap;justify-content:space-between;gap:8px}.page-footer>span{display:none}.chapters{gap:10px}.chapters button{font-size:9px}.chapters button span{margin-right:6px}.chapter-line{width:22px}.footer-share{font-size:9px}.cake-scene{min-height:max(640px,calc(100svh - 160px))}.cake-scene .scene-intro{padding-top:15px}.cake-scene .dedication{font-size:10px;letter-spacing:.5px}.cake-bottom{padding-bottom:17px}.flavors{gap:5px;margin-bottom:18px}.flavor{font-size:9px;padding:10px 11px}.cake-bottom .hint{margin-top:14px}.cake-bottom .text-link{padding:7px}.edit-dialog,.letter-dialog{padding:42px 26px 32px}.letter-copy{font-size:16px}.edit-dialog h2{font-size:22px}dialog{border-radius:18px}.toast{bottom:85px;font-size:11px}}
@media(max-height:760px) and (min-width:701px){.masthead{height:76px}.scene{min-height:calc(100svh - 136px)}.scene-intro{padding-top:0}h1{font-size:28px}.heart-stage{height:360px;width:670px}.wish-note{width:108px;height:57px}.note-bar{height:15px}.note-label{height:40px;font-size:9px}.heart-center>p{font-size:44px;margin:8px 0 12px}.scene-bottom{margin-top:-12px}.page-footer{min-height:60px}.cake-scene{min-height:650px}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}.wish-note,.heart-center{opacity:1}}

/* Keep the heart silhouette tall and the greeting inside its open center. */
.heart-stage{width:min(680px,96vw)}
.heart-center{top:54%;width:48%}
.handwritten{font-size:22px}
.heart-center>p{font-size:46px;letter-spacing:7px;margin:6px 0 9px}
.center-rule{margin-bottom:7px}
@media(max-width:700px){.heart-stage{width:100%}.heart-center{top:54%;width:58%}.handwritten{font-size:16px}.heart-center>p{font-size:29px;letter-spacing:4px;margin:5px 0 7px}.center-rule{margin-bottom:3px}.heart-center .text-link{font-size:8px}}
@media(max-height:760px) and (min-width:701px){.heart-stage{width:560px;height:380px}.heart-center>p{font-size:36px}.handwritten{font-size:19px}.heart-center .text-link{font-size:9px}}


.heart-center{top:52%}.letter-entry{display:block;margin:10px auto 0;font-size:10px;color:#967581}.heart-center .center-rule{margin-bottom:0}
@media(max-width:700px){.heart-center{top:52%}.letter-entry{font-size:9px;margin-top:12px}}

.paused dialog[open]{animation:none!important;opacity:1;transform:none}
