/* ============================================================
   CLAWD JUMP: ECHO TOWER — UI layer
   The canvas draws the world; every glyph you read is DOM.
   Palette: tidepool tier — dawn teal, coral crust, low sun.
   ============================================================ */

:root{
  /* ink */
  --ink:#050A12;
  --ink-2:#0A1420;
  --ink-3:#10202F;
  --line:rgba(127,227,214,.12);
  --line-2:rgba(255,255,255,.08);

  /* paper */
  --paper:#F3F6F4;
  --muted:#93A8B3;
  --muted-2:#5F7683;

  /* tidepool accents */
  --teal:#7FE3D6;
  --teal-hi:#CFFBF4;
  --teal-lo:#3F8C8C;
  --coral:#F28C6A;
  --coral-hi:#FFC7A8;
  --dawn:#F2B48A;
  --clawd:#E8825C;
  --clawd-lo:#B24A3B;
  --gold:#F4C95D;
  --gold-hi:#FFF0BE;
  --shard:#5BD8E0;
  --danger:#FF4D63;
  --danger-hi:#FF9AA6;
  --magenta:#FF5BC8;    /* world echo */
  --tide:#8FE6FF;

  /* type */
  --f-ui:"Outfit","Noto Sans KR",-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo","Malgun Gothic","Noto Sans CJK KR",system-ui,sans-serif;
  --f-kr:"Noto Sans KR","Outfit","Apple SD Gothic Neo","Malgun Gothic",system-ui,sans-serif;
  --f-num:"Outfit","Noto Sans KR",ui-monospace,"SF Mono",monospace;

  /* motion */
  --e-out:cubic-bezier(.16,1,.3,1);
  --e-in-out:cubic-bezier(.65,0,.35,1);
  --e-back:cubic-bezier(.34,1.56,.64,1);
  --t-screen:.42s;

  --pad:max(1.25rem,env(safe-area-inset-left));
  --pad-r:max(1.25rem,env(safe-area-inset-right));
  --radius:14px;
}

*,*::before,*::after{box-sizing:border-box}
/* class-level `display` outranks the UA [hidden] rule — make `hidden` win. */
[hidden]{display:none !important}
html,body{margin:0;height:100%;overflow:hidden;background:var(--ink)}
body{
  font-family:var(--f-ui);
  color:var(--paper);
  -webkit-font-smoothing:antialiased;
  -webkit-tap-highlight-color:transparent;
  touch-action:none;
  user-select:none;
  line-height:1.35;
}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer;text-align:left;padding:0}
h1,h2,h3,p,dl,dd{margin:0}
.mono{font-family:var(--f-num);font-variant-numeric:tabular-nums}
:lang(ko) h2,:lang(ko) h3,.menu__item,.card__title,.row__label,.daily__lead,.modal__lead{font-family:var(--f-kr)}
.noscript{color:var(--paper);padding:2rem;font:16px system-ui}

/* ---------- world stage ---------- */
#stage{position:fixed;inset:0;display:grid;place-items:center;background:var(--ink)}
#world{display:block;width:100%;height:100%}

/* ---------- UI shell ---------- */
#ui{position:fixed;inset:0;pointer-events:none;z-index:10;container-type:size}

.screen{position:absolute;inset:0;display:none;opacity:0;pointer-events:none}
.screen.is-active{display:flex;pointer-events:auto;opacity:1;animation:screenIn var(--t-screen) var(--e-out) both}
.screen.is-leaving{display:flex;pointer-events:none;animation:screenOut .26s var(--e-in-out) forwards}
@keyframes screenIn{from{opacity:0;transform:scale(1.012)}to{opacity:1;transform:none}}
@keyframes screenOut{from{opacity:1}to{opacity:0;transform:scale(.992)}}

/* play must never eat clicks except on its own controls (the touch pad lives beside the play section, same rule) */
.screen--play{pointer-events:none !important}
.screen--play.is-active{animation:none;opacity:1}
.screen--play button,.hud__touch button,.hud__touch .tpad{pointer-events:auto}

/* ============================================================
   BOOT
   ============================================================ */
.screen--boot{
  flex-direction:column;align-items:center;justify-content:center;gap:1.1rem;
  background:radial-gradient(120% 90% at 50% 42%,#0E2233 0%,var(--ink) 70%);
}
.boot__glyph{width:104px;height:104px;filter:drop-shadow(0 8px 30px rgba(127,227,214,.28))}
.boot__ring{transform-origin:60px 60px;animation:spin 1.1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.boot__label{font-weight:900;letter-spacing:.42em;font-size:.72rem;color:var(--muted);text-indent:.42em}
.boot__bar{width:min(240px,54vw);height:3px;border-radius:99px;background:rgba(255,255,255,.09);overflow:hidden}
.boot__bar i{display:block;height:100%;width:0%;border-radius:99px;
  background:linear-gradient(90deg,var(--teal),var(--coral));transition:width .3s var(--e-out)}
.boot__hint{font-size:.75rem;color:var(--muted-2);letter-spacing:.05em;min-height:1.2em}

/* ============================================================
   TITLE
   ============================================================ */
.screen--title{
  flex-direction:column;justify-content:center;
  padding:clamp(1.2rem,4vh,3rem) var(--pad);
  gap:clamp(.8rem,2.5vh,2rem);overflow:hidden;
  background:linear-gradient(105deg,rgba(5,10,18,.94) 0%,rgba(5,10,18,.74) 42%,rgba(5,10,18,.08) 78%);
}
.title__brand{max-width:52rem}
.title__kicker{font-size:.66rem;font-weight:700;letter-spacing:.34em;color:var(--teal);margin-bottom:.7rem;
  animation:fadeUp .7s .05s var(--e-out) both}
.title__logo{display:flex;flex-direction:column;line-height:.86;font-weight:900;letter-spacing:-.045em;
  font-size:clamp(2.8rem,min(11vw,14vh),8.6rem)}
.title__logo span{color:var(--paper);animation:fadeUp .8s .1s var(--e-out) both}
.title__logo em{
  font-style:normal;
  background:linear-gradient(96deg,var(--coral-hi),var(--coral) 34%,var(--dawn) 66%,var(--teal-hi));
  background-size:220% 100%;
  -webkit-background-clip:text;background-clip:text;color:transparent;
  animation:fadeUp .8s .18s var(--e-out) both, shimmer 8s 1s linear infinite;
}
@keyframes shimmer{to{background-position:220% 0}}
.title__sub{display:flex;align-items:baseline;gap:.9rem;margin-top:.7rem;flex-wrap:wrap;animation:fadeUp .8s .26s var(--e-out) both}
.title__sub b{font-size:clamp(.78rem,1.7vw,1rem);font-weight:800;letter-spacing:.48em;color:var(--teal)}
.title__sub i{font-style:normal;font-family:var(--f-kr);font-size:clamp(.78rem,1.6vw,.95rem);font-weight:500;
  letter-spacing:.14em;color:var(--muted)}
@keyframes fadeUp{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}

.title__foot{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:.76rem;color:var(--muted-2);
  animation:fadeUp .8s .5s var(--e-out) both}
.title__foot .sep{opacity:.5}
.title__legend{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.5rem}
.kbd{display:inline-block;padding:.16rem .44rem;border-radius:5px;background:rgba(255,255,255,.07);
  border:1px solid rgba(255,255,255,.12);font-size:.7rem;font-weight:600;color:#C9D6DC;box-shadow:0 1px 0 rgba(0,0,0,.5)}
.chip{display:inline-flex;align-items:center;gap:.3rem;padding:.24rem .7rem;border-radius:99px;
  background:rgba(127,227,214,.08);border:1px solid var(--line);font-size:.72rem;color:var(--muted);
  transition:background .18s,color .18s,border-color .18s}
.chip b{color:var(--paper);font-weight:600}
.chip:hover,.chip:focus-visible,.chip.is-cursor{outline:none;background:rgba(127,227,214,.16);color:#fff;border-color:rgba(127,227,214,.4)}
.chip--name{margin-left:auto}

/* ---------- PWA surfaces: offline badge · iOS hint · update bar ---------- */
.badge{display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .65rem;border-radius:99px;font-size:.66rem;font-weight:700;letter-spacing:.14em}
.badge--offline{color:var(--dawn);background:rgba(242,180,138,.1);border:1px solid rgba(242,180,138,.38)}
.badge--offline::before{content:"";width:.42rem;height:.42rem;border-radius:50%;background:currentColor;box-shadow:0 0 8px currentColor}
.title__ios{display:inline-flex;align-items:center;gap:.5rem;flex-basis:100%;font-family:var(--f-kr);font-size:.74rem;color:var(--muted)}
.title__ios-x{width:1.5rem;height:1.5rem;flex:0 0 auto;border-radius:50%;display:grid;place-items:center;font-size:1rem;line-height:1;text-align:center;
  color:var(--muted);background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);transition:background .18s,color .18s}
.title__ios-x:hover,.title__ios-x:focus-visible{outline:none;color:#fff;background:rgba(127,227,214,.18)}
.upbar{position:absolute;left:50%;bottom:calc(1rem + env(safe-area-inset-bottom));translate:-50% 0;z-index:15;pointer-events:auto;
  display:flex;align-items:center;gap:.9rem;padding:.45rem .5rem .45rem 1rem;border-radius:99px;
  background:rgba(16,32,47,.96);border:1px solid rgba(127,227,214,.35);box-shadow:0 18px 40px -18px rgba(0,0,0,.9);
  font-family:var(--f-kr);font-size:.82rem;color:var(--paper);white-space:nowrap;animation:fadeUp .5s var(--e-out) both}
.upbar__btn{padding:.35rem .9rem;border-radius:99px;font-family:var(--f-kr);font-size:.78rem;font-weight:700;text-align:center;color:var(--ink);
  background:var(--teal);transition:background .18s,transform .18s var(--e-back)}
.upbar__btn:hover,.upbar__btn:focus-visible{outline:none;background:var(--teal-hi);transform:scale(1.04)}

/* ---------- menu ---------- */
.menu{display:flex;flex-direction:column;gap:.15rem;max-width:24rem}
.menu__item{
  position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:.1rem;
  padding:.6rem .9rem .6rem 1.1rem;border-radius:11px;
  font-size:1.06rem;font-weight:600;letter-spacing:-.01em;color:#C6D3D8;
  transition:color .18s,background .18s,transform .28s var(--e-out);
  animation:fadeUp .6s var(--e-out) both;
}
.menu__item:nth-child(1){animation-delay:.28s}
.menu__item:nth-child(2){animation-delay:.34s}
.menu__item:nth-child(3){animation-delay:.40s}
.menu__item:nth-child(4){animation-delay:.46s}
.menu__item:nth-child(5){animation-delay:.52s}
.menu__item:nth-child(6){animation-delay:.58s}
.menu__item:nth-child(7){animation-delay:.64s}
.menu__item small{font-size:.72rem;font-weight:400;color:var(--muted-2);letter-spacing:0}
.menu__item::before{content:"";position:absolute;left:0;top:50%;translate:0 -50%;width:3px;height:0;border-radius:99px;
  background:var(--teal);transition:height .3s var(--e-back)}
.menu__item:hover,.menu__item:focus-visible,.menu__item.is-cursor{
  outline:none;color:#fff;background:rgba(127,227,214,.07);transform:translateX(6px)}
.menu__item:hover::before,.menu__item:focus-visible::before,.menu__item.is-cursor::before{height:60%}
.menu__item:hover small,.menu__item.is-cursor small{color:#9FB6BF}
.menu__item[disabled]{opacity:.32;cursor:not-allowed;transform:none}
.menu__item--primary{color:var(--teal-hi)}
.menu__item--primary::before{background:var(--coral)}
.menu--compact .menu__item{padding:.55rem .8rem .55rem 1rem;font-size:.95rem;animation:none}

/* ============================================================
   PAGES (select · daily)
   ============================================================ */
.screen--page{flex-direction:column;gap:1rem;padding:clamp(1.2rem,4vh,2.2rem) var(--pad-r) clamp(1rem,3vh,1.6rem) var(--pad);
  background:linear-gradient(180deg,rgba(5,10,18,.96),rgba(5,10,18,.84));overflow:hidden}
.pg__head{display:flex;align-items:center;gap:1rem}
.pg__title{flex:1 1 auto;min-width:0}
.pg__head h2{font-size:clamp(1.3rem,3.4vw,2rem);font-weight:800;letter-spacing:-.02em}
.pg__head p{font-size:.78rem;color:var(--muted-2);margin-top:.15rem}
.icon-btn{width:2.4rem;height:2.4rem;flex:0 0 auto;border-radius:50%;text-align:center;display:grid;place-items:center;
  font-size:1.5rem;line-height:1;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.1);
  transition:background .18s,transform .18s var(--e-back)}
.icon-btn--sm{width:1.9rem;height:1.9rem;font-size:1rem}
.icon-btn:hover,.icon-btn:focus-visible,.icon-btn.is-cursor{background:rgba(127,227,214,.18);transform:scale(1.07);outline:none}

/* echo toggles (select + daily) */
.echo-toggles{display:flex;gap:.4rem;flex-wrap:wrap}
.echo{display:inline-flex;align-items:center;gap:.45rem;padding:.3rem .75rem .3rem .55rem;border-radius:99px;
  font-size:.74rem;font-weight:600;color:var(--muted);background:rgba(255,255,255,.05);border:1px solid var(--line-2);
  transition:background .18s,color .18s,border-color .18s}
.echo::before{content:"";width:.6rem;height:.6rem;border-radius:50%;background:currentColor;opacity:.35;transition:opacity .18s,box-shadow .18s}
.echo[aria-checked="true"]{color:#fff;border-color:rgba(255,255,255,.18)}
.echo[aria-checked="true"]::before{opacity:1;box-shadow:0 0 10px var(--echo-c)}
.echo--self{--echo-c:var(--teal)}
.echo--world{--echo-c:var(--magenta)}
.echo[aria-checked="true"]::before{background:var(--echo-c)}
.echo:hover,.echo:focus-visible,.echo.is-cursor{outline:none;background:rgba(255,255,255,.1)}

/* ---------- the tower ---------- */
.tower{display:flex;flex-direction:column;gap:.9rem;overflow-y:auto;padding:.2rem 0 1rem;scrollbar-width:thin}
.tier{display:grid;grid-template-columns:3.2rem 1fr;gap:.9rem;align-items:stretch}
.tier__spine{position:relative;display:flex;flex-direction:column;align-items:center;gap:.3rem;padding-top:.2rem}
.tier__spine::before{content:"";position:absolute;top:2.4rem;bottom:-1rem;width:2px;left:50%;translate:-50% 0;
  background:linear-gradient(180deg,var(--tier-c),transparent);opacity:.35}
.tier:last-child .tier__spine::before{display:none}
.tier__num{width:2.2rem;height:2.2rem;border-radius:50%;display:grid;place-items:center;font-weight:900;font-size:.9rem;
  color:var(--ink);background:var(--tier-c);box-shadow:0 0 18px -4px var(--tier-c)}
.tier__floor{font-size:.6rem;font-weight:700;letter-spacing:.2em;color:var(--muted-2)}
.tier__body{min-width:0}
.tier__name{display:flex;align-items:baseline;gap:.6rem;margin-bottom:.45rem;font-size:.7rem;font-weight:700;letter-spacing:.26em}
.tier__name span{color:var(--tier-c)}
.tier__name b{font-family:var(--f-kr);font-size:1.02rem;letter-spacing:-.01em;font-weight:800}
.tier__name small{margin-left:auto;font-weight:500;letter-spacing:0;font-size:.7rem;color:var(--muted-2)}
.tier__cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.8rem;max-width:58rem}

.card{
  position:relative;text-align:left;aspect-ratio:16/9;border-radius:var(--radius);overflow:hidden;
  border:1px solid rgba(255,255,255,.09);background:var(--ink-2);isolation:isolate;
  transition:transform .35s var(--e-out),box-shadow .35s var(--e-out),border-color .25s;
}
.card__sky{position:absolute;inset:0;z-index:0;background:
  radial-gradient(60% 50% at 70% 32%,color-mix(in srgb,var(--tier-c) 45%,transparent) 0%,transparent 60%),
  linear-gradient(180deg,var(--tier-a) 0%,var(--tier-b) 100%);opacity:.85;transition:opacity .35s,transform 3s var(--e-out)}
.card__ridge{position:absolute;left:-4%;right:-4%;bottom:0;height:46%;z-index:0;
  background:var(--tier-d);clip-path:polygon(0 100%,0 62%,12% 44%,24% 58%,38% 30%,52% 52%,64% 38%,78% 60%,90% 42%,100% 55%,100% 100%);opacity:.9}
.card::after{content:"";position:absolute;inset:0;z-index:1;
  background:linear-gradient(to top,rgba(5,10,18,.95) 0%,rgba(5,10,18,.45) 46%,rgba(5,10,18,0) 78%)}
.card:hover,.card:focus-visible,.card.is-cursor{outline:none;transform:translateY(-5px);border-color:rgba(127,227,214,.35);
  box-shadow:0 22px 44px -18px rgba(0,0,0,.9),0 0 0 1px rgba(127,227,214,.15)}
.card:hover .card__sky,.card.is-cursor .card__sky{opacity:1;transform:scale(1.05)}
.card__body{position:absolute;z-index:2;left:0;right:0;bottom:0;padding:.85rem .9rem}
.card__idx{font-size:.62rem;font-weight:700;letter-spacing:.22em;color:var(--tier-c)}
.card__title{font-size:1rem;font-weight:700;margin:.15rem 0 .35rem}
.card__meta{display:flex;gap:.55rem;font-size:.68rem;color:var(--muted);font-variant-numeric:tabular-nums}
.card__meta span{display:inline-flex;align-items:center;gap:.3em}
.card__meta .shards::before{content:"";width:.5em;height:.5em;background:var(--shard);rotate:45deg;border-radius:1px}
.card__meta .relic{color:var(--gold)}
.card__meta .relic::before{content:"";width:.55em;height:.55em;border-radius:50%;background:var(--gold);box-shadow:0 0 6px var(--gold)}
.card__stars{position:absolute;z-index:2;top:.7rem;right:.75rem;display:flex;gap:.18rem}
.star{width:.7rem;height:.7rem;opacity:.22}
.star.on{opacity:1;filter:drop-shadow(0 0 6px rgba(244,201,93,.8))}
.card__lock{position:absolute;inset:0;z-index:3;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.4rem;
  background:rgba(5,10,18,.74);backdrop-filter:blur(3px) saturate(.4);font-size:.64rem;font-weight:700;letter-spacing:.2em;color:#7F94A0}
.card__lock svg{width:1.5rem;height:1.5rem;opacity:.75}
.card[disabled]{cursor:not-allowed}
.card[disabled]:hover{transform:none;box-shadow:none;border-color:rgba(255,255,255,.09)}
/* a zone this clear just opened: the card breathes teal once as the select screen comes up */
.card.is-unlocking{animation:cardUnlock 1.6s .25s var(--e-out) both;border-color:rgba(127,227,214,.55)}
.card.is-unlocking .card__sky{animation:cardUnlockSky 1.6s .25s var(--e-out) both}
@keyframes cardUnlock{0%{box-shadow:0 0 0 0 rgba(127,227,214,.0);filter:saturate(.3) brightness(.7)}
  25%{box-shadow:0 0 0 6px rgba(127,227,214,.35),0 22px 44px -18px rgba(0,0,0,.9);filter:saturate(1.2) brightness(1.25)}
  100%{box-shadow:0 0 0 0 rgba(127,227,214,0);filter:none}}
@keyframes cardUnlockSky{0%{opacity:.35;transform:scale(1.08)}100%{opacity:.85;transform:none}}

/* ---------- daily ---------- */
.daily{display:grid;grid-template-columns:minmax(16rem,22rem) minmax(0,1fr);gap:1.2rem;flex:1 1 auto;min-height:0}
.daily__card{display:flex;flex-direction:column;gap:.9rem;padding:1.2rem 1.25rem;border-radius:18px;
  background:linear-gradient(170deg,rgba(16,32,47,.9),rgba(10,20,32,.95));border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06);align-self:start}
.daily__kicker{font-size:.62rem;font-weight:800;letter-spacing:.34em;color:var(--teal)}
.daily__stats{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem}
.daily__stats dt{font-size:.62rem;font-weight:700;letter-spacing:.14em;color:var(--muted-2);text-transform:uppercase}
.daily__stats dd{font-size:1.02rem;font-weight:600;color:var(--paper);margin-top:.15rem;letter-spacing:.02em;overflow-wrap:anywhere}
.daily__lead{font-size:.8rem;line-height:1.6;color:var(--muted)}
/* 7-day strip + streak badge + yesterday's tower */
.daily__streak{display:flex;flex-direction:column;gap:.45rem}
.daily__streak-head{display:flex;justify-content:space-between;align-items:center;gap:.6rem;font-size:.74rem;color:var(--muted);
  font-family:var(--f-kr);font-variant-numeric:tabular-nums}
.daily__badge{font-size:.6rem;font-weight:800;letter-spacing:.14em;padding:.2rem .55rem;border-radius:99px;white-space:nowrap;
  color:var(--teal-hi);background:rgba(127,227,214,.12);border:1px solid rgba(127,227,214,.35)}
.daily__badge--final{color:var(--gold-hi);background:rgba(244,201,93,.12);border-color:rgba(244,201,93,.4)}
.daily__week{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:.3rem}
.daily__day{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.1rem;min-height:2.9rem;padding:.3rem .1rem;
  border-radius:10px;background:rgba(255,255,255,.04);border:1px solid var(--line-2);font-variant-numeric:tabular-nums;overflow:hidden}
.daily__day small{font-size:.58rem;font-weight:700;letter-spacing:.04em;color:var(--muted-2)}
.daily__day b{font-size:.78rem;font-weight:700;color:var(--muted-2);font-family:var(--f-num);white-space:nowrap}
.daily__day.is-tried{border-color:rgba(143,230,255,.35);background:rgba(143,230,255,.08)}
.daily__day.is-tried b{color:var(--tide)}
.daily__day.is-cleared{border-color:rgba(127,227,214,.45);background:rgba(127,227,214,.12)}
.daily__day.is-cleared b{color:var(--teal-hi)}
.daily__day.is-today{box-shadow:0 0 0 2px rgba(242,180,138,.6)}
.daily__day.is-today small{color:var(--dawn)}
.daily__yday{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem;font-size:.76rem;color:var(--muted);font-family:var(--f-kr);
  font-variant-numeric:tabular-nums}
.daily__yday b{color:var(--paper);font-weight:700}
.daily__board{display:flex;flex-direction:column;gap:.6rem;min-height:0;min-width:0}
.board__head{display:flex;align-items:center;gap:.7rem}
.board__head h3{font-size:.7rem;font-weight:800;letter-spacing:.3em;color:var(--coral)}
.board__status{flex:1 1 auto;font-size:.72rem;color:var(--muted-2)}

/* ---------- leaderboard ---------- */
.lb{overflow:auto;min-height:0;scrollbar-width:thin}
.lb__you{display:flex;justify-content:space-between;gap:.6rem;font-size:.74rem;color:var(--muted);margin:0 0 .35rem;
  font-variant-numeric:tabular-nums}
.lb__you b{color:var(--teal-hi);font-weight:700}
.lb__table{width:100%;border-collapse:collapse;font-size:.84rem;font-variant-numeric:tabular-nums}
.lb__table th{font-size:.62rem;font-weight:700;letter-spacing:.18em;color:var(--muted-2);text-align:left;padding:.35rem .5rem;
  border-bottom:1px solid var(--line-2)}
.lb__table td{padding:.45rem .5rem;border-bottom:1px solid rgba(255,255,255,.045);white-space:nowrap}
.lb__rank{width:2.6rem;color:var(--muted);font-family:var(--f-num);font-weight:600}
.lb__name{font-family:var(--f-kr);font-weight:500;max-width:11rem;overflow:hidden;text-overflow:ellipsis}
.lb__time{font-family:var(--f-num);font-weight:600;text-align:right}
.lb__shards{text-align:right;color:var(--shard)}
.lb__shards::before{content:"";display:inline-block;width:.5em;height:.5em;margin-right:.45em;background:var(--shard);rotate:45deg;border-radius:1px;vertical-align:0}
th.lb__shards::before{display:none}
.lb__row:nth-child(1) .lb__rank{color:var(--gold)}
.lb__row:nth-child(2) .lb__rank{color:#D8E3E8}
.lb__row:nth-child(3) .lb__rank{color:var(--coral)}
.lb__row.is-you{background:linear-gradient(90deg,rgba(127,227,214,.16),rgba(127,227,214,.04));
  box-shadow:inset 3px 0 0 var(--teal)}
.lb__row.is-you .lb__name{color:var(--teal-hi)}
.lb__row.is-you .lb__name::after{content:"내 순위";margin-left:.5rem;font-size:.6rem;font-weight:800;letter-spacing:.14em;color:var(--teal)}
.lb__tide{color:var(--tide)}
.lb__gap td{text-align:center;color:var(--muted-2);padding:.15rem;font-size:.7rem;letter-spacing:.3em}
.lb__note{padding:1.2rem .5rem;font-size:.82rem;color:var(--muted);text-align:center}
.lb__note--err{color:var(--danger-hi)}
.lb--compact .lb__table{font-size:.78rem}
.lb--compact{max-height:8.4rem;margin-bottom:.8rem}

/* ============================================================
   PLAY (HUD)
   ============================================================ */
.screen--play{padding:calc(.85rem + env(safe-area-inset-top)) var(--pad-r) 0 var(--pad)}
.hud__top{position:absolute;left:var(--pad);right:var(--pad-r);top:calc(.85rem + env(safe-area-inset-top));
  display:flex;justify-content:space-between;align-items:flex-start;gap:1rem}
.hud__left{display:flex;flex-direction:column;gap:.45rem;align-items:flex-start}
.hud__right{display:flex;flex-direction:column;gap:.2rem;align-items:flex-end}
.hud__chips{display:flex;gap:.4rem;flex-wrap:wrap}

.hud__hearts{display:flex;gap:.24rem}
.heart{width:1rem;height:1rem;background:var(--coral);
  clip-path:path("M8 14.5S1 10.2 1 5.7A4.2 4.2 0 0 1 8 3a4.2 4.2 0 0 1 7 2.7c0 4.5-7 8.8-7 8.8z");
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.6));transition:opacity .2s,transform .3s var(--e-back),background .2s}
.heart.off{background:#2B3B47;opacity:.7;transform:scale(.82)}
.heart.pulse{animation:heartPulse .5s var(--e-back)}
@keyframes heartPulse{0%{transform:scale(1)}35%{transform:scale(1.45)}100%{transform:scale(1)}}

.hud__chip{display:flex;align-items:center;gap:.35rem;padding:.22rem .55rem .22rem .4rem;border-radius:99px;
  background:rgba(5,10,18,.55);border:1px solid rgba(255,255,255,.09);backdrop-filter:blur(8px);
  font-size:.82rem;font-weight:700;font-variant-numeric:tabular-nums}
.hud__chip em{font-style:normal;font-weight:500;font-size:.7rem;color:var(--muted)}
.hud__chip i{width:.62rem;height:.62rem;border-radius:2px;rotate:45deg;display:block}
.hud__chip--shard i{background:var(--shard);box-shadow:0 0 9px var(--shard)}
.hud__chip--relic i{background:var(--gold);box-shadow:0 0 9px var(--gold);border-radius:50%;rotate:0deg}
.hud__chip--combo{color:var(--teal-hi);border-color:rgba(127,227,214,.35)}
.hud__chip--assist{font-size:.7rem;letter-spacing:.14em;color:var(--dawn);padding:.22rem .55rem}
.hud__chip.bump{animation:chipBump .34s var(--e-back)}
@keyframes chipBump{0%{transform:scale(1)}40%{transform:scale(1.16)}100%{transform:scale(1)}}

.hud__timer{font-family:var(--f-num);font-size:1.5rem;font-weight:600;letter-spacing:-.02em;font-variant-numeric:tabular-nums;
  text-shadow:0 2px 12px rgba(0,0,0,.8)}
/* phone rule: no HUD text under 11 px (.7rem = 11.2 px at the 16 px root) */
.hud__level{font-size:.7rem;font-weight:700;letter-spacing:.2em;color:var(--muted)}
/* checkpoint split against the echo (P2-4): behind = danger, ahead = teal, even / not reached = muted */
.hud__split{margin:.1rem 0 .15rem;padding:.16rem .62rem;border-radius:99px;font-family:var(--f-num);font-size:.98rem;font-weight:700;
  font-variant-numeric:tabular-nums;color:var(--muted);background:rgba(5,10,18,.55);border:1px solid rgba(255,255,255,.12);
  backdrop-filter:blur(8px);text-shadow:0 1px 8px rgba(0,0,0,.7)}
.hud__split.is-ahead{color:var(--teal-hi);border-color:rgba(127,227,214,.45);background:rgba(127,227,214,.14)}
.hud__split.is-behind{color:var(--danger-hi);border-color:rgba(255,77,99,.45);background:rgba(255,77,99,.14)}
.hud__split.bump{animation:chipBump .34s var(--e-back)}
.hud__height{display:flex;align-items:baseline;gap:.35rem;margin-top:.3rem;padding:.2rem .6rem;border-radius:8px;
  background:rgba(143,230,255,.1);border:1px solid rgba(143,230,255,.3);color:var(--tide);
  font-family:var(--f-num);font-size:1.05rem;font-weight:700;font-variant-numeric:tabular-nums}
.hud__height em{font-style:normal;font-size:.7rem;font-weight:600;letter-spacing:.14em;color:var(--muted)}

.hud__dash{position:absolute;left:var(--pad);bottom:calc(1rem + env(safe-area-inset-bottom));width:5.2rem;height:3px;border-radius:99px;
  background:rgba(255,255,255,.1);overflow:hidden;opacity:0;transition:opacity .25s}
.hud__dash.show{opacity:1}
.hud__dash i{display:block;height:100%;width:100%;border-radius:99px;background:var(--teal);box-shadow:0 0 10px var(--teal);
  transform-origin:left;transform:scaleX(1);transition:transform .22s var(--e-out)}
.hud__dash i.is-empty{transform:scaleX(.08);transition:none;background:var(--muted-2);box-shadow:none}

.hud__hint{position:absolute;left:50%;bottom:calc(3.4rem + env(safe-area-inset-bottom));translate:-50% 0;max-width:min(34rem,86vw);
  padding:.5rem .95rem;border-radius:99px;background:rgba(5,10,18,.62);border:1px solid var(--line);backdrop-filter:blur(8px);
  font-family:var(--f-kr);font-size:.84rem;color:#D3DEE2;text-align:center;animation:fadeUp .5s var(--e-out) both}
.hud__toast{position:absolute;left:50%;top:22%;translate:-50% 0;font-family:var(--f-kr);font-size:1rem;font-weight:700;letter-spacing:.02em;
  text-align:center;opacity:0;text-shadow:0 2px 14px rgba(0,0,0,.8)}
.hud__toast.show{animation:toast 1.8s var(--e-out) forwards}
@keyframes toast{0%{opacity:0;transform:translateY(10px) scale(.94)}14%{opacity:1;transform:none}76%{opacity:1}100%{opacity:0;transform:translateY(-8px)}}
.hud__banner{position:absolute;left:0;right:0;top:38%;text-align:center;font-family:var(--f-kr);font-size:clamp(1.6rem,5vw,3rem);
  font-weight:900;letter-spacing:-.03em;opacity:0;text-shadow:0 4px 30px rgba(0,0,0,.8)}
.hud__banner.show{animation:banner 2.1s var(--e-out) forwards}
@keyframes banner{0%{opacity:0;letter-spacing:.3em;filter:blur(10px)}18%{opacity:1;letter-spacing:-.03em;filter:blur(0)}70%{opacity:1}100%{opacity:0;filter:blur(6px)}}
.hud__pause{position:absolute;right:var(--pad-r);bottom:calc(1rem + env(safe-area-inset-bottom));width:2.3rem;height:2.3rem;
  border-radius:50%;display:flex;align-items:center;justify-content:center;gap:3px;color:#D3DEE2;
  background:rgba(5,10,18,.62);border:1px solid rgba(255,255,255,.16);backdrop-filter:blur(8px);
  transition:color .2s,background .2s,transform .2s var(--e-back)}
.hud__pause:hover{color:#fff;background:rgba(127,227,214,.2);transform:scale(1.08)}
.hud__pause::before,.hud__pause::after{content:"";width:3px;height:11px;border-radius:1px;background:currentColor}
/* touch mode: keep the pause button, the dash meter and the hint clear of the pad and buttons;
   every tappable HUD control is at least 44 px a side (2.75rem) */
#ui.is-touch .hud__pause{bottom:auto;right:auto;left:50%;translate:-50% 0;top:calc(.85rem + env(safe-area-inset-top));
  width:max(44px,2.75rem);height:max(44px,2.75rem)}
#ui.is-touch .hud__dash{bottom:calc(9.2rem + env(safe-area-inset-bottom))}
/* mute chip (P3-7): right of the pause button, touch layouts only (the UI keeps it hidden elsewhere) */
.hud__mute{position:absolute;top:calc(.85rem + env(safe-area-inset-top));left:calc(50% + 1.375rem + .6rem);width:max(44px,2.75rem);height:max(44px,2.75rem);
  border-radius:50%;display:flex;align-items:center;justify-content:center;color:#D3DEE2;
  background:rgba(5,10,18,.62);border:1px solid rgba(255,255,255,.16);backdrop-filter:blur(8px);transition:color .2s,background .2s,transform .2s var(--e-back)}
.hud__mute svg{width:1.3rem;height:1.3rem}
.hud__mute .hud__mute-x{display:none}
.hud__mute.is-muted{color:var(--dawn);border-color:rgba(242,180,138,.45)}
.hud__mute.is-muted .hud__mute-wave{display:none}
.hud__mute.is-muted .hud__mute-x{display:block}
.hud__mute:hover,.hud__mute:active{color:#fff;background:rgba(127,227,214,.2)}
/* touch: the pads own the bottom of the screen, so the hint is a plate right under the HUD top row */
#ui.is-touch .hud__hint{top:calc(4.4rem + env(safe-area-inset-top));bottom:auto;max-width:64vw;font-size:.78rem;padding:.4rem .8rem;
  border-radius:12px;line-height:1.35}
.icon-btn svg{width:1rem;height:1rem}

/* touch controls (P3-7 layout: the UI writes --tscale / --topacity / --tleft-* / --tright-* on #hud-touch;
   every hit box stays >= 44 px a side at any scale, labels never drop under 11 px) */
.hud__touch{position:absolute;inset:auto 0 0 0;height:44%;display:flex;justify-content:space-between;align-items:flex-end;
  padding:0 var(--pad-r) calc(1.1rem + env(safe-area-inset-bottom)) var(--pad);touch-action:none;pointer-events:none}
/* the stick's home (and, floating, its catch area): + x toward the centre, + y up */
.tzone{position:relative;display:flex;align-items:flex-end;translate:var(--tleft-x,0px) calc(-1 * var(--tleft-y,0px))}
.tpad{position:relative;width:max(44px,calc(7.5rem * var(--tscale,1)));height:max(44px,calc(7.5rem * var(--tscale,1)));border-radius:50%;touch-action:none;
  background:radial-gradient(circle,rgba(255,255,255,.08),rgba(255,255,255,.03));border:1px solid rgba(255,255,255,.12)}
.tpad i{position:absolute;left:50%;top:50%;translate:-50% -50%;width:calc(2.9rem * var(--tscale,1));height:calc(2.9rem * var(--tscale,1));border-radius:50%;
  background:rgba(232,130,92,.55);border:1px solid rgba(255,255,255,.25);transition:translate .05s linear}
.tpad.is-active i{background:rgba(232,130,92,.8);transition:none}
/* floating stick: the left half of the touch area takes the first touch, the pad rests at its usual corner in between */
.hud__touch.is-floating .tzone{position:absolute;left:0;top:0;bottom:0;width:50%;pointer-events:auto;translate:none}
.hud__touch.is-floating .tpad{position:absolute;left:calc(var(--pad) + var(--tleft-x,0px));bottom:calc(1.1rem + env(safe-area-inset-bottom) + var(--tleft-y,0px))}
.hud__touch.is-floating .tpad.is-floated{bottom:auto}
/* the settings editor previews the pad over any screen: lifted above the modals, never tappable */
.hud__touch.is-preview{z-index:12;pointer-events:none}
.hud__touch.is-preview .tpad,.hud__touch.is-preview button{pointer-events:none}
/* buttons sit 12px above the pad line and stay translucent at rest so the world (and its foes) reads through them */
.tbtns{display:flex;gap:calc(.7rem * var(--tscale,1));align-items:flex-end;translate:calc(-1 * var(--tright-x,0px)) calc(-12px - var(--tright-y,0px))}
.tbtn{width:max(44px,calc(4.4rem * var(--tscale,1)));height:max(44px,calc(4.4rem * var(--tscale,1)));border-radius:50%;
  font-size:max(11px,calc(.66rem * var(--tscale,1)));font-weight:800;letter-spacing:.1em;text-align:center;touch-action:none;
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.14);opacity:var(--topacity,.35);transition:transform .08s,filter .08s,opacity .08s}
.tbtn--jump{width:max(44px,calc(5.4rem * var(--tscale,1)));height:max(44px,calc(5.4rem * var(--tscale,1)));background:rgba(232,130,92,.24);border-color:rgba(232,130,92,.5)}
.tbtn--dash{background:rgba(127,227,214,.16);border-color:rgba(127,227,214,.45)}
.tbtn:active,.tbtn.is-down{transform:scale(.93);filter:brightness(1.4);opacity:.9}

/* ============================================================
   MODALS
   ============================================================ */
.screen--modal{align-items:center;justify-content:center;padding:var(--pad);background:rgba(3,7,12,.72);backdrop-filter:blur(14px) saturate(.85)}
.modal{width:min(26rem,100%);max-height:92vh;overflow-y:auto;padding:1.5rem 1.5rem 1.1rem;border-radius:20px;
  background:linear-gradient(170deg,rgba(16,32,47,.96),rgba(8,16,26,.97));border:1px solid var(--line);
  box-shadow:0 40px 90px -30px rgba(0,0,0,.95),inset 0 1px 0 rgba(255,255,255,.06);
  animation:modalIn .4s var(--e-out) both;scrollbar-width:thin}
.modal--wide{width:min(34rem,100%)}
.modal--text{font-size:.86rem;line-height:1.7;color:#B9C7CE}
.modal--over{border-color:rgba(143,230,255,.25)}
@keyframes modalIn{from{opacity:0;transform:translateY(18px) scale(.97)}to{opacity:1;transform:none}}
.modal__kicker{font-size:.6rem;font-weight:800;letter-spacing:.34em;color:var(--teal);margin-bottom:.35rem}
.modal h2{font-size:1.35rem;font-weight:800;letter-spacing:-.02em;margin-bottom:.9rem}
.modal__lead{font-size:.82rem;color:var(--muted);margin:-.4rem 0 1rem;line-height:1.6}
.modal__stats{display:flex;gap:1.2rem;margin-bottom:1rem;font-size:.78rem;color:var(--muted)}
.modal__stats b{display:block;font-size:1.1rem;color:var(--paper);font-family:var(--f-num);font-variant-numeric:tabular-nums}
/* pause: per-checkpoint-segment deaths and bests (P2-4) */
.modal__segs{display:flex;flex-direction:column;gap:.12rem;margin:-.4rem 0 1rem;font-size:.76rem;font-family:var(--f-kr)}
.modal__segs:empty{display:none}
.segrow{display:grid;grid-template-columns:4.4rem 1fr auto;gap:.6rem;align-items:baseline;padding:.24rem .5rem;border-radius:8px;color:var(--muted)}
.segrow.is-current{background:rgba(127,227,214,.08);color:var(--paper)}
.segrow span{font-weight:700;letter-spacing:.04em}
.segrow em{font-style:normal}
.segrow em.is-hot{color:var(--danger-hi)}
.segrow b{font-family:var(--f-num);font-variant-numeric:tabular-nums;font-weight:600;color:var(--paper)}
.segrow b.is-none{color:var(--muted-2);font-weight:500}

/* results */
.res__rank{float:right;margin:-.3rem 0 .3rem .8rem;width:3.6rem;height:3.6rem;border-radius:18px;display:grid;place-items:center;
  font-size:2rem;font-weight:900;letter-spacing:-.04em;background:linear-gradient(150deg,var(--coral-hi),var(--clawd-lo));
  color:#1A0E0A;box-shadow:0 12px 30px -10px rgba(232,130,92,.7);animation:rankIn .6s .1s var(--e-back) both}
.res__rank[data-rank="S"]{background:linear-gradient(150deg,var(--gold-hi),var(--gold));box-shadow:0 12px 34px -8px rgba(244,201,93,.8)}
.res__rank[data-rank="A"]{background:linear-gradient(150deg,var(--teal-hi),var(--teal));box-shadow:0 12px 30px -10px rgba(127,227,214,.7);color:#08262A}
.res__rank[data-rank="B"],.res__rank[data-rank="C"]{background:linear-gradient(150deg,#C9D6DC,#7F94A0);color:#0F1A22;box-shadow:none}
@keyframes rankIn{from{opacity:0;transform:scale(.4) rotate(-14deg)}to{opacity:1;transform:none}}
/* the letter itself pops a beat after the tile lands (replayed by showResult) */
.res__rank.pop{animation:rankIn .6s .1s var(--e-back) both,rankPop .55s .55s var(--e-back) both}
@keyframes rankPop{0%{transform:none}40%{transform:scale(1.22) rotate(4deg)}100%{transform:none}}
.res__unlock{display:flex;align-items:center;gap:.6rem;margin:-.2rem 0 .8rem;padding:.5rem .8rem;border-radius:10px;font-size:.8rem;
  font-family:var(--f-kr);color:var(--teal-hi);background:rgba(127,227,214,.1);border:1px solid rgba(127,227,214,.35);
  animation:fadeUp .5s .3s var(--e-out) both}
.res__unlock::before{content:"";width:.55rem;height:.55rem;border-radius:50%;background:var(--teal);box-shadow:0 0 10px var(--teal);flex:0 0 auto}
.res__unlock b{color:#fff;font-weight:700}
/* "라이벌보다 0.62s 빠름 / 느림" (P2-4) — the magenta dot ties it to the world echo */
.res__vs{display:flex;align-items:center;gap:.6rem;margin:-.2rem 0 .8rem;padding:.45rem .8rem;border-radius:10px;font-size:.8rem;
  font-family:var(--f-kr);color:var(--muted);background:rgba(255,255,255,.05);border:1px solid var(--line-2);animation:fadeUp .5s .35s var(--e-out) both}
.res__vs::before{content:"";width:.55rem;height:.55rem;border-radius:50%;background:var(--magenta);box-shadow:0 0 10px var(--magenta);flex:0 0 auto}
.res__vs b{font-family:var(--f-num);font-variant-numeric:tabular-nums;font-weight:700;color:var(--paper)}
.res__vs.is-ahead{color:var(--teal-hi);background:rgba(127,227,214,.1);border-color:rgba(127,227,214,.35)}
.res__vs.is-ahead b{color:#fff}
.res__vs.is-behind{color:#F3C9E4;background:rgba(255,91,200,.08);border-color:rgba(255,91,200,.3)}
.res__rows{display:flex;flex-direction:column;gap:.05rem;margin:.4rem 0 1rem;clear:both}
.res__row{display:flex;justify-content:space-between;align-items:baseline;gap:1rem;padding:.34rem .1rem;
  border-bottom:1px solid rgba(255,255,255,.055);font-size:.86rem}
.res__row span{color:var(--muted);font-family:var(--f-kr)}
.res__row b{font-family:var(--f-num);font-variant-numeric:tabular-nums;font-weight:600}
.res__row.best b{color:var(--gold)}
.res__row.best span{color:var(--gold-hi)}
.res__stars{display:flex;gap:.5rem;margin-bottom:.8rem}
.res__stars .star{width:1.4rem;height:1.4rem}
.res__stars .star.on{animation:starPop .5s var(--e-back) both}
.res__stars .star:nth-child(2).on{animation-delay:.12s}
.res__stars .star:nth-child(3).on{animation-delay:.24s}
@keyframes starPop{from{opacity:0;transform:scale(.2) rotate(-40deg)}to{opacity:1;transform:none}}

/* game over: progress toward the personal best (--pct set by the UI, 0..1) */
.over__bar{margin:-.5rem 0 1rem;font-size:.74rem;color:var(--muted);font-family:var(--f-kr);font-variant-numeric:tabular-nums}
.over__bar i{display:block;position:relative;height:.45rem;border-radius:99px;background:rgba(255,255,255,.08);overflow:hidden;margin-bottom:.4rem}
.over__bar i::after{content:"";position:absolute;inset:0;width:calc(var(--pct,0) * 100%);border-radius:99px;
  background:linear-gradient(90deg,var(--tide),var(--teal));transition:width .9s .2s var(--e-out)}
.over__bar.is-best{color:var(--gold-hi)}
.over__bar.is-best i::after{background:linear-gradient(90deg,var(--gold),var(--gold-hi));box-shadow:0 0 12px rgba(244,201,93,.6)}

/* inline name prompt (result / game-over, before the first eligible submission) */
.name-inline{margin:0 0 .8rem;padding:.8rem .9rem;border-radius:12px;background:rgba(127,227,214,.06);border:1px solid rgba(127,227,214,.28);
  animation:fadeUp .4s var(--e-out) both}
.name-inline__lead{font-size:.78rem;line-height:1.55;color:var(--muted);font-family:var(--f-kr);margin-bottom:.55rem}
.name-inline__lead b{color:var(--paper);font-weight:600}
.name-inline .name{margin-bottom:.45rem}
.name-inline .name__input{font-size:1rem;padding:.55rem .8rem}
.name-inline__btns{display:flex;gap:.5rem;flex-wrap:wrap}
.chip--primary{color:var(--teal-hi);border-color:rgba(127,227,214,.5);background:rgba(127,227,214,.14)}

/* submission state */
.submit{display:flex;align-items:center;gap:.6rem;margin:0 0 .7rem;padding:.55rem .8rem;border-radius:10px;font-size:.8rem;
  background:rgba(255,255,255,.05);border:1px solid var(--line-2);color:var(--muted)}
.submit::before{content:"";width:.55rem;height:.55rem;border-radius:50%;background:currentColor;flex:0 0 auto}
.submit b{color:var(--paper);font-weight:700}
.submit--pending{color:var(--teal)}
.submit--pending::before{animation:pulse 1s infinite}
.submit--accepted{color:var(--teal);background:rgba(127,227,214,.1);border-color:rgba(127,227,214,.35)}
.submit--accepted b{color:var(--teal-hi);font-family:var(--f-num);font-size:1rem}
.submit--rejected{color:var(--danger-hi);background:rgba(255,77,99,.09);border-color:rgba(255,77,99,.3)}
.submit--offline{color:var(--muted-2)}
.submit--queued{color:var(--dawn);background:rgba(242,180,138,.08);border-color:rgba(242,180,138,.3)}
@keyframes pulse{50%{opacity:.45}}

/* name entry */
.name{display:flex;align-items:center;gap:.7rem;margin-bottom:.5rem}
.name__input{flex:1 1 auto;min-width:0;padding:.7rem .9rem;border-radius:11px;font:inherit;font-family:var(--f-kr);font-size:1.15rem;
  font-weight:600;color:var(--paper);background:rgba(255,255,255,.06);border:1px solid var(--line);outline:none;
  user-select:text;-webkit-user-select:text;transition:border-color .18s,background .18s}
.name__input:focus{border-color:rgba(127,227,214,.6);background:rgba(127,227,214,.08)}
.name__count{font-size:.72rem;color:var(--muted-2);flex:0 0 auto}
.name__err{margin:0 0 .9rem;padding:.5rem .7rem;border-radius:9px;font-size:.78rem;color:var(--danger-hi);
  background:rgba(255,77,99,.09);border:1px solid rgba(255,77,99,.28)}

/* settings */
.tabs{display:flex;gap:.2rem;margin-bottom:1rem;padding:.2rem;border-radius:11px;background:rgba(0,0,0,.3)}
.tab{flex:1;padding:.45rem .3rem;border-radius:8px;font-size:.76rem;font-weight:600;color:var(--muted);text-align:center;
  transition:background .2s,color .2s}
.tab.is-active{background:rgba(127,227,214,.14);color:#fff}
.tab.is-cursor,.tab:focus-visible{outline:none;box-shadow:inset 0 0 0 1px rgba(127,227,214,.5)}
.pane{display:none;flex-direction:column;gap:.15rem;margin-bottom:1rem}
.pane.is-active{display:flex}
.row{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem .1rem;border-bottom:1px solid rgba(255,255,255,.05)}
.row__label{font-size:.86rem;font-weight:500}
.row__label small{display:block;font-size:.68rem;color:var(--muted-2);font-weight:400;margin-top:.1rem}
.row__ctl{flex:0 0 auto;display:flex;align-items:center;gap:.5rem}
.switch{width:2.6rem;height:1.4rem;border-radius:99px;background:#22333F;position:relative;transition:background .22s}
.switch::after{content:"";position:absolute;top:.17rem;left:.17rem;width:1.06rem;height:1.06rem;border-radius:50%;background:#fff;
  transition:transform .24s var(--e-back)}
.switch[aria-checked="true"]{background:var(--teal-lo)}
.switch[aria-checked="true"]::after{transform:translateX(1.2rem)}
.switch.is-cursor,.switch:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(127,227,214,.3)}
input[type=range]{-webkit-appearance:none;appearance:none;width:7.5rem;height:3px;border-radius:99px;background:rgba(255,255,255,.16);outline:none}
input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:.95rem;height:.95rem;border-radius:50%;background:var(--teal);
  box-shadow:0 0 0 4px rgba(127,227,214,.18);cursor:pointer;transition:transform .18s var(--e-back)}
input[type=range]::-webkit-slider-thumb:hover{transform:scale(1.18)}
input[type=range]::-moz-range-thumb{width:.95rem;height:.95rem;border:0;border-radius:50%;background:var(--teal);cursor:pointer}
input[type=range].is-cursor,input[type=range]:focus-visible{box-shadow:0 0 0 3px rgba(127,227,214,.25)}
.row__val{font-family:var(--f-num);font-size:.76rem;color:var(--muted);width:2.6rem;text-align:right;font-variant-numeric:tabular-nums}
.seg{display:flex;gap:.15rem;padding:.15rem;border-radius:9px;background:rgba(0,0,0,.32)}
.seg button{padding:.28rem .58rem;border-radius:6px;font-size:.74rem;font-weight:600;color:var(--muted);text-align:center;transition:background .18s,color .18s}
.seg button.on{background:rgba(127,227,214,.16);color:#fff}
.seg button.is-cursor,.seg button:focus-visible{outline:none;box-shadow:inset 0 0 0 1px rgba(127,227,214,.5)}
.row--skins{flex-direction:column;align-items:stretch;gap:.65rem}
.row--skins .row__label small{font-size:max(.68rem,11px);line-height:1.5}
.row--skins .row__ctl{display:block;flex:0 1 auto;min-width:0}
.seg--skins{display:grid;grid-template-columns:repeat(auto-fit,minmax(4.5rem,1fr));gap:.35rem;width:100%;min-width:0}
.seg--skins button{display:flex;flex-direction:column;align-items:center;gap:.2rem;padding:.35rem .5rem;min-width:0;font-size:max(.74rem,11px);white-space:normal}
.seg--skins .seg__hint{font-size:max(.6rem,11px);line-height:1.35}
.seg--skins canvas{width:2.2rem;height:2.2rem;border-radius:8px;background:rgba(255,255,255,.04)}
.bindbtn{min-width:5.4rem;padding:.3rem .55rem;border-radius:8px;font-size:.74rem;font-weight:600;text-align:center;
  background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);font-family:var(--f-num);transition:background .18s,color .18s}
.bindbtn.is-cursor,.bindbtn:focus-visible{outline:none;border-color:rgba(127,227,214,.6);background:rgba(127,227,214,.12)}
.bindbtn.listening{background:var(--coral);color:#1A0E0A;animation:pulse 1s infinite}
.bindbtn--clash{background:rgba(255,77,99,.25);border-color:rgba(255,77,99,.6);color:var(--danger-hi)}
.bindbtn--armed{background:rgba(255,77,99,.2);border-color:rgba(255,77,99,.55);color:var(--danger-hi)}
.row__note{font-size:.7rem;color:var(--muted-2);padding:.4rem .1rem 0;line-height:1.5}

/* progress transfer (설정 → 데이터 → 다른 기기로 옮기기) */
.transfer{display:flex;gap:1rem;align-items:center;padding:.6rem .1rem .7rem;border-bottom:1px solid rgba(255,255,255,.05)}
.transfer__qr{width:7rem;height:7rem;flex:0 0 auto;border-radius:10px;background:#F3F6F4;image-rendering:pixelated}
.transfer__side{display:flex;flex-direction:column;align-items:flex-start;gap:.4rem;min-width:0}
.transfer__code{font-family:var(--f-num);font-size:1.9rem;font-weight:700;letter-spacing:.14em;line-height:1.1;color:var(--teal-hi);
  font-variant-numeric:tabular-nums;user-select:all;-webkit-user-select:all}
.transfer__note{font-size:.68rem;color:var(--muted-2);font-family:var(--f-kr)}
.transfer__import{gap:.4rem}
.transfer__input{width:7.6rem;padding:.3rem .5rem;border-radius:8px;border:1px solid rgba(255,255,255,.14);background:rgba(0,0,0,.3);color:var(--paper);
  font:inherit;font-family:var(--f-num);font-size:.9rem;letter-spacing:.12em;text-transform:uppercase;user-select:text;-webkit-user-select:text;
  transition:border-color .18s,background .18s}
.transfer__input:focus{outline:none;border-color:rgba(127,227,214,.6);background:rgba(127,227,214,.08)}
.transfer__status{font-family:var(--f-kr);color:var(--muted)}
.transfer__status.is-error{color:var(--danger-hi)}
.transfer__status.is-ok{color:var(--teal-hi)}
@media (max-width:560px){.transfer{flex-direction:column;align-items:flex-start}}

/* credits */
.credits h3{font-size:.68rem;letter-spacing:.24em;color:var(--teal);margin:1.1rem 0 .35rem;font-weight:700}
.credits h3:first-child{margin-top:0}
.credits ul{margin:0;padding-left:1.1rem}
.credits li{margin:.16rem 0;font-family:var(--f-kr)}
.credits code{font-family:var(--f-num);font-size:.82em;color:var(--teal-hi);background:rgba(127,227,214,.09);padding:.05rem .3rem;border-radius:4px}
.credits .build{margin-top:1rem;font-size:.68rem;color:var(--muted-2);font-family:var(--f-num)}

/* ---------- data notice (#scr-data) ---------- */
.data h3{font-size:.68rem;letter-spacing:.24em;color:var(--teal);margin:1.1rem 0 .35rem;font-weight:700}
.data h3:first-child{margin-top:0}
.data ul{margin:0;padding-left:1.1rem}
.data li{margin:.16rem 0;font-family:var(--f-kr)}
.data__runs{list-style:none;padding-left:0;font-family:var(--f-num);font-size:.78rem;color:var(--muted)}
.data__runs li{display:flex;justify-content:space-between;gap:1rem;padding:.2rem 0;border-bottom:1px solid var(--line-2)}
.data__runs li:last-child{border-bottom:0}
.data__runs b{color:var(--paper);font-weight:500;user-select:all}
.data__runs .data__none{color:var(--muted-2);font-family:var(--f-kr)}
/* the server runs a newer sim than this bundle: the update bar turns urgent */
.upbar--urgent{border-color:rgba(242,140,106,.7);box-shadow:0 0 0 1px rgba(242,140,106,.35),0 18px 40px -18px rgba(0,0,0,.9)}
.upbar--urgent .upbar__btn{background:var(--coral)}
.upbar--urgent .upbar__btn:hover,.upbar--urgent .upbar__btn:focus-visible{background:var(--coral-hi)}

.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ---------- install card (P3-4): result modal, story clears, hidden for good after 3 나중에 ---------- */
.install{display:flex;align-items:center;justify-content:space-between;gap:.8rem;margin:0 0 .8rem;padding:.6rem .8rem;border-radius:12px;
  border:1px solid rgba(127,227,214,.3);background:linear-gradient(120deg,rgba(127,227,214,.12),rgba(242,140,106,.08));font-size:.8rem;color:var(--paper)}
.install__body{display:flex;flex-direction:column;gap:.15rem;min-width:0}
.install__body b{font-size:.86rem;font-weight:700;color:#fff}
.install__body span{font-family:var(--f-kr);font-size:.74rem;color:var(--muted)}
.install__acts{display:flex;gap:.4rem;flex:0 0 auto}
.install__btn{min-height:2.2rem;padding:.4rem .85rem;border-radius:99px;font-family:var(--f-kr);font-size:.78rem;font-weight:700;text-align:center;
  color:var(--paper);background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.14);transition:background .18s,color .18s,transform .18s}
.install__btn--ok{color:var(--ink);background:var(--teal);border-color:transparent}
.install__btn:hover,.install__btn:focus-visible,.install__btn.is-cursor{outline:none;color:var(--ink);background:var(--teal-hi);transform:scale(1.04)}
.install[data-variant="ios"] .install__btn--ok{display:none}

/* ---------- portrait prompt ---------- */
.nag{position:absolute;inset:0;z-index:20;display:grid;place-items:center;background:rgba(3,7,12,.94);pointer-events:auto;
  font-size:1rem;font-weight:600;text-align:center;padding:2rem}
.nag__body{display:flex;flex-direction:column;align-items:center;gap:.6rem;color:var(--paper)}
.nag__body small{font-size:.76rem;color:var(--muted-2);font-weight:400}
.nag__icon{width:3.2rem;height:3.2rem;color:var(--teal);animation:tilt 2.4s var(--e-in-out) infinite}
/* "그래도 계속": dismisses the prompt for the session. Dismissed = hidden = display:none, so it never eats taps. */
.nag__skip{margin-top:1rem;padding:.55rem 1.3rem;border-radius:99px;font-family:var(--f-kr);font-size:.82rem;font-weight:600;
  color:var(--teal-hi);border:1px solid rgba(127,227,214,.4);background:rgba(127,227,214,.1);text-align:center}
.nag__skip:hover,.nag__skip:focus-visible{outline:none;background:rgba(127,227,214,.2);color:#fff}
.nag[hidden]{pointer-events:none}
@keyframes tilt{0%,100%{transform:rotate(0)}50%{transform:rotate(-90deg)}}

/* ============================================================
   CEREMONIES (P3-9) — clear reveal stages · 층 돌파 vista card · ending
   ============================================================ */
/* title: the one-line story hook after the ending */
.title__hook{margin-top:.7rem;font-family:var(--f-kr);font-size:.8rem;color:var(--teal-hi);opacity:.9;letter-spacing:.01em;animation:fadeUp .6s .55s var(--e-out) both}
.title__hook::before{content:"";display:inline-block;width:.45rem;height:.45rem;margin-right:.5rem;border-radius:50%;background:var(--teal);box-shadow:0 0 10px var(--teal);vertical-align:middle}

/* medals row on the result modal (LevelRecord.medals) */
.res__medals{display:flex;flex-wrap:wrap;gap:.4rem;margin:-.3rem 0 .8rem}
.medal{display:inline-flex;align-items:center;gap:.4rem;padding:.28rem .7rem;border-radius:99px;font-family:var(--f-kr);font-size:.74rem;font-weight:700;
  color:var(--gold-hi);background:rgba(244,201,93,.12);border:1px solid rgba(244,201,93,.42)}
.medal::before{content:"";width:.5rem;height:.5rem;border-radius:50%;background:var(--gold);box-shadow:0 0 8px rgba(244,201,93,.8)}
.medal--nodeath{color:var(--teal-hi);background:rgba(127,227,214,.1);border-color:rgba(127,227,214,.4)}
.medal--nodeath::before{background:var(--teal);box-shadow:0 0 8px var(--teal)}
.medal--relic{color:#F3C9E4;background:rgba(255,91,200,.08);border-color:rgba(255,91,200,.35)}
.medal--relic::before{background:var(--magenta);box-shadow:0 0 8px var(--magenta)}
@keyframes medalIn{from{opacity:0;transform:translateY(8px) scale(.7)}to{opacity:1;transform:none}}

/* ---------- P3-6: zone medals · rank · world rank · skin locks · hot combo ---------- */
/* a medal this clear just earned: a brighter ring, a NEW tag, and a pop on top of the landing */
.medal{--medal-c:var(--gold-hi)}
.medal--nodeath{--medal-c:var(--teal-hi)}
.medal--relic{--medal-c:#F3C9E4}
.medal.is-new{box-shadow:0 0 0 1px rgba(255,255,255,.25),0 0 18px -4px var(--medal-c)}
.medal.is-new::after{content:"NEW";font-family:var(--f-ui);font-size:.56rem;font-weight:900;letter-spacing:.14em;color:var(--ink);
  padding:.08rem .34rem;border-radius:99px;background:var(--medal-c);line-height:1.2}
@keyframes medalPop{0%{transform:scale(1)}30%{transform:scale(1.18) rotate(-2deg)}60%{transform:scale(.96)}100%{transform:scale(1)}}
#scr-result .modal:is([data-stage="medals"],[data-stage="board"],[data-stage="done"]) .res__medals .medal.is-new{
  animation:medalIn .5s var(--e-back) both,medalPop .9s .55s var(--e-out) both}
/* select header: "별 N/36 · 메달 N/48" */
.pg__totals{font-family:var(--f-kr);color:var(--muted);font-variant-numeric:tabular-nums}
/* card top-left: the best rank letter and the four medal slots (earned / empty) */
.card__top{position:absolute;z-index:2;top:.6rem;left:.75rem;display:flex;align-items:center;gap:.4rem}
.card__rank{display:grid;place-items:center;width:1.25rem;height:1.25rem;border-radius:6px;font-family:var(--f-num);font-size:.72rem;font-weight:900;
  color:var(--ink);background:var(--muted);box-shadow:0 2px 8px rgba(0,0,0,.5)}
.card__rank[data-rank="S"]{background:var(--gold);box-shadow:0 0 12px -2px var(--gold)}
.card__rank[data-rank="A"]{background:var(--teal);box-shadow:0 0 12px -2px var(--teal)}
.card__rank[data-rank="B"]{background:var(--paper)}
.card__medals{display:flex;gap:.22rem}
.cmedal{display:block;width:.58rem;height:.58rem;border-radius:50%;border:1px solid rgba(255,255,255,.22);background:rgba(255,255,255,.05);
  box-shadow:inset 0 0 0 1px rgba(5,10,18,.4)}
.cmedal.is-on{border-color:transparent}
.cmedal--nodeath.is-on{background:var(--teal);box-shadow:0 0 7px var(--teal)}
.cmedal--par.is-on{background:var(--gold);box-shadow:0 0 7px var(--gold)}
.cmedal--shards.is-on{background:var(--shard);box-shadow:0 0 7px var(--shard)}
.cmedal--relic.is-on{background:var(--magenta);box-shadow:0 0 7px var(--magenta)}
/* the world rank of the submitted best, bottom-right of the card */
.card__world{position:absolute;z-index:2;right:.75rem;bottom:.85rem;padding:.14rem .5rem;border-radius:99px;font-family:var(--f-kr);font-size:.64rem;font-weight:700;
  color:var(--teal-hi);background:rgba(5,10,18,.6);border:1px solid rgba(127,227,214,.35);font-variant-numeric:tabular-nums;white-space:nowrap}
/* settings: a locked skin is shown greyed with its unlock hint and refuses the click */
.seg button.is-locked{opacity:.5;cursor:not-allowed}
.seg button.is-locked canvas{filter:grayscale(1) brightness(.7)}
.seg button.is-locked.on{background:transparent}
.seg__hint{display:block;font-family:var(--f-kr);font-size:.6rem;font-weight:500;letter-spacing:0;color:var(--muted-2)}
/* HUD combo chip at 8+: hot. (The reduced-motion block at the end of this file stills the medal pop through its global .01ms rule.) */
.hud__chip--combo.is-hot{color:var(--gold-hi);border-color:rgba(244,201,93,.6);background:rgba(244,201,93,.16);text-shadow:0 0 10px rgba(244,201,93,.7)}

/* the clear ceremony: the result modal carries data-stage = rank → stars → medals → board → done (ui.ts + ceremony.ts).
   Blocks of a later stage stay invisible and untappable until their stage, then fade up; the stars pop when theirs comes. */
#scr-result .modal[data-stage="rank"] :is(.res__stars,.res__medals,.res__vs,.res__unlock,.name-inline,.submit,.lb,.install,.menu),
#scr-result .modal[data-stage="stars"] :is(.res__medals,.res__vs,.res__unlock,.name-inline,.submit,.lb,.install,.menu),
#scr-result .modal[data-stage="medals"] :is(.name-inline,.submit,.lb,.install,.menu){opacity:0;pointer-events:none;animation:none}
#scr-result .modal[data-stage="rank"] .res__stars .star.on{animation:none}
#scr-result .modal:is([data-stage="medals"],[data-stage="board"],[data-stage="done"]) .res__medals .medal{animation:medalIn .5s var(--e-back) both}
#scr-result .modal:is([data-stage="medals"],[data-stage="board"],[data-stage="done"]) .res__medals .medal:nth-child(2){animation-delay:.1s}
#scr-result .modal:is([data-stage="medals"],[data-stage="board"],[data-stage="done"]) .res__medals .medal:nth-child(3){animation-delay:.2s}
#scr-result .modal:is([data-stage="medals"],[data-stage="board"],[data-stage="done"]) .res__medals .medal:nth-child(4){animation-delay:.3s}
#scr-result .modal:is([data-stage="board"],[data-stage="done"]) :is(.name-inline,.submit,.lb,.install,.menu){animation:fadeUp .45s var(--e-out) both}

/* full-screen ceremony surfaces sit before the modals in the DOM, so a pause or the credits stack above them */
.screen--ceremony{flex-direction:column;align-items:center;justify-content:center;padding:var(--pad);text-align:center;pointer-events:auto}

/* 층 돌파 vista card: the completed tier's biome gradient (--tier-a/b/d, accent --tier-c set by the UI), the numeral,
   the title, one Korean line, the next tier; data-stage = in → line → next → out → done */
.screen--tier{background:linear-gradient(165deg,var(--tier-a,#101B2E),var(--tier-b,#3F8C8C) 58%,var(--tier-d,#2B5A66));cursor:pointer}
.screen--tier.is-active{animation:tierIn .5s var(--e-out) both}
.screen--tier.is-active:is([data-stage="out"],[data-stage="done"]){animation:tierOut .45s var(--e-in-out) forwards}
@keyframes tierIn{from{opacity:0}to{opacity:1}}
@keyframes tierOut{to{opacity:0}}
.tier-card{display:flex;flex-direction:column;align-items:center;gap:.3rem;max-width:34rem}
.tier-card__kicker{font-size:.62rem;font-weight:800;letter-spacing:.38em;color:var(--tier-c,var(--teal));animation:fadeUp .5s .1s var(--e-out) both}
.tier-card__num{font-size:clamp(4rem,16vh,7.5rem);font-weight:900;line-height:1;letter-spacing:-.05em;color:#fff;
  text-shadow:0 0 40px var(--tier-c,var(--teal)),0 10px 30px rgba(0,0,0,.6);animation:rankIn .6s .05s var(--e-back) both}
.tier-card__title{font-family:var(--f-kr);font-size:clamp(1.2rem,4vw,1.8rem);font-weight:800;letter-spacing:-.02em;color:var(--paper);margin:0;animation:fadeUp .5s .25s var(--e-out) both}
.tier-card__title b{color:var(--tier-c,var(--teal))}
.tier-card__line{font-family:var(--f-kr);font-size:clamp(.9rem,2.4vw,1.1rem);color:#E6EEF2;margin-top:.6rem;opacity:0}
.tier-card__next{font-family:var(--f-kr);font-size:.82rem;color:var(--muted);letter-spacing:.04em;opacity:0}
.screen--tier:is([data-stage="line"],[data-stage="next"],[data-stage="out"],[data-stage="done"]) .tier-card__line{animation:fadeUp .6s var(--e-out) both}
.screen--tier:is([data-stage="next"],[data-stage="out"],[data-stage="done"]) .tier-card__next{animation:fadeUp .6s var(--e-out) both}
.tier-card__skip{position:absolute;bottom:calc(1.2rem + env(safe-area-inset-bottom));font-family:var(--f-kr);font-size:.72rem;color:rgba(243,246,244,.55)}

/* ending: the sky canvas fills the screen, the card scrolls if it must; data-stage = sky → title → line1..3 → totals → done */
.screen--ending{background:#04060F;cursor:default}
.ending__sky{position:absolute;inset:0;width:100%;height:100%}
.ending{position:relative;display:flex;flex-direction:column;align-items:center;gap:.25rem;width:min(34rem,100%);max-height:100%;overflow-y:auto;
  padding:.6rem .5rem;text-align:center;scrollbar-width:thin}
.ending__kicker{font-size:.6rem;font-weight:800;letter-spacing:.36em;color:var(--teal);opacity:0}
.ending__title{font-family:var(--f-kr);font-size:clamp(1.5rem,4.5vw,2.2rem);font-weight:900;letter-spacing:-.03em;color:#fff;margin:0;text-shadow:0 0 30px rgba(127,227,214,.5);opacity:0}
.ending__lines{display:flex;flex-direction:column;gap:.3rem;margin:.45rem 0 .7rem;font-family:var(--f-kr);font-size:clamp(.84rem,2vw,.96rem);line-height:1.55;color:#DCE7EC;
  text-shadow:0 1px 8px rgba(2,3,10,.9)}
.ending__lines p{opacity:0}
.ending__totals{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:.35rem .5rem;width:100%;margin:0 0 .6rem;opacity:0}
.ending__totals div{display:flex;flex-direction:column;align-items:center;gap:.05rem;padding:.35rem .3rem;border-radius:12px;background:rgba(5,10,18,.6);border:1px solid var(--line-2);min-width:0}
.ending__totals dt{font-family:var(--f-kr);font-size:.64rem;color:var(--muted);letter-spacing:.03em;white-space:nowrap}
.ending__totals dd{font-family:var(--f-num);font-variant-numeric:tabular-nums;font-size:.98rem;font-weight:700;color:var(--paper)}
.ending .submit{margin-bottom:.5rem}
.ending .submit,.ending .lb,.ending__menu{opacity:0;pointer-events:none}
.ending__menu{width:min(22rem,100%);gap:0}
@media (max-width:640px){.ending__totals{grid-template-columns:repeat(3,minmax(0,1fr))}}
/* short viewports: the menu's subtitles go so all four entries fit under the totals without scrolling */
@media (max-height:600px){.ending__menu .menu__item small{display:none}.ending__menu .menu__item{padding-top:.3rem;padding-bottom:.3rem}}
.ending:is([data-stage="title"],[data-stage="line1"],[data-stage="line2"],[data-stage="line3"],[data-stage="totals"],[data-stage="done"]) :is(.ending__kicker,.ending__title){animation:fadeUp .7s var(--e-out) both}
.ending:is([data-stage="line1"],[data-stage="line2"],[data-stage="line3"],[data-stage="totals"],[data-stage="done"]) .ending__lines p:nth-child(1){animation:fadeUp .8s var(--e-out) both}
.ending:is([data-stage="line2"],[data-stage="line3"],[data-stage="totals"],[data-stage="done"]) .ending__lines p:nth-child(2){animation:fadeUp .8s var(--e-out) both}
.ending:is([data-stage="line3"],[data-stage="totals"],[data-stage="done"]) .ending__lines p:nth-child(3){animation:fadeUp .8s var(--e-out) both}
.ending:is([data-stage="totals"],[data-stage="done"]) .ending__totals{animation:fadeUp .6s var(--e-out) both}
.ending[data-stage="done"] :is(.submit,.lb,.ending__menu){opacity:1;pointer-events:auto;animation:fadeUp .5s var(--e-out) both}

/* ============================================================
   RESPONSIVE / MOTION
   ============================================================ */
@media (max-width:820px){
  .daily{grid-template-columns:1fr}
  .daily__card{align-self:auto}
  .tier__cards{grid-template-columns:repeat(3,minmax(0,1fr));gap:.5rem}
  .card__meta{display:none}
  .card__top{top:.5rem;left:.6rem;gap:.3rem}
  .card__rank{width:1.05rem;height:1.05rem;font-size:.62rem}
  .cmedal{width:.5rem;height:.5rem}
  .card__world{right:.6rem;bottom:.6rem;font-size:.6rem;padding:.08rem .4rem}
}
@media (max-width:640px){
  .title__foot .kbd,.title__foot .sep{display:none}
  .menu__item small{display:none}
  .hud__timer{font-size:1.15rem}
  .tier{grid-template-columns:2.4rem 1fr;gap:.6rem}
  .tier__num{width:1.8rem;height:1.8rem;font-size:.74rem}
  .card__title{font-size:.84rem}
  .lb__name{max-width:7rem}
}
/* touch devices never need the keyboard legend */
#ui.is-touch .title__legend{display:none}
/*
 * Phones in landscape (iPhone 14: 750x340 · Galaxy S9+: 658x320). The brand and
 * the menu sit side by side, the kicker and the menu subtitles go, the logo is
 * sized by the viewport height, and the screen scrolls as a last resort.
 * (A media query on purpose: the old container query never matched the shell.)
 */
@media (max-height:430px){
  .screen--title{
    flex-direction:row;flex-wrap:wrap;align-items:center;align-content:center;justify-content:flex-start;
    gap:.35rem clamp(1.5rem,5vw,3.5rem);padding:.6rem var(--pad-r) .5rem var(--pad);
    overflow-y:auto;overflow-x:hidden;touch-action:pan-y;
  }
  .title__brand{flex:0 1 auto;max-width:48vw}
  .title__kicker{display:none}
  .title__logo{font-size:clamp(1.9rem,17vh,3.6rem)}
  .title__sub{margin-top:.35rem;gap:.6rem}
  .title__sub b{font-size:.66rem;letter-spacing:.34em}
  .title__sub i{font-size:.66rem}
  #title-menu{flex:0 0 auto;gap:0;max-width:17rem}
  .title__foot{flex-basis:100%;gap:.35rem .5rem;font-size:.7rem}
  .menu__item{padding:.28rem .8rem .28rem 1rem;font-size:.92rem;gap:0}
  .menu__item small{display:none}
  .menu__item::before{height:0}
  .modal{max-height:96vh;padding:1rem 1.1rem .8rem}
  .modal h2{margin-bottom:.5rem}
  .screen--page{padding-top:.6rem;padding-bottom:.5rem;gap:.5rem}
  /* ceremonies (P3-9) fit a landscape phone: a smaller numeral, a tighter ending card */
  .tier-card__num{font-size:clamp(2.6rem,22vh,4.5rem)}
  .tier-card__line{margin-top:.2rem}
  .ending{gap:.15rem;padding:.4rem .5rem}
  .ending__title{font-size:1.3rem}
  .ending__lines{margin:.25rem 0 .4rem;gap:.15rem;font-size:.78rem}
  .ending__totals{gap:.25rem .5rem;margin-bottom:.4rem}
  .ending__totals div{padding:.25rem .4rem}
}
/* phones held upright: the world is 16:9, the pad would cover it */
@media (orientation:portrait) and (max-width:600px){
  .screen--page{padding-left:1rem;padding-right:1rem}
}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.01ms !important;
    scroll-behavior:auto !important;
  }
  .title__logo em{background-position:0 0}
  .boot__ring{animation:none}
  .nag__icon{animation:none;transform:rotate(-90deg)}
  /* these animations end at opacity 0 — show them statically; the HUD timer removes .show */
  .hud__toast.show,.hud__banner.show{animation:none;opacity:1}
  .hud__dash i{transition:none}
  .res__rank,.res__rank.pop,.card.is-unlocking,.card.is-unlocking .card__sky,.res__unlock{animation:none}
  /* ceremonies (P3-9): the timelines jump to their last stage, so every block is simply visible; the tier card does not fade out early */
  .screen--tier.is-active:is([data-stage="out"],[data-stage="done"]){animation:none}
  .tier-card__line,.tier-card__next,.ending__kicker,.ending__title,.ending__lines p,.ending__totals{opacity:1;animation:none}
  .title__hook,.medal{animation:none}
}

/* ============================================================
   P2-10 — four zones per tier (t4 · s4 · v4): the tower cards go 3 → 4 columns
   ============================================================ */
.tier__cards{grid-template-columns:repeat(4,minmax(0,1fr));max-width:72rem}
@media (max-width:820px){
  .tier__cards{grid-template-columns:repeat(4,minmax(0,1fr));gap:.4rem}
}

/* Title footer version badge (title-meta.ts): quiet, tabular, always visible — it names the build in screenshots. */
.title__version{margin-left:.25rem;font-size:.62rem;font-weight:600;letter-spacing:.12em;color:var(--muted-2);opacity:.72;
  font-variant-numeric:tabular-nums;white-space:nowrap}
@media (max-width:640px){.title__version{font-size:.58rem;flex-basis:100%;text-align:right;opacity:.6}}

/* The ascent: one landmark in the vista, quiet expedition controls beside it. */
.screen--title{
  padding-left:clamp(1.5rem,6vw,6rem);padding-right:clamp(1.5rem,6vw,6rem);
  gap:clamp(.8rem,2.8vh,1.65rem);padding-bottom:5rem;
  background:linear-gradient(90deg,rgba(5,10,18,.96),rgba(5,10,18,.77) 34%,rgba(5,10,18,.13) 61%,rgba(5,10,18,.02));
}
.title__kicker{font-family:var(--f-kr);font-size:.69rem;letter-spacing:.13em;font-weight:500;color:#A7BFC6;margin-bottom:1.2rem}
.title__logo{font-size:clamp(3rem,min(10.5vw,12vh),7.4rem);letter-spacing:-.065em}
.title__logo em{background:none;color:var(--coral-hi);animation:fadeUp .8s .18s var(--e-out) both}
.title__premise{font-size:.85rem;color:#B5C9D0;font-family:var(--f-kr);margin:.95rem 0 0;line-height:1.7}
#title-menu{width:min(21rem,39vw);gap:.22rem}
#title-menu .menu__item{padding:.57rem .85rem .57rem 1rem;font-size:1rem;min-height:44px}
#title-menu .menu__item small{color:#8EA7B2;font-size:.7rem}
#title-menu .menu__item--launch{border:1px solid rgba(127,227,214,.3);background:rgba(72,139,141,.19);padding:.85rem 2.5rem .85rem 1rem;margin-bottom:.45rem;color:#F3FAF6}
#title-menu .menu__item--launch::after{content:"↗";position:absolute;right:1rem;top:50%;translate:0 -50%;font-size:1.2rem;color:var(--teal)}
.title__foot{position:absolute;bottom:max(1.4rem,env(safe-area-inset-bottom));left:clamp(1.5rem,6vw,6rem);right:clamp(1.5rem,6vw,6rem)}
.title__journey{position:absolute;right:6vw;top:5.5vh;width:min(25rem,37vw);font-size:.67rem;color:#95B0BD}
.title__journey-label{letter-spacing:.08em;color:#BED2D7;font-family:var(--f-kr);font-size:.69rem}
.title__route{display:flex;gap:0;margin:1rem 0 .6rem}
.title__route-stop{position:relative;flex:1;display:flex;flex-direction:column;gap:.6rem;font-size:.6rem;white-space:nowrap;color:#ABC2CA}
.title__route-stop::before{content:"";height:1px;background:rgba(178,218,220,.22);position:absolute;top:3px;left:7px;right:0}
.title__route-stop:last-child::before{display:none}
.title__route-stop i{position:relative;width:7px;height:7px;border-radius:50%;background:#132B36;border:1px solid var(--stop-c)}
.title__route-stop.is-done i{background:var(--stop-c);box-shadow:0 0 10px var(--stop-c)}
#title-journey-progress{font-variant-numeric:tabular-nums;color:#809EAB}

/* Campaign: the real map makes a zone identifiable before the first attempt. */
.campaign{display:grid;grid-template-columns:minmax(0,1fr) minmax(260px,29%);gap:1.5rem;min-height:0;flex:1;overflow:hidden}
.campaign .tower{padding-right:.35rem;min-width:0}
.campaign .tier{grid-template-columns:2.4rem minmax(0,1fr);gap:.65rem}
.campaign .tier__name{letter-spacing:.13em}
.campaign .tier__name span{font-size:.59rem}
.campaign .tier__name b{font-size:.93rem}
.campaign .tier__cards{gap:.65rem}
.campaign .card{min-width:0;width:100%;min-height:134px;aspect-ratio:1.35}
.campaign .card__body{padding:.65rem .65rem .8rem}
.campaign .card__idx{font-size:.56rem;letter-spacing:.08em}
.campaign .card__title{font-size:.86rem}
.campaign .card__meta{font-size:.6rem;gap:.35rem;flex-wrap:wrap}
.campaign .card__meta>span:last-child{display:none}
.campaign .card__stars{right:.55rem;top:.65rem}
.campaign .card__top{left:.55rem;top:.6rem}
.campaign .card__lock{inset:auto 0 0;min-height:2rem;padding:.3rem .45rem;flex-direction:row;justify-content:flex-start;gap:.3rem;
  background:rgba(7,17,28,.9);backdrop-filter:none;color:#A5BBC5;font-size:.56rem;letter-spacing:0;font-weight:400;line-height:1.45}
.campaign .card__lock svg{width:.85rem;height:.85rem;flex:0 0 auto}
.campaign .card[disabled] .card__body{bottom:1.9rem}
.campaign .card[disabled] .card__sky{opacity:.36;filter:saturate(.5)}
.campaign .card[disabled] .card__meta,.campaign .card[disabled] .card__top,.campaign .card[disabled] .card__stars{display:none}
.campaign .card[disabled] .card__title{color:#B7C9D0}
.card__next{position:absolute;z-index:2;left:.55rem;top:2rem;color:var(--teal);font-size:.56rem;letter-spacing:.02em}
.card--next{border-color:rgba(127,227,214,.46)}
.campaign__detail{--preview-c:var(--teal);border:1px solid rgba(144,186,196,.19);border-radius:16px;
  background:linear-gradient(155deg,rgba(25,48,62,.87),rgba(8,20,31,.94));padding:1.3rem;align-self:stretch;
  display:flex;flex-direction:column;gap:.7rem;min-width:0;overflow:auto;scrollbar-width:thin;touch-action:pan-y}
.campaign__eyebrow{font-size:.66rem;font-weight:700;letter-spacing:.12em;color:var(--preview-c)}
.campaign__detail h3{font-family:var(--f-kr);font-size:1.4rem;letter-spacing:-.04em;line-height:1.3;margin:0}
.campaign__story{font-family:var(--f-kr);font-size:.75rem;color:#A1B8C3;line-height:1.8;margin:0}
.campaign__map{height:clamp(110px,21vh,185px);min-height:95px;display:flex;align-items:center;justify-content:center;
  padding:.65rem;border:1px solid rgba(150,194,207,.1);border-radius:8px;background:rgba(3,11,19,.55);margin-top:.25rem}
.campaign-map{display:block;width:100%;height:100%;overflow:visible}
.campaign__legend{display:flex;justify-content:space-between;gap:.4rem;font-size:.54rem;color:var(--paper)}
.campaign__legend span:nth-child(2){color:var(--teal)}
.campaign__legend span:nth-child(3){color:var(--gold)}
.campaign__techniques{display:flex;gap:.3rem;flex-wrap:wrap}
.campaign__techniques span{border:1px solid rgba(171,205,212,.15);border-radius:4px;padding:.23rem .4rem;font-size:.59rem;color:#BCD0D7}
.campaign__stats{display:grid;grid-template-columns:1fr 1fr;gap:.85rem .4rem;margin:.2rem 0;padding:.8rem 0;border-top:1px solid var(--line-2);border-bottom:1px solid var(--line-2)}
.campaign__stats dt{font-size:.62rem;color:#8EA9B6;margin-bottom:.3rem}
.campaign__stats dd{margin:0;font-size:.88rem;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.campaign__status{font-family:var(--f-kr);font-size:.7rem;color:var(--preview-c);line-height:1.6;margin:.2rem 0}
.campaign__actions{display:flex;flex-direction:column;gap:.45rem;margin-top:auto}
.campaign__start,.campaign__watch{display:flex;align-items:center;justify-content:space-between;gap:.7rem;min-height:44px;padding:.7rem .85rem;
  border-radius:7px;font-size:.8rem;font-weight:700;border:1px solid rgba(127,227,214,.25);transition:background .18s,outline .18s}
.campaign__start{background:var(--preview-c);color:#071923}
.campaign__watch{background:rgba(127,227,214,.035);color:#C5DADD}
.campaign__actions button:disabled{opacity:.42;cursor:not-allowed}
.campaign__actions button:not(:disabled):hover,.campaign__actions button.is-cursor,.campaign__actions button:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
.campaign__help{font-size:.62rem;font-family:var(--f-kr);color:#809EAC;line-height:1.75;margin:.1rem 0 0}
.pg__head p{color:#8BA8B7}
.menu__item small{color:#8AA3AF}
@media (max-width:1080px){
  .campaign{gap:1rem;grid-template-columns:minmax(0,1fr) 250px}
  .campaign .tier__cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  .campaign .card{min-height:125px;aspect-ratio:1.65}
  .campaign__detail{padding:1rem}
}
@media (max-width:640px) and (min-height:431px){
  .screen--title{padding:2rem 1.5rem 6rem}
  #title-menu{width:min(24rem,86vw)}
  .title__journey{display:none}
  .title__premise{font-size:.75rem}
  .campaign{display:flex;flex-direction:column;overflow-y:auto;gap:1rem;touch-action:pan-y}
  .campaign .tower{overflow:visible;flex:none;order:1}
  .campaign__detail{overflow:visible;flex:none;display:grid;grid-template-columns:1fr 1fr;gap:.5rem .85rem}
  .campaign__detail h3,.campaign__eyebrow{grid-column:1}
  .campaign__map{grid-column:2;grid-row:1 / 5;height:110px;margin:0}
  .campaign__story,.campaign__help,.campaign__legend{display:none}
  .campaign__techniques{grid-column:1}
  .campaign__stats{grid-column:1 / -1;grid-template-columns:repeat(4,1fr);gap:.25rem;padding:.5rem 0;margin:0}
  .campaign__stats dd{font-size:.73rem}
  .campaign__status{grid-column:1 / -1}
  .campaign__actions{grid-column:1 / -1;flex-direction:row}
  .campaign__actions button{flex:1;font-size:.73rem;padding:.65rem}
}
@media (max-height:430px){
  .screen--title{padding:.6rem var(--pad-r) 2.5rem var(--pad);gap:.3rem clamp(1.5rem,5vw,3.5rem)}
  .title__logo{font-size:clamp(1.9rem,17vh,3.6rem)}
  .title__premise,.title__journey{display:none}
  .title__foot{position:absolute;left:var(--pad);right:var(--pad-r);bottom:.6rem}
  #title-menu{width:auto;max-width:19rem;gap:0}
  #title-menu .menu__item{font-size:.88rem;padding:.25rem .8rem .25rem 1rem;min-height:36px}
  #title-menu .menu__item--launch{padding:.5rem 2rem .5rem .8rem;margin-bottom:.1rem}
  .campaign{grid-template-columns:minmax(0,1fr) 220px;gap:.7rem}
  .campaign .tier{grid-template-columns:1.7rem minmax(0,1fr);gap:.4rem}
  .campaign .tier__name{gap:.4rem;flex-wrap:wrap}
  .campaign .tier__name span{display:none}
  .campaign .card{min-height:109px}
  .campaign__detail{padding:.8rem;gap:.5rem}
  .campaign__detail h3{font-size:1.15rem}
  .campaign__map{height:80px;min-height:80px}
  .campaign__story,.campaign__help{display:none}
}

/* A quiet viewing desk for studying the real inputs of the guide. */
.screen--replay{pointer-events:none!important}
.screen--replay.is-active{animation:none}
.screen--replay .replay__head,.screen--replay .replay__transport{pointer-events:auto}
.replay__head{position:absolute;top:0;left:0;right:0;display:flex;align-items:center;gap:1rem;
  padding:max(1.3rem,env(safe-area-inset-top)) var(--pad-r) 1.5rem var(--pad);
  background:linear-gradient(180deg,rgba(5,14,24,.95),rgba(5,14,24,.65) 65%,transparent)}
.replay__head .icon-btn{width:44px;height:44px}
.replay__title{flex:1;min-width:0}
.replay__eyebrow{font-size:.66rem;letter-spacing:.06em;color:var(--teal)}
.replay__title h2{font-size:1.2rem;letter-spacing:-.03em;margin:.2rem 0 0}
.replay__status{font-family:var(--f-kr);font-size:.74rem;color:#C2D9DD;text-align:right;max-width:18rem}
.replay__transport{position:absolute;left:50%;translate:-50% 0;bottom:max(1.2rem,env(safe-area-inset-bottom));
  width:min(900px,calc(100% - 2.5rem));border:1px solid rgba(141,191,201,.3);border-radius:13px;padding:.85rem 1.2rem;
  background:rgba(6,20,31,.96);box-shadow:0 16px 60px rgba(0,0,0,.3);display:flex;flex-direction:column;gap:.35rem}
.replay__readout{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.replay__inputs{display:flex;gap:.28rem}
.replay__inputs span{min-width:26px;height:24px;display:grid;place-items:center;border:1px solid #38515F;border-radius:4px;
  font-size:.7rem;color:#8BA5B2;padding:0 .35rem;transition:color .06s,background .06s}
.replay__inputs .is-held{background:#7FE3D6;color:#071923;border-color:#CFFBF4}
.replay__time{font-size:.74rem;font-variant-numeric:tabular-nums;color:#C8DADF;white-space:nowrap}
input[type=range].replay__seek{display:block;width:100%;height:28px;margin:0;accent-color:var(--teal);cursor:pointer;touch-action:pan-x;background:transparent}
input[type=range].replay__seek::-webkit-slider-runnable-track{height:3px;border-radius:99px;background:linear-gradient(90deg,var(--teal) var(--played,0%),#3D5361 var(--played,0%))}
input[type=range].replay__seek::-webkit-slider-thumb{width:17px;height:17px;margin-top:-7px;box-shadow:0 0 0 4px rgba(127,227,214,.12)}
input[type=range].replay__seek::-moz-range-track{height:3px;border-radius:99px;background:#3D5361}
input[type=range].replay__seek::-moz-range-progress{height:3px;background:var(--teal)}
input[type=range].replay__seek::-moz-range-thumb{width:17px;height:17px}
.replay__controls{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.replay__buttons,.replay__speeds{display:flex;align-items:center;gap:.35rem}
.replay__button,.replay__speed{display:flex;align-items:center;justify-content:center;min-height:44px;min-width:44px;
  padding:.6rem .8rem;border:1px solid rgba(159,199,207,.2);border-radius:6px;background:rgba(58,94,109,.15);
  font-size:.75rem;color:#D4E2E6;white-space:nowrap;transition:background .15s,border-color .15s}
.replay__button--primary{background:var(--teal);color:#071923;min-width:108px;font-weight:700}
.replay__button{gap:.45rem}
.replay__button svg{width:14px;height:14px;flex:0 0 auto}
.replay__pause-icon,.is-playing .replay__play-icon{display:none}
.is-playing .replay__pause-icon{display:block}
.replay__speed{padding:.55rem .7rem}
.replay__speed[aria-pressed="true"]{background:rgba(127,227,214,.18);color:var(--teal);border-color:rgba(127,227,214,.48)}
.replay__button:disabled{opacity:.35;cursor:not-allowed}
.replay__button:not(:disabled):hover,.replay__speed:hover{border-color:var(--teal)}
.replay__button:focus-visible,.replay__speed:focus-visible,.replay__button.is-cursor,.replay__speed.is-cursor,.replay__seek:focus-visible{outline:2px solid #EDF8F5;outline-offset:3px}
@media (max-width:640px) and (min-height:431px){
  .replay__head{padding:1rem;gap:.7rem;flex-wrap:wrap}
  .replay__status{flex-basis:100%;margin:0 0 0 3.45rem;text-align:left;font-size:.68rem}
  .replay__transport{width:calc(100% - 1.5rem);padding:.75rem;bottom:max(.75rem,env(safe-area-inset-bottom))}
  .replay__controls{flex-wrap:wrap;gap:.5rem}
  .replay__buttons{width:100%;display:grid;grid-template-columns:1fr 1fr}
  .replay__speeds{width:100%;justify-content:flex-end}
  .replay__button{padding:.6rem;font-size:.72rem}
  .replay__inputs span{min-width:21px;height:23px;font-size:.63rem;padding:0 .25rem}
  .replay__readout{gap:.35rem}
  .replay__time{font-size:.63rem}
}
@media (max-height:430px){
  .replay__head{padding:.6rem var(--pad-r) .8rem var(--pad);gap:.65rem}
  .replay__title h2{font-size:.95rem}
  .replay__eyebrow{font-size:.6rem}
  .replay__status{font-size:.65rem}
  .replay__transport{width:calc(100% - 2rem);bottom:max(.5rem,env(safe-area-inset-bottom));padding:.45rem .7rem;gap:.05rem}
  .replay__button,.replay__speed{min-height:44px;padding:.45rem .6rem;font-size:.66rem}
  .replay__button--primary{min-width:90px}
  .replay__controls{gap:.5rem}
  .replay__inputs span{height:20px;font-size:.62rem}
  input[type=range].replay__seek{height:28px}
  #title-menu{width:clamp(11rem,30vw,19rem)}
}

/* Secondary instructions remain readable on phones as well as desktop. */
.title__journey,.title__route-stop,
.campaign .tier__name span,.campaign .card__idx,.campaign .card__meta,
.campaign .card__lock,.card__next,.campaign__eyebrow,.campaign__legend,
.campaign__techniques span,.campaign__stats dt,.campaign__help,
.replay__eyebrow,.replay__status,.replay__time,
.replay__inputs span,.replay__button,.replay__speed{font-size:11px}
.campaign .card__lock{min-height:2.6rem;padding:.3rem .5rem}
.campaign .card__lock span{min-width:0;flex:1}
.campaign .card[disabled] .card__body{bottom:2.75rem}

/* The field notebook and a small, optional goal for the current climb. */
.title__foot .chip{min-height:44px}
.campaign__journal{min-height:44px;justify-content:center;flex-shrink:0;font-size:11px}
.goal-picker{border:1px solid rgba(154,197,201,.2);border-radius:9px;background:rgba(4,15,24,.45);overflow:hidden;flex-shrink:0}
.goal-picker__toggle{display:flex;align-items:center;gap:.5rem;width:100%;min-height:44px;padding:.65rem .75rem;text-align:left}
.goal-picker__toggle>span{font-size:11px;color:#ADC1CB}
.goal-picker__toggle>b{font-size:.75rem;font-weight:600;margin-left:auto;color:var(--teal)}
.goal-picker__toggle>i{font-style:normal;transition:rotate .18s}
.goal-picker__toggle[aria-expanded="true"]>i{rotate:180deg}
.goal-picker__body{padding:0 .65rem .65rem}
.goal-picker__modes,.goal-picker__medals{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.35rem;margin-bottom:.4rem}
.goal-picker__button{min-height:44px;padding:.45rem .35rem;font-size:11px;border:1px solid #304955;border-radius:5px;background:#112633;color:#BBD0D6}
.goal-picker__button[aria-pressed="true"]{color:var(--teal-hi);border-color:var(--teal);background:rgba(127,227,214,.13)}
.goal-picker__button.is-earned::after{content:" ✓";color:var(--gold)}
.goal-picker__help{margin:.5rem .15rem 0;color:#A6BDC8;font-family:var(--f-kr);font-size:11px;line-height:1.75}
#pause-goal{margin-bottom:.85rem}
.goal-picker__toggle:focus-visible,.goal-picker__button:focus-visible,
.goal-picker__toggle.is-cursor,.goal-picker__button.is-cursor{outline:2px solid var(--paper);outline-offset:-3px}
.objective{position:absolute;left:var(--pad);top:calc(5.7rem + env(safe-area-inset-top));width:min(22rem,calc(100% - var(--pad) - var(--pad-r)));
  display:grid;grid-template-columns:1rem minmax(0,1fr);gap:.45rem;padding:.5rem .7rem .65rem;border:1px solid rgba(127,227,214,.3);
  border-radius:7px;background:rgba(5,20,30,.9);overflow:hidden;pointer-events:none;color:var(--teal)}
.objective__mark{font-size:.9rem;line-height:1.25}
.objective__copy{display:flex;flex-direction:column;gap:.12rem;min-width:0}
.objective__copy b{font-size:.72rem;font-weight:700}
.objective__copy>span{color:#C2D5DA;font-family:var(--f-kr);font-size:11px;line-height:1.55;word-break:keep-all;overflow-wrap:anywhere}
.objective__meter{position:absolute;left:0;bottom:0;right:0;height:2px;background:#29404B}
.objective__meter i{display:block;width:100%;height:100%;transform:scaleX(var(--goal-progress,0));transform-origin:left;background:currentColor}
.objective[data-state="ready"],.objective[data-state="complete"]{color:var(--gold);border-color:rgba(244,201,93,.5)}
.objective[data-state="missed"]{color:#C2CBD2;border-color:#53626C;background:rgba(12,22,31,.88)}
.objective[data-state="missed"] .objective__copy>span{color:#B4BEC7}
.objective.is-practice{border-style:dashed}
.res-objective{margin:1rem 0;border:1px solid #36525C;border-radius:10px;overflow:hidden;background:rgba(9,29,39,.6)}
.res-objective__current{padding:.8rem 1rem;display:flex;flex-direction:column;gap:.22rem;border-bottom:1px solid #2E4551}
.res-objective__current:last-child{border-bottom:0}
.res-objective__current b,.res-objective__next b{font-size:.9rem;color:var(--paper)}
.res-objective__current small,.res-objective__next small{font-size:11px;color:var(--teal)}
.res-objective__current>span,.res-objective__next span{font-family:var(--f-kr);font-size:11px;color:#BCD0D6;line-height:1.7}
.res-objective[data-state="complete"] .res-objective__current small{color:var(--gold)}
.res-objective__next{padding:.8rem 1rem;display:flex;flex-direction:column;gap:.7rem}
.res-objective__next>div{display:flex;flex-direction:column;gap:.22rem}
.res-objective__retry{min-height:44px;padding:.6rem .8rem;border-radius:6px;background:var(--teal);color:#09202A;font-size:.76rem;font-weight:700}
.res-objective__retry:focus-visible,.res-objective__retry.is-cursor{outline:2px solid var(--paper);outline-offset:-4px}
.modal--journal{width:min(64rem,100%);padding:0;overscroll-behavior:contain;touch-action:pan-y}
.journal__head{position:sticky;top:0;z-index:2;display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.1rem 1.4rem;
  background:#102330;border-bottom:1px solid #304D59;box-shadow:0 8px 25px rgba(3,12,20,.3)}
.journal__head h2{margin:0;font-size:1.3rem}
.journal__nav{display:flex;align-items:center;gap:.45rem}
.journal__nav .chip{min-width:44px;min-height:44px;padding:.5rem .85rem;font-size:.75rem;color:#D0E1E4;white-space:nowrap}
.journal__nav .icon-btn{width:44px;height:44px;margin-left:.2rem}
#journal-body{padding:1.2rem 1.4rem 1.5rem;font-family:var(--f-kr)}
.journal__summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.6rem;scroll-margin-top:6rem}
.journal__stat{margin:0;padding:.75rem .8rem;background:rgba(126,189,193,.07);border:1px solid #2F4B57;border-radius:7px;font-size:.8rem;color:#D7E4E5;font-variant-numeric:tabular-nums}
.journal__instructions{font-size:.75rem;color:#B0C5CD;line-height:1.8;margin:1rem 0 .3rem;word-break:keep-all}
.journal__controls{font-size:11px;color:#91ACB9;margin:0 0 1.5rem}
#ui.is-touch .journal__controls{display:none}
.journal__biome{--journal-c:var(--teal);margin:1.5rem 0 2rem}
.journal__biome[data-journal-biome="stormspire"]{--journal-c:#8EBDEC}
.journal__biome[data-journal-biome="voidreef"]{--journal-c:#C3A9F2}
.journal__biome[data-journal-biome="summit"]{--journal-c:var(--gold)}
.journal__heading{font-family:var(--f-kr);font-size:.95rem;font-weight:700;letter-spacing:.01em;margin:0 0 .8rem;color:var(--journal-c,var(--gold))}
.journal__zone{padding:.9rem;margin-top:.65rem;border:1px solid #294550;border-left:2px solid var(--journal-c);border-radius:8px;background:rgba(7,21,31,.6);scroll-margin-top:6rem}
.journal-zone__header{display:flex;align-items:center;justify-content:space-between;gap:.6rem}
.journal-zone__name{font-size:.9rem;font-weight:600;color:#DEE9E8;margin:0}
.journal-zone__completion{font-size:11px;color:#ACC5CB}
.journal-zone__target{font-size:11px;line-height:1.6;color:#A6C3CC;margin:.4rem 0 .7rem;word-break:keep-all}
.journal-zone__goals{display:grid;grid-template-columns:68px 82px repeat(4,minmax(0,1fr));gap:.4rem}
.journal-zone__mode,.journal-zone__medal{min-height:44px;min-width:0;border:1px solid #34515F;border-radius:6px;background:#122A38;
  padding:.55rem .5rem;color:#D0E0E3;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:.28rem;text-align:left}
.journal-zone__mode-name,.journal-zone__medal-name{font-size:.73rem;font-weight:700}
.journal-zone__criteria,.journal-zone__state,.journal-zone__reason{font-size:11px;line-height:1.55;color:#ACC2CB;font-weight:400;word-break:keep-all;overflow-wrap:anywhere}
.journal-zone__medal--earned .journal-zone__medal-name{color:var(--gold)}
.journal-zone__medal--earned .journal-zone__medal-name::before{content:"✓ ";font-family:var(--f-ui)}
.journal-zone__mode--selected,.journal-zone__medal--pinned{background:rgba(127,227,214,.13);border-color:var(--teal)}
.journal-zone__mode--selected .journal-zone__state,.journal-zone__medal--pinned .journal-zone__state{color:var(--teal)}
.journal-zone__medal--suggested{border-color:#759A9B;border-style:dashed}
.journal-zone__mode:disabled,.journal-zone__medal:disabled{background:rgba(20,36,47,.65);border-color:#2B414D;color:#8BA5B4;cursor:not-allowed}
.journal-zone__reason{color:#90A8B6}
.journal-zone__mode:not(:disabled):hover,.journal-zone__medal:not(:disabled):hover,.journal-skin__equip:not(:disabled):hover{border-color:var(--teal)}
.journal-zone__mode:focus-visible,.journal-zone__medal:focus-visible,.journal-skin__equip:focus-visible,
.journal-zone__mode.is-cursor,.journal-zone__medal.is-cursor,.journal-skin__equip.is-cursor{outline:2px solid var(--paper);outline-offset:2px}
.journal__skins{scroll-margin-top:6rem}
.journal__gallery{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.65rem}
.journal-skin__card{display:flex;flex-direction:column;align-items:center;text-align:center;padding:.9rem .7rem;border:1px solid #2E4B59;
  border-radius:9px;background:radial-gradient(ellipse at 50% 25%,rgba(88,153,168,.14),transparent 75%),#0C202D}
.journal-skin__portrait{width:88px;height:88px;max-width:100%;object-fit:contain;margin-bottom:.4rem}
.journal-skin__name{font-size:.85rem;margin:0 0 .4rem;color:#DEEBEA}
.journal-skin__hint{font-size:11px;line-height:1.7;color:#A6C0CA;word-break:keep-all;margin:0 0 .5rem}
.journal-skin__progress{font-size:.78rem;color:#D0DEDC;margin:0 0 .7rem;font-variant-numeric:tabular-nums}
.journal-skin__equip{min-height:44px;width:100%;padding:.5rem;border:1px solid #3C5B64;border-radius:5px;background:#1A3744;color:#C7DFE0;font-size:.73rem;margin-top:auto}
.journal-skin__equip:disabled{background:#142936;color:#93ABB8;border-color:#2F4754;cursor:not-allowed}
.journal-skin__card--selected{border-color:var(--teal)}
.journal-skin__card--selected .journal-skin__equip{color:var(--teal);border-color:#467C7E}
.journal-skin__card--locked .journal-skin__portrait{opacity:.65}
@media (max-width:820px){
  .journal-zone__goals{grid-template-columns:repeat(4,minmax(0,1fr))}
  .journal-zone__mode{grid-column:span 2;flex-direction:row;align-items:center;justify-content:space-between}
}
@media (max-width:640px){
  #campaign-goal,.campaign__journal{grid-column:1 / -1}
  .modal--journal{border-radius:12px}
  .journal__head{padding:.8rem;gap:.5rem}
  .journal__head h2{font-size:1.02rem;white-space:nowrap}
  .journal__nav{gap:.25rem}
  .journal__nav .chip{padding:.4rem .6rem;font-size:11px}
  .journal__nav .icon-btn{margin-left:0}
  #journal-body{padding:1rem .8rem}
  .journal__summary{gap:.3rem}
  .journal__stat{font-size:11px;padding:.65rem .4rem;line-height:1.6;word-break:keep-all}
  .journal__zone{padding:.75rem .6rem}
  .journal-zone__goals{grid-template-columns:repeat(2,minmax(0,1fr))}
  .journal-zone__mode{grid-column:span 1}
  .journal__gallery{grid-template-columns:repeat(2,minmax(0,1fr))}
  .journal-zone__medal{padding:.6rem}
  .objective{width:min(20rem,calc(100% - var(--pad) - var(--pad-r)))}
}
@media (max-height:430px){
  .objective{top:calc(4.9rem + env(safe-area-inset-top));width:min(18rem,40vw);padding:.4rem .55rem .55rem}
  .objective__copy b{font-size:11px}
  .journal__head{padding:.55rem 1rem}
  .journal__head h2{font-size:1.1rem}
  #journal-body{padding:1rem}
}
@media (max-width:360px){
  .journal__head{flex-wrap:wrap}
  .journal__head .modal__kicker{white-space:nowrap}
  .journal__nav{width:100%;justify-content:flex-end}
  .journal__summary,.journal__zone,.journal__skins{scroll-margin-top:8.5rem}
}
