:root{
  --ink:#f4ece6;
  --soft:rgba(244,236,230,.62);
  --accent:#f2b38f;
  --accent-2:#e88aa0;
  --glass:rgba(255,255,255,.06);
  --glass-line:rgba(255,255,255,.12);
  --serif:"Fraunces","Iowan Old Style",Palatino,Georgia,serif;
  --hand:"Caveat","Segoe Print","Bradley Hand",cursive;
  --ease:cubic-bezier(.2,.7,.1,1);
  --p:0;
}
*{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%;background:#0c0a17}
body{
  color:var(--ink);
  font-family:var(--serif);
  font-variation-settings:"SOFT" 100,"opsz" 24;
  font-weight:340;
  font-size:clamp(19px,4.8vw,24px);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
  background:transparent;
}
::selection{background:rgba(242,179,143,.35)}

/* ---------- Sky: night → dawn, driven by scroll (--p) ---------- */
.sky{position:fixed;inset:0;z-index:-1;overflow:hidden;
  background:
    radial-gradient(120% 70% at 80% 0%, #2a1f4a 0%, transparent 60%),
    linear-gradient(180deg,#0c0a17 0%,#14112a 55%,#1f1733 100%);
}
.sky-dawn{position:absolute;inset:0;opacity:calc(var(--p) * var(--p));
  background:
    radial-gradient(90% 55% at 50% 105%, rgba(255,176,128,.85) 0%, rgba(232,120,140,.45) 35%, transparent 70%),
    linear-gradient(180deg,#1a1430 0%,#3a2346 45%,#7a3d55 75%,#c06a5e 100%);
}
#stars{position:absolute;inset:0;width:100%;height:100%}

.progress{position:fixed;top:0;left:0;right:0;height:2px;z-index:5;pointer-events:none}
.progress span{display:block;height:100%;width:100%;transform-origin:0 50%;transform:scaleX(var(--p));
  background:linear-gradient(90deg,var(--accent-2),var(--accent));opacity:.7}

/* ---------- Layout ---------- */
main{max-width:36rem;margin:0 auto;padding:0 max(22px,env(safe-area-inset-left)) 0 max(22px,env(safe-area-inset-right));overflow-x:clip}
.beat{
  min-height:62vh;min-height:62svh;
  display:flex;flex-direction:column;justify-content:center;gap:1em;
  padding:9vh 0;position:relative;
}
.beat p{max-width:28ch}
.display{
  font-size:clamp(2rem,9vw,3.1rem);line-height:1.08;font-weight:420;
  font-variation-settings:"SOFT" 100,"opsz" 144;letter-spacing:-.01em;
}
.accent em,em{font-style:italic;color:var(--accent)}
.soft{color:var(--soft)}
.label{font-size:.68em;letter-spacing:.32em;text-transform:uppercase;color:var(--accent);font-weight:500}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ---------- Reveal system ---------- */
.js .r{opacity:0;transform:translateY(14px);filter:blur(5px);
  transition:opacity .9s var(--ease),transform .9s var(--ease),filter .9s var(--ease);
  transition-delay:var(--d,0s)}
.js .r.in{opacity:1;transform:none;filter:none}
.js .instant,.js .instant *{transition:none!important}
/* word-by-word */
.js [data-words].r,.js [data-letters].r{opacity:1;transform:none;filter:none}
.w,.l{display:inline-block;white-space:pre}
.js .w{opacity:0;transform:translateY(.35em);filter:blur(4px);
  transition:opacity .9s var(--ease),transform .9s var(--ease),filter .9s var(--ease);
  transition-delay:calc(var(--d,0s) + var(--i) * 40ms)}
.js .in .w{opacity:1;transform:none;filter:none}
.js .l{opacity:0;transform:translateY(.35em) scale(.9);
  transition:opacity .7s var(--ease),transform .7s var(--ease),text-shadow 1.6s ease;
  transition-delay:calc(var(--d,0s) + var(--i) * 40ms)}
.js .in .l{opacity:1;transform:none}

/* ---------- Hero ---------- */
.hero{padding:0;justify-content:center;min-height:100vh;min-height:100svh}
.moon{position:absolute;top:12vh;right:-4vw;width:min(34vw,170px);aspect-ratio:1;border-radius:50%;
  background:radial-gradient(circle at 35% 35%,#fff6ea 0%,#f3dcc4 45%,#d9b99c 100%);
  box-shadow:0 0 60px 10px rgba(255,230,200,.18),0 0 160px 40px rgba(242,179,143,.10);
  opacity:.85;transform:translateY(calc(var(--hero, 0) * 40vh));
  animation:moonIn 3s var(--ease) both}
.moon::after{content:"";position:absolute;inset:0;border-radius:50%;
  background:radial-gradient(circle at 70% 60%,rgba(120,90,80,.18) 0 8%,transparent 9%),
             radial-gradient(circle at 45% 70%,rgba(120,90,80,.14) 0 5%,transparent 6%),
             radial-gradient(circle at 60% 30%,rgba(120,90,80,.12) 0 4%,transparent 5%)}
@keyframes moonIn{from{opacity:0;transform:translateY(30px) scale(.9)}}
.names{
  font-size:clamp(4.2rem,22vw,8rem);line-height:1;font-style:italic;font-weight:380;
  font-variation-settings:"SOFT" 100,"opsz" 144;letter-spacing:-.02em;
  transform:translateY(calc(var(--hero,0) * -12vh));
}
#name{display:inline-block;padding:0 .12em .22em 0;margin-bottom:-.22em;color:transparent;
  background:linear-gradient(100deg,#ffe2cf 10%,var(--accent) 45%,var(--accent-2) 90%);-webkit-background-clip:text;background-clip:text;transition:opacity .4s ease,filter .4s ease,transform .4s ease}
#name{animation:nameIn 1.6s var(--ease) .2s both}
@keyframes nameIn{from{opacity:0;filter:blur(12px);transform:translateY(.12em)}}
.names{filter:drop-shadow(0 0 0 rgba(242,179,143,0));transition:filter 1.5s ease}
.names:has(.done){filter:drop-shadow(0 0 24px rgba(242,179,143,.35))}
.lead{color:var(--soft);font-size:1.05em}
.scroll-hint{position:absolute;left:0;bottom:max(7vh,env(safe-area-inset-bottom));display:flex;align-items:center;gap:14px;
  font-size:.62em;letter-spacing:.3em;text-transform:uppercase;color:var(--soft);white-space:nowrap}
.js .scroll-hint.gone{opacity:0;transition:opacity .4s ease;transition-delay:0s}
.scroll-hint i{display:block;width:1px;height:46px;background:linear-gradient(var(--accent),transparent);
  transform-origin:top;animation:drip 2.4s ease-in-out infinite}
@keyframes drip{0%{transform:scaleY(0);opacity:1}60%{transform:scaleY(1);opacity:1}100%{transform:scaleY(1);opacity:0}}

/* ---------- Underline ---------- */
.underline-wrap{position:relative;display:inline-block;align-self:flex-start}
.underline{position:absolute;left:-2%;bottom:-.18em;width:104%;height:.4em;overflow:visible}
.underline path{fill:none;stroke:var(--accent-2);stroke-width:3;stroke-linecap:round;
  stroke-dasharray:340;stroke-dashoffset:340;transition:stroke-dashoffset 1.6s var(--ease) calc(var(--d,0s) + .7s)}
.in .underline path{stroke-dashoffset:0}

/* ---------- Chips ---------- */
.chips{list-style:none;display:flex;flex-wrap:wrap;gap:10px}
.chips li{padding:.45em 1em;border-radius:999px;font-size:.88em;
  background:var(--glass);border:1px solid var(--glass-line);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.js .chips li.r{transform:translateY(16px) scale(.92)}
.js .chips li.r.in{transform:none}

/* ---------- Door ---------- */
.door-scene{--door:0;position:relative;align-self:center;width:min(50vw,200px);margin:1.4em 0 1em;perspective:900px;
  opacity:calc(.35 + var(--door) * 1.3)}
.door-frame{position:relative;aspect-ratio:1/1.9;border:3px solid rgba(244,236,230,.3);border-bottom:none;border-radius:4px 4px 0 0;
  transform-style:preserve-3d}
.door-light{position:absolute;inset:0;background:linear-gradient(180deg,#fff0dc,#f6b892 55%,#e88aa0);
  opacity:calc(var(--door) * 1.4);
  box-shadow:0 0 calc(var(--door) * 90px) calc(var(--door) * 18px) rgba(242,179,143,.38)}
.door{position:absolute;inset:0;transform-origin:0 50%;
  transform:rotateY(calc(var(--door) * -72deg));
  background:linear-gradient(90deg,#2b2140,#3b2c56);border-right:1px solid rgba(255,255,255,.1);
  box-shadow:inset -10px 0 20px rgba(0,0,0,.25);transition:transform .15s linear}
.door::before{content:"";position:absolute;inset:10% 14% 52% 14%;border:1.5px solid rgba(255,255,255,.09);border-radius:2px}
.door::after{content:"";position:absolute;inset:54% 14% 8% 14%;border:1.5px solid rgba(255,255,255,.09);border-radius:2px}
.knob{position:absolute;right:12%;top:52%;width:9px;height:9px;border-radius:50%;background:var(--accent);box-shadow:0 0 8px rgba(242,179,143,.6)}
.door-spill{position:absolute;left:-10%;right:-90%;top:100%;height:90px;
  background:radial-gradient(55% 100% at 30% 0%,rgba(255,196,150,.6),transparent 70%);
  opacity:calc(var(--door) * 1.2);transform-origin:top left;transform:skewX(-28deg) scaleY(calc(.2 + var(--door) * .8))}
.door-frame::after{content:"";position:absolute;left:-40%;right:-40%;bottom:0;height:2px;background:linear-gradient(90deg,transparent,rgba(244,236,230,.35),transparent)}

/* ---------- Memories ---------- */
.memories{list-style:none;display:flex;flex-direction:column;gap:16px;margin-top:.4em}
.card{display:flex;align-items:center;gap:16px;padding:16px 18px;border-radius:18px;
  background:linear-gradient(135deg,rgba(255,255,255,.09),rgba(255,255,255,.03));
  border:1px solid var(--glass-line);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  box-shadow:0 10px 30px -12px rgba(0,0,0,.5);font-size:.92em;line-height:1.4}
.card:nth-child(odd){rotate:-1.2deg}
.card:nth-child(even){rotate:1.2deg;margin-left:14px}
.card svg{flex:none;width:44px;height:44px;padding:8px;border-radius:12px;
  background:rgba(242,179,143,.14);fill:none;stroke:var(--accent);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.js .card{opacity:0;filter:blur(6px);transition:opacity 1.1s var(--ease),transform 1.1s var(--ease),filter 1.1s var(--ease);transition-delay:var(--d,0s)}
.js .card.from-left{transform:translateX(-60px) rotate(-6deg)}
.js .card.from-right{transform:translateX(60px) rotate(6deg)}
.js .card.in{opacity:1;transform:none;filter:none}
.card i{font-style:italic;color:var(--accent)}
.card.more{background:none;border:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;
  rotate:0deg;margin-left:0;justify-content:center;padding-top:6px;
  font-style:italic;font-size:1.05em;color:var(--accent)}

/* ---------- Quote ---------- */
blockquote{font-size:clamp(2.3rem,11vw,3.8rem);line-height:1.1;font-style:italic;font-weight:400;
  font-variation-settings:"SOFT" 100,"opsz" 144;color:var(--accent);letter-spacing:-.01em}
blockquote.in .l{text-shadow:0 0 28px rgba(242,179,143,.55)}

/* ---------- End / sunrise ---------- */
.end{justify-content:center;text-align:center;align-items:center;min-height:90vh;min-height:90svh;padding-bottom:18vh}
.end p{max-width:none}
.sun{position:absolute;left:50%;bottom:-10vh;width:min(90vw,420px);aspect-ratio:1;border-radius:50%;
  translate:-50% 0;z-index:-1;
  background:radial-gradient(circle,#ffd9b0 0%,#f6a77f 35%,rgba(232,138,160,.35) 60%,transparent 72%);
  filter:blur(4px);opacity:0;transform:translateY(25vh);
  transition:transform 4s var(--ease),opacity 3s ease}
.end.sun-up .sun{opacity:.75;transform:translateY(0)}
.sign{font-family:var(--hand);font-size:2.6em;color:#ffe6d4;margin-top:.6em;line-height:1}
.js .sign.r{filter:none;transform:none}
.sign span{display:inline-block;clip-path:inset(0 100% 0 0);transition:clip-path 2.2s cubic-bezier(.6,.1,.3,1) calc(var(--d,0s) + .2s)}
.sign.in span{clip-path:inset(0 0 0 0)}

/* ---------- Write pop-up ---------- */
.write-open{margin-top:1.4em;font:inherit;font-size:.82em;color:var(--ink);cursor:pointer;
  padding:.75em 1.3em;border-radius:999px;border:1px solid rgba(242,179,143,.45);
  background:rgba(242,179,143,.10);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  transition:background .3s ease,border-color .3s ease}
.write-open:hover,.write-open:focus-visible{background:rgba(242,179,143,.2);border-color:var(--accent)}
dialog#write{border:none;padding:0;background:transparent;color:var(--ink);max-width:none;max-height:none;
  width:100%;height:100%;margin:0;inset:0;display:none}
dialog#write[open]{display:flex;align-items:flex-end;justify-content:center}
dialog#write::backdrop{background:rgba(8,6,16,.55);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);animation:fadeIn .5s ease}
.sheet{position:relative;width:100%;max-width:32rem;max-height:92svh;overflow-y:auto;
  padding:30px 22px calc(26px + env(safe-area-inset-bottom));
  border-radius:26px 26px 0 0;border:1px solid var(--glass-line);border-bottom:none;
  background:linear-gradient(170deg,rgba(52,36,70,.97),rgba(30,22,44,.98));
  box-shadow:0 -20px 60px -10px rgba(0,0,0,.6),0 0 80px -20px rgba(242,179,143,.25);
  font-size:.86em;line-height:1.55;animation:sheetUp .7s var(--ease)}
.sheet::before{content:"";position:absolute;top:10px;left:50%;width:40px;height:4px;margin-left:-20px;border-radius:4px;background:rgba(255,255,255,.18)}
@media (min-width:640px){
  dialog#write[open]{align-items:center}
  .sheet{border-radius:26px;border-bottom:1px solid var(--glass-line);padding-bottom:28px}
  .sheet::before{display:none}
}
@keyframes sheetUp{from{transform:translateY(60px);opacity:0}}
@keyframes fadeIn{from{opacity:0}}
.sheet h2{font-size:1.75em;line-height:1.15;font-weight:420;font-variation-settings:"SOFT" 100,"opsz" 144;margin:.25em 0 .55em;color:var(--accent)}
.sheet p{margin-bottom:.8em;color:rgba(244,236,230,.85)}
.sheet .label{font-size:.7em;margin:0;padding-right:44px}
.sheet h2:focus{outline:none}
.x:focus:not(:focus-visible){outline:none}
.x{position:absolute;top:14px;right:14px;width:36px;height:36px;border-radius:50%;border:none;cursor:pointer;
  background:rgba(255,255,255,.08);color:var(--ink);font-size:22px;line-height:36px}
#write-form{margin-top:1em}
textarea{width:100%;display:block;font:inherit;font-size:16px;line-height:1.5;color:var(--ink);resize:vertical;min-height:120px;
  padding:14px 16px;border-radius:16px;border:1px solid var(--glass-line);background:rgba(255,255,255,.06);outline:none;
  transition:border-color .3s ease,box-shadow .3s ease}
textarea::placeholder{color:rgba(244,236,230,.4)}
textarea:focus{border-color:rgba(242,179,143,.6);box-shadow:0 0 0 4px rgba(242,179,143,.12)}
.note{font-size:.8em;color:var(--soft)!important;margin:.6em 0 0!important}
.err{color:#ffb3b3!important;font-size:.85em;min-height:0;margin:.4em 0 0!important}
.err:empty{display:none}
.actions{display:flex;flex-direction:column;gap:10px;margin-top:1.1em}
.send,.later{font:inherit;cursor:pointer;border-radius:999px;padding:.8em 1.2em;font-size:.95em}
.send{border:none;color:#2a1a24;font-weight:500;background:linear-gradient(100deg,#ffe2cf,var(--accent) 55%,var(--accent-2));
  box-shadow:0 8px 24px -8px rgba(242,179,143,.6);transition:transform .2s ease,opacity .2s ease}
.send:active{transform:scale(.98)}
.send[disabled]{opacity:.55;cursor:default}
.later{border:1px solid var(--glass-line);background:transparent;color:var(--soft)}
.done-view{text-align:center;padding:24px 0 6px;position:relative}
.done-view h2{margin-top:.6em}
.done-glow{width:84px;height:84px;margin:0 auto;border-radius:50%;
  background:radial-gradient(circle,#ffe6cf 0%,#f6a77f 45%,rgba(232,138,160,.0) 72%);
  animation:pulse 2.6s ease-in-out infinite}
@keyframes pulse{50%{transform:scale(1.12);opacity:.8}}

/* ---------- Reduced motion ---------- */
@media (prefers-reduced-motion: reduce){
  .js .r,.js .w,.js .l,.card{opacity:1!important;transform:none!important;filter:none!important;transition:none!important}
  .moon,.scroll-hint i,#name{animation:none}
  .underline path{stroke-dashoffset:0;transition:none}
  .door-scene{--door:.75!important}
  .door{transition:none}
  .sun{opacity:1;transition:none}
  .sun{transform:none;opacity:.75}
  .sign span{clip-path:none;transition:none}
  .sheet,dialog#write::backdrop,.done-glow{animation:none}
}
@media (min-width:700px){
  .card:nth-child(even){margin-left:48px}
}
