/* Heist Hub · 04 Night edition · 03 Hub of tiles (decided 12 Nov).
   PORTED, NOT REBUILT: these rules are the .app rules of docs/design/02-navigation.html, with the same
   class names and values. Only two kinds of change:
   1. The prototype's fixed iPhone 15 insets (59 top, 34 bottom) are safe-area variables:
      --sat / --sab = env(safe-area-inset-*). The pixel proof sets them to 59px / 34px.
   2. The 393 x 852 window becomes the whole viewport (.app is fixed to it).
   If you change a value here, change the prototype too, or the pixel proof fails. */

:root {
  --sat: env(safe-area-inset-top, 0px);
  --sab: env(safe-area-inset-bottom, 0px);
  color-scheme: dark;
}
html, body, #root { margin: 0; height: 100%; background: #0E0D0C; overflow: hidden; overscroll-behavior: none; }
body { -webkit-tap-highlight-color: transparent; -webkit-text-size-adjust: 100%; }

.app{--bg:#0E0D0C;--surf:#171513;--surf2:#1b1916;--line:rgba(242,235,221,.16);--ink:#F2EBDD;--ink2:#C3B9A7;--ink3:#8F8677;--acc:#E8432E;--onacc:#FFF6EA;--acc2:#E9B44C;--live:#E8432E;--heart:#E8432E;--chip:transparent;--barbg:rgba(14,13,12,.92);--sheet:#141210;--fd:"Fraunces Variable","Fraunces",Georgia,serif;--fb:"Manrope Variable","Manrope",system-ui,sans-serif;--fm:"Manrope Variable","Manrope",system-ui,sans-serif;--ease:cubic-bezier(.2,.7,.3,1);--dur:.34s;
  position:fixed;inset:0;overflow:hidden;overflow-x:hidden;overscroll-behavior:none;background:var(--bg);color:var(--ink);font:400 14px/1.35 var(--fb);-webkit-font-smoothing:antialiased;-webkit-user-select:none;user-select:none}
/* app only (no pixel change): clip, so focus or scrollIntoView (VoiceOver, keyboard) can never scroll the whole app
   and slide a closed sheet into view. Older Safari keeps overflow:hidden from the rule above. */
.app{overflow:clip}
.app *{box-sizing:border-box}
.app button,.app :where(a.btn){all:unset;box-sizing:border-box;cursor:pointer;display:block} /* :where keeps a link styled as .btn (an anchor would otherwise out-rank .app .btn) */
.app button:focus-visible,.app [role="button"]:focus-visible{outline:2px solid var(--acc2);outline-offset:2px}
.app img{display:block;width:100%;height:100%;object-fit:cover;background:var(--surf2)}
.app svg.i{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}
/* halftone print texture on pictures */
.app .ht{position:relative;overflow:hidden}
.app .ht::after{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:radial-gradient(rgba(14,13,12,.55) .9px,transparent 1.35px) 0 0/3.6px 3.6px;mix-blend-mode:multiply}
/* screens, scroll areas, fixed bars */
.app .scr{position:absolute;inset:0;transition:opacity .2s ease}
.app .vp{position:absolute;left:0;right:0;top:0;bottom:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior:none;-webkit-overflow-scrolling:touch;scrollbar-width:none}
.app .vp::-webkit-scrollbar{display:none}
.app .topbar{position:absolute;left:0;right:0;top:0;height:calc(var(--sat) + 44px);padding:var(--sat) 8px 0 16px;display:flex;align-items:center;gap:2px;z-index:10;transition:background .3s,box-shadow .3s}
.app .topbar.solid{background:var(--barbg);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);box-shadow:0 1px 0 var(--line)}
.app .wm{display:inline-flex;align-items:baseline;gap:6px;margin-right:auto;font:italic 600 23px/1 var(--fd);letter-spacing:-.015em;color:var(--ink);white-space:nowrap}
.app .wm::after{content:".";color:var(--acc);margin-left:-6px}
.app .tbtn{position:relative;width:44px;height:44px;display:grid;place-items:center;border-radius:50%;color:var(--ink);transition:transform .15s}
.app .bdg{position:absolute;top:6px;right:5px;min-width:17px;height:17px;padding:0 4px;border-radius:9px;background:var(--acc2);color:#111;font:800 11px/17px var(--fb);text-align:center;transform:scale(0);transition:transform .3s var(--ease)}
.app .bdg.on{transform:scale(1)}
.app .phd{position:absolute;left:0;right:0;top:0;height:calc(var(--sat) + 44px);padding:var(--sat) 12px 0 60px;display:flex;align-items:center;gap:8px;background:var(--bg);border-bottom:1px solid var(--line);z-index:5}
.app .phd b{font:600 22px/1 var(--fd);letter-spacing:-.015em}
.app .phd .mc{margin-left:auto;font:italic 500 13px/1 var(--fd);color:var(--ink2)}
/* Spotlight: one big hero, the best thing right now */
.app .spot{position:relative;height:396px;overflow:hidden;background:#000}
.app .spot.short{height:318px}
.app .sl{position:absolute;inset:0;opacity:0;transition:opacity .7s ease}
.app .sl.on{opacity:1}
.app .sl::before{content:"";position:absolute;inset:0;z-index:2;background:linear-gradient(180deg,rgba(14,13,12,.62) 0%,rgba(14,13,12,0) 30%,rgba(14,13,12,.15) 52%,#0E0D0C 100%)}
.app .sx{position:absolute;left:16px;right:16px;bottom:16px;z-index:3}
.app .why{display:inline-flex;align-items:center;gap:6px;height:22px;padding:0 8px;background:var(--acc);color:#FFF6EA;font:800 11px/1 var(--fm);letter-spacing:.12em;text-transform:uppercase}
.app .why.gold{background:var(--acc2);color:#1a1205}
.app .why i{width:6px;height:6px;border-radius:50%;background:#fff;animation:blink 1.6s ease-in-out infinite}
@keyframes blink{50%{opacity:.25}}
.app .sx h2{margin:10px 0 6px;font:600 25px/1.12 var(--fd);letter-spacing:-.015em;color:var(--ink)}
.app .spot.short .sx h2{font-size:22px}
.app .sm{font-size:12.5px;color:var(--ink2);font-weight:600}
.app .srow{display:flex;align-items:center;justify-content:space-between;margin-top:12px}
.app .dots{display:flex;gap:6px}
.app .dots i{width:18px;height:3px;background:rgba(242,235,221,.28);transition:background .4s}
.app .dots i.on{background:var(--ink)}
.app .btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;height:44px;padding:0 18px;border-radius:999px;background:var(--acc);color:var(--onacc);font:700 14px/1 var(--fb);white-space:nowrap;transition:transform .15s,filter .2s}
.app .btn svg.i{width:18px;height:18px}
.app .btn.ghost{background:transparent;color:var(--ink);box-shadow:inset 0 0 0 1px rgba(242,235,221,.35)}
/* sections and shared cards */
.app .sec{padding:18px 16px 4px}
.app .sh{display:flex;align-items:center;gap:8px;margin-bottom:12px;border-bottom:1px solid rgba(242,235,221,.3);padding-bottom:8px}
.app .sh h3{display:flex;align-items:center;gap:8px;font:600 21px/1.1 var(--fd);margin:0;color:var(--ink);letter-spacing:-.015em}
.app .sh .meta{font:italic 500 13px/1 var(--fd);color:var(--ink2)}
.app .ldot{width:8px;height:8px;border-radius:50%;background:var(--live);animation:lpulse 1.8s ease-out infinite}
@keyframes lpulse{0%{box-shadow:0 0 0 0 rgba(232,67,46,.7)}100%{box-shadow:0 0 0 9px rgba(232,67,46,0)}}
.app .kick{display:block;font:700 11px/1.2 var(--fm);letter-spacing:.14em;text-transform:uppercase;color:var(--acc)}
.app .lc{flex:none;width:236px;transition:transform .15s,filter .2s}
.app .lc.big{width:100%}
.app .lt{position:relative;height:133px;overflow:hidden;background:var(--surf2);border-radius:4px}
.app .lc.big .lt{height:203px}
.app .live{position:absolute;left:8px;top:8px;display:inline-flex;align-items:center;gap:5px;height:22px;padding:0 8px;background:var(--live);color:#fff;font:800 11px/1 var(--fm);letter-spacing:.14em;z-index:2}
.app .live i{width:6px;height:6px;border-radius:50%;background:#fff;animation:blink 1.6s ease-in-out infinite}
.app .vw{position:absolute;left:8px;bottom:8px;display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 7px;border-radius:2px;background:rgba(0,0,0,.66);color:#fff;font:700 11px/1 var(--fm);z-index:2}
.app .vw svg.i{width:14px;height:14px}
.app .lm{display:flex;gap:9px;padding:9px 2px 0;align-items:flex-start}
.app .av{flex:none;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font:800 11px/1 var(--fb);color:#0b0b0b}
.app .av0{background:var(--acc)}.app .av1{background:var(--acc2)}.app .av2{background:var(--ink2)}
.app .lx{min-width:0;flex:1}
.app .lx b{display:block;font-size:13px;font-weight:700;color:var(--ink)}
.app .lx span{display:block;font-size:12px;color:var(--ink2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:190px}
.app .lc.big .lx span{max-width:none}
.app .cnt{margin-left:auto;font:italic 500 13px/1 var(--fd);color:var(--ink2);transition:color .3s}
.app .cnt.flash{color:var(--acc)}
.app .chips{display:flex;gap:8px;margin:0 -16px 10px 0;overflow-x:auto;padding:4px 16px 4px 0;scrollbar-width:none}
.app .chips::-webkit-scrollbar{display:none}
.app .chip{flex:none;display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 14px;border-radius:999px;color:var(--ink2);border:1px solid rgba(242,235,221,.3);font:700 13px/1 var(--fb);white-space:nowrap;transition:background .25s,color .25s,transform .15s}
.app .chip.on{background:#F2EBDD;color:#0E0D0C;border-color:transparent}
.app .vlist{counter-reset:v}
.app .vr{display:flex;gap:12px;align-items:center;height:86px;overflow:hidden;border-bottom:1px solid rgba(242,235,221,.09);transition:opacity .3s,height .35s .08s}
.app .vr{counter-increment:v}
.app .vlist .vr::before{content:counter(v,decimal-leading-zero);flex:none;width:22px;font:italic 500 17px/1 var(--fd);color:var(--acc)}
.app .vr.in{animation:vin .45s ease both}
@keyframes vin{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.app .vt{position:relative;flex:none;width:128px;height:72px;overflow:hidden;background:var(--surf2);border-radius:2px}
.app .dur{position:absolute;right:5px;bottom:5px;font:700 11px/1 var(--fm);padding:3px 5px;border-radius:2px;background:rgba(0,0,0,.74);color:#fff;z-index:2}
.app .vx{flex:1;min-width:0}
.app .vx b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font:600 15px/1.18 var(--fd);color:var(--ink)}
.app .vx span{display:block;margin-top:3px;font-size:12px;line-height:1.25;color:var(--ink3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.app .sv{flex:none;width:44px;height:44px;margin-right:-8px;display:grid;place-items:center;border-radius:50%;color:var(--ink3);transition:transform .15s}
.app .sv svg.i{width:22px;height:22px;transition:fill .2s}
.app .sv.on{color:var(--heart)}
.app .sv.on svg.i{fill:var(--heart);animation:hpop .4s ease}
@keyframes hpop{40%{transform:scale(1.25)}100%{transform:none}}
.app .egg{position:relative;overflow:hidden;border:1px solid var(--line);border-radius:4px;transition:transform .15s,filter .2s}
.app .eimg{position:relative;height:172px;overflow:hidden}
.app .free{position:absolute;left:10px;top:10px;z-index:2;display:inline-flex;align-items:center;height:24px;padding:0 9px;background:#F2EBDD;color:#0E0D0C;font:700 11px/1 var(--fm);letter-spacing:.04em}
.app .ebd{padding:12px 14px 14px}
.app .egg h4{margin:4px 0 8px;font:600 19px/1.15 var(--fd);color:var(--ink)}
.app .emr{display:flex;flex-wrap:wrap;gap:4px 14px;font-size:12.5px;color:var(--ink2);font-weight:600}
.app .emr span{display:inline-flex;align-items:center;gap:5px}
.app .emr svg.i{width:15px;height:15px;color:var(--acc)}
.app .ad{position:relative;border:1px solid var(--line);border-radius:4px;padding:10px 14px 14px}
.app .adh{display:flex;align-items:center;justify-content:space-between;height:24px;margin-bottom:8px}
.app .adl{display:inline-flex;align-items:center;height:20px;padding:0 7px;box-shadow:inset 0 0 0 1px var(--line);color:var(--ink2);font:700 11px/1 var(--fm);letter-spacing:.06em;text-transform:uppercase}
.app .adx{font:700 12px/1 var(--fb);color:var(--acc)}
.app .adb{display:flex;gap:12px;align-items:flex-start}
.app .adimg{flex:none;width:64px;height:64px;display:grid;place-items:center;background:linear-gradient(135deg,#30343f,#12141a);box-shadow:inset 0 0 0 1px rgba(255,255,255,.08);overflow:hidden}
.app .adimg b{font:800 26px/1 Inter,system-ui,sans-serif;color:#e9edf5;letter-spacing:-.04em}
.app .adt{min-width:0}
.app .adt b{display:block;font:600 15px/1.2 var(--fd);color:var(--ink)}
.app .adt span{display:block;font-size:12.5px;line-height:1.35;color:var(--ink2);margin-top:3px}
.app .adt .adv{font-size:12px;color:var(--ink3);margin-top:4px;font-weight:600}
.app .adcta{width:100%;height:40px;margin-top:12px}
.app .tagp{display:inline-flex;align-items:center;height:20px;padding:0 7px;background:rgba(150,150,150,.22);color:var(--ink2);font:700 11px/1 var(--fm);letter-spacing:.04em}
.app .planned{font-style:normal;display:inline-flex;align-items:center;height:18px;padding:0 6px;background:#5b5f66;color:#e9eaec;font:700 11px/1 var(--fm)}
.app .spacer{height:calc(var(--sab) + 84px)}
/* hub tiles */
.app .tiles{display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:14px 16px 4px}
.app .tile{position:relative;height:96px;overflow:hidden;border:1px solid var(--line);border-radius:4px;transition:transform .15s,filter .2s}
.app .tile img{position:absolute;inset:0;opacity:.55}
.app .tile::before{content:"";position:absolute;inset:0;z-index:2;background:linear-gradient(90deg,rgba(14,13,12,.92) 0%,rgba(14,13,12,.55) 70%,rgba(14,13,12,.3))}
.app .tile .tx{position:absolute;left:12px;right:10px;bottom:10px;z-index:3}
.app .tile .tx b{display:flex;align-items:center;gap:6px;font:600 19px/1.1 var(--fd);color:var(--ink)}
.app .tile .tx span{display:block;font-size:12px;color:var(--ink2);margin-top:3px;font-weight:600}
.app .tile .ti{position:absolute;right:10px;top:10px;z-index:3;color:var(--acc)}
/* stream sheet */
.app .scrim{position:absolute;inset:0;background:rgba(0,0,0,.55);opacity:0;transition:opacity .3s;z-index:30;pointer-events:none}
.app .scrim.open{opacity:1;pointer-events:auto}
.app .sheet{position:absolute;left:0;right:0;bottom:0;height:690px;max-height:calc(100% - var(--sat) - 12px);padding:8px 16px max(var(--sab),16px);background:var(--sheet);border-radius:16px 16px 0 0;transform:translateY(104%);transition:transform var(--dur) var(--ease);z-index:31;box-shadow:0 -10px 40px rgba(0,0,0,.4)}
.app .sheet.open{transform:none}
.app .grab{width:38px;height:5px;border-radius:3px;margin:0 auto 10px;background:rgba(160,160,160,.45)}
.app .shd{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.app .shx{flex:1;min-width:0}
.app .shx b{display:block;font-size:15px;color:var(--ink)}
.app .shx span{display:block;font-size:12px;color:var(--ink2)}
.app .x{width:44px;height:44px;display:grid;place-items:center;border-radius:50%;color:var(--ink);box-shadow:inset 0 0 0 1px var(--line);margin-right:-4px;transition:transform .15s}
.app .player{position:relative;height:203px;overflow:hidden;background:#000}
.app .pbar{position:absolute;left:0;right:0;bottom:0;height:40px;display:flex;align-items:center;gap:10px;padding:0 12px;background:linear-gradient(0deg,rgba(0,0,0,.75),transparent);color:#fff;font:600 11.5px/1 var(--fm);z-index:2}
.app .pbar .pemb{margin-left:auto;opacity:.8}
.app .player .vw{bottom:auto;top:8px;left:auto;right:8px}
.app .stt{margin:12px 0;font:600 17px/1.25 var(--fd);color:var(--ink)}
.app .sbtns{display:flex;gap:10px}
.app .sbtns .btn{flex:1}
.app .freeline{display:flex;align-items:center;gap:7px;margin:12px 0;font-size:12.5px;color:var(--ink2);font-weight:600}
.app .freeline svg.i{width:16px;height:16px;color:var(--acc)}
.app .chat{border-top:1px solid var(--line);padding-top:10px;display:grid;gap:8px}
.app .chat div{font-size:13px;color:var(--ink2)}
.app .chat b{color:var(--acc);margin-right:6px}
/* pushed pages fade up (Night edition motion) */
.app .page{position:absolute;inset:0;background:var(--bg);z-index:16;transform:translateY(18px);opacity:0;pointer-events:none;transition:transform var(--dur) var(--ease),opacity var(--dur);overflow:hidden}
.app .page.open{transform:none;opacity:1;pointer-events:auto}
.app .pbtn{position:absolute;top:var(--sat);left:12px;width:44px;height:44px;display:grid;place-items:center;border-radius:50%;background:rgba(0,0,0,.45);color:#fff;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);z-index:6;transition:transform .15s}
.app .pbtn.share{left:auto;right:12px}
.app .pbtn.plain{background:transparent;color:var(--ink);-webkit-backdrop-filter:none;backdrop-filter:none}
.app .pc{position:absolute;left:0;right:0;top:calc(var(--sat) + 44px);bottom:0;overflow-x:hidden;overflow-y:auto;overscroll-behavior:none;padding:12px 16px 0;scrollbar-width:none}
.app .pc::-webkit-scrollbar{display:none}
.app .pc .lc.big{margin-bottom:16px}
.app .ehero{position:relative;height:300px}
.app .ehero::before{content:"";position:absolute;inset:0;z-index:2;background:linear-gradient(180deg,rgba(0,0,0,.5),rgba(0,0,0,0) 30%,rgba(0,0,0,0) 60%,var(--bg))}
.app .ebody{padding:0 16px;margin-top:-18px;position:relative;z-index:3}
.app .etags{display:flex;gap:8px;align-items:center}
.app .etags .free{position:static}
.app .tagk{display:inline-flex;align-items:center;gap:5px;font:700 11px/1 var(--fm);letter-spacing:.12em;text-transform:uppercase;color:var(--acc)}
.app .tagk svg.i{width:15px;height:15px}
.app .ebody h2{margin:10px 0 6px;font:600 25px/1.12 var(--fd);color:var(--ink);letter-spacing:-.01em}
.app .emeta{margin:0 0 10px;font-size:12.5px;color:var(--ink3);font-weight:600}
.app .etext{margin:0 0 14px;font-size:14px;line-height:1.5;color:var(--ink2)}
.app .onmap{display:flex;align-items:center;gap:12px;height:72px;padding:0 12px 0 8px;border:1px solid var(--line);border-radius:4px;color:var(--ink);transition:transform .15s,filter .2s}
.app .mini{position:relative;flex:none;width:56px;height:56px;overflow:hidden;background:var(--surf2)}
.app .omx{flex:1;min-width:0}
.app .omx b{display:block;font:600 16px/1.2 var(--fd)}
.app .omx span{display:block;font-size:12.5px;color:var(--ink2);margin-top:2px}
.app .onmap>svg.i{color:var(--acc)}
.app .esub{display:flex;align-items:center;gap:8px;margin:18px 0 2px;font:600 16px/1.2 var(--fd);color:var(--ink)}
.app .esub span{font:600 12px/1 var(--fm);color:var(--ink3)}
/* our own map (invented coastline) and pins */
.app .mapbox{position:absolute}
.app .mapbox>img{position:absolute;inset:0;width:100%;height:100%}
.app .mini .mapbox{width:180px;aspect-ratio:9/16}
.app .mpp .mapbox{left:50%;top:0;height:100%;aspect-ratio:9/16;transform:translateX(-50%)}
.app .pin{position:absolute;width:0;height:0;z-index:2}
.app .pin i{position:absolute;left:-6px;top:-6px;width:12px;height:12px;background:var(--ink2);box-shadow:0 0 0 2px rgba(0,0,0,.55),0 2px 6px rgba(0,0,0,.5)}
.app .pin.pk-egg i{background:var(--acc)}
.app .pin.pk-view i{background:var(--acc2)}
.app .pin.hot i{left:-9px;top:-9px;width:18px;height:18px;box-shadow:0 0 0 3px #fff,0 3px 10px rgba(0,0,0,.6)}
.app .pin.hot::before,.app .pin.hot::after{content:"";position:absolute;left:-9px;top:-9px;width:18px;height:18px;border:2px solid var(--acc);animation:pring 1.8s ease-out infinite}
.app .pin.hot::after{animation-delay:.9s}
@keyframes pring{0%{transform:scale(1);opacity:.95}100%{transform:scale(3.4);opacity:0}}
.app .mini .pin{transform:scale(.7)}
.app .mini .pin.hot::before,.app .mini .pin.hot::after{display:none}
.app .mpp .pin{opacity:.85}
.app .mpp .pin.hot{opacity:1;transform:scale(0);transition:transform .45s cubic-bezier(.3,1.4,.5,1) .15s}
.app .mpp.open .pin.hot{transform:scale(1)}
.app .mtop{position:absolute;left:0;right:0;top:0;height:calc(var(--sat) + 97px);padding:var(--sat) 14px 0 64px;background:linear-gradient(180deg,#0E0D0C 0%,rgba(14,13,12,.82) 62%,rgba(14,13,12,0));z-index:3}
.app .mtl{display:flex;align-items:center;gap:8px;height:44px}
.app .mtl b{font:600 20px/1 var(--fd);color:var(--ink)}
.app .mtl .mc{margin-left:auto;font:600 12px/1 var(--fm);color:var(--ink2)}
.app .mchips{display:flex;gap:8px;margin:6px 0 0 -52px;overflow:hidden}
.app .callout{position:absolute;left:12px;right:12px;bottom:calc(var(--sab) + 12px);display:flex;align-items:center;gap:12px;padding:10px 12px 10px 10px;background:#141210;border:1px solid var(--line);border-radius:4px;box-shadow:0 14px 34px -10px rgba(0,0,0,.7);z-index:4;transform:translateY(160%);transition:transform var(--dur) var(--ease) .25s}
.app .mpp.open .callout{transform:none}
.app .callout .cimg{flex:none;width:64px;height:64px;overflow:hidden}
.app .cox{flex:1;min-width:0}
.app .cox b{display:block;font:600 16px/1.2 var(--fd);color:var(--ink);margin-top:4px}
.app .cox span{display:block;font-size:12.5px;color:var(--ink2);margin-top:2px}
.app .callout>svg.i{color:var(--acc)}
/* toast */
.app .toast{position:absolute;left:50%;bottom:calc(var(--sab) + 22px);z-index:40;display:inline-flex;align-items:center;gap:8px;transform:translate(-50%,14px);opacity:0;padding:11px 16px;background:#F2EBDD;color:#0E0D0C;font:700 13.5px/1 var(--fb);white-space:nowrap;box-shadow:0 12px 30px -8px rgba(0,0,0,.6);transition:opacity .25s,transform .3s var(--ease);pointer-events:none}
.app .toast.show{opacity:1;transform:translate(-50%,0)}
.app .toast svg.i{width:17px;height:17px;color:var(--acc)}
/* press feedback (the prototype's .hov state, on real touch) */
.app .lc:active,.app .egg:active,.app .onmap:active,.app .tile:active{transform:scale(.985);filter:brightness(1.16)}
.app .chip:active,.app .sv:active,.app .x:active,.app .pbtn:active,.app .tbtn:active,.app .btn:active{transform:scale(.94)}
/* states the app needs that the prototype story never showed */
.app .empty{padding:28px 4px;color:var(--ink3);font-size:13.5px;text-align:center}
.app .skel{background:linear-gradient(90deg,var(--surf2),#24211e,var(--surf2));background-size:200% 100%;animation:skel 1.4s ease infinite}
@keyframes skel{to{background-position:-200% 0}}

/* ===== Pages 4 and 5 (decided 12 Nov), PORTED as-is: guides, cheat codes, bugs, news, saved, paywall,
   settings and about, easter-egg guides. Same class names and values as the design pages. ===== */
/* ---------- NEW components for these screens (move into src/ui/night.css when ported) ---------- */
.app .seg{display:flex;gap:3px;padding:3px;border:1px solid rgba(242,235,221,.3);border-radius:999px}
.app .seg>*{flex:1;height:34px;border-radius:999px;display:grid;place-items:center;font:700 13px/1 var(--fb);color:var(--ink2);transition:background .25s,color .25s,transform .15s}
.app .seg>*.on{background:#F2EBDD;color:#0E0D0C}
.app .lockp{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 7px;background:rgba(233,180,76,.16);color:var(--acc2);font:800 11px/1 var(--fb);letter-spacing:.08em;flex:none}
.app .lockp svg.i{width:12px;height:12px}
.app .freep{display:inline-flex;align-items:center;height:20px;padding:0 7px;background:#F2EBDD;color:#0E0D0C;font:800 11px/1 var(--fb);letter-spacing:.04em;flex:none}
.app .note{font-size:12.5px;color:var(--ink3);line-height:1.4;margin:8px 0 10px}
.app .code{padding:12px 0 13px;border-bottom:1px solid rgba(242,235,221,.09)}
.app .code .ct{display:flex;align-items:center;gap:8px}
.app .code .ct b{flex:1;min-width:0;font:600 16px/1.2 var(--fd);color:var(--ink)}
.app .code .cm{font-size:12px;color:var(--ink3);margin-top:4px}
.app .kbs{display:flex;flex-wrap:wrap;align-items:center;gap:5px;margin-top:9px;transition:opacity .25s}
.app .kb{min-width:30px;height:28px;padding:0 7px;display:inline-grid;place-items:center;border:1px solid rgba(242,235,221,.38);border-radius:6px;font:700 12.5px/1 var(--fb);color:var(--ink);background:rgba(242,235,221,.04)}
.app .kb.word{font:700 14px/1 "IBM Plex Mono",ui-monospace,monospace;letter-spacing:.08em;padding:0 10px}
.app .kbs.locked{filter:blur(5px);opacity:.55}
.app .copy{margin-left:auto;height:32px;padding:0 12px;border-radius:999px;box-shadow:inset 0 0 0 1px rgba(242,235,221,.38);display:inline-flex;align-items:center;gap:6px;font:700 12.5px/1 var(--fb);color:var(--ink);transition:transform .15s}
.app .copy svg.i{width:15px;height:15px}
.app .ach{display:inline-flex;align-items:center;height:20px;padding:0 7px;background:rgba(232,67,46,.14);color:#ff8a78;font:700 11px/1 var(--fb)}
.app .lrow{display:flex;gap:12px;align-items:center;padding:12px 0;border-bottom:1px solid rgba(242,235,221,.09);transition:transform .15s,filter .2s}
.app .lrow .th{position:relative;flex:none;width:96px;height:64px;overflow:hidden}
.app .lrow .rx{flex:1;min-width:0}
.app .lrow .rx b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font:600 15px/1.2 var(--fd);color:var(--ink)}
.app .lrow .rx span{display:block;font-size:12px;color:var(--ink3);margin-top:4px;line-height:1.35}
.app .lrow.locked .th img{opacity:.4}
.app .lrow .tags{display:flex;gap:6px;align-items:center;margin-top:6px}
.app .bst{display:inline-flex;align-items:center;height:20px;padding:0 7px;font:800 11px/1 var(--fb);letter-spacing:.04em}
.app .bst.workaround{background:rgba(233,180,76,.16);color:var(--acc2)}
.app .bst.confirmed{background:rgba(232,67,46,.16);color:#ff8a78}
.app .bst.fixed{background:rgba(120,200,140,.16);color:#9fdcae}
.app .bst.reported{background:rgba(150,150,150,.2);color:var(--ink2)}
.app .wa{border-left:3px solid var(--acc2);padding:8px 12px;margin:10px 0;background:rgba(233,180,76,.06);font-size:14px;line-height:1.45;color:var(--ink)}
.app .wa b{display:block;font:700 11px/1 var(--fb);letter-spacing:.12em;text-transform:uppercase;color:var(--acc2);margin-bottom:6px}
.app .metoo{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 14px;border-radius:999px;box-shadow:inset 0 0 0 1px rgba(242,235,221,.38);font:700 13.5px/1 var(--fb);color:var(--ink);transition:background .25s,color .25s,transform .15s}
.app .metoo.on{background:#F2EBDD;color:#0E0D0C}
.app .grp{display:flex;align-items:baseline;gap:8px;margin:16px 0 0;font:600 17px/1.2 var(--fd);color:var(--ink)}
.app .grp span{font:600 12px/1 var(--fm);color:var(--ink3)}
.app .procard{margin-top:16px;border:1px solid rgba(233,180,76,.45);padding:14px;background:rgba(233,180,76,.05)}
.app .procard b{display:block;font:600 17px/1.2 var(--fd);color:var(--ink)}
.app .procard p{margin:6px 0 12px;font-size:13px;line-height:1.45;color:var(--ink2)}
.app .cats{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px}
.app .cat{position:relative;height:84px;border:1px solid var(--line);overflow:hidden;transition:transform .15s,filter .2s}
.app .cat img{position:absolute;inset:0;opacity:.45}
.app .cat::before{content:"";position:absolute;inset:0;z-index:2;background:linear-gradient(90deg,rgba(14,13,12,.9),rgba(14,13,12,.4))}
.app .cat .tx{position:absolute;left:12px;bottom:10px;z-index:3}
.app .cat .tx b{display:block;font:600 18px/1.1 var(--fd);color:var(--ink)}
.app .cat .tx span{font-size:12px;color:var(--ink2);font-weight:600}
.app .howto{display:grid;gap:10px;margin:6px 0 14px}
.app .howto>div{border:1px solid var(--line);padding:10px 12px}
.app .howto>div>em{display:block;font:700 11px/1 var(--fb);font-style:normal;letter-spacing:.12em;text-transform:uppercase;color:var(--ink3);margin-bottom:8px}
.app .howto .kbs{margin-top:0}
/* paywall */
.app .pw{position:absolute;inset:0;overflow:hidden;background:var(--bg)}
.app .pw .pbtn.close{left:12px;top:var(--sat);background:rgba(242,235,221,.1);color:var(--ink)}
.app .pw h1{margin:0;font:600 32px/1.05 var(--fd);letter-spacing:-.02em;color:var(--ink)}
.app .pw .lead{margin:8px 0 14px;font-size:14.5px;line-height:1.45;color:var(--ink2)}
.app .feat{display:flex;gap:10px;align-items:flex-start;font-size:14px;line-height:1.35;color:var(--ink);padding:4px 0}
.app .feat svg.i{width:18px;height:18px;color:var(--acc);margin-top:1px}
.app .plans{display:grid;gap:10px;margin:14px 0 12px}
.app .plan{display:flex;align-items:center;gap:12px;padding:12px 14px;border:1px solid var(--line);transition:border-color .25s,box-shadow .25s,background .25s,transform .15s}
.app .plan.on{border-color:var(--acc2);box-shadow:0 0 0 2px var(--acc2);background:rgba(233,180,76,.06)}
.app .radio{flex:none;width:22px;height:22px;border-radius:50%;border:2px solid var(--ink3);transition:border .25s}
.app .plan.on .radio{border:7px solid var(--acc2)}
.app .plan .px{flex:1;min-width:0}
.app .plan .px b{display:block;font:700 15px/1.2 var(--fb);color:var(--ink)}
.app .plan .px span{display:block;font-size:12.5px;color:var(--ink2);margin-top:3px}
.app .plan .save{flex:none;height:22px;padding:0 8px;display:inline-flex;align-items:center;background:var(--acc2);color:#1a1205;font:800 11px/1 var(--fb)}
.app .pw .cta{width:100%;height:50px;font-size:15px}
.app .pw .restore{display:block;margin:12px auto 8px;text-align:center;font:700 13.5px/1 var(--fb);color:var(--ink);text-decoration:underline;text-underline-offset:3px}
.app .terms{font-size:11px;line-height:1.45;color:var(--ink3);text-align:center;margin:0}
.app .alwaysfree{display:flex;gap:8px;align-items:center;justify-content:center;font-size:12.5px;font-weight:700;color:var(--ink2);margin:0 0 10px}
.app .alwaysfree svg.i{width:16px;height:16px;color:var(--acc)}
.app .ptab{width:100%;border-collapse:collapse;font-size:13.5px;margin:10px 0 12px}
.app .ptab th{font:700 11px/1 var(--fb);letter-spacing:.12em;text-transform:uppercase;color:var(--ink3);text-align:center;padding:0 0 8px}
.app .ptab th:first-child{text-align:left}
.app .ptab td{padding:7px 0;border-top:1px solid rgba(242,235,221,.09);color:var(--ink)}
.app .ptab td+td{text-align:center;width:64px;color:var(--acc)}
.app .ptab td.no{color:var(--ink3)}
.app .ptab tr.pro td:first-child{font-weight:700}
.app .bens{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:12px 0}
.app .ben{position:relative;height:96px;overflow:hidden;border:1px solid var(--line)}
.app .ben img{position:absolute;inset:0;opacity:.55}
.app .ben::before{content:"";position:absolute;inset:0;z-index:2;background:linear-gradient(0deg,rgba(14,13,12,.95),rgba(14,13,12,.2))}
.app .ben b{position:absolute;left:8px;right:6px;bottom:8px;z-index:3;font:600 14px/1.15 var(--fd);color:var(--ink)}
.app .pills{display:flex;gap:8px;margin:10px 0 12px}
.app .pills>*{flex:1;padding:10px 8px;border:1px solid var(--line);text-align:center;transition:border-color .25s,box-shadow .25s,background .25s}
.app .pills>*.on{border-color:var(--acc2);box-shadow:0 0 0 2px var(--acc2);background:rgba(233,180,76,.06)}
.app .pills b{display:block;font:700 15px/1.2 var(--fb);color:var(--ink)}
.app .pills em{display:block;font-style:normal;font-size:12px;color:var(--ink2);margin-top:3px}
.app .sheet.low{height:auto}
/* settings and about */
.app .hubfoot{padding:14px 16px 120px}
.app .hubfoot .lrow{border-top:1px solid rgba(242,235,221,.09)}
.app .disc{margin:12px 0 0;font-size:12px;line-height:1.45;color:var(--ink3)}
.app .set{display:flex;align-items:center;gap:12px;min-height:56px;padding:8px 0;border-bottom:1px solid rgba(242,235,221,.09);transition:transform .15s,filter .2s}
.app .set>span:first-child{flex:1;min-width:0}
.app .set b{display:block;font:700 14.5px/1.25 var(--fb);color:var(--ink)}
.app .set em{display:block;font-style:normal;font-size:12.5px;line-height:1.35;color:var(--ink3);margin-top:3px}
.app .set>svg.i{color:var(--ink3)}
.app .set.danger b{color:#ff7a66}
.app .tog{flex:none;position:relative;width:50px;height:30px;border-radius:15px;background:rgba(242,235,221,.22);transition:background .25s}
.app .tog::after{content:"";position:absolute;left:3px;top:3px;width:24px;height:24px;border-radius:50%;background:#F2EBDD;transition:transform .25s}
.app .tog.on{background:var(--acc)}
.app .tog.on::after{transform:translateX(20px)}
.app .seg.mini{flex:none;width:168px}
.app .seg.mini>*{height:30px;font-size:12.5px;gap:4px;display:flex;align-items:center;justify-content:center}
.app .seg.mini .lockp{height:16px;padding:0 4px;font-size:11px}
.app .ver{margin:10px 0 0;font:600 12px/1.4 var(--fm);color:var(--ink3)}
.app .dsheet h4{margin:4px 0 10px;font:600 23px/1.15 var(--fd);color:var(--ink)}
.app .dsheet p{margin:0 0 10px;font-size:14px;line-height:1.5;color:var(--ink2)}
.app .dsheet .btn{width:100%;margin-top:8px}
.app .btn.danger{background:#c9361f;color:#fff}
.app .draftbar{display:flex;gap:8px;align-items:center;padding:10px 12px;margin:0 0 12px;background:rgba(233,180,76,.14);border-left:3px solid var(--acc2);font:700 12.5px/1.35 var(--fb);color:var(--acc2)}
.app .legal h2{margin:4px 0 8px;font:600 25px/1.12 var(--fd);color:var(--ink)}
.app .legal h3{margin:16px 0 6px;font:600 17px/1.2 var(--fd);color:var(--ink)}
.app .legal p,.app .legal li{font-size:14px;line-height:1.55;color:var(--ink2)}
.app .legal ul{margin:0;padding-left:18px}
/* app only: the real legal pages (generated from docs/legal/*.md) carry links, bold text and highlighted
   "to be filled in" parts that page 4's short peek didn't show */
.app .legal a{color:var(--acc2);text-underline-offset:2px}
.app .legal strong{color:var(--ink)}
.app .legal mark{background:rgba(233,180,76,.2);color:var(--ink);padding:0 2px}
.app .legal{-webkit-user-select:text;user-select:text}
/* easter-egg guides (page 5) */
.app .grow{display:flex;gap:12px;align-items:center;padding:12px 0;border-bottom:1px solid rgba(242,235,221,.09);transition:transform .15s,filter .2s}
.app .grow .th{position:relative;flex:none;width:96px;height:64px;overflow:hidden}
.app .grow .rx{flex:1;min-width:0}
.app .grow .rx b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font:600 15px/1.2 var(--fd);color:var(--ink)}
.app .grow .rx span{display:block;font-size:12px;color:var(--ink3);margin-top:4px;line-height:1.35}
.app .bar{height:4px;background:rgba(242,235,221,.15);margin-top:7px;overflow:hidden}
.app .bar i{display:block;height:100%;background:var(--acc2);transition:width .6s ease}
.app .nextp{display:inline-flex;align-items:center;height:20px;padding:0 7px;background:var(--acc2);color:#1a1205;font:800 11px/1 var(--fb);letter-spacing:.04em;flex:none}
.app .sample{display:inline-flex;align-items:center;height:20px;padding:0 7px;background:rgba(150,150,150,.22);color:var(--ink2);font:700 11px/1 var(--fb);letter-spacing:.04em}
.app .reqs{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 4px}
.app .req{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid rgba(242,235,221,.3);border-radius:999px;font:700 12.5px/1 var(--fb);color:var(--ink)}
.app .req svg.i{width:15px;height:15px;color:var(--acc2)}
.app .reward{display:flex;gap:8px;align-items:flex-start;font-size:13px;line-height:1.4;color:var(--ink2);margin:8px 0 2px}
.app .reward svg.i{width:16px;height:16px;color:var(--acc2);margin-top:1px}
.app .stepc{display:flex;gap:12px;padding:12px 0;border-bottom:1px solid rgba(242,235,221,.09)}
.app .stepc .n{flex:none;width:28px;height:28px;border-radius:50%;display:grid;place-items:center;font:italic 600 15px/1 var(--fd);color:#1a1205;background:var(--acc2)}
.app .stepc .sx2{flex:1;min-width:0}
.app .stepc p{margin:2px 0 8px;font-size:14px;line-height:1.45;color:var(--ink)}
.app .pinb{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 12px;border-radius:999px;box-shadow:inset 0 0 0 1px rgba(242,235,221,.38);font:700 12.5px/1 var(--fb);color:var(--ink);transition:transform .15s}
.app .pinb svg.i{width:15px;height:15px;color:var(--acc)}
.app .moment{display:flex;gap:10px;align-items:center;margin-top:8px;padding:8px;border:1px solid rgba(242,235,221,.2);transition:transform .15s,filter .2s}
.app .moment .mth{position:relative;flex:none;width:96px;height:54px;overflow:hidden}
.app .moment .mth .pl{position:absolute;inset:0;display:grid;place-items:center;z-index:2;color:#fff}
.app .moment b{display:block;font:700 13px/1.2 var(--fb);color:var(--ink)}
.app .moment span{display:block;font-size:12px;color:var(--ink3);margin-top:3px}
.app .foundbar{position:absolute;left:0;right:0;bottom:0;padding:10px 16px calc(var(--sab) + 6px);background:linear-gradient(0deg,#0E0D0C 70%,rgba(14,13,12,0));z-index:8}
.app .foundbar .btn{width:100%;height:50px;font-size:15px}
.app .ytp{position:relative;height:221px;overflow:hidden;background:#000}
.app .ytp .ybar{position:absolute;left:0;right:0;bottom:0;height:42px;padding:0 12px;display:flex;align-items:center;gap:10px;background:linear-gradient(0deg,rgba(0,0,0,.8),transparent);color:#fff;font:600 12px/1 Inter,system-ui,sans-serif;z-index:2}
.app .ytp .ybar svg{width:18px;height:18px;fill:#fff}
.app .ytp .prog{position:absolute;left:12px;right:12px;bottom:36px;height:3px;background:rgba(255,255,255,.3);z-index:2}
.app .ytp .prog i{position:absolute;left:0;top:0;bottom:0;width:0;background:#ff0033;transition:width linear}
.app .ytp .seg2{position:absolute;bottom:36px;height:3px;background:rgba(255,255,255,.55);z-index:2}
.app .ytp .yl{position:absolute;right:10px;top:10px;font:700 11px/1 Inter,sans-serif;color:rgba(255,255,255,.85);z-index:2}
.app .credit{font-size:12px;color:var(--ink3);margin:8px 0 0}
.app .mapz{position:relative;overflow:hidden;background:#0E0D0C}
.app .mapz .mapbox{position:absolute;aspect-ratio:9/16;transition:left .6s cubic-bezier(.3,.7,.2,1),top .6s cubic-bezier(.3,.7,.2,1)}
.app .spin{position:absolute;width:0;height:0;z-index:3}
.app .spin b{position:absolute;left:-13px;top:-13px;width:26px;height:26px;border-radius:50%;display:grid;place-items:center;background:var(--acc2);color:#1a1205;font:italic 700 13px/1 var(--fd);box-shadow:0 0 0 3px #0E0D0C,0 3px 8px rgba(0,0,0,.6)}
.app .spin.hot::before{content:"";position:absolute;left:-13px;top:-13px;width:26px;height:26px;border-radius:50%;border:2px solid var(--acc2);animation:pring 1.6s ease-out infinite}
.app .route{position:absolute;inset:0;z-index:2;pointer-events:none}
.app .tk{position:absolute;width:0;height:0;z-index:2}
.app .tk i{position:absolute;left:-5px;top:-5px;width:10px;height:10px;border-radius:50%;background:var(--acc2);box-shadow:0 0 0 2px rgba(0,0,0,.6)}
.app .tk.found i{background:#5d564c;box-shadow:0 0 0 2px rgba(0,0,0,.6)}
.app .tk.next i{left:-8px;top:-8px;width:16px;height:16px;box-shadow:0 0 0 3px #fff,0 2px 6px rgba(0,0,0,.6)}
.app .tk.just i{background:#9fdcae;left:-8px;top:-8px;width:16px;height:16px;box-shadow:0 0 0 3px #fff}
.app .trk{position:absolute;left:0;right:0;bottom:0;padding:14px 16px calc(var(--sab) + 10px);background:#141210;border-top:1px solid var(--line);z-index:4}
.app .trk .big{font:600 30px/1 var(--fd);color:var(--ink)}
.app .trk .big small{font:600 15px/1 var(--fb);color:var(--ink3);margin-left:4px}
.app .trk .row{display:flex;align-items:center;gap:10px}
.app .trk .lg{display:flex;gap:14px;margin-top:10px;font-size:12px;color:var(--ink2);font-weight:600}
.app .trk .lg span{display:inline-flex;align-items:center;gap:6px}
.app .trk .lg i{width:10px;height:10px;border-radius:50%;display:inline-block}
.app .sheetp{position:absolute;left:0;right:0;bottom:0;top:388px;background:#141210;border-radius:16px 16px 0 0;border-top:1px solid var(--line);z-index:4;overflow:hidden}
.app .sheetp .grab{margin:8px auto 6px}
.app .stepc.act{background:rgba(233,180,76,.07);margin:0 -16px;padding:12px 16px}
.app .tl{position:relative;padding-left:22px}
.app .tl::before{content:"";position:absolute;left:13px;top:12px;bottom:12px;width:2px;background:rgba(233,180,76,.35)}
.app .tl .stepc{border:0;padding:10px 0}
.app .tl .stepc .n{margin-left:-22px}
.app .tstamp{display:inline-flex;align-items:center;height:26px;padding:0 9px;margin-left:6px;border-radius:999px;background:rgba(255,0,51,.14);color:#ff8a9a;font:700 12px/1 var(--fb)}

.app .seg>*{cursor:pointer}
@media (prefers-reduced-motion:reduce){.app,.app *{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}
