/* ==========================================================================
   Fraction Brew — "bright & wacky potion shop" theme
   You stand at the counter; the shop scene is the backdrop; stations open as
   full-screen close-ups. Bold cartoon objects, warm wood, paper hangtags.
   ========================================================================== */

:root{
  --ink:#241407;
  --wood-dark:#2e1c10;
  --wood:#5b3a22;
  --wood-edge:#b98a4e;
  --parch:#f6e6c8;
  --parch-2:#ecd6a9;
  --cream:#fdf3df;
  --gold:#f2b53a;
  --emerald:#37b06f;
  --rose:#e26a86;
  --purple:#9a6cf0;
  --shadow:rgba(20,10,4,.35);
  --disp:'Gochi Hand', cursive;
  --hand:'Patrick Hand', cursive;
  --body:'Inter', system-ui, sans-serif;
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:var(--body);
  color:var(--ink);
  background:#1a1024;
  min-height:100vh;
}

.back-link{
  position:fixed;top:10px;left:10px;z-index:70;
  font-family:var(--hand);font-size:1.05rem;text-decoration:none;color:var(--cream);
  background:rgba(46,28,16,.86);padding:5px 13px;border:2px solid var(--wood-edge);
  border-radius:20px;box-shadow:0 3px 0 var(--shadow);
}
.back-link:hover{background:rgba(46,28,16,.98)}

/* ── Shell: each operation is its own room with its own backdrop ───────── */
.game-shell{position:relative;min-height:100vh;background:#241018}
.game-shell::before{  /* gentle vignette so UI reads over the busy scene */
  content:'';position:absolute;inset:0;pointer-events:none;z-index:1;
  background:radial-gradient(120% 80% at 50% 30%, transparent 40%, rgba(20,8,20,.45) 100%);
}
.view{background-size:cover;background-position:center top;background-repeat:no-repeat}
#view-hub{position:relative;background:#241018}
#view-hub::before{content:'';position:absolute;inset:0;z-index:0;background:url('assets/scene/shop-bg.jpg') center/cover;filter:blur(16px) brightness(.45)}
#view-shatter{position:relative;background:#241018;overflow:hidden}
/* Soft continuation of the same room fills the view behind the crisp, aspect-
   locked scene, so the edges read as the room extending into shadow rather than
   a hard-outlined box with a blurred slab under it. */
#view-shatter::before{content:'';position:absolute;inset:0;z-index:0;background:url('assets/scene/shatter-room.jpg') center/cover;filter:blur(9px) brightness(.62)}
#view-cauldron{background-image:url('assets/scene/brew-room.jpg')}
#view-sell{background-image:url('assets/scene/shop-bg.jpg')}

/* ── HUD: hanging shop sign ───────────────────────────────────────────── */
#hud{
  position:relative;z-index:20;
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:8px 12px 8px 104px;margin:0 10px;
  background:linear-gradient(#6a4327,#4a2e19);
  border:3px solid var(--wood-edge);border-top:none;
  border-radius:0 0 18px 18px;
  box-shadow:0 5px 0 var(--shadow);
}
.hud-logo{font-family:var(--disp);font-size:1.6rem;color:var(--gold);text-shadow:1px 2px 0 #2e1c10;letter-spacing:.5px}
.hud-pill{font-family:var(--hand);font-size:1rem;color:var(--cream);padding:2px 11px;background:rgba(20,10,4,.4);border:2px solid var(--wood-edge);border-radius:16px}
.hud-spacer{flex:1}
.hud-btn{
  font-family:var(--hand);font-size:1rem;cursor:pointer;color:var(--ink);
  padding:5px 12px;background:var(--parch);border:2px solid var(--wood-edge);
  border-radius:12px;box-shadow:0 3px 0 var(--shadow);
}
.hud-btn:hover{background:#fff}
.hud-btn:active{transform:translateY(2px);box-shadow:0 1px 0 var(--shadow)}
.hud-btn--quiet{padding:5px 10px;font-size:1.05rem;line-height:1}

/* ── Views ────────────────────────────────────────────────────────────── */
.view{display:none}
.view.active{display:block}

/* shop-object wrapper: bold cartoon SVG + paper fraction hangtag */
.fx{position:relative;display:inline-block;line-height:0;filter:drop-shadow(0 4px 3px rgba(20,10,4,.35))}
.fx-svg{display:block;width:100%;height:auto;overflow:visible}
.fx.sm{width:74px}
.fx.med{width:96px}
.fx.xl{width:200px}
.fx.crystal.xl{width:230px}
.fx.cauldron.xl{width:230px}
.hangtag{
  position:absolute;right:-14px;bottom:6px;transform:rotate(-8deg);
  font-family:var(--hand);font-size:1.05rem;font-weight:700;color:var(--ink);line-height:1;
  background:var(--parch);padding:3px 9px 4px;border:2px solid var(--wood-edge);border-radius:5px;
  box-shadow:0 2px 0 var(--shadow);
}
.hangtag::before{content:'';position:absolute;left:6px;top:-5px;width:5px;height:5px;border-radius:50%;background:var(--wood-edge)}
.fx.xl .hangtag{font-size:1.6rem;right:-10px;bottom:14px}

/* ── HUB scene ────────────────────────────────────────────────────────── */
.scene{position:relative;z-index:10;min-height:calc(100vh - 60px);display:flex;flex-direction:column;justify-content:space-between}
.scene-mid{flex:1;display:flex;align-items:center;justify-content:center;padding:24px 16px}
.scene-spacer{flex:1}
.stack-dock{display:flex;justify-content:center;padding:2px 0 8px}
.stack-dock .card-stack{width:210px;min-height:140px}

/* ── Front shop (HUB): doors + order card lying on the counter ─────────── */
.scene.room-hub{justify-content:flex-start}
.hub-scene{position:relative;z-index:10;overflow:visible;perspective:1300px;
  width:min(100%, calc((100vh - 116px) * (1408 / 768)));aspect-ratio:1408 / 768;margin:8px auto 0;
  background:url('assets/scene/shop-bg.jpg') center/cover;border-radius:4px}
.door-hotspot{position:absolute;z-index:8;background:none;border:none;cursor:pointer;
  border-radius:46% 46% 6% 6%/34% 34% 6% 6%;transition:box-shadow .15s}
.door-hotspot:hover{box-shadow:0 0 0 3px rgba(242,181,58,.95),0 0 26px 8px rgba(242,181,58,.5)}
.door-label{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);white-space:nowrap;
  font-family:var(--hand);font-size:1.08rem;color:var(--ink);background:var(--gold);border:2.5px solid var(--ink);
  border-radius:12px;padding:2px 12px;box-shadow:0 3px 0 var(--shadow);display:flex;align-items:center;gap:6px}
.door-label small{font-family:var(--body);font-size:.68rem;font-weight:600}
.door-hotspot.dim{cursor:not-allowed}
.door-hotspot.dim:hover{box-shadow:none}
.door-hotspot.dim .door-label{background:#c9b18a}
/* the order card / stack, on the counter */
.hub-scene .counter-card{position:absolute;z-index:12;transform-origin:center;cursor:pointer;
  filter:drop-shadow(0 14px 11px rgba(20,10,4,.5))}
/* the un-drawn stack lies skewed to the counter's perspective … */
.hub-scene .counter-card.card-stack{transform:translate(-50%,-50%) rotateX(31deg)}
.hub-scene .counter-card.card-stack:hover{transform:translate(-50%,-50%) rotateX(31deg) scale(1.03)}
/* … but the drawn recipe card comes up FLAT (upright, no perspective warp) */
.hub-scene .counter-card.request-card{transform:translate(-50%,-50%);max-width:none;cursor:default;
  background:var(--parch);opacity:1;animation:cardInFlat .28s ease;transition:width .32s ease,left .32s ease,top .32s ease}
@keyframes cardInFlat{from{transform:translate(-50%,-46%) scale(.94)}to{transform:translate(-50%,-50%) scale(1)}}
/* Persistent minimized card — parks in the bottom-left corner of the shell and
   follows the player from the counter into the Cutting and Brewing rooms. */
#recipe-reminder{position:absolute;left:14px;bottom:14px;z-index:40;width:min(210px,42vw);
  pointer-events:none;opacity:0;transform:translateY(10px);
  transition:opacity .28s ease,transform .28s ease}
#recipe-reminder.shown{pointer-events:auto;opacity:1;transform:none}
#recipe-reminder .request-card.minimized{width:100%;max-width:none;padding:9px 11px;
  transform:rotate(-1.2deg);animation:none}
#recipe-reminder .request-card.can-expand{cursor:pointer}
#recipe-reminder .request-card.can-expand:hover{transform:rotate(-1.2deg) translateY(-3px);
  filter:drop-shadow(0 8px 8px rgba(20,10,4,.4))}
.request-card.minimized .rc-flavor,.request-card.minimized .rc-start{display:none}
.request-card.minimized .rc-head{margin-bottom:6px}
.request-card.minimized .rc-portrait .cust-avatar{width:46px;height:46px;border-width:2px}
.request-card.minimized .rc-portrait .cust-avatar .cust-emoji{font-size:1.35rem}
.request-card.minimized .rc-name{font-size:1.05rem}
.request-card.minimized .rc-badge{font-size:.74rem}
.request-card.minimized .rc-wants{font-size:.92rem;margin-bottom:7px}
.request-card.minimized .rc-wants b{font-size:1rem}
.request-card.minimized .rc-recipe{padding-top:6px}
.request-card.minimized .recipe-label{font-size:.95rem;margin-bottom:2px}
.request-card.minimized .recipe-row{gap:8px}
.request-card.minimized .recipe-row .fx.sm{width:40px}
.request-card.minimized .recipe-amt{font-size:1.15rem;min-width:38px}
.request-card.minimized .recipe-ing{font-size:.95rem}
/* Start CTA on the full-size card */
.rc-start{display:block;width:100%;margin-top:12px;padding:9px 14px;cursor:pointer;
  font-family:var(--disp);font-size:1.2rem;color:var(--cream);
  background:var(--purple);border:2px solid var(--wood-edge);border-radius:12px;
  box-shadow:0 3px 0 var(--shadow);transition:transform .1s,box-shadow .1s}
.rc-start:hover{transform:translateY(-2px);box-shadow:0 5px 0 var(--shadow)}
.rc-start:active{transform:translateY(1px);box-shadow:0 1px 0 var(--shadow)}
.rc-start .ic{width:1.2rem;height:1.2rem;vertical-align:-2px}
/* Reopen tab: only appears on the minimized card */
.rc-reopen{position:absolute;top:-12px;right:8px;padding:1px 10px;cursor:pointer;display:none;
  font-family:var(--hand);font-size:.9rem;color:#6b4a24;background:#fff2d6;
  border:2px solid #cbab73;border-radius:12px;box-shadow:0 2px 0 var(--shadow)}
.request-card.minimized .rc-reopen{display:block;position:static;margin-top:7px;text-align:center;
  color:#8a5a1f;background:#fff2d6;box-shadow:none}

/* ── Room layout (Cutting Room / Brewing Room) ────────────────────────── */
.room-top{position:relative;z-index:10;display:flex;align-items:center;gap:12px;flex-wrap:wrap;justify-content:space-between;padding:14px 16px 0}
.room-mid{position:relative;z-index:10;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;padding:14px 16px;text-align:center}
.order-chip{font-family:var(--hand);font-size:1.05rem;color:var(--cream);background:rgba(20,10,4,.62);border:2px solid var(--wood-edge);border-radius:16px;padding:3px 14px}
.order-chip b{font-family:var(--disp);font-size:1.25rem;color:var(--gold)}

/* Cutting Room: crystals sit on the painted crates of the room image.
   The scene is aspect-locked so the overlays stay glued to their shelves. */
.scene.room-shatter{justify-content:space-between}
/* Cutting room: the scene art is the room — no panel chrome around/under it. */
#view-shatter .counter{background:none;border-top:0;box-shadow:none;padding:4px 14px 12px}
.shelf-scene{position:relative;z-index:10;overflow:visible;
  width:min(100%, calc((100vh - 180px) * (1408 / 768)));aspect-ratio:1408 / 768;margin:0 auto;
  background:url('assets/scene/shatter-room.jpg') center/cover}
/* the drawn shelf the crystals stand on (aspect-ratio → definite height) */
.wood-shelf{position:absolute;left:14%;width:72%;top:40%;z-index:4;line-height:0}
.shelf-svg{width:100%;height:auto;display:block;filter:drop-shadow(0 10px 7px rgba(20,10,4,.55))}
/* a grabbable crystal standing on the shelf (t = its top; base meets the board) */
.shelf-crystal{position:absolute;z-index:5;transform:translateX(-50%);width:var(--w,13%);cursor:pointer;padding:0;background:none;border:none;
  display:flex;flex-direction:column;align-items:center;gap:2px;transition:transform .12s}
.shelf-crystal .sc-fx{width:100%;line-height:0}
.shelf-crystal .sc-fx .fx-svg{width:100%;height:auto;overflow:visible}
.shelf-crystal .sc-name{font-family:var(--hand);font-size:clamp(.72rem,1.4vw,1rem);color:var(--ink);white-space:nowrap;
  background:var(--parch);border:2px solid var(--wood-edge);border-radius:8px;padding:0 7px;box-shadow:0 2px 0 var(--shadow)}
.shelf-crystal:hover{transform:translateX(-50%) translateY(-9px)}
.shelf-crystal:active{transform:translateX(-50%)}
.shelf-crystal.wrong{animation:shake .4s}
/* the grabbed crystal, sitting on the painted cutting slab */
.anvil-spot{position:absolute;left:49%;top:73%;transform:translate(-50%,-50%);width:18%}
.anvil-spot .fx{width:100%}
.swap-link{display:block;margin:8px auto 0;font-family:var(--hand);font-size:1rem;background:none;border:none;color:var(--gold);cursor:pointer;text-decoration:underline}

/* the tappable stack of order cards on the counter */
.card-stack{
  position:relative;cursor:pointer;width:230px;min-height:170px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  padding:22px 18px;color:var(--ink);font-family:var(--body);
  background:var(--parch);border:3px solid var(--wood-edge);border-radius:14px;
  box-shadow:0 6px 0 var(--shadow);transition:transform .12s}
.card-stack::before,.card-stack::after{content:'';position:absolute;inset:0;z-index:-1;
  background:var(--parch-2);border:3px solid var(--wood-edge);border-radius:14px;box-shadow:0 6px 0 var(--shadow)}
.card-stack::before{transform:rotate(-5deg) translate(-8px,4px)}
.card-stack::after{transform:rotate(4deg) translate(8px,7px)}
.card-stack:hover{transform:translateY(-4px) rotate(-1deg)}
.card-stack:active{transform:translateY(1px)}
.cs-seal{font-size:2.8rem;line-height:1;filter:drop-shadow(0 2px 2px var(--shadow))}
.cs-label{font-family:var(--disp);font-size:1.5rem;color:var(--wood);text-align:center;line-height:1.05}
.cs-cta{font-family:var(--hand);font-size:1.1rem;color:#6b4a24}
.card-stack::after{}

.customer-stand{display:flex;flex-direction:column;align-items:center;gap:6px;animation:bob 3s ease-in-out infinite}
.cust-avatar{width:104px;height:104px;display:inline-flex;align-items:center;justify-content:center;background:var(--cream);
  border:4px solid var(--wood-edge);border-radius:50%;overflow:hidden;box-shadow:0 5px 0 var(--shadow)}
.cust-avatar img{width:100%;height:100%;object-fit:cover}
.cust-emoji{font-size:3rem;line-height:1;display:flex;align-items:center;justify-content:center;width:100%;height:100%}
.cust-avatar.lg{width:120px;height:120px}
.cust-avatar.lg .cust-emoji{font-size:3.4rem}
.cust-avatar.happy{animation:bob 1s ease-in-out infinite}
.cust-name{font-family:var(--hand);font-size:1.05rem;color:var(--cream);background:rgba(20,10,4,.55);padding:2px 12px;border-radius:14px}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}

/* the drawn request card — portrait + request together */
.request-card{
  position:relative;max-width:470px;width:100%;
  background:var(--parch);border:3px solid var(--wood-edge);border-radius:14px;
  padding:18px 22px;transform:rotate(-1deg);box-shadow:0 8px 0 var(--shadow);
  animation:cardIn .32s cubic-bezier(.2,1.1,.4,1)}
@keyframes cardIn{from{opacity:0;transform:translateY(20px) rotate(-5deg) scale(.95)}to{opacity:1;transform:rotate(-1deg)}}
.rc-head{display:flex;align-items:center;gap:14px;margin-bottom:10px}
.rc-portrait .cust-avatar{width:86px;height:86px;border-width:3px;animation:none}
.rc-portrait .cust-avatar .cust-emoji{font-size:2.6rem}
.rc-who{display:flex;flex-direction:column;gap:4px}
.rc-badge{align-self:flex-start;font-family:var(--hand);font-size:.92rem;color:#6b4a24;background:#fff2d6;border:2px solid #cbab73;border-radius:12px;padding:0 10px}
.rc-name{font-family:var(--disp);font-size:1.55rem;color:var(--wood);line-height:1}
.rc-flavor{font-family:var(--hand);font-size:1.28rem;line-height:1.3;margin:0 0 8px;color:var(--ink)}
.rc-wants{font-family:var(--hand);font-size:1.2rem;color:var(--ink);margin-bottom:10px}
.rc-wants b{font-family:var(--disp);font-size:1.35rem;color:var(--purple)}
.rc-recipe{border-top:2px dashed #cbab73;padding-top:10px}
.recipe-label{font-family:var(--disp);font-size:1.15rem;color:var(--wood);display:block;margin-bottom:4px}
.recipe-rows{display:flex;flex-direction:column;gap:6px}
.recipe-row{display:flex;align-items:center;gap:12px}
.recipe-row .fx.sm{width:56px}
.recipe-amt{font-family:var(--disp);font-size:1.5rem;color:var(--purple);min-width:52px}
.recipe-ing{font-family:var(--hand);font-size:1.18rem;color:var(--ink)}
/* a gathered step gets grayed out + a green check on the recipe card */
.recipe-row.done .fx{filter:grayscale(.85) opacity(.6)}
.recipe-row.done .recipe-amt,.recipe-row.done .recipe-ing{color:#8a7c66;text-decoration:line-through}
.recipe-row.done .recipe-ing .ing-ic{filter:grayscale(.85) opacity(.7)}
.recipe-check{margin-left:auto;padding-left:6px;color:#3f9f52;font-family:var(--disp);font-size:1.4rem;line-height:1}
.request-card.minimized .recipe-check{font-size:1.1rem}

/* the counter / workbench */
.counter{
  position:relative;z-index:10;margin-top:10px;
  background:linear-gradient(180deg, rgba(46,28,16,.78), rgba(46,28,16,.94));
  border-top:5px solid var(--wood-edge);
  padding:12px 14px 18px;box-shadow:0 -6px 14px rgba(20,10,4,.4)}
.counter-caption{font-family:var(--hand);font-size:1.05rem;color:var(--gold);text-align:center;margin-bottom:8px}
.counter-quiet{opacity:.9}
.counter-wait{font-family:var(--hand);font-size:1.1rem;color:#e6cfa6;text-align:center;margin:0}
.plank{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
.station{
  width:190px;min-height:150px;cursor:pointer;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:2px;padding:12px 10px 14px;
  background:linear-gradient(#7a4f2e,#5b3a22);border:3px solid var(--wood-edge);border-radius:16px;
  box-shadow:0 5px 0 var(--shadow);color:var(--cream);font-family:var(--body)}
.station:hover{transform:translateY(-3px);box-shadow:0 8px 0 var(--shadow)}
.station:active{transform:translateY(1px);box-shadow:0 3px 0 var(--shadow)}
.station .fx{margin-bottom:4px}
.st-name{font-family:var(--disp);font-size:1.5rem;color:#fff;text-shadow:1px 1px 0 #2e1c10}
.st-sub{font-family:var(--hand);font-size:.98rem;color:#f0d9b4}
.station.locked{opacity:.62;cursor:not-allowed;filter:grayscale(.4)}
.station.locked:hover{transform:none;box-shadow:0 5px 0 var(--shadow)}
.shelf-graphic{font-size:2.3rem;position:relative;line-height:1}
.lockbadge{position:absolute;right:-6px;bottom:-4px;font-size:1.2rem}

.tray-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:center;margin-top:12px;
  font-family:var(--hand);font-size:1.1rem;color:var(--cream)}
.tray-icon{font-size:1.3rem}
.tray-empty{color:#e6cfa6;font-style:italic}
.tray-chip{background:var(--parch);color:var(--ink);border:2px solid var(--wood-edge);border-radius:14px;padding:1px 11px}
.tray-total{font-family:var(--disp);font-size:1.35rem;color:var(--gold)}

/* ── Focus views (shatter / cauldron / sell) ──────────────────────────── */
.focus{
  position:relative;z-index:10;min-height:calc(100vh - 60px);
  display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center;
  padding:18px 16px 40px;background:rgba(24,12,26,.72)}
.back-btn{align-self:flex-start;font-family:var(--hand);font-size:1.08rem;cursor:pointer;background:rgba(20,10,4,.5);
  border:2px solid var(--wood-edge);color:var(--cream);padding:4px 12px;border-radius:14px}
.back-btn:hover{background:rgba(20,10,4,.75)}
.focus-title{font-family:var(--disp);font-size:2rem;margin:2px 0 0;color:#fff;text-shadow:2px 2px 0 #2e1c10}
.focus-hint{font-family:var(--hand);font-size:1.22rem;color:var(--cream);max-width:500px;margin:0}
.focus-hint b{color:var(--gold)}
/* Brewing-room how-to hint — a legible parchment panel sitting right above the
   cauldron (only shown for the first couple of potions). */
.brew-hint{font-family:var(--hand);font-size:1.3rem;line-height:1.34;color:#fff8ee;text-align:center;
  max-width:520px;margin:0 auto 14px;padding:10px 20px;background:rgba(20,10,4,.82);
  border:2.5px solid var(--wood-edge);border-radius:16px;box-shadow:0 5px 16px rgba(0,0,0,.45)}
.brew-hint b{font-family:var(--disp);color:var(--gold)}
.brew-hint .ic{vertical-align:-0.2em}
.fx-stage{position:relative;background:rgba(246,230,200,.14);border:3px solid var(--wood-edge);border-radius:18px;padding:18px 26px;
  box-shadow:inset 0 0 24px rgba(0,0,0,.25)}

/* hammer strike + shatter */
.fx-svg g.lit{filter:drop-shadow(0 0 5px rgba(255,232,130,.9))}
.hammer{position:absolute;left:50%;top:-14px;font-size:3.4rem;line-height:1;pointer-events:none;
  transform-origin:72% 88%;animation:hammerSwing .62s ease-in forwards}
@keyframes hammerSwing{
  0%{transform:translateX(-8px) rotate(-78deg)}
  42%{transform:translateX(-8px) rotate(4deg)}
  56%{transform:translateX(-8px) rotate(-8deg)}
  100%{transform:translateX(-8px) rotate(-8deg);opacity:0}}
.impact{position:absolute;left:50%;top:46%;width:70px;height:70px;pointer-events:none;border-radius:50%;
  transform:translate(-50%,-50%) scale(0);background:radial-gradient(circle,#fff 0%,rgba(255,244,190,.7) 45%,rgba(255,255,255,0) 70%);
  animation:impactFlash .62s ease-out forwards}
@keyframes impactFlash{0%,40%{transform:translate(-50%,-50%) scale(0);opacity:0}
  50%{transform:translate(-50%,-50%) scale(1.5);opacity:1}100%{transform:translate(-50%,-50%) scale(2.3);opacity:0}}
.fx-stage.smashing .fx-svg,.anvil-spot.smashing .fx-svg{animation:crystalShake .45s ease}
@keyframes crystalShake{0%,40%{transform:none}48%{transform:translateX(-4px) rotate(-3deg)}54%{transform:translateX(4px) rotate(3deg)}62%{transform:none}}
.fx-stage.popped .fx-svg,.anvil-spot.popped .fx-svg{animation:shatterPop .42s cubic-bezier(.2,1.4,.4,1)}
@keyframes shatterPop{0%{transform:scale(.55);opacity:.25}100%{transform:scale(1);opacity:1}}
.controls.busy{pointer-events:none;opacity:.55}

.controls{display:flex;flex-direction:column;gap:14px;width:100%;max-width:480px}
.ctrl-row{display:flex;flex-direction:column;gap:8px;align-items:center}
.ctrl-row.hidden{display:none}
.ctrl-label{font-family:var(--hand);font-size:1.18rem;color:var(--cream)}
.chip-btns,.stepper{display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:center}
.chip-btn{font-family:var(--disp);font-size:1.5rem;width:56px;height:56px;cursor:pointer;color:var(--ink);
  background:var(--parch);border:3px solid var(--wood-edge);border-radius:50%;box-shadow:0 4px 0 var(--shadow)}
.chip-btn:hover{background:#fff}
.chip-btn:active{transform:translateY(2px);box-shadow:0 2px 0 var(--shadow)}
.chip-btn.on{background:var(--emerald);color:#fff;border-color:#1f7a4a}
.stepper .step-minus,.stepper .step-plus{font-family:var(--disp);font-size:1.9rem;width:52px;height:52px;cursor:pointer;
  color:var(--ink);background:var(--parch);border:3px solid var(--wood-edge);border-radius:50%;box-shadow:0 4px 0 var(--shadow);line-height:1}
.stepper button:disabled{opacity:.4;cursor:not-allowed}
.grab-count{font-family:var(--hand);font-size:1.35rem;min-width:120px;color:var(--cream)}
.grab-count b{font-family:var(--disp);font-size:1.9rem;color:var(--gold)}

.primary-btn{font-family:var(--disp);font-size:1.5rem;cursor:pointer;padding:9px 26px;color:#fff;
  background:linear-gradient(var(--emerald),#268a52);border:3px solid #1c6b40;border-radius:16px;
  box-shadow:0 5px 0 #14512f;text-shadow:1px 1px 0 #14512f}
.primary-btn:hover{filter:brightness(1.06)}
.primary-btn:active{transform:translateY(3px);box-shadow:0 2px 0 #14512f}
.primary-btn:disabled{opacity:.45;cursor:not-allowed;transform:none;box-shadow:0 5px 0 #14512f;filter:grayscale(.3)}
.ghost-btn{font-family:var(--hand);font-size:1.12rem;cursor:pointer;padding:8px 20px;color:var(--ink);
  background:var(--parch);border:3px solid var(--wood-edge);border-radius:14px;box-shadow:0 4px 0 var(--shadow)}
.ghost-btn:hover{background:#fff}
.ghost-btn:disabled{opacity:.45;cursor:not-allowed}

.brew-stage{display:flex;gap:22px;align-items:center;flex-wrap:wrap;justify-content:center}
.readout{display:flex;flex-direction:column;gap:8px;min-width:190px;text-align:left}
.ro-row{display:flex;justify-content:space-between;gap:16px;font-family:var(--hand);font-size:1.2rem;color:var(--cream);
  border-bottom:2px dotted rgba(246,230,200,.4);padding-bottom:3px}
.ro-row b{font-family:var(--disp);font-size:1.6rem}
.ro-have{color:var(--emerald)}.ro-need{color:var(--gold)}
.ro-tray{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-family:var(--hand);font-size:1rem;color:var(--cream);margin-top:4px}
.brew-actions{display:flex;gap:12px;flex-wrap:wrap;justify-content:center}
.brew-msg{font-family:var(--hand);font-size:1.24rem;color:#ffc0cf;min-height:1.4em;opacity:0;transition:opacity .2s}
.brew-msg.show{opacity:1}
.shake{animation:shake .45s ease}
@keyframes shake{0%,100%{transform:none}20%{transform:translateX(-8px) rotate(-1deg)}40%{transform:translateX(8px) rotate(1deg)}60%{transform:translateX(-6px)}80%{transform:translateX(6px)}}

/* sell */
.focus.sell{justify-content:center}
.sell-burst{font-size:3.2rem;animation:bob 1s ease-in-out infinite}
.sell-card{background:var(--parch);border:3px solid var(--wood-edge);border-radius:18px;padding:22px 26px;
  display:flex;flex-direction:column;align-items:center;gap:12px;max-width:440px;box-shadow:0 7px 0 var(--shadow)}
.sell-thanks{font-family:var(--hand);font-size:1.3rem;color:var(--ink);margin:0}
.sell-recap{display:flex;align-items:center;gap:16px}
.sell-recap-txt{display:flex;flex-direction:column;font-family:var(--hand);font-size:1.15rem;text-align:left;color:var(--ink)}
.sell-recap-txt b{font-family:var(--disp);font-size:1.6rem}
.coin-line{font-family:var(--disp);font-size:1.6rem;color:#c98a1a}
.coin-line .bonus{font-family:var(--hand);font-size:1.05rem;color:var(--emerald)}

/* ── Overlays ─────────────────────────────────────────────────────────── */
.overlay{position:fixed;inset:0;z-index:90;display:none;align-items:center;justify-content:center;padding:18px;background:rgba(24,12,26,.62)}
.overlay.open{display:flex;animation:fade .2s ease}
@keyframes fade{from{opacity:0}to{opacity:1}}
.overlay-box{background:var(--parch);border:4px solid var(--wood-edge);border-radius:18px;padding:24px 26px;max-width:440px;width:100%;text-align:center;box-shadow:0 10px 0 var(--shadow);
  max-height:calc(100dvh - 36px);overflow-y:auto;-webkit-overflow-scrolling:touch}
.overlay-box.wide{max-width:640px}
/* Header sits at the top of the box and scrolls away with the content. */
.ov-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.ov-title{font-family:var(--disp);font-size:1.8rem;margin:0;color:var(--wood)}
.ov-text{font-family:var(--hand);font-size:1.22rem;color:var(--ink);line-height:1.4;margin:0 0 18px}
.ov-x{font-size:1.2rem;background:none;border:none;cursor:pointer;color:var(--wood)}
.empty-note{font-family:var(--hand);font-size:1.2rem;color:#6b4a24;padding:18px}

.recipe-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:14px}
.recipe-item{display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 8px 8px;
  background:#fff7e6;border:2px solid var(--wood-edge);border-radius:12px;font-family:var(--hand)}
.recipe-item b{font-family:var(--disp);font-size:1.1rem;line-height:1.1;color:var(--ink)}

.mastery-table{width:100%;border-collapse:collapse;font-family:var(--hand);font-size:1.05rem;color:var(--ink)}
.mastery-table th,.mastery-table td{border:2px solid #cbab73;padding:6px 8px;text-align:center}
.mastery-table th{font-family:var(--disp);background:#fff7e6}
.mastery-note{font-family:var(--hand);font-size:.95rem;color:#6b4a24;margin-top:12px}

/* ── Toast ────────────────────────────────────────────────────────────── */
/* ── Icons (replace all emoji) ────────────────────────────────────────── */
.ic{width:1.15em;height:1.15em;display:inline-block;vertical-align:-0.22em;flex:0 0 auto}
.ing-ic{display:inline-flex;align-items:center;justify-content:center;width:1.5em;height:1.5em;vertical-align:-0.42em;line-height:0}
/* keep each icon's own aspect (square gem vs tall bottle) inside its box */
.ing-ic .fx-svg,.ing-ic .relic-svg{width:auto;height:100%;max-width:100%}
.ing-ic--bottle .fx-svg{height:118%}
.cust-avatar .cust-emoji .ic{width:58%;height:58%;vertical-align:0}
.hud-btn .ic,.primary-btn .ic,.ghost-btn .ic{vertical-align:-0.18em;margin-right:2px}
.coin-line .ic,.tap-hint .ic,.recipe-label .ic,.counter-caption .ic,.tut-title .ic{vertical-align:-0.2em}
.shelf-graphic{display:flex;align-items:flex-end;justify-content:center;gap:3px;position:relative;line-height:0}
.shelf-graphic .ic{width:30px;height:30px}
.lockbadge{position:absolute;right:2px;bottom:-4px}
.lockbadge .ic{width:20px;height:20px}
.cs-seal .ic{width:2.6rem;height:2.6rem}
.sell-burst .ic{width:3rem;height:3rem}

/* ── Cutting Room: tutorial + tap-to-shatter ──────────────────────────── */
.tut-box{position:absolute;left:50%;top:5%;transform:translateX(-50%);z-index:20;width:min(90%,430px);text-align:center;
  background:var(--parch);border:3px solid var(--wood-edge);border-radius:14px;padding:14px 18px;box-shadow:0 6px 0 var(--shadow);
  animation:pop .28s ease}
@keyframes pop{from{opacity:0;transform:translateX(-50%) translateY(10px) scale(.97)}to{opacity:1;transform:translateX(-50%) translateY(0)}}
.tut-title{font-family:var(--disp);font-size:1.35rem;color:var(--purple);margin-bottom:6px;display:flex;align-items:center;justify-content:center;gap:6px}
.tut-box p{font-family:var(--hand);font-size:1.12rem;color:var(--ink);line-height:1.35;margin:0 0 12px}
.tut-box .primary-btn{font-size:1.2rem;padding:6px 22px}
.tap-hint{font-family:var(--hand);font-size:1.2rem;color:var(--cream);display:flex;align-items:center;justify-content:center;gap:8px;margin:0}
.tap-hint b{font-family:var(--disp);font-size:1.5rem;color:var(--gold)}
/* Vault progress meter — shows the running total toward the target so the room
   gives live feedback instead of feeling like a silent chore. */
.vault-meter{max-width:340px;margin:6px auto 2px;display:flex;flex-direction:column;gap:4px}
.vm-label{font-family:var(--hand);font-size:1rem;color:var(--cream);text-align:center}
.vm-label b{font-family:var(--disp);color:var(--gold)}
.vm-bar{height:12px;border-radius:8px;background:rgba(20,10,4,.5);border:2px solid var(--wood-edge);overflow:hidden}
.vm-fill{display:block;height:100%;width:0;border-radius:6px;
  background:linear-gradient(90deg,#7ad0e6,#37b06f,#f2b53a);transition:width .3s ease}
.hammer-btn{display:inline-flex;align-items:center;gap:8px}
.ctrl-links{display:flex;gap:18px;justify-content:center;margin-top:2px}
.ctrl-links button{font-family:var(--hand);font-size:1rem;background:none;border:none;color:var(--gold);cursor:pointer;text-decoration:underline;display:inline-flex;align-items:center;gap:4px}
/* ── Direct-manipulation objects (hammer / chunks / tray) ─────────────── */
.mallet-svg,.chunk-svg,.tray-svg,.shard-svg,.relic-svg,.hand-svg{width:100%;height:100%;display:block;overflow:visible}

/* grab the hammer off the wall */
.hammer-hotspot{position:absolute;z-index:8;background:none;border:none;cursor:pointer;border-radius:14px;
  box-shadow:0 0 0 3px rgba(242,181,58,.9),0 0 22px 6px rgba(242,181,58,.5);animation:hsPulse 1.1s ease-in-out infinite}
@keyframes hsPulse{0%,100%{box-shadow:0 0 0 3px rgba(242,181,58,.85),0 0 18px 4px rgba(242,181,58,.4)}50%{box-shadow:0 0 0 5px rgba(242,181,58,1),0 0 28px 10px rgba(242,181,58,.6)}}
.hammer-hotspot .grab-me{position:absolute;left:50%;bottom:-26px;transform:translateX(-50%);white-space:nowrap;
  font-family:var(--hand);font-size:1rem;color:var(--ink);background:var(--gold);border:2px solid var(--ink);border-radius:10px;padding:0 8px;box-shadow:0 2px 0 var(--shadow)}

.hammer-hotspot.held{animation:none;box-shadow:0 0 0 2px rgba(242,181,58,.55)}
/* Exit wayfinding: a big arrow on the left edge pointing back to the counter. */
.exit-arrow{position:absolute;left:1.5%;top:44%;width:11%;z-index:9;background:none;border:none;padding:0;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;gap:3px;filter:drop-shadow(0 4px 5px rgba(20,10,4,.5));
  animation:arrowNudge 1.4s ease-in-out infinite}
@keyframes arrowNudge{0%,100%{transform:translateY(-50%) translateX(0)}50%{transform:translateY(-50%) translateX(-7px)}}
.exit-arrow:hover{animation:none;transform:translateY(-50%) translateX(-7px)}
.exit-arrow .arrow-svg{width:100%;height:auto;display:block}
.exit-arrow .exit-label{font-family:var(--hand);font-size:1rem;color:var(--ink);background:var(--gold);
  border:2.5px solid var(--ink);border-radius:9px;padding:0 10px;box-shadow:0 2px 0 var(--shadow);pointer-events:none}
.exit-arrow:hover .exit-label{background:#ffce5c}
/* Pre-grab tutorial hint sitting just under the shelf. */
.shelf-hint{position:absolute;left:50%;top:47%;transform:translateX(-50%);z-index:7;white-space:nowrap;text-align:center;
  font-family:var(--hand);font-size:1.22rem;color:#fff8ee;background:rgba(20,10,4,.82);
  border:2.5px solid var(--wood-edge);border-radius:14px;padding:6px 18px;box-shadow:0 5px 14px rgba(0,0,0,.45)}
.shelf-hint .ic{vertical-align:-0.2em}
/* custom follow-cursor: a giant hammer while wielding, an open hand otherwise */
.shelf-scene.custom-cursor,.shelf-scene.custom-cursor *{cursor:none}
.scene-cursor{position:absolute;left:0;top:0;pointer-events:none;z-index:60;opacity:0;aspect-ratio:1;
  filter:drop-shadow(0 5px 4px rgba(20,10,4,.5))}
.scene-cursor.is-mallet{width:34%;max-width:150px;transform:translate(-24%,-64%)}
.scene-cursor.is-hand{width:24%;max-width:118px;transform:translate(-42%,-14%)}
.scene-cursor.is-mallet.swing{animation:malletSwing .3s ease}
@keyframes malletSwing{0%{transform:translate(-24%,-64%) rotate(0)}45%{transform:translate(-24%,-64%) rotate(-34deg)}100%{transform:translate(-24%,-64%) rotate(0)}}
.anvil-spot .fx-svg{transition:filter .15s}
.anvil-spot:hover .fx-svg{filter:drop-shadow(0 0 10px rgba(255,240,150,.85))}
.anvil-spot.hit .fx-svg{animation:crystalShake .4s ease}

/* the tray (a real object) */
.tray-drop{position:relative;aspect-ratio:300 / 130;z-index:6}
.tray-drop.tray-abs{position:absolute}
.tray-drop .stage-label{position:absolute;left:50%;top:-24px;transform:translateX(-50%);white-space:nowrap;
  font-family:var(--hand);font-size:1.02rem;color:var(--cream);display:flex;align-items:center;gap:5px}
.tray-pieces{position:absolute;inset:0;pointer-events:none}
.tray-piece{position:absolute;width:17%;transform:translate(-50%,-50%);line-height:0;filter:drop-shadow(0 3px 2px rgba(20,10,4,.4))}
.tray-total{position:absolute;right:6%;bottom:6%;font-family:var(--disp);font-size:1.35rem;color:var(--gold);
  background:rgba(20,10,4,.5);border-radius:10px;padding:0 8px}
.tray-piece.drag-piece{pointer-events:auto;cursor:grab}
.tray-piece.drag-piece:active{cursor:grabbing}

/* the free-floating chunk while dragging */
.drag-chunk{position:fixed;transform:translate(-50%,-50%);pointer-events:none;z-index:9999;line-height:0;filter:drop-shadow(0 6px 5px rgba(20,10,4,.5))}
.tray-piece.dragging{z-index:9999;filter:drop-shadow(0 8px 6px rgba(20,10,4,.55))}

/* Brewing Room: tray beside the cauldron (drop target) */
.cauldron-target{position:relative;display:flex;align-items:center;gap:16px}
.cauldron-target .fx.cauldron{width:280px}
.brew-tray{width:min(360px,44vw)}

/* Brew room: the tray & cauldron sit on the counter drawn into the room
   background, so drop the UI panel chrome (bg + border) that would otherwise
   read as a separate box floating in front of it. */
#view-cauldron .counter{background:none;border-top:0;box-shadow:none;padding:4px 14px 18px}
#view-cauldron .brew-stage{gap:8px}

/* Bottled! panel shown after a correct brew, before delivery. */
.bottled-card{display:flex;flex-direction:column;align-items:center;gap:10px;
  background:rgba(24,12,26,.72);border:3px solid var(--wood-edge);border-radius:20px;
  padding:20px 30px;box-shadow:0 7px 0 var(--shadow);max-width:460px}
.bottled-vial .fx.vial{width:130px;animation:bob 1.6s ease-in-out infinite}
.bottled-title{font-family:var(--disp);font-size:1.9rem;color:#fff;margin:0;text-shadow:2px 2px 0 #2e1c10}
.bottled-card .focus-hint{color:var(--cream)}

/* ── Pour step: tip the cauldron into a flask ──────────────────────────── */
.pour-stage{display:flex;align-items:center;justify-content:center;gap:10px}
.pour-stage .cauldron-target .fx.cauldron{width:260px;transition:transform .5s ease}
.pour-stage .cauldron-target.poured .fx.cauldron{transform:rotate(-16deg) translateX(30px)}
.pour-flask{position:relative;width:150px;cursor:grab;touch-action:none;z-index:6;
  filter:drop-shadow(0 8px 6px rgba(20,10,4,.5));animation:bob 1.4s ease-in-out infinite}
.pour-flask:active{cursor:grabbing}
.pour-flask.dragging{animation:none;cursor:grabbing}
.pour-flask .fx.vial{width:100%}
.pour-flask.filled{animation:none}
.pour-tip{position:absolute;left:50%;top:-24px;transform:translateX(-50%);white-space:nowrap;
  font-family:var(--hand);font-size:1rem;color:var(--ink);background:var(--gold);border:2px solid var(--ink);
  border-radius:12px;padding:0 10px;box-shadow:0 2px 0 var(--shadow)}
.pour-flask.filled .pour-tip{display:none}

/* ── Delivery portal (HUB) — a fixture built into the shop ─────────────── */
.hub-scene.delivering{cursor:default}
.portal-shadow{position:absolute;transform:translate(-50%,-50%);z-index:8;aspect-ratio:3 / 1;
  background:radial-gradient(closest-side, rgba(20,10,4,.55), transparent 72%)}
.delivery-portal{position:absolute;transform:translate(-50%,-50%);z-index:9;
  aspect-ratio:220 / 250;filter:drop-shadow(0 8px 8px rgba(20,10,4,.45));
  transition:transform .18s}
.delivery-portal .portal-svg{width:100%;height:auto;display:block}
.portal-swirl{animation:portalSpin 7s linear infinite}
@keyframes portalSpin{to{transform:rotate(360deg)}}
.delivery-portal.hot{transform:translate(-50%,-50%) scale(1.05)}
.delivery-portal.hot .portal-svg{filter:drop-shadow(0 0 18px rgba(242,181,58,.85))}
.delivery-portal.delivering{animation:portalPulse .7s ease}
@keyframes portalPulse{0%{transform:translate(-50%,-50%) scale(1)}40%{transform:translate(-50%,-50%) scale(1.18)}100%{transform:translate(-50%,-50%) scale(1)}}

.deliver-hint{position:absolute;left:50%;top:6%;transform:translateX(-50%);z-index:11;white-space:nowrap;
  font-family:var(--hand);font-size:1.18rem;color:var(--ink);background:var(--gold);border:2.5px solid var(--ink);
  border-radius:14px;padding:4px 16px;box-shadow:0 3px 0 var(--shadow)}
.deliver-hint b{font-family:var(--disp)}
.held-vial{position:absolute;transform:translate(-50%,50%);z-index:12;width:104px;cursor:grab;touch-action:none;
  filter:drop-shadow(0 8px 6px rgba(20,10,4,.5));animation:bob 1.4s ease-in-out infinite}
.held-vial:active{cursor:grabbing}
.held-vial .fx.vial{width:100%}
.held-vial.dragging{animation:none;cursor:grabbing}

/* ── Delivery celebration: burst + confetti + coins flying to the HUD ──── */
.celebrate-layer{position:fixed;inset:0;z-index:120;pointer-events:none}
.celebrate-layer .spark{position:fixed;width:26px;height:26px;transform:translate(-50%,-50%);
  animation:sparkFly 1s ease-out forwards}
.celebrate-layer .spark .ic{width:100%;height:100%}
.celebrate-layer .spark.confetti{width:12px;height:16px;border-radius:2px}
@keyframes sparkFly{0%{transform:translate(-50%,-50%) translate(0,0) rotate(0) scale(.4);opacity:0}
  18%{opacity:1}
  100%{transform:translate(-50%,-50%) translate(var(--dx),var(--dy)) rotate(var(--rot,180deg)) scale(1);opacity:0}}
.celebrate-layer .fly-coin{position:fixed;width:32px;height:32px;transform:translate(-50%,-50%);z-index:2}
.celebrate-layer .fly-coin .ic{width:100%;height:100%;filter:drop-shadow(0 2px 2px rgba(20,10,4,.5))}
#hud-coins.bump{animation:coinBump .4s ease}
@keyframes coinBump{0%,100%{transform:none}40%{transform:scale(1.35);color:var(--gold)}}

/* ── The ingredient tray — a real object resting on each room's counter ──── */
/* Shadow lives on the tray art (svg), NOT the container: a filter on the
   container would become the containing block for the pieces' position:fixed
   while dragging, throwing them off-screen. */
.scene-tray .tray-svg{filter:drop-shadow(0 7px 6px rgba(20,10,4,.5))}
.hub-tray{position:absolute;transform:translate(-50%,-50%);z-index:11}
.scene-tray .stage-label b{font-family:var(--disp);color:var(--gold);margin-left:3px}

/* ── Brewing animation (a real beat while the cauldron works) ───────────── */
.brew-steam{position:absolute;left:50%;top:2%;width:46%;height:46%;transform:translateX(-50%);
  pointer-events:none;opacity:0}
.cauldron-target.brewing .brew-steam{opacity:1;
  background:radial-gradient(circle at 50% 100%, rgba(255,255,255,.55), transparent 62%);
  animation:steamRise 1s ease-in-out infinite}
@keyframes steamRise{0%{opacity:.1;transform:translateX(-50%) translateY(8px) scale(.8)}
  50%{opacity:.55}100%{opacity:0;transform:translateX(-50%) translateY(-20px) scale(1.15)}}
.cauldron-target.brewing .fx.cauldron{animation:brewWobble .5s ease-in-out infinite;
  filter:drop-shadow(0 0 18px rgba(255,214,110,.85))}
@keyframes brewWobble{0%,100%{transform:rotate(-1.6deg)}50%{transform:rotate(1.6deg)}}
/* Only the cauldron pulses while brewing — the tray stays still. */
.cauldron-target.brewing{animation:brewPulse .5s ease-in-out infinite}
@keyframes brewPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.03)}}

/* ── Crystal-shatter particles (hammer impact) — big, forceful burst ────── */
.shatter-fx{position:fixed;inset:0;z-index:70;pointer-events:none}
.shatter-fx .impact-flash{position:fixed;transform:translate(-50%,-50%) scale(0);
  border-radius:50%;background:radial-gradient(circle,#fff,rgba(255,240,180,.7) 40%,transparent 72%);
  animation:impactPop .34s ease-out forwards}
@keyframes impactPop{0%{transform:translate(-50%,-50%) scale(0);opacity:1}
  100%{transform:translate(-50%,-50%) scale(1.7);opacity:0}}
.shatter-fx .shard-bit{position:fixed;transform:translate(-50%,-50%);
  clip-path:polygon(50% 0,100% 62%,50% 100%,0 62%);border:2px solid rgba(20,10,4,.55);
  filter:drop-shadow(0 2px 2px rgba(20,10,4,.4));
  animation:shardFly .72s cubic-bezier(.25,.7,.5,1) forwards}
.shatter-fx .shard-bit.dust{clip-path:circle(50%);border:none;opacity:.9}
@keyframes shardFly{0%{transform:translate(-50%,-50%) translate(0,0) rotate(0) scale(.4);opacity:0}
  14%{opacity:1}
  100%{transform:translate(-50%,-50%) translate(var(--dx),var(--dy)) rotate(var(--rot)) scale(1.05);opacity:0}}
.live-status{font-family:var(--hand);font-size:1.1rem;color:var(--cream);margin:6px 0 0}
.live-status b{font-family:var(--disp);color:var(--gold)}
.need-note{color:#e6cfa6}

#toast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(20px);z-index:95;
  font-family:var(--hand);font-size:1.18rem;padding:9px 20px;background:var(--wood-dark);color:var(--cream);
  border:2px solid var(--wood-edge);border-radius:16px;opacity:0;pointer-events:none;transition:.25s}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

@media(max-width:560px){
  .plank{flex-direction:column;align-items:center}
  .station{width:min(90vw,300px);min-height:auto;flex-direction:row;gap:12px;text-align:left}
  .station .fx.sm{width:56px}
  .focus-title{font-size:1.6rem}
  .brew-stage{flex-direction:column}
}

/* ══ Tier 2 — The Scrap Shelf (crowded apothecary bottle wall) ═════════════ */
#view-shelf{position:relative;background:#241018;overflow:hidden}
#view-shelf::before{content:'';position:absolute;inset:0;z-index:0;background:url('assets/scene/apothecary-room.jpg') center/cover;filter:blur(9px) brightness(.62)}
.scene.room-shelf{justify-content:space-between}
#view-shelf .counter{background:none;border-top:0;box-shadow:none;padding:4px 14px 12px}
/* the aspect-locked storeroom scene (its own backdrop, over the letterbox) */
.shelf-scene.bottle-scene{background-image:url('assets/scene/apothecary-room.jpg')}
/* three thin wall-mounted ledges, one per bottle row (top set inline per row);
   the plank stretches freely (preserveAspectRatio=none) so it stays thin */
.shelf-row{position:absolute;left:8%;width:84%;height:7.5%;z-index:4;line-height:0}
.shelf-row .plank-svg{width:100%;height:100%;display:block}
/* a bottle resting on the shelf: left = centre-x, top = the shelf SURFACE, and
   the element is BOTTOM-anchored so its base sits on the board (not floating) */
.shelf-bottle{position:absolute;z-index:5;transform:translate(-50%,-100%);width:5.6%;cursor:pointer;
  padding:0;background:none;border:none;line-height:0;transition:transform .12s,filter .12s}
.shelf-bottle .fx.vial{width:100%}
.shelf-bottle:hover{transform:translate(-50%,-106%) scale(1.06);filter:drop-shadow(0 0 9px rgba(255,240,150,.9))}
.shelf-bottle:active{transform:translate(-50%,-100%)}
.shelf-bottle.wrong{animation:shake .42s}
.shelf-bottle .hangtag{right:-10px;bottom:8px;font-size:.82rem;padding:1px 6px 2px}
.shelf-bottle.got{filter:drop-shadow(0 0 12px rgba(120,240,150,.95))}
.shelf-bottle.got .hangtag{background:#d8f6c8;border-color:#5fae5f}
.bottle-scene.done .shelf-bottle{cursor:default}
.bottle-scene.done .shelf-bottle:not(.got){opacity:.45;filter:grayscale(.4)}
.bottle-scene.done .shelf-bottle:hover{transform:translate(-50%,-100%);filter:none}
.bottle-scene.done .shelf-bottle.got:hover{transform:translate(-50%,-100%)}
/* ingredient name label under each group */
.group-label{position:absolute;z-index:6;transform:translate(-50%,-50%);white-space:nowrap;
  font-family:var(--hand);font-size:clamp(.6rem,1.15vw,.86rem);color:var(--ink);
  background:var(--parch);border:2px solid var(--wood-edge);border-radius:8px;padding:0 7px;box-shadow:0 2px 0 var(--shadow);
  display:flex;align-items:center;gap:4px}
.group-label .ing-ic{width:1em;height:1.15em}

/* ══ Scrap Shelf hotspot on the shop wall (HUB) ═══════════════════════════ */
.wall-hotspot{position:absolute;z-index:9;background:none;border:none;cursor:pointer;
  border-radius:10px;transition:box-shadow .15s}
.wall-hotspot:hover{box-shadow:0 0 0 3px rgba(242,181,58,.95),0 0 24px 7px rgba(242,181,58,.5)}
.wall-hotspot.got .door-label{background:#bfe8b0}

/* ══ Multi-ingredient brew: per-ingredient tally + recipe chip ════════════ */
.chip-plus{color:var(--gold);font-family:var(--disp);margin:0 3px}
.brew-status{display:flex;flex-wrap:wrap;gap:8px 16px;justify-content:center;margin:4px 0 2px}
.brew-need{font-family:var(--hand);font-size:1.05rem;color:#e6cfa6;display:flex;align-items:center;gap:5px}
.brew-need b{font-family:var(--disp);color:var(--cream)}
.brew-need.ok{color:#8ee6a0}
.brew-need.ok b{color:#8ee6a0}
.brew-need .ing-ic{width:1.05em;height:1.2em;vertical-align:-.2em}
.sell-recap-rows{display:flex;flex-direction:column;gap:3px;margin-top:3px}
.sell-recap-row{display:flex;align-items:center;gap:8px}
.sell-recap-row .sell-amt{font-family:var(--disp);font-size:1.25rem;color:var(--purple);min-width:44px}
.sell-recap-row .sell-ing{font-family:var(--hand);font-size:1.05rem;color:var(--ink)}
.sell-recap-row .ing-ic{width:1.05em;height:1.2em;vertical-align:-.2em}
.tray-piece.is-vial{width:11%}

/* the shared tray on the Scrap Shelf counter — the picked bottle lands here */
.counter.shelf-counter{display:flex;align-items:center;justify-content:center;gap:14px 34px;flex-wrap:wrap}
.shelf-info{max-width:560px;text-align:center}
.shelf-tray{width:min(280px,40vw);flex:none;margin-top:14px}
.shelf-tray .drag-piece{cursor:default;pointer-events:none}
.shelf-tray .tray-piece{filter:drop-shadow(0 3px 2px rgba(20,10,4,.45))}
/* a little pop as a piece appears on the tray */
@keyframes trayPop{0%{transform:translate(-50%,-50%) scale(.2);opacity:0}60%{transform:translate(-50%,-50%) scale(1.15)}100%{transform:translate(-50%,-50%) scale(1);opacity:1}}
.shelf-tray .tray-piece.pop{animation:trayPop .45s cubic-bezier(.2,1.4,.4,1)}

/* ══ Tier 3 — The Curiosity Vault (memory-match niche grid) ═══════════════ */
#view-vault{position:relative;background:#1a1120;overflow:hidden}
#view-vault::before{content:'';position:absolute;inset:0;z-index:0;background:url('assets/scene/vault-room.jpg') center/cover;filter:blur(9px) brightness(.55)}
#view-vault .counter{background:none;border-top:0;box-shadow:none;padding:4px 14px 12px}
.shelf-scene.vault-scene{background-image:url('assets/scene/vault-room.jpg')}
/* the flip grid sits inside the carved centre panel of the backdrop */
.vault-grid{position:absolute;left:21%;top:11%;width:58%;height:60%;z-index:4;
  display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(3,1fr);gap:3% 3.2%}
.vault-tile{position:relative;padding:0;background:none;border:none;cursor:pointer;line-height:0;transition:transform .12s}
.vault-tile .vault-face{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}
.vault-tile .cover-svg{width:100%;height:100%;filter:drop-shadow(0 5px 5px rgba(20,10,4,.5));transition:filter .15s}
.vault-tile:not(.is-up):hover{transform:translateY(-4px)}
.vault-tile:not(.is-up):hover .cover-svg{filter:drop-shadow(0 0 11px rgba(242,181,58,.9)) drop-shadow(0 6px 5px rgba(20,10,4,.5))}
.vault-tile .vault-face.up .fx{display:flex;align-items:center;justify-content:center;width:100%;height:100%;filter:none}
.vault-tile .vault-face.up .relic-svg{width:auto;height:74%;overflow:visible;filter:drop-shadow(0 4px 3px rgba(20,10,4,.4))}
.vault-tile .vault-face.up .hangtag{right:0;bottom:-2px;font-size:1.12rem;padding:2px 9px 3px;border-width:2.5px}
.vault-tile.flip .vault-face.up{animation:vaultFlipIn .3s ease}
.vault-tile.flip-back{animation:vaultFlipOut .26s ease forwards}
.vault-tile.wrong .vault-face.up .relic-svg{filter:drop-shadow(0 0 9px rgba(232,90,90,.95))}
@keyframes vaultFlipIn{0%{transform:rotateY(88deg) scale(.9);opacity:.15}100%{transform:rotateY(0) scale(1);opacity:1}}
@keyframes vaultFlipOut{0%{transform:rotateY(0);opacity:1}100%{transform:rotateY(88deg);opacity:.15}}
.vault-scene.done .vault-tile.is-up .relic-svg{filter:drop-shadow(0 0 11px rgba(120,240,150,.95))}
.vault-scene.done .vault-tile.is-up .hangtag{background:#d8f6c8;border-color:#5fae5f}
.vault-scene.done .vault-tile:not(.is-up){opacity:.4}
.vault-reset{display:block;margin:6px auto 0;font-family:var(--hand);font-size:1rem;background:none;border:none;
  color:var(--gold);cursor:pointer;text-decoration:underline}
.vault-reset[hidden]{display:none}

/* ══ Hidden vault door on the shop back wall (HUB, Tier 3) ═════════════════ */
.secret-vault{position:absolute;z-index:7;background:none;border:none;padding:0;cursor:pointer;line-height:0;
  transition:transform .15s,filter .15s;filter:drop-shadow(0 5px 6px rgba(0,0,0,.5))}
.secret-vault .vault-door-svg{width:100%;height:auto;display:block}
.secret-vault:hover{transform:translateY(-2px);filter:drop-shadow(0 0 15px rgba(180,150,240,.9)) drop-shadow(0 5px 6px rgba(0,0,0,.5))}
.secret-vault .vault-label{top:-16%;bottom:auto}
.secret-vault.got .vault-label{background:#bfe8b0}
.secret-vault .vd-hole,.secret-vault .vd-glow{opacity:0}
.secret-vault .vd-lid{transform-box:fill-box;transform-origin:center top}
.secret-vault.opening{pointer-events:none}
.secret-vault.opening .vd-hole{opacity:1;transition:opacity .25s .12s}
.secret-vault.opening .vd-glow{animation:vdGlow .5s .1s ease forwards}
.secret-vault.opening .vd-lid{animation:vaultHatchOpen .5s ease forwards}
@keyframes vdGlow{0%{opacity:0}60%{opacity:1}100%{opacity:.55}}
@keyframes vaultHatchOpen{0%{transform:perspective(300px) rotateX(0)}100%{transform:perspective(300px) rotateX(-78deg)}}

/* ══ Shop decor on the hub scene + the Gold Shop overlay ══════════════════ */
.hub-decor{position:absolute;z-index:2;line-height:0;pointer-events:none}
.hub-decor .decor-svg{width:100%;height:auto;display:block;filter:drop-shadow(0 4px 4px rgba(0,0,0,.35))}
/* Shop cat — idle animation + pettable */
.hub-decor.decor-shop-cat{pointer-events:auto;cursor:pointer;z-index:6}
.hub-decor.decor-shop-cat:hover .cat-idle{filter:brightness(1.1)}
.cat-svg .cat-idle{transform-box:fill-box;transform-origin:center bottom;animation:catBreath 3.2s ease-in-out infinite}
@keyframes catBreath{0%,100%{transform:translateY(0) scaleY(1)}50%{transform:translateY(-1px) scaleY(1.045)}}
.cat-svg .cat-tail{transform-box:fill-box;transform-origin:left bottom;animation:catTail 1.7s ease-in-out infinite}
@keyframes catTail{0%,100%{transform:rotate(0)}50%{transform:rotate(-18deg)}}
.cat-svg .cat-eyes{transform-box:fill-box;transform-origin:center;animation:catBlink 5.5s infinite}
@keyframes catBlink{0%,93%,100%{transform:scaleY(1)}96%{transform:scaleY(.1)}}
.cat-svg.petting .cat-idle{animation:catHappy .55s ease}
@keyframes catHappy{0%{transform:translateY(0) scale(1)}30%{transform:translateY(-8px) scale(1.07)}55%{transform:translateY(0) scale(1)}78%{transform:translateY(-3px)}100%{transform:translateY(0)}}
.cat-fx{position:fixed;inset:0;z-index:130;pointer-events:none}
.cat-heart{position:fixed;transform:translate(-50%,-50%);width:26px;height:26px;animation:catHeartUp 1s ease-out forwards}
.cat-heart .ic{width:100%;height:100%}
@keyframes catHeartUp{0%{transform:translate(-50%,-50%) scale(.4);opacity:0}22%{opacity:1}100%{transform:translate(-50%,-150%) scale(1.05);opacity:0}}
.shop-coins{text-align:center;font-family:var(--hand);font-size:1.35rem;color:var(--ink);margin:0 0 6px}
.shop-coins .ic{vertical-align:-.22em}
.shop-cat-h{font-family:var(--disp);font-size:1.15rem;color:var(--ink);margin:16px 0 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.shop-cat-h .ic{width:1em;height:1em;vertical-align:-.15em}
.shop-cat-h small{font-family:var(--body);font-size:.72rem;font-weight:600;color:#8a7a5a}
.shop-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:12px}
.shop-item{background:rgba(246,230,200,.5);border:2.5px solid var(--wood-edge);border-radius:12px;
  padding:10px 8px;display:flex;flex-direction:column;align-items:center;gap:7px;text-align:center}
.shop-item.is-active,.shop-item.is-owned{border-color:#5fae5f;background:rgba(200,240,190,.45)}
.shop-preview{width:66px;height:66px;display:flex;align-items:center;justify-content:center}
.shop-preview.decor{width:92px}
.shop-preview .fx.vial.sm{width:46px}
.shop-preview .decor-svg{max-width:100%;max-height:100%;width:auto;height:auto}
.shop-preview .fx.cauldron.sm{width:60px}
.shop-tray-preview{width:80px;height:36px}
.shop-tray-preview .tray-svg{width:100%;height:100%}
.shop-bd-swatch{width:66px;height:52px;border-radius:8px;border:2px solid var(--wood-edge);background:#2a1a2e}
.shop-bd-swatch.bd-sw-candlelight{background:radial-gradient(120% 100% at 50% 20%,#ffbe5a,#7a280a)}
.shop-bd-swatch.bd-sw-moonlit{background:radial-gradient(120% 100% at 50% 15%,#78aaff,#141e50)}
.shop-bd-swatch.bd-sw-enchanted{background:radial-gradient(120% 100% at 50% 20%,#be78ff,#3c145a)}

/* Room backdrop washes — a colour overlay above the room photo (z-index 0) but
   below the interactive scene content (z-index 10), so rooms are tinted without
   washing out the UI. Applied via a bd-* class on <body> (see applyBackdrop). */
#stage{position:relative}
body[class*="bd-"] #stage::after{content:'';position:absolute;inset:0;z-index:9;pointer-events:none;mix-blend-mode:soft-light}
body.bd-candlelight #stage::after{background:radial-gradient(120% 90% at 50% 18%,rgba(255,190,90,.6),rgba(120,40,10,.4))}
body.bd-moonlit #stage::after{background:radial-gradient(120% 90% at 50% 12%,rgba(120,170,255,.55),rgba(20,30,80,.45))}
body.bd-enchanted #stage::after{background:radial-gradient(120% 90% at 50% 18%,rgba(190,120,255,.55),rgba(60,20,90,.45))}
.shop-name{font-family:var(--hand);font-size:.96rem;color:var(--ink);line-height:1.12}
.shop-buy{font-family:var(--hand);font-size:1rem;padding:3px 13px;display:inline-flex;align-items:center;gap:4px}
.shop-buy .ic{width:1em;height:1em;vertical-align:-.15em}
.shop-buy:disabled{opacity:.4;cursor:not-allowed;box-shadow:none}
.shop-equip{font-family:var(--hand);font-size:.96rem;background:var(--gold);border:2px solid var(--ink);
  border-radius:9px;padding:2px 13px;cursor:pointer;box-shadow:0 2px 0 var(--shadow)}
.shop-equip:hover{filter:brightness(1.05)}
.shop-tag{font-family:var(--hand);font-size:.94rem;font-weight:700;color:#3f8f4f}
.shop-preview.helper{width:74px;height:74px}
.shop-preview.helper .fairy-svg{width:100%;height:100%}
.shop-desc{font-family:var(--hand);font-size:.86rem;color:#5a4a34;line-height:1.2;margin:0}
.shop-helper{grid-column:span 2}
@media (max-width:520px){.shop-helper{grid-column:span 1}}
/* "Your fairy handled it" room panel */
.fairy-done-card{max-width:440px;margin:0 auto;text-align:center;background:var(--parch);
  border:3px solid var(--wood-edge);border-radius:16px;padding:22px 22px 26px;box-shadow:0 8px 0 var(--shadow);
  display:flex;flex-direction:column;align-items:center;gap:12px}
.fairy-done-icon{width:110px;height:110px}
.fairy-done-tray{position:relative;width:220px;height:120px;margin:4px auto 2px}

/* the equivalence "resize" reward that pops up when a differently-sized scrap
   is dropped — it confirms 1/2 = 2/4 right at the drop point */
.resize-flash{position:fixed;z-index:130;transform:translate(-50%,-50%);pointer-events:none;
  display:flex;align-items:center;gap:8px;padding:8px 15px;
  background:rgba(255,248,238,.98);border:3px solid var(--wood-edge);border-radius:16px;
  box-shadow:0 8px 0 var(--shadow);animation:rfPop 1.2s ease forwards}
@keyframes rfPop{0%{opacity:0;transform:translate(-50%,-40%) scale(.7)}
  15%{opacity:1;transform:translate(-50%,-58%) scale(1.06)}
  78%{opacity:1;transform:translate(-50%,-66%) scale(1)}
  100%{opacity:0;transform:translate(-50%,-84%) scale(.96)}}
.resize-flash .rf-one{width:42px}.resize-flash .rf-one .shard-svg{width:100%;height:auto;display:block}
.resize-flash .rf-eq{font-family:var(--disp);font-size:1.5rem;color:var(--wood)}
.resize-flash .rf-many{display:flex;gap:2px}.resize-flash .rf-many .rf-mini{width:26px}
.resize-flash .rf-many .rf-mini .shard-svg{width:100%;height:auto;display:block}
.resize-flash .rf-cap{font-family:var(--disp);font-size:1.35rem;color:var(--purple);margin-left:4px;white-space:nowrap}

/* ══ Tier-up celebration overlay ══════════════════════════════════════════ */
.tierup-box{max-width:460px}
.tierup-box .tu-burst{width:88px;margin:-6px auto 2px}
.tierup-box .tu-burst .ic{width:100%;height:100%}
.tu-kicker{font-family:var(--hand);font-size:1.05rem;color:#a06a12;text-transform:uppercase;letter-spacing:.09em}
.tu-title{font-family:var(--disp);font-size:2.1rem;color:var(--purple);margin:2px 0 6px;line-height:1}
.tu-name{font-family:var(--disp);font-size:1.55rem;color:var(--wood)}
.tu-text{font-family:var(--hand);font-size:1.18rem;color:var(--ink);line-height:1.4;margin:10px 0 16px}
.tu-text b{color:var(--purple)}

/* ══ Tier 4 — The Great Regrind (Market + Splitting Room) ═════════════════ */
#view-market,#view-split{position:relative;background:#231810;overflow:hidden}
#view-market::before{content:'';position:absolute;inset:0;z-index:0;background:url('assets/scene/market-room.jpg') center/cover;filter:blur(9px) brightness(.62)}
#view-split::before{content:'';position:absolute;inset:0;z-index:0;background:url('assets/scene/split-room.jpg') center/cover;filter:blur(9px) brightness(.62)}
#view-market .counter,#view-split .counter{background:none;border-top:0;box-shadow:none;padding:4px 14px 12px}
.shelf-scene.market-scene{background-image:url('assets/scene/market-room.jpg')}
.shelf-scene.split-scene{background-image:url('assets/scene/split-room.jpg')}

/* the knife follow-cursor (mirrors the mallet) */
.scene-cursor.is-knife{width:32%;max-width:150px;transform:translate(-18%,-58%)}
.scene-cursor.is-knife.swing{animation:knifeSwing .3s ease}
@keyframes knifeSwing{0%{transform:translate(-18%,-58%) rotate(0)}45%{transform:translate(-18%,-58%) rotate(28deg)}100%{transform:translate(-18%,-58%) rotate(0)}}

/* Market stall: round-item slices standing in a row you buy from */
.market-stall{position:absolute;left:0;top:0;width:100%;height:100%;z-index:5}
.stall-item{position:absolute;top:30%;transform:translateX(-50%);width:18%;cursor:pointer;padding:0;background:none;border:none;
  display:flex;flex-direction:column;align-items:center;gap:4px;transition:transform .12s}
.stall-item .si-fx{width:100%;line-height:0}
.stall-item .si-fx .fx-svg{width:100%;height:auto;overflow:visible;filter:drop-shadow(0 8px 6px rgba(20,10,4,.5))}
.stall-item .si-name{font-family:var(--hand);font-size:clamp(.72rem,1.35vw,1rem);color:var(--ink);white-space:nowrap;
  background:var(--parch);border:2px solid var(--wood-edge);border-radius:8px;padding:0 7px;box-shadow:0 2px 0 var(--shadow)}
.stall-item .si-tags{display:flex;gap:5px;font-family:var(--hand);font-size:.86rem}
.stall-item .si-pack{background:#f3e6c8;border:2px solid var(--wood-edge);border-radius:7px;padding:0 6px;color:var(--wood)}
.stall-item .si-price{background:var(--gold);border:2px solid var(--ink);border-radius:7px;padding:0 6px;color:var(--ink);display:flex;align-items:center;gap:3px}
.stall-item .si-price .ic{width:.9em;height:.9em}
.stall-item:hover{transform:translateX(-50%) translateY(-9px)}
.stall-item:active{transform:translateX(-50%)}
.stall-item.wrong{animation:shake .4s}

/* Bought-slice confirmation panel */
.market-bought{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:6;width:min(74%,560px);text-align:center;
  background:rgba(20,10,4,.82);border:2.5px solid var(--wood-edge);border-radius:18px;padding:18px 24px 22px;box-shadow:0 8px 20px rgba(0,0,0,.5)}
.market-bought .mb-coil{width:30%;margin:0 auto 6px}
.market-bought .mb-coil .fx-svg{width:100%;height:auto}
.market-bought .focus-hint{color:#fff8ee}
.market-bought .focus-hint b{color:var(--gold)}

/* Splitting Room: the bought wedge lies on the drawn cutting board */
.board-spot{position:absolute;left:47%;top:58%;transform:translate(-50%,-50%);width:34%;z-index:5}
.board-spot .fx{width:100%}
.board-spot .fx-svg{width:100%;height:auto;overflow:visible;filter:drop-shadow(0 8px 6px rgba(20,10,4,.5))}
.board-spot .hangtag{right:2%;bottom:-6%}
.board-spot .fx-svg{transition:filter .15s}
.board-spot.wieldable:hover .fx-svg{filter:drop-shadow(0 0 10px rgba(255,240,150,.85)) drop-shadow(0 8px 6px rgba(20,10,4,.5))}
.board-spot.hit .fx-svg{animation:crystalShake .34s ease}

/* ==========================================================================
   Tier 4 — HUB market signpost + the Incantation finale
   ========================================================================== */

/* Big "out to the Market" arrow on the right edge of the HUB (kept clear of the
   Cutting Room's left door and the Brewing Room door). */
.market-arrow{position:absolute;z-index:9;background:none;border:none;padding:0;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;gap:2px;filter:drop-shadow(0 4px 6px rgba(20,10,4,.5));
  transition:transform .14s;animation:marketBob 2.4s ease-in-out infinite}
.market-arrow .arrow-svg{width:100%;height:auto}
.market-arrow:hover{transform:translateX(6px) scale(1.05)}
.market-arrow.got{animation:none}
.market-arrow.got .arrow-svg path{fill:#7fc98a}
.market-arrow-label{font-family:var(--hand);font-size:clamp(.7rem,1.3vw,1rem);color:var(--cream);white-space:nowrap;
  background:rgba(20,10,4,.6);border:2px solid var(--wood-edge);border-radius:12px;padding:1px 9px}
.market-arrow-label .ic{width:.95em;height:.95em;vertical-align:-.12em}
@keyframes marketBob{0%,100%{transform:translateX(0)}50%{transform:translateX(7px)}}

/* --- The Incantation scene ------------------------------------------------- */
.room-incant{width:100%;min-height:100dvh;display:flex;align-items:center;justify-content:center}
.incant-scene{--rune:#cbb0ff;--rune-deep:#8a6cff;--seal:#f2c94c;
  position:relative;width:100%;min-height:100dvh;display:flex;align-items:center;justify-content:center;overflow:hidden;
  background:radial-gradient(120% 90% at 50% 42%, #2a2350 0%, #1a1533 46%, #0c0a1c 100%)}
/* drifting star specks */
.incant-scene::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:.5;
  background-image:radial-gradient(1.5px 1.5px at 20% 30%,#fff,transparent),radial-gradient(1.5px 1.5px at 70% 20%,#cbb0ff,transparent),
    radial-gradient(1.5px 1.5px at 40% 70%,#fff,transparent),radial-gradient(2px 2px at 85% 60%,#a98cff,transparent),
    radial-gradient(1.5px 1.5px at 12% 80%,#fff,transparent),radial-gradient(1.5px 1.5px at 60% 85%,#cbb0ff,transparent)}
.spell-circle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:min(120vh,760px);max-width:112%;opacity:.5;pointer-events:none}
.rune-ring{width:100%;height:auto;animation:spin 60s linear infinite;filter:drop-shadow(0 0 14px rgba(138,108,255,.5))}
@keyframes spin{to{transform:rotate(360deg)}}

.incant-panel{position:relative;z-index:3;width:min(92%,720px);text-align:center;color:var(--cream);
  background:linear-gradient(180deg,rgba(30,24,64,.78),rgba(16,12,34,.86));border:2.5px solid var(--rune-deep);
  border-radius:22px;padding:22px 26px 26px;box-shadow:0 0 40px rgba(122,92,255,.35),inset 0 0 30px rgba(122,92,255,.12)}
.incant-steps{display:flex;gap:10px;justify-content:center;margin-bottom:8px}
.istep{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;font-family:var(--hand);font-size:1rem;
  color:var(--rune);border:2px solid var(--rune-deep);opacity:.5}
.istep.on{opacity:1;background:var(--rune-deep);color:#fff;box-shadow:0 0 14px rgba(138,108,255,.8)}
.istep.past{opacity:.85;background:rgba(122,92,255,.3);color:#fff}
.incant-title{font-family:var(--disp);font-size:clamp(1.2rem,3vw,1.7rem);color:#f0e6ff;margin:2px 0 4px;
  text-shadow:0 0 12px rgba(138,108,255,.6)}
.incant-hint{font-family:var(--hand);font-size:clamp(.92rem,2vw,1.1rem);color:#d7ccff;margin-top:14px;line-height:1.35}
.incant-hint b{color:var(--seal)}
.incant-stage{margin-top:12px}

/* stacked fraction rune */
.fr{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;line-height:1;vertical-align:middle;
  font-family:var(--hand);color:#f0e6ff}
.fr-n,.fr-d{font-size:1.5rem;font-weight:700;padding:0 .25em;min-width:1.1em;text-align:center}
.fr-bar{width:100%;min-width:1.5em;height:3px;background:currentColor;margin:3px 0;border-radius:2px}
.fr.orig{color:#bfb0e8}
.fr.bound{color:var(--seal);text-shadow:0 0 10px rgba(242,201,76,.5)}
.fr.big .fr-n,.fr.big .fr-d{font-size:2.2rem}
.fr.mini{color:var(--seal)}.fr.mini .fr-n,.fr.mini .fr-d{font-size:1.15rem}

/* Phase 1 — bind */
.spell-slots{display:flex;flex-direction:column;gap:10px;align-items:center}
.spell-slot{display:flex;align-items:center;gap:10px;padding:8px 16px;border-radius:14px;min-width:min(90%,420px);
  background:rgba(20,16,44,.6);border:2px solid rgba(138,108,255,.4);transition:border-color .2s,box-shadow .2s}
.spell-slot .ing-ic{width:30px;height:30px;flex:0 0 auto}
.spell-slot .ss-eq{font-size:1.5rem;color:#d7ccff;font-family:var(--hand)}
.spell-slot[data-drop]{border-style:dashed}
.spell-slot.socketed{border-color:var(--rune-deep);box-shadow:0 0 16px rgba(138,108,255,.4)}
.spell-slot.done{border-color:var(--seal);box-shadow:0 0 16px rgba(242,201,76,.35);background:rgba(60,44,14,.35)}
.rune-socket{width:34px;height:34px;border-radius:50%;border:2px dashed var(--rune);display:grid;place-items:center;
  color:var(--rune);font-family:var(--hand);font-size:1.3rem;animation:socketPulse 1.6s ease-in-out infinite}
.socket-d{font-size:1.3rem;color:#bfb0e8;font-family:var(--hand)}
@keyframes socketPulse{0%,100%{box-shadow:0 0 0 rgba(203,176,255,0)}50%{box-shadow:0 0 14px rgba(203,176,255,.6)}}
.rune-input{width:2.1em;font-family:var(--hand);font-size:1.5rem;font-weight:700;text-align:center;color:var(--seal);
  background:rgba(0,0,0,.35);border:2px solid var(--seal);border-radius:8px;padding:0;box-shadow:0 0 10px rgba(242,201,76,.4);-moz-appearance:textfield}
.rune-input::-webkit-outer-spin-button,.rune-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.rune-input.wrong,.sum-input.wrong{animation:shake .4s;border-color:#ff7a7a;color:#ff9a9a;box-shadow:0 0 10px rgba(255,90,90,.5)}
.cast-btn,.sum-btn{font-family:var(--hand);font-size:1rem;color:#1a1533;background:var(--seal);border:2px solid #b8901f;
  border-radius:10px;padding:2px 12px;cursor:pointer;box-shadow:0 2px 0 #b8901f}
.cast-btn .ic{width:.9em;height:.9em}
.cast-btn:hover,.sum-btn:hover{filter:brightness(1.08)}

/* the draggable common-measure rune */
.rune-tray{margin-top:16px;display:flex;flex-direction:column;justify-content:center;min-height:70px;align-items:center;gap:8px}
.rune-tray-label{font-family:var(--hand);font-size:.9rem;color:#c9b6ff;display:inline-flex;align-items:center;gap:5px}
.rune-tray-label .ic{width:1.1em;height:1.1em}
.rune-choices{display:flex;gap:14px;flex-wrap:wrap;justify-content:center}
.denom-rune.rune-reject{animation:runeReject .5s ease;border-color:#e2554f;box-shadow:0 0 22px rgba(226,85,79,.8)}
@keyframes runeReject{0%,100%{transform:none}20%{transform:translateX(-7px) rotate(-3deg)}60%{transform:translateX(7px) rotate(3deg)}}
/* Phase-3: the DENOMINATOR is the drag handle. Grabbing it spawns a x/x ghost
   that follows the pointer; drop it on the Wholes well to bank a whole. */
.fr-d.den-grab{cursor:grab;touch-action:none;border-radius:8px;padding:0 4px;color:var(--seal);
  box-shadow:0 0 0 2px var(--seal),0 0 16px rgba(242,201,76,.6);animation:denPulse 1.6s ease-in-out infinite}
.fr-d.den-grab:active{cursor:grabbing}
@keyframes denPulse{0%,100%{box-shadow:0 0 0 2px var(--seal),0 0 12px rgba(242,201,76,.45)}50%{box-shadow:0 0 0 2px var(--seal),0 0 22px rgba(242,201,76,.85)}}
.den-grab-hint{position:absolute;left:50%;top:100%;transform:translateX(-50%);margin-top:8px;white-space:nowrap;
  font-family:var(--hand);font-size:.8rem;color:#e7c765;opacity:.9}
.whole-drag-ghost{position:fixed;transform:translate(-50%,-50%);z-index:9999;pointer-events:none;
  display:inline-flex;align-items:center;gap:7px;padding:7px 13px;border-radius:14px;
  background:radial-gradient(120% 120% at 50% 30%,#3a2f6e,#241c48);border:2.5px solid var(--seal);
  box-shadow:0 0 26px rgba(242,201,76,.85)}
.whole-drag-ghost .fr{color:#f0e6ff}
.wt-eq{font-family:var(--disp);font-size:1.3rem;color:var(--seal)}
.wholes-well.awaiting{animation:wellAwait 1.8s ease-in-out infinite}
@keyframes wellAwait{0%,100%{border-color:var(--seal);box-shadow:inset 0 0 18px rgba(242,201,76,.15)}50%{border-color:#ffe08a;box-shadow:inset 0 0 22px rgba(242,201,76,.3),0 0 14px rgba(242,201,76,.35)}}
.wholes-well.drop-hot{border-style:solid;border-color:#ffe08a;box-shadow:inset 0 0 26px rgba(242,201,76,.45),0 0 20px rgba(242,201,76,.6);transform:scale(1.04)}
.denom-rune{display:inline-flex;flex-direction:column;align-items:center;gap:0;padding:8px 16px 6px;cursor:grab;touch-action:none;
  background:radial-gradient(120% 120% at 50% 30%,#3a2f6e,#241c48);border:2.5px solid var(--rune);border-radius:16px;
  color:var(--rune);box-shadow:0 0 20px rgba(138,108,255,.6);animation:runeFloat 2.4s ease-in-out infinite}
.denom-rune:active{cursor:grabbing}
.denom-rune.dragging{opacity:.95;box-shadow:0 0 30px rgba(203,176,255,.9)}
.dr-glyph{width:26px;height:30px;color:var(--rune)}
.dr-glyph .rune-glyph{width:100%;height:100%}
.dr-txt{font-family:var(--disp);font-size:1.7rem;color:#f0e6ff;text-shadow:0 0 10px rgba(203,176,255,.8);line-height:1}
.dr-hint{font-family:var(--hand);font-size:.72rem;color:#c9b6ff;opacity:.85}
.rune-note{font-family:var(--hand);color:var(--seal);font-size:1.05rem;text-shadow:0 0 10px rgba(242,201,76,.5)}
@keyframes runeFloat{0%,100%{transform:translateY(0)}50%{transform:translateY(-6px)}}

/* Phase 2 — gather */
.gather-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px}
.add-plus,.add-eq{font-family:var(--disp);font-size:1.6rem;color:#d7ccff}
.sum-input{width:2.4em;font-family:var(--hand);font-size:2rem;font-weight:700;text-align:center;color:var(--seal);
  background:rgba(0,0,0,.35);border:2px solid var(--seal);border-radius:10px;box-shadow:0 0 12px rgba(242,201,76,.4);-moz-appearance:textfield}
.sum-input::-webkit-outer-spin-button,.sum-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.sum-btn{font-size:1.05rem;padding:4px 16px;margin-left:6px}

/* Phase 3 — draw the wholes free */
.draw-stage{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:18px}
.wholes-well{min-width:130px;min-height:110px;border-radius:16px;padding:8px 12px;display:flex;flex-direction:column;align-items:center;gap:6px;
  background:rgba(20,16,44,.55);border:2.5px dashed var(--seal);box-shadow:inset 0 0 18px rgba(242,201,76,.15)}
.wholes-well.pop{animation:wellPop .4s ease}
@keyframes wellPop{0%{transform:scale(1)}40%{transform:scale(1.08)}100%{transform:scale(1)}}
.ww-label{font-family:var(--hand);font-size:.95rem;color:#e7c765;letter-spacing:.04em}
.ww-orbs{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;align-items:center}
.ww-empty{color:#6b5fa0;font-size:1.6rem}
.whole-orb{position:relative;width:56px;height:56px;border-radius:50%;display:grid;place-items:center;color:#1a1533;
  background:radial-gradient(circle at 38% 32%,#ffe9a6,var(--seal));border:2.5px solid #b8901f;box-shadow:0 0 14px rgba(242,201,76,.7);
  animation:orbIn .4s ease}
.whole-orb .rune-glyph{position:absolute;width:58%;height:58%;color:#8a6a12;opacity:.25}
.whole-orb b{position:relative;font-family:var(--disp);font-size:1.9rem;line-height:1;text-shadow:0 1px 0 rgba(255,255,255,.35)}
@keyframes orbIn{0%{transform:scale(0) rotate(-40deg);opacity:0}100%{transform:scale(1) rotate(0);opacity:1}}
.improper-frame{padding:10px 20px;border-radius:16px;background:rgba(20,16,44,.55);border:2.5px solid var(--rune-deep);
  box-shadow:0 0 20px rgba(138,108,255,.4)}
.improper-frame.settled{border-color:var(--seal);box-shadow:0 0 20px rgba(242,201,76,.4)}
.fr.improper{position:relative;color:#f0e6ff}
.pull-handle{position:absolute;left:50%;top:100%;transform:translateX(-50%);margin-top:6px;cursor:grab;touch-action:none;
  display:flex;flex-direction:column;align-items:center;gap:0;color:var(--rune);background:radial-gradient(120% 120% at 50% 30%,#3a2f6e,#241c48);
  border:2px solid var(--rune);border-radius:12px;padding:4px 10px;box-shadow:0 0 16px rgba(138,108,255,.6);animation:runeFloat 2s ease-in-out infinite;white-space:nowrap}
.pull-handle:active{cursor:grabbing}
.pull-handle .rune-glyph{width:20px;height:24px}
.ph-txt{font-family:var(--hand);font-size:.72rem;color:#c9b6ff}
.mixed-result{min-width:120px;opacity:0;transition:opacity .3s}
.mixed-result.show{opacity:1}
.mr-label{display:block;font-family:var(--hand);font-size:.85rem;color:#e7c765}
.mr-val{display:inline-flex;align-items:center;gap:6px;font-family:var(--disp);font-size:2.4rem;color:var(--seal);
  text-shadow:0 0 14px rgba(242,201,76,.6)}
.seal-btn{margin-top:18px;font-size:1.15rem;padding:8px 24px}
.incant-scene .exit-arrow{z-index:6}

/* the rune while it follows the pointer mid-drag */
.drag-rune{position:fixed;z-index:9999;pointer-events:none;transform:translate(-50%,-50%)}
