/* ==========================================================================
   OUR LITTLE WORLD ♡ — stylesheet
   --------------------------------------------------------------------------
    1. fonts                 9. the map + objects        17. the secret
    2. tokens + reset       10. world foot / other side  18. after hours
    3. paper grain + fx     11. the world before you     19. finale + replay
    4. buttons              12. windows (dialogs)        20. toast
    5. window chrome        13. the moments              21. editor
    6. opening              14. lightbox                 22. small screens
    7. welcome              15. the things we say        23. reduced motion
    8. world, flip, hero    16. our soundtrack
   ========================================================================== */

/* 1. fonts ---------------------------------------------------------------- */
@font-face{font-family:'Fraunces';font-style:normal;font-weight:300 700;font-display:swap;src:url('../assets/fonts/Fraunces-normal-300-700.woff2') format('woff2');}
@font-face{font-family:'Fraunces';font-style:italic;font-weight:300 700;font-display:swap;src:url('../assets/fonts/Fraunces-italic-300-700.woff2') format('woff2');}
@font-face{font-family:'Caveat';font-style:normal;font-weight:400 700;font-display:swap;src:url('../assets/fonts/Caveat-normal-400-700.woff2') format('woff2');}
@font-face{font-family:'DM Sans';font-style:normal;font-weight:400 700;font-display:swap;src:url('../assets/fonts/DMSans-normal-400-700.woff2') format('woff2');}
@font-face{font-family:'DM Mono';font-style:normal;font-weight:400;font-display:swap;src:url('../assets/fonts/DMMono-normal-400.woff2') format('woff2');}
@font-face{font-family:'DM Mono';font-style:normal;font-weight:500;font-display:swap;src:url('../assets/fonts/DMMono-normal-500.woff2') format('woff2');}

/* 2. tokens + reset ------------------------------------------------------- */
:root{
  --wine:#641525;
  --cherry:#A91E3B;
  --rose:#D96A83;
  --pink:#F3B7C5;
  --cream:#FFF7F0;
  --choc:#43232A;
  --gold:#D6AD62;
  --white:#FFFDFC;

  --blush:#FBE6EB;
  --paper:#FFFBF6;
  --gold-soft:#F3DDB0;
  --line:rgba(67,35,42,.13);
  --line-2:rgba(67,35,42,.22);
  --ink-2:rgba(67,35,42,.72);
  --ink-3:rgba(67,35,42,.52);

  --f-display:'Fraunces', 'Iowan Old Style', Georgia, serif;
  --f-hand:'Caveat', 'Bradley Hand', 'Segoe Print', cursive;
  --f-sans:'DM Sans', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --f-mono:'DM Mono', ui-monospace, 'SF Mono', Menlo, monospace;

  --r-win:22px;
  --shadow-win:0 0 0 1.5px rgba(67,35,42,.12), 9px 11px 0 var(--pink), 0 40px 70px -30px rgba(100,21,37,.45);
  --ease-out:cubic-bezier(.2,.85,.25,1);
  --ease-back:cubic-bezier(.3,1.45,.5,1);
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-behavior:smooth}
html.is-locked{overflow:hidden}
body{
  margin:0;min-height:100svh;
  background:var(--cream);color:var(--choc);
  font:400 1rem/1.55 var(--f-sans);
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
}
img{max-width:100%;display:block}
button,input,select,textarea{font:inherit;color:inherit}
button{cursor:pointer;-webkit-tap-highlight-color:transparent}
p,h1,h2,h3,figure{margin:0}
[hidden]{display:none!important}
:focus-visible{outline:2.5px solid var(--cherry);outline-offset:3px;border-radius:10px}
::selection{background:var(--pink);color:var(--wine)}
.heart{color:var(--cherry);display:inline-block}

/* 3. paper grain + fx ----------------------------------------------------- */
.grain{
  position:fixed;inset:0;z-index:0;pointer-events:none;opacity:.5;mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .42 0 0 0 0 .2 0 0 0 0 .22 0 0 0 .07 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
.fx{position:fixed;inset:0;z-index:90;pointer-events:none;overflow:hidden}
.fx-heart{
  position:absolute;bottom:-50px;left:var(--x);
  font-size:var(--s);line-height:1;color:var(--c);
  opacity:0;animation:floatUp var(--dur) cubic-bezier(.35,.1,.6,1) var(--delay,0s) forwards;
}
.fx-spark{
  position:absolute;left:var(--x);top:var(--y);width:var(--s);aspect-ratio:1;
  background:var(--c,var(--gold));
  clip-path:polygon(50% 0,61% 39%,100% 50%,61% 61%,50% 100%,39% 61%,0 50%,39% 39%);
  opacity:0;animation:spark var(--dur,1s) ease-out var(--delay,0s) forwards;
}
.fx-note{
  position:absolute;left:var(--x);top:var(--y);width:var(--s);height:var(--s);color:var(--c);
  opacity:0;animation:noteUp 2.6s ease-out forwards;
}
.fx-note svg{display:block;width:100%;height:100%;fill:currentColor}
@keyframes floatUp{
  0%{opacity:0;transform:translate(0,0) scale(.5) rotate(0)}
  12%{opacity:1}
  100%{opacity:0;transform:translate(var(--drift),calc(-100vh - 90px)) scale(1) rotate(var(--rot))}
}
@keyframes spark{
  0%{opacity:0;transform:scale(0) rotate(0)}
  35%{opacity:1;transform:scale(1) rotate(45deg)}
  100%{opacity:0;transform:scale(.2) rotate(120deg) translateY(var(--rise,-14px))}
}
@keyframes noteUp{
  0%{opacity:0;transform:translate(0,0) rotate(-8deg) scale(.6)}
  20%{opacity:1}
  100%{opacity:0;transform:translate(var(--drift,20px),-110px) rotate(14deg) scale(1.05)}
}

/* 4. buttons --------------------------------------------------------------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.5em;
  min-height:50px;padding:0 1.6em;border-radius:999px;border:0;
  font:500 .82rem/1 var(--f-mono);letter-spacing:.12em;text-transform:uppercase;
  transition:transform .25s var(--ease-back),box-shadow .25s,background .25s;
  touch-action:manipulation;
}
.btn--wine{
  background:linear-gradient(180deg,#B8264A,var(--cherry) 55%,#8F1832);color:var(--white);
  box-shadow:0 4px 0 var(--wine),0 14px 26px -10px rgba(100,21,37,.55);
}
.btn--wine:hover{transform:translateY(-2px);box-shadow:0 6px 0 var(--wine),0 18px 30px -10px rgba(100,21,37,.6)}
.btn--wine:active{transform:translateY(3px);box-shadow:0 1px 0 var(--wine),0 8px 16px -8px rgba(100,21,37,.5)}
.btn--ghost{background:var(--white);color:var(--choc);box-shadow:inset 0 0 0 1.5px var(--line-2),0 3px 0 var(--blush)}
.btn--ghost:hover{background:var(--blush)}
.text-btn{border:0;background:none;padding:10px 12px;font:500 .72rem var(--f-mono);letter-spacing:.1em;color:var(--ink-3);text-decoration:underline;text-underline-offset:4px}
.text-btn:hover{color:var(--cherry)}

/* 5. window chrome -------------------------------------------------------- */
.win{
  position:relative;background:var(--white);border-radius:var(--r-win);
  box-shadow:var(--shadow-win);
}
.win-bar{
  display:flex;align-items:center;gap:12px;min-height:46px;padding:0 10px 0 16px;
  border-bottom:1.5px dashed var(--line);
  background:linear-gradient(180deg,#fff,#FFF8F2);
  border-radius:var(--r-win) var(--r-win) 0 0;
}
.win-dots{display:inline-flex;gap:6px;flex:none}
.win-dots i{width:11px;height:11px;border-radius:50%;background:var(--cherry)}
.win-dots i:nth-child(2){background:var(--rose)}
.win-dots i:nth-child(3){background:var(--gold)}
.win-title{
  flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font:400 .72rem var(--f-mono);letter-spacing:.06em;color:var(--ink-3);
  text-align:center;
}
.win-close{
  flex:none;width:40px;height:40px;border-radius:50%;border:0;background:transparent;
  display:grid;place-items:center;transition:background .2s,transform .3s var(--ease-back);
}
.win-close:hover{background:var(--blush);transform:rotate(90deg)}
.win-close svg{width:18px;height:18px;stroke:var(--choc);stroke-width:2;stroke-linecap:round;fill:none}
.edit-chip{
  flex:none;border:0;border-radius:999px;padding:7px 12px;min-height:34px;
  background:var(--blush);color:var(--wine);font:500 .66rem var(--f-mono);letter-spacing:.06em;
  transition:background .2s;
}
.edit-chip:hover{background:var(--pink)}

/* 6. opening -------------------------------------------------------------- */
.gate{
  position:relative;z-index:1;min-height:100svh;display:grid;place-items:center;
  padding:28px 14px;overflow:clip;
  background:
    radial-gradient(60% 50% at 50% 42%, rgba(243,183,197,.35), transparent 70%),
    var(--cream);
  transition:opacity .8s ease,filter .8s ease;
}
.gate.is-leaving{opacity:0;filter:blur(10px)}
.gate-deco{position:absolute;pointer-events:none;opacity:.95}
.gate-deco--sparkles{width:clamp(80px,9vw,130px);top:9%;left:9%;animation:twinkleScale 5s ease-in-out infinite}
.gate-deco--hearts{width:clamp(90px,10vw,140px);bottom:11%;right:9%;rotate:10deg;animation:bob 6s ease-in-out infinite}
.gate-deco--roses{width:clamp(70px,7vw,100px);bottom:9%;left:12%;rotate:-24deg}

.gate-win{width:min(560px,100%);animation:gateIn 1s var(--ease-out) both}
.gate-win.is-expanding{animation:gateExpand 1.05s cubic-bezier(.6,0,.3,1) forwards}
.gate-body{
  padding:clamp(34px,6vw,58px) clamp(20px,5vw,48px) clamp(26px,5vw,42px);
  text-align:center;border-radius:0 0 var(--r-win) var(--r-win);
  background:
    radial-gradient(circle at 12% 18%, rgba(243,183,197,.25), transparent 40%),
    var(--paper);
}
.gate-hey{font:600 clamp(2.6rem,9vw,3.6rem)/1 var(--f-hand);color:var(--cherry);min-height:1.1em}
.caret{display:inline-block;width:2px;height:.8em;margin-left:4px;background:var(--cherry);vertical-align:-.05em;animation:blink 1s steps(1) infinite}
.caret.is-done{opacity:0;animation:none}
.gate-line{margin-top:18px;font:400 clamp(1.2rem,3.8vw,1.55rem)/1.35 var(--f-display);color:var(--choc)}
.gate-ask{margin-top:10px;font:italic 500 clamp(1.4rem,4.6vw,1.95rem)/1.3 var(--f-display);color:var(--wine)}
.gate-ask .heart{animation:heartbeat 1.6s ease-in-out infinite}
.gate-actions{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:28px}
.gate-line,.gate-ask,.gate-actions{opacity:0;transform:translateY(10px);transition:opacity .8s ease,transform .8s var(--ease-out)}
.gate-line.is-in,.gate-ask.is-in,.gate-actions.is-in{opacity:1;transform:none}
#notYetBtn{position:relative;z-index:5;transition:translate .5s var(--ease-back),background .25s,transform .25s}
#notYetBtn.gave-in{background:var(--blush);color:var(--wine)}
.gate-tease{min-height:1.6em;margin-top:14px;font:500 1.35rem/1.2 var(--f-hand);color:var(--rose)}

@keyframes gateIn{from{opacity:0;transform:translateY(22px) scale(.96)}to{opacity:1;transform:none}}
@keyframes gateExpand{
  0%{transform:scale(1);filter:blur(0);opacity:1}
  30%{transform:scale(1.035);filter:blur(0);opacity:1}
  100%{transform:scale(1.9);filter:blur(16px);opacity:0}
}
@keyframes blink{50%{opacity:0}}
@keyframes heartbeat{0%,100%{transform:scale(1)}15%{transform:scale(1.25)}30%{transform:scale(1)}45%{transform:scale(1.15)}}

/* 7. welcome -------------------------------------------------------------- */
.welcome{
  position:fixed;inset:0;z-index:80;display:grid;place-items:center;padding:24px;
  background:radial-gradient(55% 45% at 50% 45%, #FFE8EE, var(--cream) 75%);
  animation:fadeIn .7s ease both;cursor:pointer;
}
.welcome.is-leaving{animation:fadeOut .9s ease forwards}
.welcome-inner{display:flex;flex-direction:column;align-items:center;gap:18px;text-align:center}
.welcome-couple{width:min(230px,52vw);animation:walkIn 2.4s var(--ease-out) both}
.welcome-text{font:italic 400 clamp(1.5rem,5vw,2.5rem)/1.2 var(--f-display);color:var(--wine);animation:riseIn 1.1s .5s var(--ease-out) both}
.welcome-text em{font-style:normal;font-family:var(--f-hand);font-weight:700;font-size:1.3em;color:var(--cherry)}
@keyframes walkIn{
  0%{opacity:0;transform:translateX(-60px)}
  30%{opacity:1}
  100%{opacity:1;transform:translateX(0)}
}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes fadeOut{to{opacity:0;visibility:hidden}}
@keyframes riseIn{from{opacity:0;transform:translateY(18px);filter:blur(6px)}to{opacity:1;transform:none;filter:none}}

/* 8. world, flip, hero ---------------------------------------------------- */
.world{position:relative;z-index:1;perspective:2400px;perspective-origin:50% 50vh}
.flip{
  display:grid;transform-style:preserve-3d;transform-origin:50% 50vh;
  transition:transform 1.15s cubic-bezier(.65,0,.25,1);
}
.flip.is-flipped{transform:rotateY(180deg)}
.face{grid-area:1/1;min-width:0;min-height:100svh;backface-visibility:hidden;-webkit-backface-visibility:hidden}
.face--front{position:relative;display:flex;flex-direction:column}
.face--back{transform:rotateY(180deg)}
.flip.is-back-settled .face--front{height:100svh;overflow:hidden}

.world.is-entering .status,
.world.is-entering .hero > *{animation:riseIn .9s var(--ease-out) both}
.world.is-entering .hero > :nth-child(2){animation-delay:.1s}
.world.is-entering .hero > :nth-child(3){animation-delay:.2s}
.world.is-entering .hero > :nth-child(4){animation-delay:.32s}
.world.is-entering .hero > :nth-child(5){animation-delay:.42s}
.world.is-entering .map-center{animation:riseIn 1s .35s var(--ease-out) both}
.world.is-entering .obj{animation:popIn .8s calc(.55s + var(--i) * .12s) var(--ease-back) both}
.world.is-entering .map-trail path{animation:draw 2.4s .4s ease both}
@keyframes popIn{from{opacity:0;scale:.6}to{opacity:1;scale:1}}
@keyframes draw{from{stroke-dashoffset:600;opacity:0}to{stroke-dashoffset:0;opacity:1}}

.status{
  position:relative;z-index:3;display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:14px clamp(14px,3vw,30px);font:400 .72rem var(--f-mono);letter-spacing:.06em;color:var(--ink-3);
}
.status-brand{display:inline-flex;align-items:center;gap:8px;white-space:nowrap}
.status-dot{width:8px;height:8px;border-radius:50%;background:var(--cherry);box-shadow:0 0 0 0 rgba(169,30,59,.5);animation:ping 2.4s infinite}
.status-right{display:flex;align-items:center;gap:10px;margin-left:auto}
.pieces{display:inline-flex;gap:5px;padding:8px 10px;border-radius:999px;background:var(--white);box-shadow:inset 0 0 0 1.5px var(--line)}
.pieces i{
  width:13px;height:13px;background:rgba(100,21,37,.14);
  clip-path:polygon(50% 0%,61% 35%,98% 35%,68% 57%,79% 91%,50% 70%,21% 91%,32% 57%,2% 35%,39% 35%);
  transition:background .4s;
}
.pieces i.on{background:var(--gold);animation:pop .6s var(--ease-back)}
.icon-btn{
  width:40px;height:40px;border-radius:50%;border:0;background:var(--white);color:var(--wine);
  box-shadow:inset 0 0 0 1.5px var(--line);font-size:1rem;transition:background .2s;
}
.icon-btn:hover{background:var(--blush)}
.now-playing{
  display:inline-flex;align-items:center;gap:8px;border:0;border-radius:999px;min-height:36px;padding:0 12px;
  background:var(--wine);color:var(--cream);font:500 .64rem var(--f-mono);letter-spacing:.08em;
  animation:popIn .5s var(--ease-back);
}
.np-eq{display:inline-flex;align-items:flex-end;gap:2px;height:12px}
.np-eq i{width:2.5px;height:100%;background:var(--pink);border-radius:2px;transform-origin:bottom;animation:eq .9s ease-in-out infinite}
.np-eq i:nth-child(2){animation-delay:-.3s}
.np-eq i:nth-child(3){animation-delay:-.6s}
@keyframes ping{0%{box-shadow:0 0 0 0 rgba(169,30,59,.45)}70%,100%{box-shadow:0 0 0 9px rgba(169,30,59,0)}}
@keyframes pop{0%{transform:scale(.3)}60%{transform:scale(1.35)}100%{transform:scale(1)}}

.hero{position:relative;z-index:2;text-align:center;padding:clamp(4px,1.6vh,18px) 18px clamp(4px,1.4vh,14px)}
.hero-kicker{font:500 .68rem var(--f-mono);letter-spacing:.22em;text-transform:uppercase;color:var(--rose)}
.hero-title{
  margin:.18em 0 .08em;font:600 clamp(2.3rem,6.6vw,5.2rem)/.95 var(--f-display);
  font-variation-settings:"opsz" 144;letter-spacing:.025em;color:var(--wine);text-wrap:balance;
}
.hero-title::after{content:"✦";display:inline-block;margin-left:.12em;font-size:.34em;vertical-align:.95em;color:var(--gold);animation:twinkleScale 3.5s ease-in-out infinite}
.hero-sub{font:italic 400 clamp(1.02rem,2.2vw,1.3rem)/1.4 var(--f-display);color:var(--ink-2)}
.hero-names{margin-top:.25em;font:600 clamp(1.9rem,4.4vw,2.7rem)/1.1 var(--f-hand);color:var(--cherry);overflow-wrap:anywhere}
.hero-names .heart{font-size:.8em;margin:0 .1em;animation:heartbeat 2.2s ease-in-out infinite}
.hero-since{margin-top:.3em;font:400 .72rem var(--f-mono);letter-spacing:.06em;color:var(--ink-3)}
.hero-since .dot{margin:0 .35em;color:var(--rose)}

/* 9. the map + objects ----------------------------------------------------- */
.map{
  position:relative;z-index:2;container-type:inline-size;
  width:min(100% - 24px, 1120px, max(720px, calc((100svh - 250px) * 1.6)));
  aspect-ratio:1.6;margin:0 auto;
}
.map-trail{position:absolute;left:3%;top:2%;width:94%;height:96%;overflow:visible;pointer-events:none}
.map-trail path{fill:none;stroke:var(--rose);stroke-opacity:.5;stroke-width:1.6;stroke-dasharray:1 10;stroke-linecap:round;vector-effect:non-scaling-stroke}

.map-center{position:absolute;left:50%;top:37%;width:30cqw;translate:-50% 0;display:flex;flex-direction:column;align-items:center}
.map-rug{position:absolute;left:4%;right:4%;bottom:5%;height:26%;border-radius:50%;background:radial-gradient(closest-side,rgba(243,183,197,.75),rgba(243,183,197,0))}
.map-couple{position:relative;width:100%;filter:drop-shadow(0 1.4cqw 1.6cqw rgba(100,21,37,.16));animation:breathe 6s ease-in-out infinite}
.map-tip{margin-top:.2cqw;font:600 clamp(1rem,2.1cqw,1.6rem)/1 var(--f-hand);color:var(--rose)}

.map-deco{position:absolute;pointer-events:none}
.d-roses{width:6.5cqw;left:28.5%;top:71%;rotate:-18deg}
.d-stars{width:7cqw;left:35%;top:5%;animation:bob 7s ease-in-out infinite}
.d-sparkles{width:6cqw;left:59.5%;top:3%;animation:twinkleScale 4.5s ease-in-out infinite}
.d-hearts{width:6cqw;left:66%;top:33%;rotate:10deg;animation:bob 6s -2s ease-in-out infinite}

.objs{position:absolute;inset:0}
.obj{
  position:absolute;left:var(--x);top:var(--y);width:var(--w);translate:-50% 0;rotate:var(--r);
  display:flex;flex-direction:column;align-items:center;gap:.9cqw;
  padding:0;border:0;background:none;color:inherit;text-align:center;
}
.obj:focus-visible{outline-offset:8px;border-radius:18px}
.obj-art{position:relative;display:block;width:100%;animation:bob 5.5s ease-in-out infinite;animation-delay:calc(var(--i) * -1.1s)}
.obj-art > img{position:relative;width:100%;filter:drop-shadow(0 .9cqw 1.1cqw rgba(100,21,37,.2));transition:transform .45s var(--ease-back)}
.obj:hover .obj-art > img,.obj:focus-visible .obj-art > img{transform:scale(1.07) rotate(-2.5deg)}
.obj .obj-art-back{position:absolute;width:68%;right:-14%;top:-20%;rotate:14deg}
.obj:hover .obj-art-back{transform:rotate(8deg) translate(6%,-6%)}
.obj .obj-art-key{position:absolute;width:52%;left:-24%;bottom:-2%;rotate:-32deg}
.obj:hover .obj-art-key{transform:rotate(-14deg) translateX(6%)}
.obj-label{
  position:relative;display:inline-flex;align-items:center;gap:.4em;white-space:nowrap;
  padding:.75cqw 1.35cqw;border-radius:999px;background:var(--white);
  font:500 clamp(.6rem,1.02cqw,.82rem)/1 var(--f-mono);letter-spacing:.12em;color:var(--wine);
  box-shadow:inset 0 0 0 1.5px rgba(100,21,37,.14),0 .35cqw 0 var(--pink);
  transition:box-shadow .4s,background .3s;
}
.obj:hover .obj-label{background:var(--blush)}
.obj.is-found .obj-label{box-shadow:inset 0 0 0 1.5px rgba(214,173,98,.6),0 .35cqw 0 var(--gold)}
.obj-hint{
  position:absolute;top:100%;left:50%;translate:-50% -4px;margin-top:.5cqw;white-space:nowrap;
  font:600 clamp(.95rem,1.75cqw,1.35rem)/1 var(--f-hand);color:var(--rose);
  opacity:0;transition:opacity .3s,translate .3s;pointer-events:none;
}
.obj:hover .obj-hint,.obj:focus-visible .obj-hint{opacity:1;translate:-50% 0}
.obj-star{
  position:absolute;top:-2%;right:-2%;width:2.8cqw;min-width:22px;aspect-ratio:1;border-radius:50%;
  display:grid;place-items:center;background:var(--gold);color:var(--white);font-size:clamp(11px,1.4cqw,16px);
  box-shadow:0 0 0 3px var(--white),0 4px 10px rgba(100,21,37,.2);
  scale:0;transition:scale .55s var(--ease-back);
}
.obj.is-found .obj-star{scale:1}

@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}
@keyframes breathe{0%,100%{transform:scale(1)}50%{transform:scale(1.012)}}
@keyframes twinkleScale{0%,100%{transform:scale(1) rotate(0);opacity:.95}50%{transform:scale(.82) rotate(12deg);opacity:.6}}

/* 10. world foot / other side --------------------------------------------- */
.world-foot{
  position:relative;z-index:2;display:flex;flex-direction:column;align-items:center;gap:16px;
  padding:clamp(6px,1.5vh,16px) 18px 36px;margin-top:auto;
}
.foot-progress{font:600 1.35rem/1.2 var(--f-hand);color:var(--rose);text-align:center}
.foot-progress b{color:var(--cherry)}
.last-letter{
  display:flex;align-items:center;gap:14px;max-width:100%;
  padding:10px 24px 10px 12px;border:0;border-radius:20px;background:var(--white);color:inherit;text-align:left;
  box-shadow:inset 0 0 0 1.5px rgba(214,173,98,.55),0 6px 0 var(--pink),0 24px 40px -22px rgba(100,21,37,.55);
  animation:riseIn .9s var(--ease-out) both, glow 3s 1s ease-in-out infinite;
  transition:transform .3s var(--ease-back);
}
.last-letter:hover{transform:translateY(-3px) rotate(-1deg)}
.last-letter img{width:56px;flex:none;animation:bob 4s ease-in-out infinite}
.last-letter-text{display:flex;flex-direction:column;font:italic 500 1.3rem/1.2 var(--f-display);color:var(--wine)}
.last-letter-text small{font:500 .62rem var(--f-mono);font-style:normal;letter-spacing:.16em;text-transform:uppercase;color:var(--gold);margin-bottom:4px}
@keyframes glow{0%,100%{box-shadow:inset 0 0 0 1.5px rgba(214,173,98,.55),0 6px 0 var(--pink),0 24px 40px -22px rgba(100,21,37,.55)}50%{box-shadow:inset 0 0 0 1.5px rgba(214,173,98,.9),0 6px 0 var(--gold-soft),0 0 38px -4px rgba(214,173,98,.6)}}

.other-side{
  position:relative;align-self:flex-end;display:inline-flex;align-items:center;gap:8px;
  margin-right:clamp(0px,3vw,40px);padding:10px 50px 12px 20px;min-height:50px;
  border:0;border-radius:16px 16px 6px 16px;background:var(--white);color:var(--wine);
  font:600 1.45rem/1 var(--f-hand);
  box-shadow:inset 0 0 0 1.5px var(--line),0 5px 0 var(--blush);
  transition:transform .3s var(--ease-back);
}
.other-side::after{
  content:"";position:absolute;right:0;bottom:0;width:30px;height:30px;border-radius:0 0 6px 0;
  background:linear-gradient(315deg,var(--cream) 0 47%,#E7B9C5 49%,#F9DCE3 100%);
  box-shadow:-3px -3px 5px rgba(100,21,37,.12);transition:width .35s var(--ease-out),height .35s var(--ease-out);
}
.other-side:hover{transform:translateY(-2px)}
.other-side:hover::after{width:42px;height:42px}
.other-side .arrow{display:inline-block;transition:transform .3s}
.other-side:hover .arrow{transform:translateX(5px)}
.other-side.is-hinting{animation:nudge 2.2s ease-in-out infinite}
@keyframes nudge{0%,70%,100%{transform:none}78%{transform:translateX(-6px) rotate(-2deg)}88%{transform:translateX(4px) rotate(1deg)}}

/* 11. the world before you ------------------------------------------------ */
.face--back{
  background:
    radial-gradient(70% 50% at 50% 20%, rgba(255,255,255,.55), transparent 70%),
    #ECE7E5;
  color:#62585C;
}
.before{max-width:1000px;margin:0 auto;padding:clamp(40px,9vh,96px) 18px 64px;text-align:center}
.before-kicker{font:500 .68rem var(--f-mono);letter-spacing:.22em;text-transform:uppercase;color:#9A8F93}
.before-title{margin-top:.3em;font:600 clamp(2rem,5.6vw,4.2rem)/1 var(--f-display);letter-spacing:.03em;color:#6E6468;text-wrap:balance}
.before-sub{margin-top:.6em;font:italic 400 clamp(1rem,2.2vw,1.2rem)/1.4 var(--f-display);color:#83797D}
.before-cards{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(min(190px,100%),1fr));gap:22px;
  max-width:920px;margin:clamp(30px,6vh,54px) auto;
}
.before-card{
  position:relative;padding:24px 16px 20px;border-radius:18px;background:#F7F4F2;
  box-shadow:inset 0 0 0 1.5px #CFC6C9,0 5px 0 #DDD6D8;rotate:var(--r);
  opacity:0;translate:0 18px;transition:opacity .7s ease,translate .7s var(--ease-out);
  transition-delay:calc(var(--i) * .16s);
}
.before-card.is-shown{opacity:1;translate:0}
.before-cloud{position:absolute;top:10px;right:14px;font-size:1.35rem;color:#A99FA3;line-height:1}
.before-cloud::after{content:"";position:absolute;left:30%;top:100%;width:2px;height:7px;border-radius:2px;background:#B8AEB2;box-shadow:6px 3px 0 #B8AEB2,12px -1px 0 #B8AEB2;animation:rain 1.1s linear infinite}
.before-card img{width:86px;height:78px;object-fit:contain;margin:4px auto 12px;filter:grayscale(1) contrast(.8) brightness(1.08);opacity:.72;rotate:-9deg}
.before-card p{font:600 1.6rem/1.15 var(--f-hand);color:#6E6468}
.before-enough{font:italic 400 clamp(1.2rem,3vw,1.5rem) var(--f-display);color:#6E6468;opacity:0;transform:translateY(10px);transition:opacity .9s,transform .9s}
.before-enough.is-shown{opacity:1;transform:none}
.before-back{margin-top:22px;opacity:0;transition:opacity .8s .3s}
.before-back.is-shown{opacity:1}
@keyframes rain{0%{transform:translateY(-3px);opacity:0}30%{opacity:1}100%{transform:translateY(9px);opacity:0}}

/* 12. windows (dialogs) ---------------------------------------------------- */
dialog.window{
  width:min(1060px,calc(100% - 48px));max-width:none;height:auto;max-height:calc(100dvh - 48px);
  padding:0;border:0;background:transparent;overflow:visible;color:inherit;
}
dialog.window::backdrop{background:rgba(67,35,42,.3);backdrop-filter:blur(7px);-webkit-backdrop-filter:blur(7px);animation:fadeIn .4s ease}
dialog.window.is-closing::backdrop{animation:fadeOut .32s ease forwards}
dialog.window > .win{
  display:flex;flex-direction:column;max-height:calc(100dvh - 48px);
  transform-origin:var(--ox,50%) var(--oy,50%);
  animation:winIn .6s var(--ease-out) both;
}
dialog.window.is-closing > .win{animation:winOut .32s ease forwards}
.win-body{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;border-radius:0 0 var(--r-win) var(--r-win);padding:clamp(20px,3.4vw,40px)}
@keyframes winIn{from{opacity:0;transform:scale(.35);filter:blur(10px)}60%{filter:blur(0)}to{opacity:1;transform:none;filter:none}}
@keyframes winOut{to{opacity:0;transform:scale(.9) translateY(12px);filter:blur(4px)}}

.win-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:clamp(18px,3vw,30px)}
.win-head--center{justify-content:center;text-align:center}
.win-head-text{min-width:0}
.win-kicker{font:500 .66rem var(--f-mono);letter-spacing:.2em;text-transform:uppercase;color:var(--rose)}
.win-h{margin-top:.25em;font:600 clamp(1.7rem,4vw,2.8rem)/1.02 var(--f-display);letter-spacing:.02em;color:var(--wine)}
.win-h .note{display:inline-block;width:.62em;height:.62em;vertical-align:.02em;fill:var(--gold)}
.win-sub{margin-top:.4em;font:italic 400 clamp(1rem,2vw,1.18rem)/1.4 var(--f-display);color:var(--ink-2)}
.win-head-art{width:clamp(96px,16vw,170px);flex:none;filter:drop-shadow(0 8px 12px rgba(100,21,37,.15));animation:bob 5s ease-in-out infinite}
.win-head .edit-chip{margin-top:12px}
.from-link .owner-only{display:none}
.win-body:focus{outline:none}
.win-end{margin-top:10px;text-align:center;font:600 1.4rem var(--f-hand);color:var(--rose)}

/* 13. the moments ---------------------------------------------------------- */
.moments{background:
  radial-gradient(circle at 1px 1px, rgba(100,21,37,.09) 1px, transparent 1.5px) 0 0/22px 22px,
  var(--paper);}
.board{display:flex;align-items:flex-start;gap:clamp(22px,3.4vw,40px);padding:12px 6px 6px}
.board-col{flex:1;min-width:0;display:flex;flex-direction:column;gap:clamp(30px,4vw,46px)}
.board-col:nth-child(2){padding-top:clamp(20px,5vw,56px)}
.board-col:nth-child(3){padding-top:clamp(8px,2vw,18px)}
.snap{
  position:relative;margin:0;
  rotate:var(--r);transition:rotate .45s var(--ease-back),translate .45s var(--ease-back);
  animation:snapIn .7s calc(var(--i) * .07s) var(--ease-out) both;
}
.snap:hover{rotate:0deg;translate:0 -5px}
.snap-btn{display:block;width:100%;padding:0;border:0;background:none;text-align:left;cursor:zoom-in;color:inherit}
.snap-photo{display:block;aspect-ratio:var(--ar,4/5);overflow:hidden;background:var(--blush)}
.snap-photo img{width:100%;height:100%;object-fit:cover;transition:transform .8s var(--ease-out),filter .6s}
.snap:hover .snap-photo img{transform:scale(1.05)}
.snap-cap{display:block;margin-top:9px;font:600 1.45rem/1.1 var(--f-hand);color:var(--wine);overflow-wrap:anywhere}
.snap-date{display:block;margin-top:2px;font:400 .66rem var(--f-mono);letter-spacing:.1em;color:var(--rose)}

.snap--polaroid .snap-btn{padding:11px 11px 14px;background:var(--white);box-shadow:0 1px 0 rgba(67,35,42,.06),0 16px 26px -14px rgba(67,35,42,.45)}
.snap--taped .snap-btn{padding:8px 8px 12px;background:#FFFDF7;box-shadow:0 14px 24px -14px rgba(67,35,42,.45)}
.snap--taped::before,.snap--taped::after{
  content:"";position:absolute;z-index:2;top:-12px;width:78px;height:24px;
  background:rgba(243,183,197,.78);
  clip-path:polygon(0 8%,6% 0,12% 10%,20% 0,28% 8%,36% 0,44% 9%,52% 0,60% 8%,68% 0,76% 10%,84% 0,92% 8%,100% 0,100% 92%,94% 100%,86% 90%,78% 100%,70% 92%,62% 100%,54% 90%,46% 100%,38% 92%,30% 100%,22% 90%,14% 100%,6% 92%,0 100%);
}
.snap--taped::before{left:-14px;rotate:-38deg}
.snap--taped::after{right:-14px;rotate:36deg;background:rgba(214,173,98,.55)}
.snap--corners .snap-btn{padding:13px;background:#F5E6DB;box-shadow:inset 0 0 0 1px rgba(100,21,37,.07),0 14px 24px -16px rgba(67,35,42,.5)}
.snap--corners .snap-photo{position:relative;overflow:visible}
.snap--corners .snap-photo::before,.snap--corners .snap-photo::after{
  content:"";position:absolute;z-index:1;width:26px;height:26px;background:var(--wine);
}
.snap--corners .snap-photo::before{left:-5px;top:-5px;clip-path:polygon(0 0,100% 0,0 100%)}
.snap--corners .snap-photo::after{right:-5px;bottom:-5px;clip-path:polygon(100% 0,100% 100%,0 100%)}
.snap--corners .snap-photo img{position:relative}
.snap-sticker{position:absolute;z-index:3;width:clamp(46px,6vw,64px);pointer-events:none;filter:drop-shadow(0 3px 4px rgba(100,21,37,.18))}
.snap-sticker--br{right:-16px;bottom:-18px;rotate:14deg}
.snap-sticker--tl{left:-16px;top:-18px;rotate:-16deg}
@keyframes snapIn{from{opacity:0;translate:0 26px}to{opacity:1;translate:0}}

/* 14. lightbox ------------------------------------------------------------- */
dialog.lightbox{
  width:100%;height:100%;max-width:none;max-height:none;margin:0;padding:0;border:0;
  background:transparent;color:var(--cream);overflow:hidden;
}
dialog.lightbox[open]{display:flex;flex-direction:column}
dialog.lightbox::backdrop{background:rgba(42,10,20,.9);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);animation:fadeIn .4s}
dialog.lightbox.is-closing{animation:fadeOut .3s forwards}
.lb-close{position:absolute;z-index:3;top:max(12px,env(safe-area-inset-top));right:12px;width:48px;height:48px;border-radius:50%;border:0;background:rgba(255,247,240,.1);display:grid;place-items:center}
.lb-close svg{width:20px;height:20px;stroke:var(--cream);stroke-width:2;stroke-linecap:round;fill:none}
.lb-close:hover{background:rgba(255,247,240,.2)}
.lb-stage{flex:1;min-height:0;display:grid;place-items:center;padding:64px 16px 8px;touch-action:pan-y}
.lb-card{
  display:flex;flex-direction:column;max-width:min(92vw,760px);max-height:100%;
  padding:12px 12px 16px;background:var(--white);border-radius:4px;color:var(--choc);
  box-shadow:0 30px 70px -20px rgba(0,0,0,.55);
  animation:lbIn .6s var(--ease-out) both;
}
.lb-card.is-swap-next{animation:lbNext .55s var(--ease-out) both}
.lb-card.is-swap-prev{animation:lbPrev .55s var(--ease-out) both}
.lb-photo{min-height:0;display:flex;justify-content:center;background:var(--blush)}
.lb-photo img{width:auto;max-width:100%;max-height:calc(100dvh - 250px);object-fit:contain}
.lb-card figcaption{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding:12px 4px 0}
.lb-cap{font:600 clamp(1.5rem,4vw,2rem)/1.1 var(--f-hand);color:var(--wine);overflow-wrap:anywhere}
.lb-date{flex:none;font:400 .7rem var(--f-mono);letter-spacing:.1em;color:var(--rose)}
.lb-nav{display:flex;align-items:center;justify-content:center;gap:clamp(10px,3vw,24px);padding:14px 14px max(18px,env(safe-area-inset-bottom))}
.lb-btn{min-height:48px;padding:0 20px;border-radius:999px;border:0;background:var(--cream);color:var(--wine);font:600 1.3rem var(--f-hand);transition:transform .25s var(--ease-back)}
.lb-btn:hover{transform:translateY(-2px)}
.lb-btn--ghost{background:transparent;color:var(--cream);box-shadow:inset 0 0 0 1.5px rgba(255,247,240,.35)}
.lb-count{font:400 .72rem var(--f-mono);letter-spacing:.14em;color:rgba(255,247,240,.65);white-space:nowrap}
@keyframes lbIn{from{opacity:0;transform:scale(.9) rotate(-2deg);filter:blur(8px)}to{opacity:1;transform:none;filter:none}}
@keyframes lbNext{from{opacity:0;transform:translateX(50px) rotate(2deg)}to{opacity:1;transform:none}}
@keyframes lbPrev{from{opacity:0;transform:translateX(-50px) rotate(-2deg)}to{opacity:1;transform:none}}

/* 15. the things we say ---------------------------------------------------- */
.chat{
  display:flex;flex-direction:column;height:min(560px,calc(100dvh - 330px));min-height:360px;
  border-radius:20px;overflow:hidden;background:var(--paper);box-shadow:inset 0 0 0 1.5px var(--line);
}
.chat-top{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1.5px dashed var(--line);background:var(--white)}
.chat-avatars{display:flex;flex:none}
.chat-avatars i{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;font:500 .72rem var(--f-mono);font-style:normal;color:var(--white);background:var(--cherry);box-shadow:0 0 0 2.5px var(--white)}
.chat-avatars i + i{margin-left:-10px;background:var(--rose)}
.chat-who{display:flex;flex-direction:column;min-width:0;line-height:1.25}
.chat-who b{font:600 .95rem var(--f-sans);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-who small{font:400 .66rem var(--f-mono);letter-spacing:.06em;color:var(--rose)}
.thread{
  flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;cursor:pointer;
  display:flex;flex-direction:column;gap:12px;padding:20px clamp(12px,3vw,24px);
  background:repeating-linear-gradient(180deg,transparent 0 31px,rgba(217,106,131,.1) 31px 32px);
}
.thread-day{align-self:center;padding:5px 12px;border-radius:999px;background:var(--blush);font:400 .64rem var(--f-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--wine)}
.msg{display:flex;align-items:flex-end;gap:8px;max-width:min(86%,520px);animation:msgIn .5s var(--ease-back) both}
.msg--r{align-self:flex-end;flex-direction:row-reverse}
.msg-av{flex:none;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font:500 .6rem var(--f-mono);color:var(--white);background:var(--rose)}
.msg--r .msg-av{background:var(--cherry)}
.msg-col{display:flex;flex-direction:column;min-width:0}
.msg--r .msg-col{align-items:flex-end}
.msg-bubble{
  position:relative;padding:10px 15px;border-radius:20px;font:400 1rem/1.45 var(--f-sans);overflow-wrap:anywhere;
  background:var(--white);color:var(--choc);box-shadow:inset 0 0 0 1.5px var(--line);border-bottom-left-radius:6px;
}
.msg--r .msg-bubble{background:linear-gradient(160deg,#B8264A,var(--cherry));color:var(--white);box-shadow:0 6px 14px -8px rgba(100,21,37,.6);border-radius:20px 20px 6px 20px}
.msg-tag{display:table;margin-bottom:5px;padding:2px 7px;border-radius:5px;font:500 .56rem var(--f-mono);letter-spacing:.14em;text-transform:uppercase;background:var(--gold-soft);color:var(--wine);rotate:-2deg}
.msg-meta{margin-top:4px;padding:0 6px;font:400 .6rem var(--f-mono);letter-spacing:.06em;color:var(--ink-3)}
.msg-photo-btn{
  display:inline-flex;align-items:center;gap:6px;margin-top:8px;min-height:36px;padding:0 12px;border-radius:999px;
  border:1.5px dashed currentColor;background:transparent;font:500 .66rem var(--f-mono);letter-spacing:.08em;
}
.msg-photo{display:block;width:min(220px,58vw);margin-top:8px;padding:7px 7px 10px;border-radius:3px;background:var(--white);rotate:-2deg;box-shadow:0 10px 20px -10px rgba(67,35,42,.5);animation:photoIn .7s var(--ease-back) both}
.msg-photo img{width:100%;aspect-ratio:4/5;object-fit:cover}
.typing{display:inline-flex;gap:5px;align-items:center;min-height:24px}
.typing i{width:7px;height:7px;border-radius:50%;background:currentColor;opacity:.5;animation:typing 1.1s ease-in-out infinite}
.typing i:nth-child(2){animation-delay:.15s}
.typing i:nth-child(3){animation-delay:.3s}
.composer{display:flex;align-items:center;gap:10px;padding:10px 12px;border-top:1.5px dashed var(--line);background:var(--white)}
.composer-field{
  flex:1;min-width:0;min-height:48px;display:flex;align-items:center;padding:0 18px;border-radius:999px;cursor:pointer;
  background:var(--paper);box-shadow:inset 0 0 0 1.5px var(--line);color:var(--ink-3);font-size:.93rem;
  overflow:hidden;white-space:nowrap;text-overflow:ellipsis;
}
.composer-send{flex:none;width:48px;height:48px;border-radius:50%;border:0;display:grid;place-items:center;background:var(--cherry);box-shadow:0 3px 0 var(--wine);transition:transform .25s var(--ease-back)}
.composer-send svg{width:22px;height:22px;fill:var(--white)}
.composer-send:hover{transform:scale(1.07)}
.composer-send:active{transform:scale(.94)}
.chat.is-done .composer-send{background:var(--gold);box-shadow:0 3px 0 #A9843F}
@keyframes msgIn{from{opacity:0;transform:translateY(12px) scale(.94)}to{opacity:1;transform:none}}
@keyframes photoIn{from{opacity:0;transform:scale(.7) rotate(-8deg)}to{opacity:1;transform:none}}
@keyframes typing{0%,60%,100%{transform:translateY(0);opacity:.35}30%{transform:translateY(-4px);opacity:.9}}

/* 16. our soundtrack ------------------------------------------------------- */
.sound{background:
  radial-gradient(70% 60% at 20% 10%, rgba(243,183,197,.28), transparent 70%),
  var(--paper);}
.sound-grid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:clamp(22px,4vw,48px);align-items:center}
.deck{display:flex;flex-direction:column;gap:16px;min-width:0}
.sides{display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:5px;border-radius:16px;background:var(--white);box-shadow:inset 0 0 0 1.5px var(--line)}
.side-btn{display:flex;flex-direction:column;align-items:center;gap:1px;min-height:52px;padding:7px 8px;border:0;border-radius:12px;background:transparent;color:var(--ink-2);transition:background .3s,color .3s}
.side-btn b{font:500 .64rem var(--f-mono);letter-spacing:.18em}
.side-btn span{font:600 1.15rem/1.1 var(--f-hand);overflow-wrap:anywhere}
.side-btn.is-on{background:var(--wine);color:var(--cream)}

.tape-wrap{position:relative;width:100%;max-width:460px;margin:6px auto 0;container-type:inline-size;perspective:1400px}
.notes{position:absolute;left:0;right:0;top:18%;height:40px;pointer-events:none;z-index:3}
.tape{position:relative;aspect-ratio:1.58;transform-style:preserve-3d;transition:transform .95s cubic-bezier(.6,0,.3,1)}
.tape.is-b{transform:rotateY(180deg)}
.tape-face{
  position:absolute;inset:0;padding:5.6cqw 5.6cqw 0;border-radius:4.4cqw;
  backface-visibility:hidden;-webkit-backface-visibility:hidden;
  background:linear-gradient(150deg,#BC2A4B,var(--cherry) 45%,#8A1530);
  box-shadow:inset 0 0 0 .7cqw rgba(255,255,255,.07),inset 0 -1.5cqw 3cqw rgba(0,0,0,.18),0 4cqw 7cqw -3cqw rgba(100,21,37,.55);
}
.tape-face--b{transform:rotateY(180deg);background:linear-gradient(150deg,#E07D93,var(--rose) 45%,#B9546C)}
.screw{position:absolute;width:2.6cqw;aspect-ratio:1;border-radius:50%;background:radial-gradient(circle at 35% 35%,#FBEBC8,#B8914A 70%)}
.screw::after{content:"";position:absolute;left:20%;right:20%;top:46%;height:9%;background:rgba(80,50,20,.5);rotate:40deg}
.s1{left:2.2cqw;top:2.2cqw}.s2{right:2.2cqw;top:2.2cqw}.s3{left:2.2cqw;bottom:2.2cqw}.s4{right:2.2cqw;bottom:2.2cqw}
.tape-label{
  position:relative;height:66%;border-radius:2.6cqw;padding:2.6cqw 3.6cqw;
  background:linear-gradient(180deg,var(--cream) 0 34%,var(--pink) 34% 37%,var(--cream) 37%);
}
.tape-side{position:absolute;left:3.4cqw;top:1.4cqw;font:700 6.4cqw/1 var(--f-display);color:var(--cherry)}
.tape-face--b .tape-side{color:var(--wine)}
.tape-title{display:block;margin:0 9cqw;text-align:center;font:700 6cqw/1.2 var(--f-hand);color:var(--wine);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tape-window{
  position:absolute;left:15%;right:15%;bottom:9%;height:47%;border-radius:9cqw;overflow:hidden;
  display:flex;align-items:center;justify-content:space-between;padding:0 3.6cqw;
  background:linear-gradient(180deg,#3B1A21,#4E252D);box-shadow:inset 0 .8cqw 1.6cqw rgba(0,0,0,.5);
}
.reel{position:relative;width:13.5cqw;aspect-ratio:1;display:grid;place-items:center}
.reel::before{
  content:"";position:absolute;inset:-28%;border-radius:50%;
  background:radial-gradient(circle,#2A1216 0 33%,#6B3A33 34% 100%);
  box-shadow:inset 0 0 0 .4cqw rgba(0,0,0,.2);
  transform:scale(var(--pack,.8));transition:transform .5s linear;
}
.reel--l::before{--pack:calc(.55 + .45 * (1 - var(--p,0)))}
.reel--r::before{--pack:calc(.55 + .45 * var(--p,0))}
.reel svg{position:relative;width:100%;height:100%;fill:none;stroke:var(--cream);stroke-width:2.6;stroke-linecap:round}
.reel svg circle{fill:var(--cream);stroke:none}
.tape-strip{position:absolute;left:18%;right:18%;bottom:14%;height:1.1cqw;background:#2A1216;border-radius:2px}
.tape-foot{
  position:absolute;left:21%;right:21%;bottom:0;height:17%;display:flex;align-items:center;justify-content:space-around;padding:0 9%;
  background:rgba(0,0,0,.16);clip-path:polygon(9% 0,91% 0,100% 100%,0 100%);
}
.tape-foot i{width:2.6cqw;aspect-ratio:1;border-radius:50%;background:rgba(0,0,0,.35)}
.sound.is-playing .reel svg{animation:spin 2.2s linear infinite}
.sound.is-playing .tape{animation:tapeHum 3s ease-in-out infinite}
.tape.is-b{animation:none!important}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes tapeHum{0%,100%{translate:0 0}50%{translate:0 -3px}}

.controls{display:flex;align-items:center;gap:14px;margin-top:6px}
.play{
  flex:none;width:64px;height:64px;border-radius:50%;border:0;display:grid;place-items:center;
  background:linear-gradient(180deg,#B8264A,var(--cherry));box-shadow:0 5px 0 var(--wine),0 16px 26px -12px rgba(100,21,37,.6);
  transition:transform .25s var(--ease-back);
}
.play:hover{transform:scale(1.05)}
.play:active{transform:translateY(3px)}
.play svg{width:28px;height:28px;fill:var(--white)}
.play .i-pause,.sound.is-playing .play .i-play{display:none}
.sound.is-playing .play .i-pause{display:block}
.progress{flex:1;min-width:0}
.times{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px;font:400 .68rem var(--f-mono);color:var(--ink-3)}
.eq{display:inline-flex;align-items:flex-end;gap:3px;height:16px;opacity:.25;transition:opacity .4s}
.eq i{width:3px;height:100%;border-radius:2px;background:var(--rose);transform-origin:bottom;transform:scaleY(.25)}
.sound.is-playing .eq{opacity:1}
.sound.is-playing .eq i{animation:eq .8s ease-in-out infinite}
.eq i:nth-child(2){animation-delay:-.2s!important;background:var(--cherry)}
.eq i:nth-child(3){animation-delay:-.45s!important;background:var(--gold)}
.eq i:nth-child(4){animation-delay:-.1s!important}
.eq i:nth-child(5){animation-delay:-.6s!important;background:var(--cherry)}
.eq i:nth-child(6){animation-delay:-.35s!important;background:var(--gold)}
.eq i:nth-child(7){animation-delay:-.7s!important}
@keyframes eq{0%,100%{transform:scaleY(.25)}50%{transform:scaleY(1)}}

input[type=range]{
  -webkit-appearance:none;appearance:none;width:100%;height:28px;background:transparent;cursor:pointer;
  --fill:0%;
}
input[type=range]::-webkit-slider-runnable-track{height:6px;border-radius:6px;background:linear-gradient(90deg,var(--cherry) var(--fill),var(--blush) var(--fill))}
input[type=range]::-moz-range-track{height:6px;border-radius:6px;background:var(--blush)}
input[type=range]::-moz-range-progress{height:6px;border-radius:6px;background:var(--cherry)}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:20px;height:20px;margin-top:-7px;border-radius:50%;background:var(--white);box-shadow:0 0 0 3px var(--cherry),0 3px 6px rgba(100,21,37,.3)}
input[type=range]::-moz-range-thumb{width:18px;height:18px;border:0;border-radius:50%;background:var(--white);box-shadow:0 0 0 3px var(--cherry),0 3px 6px rgba(100,21,37,.3)}
.volume{display:flex;align-items:center;gap:10px;max-width:260px}
.volume svg{flex:none;width:22px;height:22px;fill:var(--wine);stroke:var(--wine);stroke-width:0}
.volume svg .wave{fill:none;stroke-width:1.8;stroke-linecap:round}
.sound-missing{padding:10px 14px;border-radius:12px;background:var(--blush);font-size:.85rem;color:var(--wine)}
.sound-missing code{font:400 .78rem var(--f-mono)}

.sound-side{display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;min-width:0}
.sound-couple{width:min(100%,330px);filter:drop-shadow(0 10px 14px rgba(100,21,37,.14))}
.sound.is-playing .sound-couple{animation:sway 3.2s ease-in-out infinite}
.sound-now{display:flex;flex-direction:column;gap:2px;line-height:1.2;min-width:0;max-width:100%}
.sound-now small{font:500 .62rem var(--f-mono);letter-spacing:.2em;text-transform:uppercase;color:var(--rose)}
.sound-now b{font:600 clamp(1.3rem,2.6vw,1.6rem) var(--f-display);color:var(--wine);overflow-wrap:anywhere}
.sound-now span{font-size:.9rem;color:var(--ink-3)}
.sound-cap{font:600 1.55rem/1.15 var(--f-hand);color:var(--cherry)}
@keyframes sway{0%,100%{transform:rotate(-1.2deg)}50%{transform:rotate(1.2deg) translateY(-3px)}}

/* 17. the secret ----------------------------------------------------------- */
.secret{
  display:grid;place-items:center;min-height:min(560px,calc(100dvh - 140px));text-align:center;
  background:radial-gradient(60% 50% at 50% 30%, rgba(243,221,176,.35), transparent 70%),var(--paper);
}
.sec-stage{display:none;width:100%;flex-direction:column;align-items:center;gap:16px}
.secret[data-stage=locked] .sec-locked,
.secret[data-stage=pin] .sec-pin,
.secret[data-stage=open] .sec-open{display:flex;animation:riseIn .7s var(--ease-out) both}
.sec-objects{position:relative;display:flex;align-items:flex-end;justify-content:center;gap:clamp(4px,2vw,20px);height:clamp(150px,26vw,230px)}
.sec-key{width:clamp(84px,15vw,130px);align-self:center;animation:keyFloat 3.6s ease-in-out infinite}
.sec-box{width:clamp(130px,24vw,210px);filter:drop-shadow(0 10px 14px rgba(100,21,37,.2))}
.sec-locked.is-turning .sec-key{animation:keyIn .95s cubic-bezier(.6,0,.3,1) forwards}
.sec-locked.is-turning .sec-box{animation:boxWiggle .6s .7s ease-in-out}
.sec-line{max-width:34ch;font:italic 400 clamp(1.1rem,2.6vw,1.35rem)/1.4 var(--f-display);color:var(--ink-2)}
@keyframes keyFloat{0%,100%{transform:translateY(0) rotate(-8deg)}50%{transform:translateY(-10px) rotate(4deg)}}
@keyframes keyIn{
  0%{transform:translateY(0) rotate(-8deg)}
  55%{transform:translate(60%,10%) rotate(80deg) scale(.8)}
  100%{transform:translate(90%,40%) rotate(90deg) scale(.4);opacity:0}
}
@keyframes boxWiggle{0%,100%{transform:rotate(0)}25%{transform:rotate(-4deg)}50%{transform:rotate(3deg)}75%{transform:rotate(-2deg)}}

.pin-title{font:italic 500 clamp(1.25rem,3vw,1.6rem) var(--f-display);color:var(--wine)}
.pin-dots{display:flex;gap:14px;justify-content:center;min-height:22px;margin:4px 0 6px}
.pin-dots i{width:18px;height:18px;border-radius:50%;box-shadow:inset 0 0 0 2px var(--cherry);transition:background .2s,transform .25s var(--ease-back)}
.pin-dots i.on{background:var(--cherry);transform:scale(1.12)}
.pin-dots.is-wrong{animation:shake .45s}
.pin-dots.is-right i{background:var(--gold);box-shadow:inset 0 0 0 2px var(--gold)}
.keypad{display:grid;grid-template-columns:repeat(3,clamp(60px,17vw,74px));gap:clamp(10px,2.4vw,14px);justify-content:center}
.key{
  aspect-ratio:1;border-radius:50%;border:0;background:var(--white);color:var(--wine);
  font:500 1.5rem/1 var(--f-display);box-shadow:inset 0 0 0 1.5px var(--line),0 4px 0 var(--blush);
  transition:transform .15s,background .2s;touch-action:manipulation;
}
.key:hover{background:var(--blush)}
.key:active,.key.is-pressed{transform:translateY(3px);box-shadow:inset 0 0 0 1.5px var(--line),0 1px 0 var(--blush)}
.key--soft{font:500 .7rem var(--f-mono);letter-spacing:.08em;color:var(--ink-3)}
.key--heart{color:var(--cherry);font-size:1.4rem}
.pin-text{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}
.pin-text input{min-height:50px;width:min(260px,100%);padding:0 18px;border-radius:999px;border:0;background:var(--white);box-shadow:inset 0 0 0 1.5px var(--line-2);text-align:center;font-size:1.1rem;letter-spacing:.2em}
.pin-text.is-wrong{animation:shake .45s}
.pin-msg{min-height:1.5em;font:600 1.35rem/1.2 var(--f-hand);color:var(--rose)}
.pin-hint-btn{border:0;background:none;min-height:40px;font:500 .7rem var(--f-mono);letter-spacing:.1em;color:var(--ink-3);text-decoration:underline;text-underline-offset:4px}
.pin-hint{font:600 1.3rem var(--f-hand);color:var(--wine);animation:riseIn .5s both}
@keyframes shake{0%,100%{transform:translateX(0)}20%{transform:translateX(-10px)}40%{transform:translateX(9px)}60%{transform:translateX(-6px)}80%{transform:translateX(4px)}}

.granted{
  display:inline-block;padding:10px 18px;border-radius:8px;rotate:-3deg;
  font:500 clamp(.9rem,2.6vw,1.1rem) var(--f-mono);letter-spacing:.24em;color:#9C7632;
  box-shadow:inset 0 0 0 2.5px var(--gold);background:rgba(243,221,176,.35);
  animation:stamp .7s var(--ease-back) both;
}
.granted .heart{color:var(--cherry)}
@keyframes stamp{0%{opacity:0;transform:scale(2.4) rotate(8deg)}60%{opacity:1;transform:scale(.94)}100%{transform:scale(1)}}
.letters{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:clamp(16px,2.6vw,28px);width:100%;align-items:start;margin-top:8px}
.letter{min-width:0;animation:riseIn .8s calc(.25s + var(--i) * .18s) var(--ease-out) both}
.env{
  position:relative;display:block;width:100%;aspect-ratio:1.45;padding:0;border:0;background:none;perspective:900px;
  transition:transform .35s var(--ease-back);
}
.env:hover{transform:translateY(-4px) rotate(-1deg)}
.env > span{position:absolute;display:block}
.env-back{inset:0;border-radius:10px;background:#EFD2C9;box-shadow:0 16px 26px -16px rgba(100,21,37,.5)}
.env-paper{
  left:8%;right:8%;top:8%;bottom:8%;z-index:1;border-radius:4px;background:var(--white);
  background-image:repeating-linear-gradient(180deg,transparent 0 13px,rgba(217,106,131,.25) 13px 14px);
  transition:transform .7s .35s var(--ease-out);
}
.env-front{
  inset:0;z-index:2;border-radius:10px;background:#F8E6DD;
  clip-path:polygon(0 0,50% 56%,100% 0,100% 100%,0 100%);
}
.env-flap{
  left:0;right:0;top:0;height:60%;z-index:3;transform-origin:top;
  background:#EBC4BA;clip-path:polygon(0 0,100% 0,50% 100%);border-radius:10px 10px 0 0;
  transition:transform .6s var(--ease-out),z-index 0s .3s;
}
.env-seal{
  left:50%;top:60%;z-index:4;width:34px;height:34px;margin:-17px 0 0 -17px;border-radius:50%;
  display:grid;place-items:center;background:radial-gradient(circle at 35% 35%,#C73556,var(--cherry) 60%,#861530);color:var(--pink);font-size:15px;
  box-shadow:0 2px 4px rgba(100,21,37,.35);transition:transform .4s,opacity .4s;
}
.env-title{left:8%;right:8%;bottom:9%;z-index:4;font:500 clamp(.56rem,1.1vw,.68rem)/1.35 var(--f-mono);letter-spacing:.12em;color:var(--wine);text-align:center}
.letter.is-open .env-flap{transform:rotateX(180deg);z-index:0;transition:transform .6s var(--ease-out),z-index 0s .25s}
.letter.is-open .env-seal{transform:scale(0);opacity:0}
.letter.is-open .env-paper{transform:translateY(-34%)}
.letter-body{display:grid;grid-template-rows:0fr;transition:grid-template-rows .7s .55s var(--ease-out)}
.letter.is-open .letter-body{grid-template-rows:1fr}
.letter-body > div{overflow:hidden}
.letter-body p{
  margin-top:14px;padding:16px 16px 18px;border-radius:12px;background:var(--white);text-align:left;
  font:600 1.35rem/1.25 var(--f-hand);color:var(--wine);overflow-wrap:anywhere;
  box-shadow:inset 0 0 0 1.5px var(--line);
}
.sec-couple{width:clamp(110px,16vw,150px);margin-top:10px;animation:riseIn 1s 1s both}

/* 18. after hours ----------------------------------------------------------- */
.window--night > .win{
  background:linear-gradient(172deg,#3E0F1E 0%,#2B1130 46%,#1B2242 100%);color:#F7E6EC;
  box-shadow:0 0 0 1.5px rgba(243,183,197,.14),9px 11px 0 rgba(100,21,37,.55),0 40px 80px -30px rgba(10,5,20,.7);
}
.window--night .win-bar{background:rgba(255,255,255,.04);border-bottom-color:rgba(243,183,197,.16)}
.window--night .win-title{color:rgba(247,230,236,.55)}
.window--night .win-close svg{stroke:#F7E6EC}
.window--night .win-close:hover{background:rgba(255,255,255,.08)}
.night{position:relative;isolation:isolate;overflow-x:hidden}
.sky{position:absolute;inset:0;z-index:-1;overflow:hidden;pointer-events:none}
.sky-drift{position:absolute;inset:-10% -20%;animation:drift 120s linear infinite}
.star{
  position:absolute;width:var(--s);height:var(--s);border-radius:50%;background:#F6E2B8;
  box-shadow:0 0 calc(var(--s) * 3) rgba(214,173,98,.8);
  animation:twinkle var(--t) ease-in-out var(--d) infinite;
}
.star--sparkle{border-radius:0;background:var(--gold);clip-path:polygon(50% 0,61% 39%,100% 50%,61% 61%,50% 100%,39% 61%,0 50%,39% 39%)}
.shooting{position:absolute;top:14%;left:-12%;width:130px;height:2px;border-radius:2px;background:linear-gradient(90deg,transparent,#F8E7C2);rotate:-16deg;opacity:0;animation:shoot 11s 2.5s ease-in infinite}
@keyframes twinkle{0%,100%{opacity:.25;transform:scale(.7)}50%{opacity:1;transform:scale(1.1)}}
@keyframes drift{to{transform:translateX(12%)}}
@keyframes shoot{0%{opacity:0;transform:translateX(0)}3%{opacity:1}12%{opacity:0;transform:translateX(125vw)}100%{opacity:0;transform:translateX(125vw)}}

.night-inner{display:grid;grid-template-columns:minmax(0,1fr);gap:clamp(18px,3vw,30px);padding:clamp(6px,2vw,20px) 0}
.night-scene{display:flex;align-items:flex-end;justify-content:center;gap:clamp(6px,3vw,34px)}
.night-window{width:clamp(120px,19vw,200px);filter:drop-shadow(0 0 30px rgba(214,173,98,.3));transition:filter 1.2s}
.night-couple{width:clamp(130px,21vw,220px);filter:drop-shadow(0 0 22px rgba(243,183,197,.18));animation:bob 6s ease-in-out infinite}
.night.all-lit .night-window{filter:drop-shadow(0 0 60px rgba(246,226,184,.75))}
.night-head{text-align:center}
.night-h{font:600 clamp(2rem,5vw,3.2rem)/1 var(--f-display);letter-spacing:.14em;color:#F4DAA6;text-shadow:0 0 30px rgba(214,173,98,.35)}
.night-sub{margin-top:.5em;font:italic 400 clamp(1.02rem,2.2vw,1.22rem)/1.4 var(--f-display);color:var(--pink)}
.night-hint{margin-top:.6em;font:500 .66rem var(--f-mono);letter-spacing:.18em;text-transform:uppercase;color:rgba(247,230,236,.5)}
.thoughts{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr));gap:clamp(14px,2.4vw,22px);max-width:940px;margin:0 auto;width:100%}
.thought{
  position:relative;display:flex;flex-direction:column;gap:10px;min-height:120px;padding:18px 18px 16px;text-align:left;
  border:0;border-radius:18px;color:#F7E6EC;background:rgba(255,255,255,.05);
  box-shadow:inset 0 0 0 1px rgba(243,183,197,.22);backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  rotate:var(--r);animation:drifty var(--dur) ease-in-out var(--delay) infinite;
  transition:background .6s,box-shadow .6s;
}
.thought small{font:500 .6rem var(--f-mono);letter-spacing:.18em;text-transform:uppercase;color:rgba(214,173,98,.8)}
.thought-text{font:italic 400 clamp(1.08rem,2vw,1.2rem)/1.4 var(--f-display);filter:blur(5px);opacity:.4;transition:filter .9s,opacity .9s;overflow-wrap:anywhere}
.thought.is-lit{background:rgba(217,106,131,.14);box-shadow:inset 0 0 0 1px rgba(214,173,98,.6),0 0 34px -6px rgba(214,173,98,.45)}
.thought.is-lit .thought-text{filter:none;opacity:1}
.night-end{text-align:center;font:600 clamp(1.4rem,3vw,1.8rem) var(--f-hand);color:var(--gold-soft);opacity:0;transform:translateY(10px);transition:opacity 1.2s,transform 1.2s}
.night-end.is-shown{opacity:1;transform:none}
@keyframes drifty{0%,100%{translate:0 0}50%{translate:0 -8px}}

/* 19. finale + replay ------------------------------------------------------- */
.finale{
  position:fixed;inset:0;z-index:70;overflow-y:auto;overscroll-behavior:contain;
  background:radial-gradient(70% 55% at 50% 32%, #FFE6EC 0%, var(--cream) 70%);
  animation:fadeIn 1.2s ease both;
}
.finale.is-leaving{animation:fadeOut .9s ease forwards}
.finale-stars{position:fixed;inset:0;pointer-events:none;overflow:hidden}
.finale-stars .star{background:var(--gold);box-shadow:0 0 calc(var(--s) * 2.5) rgba(214,173,98,.55)}
.finale-stars .star.rise{animation:twinkle var(--t) ease-in-out var(--d) infinite,rise var(--r) linear var(--d) infinite}
@keyframes rise{from{translate:0 0}to{translate:0 -40vh}}
.finale-inner{
  position:relative;min-height:100%;max-width:680px;margin:0 auto;padding:clamp(40px,9vh,90px) 22px clamp(70px,12vh,110px);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:clamp(12px,2.4vh,24px);text-align:center;
}
.fin{opacity:0;visibility:hidden;transform:translateY(16px);filter:blur(8px);transition:opacity 1.4s ease,transform 1.4s var(--ease-out),filter 1.4s ease,visibility 1.4s}
.fin.is-in{opacity:1;visibility:visible;transform:none;filter:none}
.fin-before{font:600 clamp(1.7rem,4.6vw,2.3rem)/1 var(--f-hand);color:var(--rose)}
.fin-line{max-width:28ch;font:italic 400 clamp(1.3rem,3.6vw,1.95rem)/1.35 var(--f-display);color:var(--choc);text-wrap:balance}
.fin-line--gold{color:var(--wine);font-weight:500}
.fin-names{font:700 clamp(2.2rem,7vw,3.5rem)/1.05 var(--f-hand);color:var(--cherry);overflow-wrap:anywhere}
.fin-names .heart{font-size:.75em;animation:heartbeat 2.2s ease-in-out infinite}
.fin-couple{width:min(280px,64vw);max-height:36svh;object-fit:contain;filter:drop-shadow(0 14px 18px rgba(100,21,37,.16))}
.fin-couple.is-in{animation:bob 6s 1.4s ease-in-out infinite}
.fin-home{font:600 clamp(1.45rem,4.2vw,2.3rem)/1.2 var(--f-display);color:var(--wine);text-wrap:balance}
.fin-replay{display:flex;flex-direction:column;align-items:center;gap:12px;margin-top:clamp(14px,4vh,40px)}
.fin-replay p{font:600 1.5rem var(--f-hand);color:var(--rose)}
.finale-skip{
  position:fixed;left:50%;bottom:max(14px,env(safe-area-inset-bottom));translate:-50% 0;z-index:2;
  min-height:40px;padding:0 16px;border:0;border-radius:999px;background:rgba(255,253,252,.8);
  font:500 .66rem var(--f-mono);letter-spacing:.14em;color:var(--ink-3);box-shadow:inset 0 0 0 1px var(--line);
  transition:opacity .5s;
}
.finale-skip.is-gone{opacity:0;pointer-events:none}

/* 20. toast ----------------------------------------------------------------- */
.toast{
  position:fixed;left:50%;bottom:max(18px,env(safe-area-inset-bottom));z-index:95;translate:-50% 20px;
  width:max-content;max-width:calc(100% - 28px);padding:12px 20px;border-radius:16px;
  background:var(--wine);color:var(--cream);font:500 .88rem/1.35 var(--f-sans);text-align:center;
  box-shadow:0 18px 36px -14px rgba(67,35,42,.6);opacity:0;pointer-events:none;transition:opacity .4s,translate .4s var(--ease-out);
}
.toast.is-shown{opacity:1;translate:-50% 0}

/* 21. editor ---------------------------------------------------------------- */
dialog.editor{
  width:min(540px,100%);max-width:100%;height:100dvh;max-height:100dvh;margin:0 0 0 auto;padding:0;border:0;
  background:var(--white);color:var(--choc);box-shadow:-20px 0 60px rgba(67,35,42,.25);overflow:hidden;
}
dialog.editor[open]{display:flex;animation:slideIn .45s var(--ease-out)}
dialog.editor::backdrop{background:rgba(67,35,42,.3);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}
@keyframes slideIn{from{transform:translateX(40px);opacity:0}to{transform:none;opacity:1}}
.ed{display:flex;flex-direction:column;width:100%;min-height:0}
.ed-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:20px 20px 14px;border-bottom:1.5px dashed var(--line)}
.ed-head h2{font:600 1.7rem/1.1 var(--f-display);color:var(--wine);margin-top:4px}
.ed-note{margin-top:6px;font-size:.8rem;line-height:1.45;color:var(--ink-2)}
.ed-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 20px 20px}
.ed-sec{border-bottom:1.5px dashed var(--line);padding:6px 0}
.ed-sec > summary{list-style:none;display:flex;align-items:center;justify-content:space-between;min-height:52px;cursor:pointer;font:600 1.1rem var(--f-display);color:var(--wine)}
.ed-sec > summary::-webkit-details-marker{display:none}
.ed-sec > summary::after{content:"+";font:400 1.4rem var(--f-mono);color:var(--rose);transition:transform .3s}
.ed-sec[open] > summary::after{transform:rotate(45deg)}
.ed-sec-body{padding:4px 0 16px}
.ed-help{margin:-2px 0 12px;font-size:.82rem;color:var(--ink-3)}
.ed-field{display:grid;gap:6px;margin-bottom:14px}
.ed-2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.ed-label,.ed-field > span{font:500 .64rem var(--f-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--rose)}
.ed input[type=text],.ed input[type=date],.ed input[type=password],.ed select,.ed textarea{
  width:100%;min-height:46px;padding:10px 13px;border:0;border-radius:12px;background:var(--paper);
  box-shadow:inset 0 0 0 1.5px var(--line-2);font-size:1rem;color:var(--choc);
}
.ed textarea{min-height:84px;resize:vertical;line-height:1.45}
.ed input:focus,.ed select:focus,.ed textarea:focus{outline:none;box-shadow:inset 0 0 0 2px var(--cherry)}
.ed-row{position:relative;display:grid;gap:10px;padding:12px;margin-bottom:10px;border-radius:14px;box-shadow:inset 0 0 0 1.5px var(--line);background:var(--paper)}
.ed-row--photo{grid-template-columns:78px minmax(0,1fr)}
.ed-thumb{position:relative;width:78px;aspect-ratio:4/5;border-radius:8px;overflow:hidden;background:var(--blush);cursor:pointer;box-shadow:inset 0 0 0 1.5px var(--line)}
.ed-thumb img{width:100%;height:100%;object-fit:cover}
.ed-thumb span{position:absolute;inset:auto 0 0;padding:3px;background:rgba(100,21,37,.72);color:var(--white);font:500 .55rem var(--f-mono);letter-spacing:.08em;text-align:center}
.ed-thumb input{position:absolute;inset:0;opacity:0;cursor:pointer}
.ed-row-fields{display:grid;gap:8px;min-width:0}
.ed-row-tools{display:flex;gap:6px;justify-content:flex-end;flex-wrap:wrap}
.ed-mini{min-height:34px;padding:0 10px;border:0;border-radius:999px;background:var(--white);box-shadow:inset 0 0 0 1.5px var(--line);font:500 .62rem var(--f-mono);letter-spacing:.08em;color:var(--ink-2)}
.ed-mini:hover{background:var(--blush);color:var(--wine)}
.ed-mini--x:hover{background:#FADADF;color:var(--cherry)}
.ed-add{width:100%;min-height:46px;border:0;border-radius:12px;background:transparent;box-shadow:inset 0 0 0 1.5px var(--line-2);border-style:dashed;font:500 .7rem var(--f-mono);letter-spacing:.1em;color:var(--wine)}
.ed-add:hover{background:var(--blush)}
.ed-check{display:inline-flex;align-items:center;gap:8px;font-size:.84rem;color:var(--ink-2)}
.ed-check input{width:18px;height:18px;accent-color:var(--cherry)}
.ed-file{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ed-file label{position:relative;overflow:hidden}
.ed-file input{position:absolute;inset:0;opacity:0;cursor:pointer}
.ed-file small{font-size:.8rem;color:var(--ink-3)}
.ed-foot{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:12px 20px max(12px,env(safe-area-inset-bottom));border-top:1.5px dashed var(--line);background:var(--white)}
.ed-foot .btn{width:100%;padding:0 .8em;font-size:.74rem;letter-spacing:.08em;white-space:nowrap}
.ed-foot .ed-link,.ed-foot .ed-more{grid-column:1/-1}
.ed-sec{scroll-margin-top:4px}
.ed-link{width:100%;min-height:40px;padding:8px 12px;border:0;border-radius:10px;background:var(--paper);box-shadow:inset 0 0 0 1.5px var(--line-2);font:400 .72rem var(--f-mono);color:var(--ink-2)}
.ed-add{position:relative;display:grid;place-items:center;overflow:hidden;cursor:pointer}
.ed-add input{position:absolute;inset:0;opacity:0;cursor:pointer}
.ed-drop{
  position:relative;margin-bottom:12px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:104px;padding:14px;
  border-radius:16px;border:2px dashed rgba(169,30,59,.35);background:var(--blush);color:var(--wine);text-align:center;cursor:pointer;
  transition:background .2s,border-color .2s,transform .2s;
}
.ed-drop:hover,.ed-drop.is-over{background:#F9D5DE;border-color:var(--cherry);transform:scale(1.01)}
.ed-drop-icon{font-size:1.5rem;line-height:1}
.ed-drop b{font:600 1.05rem var(--f-display)}
.ed-drop small{font-size:.78rem;color:var(--ink-2)}
.ed-drop input{position:absolute;inset:0;opacity:0;cursor:pointer}
.ed-more{display:flex;flex-wrap:wrap;justify-content:center;gap:4px 10px}
.ed-more .text-btn{position:relative;overflow:hidden}
.ed-more input{position:absolute;inset:0;opacity:0;cursor:pointer}

/* 22. small screens --------------------------------------------------------- */
@media (max-width: 900px){
  .gate-deco--roses{display:none}
}
@media (max-width: 760px){
  .gate-deco{display:none}
  .status{padding:12px 14px}
  .status-brand{font-size:.66rem}

  .map{width:calc(100% - 28px);aspect-ratio:auto;container-type:normal;display:flex;flex-direction:column;align-items:center}
  .map-trail,.map-deco{display:none}
  .map-center{position:relative;left:auto;top:auto;translate:none;width:min(74%,330px)}
  .map-couple{filter:drop-shadow(0 10px 12px rgba(100,21,37,.16))}
  .map-tip{font-size:1.35rem;margin-top:0}
  .objs{position:relative;inset:auto;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;width:100%;margin-top:18px}
  .obj{
    position:relative;left:auto;top:auto;width:auto;translate:none;rotate:none;gap:10px;
    padding:18px 10px 14px;border-radius:22px;background:var(--white);
    box-shadow:inset 0 0 0 1.5px var(--line),0 5px 0 var(--blush);
  }
  .obj-art{width:70%;max-width:150px}
  .obj .obj-art > img{filter:drop-shadow(0 6px 8px rgba(100,21,37,.18))}
  .obj-label{white-space:normal;justify-content:center;font-size:.64rem;line-height:1.3;padding:6px 10px;box-shadow:inset 0 0 0 1.5px rgba(100,21,37,.14),0 3px 0 var(--pink)}
  .obj.is-found .obj-label{box-shadow:inset 0 0 0 1.5px rgba(214,173,98,.6),0 3px 0 var(--gold)}
  .obj-hint{position:static;translate:none;opacity:1;margin:0;white-space:normal;font-size:1.12rem;line-height:1.1}
  .obj:hover .obj-hint{translate:none}
  .obj-star{top:10px;right:10px;width:26px;min-width:0;font-size:13px}
  .obj--night{grid-column:1/-1;display:grid;grid-template-columns:30% minmax(0,1fr);grid-template-rows:auto auto;column-gap:14px;row-gap:6px;align-items:center;justify-items:start;text-align:left;padding:14px 16px}
  .obj--night .obj-art{grid-row:1/3;width:100%}
  .obj--night .obj-label{align-self:end}
  .obj--night .obj-hint{align-self:start}

  .other-side{align-self:center;margin-right:0}

  .sound-grid{grid-template-columns:1fr}
  .sound-side{order:-1}
  .sound-couple{width:min(62%,240px)}
  .letters{grid-template-columns:minmax(0,1fr);max-width:420px}
  .env-title{font-size:.66rem}
}
@media (max-width: 640px){
  dialog.window{width:100%;height:calc(100dvh - 10px);max-height:none;margin:auto 0 0}
  dialog.window > .win{height:100%;max-height:none;border-radius:24px 24px 0 0;animation:sheetUp .55s var(--ease-out) both;
    box-shadow:0 0 0 1.5px rgba(67,35,42,.12),0 -20px 50px -20px rgba(100,21,37,.4)}
  dialog.window.is-closing > .win{animation:sheetDown .35s ease forwards}
  .win-bar{border-radius:24px 24px 0 0}
  .win-body{border-radius:0;padding:20px 16px max(24px,env(safe-area-inset-bottom))}
  .win-head{align-items:flex-start}
  .win-head-art{width:92px}
  .board{padding:14px 4px 0}
  .board-col:only-child .snap{width:86%}
  .snap-sticker{width:44px}
  .snap-sticker--br{right:-8px;bottom:-12px}
  .snap-sticker--tl{left:-8px;top:-12px}
  .board-col:only-child .snap:nth-child(even){margin-left:14%}
  .chat{height:auto;flex:1;min-height:max(380px,calc(100dvh - 330px))}
  .says{display:flex;flex-direction:column}
  .secret{min-height:calc(100dvh - 90px)}
  .gate-actions .btn{flex:1 1 180px}
  .lb-btn{padding:0 16px;font-size:1.15rem}
  .ed-2{grid-template-columns:1fr}
  .ed-head{padding:16px 16px 12px}
  .ed-body{padding:4px 16px 16px}
  .ed-foot{padding-left:16px;padding-right:16px}
}
@media (max-width: 400px){
  .hero-kicker{letter-spacing:.14em}
  .pieces{padding:7px 8px;gap:4px}
  .pieces i{width:11px;height:11px}
  .status-brand{display:none}
  .hero-since .dot{display:none}
  .hero-since [data-bind=days]{display:block}
  .objs{gap:10px}
  .obj{padding:14px 8px 12px}
  .obj-label{font-size:.6rem;letter-spacing:.08em;padding:5px 8px}
  .obj-hint{font-size:1.02rem}
  .lb-count{display:none}
  .other-side{font-size:1.3rem;padding-right:46px}
}
@keyframes sheetUp{from{transform:translateY(60%);opacity:0}to{transform:none;opacity:1}}
@keyframes sheetDown{to{transform:translateY(40%);opacity:0}}

/* short, wide screens: keep the whole world in view */
@media (min-width: 761px) and (max-height: 700px){
  .hero-kicker,.hero-since{display:none}
  .hero-title{font-size:clamp(2rem,5vw,3.4rem)}
}

/* 23. reduced motion -------------------------------------------------------- */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;animation-delay:0s!important;transition-duration:.2s!important;transition-delay:0s!important;scroll-behavior:auto!important}
  .flip{transition:none!important}
  .flip.is-flipped{transform:none}
  .face--back{transform:none;visibility:hidden;opacity:0;transition:opacity .3s!important}
  .flip.is-flipped .face--back{visibility:visible;opacity:1}
  .flip.is-flipped .face--front{visibility:hidden}
  .tape.is-b{transform:none}
  .tape .tape-face--b{transform:none;visibility:hidden}
  .tape.is-b .tape-face--a{visibility:hidden}
  .tape.is-b .tape-face--b{visibility:visible}
  .fx,.sky-drift,.shooting,.finale-stars{display:none}
  .fin{filter:none}
}
