:root{
  --rose:#e8325a; --rose-d:#a3123a; --pink:#ffd3dc; --pink-2:#f9c4cf;
  --cream:#fff8f3; --ink:#4b2630; --ink-soft:#8a5a66; --wood:#b98556; --wood-d:#7a4f2c;
}
*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html{scroll-behavior:smooth}
body{
  font-family:"Cairo",system-ui,sans-serif; color:var(--ink); overflow-x:hidden;
  background:#fbe2e7 repeating-linear-gradient(90deg,#fbe3e8 0 34px,#f7d5dc 34px 68px);
  min-height:100vh;
}
body.locked{overflow:hidden;height:100vh}
button{font:inherit;cursor:pointer;border:0;background:none;color:inherit}

/* ================= INTRO ================= */
#intro{
  position:fixed; inset:0; z-index:50; display:flex; flex-direction:column; align-items:center; justify-content:center;
  background:radial-gradient(ellipse at 50% 40%,#4a1426 0%,#22080f 55%,#12040a 100%);
  color:#ffe4ea; padding:24px 16px; text-align:center; transition:opacity 1.1s ease, visibility 1.1s;
}
#intro.gone{opacity:0;visibility:hidden}
.stars{position:absolute;inset:0;pointer-events:none;
  background-image:
    radial-gradient(1.5px 1.5px at 12% 20%,#fff 50%,transparent 51%),
    radial-gradient(1px 1px at 78% 12%,#fff 50%,transparent 51%),
    radial-gradient(1.5px 1.5px at 88% 44%,#ffd6e0 50%,transparent 51%),
    radial-gradient(1px 1px at 25% 70%,#fff 50%,transparent 51%),
    radial-gradient(1.2px 1.2px at 60% 85%,#ffd6e0 50%,transparent 51%),
    radial-gradient(1px 1px at 40% 8%,#fff 50%,transparent 51%),
    radial-gradient(1.4px 1.4px at 6% 55%,#fff 50%,transparent 51%),
    radial-gradient(1px 1px at 95% 78%,#fff 50%,transparent 51%);
  animation:twinkle 4s ease-in-out infinite alternate}
@keyframes twinkle{from{opacity:.35}to{opacity:1}}
.intro-hi{font-family:"Aref Ruqaa",serif;font-size:clamp(28px,7vw,44px);opacity:0;animation:fadeUp 1.2s .2s forwards;text-shadow:0 0 18px #ff5c86}
#rose{width:min(78vw,340px);height:auto;max-height:56vh;overflow:visible;margin:4px 0}
#stem{stroke-dasharray:300;stroke-dashoffset:300}
#leafL,#leafR{transform-box:fill-box}
#roseGlow{opacity:0;transform-box:fill-box;transform-origin:center}
#roseGlow.on{animation:glow 3s ease-in-out infinite}
@keyframes glow{0%,100%{opacity:.6;transform:scale(.95)}50%{opacity:1;transform:scale(1.1)}}
#headWrap{transform-box:fill-box;transform-origin:50% 50%}
#headWrap.sway{animation:headSway 5s ease-in-out infinite}
@keyframes headSway{0%,100%{transform:rotate(-3deg)}50%{transform:rotate(3deg)}}
.intro-text{min-height:130px;display:flex;flex-direction:column;align-items:center;gap:6px}
.fade-line{opacity:0;transform:translateY(12px);transition:opacity 1.2s ease,transform 1.2s ease}
.fade-line.show{opacity:1;transform:none;pointer-events:auto}
.fade-line{pointer-events:none}
.intro-text p{font-family:"Aref Ruqaa",serif;font-size:clamp(20px,5.2vw,28px);line-height:1.6}
#introLine2{color:#ff9fb4}
@keyframes fadeUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}

/* ================= buttons ================= */
.btn{
  font-family:"Marhey","Cairo",sans-serif; font-weight:600; font-size:18px;
  padding:12px 26px; border-radius:999px; background:var(--rose); color:#fff;
  box-shadow:0 6px 0 var(--rose-d),0 10px 24px rgba(163,18,58,.3);
  transition:transform .15s ease, box-shadow .15s ease, background .2s;
}
.btn:active{transform:translateY(4px);box-shadow:0 2px 0 var(--rose-d),0 4px 10px rgba(163,18,58,.3)}
.btn[disabled]{opacity:.55;pointer-events:none}
.btn-glow{margin-top:14px;animation:pulse 1.8s ease-in-out infinite}
@keyframes pulse{0%,100%{box-shadow:0 6px 0 var(--rose-d),0 0 0 0 rgba(255,92,134,.6)}50%{box-shadow:0 6px 0 var(--rose-d),0 0 0 14px rgba(255,92,134,0)}}
.music-btn{
  position:fixed; top:max(12px,env(safe-area-inset-top)); left:12px; z-index:60; width:46px; height:46px; border-radius:50%;
  background:rgba(255,255,255,.85); font-size:22px; box-shadow:0 4px 14px rgba(0,0,0,.18); backdrop-filter:blur(6px);
}
.music-btn.off{filter:grayscale(1);opacity:.6}
.music-btn.on{animation:spinNote 3s linear infinite}
@keyframes spinNote{0%,100%{transform:rotate(-10deg)}50%{transform:rotate(10deg)}}

/* ================= STORY ================= */
#story{max-width:600px;margin:0 auto;padding:0 16px 40px}
.reveal{opacity:0;transform:translateY(50px) scale(.97);transition:opacity .9s ease,transform .9s cubic-bezier(.2,.8,.2,1)}
.reveal.in{opacity:1;transform:none}
.hero{min-height:92vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:10px}
.tag{background:#fff;border-radius:999px;padding:6px 16px;font-size:14px;color:var(--ink-soft);box-shadow:0 3px 10px rgba(163,18,58,.12)}
.hero h1{font-family:"Marhey",sans-serif;font-size:clamp(54px,16vw,96px);color:var(--rose);line-height:1.15;
  text-shadow:0 4px 0 #fff,0 8px 0 var(--pink-2)}
.sub{font-size:18px;color:var(--ink-soft)}
.scroll-hint{margin-top:28px;font-size:15px;color:var(--ink-soft)}
.scroll-hint span{display:inline-block;animation:bounce 1.4s infinite}
@keyframes bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(8px)}}

.scene{
  position:relative; background:var(--cream); border-radius:28px; padding:28px 20px 26px; margin:0 0 44px;
  box-shadow:0 12px 0 var(--pink-2),0 20px 40px rgba(163,18,58,.14); text-align:center;
}
.chapter{position:absolute;top:-18px;right:22px;width:44px;height:44px;border-radius:50%;background:var(--rose);color:#fff;
  font-family:"Marhey",sans-serif;font-size:22px;display:grid;place-items:center;box-shadow:0 4px 0 var(--rose-d)}
.scene h2{font-family:"Marhey",sans-serif;font-size:clamp(26px,7vw,34px);color:var(--rose-d);margin-bottom:10px}
.tale{font-size:18px;line-height:1.95;margin:10px 0 0}
.tale b{color:var(--rose)}
.hint{font-size:14px;color:var(--ink-soft);margin-top:8px}
.hint.big{font-size:20px;font-family:"Marhey",sans-serif;color:var(--rose-d);margin-top:26px}
.quote{font-family:"Marhey",sans-serif;font-size:20px;margin-top:10px;background:#fff;border-radius:18px;padding:10px 14px;display:inline-block;box-shadow:0 4px 0 var(--pink-2)}
.result{min-height:1.9em;font-family:"Marhey",sans-serif;font-size:18px;color:var(--rose-d);margin-top:12px;transition:transform .3s}
.result.pop{animation:popIn .5s cubic-bezier(.3,1.6,.5,1)}
@keyframes popIn{from{transform:scale(.6);opacity:0}to{transform:none;opacity:1}}

/* stage + critters */
.stage{position:relative;display:flex;justify-content:center;align-items:flex-end;gap:6px;min-height:200px;margin:8px 0 4px}
.stage.small{min-height:150px}
.stage.small [data-critter]{width:130px}
.who{position:relative;display:flex;flex-direction:column;align-items:center;cursor:pointer;user-select:none}
.name{font-family:"Marhey",sans-serif;font-size:15px;background:#fff;border-radius:999px;padding:1px 12px;margin-top:-4px;box-shadow:0 2px 0 var(--pink-2)}
[data-critter]{width:clamp(118px,34vw,160px)}
.critter{width:100%;height:auto;display:block;overflow:visible}
.flip .critter{transform:scaleX(-1)}
.bob{animation:bob 2.2s ease-in-out infinite}
.bob.d2{animation-delay:-1.1s}
@keyframes bob{0%,100%{transform:translateY(0) rotate(0)}50%{transform:translateY(-8px) rotate(-2deg)}}
.sway{animation:sway 3s ease-in-out infinite;transform-origin:50% 100%}
@keyframes sway{0%,100%{transform:rotate(-2deg)}50%{transform:rotate(2deg)}}
.wiggle{animation:wiggle .5s ease}
@keyframes wiggle{0%,100%{transform:rotate(0)}25%{transform:rotate(-8deg) scale(1.05)}75%{transform:rotate(8deg) scale(1.05)}}
.tear{animation:tear 1.3s ease-in infinite}
.tear.t2{animation-delay:.65s}
@keyframes tear{0%{transform:translateY(0);opacity:0}15%{opacity:1}100%{transform:translateY(38px);opacity:0}}
.mini-hearts{align-self:center;font-size:30px;animation:beat 1s ease-in-out infinite}
@keyframes beat{0%,100%{transform:scale(1)}30%{transform:scale(1.3)}}

.bubble{
  position:absolute; bottom:100%; left:50%; transform:translateX(-50%); background:#fff; border-radius:16px; padding:6px 12px;
  font-family:"Marhey",sans-serif; font-size:15px; white-space:nowrap; box-shadow:0 4px 12px rgba(0,0,0,.12); z-index:5;
  animation:bubble 1.8s ease forwards; pointer-events:none;
}
.bubble::after{content:"";position:absolute;top:100%;left:50%;margin-left:-7px;border:7px solid transparent;border-top-color:#fff}
@keyframes bubble{0%{opacity:0;transform:translate(-50%,10px) scale(.6)}15%{opacity:1;transform:translate(-50%,0) scale(1)}80%{opacity:1}100%{opacity:0;transform:translate(-50%,-10px)}}

/* rain */
.cloud{position:absolute;top:-34px;left:50%;width:110px;margin-left:-55px;z-index:3;animation:cloudFloat 4s ease-in-out infinite}
.cloud svg{width:100%;display:block}
.cloud i{position:absolute;top:44px;width:2.5px;height:12px;background:#7fb7ea;border-radius:2px;animation:rain .9s linear infinite;opacity:0}
.cloud i:nth-of-type(1){left:22%}
.cloud i:nth-of-type(2){left:38%;animation-delay:.3s}
.cloud i:nth-of-type(3){left:54%;animation-delay:.6s}
.cloud i:nth-of-type(4){left:70%;animation-delay:.15s}
.cloud i:nth-of-type(5){left:84%;animation-delay:.45s}
@keyframes rain{0%{transform:translateY(0);opacity:0}20%{opacity:1}100%{transform:translateY(60px);opacity:0}}
@keyframes cloudFloat{0%,100%{transform:translateX(-6px)}50%{transform:translateX(6px)}}

/* wilted pot + thought */
.pot{width:70px;align-self:flex-end;margin-left:6px}
.pot svg{width:100%;display:block}
.drop-petal{animation:petalDrop 3.5s ease-in infinite}
@keyframes petalDrop{0%{transform:translate(0,0);opacity:0}10%{opacity:1}100%{transform:translate(-10px,52px);opacity:0}}
.thought{position:absolute;top:-30px;left:-24px;display:flex;align-items:flex-end;gap:3px}
.thought span{width:8px;height:8px;border-radius:50%;background:#fff;box-shadow:0 2px 6px rgba(0,0,0,.1)}
.thought span:nth-child(2){width:12px;height:12px}
.thought b{background:#fff;border-radius:50%;padding:8px 10px;font-size:22px;box-shadow:0 3px 10px rgba(0,0,0,.12);animation:bob 3s ease-in-out infinite}

/* ================= heart puzzle ================= */
.heart-box{position:relative;height:240px;margin-top:12px;touch-action:none}
.half{position:absolute;left:50%;top:50%;width:150px;height:135px;margin:-67px 0 0 -75px;cursor:grab;touch-action:none;
  filter:drop-shadow(0 8px 10px rgba(163,18,58,.25));transition:filter .3s}
.half.dragging{cursor:grabbing;filter:drop-shadow(0 14px 18px rgba(163,18,58,.35))}
.half.snap{transition:transform .6s cubic-bezier(.3,1.5,.5,1),filter .3s}
.heart-box.joined .half{pointer-events:none;animation:joinedBeat 1.1s ease-in-out infinite .7s}
.heart-box.joined .half path[fill="none"]{opacity:0;transition:opacity .8s .5s}
@keyframes joinedBeat{0%,100%{scale:1}25%{scale:1.1}45%{scale:.98}60%{scale:1.06}}

/* ================= glass game ================= */
.game{position:relative;height:220px;margin:18px auto 0;max-width:420px}
.table{position:absolute;left:4%;right:4%;bottom:6px;height:70px;border-radius:50%;
  background:radial-gradient(ellipse at 50% 40%,#d9a574,var(--wood) 60%,#a0703f);box-shadow:0 10px 0 var(--wood-d),0 22px 20px rgba(0,0,0,.15)}
.cup{position:absolute;bottom:40px;width:26%;height:150px;transition:left .38s cubic-bezier(.5,0,.3,1);cursor:pointer}
.cup[data-slot="0"]{left:6%} .cup[data-slot="1"]{left:37%} .cup[data-slot="2"]{left:68%}
.token{position:absolute;bottom:0;left:50%;transform:translateX(-50%) scale(.3);font-size:34px;opacity:0;transition:opacity .2s,transform .4s cubic-bezier(.3,1.6,.5,1)}
.cup.has .token{opacity:1;transform:translateX(-50%) scale(1)}
.glass{
  position:absolute;bottom:0;left:0;right:0;height:96px;
  clip-path:polygon(14% 0,86% 0,100% 100%,0 100%);
  background:linear-gradient(90deg,rgba(255,255,255,.55) 0 12%,rgba(255,236,242,.92) 12% 70%,rgba(255,210,222,.95) 70%);
  border-radius:4px;transition:transform .45s cubic-bezier(.3,1.3,.5,1);
  box-shadow:inset 0 -8px 0 rgba(163,18,58,.18);
}
.glass::before{content:"";position:absolute;inset:0;border-top:6px solid #fff;opacity:.9}
.glass::after{content:"";position:absolute;left:24%;top:14%;width:8%;height:62%;background:rgba(255,255,255,.9);border-radius:8px}
.cup.lift .glass{transform:translateY(-70px) rotate(-6deg)}
.game.pickable .cup:hover .glass{transform:translateY(-8px)}
.game.pickable .cup{animation:wobble 1.6s ease-in-out infinite}
.game.pickable .cup:nth-child(3){animation-delay:.2s}
.game.pickable .cup:nth-child(4){animation-delay:.4s}
@keyframes wobble{0%,100%{rotate:0deg}50%{rotate:2deg}}

/* ================= ask ================= */
.ask{position:relative;display:flex;justify-content:center;align-items:center;gap:16px;min-height:190px;margin-top:10px}
.btn-yes{font-size:20px;transition:transform .35s cubic-bezier(.3,1.6,.5,1),box-shadow .15s}
.btn-no{background:#fff;color:var(--ink);box-shadow:0 6px 0 #e3c2ca;transition:left .3s ease,top .3s ease,transform .3s}
.btn-no.run{position:absolute}

/* ================= final ================= */
.final{animation:popIn .8s cubic-bezier(.3,1.4,.5,1)}
.stage.hug{min-height:210px}
.hugger{transition:transform 1.2s cubic-bezier(.4,1.4,.5,1)}
.hug .hugger.l{transform:translateX(60px) rotate(-6deg)}
.hug .hugger.r{transform:translateX(-60px) rotate(6deg)}
.hug.together .hugger.l{transform:translateX(-14px) rotate(8deg)}
.hug.together .hugger.r{transform:translateX(14px) rotate(-8deg)}
.hug.together .hugger{animation:squeeze 1.4s ease-in-out 1.2s infinite}
@keyframes squeeze{0%,100%{scale:1 1}50%{scale:1.04 .96}}

.envelope{position:relative;display:block;width:240px;height:160px;margin:18px auto 8px;perspective:700px;animation:bob 2.4s ease-in-out infinite}
.envelope span{position:absolute;display:block}
.env-back{inset:0;background:#f06b8a;border-radius:10px}
.env-paper{left:12px;right:12px;top:14px;height:120px;background:#fffdf9;border-radius:6px;font-family:"Aref Ruqaa",serif;font-size:24px;color:var(--rose-d);
  display:grid;place-items:center;transition:transform .9s cubic-bezier(.3,1.2,.5,1) .35s;z-index:1}
.env-front{inset:0;z-index:2;border-radius:10px;background:
  linear-gradient(to top right,#ff8aa5 50%,transparent 50.5%) left/50% 100% no-repeat,
  linear-gradient(to top left,#ff8aa5 50%,transparent 50.5%) right/50% 100% no-repeat}
.env-flap{left:0;right:0;top:0;height:92px;z-index:3;background:#ff7596;clip-path:polygon(0 0,100% 0,50% 100%);
  transform-origin:top;transition:transform .6s ease;border-radius:10px 10px 0 0}
.env-seal{left:50%;top:70px;margin-left:-20px;width:40px;height:40px;border-radius:50%;background:var(--rose-d);color:#fff;z-index:4;
  display:grid !important;place-items:center;font-size:18px;transition:opacity .3s}
.envelope.open{animation:none}
.envelope.open .env-flap{transform:rotateX(180deg);z-index:0}
.envelope.open .env-seal{opacity:0}
.envelope.open .env-paper{transform:translateY(-80px)}

.letter{
  margin:24px auto 0;background:#fffdf8;border-radius:16px;padding:30px 22px 26px;text-align:right;position:relative;
  box-shadow:0 10px 30px rgba(163,18,58,.18);
  background-image:repeating-linear-gradient(transparent 0 37px,rgba(232,50,90,.12) 37px 38px);
}
.letter::before{content:"🌹";position:absolute;top:-22px;left:18px;font-size:40px;transform:rotate(-20deg)}
.letter p{font-family:"Aref Ruqaa",serif;font-size:21px;line-height:1.85}
.l-to{color:var(--rose-d);font-size:26px !important;margin-bottom:8px}
.poem{margin:22px 0 18px;text-align:center;padding:16px 8px;border-radius:14px;background:rgba(255,211,220,.4)}
.poem p{font-size:clamp(17px,4.9vw,26px);color:var(--rose-d);font-weight:700}
.l-sign{text-align:left;color:var(--ink-soft)}
.w{opacity:0;filter:blur(6px);display:inline-block;transform:translateY(6px);transition:opacity .6s,filter .6s,transform .6s}
.w.on{opacity:1;filter:none;transform:none}
.the-end{margin-top:30px}
.love{font-family:"Aref Ruqaa",serif;font-size:clamp(56px,16vw,90px);color:var(--rose);animation:beat 1.2s ease-in-out infinite;text-shadow:0 0 30px rgba(255,92,134,.5)}
.foot{text-align:center;color:var(--ink-soft);font-size:14px;padding:10px 0 30px}

/* ================= FX ================= */
#fx{position:fixed;inset:0;pointer-events:none;z-index:70;overflow:hidden}
.petal{position:absolute;top:-30px;width:16px;height:14px;border-radius:150% 0 150% 0;
  background:linear-gradient(135deg,#ff9fb4,#e8325a);opacity:.9;animation:fall var(--d,7s) linear forwards}
@keyframes fall{
  0%{transform:translate(0,0) rotate(0)}
  100%{transform:translate(var(--dx,40px),110vh) rotate(var(--rot,540deg))}
}
.spark{position:absolute;font-size:var(--s,20px);animation:spark var(--d,1s) cubic-bezier(.2,.7,.3,1) forwards;transform:translate(-50%,-50%)}
@keyframes spark{
  0%{transform:translate(-50%,-50%) scale(.3);opacity:1}
  100%{transform:translate(calc(-50% + var(--x)),calc(-50% + var(--y))) scale(1) rotate(var(--r,0deg));opacity:0}
}
.trail{position:absolute;width:10px;height:10px;font-size:13px;animation:trail 1.1s ease-out forwards;transform:translate(-50%,-50%)}
@keyframes trail{to{transform:translate(-50%,20px) scale(.2) rotate(90deg);opacity:0}}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important}
}
