@font-face{font-family:PlexAr;src:url(fonts/psa-arabic-400.woff2)format('woff2');font-weight:400;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+FB50-FDFF,U+FE70-FEFF}
@font-face{font-family:PlexAr;src:url(fonts/psa-latin-400.woff2)format('woff2');font-weight:400;font-display:swap}
@font-face{font-family:PlexAr;src:url(fonts/psa-arabic-500.woff2)format('woff2');font-weight:500;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+FB50-FDFF,U+FE70-FEFF}
@font-face{font-family:PlexAr;src:url(fonts/psa-latin-500.woff2)format('woff2');font-weight:500;font-display:swap}
@font-face{font-family:PlexAr;src:url(fonts/psa-arabic-600.woff2)format('woff2');font-weight:600;font-display:swap;unicode-range:U+0600-06FF,U+0750-077F,U+FB50-FDFF,U+FE70-FEFF}
@font-face{font-family:PlexAr;src:url(fonts/psa-latin-600.woff2)format('woff2');font-weight:600;font-display:swap}
@font-face{font-family:PlexMono;src:url(fonts/mono-400.woff2)format('woff2');font-weight:400;font-display:swap}
@font-face{font-family:PlexMono;src:url(fonts/mono-500.woff2)format('woff2');font-weight:500;font-display:swap}

:root{
  --canvas:#0A0B0D; --paper:#111317; --paper-2:#15181D;
  --line:#1E2127; --line-2:#282C34;
  --ink:#E8EAED; --dim:#8B9199; --faint:#575D66;
  --signal:#00E08A; --fail:#FF4D4D; --warn:#F5A623;
  --sans:PlexAr,"Segoe UI",system-ui,sans-serif;
  --mono:PlexMono,PlexAr,ui-monospace,"SF Mono",Menlo,monospace;
  --rail:52px; --river:clamp(360px,33vw,460px);
  --ease:cubic-bezier(.16,1,.3,1);
}
*,*::before,*::after{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;background:var(--canvas);color:var(--ink);
  font:400 14px/1.55 var(--sans);
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  overflow:hidden;
}
h1,h2,h3,p,dl,dd,ol,ul,figure{margin:0}
ol,ul{padding:0;list-style:none}
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
code{font-family:var(--mono);font-size:.92em}
.mono{font-family:var(--mono);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.dim{color:var(--dim)}
.sprite{position:absolute;width:0;height:0}
.ico{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:round;flex:none}
bdi{unicode-bidi:isolate}
:focus-visible{outline:1.5px solid var(--signal);outline-offset:2px;border-radius:2px}
::selection{background:rgba(0,224,138,.24)}

/* ── scrollbars: hairline, never chrome ── */
*::-webkit-scrollbar{width:9px;height:9px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:var(--line-2);border:3px solid var(--canvas);border-radius:9px}
*::-webkit-scrollbar-thumb:hover{background:#3A4049}

/* ═══ top rail ═══ */
.rail{
  height:var(--rail);display:flex;align-items:center;gap:18px;
  padding:0 18px;border-bottom:1px solid var(--line);background:var(--canvas);
}
.brand{display:flex;align-items:center;text-decoration:none;color:var(--ink)}
.brand img{display:block;height:22px;width:auto}
.brand-fb{font-size:19px;font-weight:600;letter-spacing:-.01em}
.rail-sp{flex:1}

.link{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--dim)}
.link-dot{width:7px;height:7px;border-radius:50%;background:var(--faint);flex:none}
.link[data-state=live] .link-dot{background:var(--signal);animation:breathe 2s var(--ease) infinite}
.link[data-state=live] .link-text{color:var(--signal)}
.link[data-state=down] .link-dot{background:var(--fail)}
.link[data-state=down] .link-text{color:var(--fail)}
@keyframes breathe{0%,100%{box-shadow:0 0 0 0 rgba(0,224,138,.45)}50%{box-shadow:0 0 0 5px rgba(0,224,138,0)}}

.rail-meta{display:flex;gap:20px}
.rail-meta>div{display:flex;align-items:baseline;gap:6px}
.rail-meta dt{font-size:13px;color:var(--faint)}
.rail-meta dd{font-size:13px;color:var(--dim);margin:0}
.env{
  font-size:13px;letter-spacing:.04em;color:var(--warn);
  border:1px solid rgba(245,166,35,.32);padding:2px 7px;border-radius:2px;
}
.btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:5px 10px;border-radius:3px;border:1px solid var(--line-2);color:var(--dim);transition:color .15s,border-color .15s,background .15s}
.btn:hover{color:var(--ink);border-color:#39404A;background:var(--paper)}
.btn-ghost{border-color:transparent}
.btn-ghost:hover{border-color:var(--line-2)}
.btn[disabled]{opacity:.45;cursor:not-allowed}
.btn-go{border-color:rgba(0,224,138,.4);color:var(--signal)}
.btn-go:hover{background:rgba(0,224,138,.08);border-color:var(--signal)}

/* الجولة is the one thing a cold-arriving client is told by name to press — every other
   header control is an outline, so a SOLID fill in the app's one saturated colour is what
   reads as "press this first" at a glance, on a small screen, in a header with five other
   things competing for it. The pulse ring (same breathing idiom as the live-connection dot
   above) draws the eye before he's read anything. */
#tourBtn{background:var(--signal);border-color:var(--signal);color:#04140D;font-weight:600;animation:tourPulse 2.4s var(--ease) infinite}
#tourBtn:hover{background:#00c67b;border-color:#00c67b;color:#04140D}
@keyframes tourPulse{0%,100%{box-shadow:0 0 0 0 rgba(0,224,138,.55)}50%{box-shadow:0 0 0 6px rgba(0,224,138,0)}}
@media (prefers-reduced-motion:reduce){#tourBtn{animation:none}}

/* ═══ split ═══ */
.split{display:flex;height:calc(100% - var(--rail))}

/* ═══ the river — the hero. bleeds to the viewport edge, no card ═══ */
.river{
  width:var(--river);flex:none;display:flex;flex-direction:column;
  border-inline-start:1px solid var(--line);background:var(--canvas);min-height:0;
}
.river-head{
  display:flex;align-items:baseline;justify-content:space-between;gap:10px;
  padding:13px 16px 11px;border-bottom:1px solid var(--line);
}
.river-head h2{font-size:13px;font-weight:600;letter-spacing:.01em}
.river-sub{font-size:13px;color:var(--faint)}
.river-list{flex:1;overflow-y:auto;overflow-x:hidden;min-height:0}
.river-empty{padding:26px 18px;font-size:13px;color:var(--dim);border-bottom:1px solid var(--line)}
.river-empty p+p{margin-top:5px;font-size:13px}
.river-list:not(:empty)+.river-empty{display:none}

.ev{
  display:grid;grid-template-columns:auto 1fr auto;gap:3px 10px;align-items:center;
  padding:8px 16px;border-bottom:1px solid var(--line);
  font-size:13px;cursor:pointer;transition:background .12s;
}
.ev:hover{background:var(--paper)}
.ev-code{font-family:var(--mono);font-size:12px;font-weight:500;color:var(--dim);letter-spacing:-.01em}
.ev.is-money .ev-code{color:var(--signal)}
.ev.is-fail .ev-code{color:var(--fail)}
.ev-msisdn{font-family:var(--mono);font-size:12.5px;color:var(--ink);font-variant-numeric:tabular-nums}
.ev-time{font-family:var(--mono);font-size:11.5px;color:var(--faint);font-variant-numeric:tabular-nums}
.ev-meta{grid-column:1/-1;display:flex;align-items:center;gap:7px;font-size:13px;color:var(--faint)}
.ev-move{font-size:13px}
.ev-amt{font-family:var(--mono);font-size:13px;color:var(--signal);font-variant-numeric:tabular-nums}
.ev-tag{font-size:13px;padding:0 5px;border-radius:2px;border:1px solid var(--line-2);color:var(--dim)}
.ev-tag.dup{color:var(--warn);border-color:rgba(245,166,35,.34)}
.ev-tag.bad{color:var(--fail);border-color:rgba(255,77,77,.34)}
@media (prefers-reduced-motion:no-preference){
  .ev.is-new{animation:land .6s var(--ease)}
  @keyframes land{from{background:rgba(0,224,138,.09)}to{background:transparent}}
}

/* ── fire bar, pinned under the river ── */
.fire{border-top:1px solid var(--line);padding:12px 16px 14px;background:var(--paper)}
.fire-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:9px}
.fire-head h3{font-size:13px;font-weight:600}
.fire-head .dim{font-size:13px}
.fire-codes{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}
.code{
  display:flex;flex-direction:column;gap:1px;align-items:flex-start;
  padding:6px 8px;border:1px solid var(--line-2);border-radius:3px;
  transition:border-color .15s,background .15s;text-align:start;
}
.code:hover{border-color:#3D444F;background:var(--paper-2)}
.code b{font-size:11.5px;font-weight:500;color:var(--dim)}
.code em{font-style:normal;font-size:13px;color:var(--faint)}
.code.is-money:hover{border-color:rgba(0,224,138,.5)}
.code.is-money:hover b{color:var(--signal)}
.code.is-fail:hover{border-color:rgba(255,77,77,.5)}
.code.is-fail:hover b{color:var(--fail)}
.code[disabled]{opacity:.4;cursor:wait}
.fire-opts{display:flex;flex-wrap:wrap;gap:12px;margin-top:9px}
.chk{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--dim);cursor:pointer}
.chk input{accent-color:var(--signal);width:13px;height:13px;margin:0}
.fire-out{margin-top:8px;font-size:13px;color:var(--faint);min-height:16px;font-family:var(--mono)}
.fire-out.ok{color:var(--signal)}
.fire-out.no{color:var(--fail)}

/* ═══ stage ═══ */
.stage{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0}
.views{display:flex;gap:2px;padding:0 22px;border-bottom:1px solid var(--line);flex:none}
.view-tab{
  padding:12px 12px 11px;font-size:13.5px;color:var(--faint);
  border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s,border-color .15s;
}
.view-tab:hover{color:var(--dim)}
.view-tab.is-on{color:var(--ink);border-bottom-color:var(--signal)}
.stage-body{flex:1;overflow-y:auto;min-height:0;padding:20px 22px 40px}

/* ── the status line: a line, not a row of KPI cards ── */
.statline{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:0 2px;
  padding-bottom:16px;border-bottom:1px solid var(--line);
}
.stat{display:flex;align-items:baseline;gap:6px;padding:0 14px;border-inline-start:1px solid var(--line)}
.stat:first-child{padding-inline-start:0;border-inline-start:0}
.stat b{font-family:var(--mono);font-size:20px;font-weight:400;font-variant-numeric:tabular-nums;letter-spacing:-.02em;color:var(--ink)}
.stat span{font-size:13px;color:var(--faint)}
.stat.money b{color:var(--signal)}
.stat.bad b{color:var(--fail)}
.stat u{text-decoration:none;font-family:var(--mono);font-size:13px;color:var(--faint)}

.sec{margin-top:26px}
.sec-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px}
.sec-head h3{font-size:13px;font-weight:600;color:var(--ink)}
.sec-head p{font-size:13px;color:var(--faint)}

/* ── the no-auth notice: a hairline line, not an alert card ── */
.notice{
  display:flex;gap:10px;align-items:flex-start;
  padding:11px 0 0;margin-top:14px;border-top:1px solid var(--line);
  font-size:13px;color:var(--dim);line-height:1.6;
}
.notice .ico{width:15px;height:15px;color:var(--warn);margin-top:2px}
.notice b{color:var(--ink);font-weight:500}

/* ── chart ── */
.chart{width:100%;height:168px;display:block;overflow:visible}
.chart .bar{fill:var(--line-2);transition:fill .15s}
.chart .bar.hot{fill:var(--signal);fill-opacity:.85}
.chart .grid{stroke:var(--line);stroke-width:1}
.chart .lbl{fill:var(--faint);font:400 10px var(--mono)}
.chart .ln{fill:none;stroke:var(--ink);stroke-width:1.4;stroke-opacity:.5}

/* ── distribution bar ── */
/* ── the lifecycle machine ── */
.mach{display:flex;flex-direction:column;gap:14px}
.mrow{display:flex;align-items:stretch}
/* The branch hugs the start edge instead of stretching: with elastic connectors it spanned the
   full width and parked its نشط back-reference underneath مسترجع, implying a link that does not
   exist. Fixed-width connectors keep it under roughly the right part of the spine. */
.mrow.is-branch{justify-content:flex-start}
.mrow.is-branch .mconn{flex:0 0 auto;min-width:118px}

.mnode{
  flex:0 0 auto;min-width:96px;padding:9px 13px;border:1px solid var(--line);border-radius:9px;
  background:var(--paper);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
}
.mnode-n{font-size:19px;font-family:var(--mono);font-weight:400;font-variant-numeric:tabular-nums;color:var(--ink);line-height:1.15}
.mnode-l{font-size:13px;color:var(--faint);white-space:nowrap}
.mnode.ACTIVE{border-color:rgba(0,224,138,.3)}
.mnode.ACTIVE .mnode-n{color:var(--signal)}
.mnode.GRACE .mnode-n{color:var(--warn)}
.mnode.is-entry{border-style:dashed;background:transparent}
.mnode.is-entry .mnode-n{color:var(--line-2)}
.mnode.is-ghost{opacity:.45}
/* the destination card takes the hit — a ring that expands and fades, so the eye is pulled to
   where the subscriber ENDED UP rather than to the arrow it travelled */
.mnode.is-hit{border-color:var(--signal);animation:mhit 1.4s cubic-bezier(.2,.7,.3,1)}
@keyframes mhit{
  0%{box-shadow:0 0 0 0 rgba(0,224,138,.5)}
  100%{box-shadow:0 0 0 15px rgba(0,224,138,0)}
}

.mconn{
  flex:1 1 auto;min-width:88px;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:4px;padding:0 8px;
}
.mconn-code{font-size:12px;font-family:var(--mono);color:var(--faint);letter-spacing:-.01em;line-height:1}
.mconn-ar{font-size:13px;color:var(--line-2);white-space:nowrap;line-height:1}
.mconn-line{position:relative;display:block;width:100%;height:1px;background:var(--line-2)}
/* dir=rtl makes the row flow right-to-left, so the arrowhead belongs at the inline END */
.mconn-line::after{
  content:"";position:absolute;inset-inline-end:0;top:-3px;width:0;height:0;
  border-block:3.5px solid transparent;border-inline-start:6px solid var(--line-2);
}
.mconn.is-money .mconn-line,
.mconn.is-money .mconn-line::after{background:rgba(0,224,138,.5);border-inline-start-color:rgba(0,224,138,.5)}
.mconn.is-money .mconn-code{color:var(--signal)}
.mconn.is-money .mconn-ar{color:rgba(0,224,138,.7)}
.mconn.is-live .mconn-line{background:var(--signal);box-shadow:0 0 9px rgba(0,224,138,.65)}
.mconn.is-live .mconn-line::after{border-inline-start-color:var(--signal)}
.mconn.is-live .mconn-code,.mconn.is-live .mconn-ar{color:var(--signal)}

.mach-note{font-size:13px;color:var(--faint);line-height:1.9}
.mach-note code{color:var(--dim)}

/* On a phone the flow restacks vertically: the arrow turns to point down and each code sits
   beside it. Nothing is dropped — the same six transitions, read top to bottom. */
@media (max-width:760px){
  .mrow{flex-direction:column;align-items:stretch}
  .mnode{width:100%;flex-direction:row;justify-content:space-between;padding:11px 14px}
  .mnode-l{font-size:13px}
  .mconn{flex-direction:row;justify-content:flex-start;gap:10px;padding:6px 18px;min-height:38px}
  .mconn-line{width:1px;height:26px;flex:none}
  .mconn-line::after{
    inset-inline-end:auto;inset-inline-start:-3px;top:auto;bottom:-1px;
    border-block:0;border-inline:3.5px solid transparent;border-top:6px solid var(--line-2);
  }
  .mconn.is-money .mconn-line::after,
  .mconn.is-live .mconn-line::after{border-top-color:var(--signal)}
}

/* ── tables: hairlines only ── */
.tbl{width:100%;border-collapse:collapse;font-size:13px}
.tbl th{
  text-align:start;font-size:13px;font-weight:500;color:var(--faint);
  padding:0 12px 8px;border-bottom:1px solid var(--line);white-space:nowrap;
}
.tbl th:first-child,.tbl td:first-child{padding-inline-start:0}
.tbl td{padding:9px 12px;border-bottom:1px solid var(--line);vertical-align:middle}
.tbl tbody tr{cursor:pointer;transition:background .12s}
.tbl tbody tr:hover{background:var(--paper)}
.tbl .num{font-family:var(--mono);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.tbl .money{color:var(--signal)}
.tbl-wrap{overflow-x:auto}

.state{display:inline-flex;align-items:center;gap:6px;font-size:13px;white-space:nowrap}
.state::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--faint);flex:none}
.state.ACTIVE{color:var(--ink)} .state.ACTIVE::before{background:var(--signal)}
.state.PENDING{color:var(--dim)} .state.PENDING::before{background:var(--dim)}
.state.GRACE{color:var(--warn)} .state.GRACE::before{background:var(--warn)}
.state.BLOCKED{color:var(--faint)} .state.BLOCKED::before{background:var(--faint)}
.state.RECYCLED{color:var(--faint)} .state.RECYCLED::before{background:transparent;box-shadow:inset 0 0 0 1px var(--faint)}

/* ── filters ── */
.filters{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:14px}
.seg{display:flex;border:1px solid var(--line-2);border-radius:3px;overflow:hidden}
.seg button{padding:5px 11px;font-size:13px;color:var(--faint);border-inline-start:1px solid var(--line-2);transition:color .15s,background .15s}
.seg button:first-child{border-inline-start:0}
.seg button:hover{color:var(--dim);background:var(--paper)}
.seg button.is-on{color:var(--ink);background:var(--paper-2)}
.search{display:flex;align-items:center;gap:7px;border:1px solid var(--line-2);border-radius:3px;padding:0 9px;min-width:190px}
.search .ico{color:var(--faint)}
.search input{flex:1;background:none;border:0;outline:0;color:var(--ink);font:400 13px var(--mono);padding:6px 0;min-width:0}
.search input::placeholder{color:var(--faint);font-family:var(--sans);font-size:13px}

.empty{padding:34px 0;text-align:center;color:var(--faint);font-size:13px}

/* ── reconciliation ── */
.recon-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:0}
.recon-cell{padding:12px 16px;border-inline-start:1px solid var(--line)}
.recon-cell:first-child{padding-inline-start:0;border-inline-start:0}
.recon-cell dt{font-size:13px;color:var(--faint);margin-bottom:3px}
.recon-cell dd{margin:0;font-family:var(--mono);font-size:18px;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.recon-cell dd.ok{color:var(--signal)} .recon-cell dd.no{color:var(--fail)}
.kind{font-size:13px;font-family:var(--mono);padding:1px 6px;border-radius:2px;border:1px solid var(--line-2);color:var(--dim);white-space:nowrap}
.kind.MISSING_OURS{color:var(--fail);border-color:rgba(255,77,77,.34)}
.kind.MISSING_THEIRS{color:var(--warn);border-color:rgba(245,166,35,.34)}
.kind.PRICE_MISMATCH{color:var(--warn);border-color:rgba(245,166,35,.34)}

/* ── drawer ── */
.drawer{position:fixed;inset:0;z-index:40}
.drawer[hidden]{display:none}
.drawer-scrim{position:absolute;inset:0;background:rgba(5,6,8,.62);animation:fade .2s var(--ease)}
.drawer-panel{
  position:absolute;inset-block:0;inset-inline-start:0;width:min(460px,92vw);
  background:var(--paper);border-inline-end:1px solid var(--line-2);
  display:flex;flex-direction:column;box-shadow:0 0 0 1px rgba(0,0,0,.4),-24px 0 48px -24px rgba(0,0,0,.8);
  animation:slide .28s var(--ease);
}
@keyframes fade{from{opacity:0}to{opacity:1}}
@keyframes slide{from{transform:translateX(12%);opacity:0}to{transform:none;opacity:1}}
@media (prefers-reduced-motion:reduce){.drawer-scrim,.drawer-panel{animation:none}}
.drawer-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 18px;border-bottom:1px solid var(--line)}
.drawer-head h2{font-size:15px;font-weight:500;font-variant-numeric:tabular-nums}
.drawer-body{flex:1;overflow-y:auto;padding:16px 18px 34px}
.dl{display:grid;grid-template-columns:auto 1fr;gap:7px 16px;font-size:13px;margin-bottom:20px}
.dl dt{color:var(--faint);white-space:nowrap}
.dl dd{margin:0;font-family:var(--mono);font-variant-numeric:tabular-nums}

.tl{position:relative;padding-inline-start:16px}
.tl::before{content:"";position:absolute;inset-block:5px 5px;inset-inline-start:3px;width:1px;background:var(--line)}
.tl li{position:relative;padding-bottom:15px}
.tl li::before{content:"";position:absolute;inset-inline-start:-16px;top:5px;width:7px;height:7px;border-radius:50%;background:var(--faint);box-shadow:0 0 0 3px var(--paper)}
.tl li.money::before{background:var(--signal)}
.tl li.bad::before{background:var(--fail)}
.tl-top{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.tl-code{font-family:var(--mono);font-size:12.5px;color:var(--ink)}
.tl-at{font-family:var(--mono);font-size:11.5px;color:var(--faint);font-variant-numeric:tabular-nums}
.tl-note{font-size:13px;color:var(--dim);margin-top:2px}

/* ── toast ── */
.toast{
  position:fixed;inset-block-end:20px;inset-inline-start:50%;transform:translate(50%,12px);
  background:var(--paper-2);border:1px solid var(--line-2);border-radius:3px;
  padding:9px 15px;font-size:13px;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s var(--ease);z-index:60;
}
.toast.on{opacity:1;transform:translate(50%,0)}

/* ── guided tour ── one small positioned div's own box-shadow both cuts the spotlight AND
   dims the rest of the viewport, so no separate full-page scrim element exists at all (see
   tour.js). Both start invisible and fade in only once tour.js has positioned them, or a
   freshly-appended, not-yet-positioned div would flash full-dark for a frame. */
.tour-hole{
  position:fixed;z-index:80;pointer-events:none;border-radius:8px;opacity:0;
  box-shadow:0 0 0 9999px rgba(5,6,8,.76);
  transition:top .22s var(--ease),left .22s var(--ease),width .22s var(--ease),height .22s var(--ease),opacity .18s;
}
.tour-pop{
  position:fixed;z-index:81;width:min(320px,86vw);opacity:0;
  background:var(--paper-2);border:1px solid var(--line-2);border-radius:8px;
  box-shadow:0 0 0 1px rgba(0,0,0,.4),0 18px 40px -16px rgba(0,0,0,.7);
  padding:14px 16px;
  transition:top .22s var(--ease),left .22s var(--ease),opacity .18s;
}
.tour-pop-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}
.tour-pop-step{font-size:13px;color:var(--faint)}
.tour-pop-close{display:flex;color:var(--faint);padding:3px;border-radius:3px;transition:color .15s,background .15s}
.tour-pop-close:hover{color:var(--ink);background:var(--paper)}
.tour-pop h3{font-size:15px;font-weight:600;color:var(--ink);margin-bottom:6px}
.tour-pop p{font-size:13.5px;color:var(--dim);line-height:1.7;margin-bottom:13px}
.tour-pop-nav{display:flex;align-items:center;justify-content:space-between;gap:10px}
.tour-pop-skip{font-size:13px;color:var(--faint);transition:color .15s}
.tour-pop-skip:hover{color:var(--dim)}
.tour-pop-btns{display:flex;gap:6px}
.tour-pop-btns .btn{min-width:60px;justify-content:center}
@media (max-width:480px){.tour-pop{width:min(300px,88vw);padding:12px 14px}}
@media (prefers-reduced-motion:reduce){.tour-hole,.tour-pop{transition:opacity .18s}}

/* ═══ responsive: the river moves above the stage on narrow screens ═══ */
@media (max-width:1080px){:root{--river:min(38vw,400px)}.rail-meta{display:none}}
@media (max-width:880px){
  body{overflow:auto}
  .rail{position:sticky;top:0;z-index:30;gap:12px;padding:0 12px}
  .env{display:none}
  .split{flex-direction:column;height:auto}
  .river{width:auto;border-inline-start:0;border-bottom:1px solid var(--line)}
  .river-list{max-height:44vh}
  .fire-codes{grid-template-columns:repeat(2,1fr)}
  .stage-body{padding:16px 14px 40px}
  .views{padding:0 14px;overflow-x:auto}
  .statline{gap:0}
  .stat{padding:6px 12px}
  .stat:first-child{padding-inline-start:0}
}
@media (max-width:560px){
  .stat b{font-size:17px}
  .fire-codes{grid-template-columns:repeat(2,1fr)}
  .drawer-panel{width:100vw}
}
/* The subscriber table is 7 columns and ~623px wide, so on a phone it became a sideways-scrolling
   slab of desktop inside its overflow container. The client will open this on a phone first, so
   drop to the three columns that answer "who, what state, how much" — المشغّل / تجديدات / إخفاقات
   / آخر خصم all live in the row's drawer, one tap away, so nothing is actually lost. */
@media (max-width:480px){
  .tbl-subs th:nth-child(3),.tbl-subs td:nth-child(3),
  .tbl-subs th:nth-child(5),.tbl-subs td:nth-child(5),
  .tbl-subs th:nth-child(6),.tbl-subs td:nth-child(6),
  .tbl-subs th:nth-child(7),.tbl-subs td:nth-child(7){display:none}
  .tbl th,.tbl td{padding-inline:8px}
}
