/* ===========================================================================
   IntellectAds admin — design system
   ---------------------------------------------------------------------------
   Direction: PRECISION INSTRUMENT. This panel is read all day by operators
   scanning conversions, payouts and fraud counts. So: high density, tabular
   numerals, one sharp accent, and no decoration that competes with data.
   Built on the existing brand navy (#001E40) and orange (#e36d05) so the
   logo sits naturally rather than fighting a new palette.

   Layer order:  tokens -> reset -> layout -> components -> legacy bridge
   The legacy bridge restyles the old .adminlist/.adminheading/.adminform
   class names, so ~100 unported pages inherit the new look untouched.
   =========================================================================== */

/* ---------------------------------------------------------------- tokens -- */
:root {
  /* brand */
  --navy-900:#00152d; --navy-800:#001E40; --navy-700:#0a2c55; --navy-600:#14406f;
  --amber-600:#c25a04; --amber-500:#e36d05; --amber-400:#f5893a;

  /* neutrals (cool, so the navy reads as deliberate) */
  --n-0:#ffffff;  --n-25:#fbfcfd; --n-50:#f5f7fa; --n-100:#eceff4;
  --n-200:#dde2ea; --n-300:#c3cbd7; --n-400:#95a1b3; --n-500:#6b7789;
  --n-600:#4c5666; --n-700:#333c49; --n-800:#212831; --n-900:#141920;

  /* semantic */
  --ok-bg:#e7f6ec;   --ok-fg:#1a7f3c;   --ok-bd:#b7e3c6;
  --warn-bg:#fff6e0; --warn-fg:#9a6700; --warn-bd:#f0dca8;
  --bad-bg:#fdecec;  --bad-fg:#b3261e;  --bad-bd:#f3c6c3;
  --info-bg:#e8f1fd; --info-fg:#14406f; --info-bd:#c2d8f2;

  /* surfaces */
  --bg:var(--n-50); --surface:var(--n-0); --surface-2:var(--n-25);
  --border:var(--n-200); --border-strong:var(--n-300);
  --text:var(--n-800); --text-dim:var(--n-500); --text-mute:var(--n-400);
  --accent:var(--amber-500); --accent-ink:#ffffff;
  --link:var(--navy-600);

  /* type — tabular figures are non-negotiable for money/count columns */
  --font: ui-sans-serif, "Segoe UI Variable Text", "Segoe UI", Roboto,
          "Helvetica Neue", Arial, sans-serif;
  --mono: ui-monospace, "SF Mono", "Cascadia Mono", "Segoe UI Mono",
          "Roboto Mono", Menlo, Consolas, monospace;
  --fs-xs:11px; --fs-sm:12px; --fs-md:13px; --fs-lg:15px; --fs-xl:19px; --fs-2xl:24px;

  /* space — 4px base */
  --s-1:4px; --s-2:8px; --s-3:12px; --s-4:16px; --s-5:20px; --s-6:24px; --s-8:32px;

  --r-sm:6px; --r-md:9px; --r-lg:14px; --r-xl:18px; --r-pill:999px;
  --sh-1:0 1px 2px rgba(16,24,40,.04), 0 1px 3px rgba(16,24,40,.05);
  --sh-2:0 4px 12px rgba(16,24,40,.10);
  --sh-3:0 12px 32px rgba(16,24,40,.16);
  --ring:0 0 0 3px rgba(227,109,5,.28);

  --row-h:44px;           /* compact default; density toggle changes it */
  --topbar-h:60px;
  --side-w:236px;
}

/* Dark is opt-in via the topbar toggle (data-theme on <html>). Operators on
   night shift asked for it in every ops tool I've seen; it costs one block. */
:root[data-theme="dark"] {
  --bg:#0d1117; --surface:#141a22; --surface-2:#1a212b;
  --border:#252d38; --border-strong:#333d4b;
  --text:#e6edf3; --text-dim:#9aa7b6; --text-mute:#6e7d8f;
  --link:#7db3ff;
  --ok-bg:#0f2a1a; --ok-fg:#7ee2a0; --ok-bd:#1e4630;
  --warn-bg:#2b220b; --warn-fg:#f0c674; --warn-bd:#4a3a12;
  --bad-bg:#2c1416; --bad-fg:#ff9a92; --bad-bd:#4d2225;
  --info-bg:#0f2033; --info-fg:#9ec5f5; --info-bd:#1d3a5c;
  --sh-1:0 1px 2px rgba(0,0,0,.4); --sh-2:0 4px 12px rgba(0,0,0,.5);
  --sh-3:0 12px 32px rgba(0,0,0,.6);
}

/* ----------------------------------------------------------------- reset -- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0; background:var(--bg); color:var(--text);
  font-family:var(--font); font-size:var(--fs-md); line-height:1.45;
  -webkit-font-smoothing:antialiased;
}
a{color:var(--link); text-decoration:none}
a:hover{text-decoration:underline}
img{max-width:100%}

/* Numbers must line up. Applied broadly, then reinforced on numeric cells. */
table,input,select,textarea,.num{font-variant-numeric:tabular-nums; font-feature-settings:"tnum" 1}

/* ----------------------------------------------------------------- icons -- */
/* Vendored Lucide sprite (assets/icons.svg, inlined by layout.html). The sprite
   groups carry geometry only; stroke/fill are inherited from here, so a single
   class themes every icon and they follow currentColor. */
.ic{
  display:inline-block; vertical-align:-.15em; flex:none;
  fill:none; stroke:currentColor;
  stroke-width:2; stroke-linecap:round; stroke-linejoin:round;
}
.ic--thin{stroke-width:1.5}

/* ---------------------------------------------------------------- layout -- */
.topbar{
  position:sticky; top:0; z-index:60; height:var(--topbar-h);
  display:flex; align-items:center; gap:var(--s-4);
  padding:0 var(--s-4); color:#fff;
  background:linear-gradient(180deg,var(--navy-800),var(--navy-900));
  border-bottom:1px solid rgba(255,255,255,.08);
  box-shadow:var(--sh-1);
}
.topbar__logo img{height:26px; display:block}
.topbar__spacer{flex:1}
.topbar__nav{display:flex; gap:var(--s-1); align-items:center}
.topbar__link{
  color:#c9d6e6; padding:6px 10px; border-radius:var(--r-sm);
  font-size:var(--fs-sm); font-weight:500; white-space:nowrap;
}
.topbar__link:hover{background:rgba(255,255,255,.10); color:#fff; text-decoration:none}
.topbar__link--accent{background:var(--amber-500); color:#fff}
.topbar__link--accent:hover{background:var(--amber-400)}

/* width:100% is REQUIRED here: this is a flex child in a column container, and
   `margin:0 auto` cancels the default stretch, collapsing it to min-content. */
.page{width:100%; max-width:1680px; margin:0 auto; padding:var(--s-5) var(--s-4) var(--s-8)}
.crumb{
  display:flex; align-items:center; gap:var(--s-2);
  font-size:var(--fs-xs); color:var(--text-dim); margin-bottom:var(--s-3);
  text-transform:uppercase; letter-spacing:.06em;
}
.crumb a{color:var(--text-dim)}
.page-head{
  display:flex; align-items:flex-end; justify-content:space-between;
  gap:var(--s-4); margin-bottom:var(--s-4); flex-wrap:wrap;
}
.page-title{
  margin:0; font-size:var(--fs-2xl); font-weight:650; letter-spacing:-.02em;
  color:var(--text); display:flex; align-items:center; gap:var(--s-3);
}
/* The one deliberate flourish: a short accent rule under the page title. */
.page-title::after{
  content:""; flex:0 0 28px; height:3px; border-radius:2px;
  background:linear-gradient(90deg,var(--amber-500),transparent);
}

.card{
  background:var(--surface); border:1px solid var(--border);
  border-radius:var(--r-lg); box-shadow:var(--sh-1);
}
.card__head{
  padding:var(--s-3) var(--s-4); border-bottom:1px solid var(--border);
  display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap;
}
.card__body{padding:var(--s-4)}
.card__foot{padding:var(--s-3) var(--s-4); border-top:1px solid var(--border)}
.card__t{font-weight:650; font-size:var(--fs-sm); letter-spacing:.01em}

/* kv is the read-only detail sheet used by the portal "details" screens —
   label/value pairs that are prose, not tabular data, so they deliberately do
   NOT get the .data table treatment (no sorting, no column picker). */
.kv{width:100%; border-collapse:collapse; font-size:var(--fs-sm)}
.kv th{
  width:210px; text-align:left; vertical-align:top; font-weight:600;
  color:var(--text-dim); padding:8px var(--s-4) 8px 0; white-space:nowrap;
}
.kv td{padding:8px 0; vertical-align:top; overflow-wrap:anywhere; word-break:break-word}
.kv tr + tr th,.kv tr + tr td{border-top:1px solid var(--border)}

/* rowform is an edit-in-place form living inside a table cell. */
.rowform{display:flex; gap:var(--s-2); align-items:center; margin:0}
.rowform input[type=text]{flex:1; min-width:220px}

/* macros is the collapsible token reference on the piggyback-pixel screen. */
.macros{
  margin-top:var(--s-3); border:1px solid var(--border); border-radius:var(--r-lg);
  background:var(--surface-2); padding:var(--s-3) var(--s-4);
}
.macros > summary{cursor:pointer; font-weight:650; font-size:var(--fs-sm)}
.macros__list{
  list-style:none; padding:var(--s-3) 0 0; margin:0;
  display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr));
  gap:6px var(--s-4); font-size:var(--fs-sm); color:var(--text-dim);
}
.macros__list b{color:var(--text); font-family:ui-monospace,SFMono-Regular,Menlo,monospace}

/* jump-to-page control that sits inside .pager */
.pager__jump{display:flex; align-items:center; gap:6px; margin-left:auto}
.pager__jump label{color:var(--text-dim)}
.pager__jump input[type=number]{width:70px}
.pager__count{color:var(--text-dim)}

/* statline is the summary strip some reports print under their filter bar. */
.statline{
  display:flex; flex-wrap:wrap; gap:var(--s-2) var(--s-5);
  margin-top:var(--s-3); padding-top:var(--s-3);
  border-top:1px solid var(--border); font-size:var(--fs-sm); color:var(--text-dim);
}
.statline b{color:var(--text); font-weight:650}

/* a short explanation printed alongside the controls in a .filterbar */
.filterbar__note{color:var(--text-dim); font-size:var(--fs-xs)}

/* ------------------------------------------------------------ components -- */
.btn{
  display:inline-flex; align-items:center; gap:6px; cursor:pointer;
  padding:7px 13px; border-radius:var(--r-md);
  border:1px solid var(--border-strong); background:var(--surface); color:var(--text);
  font:inherit; font-size:var(--fs-sm); font-weight:550; line-height:1.2;
  transition:background .12s ease, border-color .12s ease, transform .06s ease;
}
.btn:hover{background:var(--n-100); text-decoration:none}
:root[data-theme="dark"] .btn:hover{background:var(--surface-2)}
.btn:active{transform:translateY(1px)}
.btn:focus-visible{outline:none; box-shadow:var(--ring)}
.btn--primary{background:var(--amber-500); border-color:var(--amber-600); color:var(--accent-ink)}
.btn--primary:hover{background:var(--amber-400)}
.btn--ghost{background:transparent; border-color:transparent; color:var(--text-dim)}
.btn--ghost:hover{background:var(--n-100); color:var(--text)}
:root[data-theme="dark"] .btn--ghost:hover{background:var(--surface-2)}
.btn--sm{padding:4px 9px; font-size:var(--fs-xs)}
.btn--danger{color:var(--bad-fg); border-color:var(--bad-bd); background:var(--bad-bg)}

.input,.select,textarea,
input[type=text],input[type=search],input[type=date],input[type=number],
input[type=password],input[type=email],select,textarea{
  padding:7px 10px; border:1px solid var(--border-strong); border-radius:var(--r-md);
  background:var(--surface); color:var(--text);
  font:inherit; font-size:var(--fs-sm); max-width:100%;
  transition:border-color .12s ease, box-shadow .12s ease;
}
input:focus,select:focus,textarea:focus{outline:none; border-color:var(--amber-500); box-shadow:var(--ring)}
input[type=search]{-webkit-appearance:none}
label{font-size:var(--fs-sm); color:var(--text-dim)}

.badge{
  display:inline-flex; align-items:center; gap:4px;
  padding:2px 8px; border-radius:999px; font-size:var(--fs-xs); font-weight:600;
  border:1px solid var(--border); background:var(--n-100); color:var(--text-dim);
  white-space:nowrap;
}
.badge--ok{background:var(--ok-bg); color:var(--ok-fg); border-color:var(--ok-bd)}
.badge--warn{background:var(--warn-bg); color:var(--warn-fg); border-color:var(--warn-bd)}
.badge--bad{background:var(--bad-bg); color:var(--bad-fg); border-color:var(--bad-bd)}
.badge--info{background:var(--info-bg); color:var(--info-fg); border-color:var(--info-bd)}

.note{
  padding:var(--s-3) var(--s-4); border-radius:var(--r-md);
  border:1px solid var(--info-bd); background:var(--info-bg); color:var(--info-fg);
  font-size:var(--fs-sm);
}
/* Copy field — a readonly value the operator is meant to take away, with the
   copy button attached. Used for publisher tracking URLs and pixel snippets,
   where selecting a long URL by hand is the failure mode. */
.copyfield{display:flex; gap:6px; align-items:center; max-width:100%}
.copyfield input{flex:1 1 auto; min-width:0; font-family:var(--mono,ui-monospace,SFMono-Regular,Menlo,monospace); font-size:12px}
.copyfield .btn{flex:0 0 auto}

/* On/off switch used in list rows. It is a link, so it works with keyboard
   navigation and without JavaScript; the confirm sits on top as an onclick.
   The knob is a child of the track and positioned against it — as a sibling
   nudged by a negative margin it had no positioning context and floated off to
   the left of the pill. */
.wtog{display:inline-flex; align-items:center; gap:8px; text-decoration:none; color:inherit;
  line-height:1; cursor:pointer}
.wtog__track{position:relative; flex:0 0 auto; width:34px; height:19px; border-radius:999px;
  background:var(--muted,#94a3b8); opacity:.55; transition:background .18s ease, opacity .18s ease}
.wtog__knob{position:absolute; top:2px; left:2px; width:15px; height:15px; border-radius:50%;
  background:#fff; box-shadow:0 1px 3px rgba(0,0,0,.35); transition:transform .18s ease}
.wtog__txt{font-size:12px; font-weight:600; color:var(--muted)}
.wtog.is-on .wtog__track{background:#16a34a; opacity:1}
.wtog.is-on .wtog__knob{transform:translateX(15px)}
.wtog.is-on .wtog__txt{color:#16a34a}
.wtog:hover .wtog__track{opacity:1}
.wtog:focus-visible{outline:2px solid var(--accent,#e36d05); outline-offset:3px; border-radius:999px}

/* Action row on a webhook's child screens, so none of them is a dead end. */
.whbar{display:flex; flex-wrap:wrap; gap:6px; align-items:center; margin-bottom:10px}
.whbar .btn.is-active{background:var(--accent,#e36d05); color:#fff; border-color:transparent}

/* Breadcrumb links read as navigation rather than body text. */
.crumbs a,.pathway a{color:inherit; text-decoration:none}
.crumbs a:hover,.pathway a:hover{text-decoration:underline}

/* Command palette (Ctrl+K / Cmd+K). */
.cmdk{position:fixed; inset:0; z-index:9000; display:flex; align-items:flex-start; justify-content:center}
.cmdk[hidden]{display:none!important}
.cmdk__backdrop{position:absolute; inset:0; background:rgba(0,15,35,.45); backdrop-filter:blur(2px)}
.cmdk__panel{position:relative; width:min(640px,92vw); margin-top:12vh;
  background:var(--surface,#fff); border:1px solid var(--bd); border-radius:14px;
  box-shadow:0 24px 60px rgba(0,0,0,.28); overflow:hidden; display:flex; flex-direction:column}
.cmdk__input{border:0; border-bottom:1px solid var(--bd); padding:15px 18px; font-size:15px;
  background:transparent; color:inherit; outline:none; width:100%; box-sizing:border-box}
.cmdk__list{max-height:52vh; overflow-y:auto; padding:6px}
.cmdk__row{display:flex; align-items:baseline; justify-content:space-between; gap:12px;
  padding:9px 12px; border-radius:8px; text-decoration:none; color:inherit}
.cmdk__row.is-sel{background:var(--accent,#e36d05); color:#fff}
.cmdk__row.is-sel .cmdk__meta{color:rgba(255,255,255,.8)}
.cmdk__label{font-size:13px; font-weight:500; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.cmdk__meta{font-size:11px; color:var(--muted); flex:0 0 auto}
.cmdk__empty{padding:22px; text-align:center; color:var(--muted); font-size:13px}
.cmdk__foot{display:flex; gap:14px; padding:8px 14px; border-top:1px solid var(--bd);
  font-size:11px; color:var(--muted)}
.cmdk__foot kbd{display:inline-block; min-width:16px; padding:1px 4px; margin-right:3px;
  border:1px solid var(--bd); border-bottom-width:2px; border-radius:4px;
  font:inherit; font-size:10px; text-align:center}

/* Creative-type chooser: the first step of Add Creative. Cards rather than a
   bare radio list, because the advertiser is picking between seven things that
   lead to different forms. */
.ckinds{display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:10px}
.ckind{display:flex; gap:10px; align-items:flex-start; padding:12px;
       border:1px solid var(--bd); border-radius:10px; cursor:pointer; background:var(--surface)}
.ckind:hover{border-color:var(--accent,#e36d05)}
.ckind:has(input:checked){border-color:var(--accent,#e36d05);
       box-shadow:0 0 0 2px color-mix(in srgb, var(--accent,#e36d05) 22%, transparent)}
.ckind input{margin-top:2px; flex:0 0 auto}
.ckind__body{display:flex; flex-direction:column; gap:3px; min-width:0}
.ckind__name{font-weight:600}
.ckind__blurb{color:var(--muted); font-size:12px; line-height:1.35}

/* Tracking-URL builder. Its table intentionally avoids the shared .data class,
   whose sort/filter/column behaviour would reorder a reference list. */
.ub{margin-top:6px}
.ub__bar{display:flex; gap:6px; align-items:center; flex-wrap:wrap; margin-bottom:6px}
.ub__hint{color:var(--muted); font-size:12px}
.ub__t{width:100%; border-collapse:collapse; border:1px solid var(--bd); border-radius:8px}
.ub__t th,.ub__t td{padding:5px 8px; font-size:12px; text-align:left; border-bottom:1px solid var(--bd)}
.ub__t thead th{color:var(--muted); font-weight:600; background:var(--surface-2,transparent)}
.ub__t tbody tr:last-child td{border-bottom:0}
.ub__row{cursor:pointer}
.ub__row:hover{background:var(--surface-2,rgba(0,0,0,.03))}
.ub__row.is-on{background:var(--ok-bg,rgba(0,128,0,.06))}
.ub__pick{width:32px}
.ub__val{width:100%; box-sizing:border-box; padding:3px 6px; font-size:12px;
         border:1px solid var(--bd); border-radius:6px; background:var(--surface); color:inherit}
.ub__t code{font-size:12px}

.note--ok{border-color:var(--ok-bd); background:var(--ok-bg); color:var(--ok-fg)}
.note--warn{border-color:var(--warn-bd); background:var(--warn-bg); color:var(--warn-fg)}
.note--bad{border-color:var(--bad-bd); background:var(--bad-bg); color:var(--bad-fg)}

/* ------------------------------------------------------------- toolbar --- */
.toolbar{
  display:flex; align-items:center; gap:var(--s-2);
  padding:var(--s-3) var(--s-4); flex-wrap:wrap;
  border-bottom:1px solid var(--border); background:var(--surface-2);
  border-radius:var(--r-lg) var(--r-lg) 0 0;
}
.toolbar__grow{flex:1 1 auto}
.toolbar form{display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap; margin:0}
.toolbar label{display:inline-flex; align-items:center; gap:6px; white-space:nowrap}

/* --------------------------------------------------------------- table --- */
.tablewrap{overflow:auto; max-width:100%; border-radius:0 0 var(--r-lg) var(--r-lg)}
table.data{width:100%; border-collapse:separate; border-spacing:0; font-size:var(--fs-sm)}
table.data thead th{
  position:sticky; top:0; z-index:5;
  background:var(--surface-2); color:var(--text-dim);
  text-align:left; font-weight:650; font-size:var(--fs-xs);
  text-transform:uppercase; letter-spacing:.05em; white-space:nowrap;
  padding:9px var(--s-3); border-bottom:1px solid var(--border-strong);
}
table.data tbody td{
  padding:0 var(--s-3); height:var(--row-h);
  border-bottom:1px solid var(--border); vertical-align:middle;
}
table.data tbody tr:hover td{background:var(--surface-2)}
table.data tbody tr:last-child td{border-bottom:0}
/* Totals rows the reports append read as a summary, not another data row. */
table.data tbody tr.is-total td{
  font-weight:700; background:var(--n-100);
  border-top:2px solid var(--border-strong); border-bottom:0;
}
:root[data-theme="dark"] table.data tbody tr.is-total td{background:var(--surface-2)}
table.data td.num,table.data th.num{text-align:right; font-variant-numeric:tabular-nums}
table.data td .mono{font-family:var(--mono); font-size:var(--fs-xs)}

/* Density toggle — operators scanning 100 rows want tighter than form-filling.
   --row-h alone only moves single-line rows: on a table with a wrapping cell
   (transaction ids, long descriptions) the height is content-driven and the
   setting looks broken. So each step also sets the vertical padding and line
   height, which multi-line rows do respond to. */
:root{--row-pad-y:6px; --row-lh:1.45}
:root[data-density="comfortable"]{--row-h:56px; --row-pad-y:12px; --row-lh:1.6}
:root[data-density="compact"]{--row-h:44px; --row-pad-y:6px; --row-lh:1.45}
:root[data-density="tight"]{--row-h:34px; --row-pad-y:2px; --row-lh:1.25}
table.data tbody td{padding-top:var(--row-pad-y); padding-bottom:var(--row-pad-y); line-height:var(--row-lh)}
:root[data-density="tight"] table.data tbody td{padding-left:var(--s-2); padding-right:var(--s-2)}
:root[data-density="tight"] table.data{font-size:var(--fs-xs)}

/* sortable headers */
th.sortable{cursor:pointer; user-select:none}
th.sortable:hover{color:var(--text)}
th.sortable::after{content:"↕"; opacity:.25; margin-left:6px; font-size:10px}
th.sortable.asc::after{content:"↑"; opacity:.9; color:var(--amber-500)}
th.sortable.desc::after{content:"↓"; opacity:.9; color:var(--amber-500)}

.empty{padding:var(--s-8) var(--s-4); text-align:center; color:var(--text-mute)}
.empty__icon{opacity:.35; margin-bottom:var(--s-3)}

/* ------------------------------------------------------- column picker --- */
.popover{
  position:absolute; z-index:70; min-width:280px; max-width:min(560px,90vw);
  background:var(--surface); border:1px solid var(--border-strong);
  border-radius:var(--r-lg); box-shadow:var(--sh-3); padding:var(--s-3);
}
.popover[hidden]{display:none}
.popover__head{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--s-3); margin-bottom:var(--s-2); font-size:var(--fs-xs);
  text-transform:uppercase; letter-spacing:.05em; color:var(--text-dim);
}
.colgrid{display:grid; grid-template-columns:repeat(auto-fill,minmax(170px,1fr)); gap:2px 10px; max-height:320px; overflow:auto}
.colgrid label{
  display:flex; align-items:center; gap:7px; padding:4px 6px;
  border-radius:var(--r-sm); cursor:pointer; color:var(--text); font-size:var(--fs-sm);
}
.colgrid label:hover{background:var(--surface-2)}

/* ---------------------------------------------------------- typeahead ---- */
.ta{position:relative; display:inline-block}
.ta__menu{
  position:absolute; left:0; right:0; top:calc(100% + 4px); z-index:80;
  background:var(--surface); border:1px solid var(--border-strong);
  border-radius:var(--r-md); box-shadow:var(--sh-3);
  max-height:300px; overflow:auto; min-width:280px;
}
.ta__menu[hidden]{display:none}
.ta__item{padding:7px 10px; cursor:pointer; display:flex; gap:8px; align-items:baseline}
.ta__item[aria-selected="true"],.ta__item:hover{background:var(--info-bg)}
.ta__item mark{background:transparent; color:var(--amber-500); font-weight:700}
.ta__id{font-family:var(--mono); font-size:var(--fs-xs); color:var(--text-mute)}
.ta__empty{padding:10px; color:var(--text-mute); font-size:var(--fs-sm)}

/* --------------------------------------------------------- pagination ---- */
.pager{display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap; font-size:var(--fs-sm)}
.pager a,.pager strong{
  display:inline-block; min-width:30px; text-align:center;
  padding:5px 8px; border-radius:var(--r-sm); border:1px solid transparent;
}
.pager a{color:var(--link)}
.pager a:hover{background:var(--n-100); text-decoration:none}
:root[data-theme="dark"] .pager a:hover{background:var(--surface-2)}
.pager strong{background:var(--amber-500); color:#fff; border-color:var(--amber-600)}

/* ------------------------------------------------------------- home ------ */
.kpis{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:var(--s-3); margin-bottom:var(--s-5)}
@media (min-width:1180px){ .kpis{grid-template-columns:repeat(4,1fr)} }
.kpi{
  background:var(--surface); border:1px solid var(--border); border-radius:var(--r-lg);
  padding:var(--s-4); box-shadow:var(--sh-1); position:relative; overflow:hidden;
}
.kpi::before{content:""; position:absolute; inset:0 auto 0 0; width:3px; background:var(--amber-500)}
.kpi__label{font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.06em; color:var(--text-dim)}
.kpi__value{font-size:var(--fs-2xl); font-weight:700; letter-spacing:-.02em; margin-top:2px}
.kpi__sub{font-size:var(--fs-xs); color:var(--text-mute)}

.section-label{
  font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.08em;
  color:var(--text-dim); font-weight:650;
  margin:var(--s-6) 0 var(--s-3); display:flex; align-items:center; gap:var(--s-3);
}
.section-label::after{content:""; flex:1; height:1px; background:var(--border)}

.tiles{display:grid; grid-template-columns:repeat(auto-fill,minmax(184px,1fr)); gap:var(--s-3)}
.tile{
  display:flex; align-items:center; gap:var(--s-3);
  padding:var(--s-3) var(--s-4); background:var(--surface);
  border:1px solid var(--border); border-radius:var(--r-lg);
  color:var(--text); box-shadow:var(--sh-1);
  transition:transform .12s ease, box-shadow .12s ease, border-color .12s ease;
}
.tile:hover{
  text-decoration:none; transform:translateY(-2px);
  box-shadow:var(--sh-2); border-color:var(--amber-500);
}
.tile__icon{
  flex:0 0 34px; height:34px; display:grid; place-items:center;
  border-radius:var(--r-md); background:var(--info-bg); color:var(--navy-600);
}
:root[data-theme="dark"] .tile__icon{color:var(--info-fg)}
.tile:hover .tile__icon{background:var(--amber-500); color:#fff}
.tile__label{font-size:var(--fs-sm); font-weight:600; line-height:1.25}

/* Staggered reveal on load — one orchestrated moment, not scattered fidgets. */
@media (prefers-reduced-motion:no-preference){
  .tile,.kpi{animation:rise .32s cubic-bezier(.2,.7,.3,1) both}
  .tiles .tile:nth-child(n+1){animation-delay:calc(var(--i,0) * 18ms)}
  @keyframes rise{from{opacity:0; transform:translateY(6px)} to{opacity:1; transform:none}}
}

/* ------------------------------------------------------------- footer ---- */
.foot{
  margin-top:var(--s-8); padding:var(--s-4);
  text-align:center; color:var(--text-mute); font-size:var(--fs-xs);
  border-top:1px solid var(--border);
}

/* ==================================================== legacy class bridge ==
   The unported pages still emit .adminlist / .adminheading / .adminform /
   .menubar markup. Rather than touch ~25 bespoke templates, map those class
   names onto the new system so they modernise for free.                     */
table.adminlist{
  width:100%; border-collapse:separate; border-spacing:0; font-size:var(--fs-sm);
  background:var(--surface); border:1px solid var(--border);
  border-radius:var(--r-lg); overflow:hidden;
}
table.adminlist th{
  background:var(--surface-2); color:var(--text-dim); text-align:left;
  font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em;
  padding:9px var(--s-3); border-bottom:1px solid var(--border-strong); white-space:nowrap;
}
table.adminlist td{padding:7px var(--s-3); border-bottom:1px solid var(--border)}
table.adminlist tr:hover td{background:var(--surface-2)}
table.adminheading{width:100%; margin:0 0 var(--s-3)}
table.adminheading th.website,th.website{
  text-align:left; font-size:var(--fs-xl); font-weight:650; color:var(--text);
  letter-spacing:-.01em; padding:0 0 var(--s-2);
}
table.adminform{width:100%; background:var(--surface); border:1px solid var(--border);
  border-radius:var(--r-lg); padding:var(--s-3)}
table.adminform td{padding:6px var(--s-3); font-size:var(--fs-sm)}

/* Form-control class names from the old sheets. The handlers that still emit
   inline legacy markup put .inputbox / .text_area on their fields, so these
   map onto the same control styling the design system gives bare inputs. */
.inputbox,.text_area{
  font:inherit; font-size:var(--fs-sm); color:var(--text);
  background:var(--surface); border:1px solid var(--border-strong);
  border-radius:var(--r-sm); padding:6px 10px;
}
.inputbox:focus,.text_area:focus{outline:none; border-color:var(--accent); box-shadow:var(--ring)}
.menudottedline{border-bottom:1px dotted var(--border); margin:var(--s-2) 0}

.menubar,#toolbar{background:transparent!important}
.menubar td{border:0!important}
.pathway{font-size:var(--fs-xs); color:var(--text-dim); text-transform:uppercase; letter-spacing:.06em}
.pathway a{color:var(--text-dim)}
a.toolbar{display:inline-block; font-size:var(--fs-xs); color:var(--text-dim); text-align:center}
a.toolbar img{height:22px; width:auto; opacity:.8}
a.toolbar:hover{color:var(--amber-500); text-decoration:none}
.errormessage,.successmessage{
  padding:var(--s-3) var(--s-4); border-radius:var(--r-md); font-size:var(--fs-sm);
  border:1px solid var(--ok-bd); background:var(--ok-bg); color:var(--ok-fg);
  margin:var(--s-3) 0; width:auto!important;
}
.centermain{text-align:left!important}
.page_jump{margin-top:var(--s-3)}
.smallgrey{color:var(--text-mute); font-size:var(--fs-xs)}
.asterik{color:var(--bad-fg); font-style:normal; margin-left:2px}
fieldset{border:1px solid var(--border); border-radius:var(--r-lg); padding:var(--s-4); margin:var(--s-4) 0}
legend{padding:0 var(--s-2); font-size:var(--fs-xs); font-weight:650;
  text-transform:uppercase; letter-spacing:.06em; color:var(--text-dim)}

@media (max-width:820px){
  .page{padding:var(--s-3)}
  .topbar__nav .topbar__link span{display:none}
  .page-title{font-size:var(--fs-xl)}
}
@media print{
  .topbar,.toolbar,.pager,.foot{display:none!important}
  .card{border:0; box-shadow:none}
}

/* ======================================================= SIDEBAR SHELL ==== */
.shell{display:grid; grid-template-columns:var(--side-w) minmax(0,1fr); min-height:100vh}
.side{
  position:sticky; top:0; align-self:start; height:100vh; overflow:auto;
  background:var(--surface); border-right:1px solid var(--border);
  display:flex; flex-direction:column; gap:2px; padding:var(--s-3);
}
.side__brand{display:flex; align-items:center; gap:10px; padding:6px 8px var(--s-4)}
.side__brand img{height:26px}
.side__group{margin-top:var(--s-4)}
.side__label{
  font-size:10px; font-weight:700; letter-spacing:.10em; text-transform:uppercase;
  color:var(--text-mute); padding:0 10px var(--s-2);
}
.side__link{
  display:flex; align-items:center; gap:10px; padding:8px 10px;
  border-radius:var(--r-md); color:var(--text-dim); font-size:var(--fs-sm); font-weight:550;
  transition:background .12s ease, color .12s ease;
}
.side__link:hover{background:var(--n-100); color:var(--text); text-decoration:none}
:root[data-theme="dark"] .side__link:hover{background:var(--surface-2)}
.side__link .ic{opacity:.75; flex:none}
.side__link.is-active{background:var(--info-bg); color:var(--navy-600); font-weight:650}
:root[data-theme="dark"] .side__link.is-active{color:var(--info-fg)}
.side__link.is-active .ic{opacity:1; color:var(--amber-500)}
.side__text{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.side__badge{
  flex:none; min-width:20px; text-align:center; padding:1px 7px; border-radius:var(--r-pill);
  background:var(--amber-500); color:#fff; font-size:10px; font-weight:700;
}
.side__foot{margin-top:auto; padding-top:var(--s-3); border-top:1px solid var(--border)}
.side__user{display:flex; align-items:center; gap:10px; padding:8px 10px; font-size:var(--fs-sm)}

/* Collapsed rail */
:root[data-side="mini"] .shell{grid-template-columns:64px minmax(0,1fr)}
:root[data-side="mini"] .side__text,
:root[data-side="mini"] .side__label,
:root[data-side="mini"] .side__brand span,
:root[data-side="mini"] .side__user div{display:none}
:root[data-side="mini"] .side__link{justify-content:center; padding:10px 0}
:root[data-side="mini"] .side__badge{position:absolute; transform:translate(14px,-10px)}
:root[data-side="mini"] .side__link{position:relative}

/* ============================================================ AVATARS ===== */
.av{
  flex:none; width:32px; height:32px; border-radius:var(--r-pill);
  display:grid; place-items:center; font-size:11px; font-weight:700;
  background:var(--info-bg); color:var(--navy-600); letter-spacing:.02em;
}
:root[data-theme="dark"] .av{color:var(--info-fg)}
.cellwho{display:flex; align-items:center; gap:10px; min-width:0}
.cellwho__main{min-width:0}
.cellwho__t{font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.cellwho__s{font-size:var(--fs-xs); color:var(--text-mute)}

/* ============================================== STATUS PILLS / ACTIONS ==== */
.pill{
  display:inline-flex; align-items:center; gap:5px; white-space:nowrap;
  padding:3px 10px; border-radius:var(--r-pill);
  font-size:var(--fs-xs); font-weight:650; border:1px solid transparent;
}
.pill::before{content:""; width:6px; height:6px; border-radius:50%; background:currentColor; flex:none}
.pill--ok{background:var(--ok-bg); color:var(--ok-fg)}
.pill--warn{background:var(--warn-bg); color:var(--warn-fg)}
.pill--bad{background:var(--bad-bg); color:var(--bad-fg)}
.pill--info{background:var(--info-bg); color:var(--info-fg)}
.pill--mute{background:var(--n-100); color:var(--text-dim)}
:root[data-theme="dark"] .pill--mute{background:var(--surface-2)}

.iconbtn{
  display:inline-grid; place-items:center; width:28px; height:28px;
  border-radius:var(--r-md); border:1px solid transparent; background:transparent;
  color:var(--text-mute); cursor:pointer; transition:all .12s ease;
}
.iconbtn:hover{background:var(--n-100); color:var(--text); text-decoration:none}
:root[data-theme="dark"] .iconbtn:hover{background:var(--surface-2)}
.iconbtn--danger:hover{background:var(--bad-bg); color:var(--bad-fg)}
.rowactions{display:inline-flex; gap:2px; align-items:center}

/* =============================================================== TABS ===== */
.tabs{display:flex; gap:2px; align-items:center; flex-wrap:wrap}
.tab{
  padding:7px 14px; border-radius:var(--r-md); font-size:var(--fs-sm); font-weight:600;
  color:var(--text-dim); border:1px solid transparent;
}
.tab:hover{background:var(--n-100); color:var(--text); text-decoration:none}
:root[data-theme="dark"] .tab:hover{background:var(--surface-2)}
.tab.is-active{background:var(--navy-800); color:#fff}
:root[data-theme="dark"] .tab.is-active{background:var(--amber-500)}
.tab__n{opacity:.7; margin-left:5px; font-weight:500}

/* ====================================================== CHECKBOX COLUMN === */
table.data td.pick,table.data th.pick{width:38px; text-align:center; padding-right:0}
input[type=checkbox]{accent-color:var(--amber-500); width:15px; height:15px; cursor:pointer}
.bulkbar{
  display:none; align-items:center; gap:var(--s-3);
  padding:var(--s-3) var(--s-4); background:var(--info-bg);
  border-bottom:1px solid var(--info-bd); font-size:var(--fs-sm); color:var(--info-fg);
}
.bulkbar.is-on{display:flex}

/* ====================================================== KPI / SPARKLINE === */
.kpi{padding:var(--s-4) var(--s-5); border-radius:var(--r-xl)}
.kpi::before{display:none}                 /* replaced by the icon chip below */
.kpi__top{display:flex; align-items:flex-start; justify-content:space-between; gap:var(--s-3)}
.kpi__chip{
  width:34px; height:34px; border-radius:var(--r-md); display:grid; place-items:center;
  background:var(--info-bg); color:var(--navy-600); flex:none;
}
:root[data-theme="dark"] .kpi__chip{color:var(--info-fg)}
.kpi__value{font-size:28px; line-height:1.1; margin-top:var(--s-2)}
.kpi__row{display:flex; align-items:center; gap:var(--s-2); margin-top:6px; flex-wrap:wrap}
.delta{
  display:inline-flex; align-items:center; gap:3px; padding:2px 8px;
  border-radius:var(--r-pill); font-size:var(--fs-xs); font-weight:700;
}
.delta--up{background:var(--ok-bg); color:var(--ok-fg)}
.delta--down{background:var(--bad-bg); color:var(--bad-fg)}
.delta--flat{background:var(--n-100); color:var(--text-dim)}
.spark{display:block; width:100%; height:30px; margin-top:var(--s-2); overflow:visible}
.spark path{fill:none; stroke:var(--amber-500); stroke-width:2; stroke-linecap:round; stroke-linejoin:round}
.spark .fill{fill:var(--amber-500); opacity:.10; stroke:none}

/* ========================================================== PAGINATION ==== */
.pagebar{display:flex; align-items:center; justify-content:space-between; gap:var(--s-3); flex-wrap:wrap}
.pagebar__info{font-size:var(--fs-sm); color:var(--text-dim)}
.pagebar__info b{color:var(--text)}
.pager a,.pager strong{min-width:32px; height:32px; line-height:22px; border-radius:var(--r-md)}
.pager a{border:1px solid var(--border)}
.pager strong{background:var(--navy-800); border-color:var(--navy-800)}
:root[data-theme="dark"] .pager strong{background:var(--amber-500); border-color:var(--amber-500)}

/* rounder cards + roomier tables to match the reference scale */
table.data thead th{padding:11px var(--s-4); font-size:10px}
table.data tbody td{padding:0 var(--s-4)}
.toolbar{padding:var(--s-4); border-radius:var(--r-xl) var(--r-xl) 0 0; background:var(--surface)}
.tablewrap{border-radius:0 0 var(--r-xl) var(--r-xl)}
.card{border-radius:var(--r-xl)}
.tile{border-radius:var(--r-xl)}

@media (max-width:1000px){
  .shell{grid-template-columns:1fr}
  .side{position:fixed; inset:0 auto 0 0; width:var(--side-w); z-index:90; transform:translateX(-100%); transition:transform .2s ease}
  :root[data-side="open"] .side{transform:none; box-shadow:var(--sh-3)}
  .sidetoggle{display:inline-grid!important}
}
.sidetoggle{display:none}

/* ------------------------------------------------- topbar control cluster - */
.tbctl{display:inline-flex; align-items:center; gap:6px}
.tbctl select{
  padding:6px 26px 6px 10px; border-radius:var(--r-md);
  border:1px solid var(--border-strong); background:var(--surface); color:var(--text);
  font-size:var(--fs-sm); -webkit-appearance:none; appearance:none;
  background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),
                   linear-gradient(135deg,currentColor 50%,transparent 50%);
  background-position:calc(100% - 14px) 51%, calc(100% - 9px) 51%;
  background-size:5px 5px,5px 5px; background-repeat:no-repeat;
}
.topbar{gap:var(--s-3); padding:0 var(--s-5)}


/* ===========================================================================
   COLOUR SYSTEM + 3D CONTROLS
   Adopted from the noqueue brand system: generous radii, and shadows tinted
   with the control's OWN hue cast far below it (0 Ypx Bpx -Spx) rather than a
   neutral grey. That coloured cast is what reads as "3D" — the element looks
   lit and lifted off the page instead of outlined on it.
   =========================================================================== */
:root{
  --c-indigo:#4f46e5; --c-indigo-2:#6366f1; --c-indigo-bg:#eef0ff;
  --c-teal:#0d9488;   --c-teal-2:#14b8a6;   --c-teal-bg:#e6faf7;
  --c-violet:#7c3aed; --c-violet-2:#8b5cf6; --c-violet-bg:#f3eeff;
  --c-rose:#e11d48;   --c-rose-2:#f43f5e;   --c-rose-bg:#ffeef1;
  --c-amber:#e36d05;  --c-amber-2:#f5893a;  --c-amber-bg:#fff2e6;
  --c-sky:#0284c7;    --c-sky-2:#0ea5e9;    --c-sky-bg:#e6f5fe;
  --c-emerald:#059669;--c-emerald-2:#10b981;--c-emerald-bg:#e7f8f0;
  --c-slate:#475569;  --c-slate-2:#64748b;  --c-slate-bg:#eef1f5;
}
:root[data-theme="dark"]{
  --c-indigo-bg:#1b1e3d; --c-teal-bg:#0a2b28; --c-violet-bg:#251a3d;
  --c-rose-bg:#331319;   --c-amber-bg:#2e1c07; --c-sky-bg:#0a2437;
  --c-emerald-bg:#08281c;--c-slate-bg:#1b212b;
}

/* ---- 3D buttons ---------------------------------------------------------- */
.btn3d{
  --b1:var(--c-amber); --b2:var(--c-amber-2);
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  padding:11px 20px; border:0; border-radius:var(--r-lg); cursor:pointer;
  font:inherit; font-size:var(--fs-sm); font-weight:650; color:#fff; line-height:1.2;
  background:linear-gradient(135deg,var(--b2),var(--b1));
  box-shadow:0 18px 34px -18px var(--b1), 0 2px 4px rgba(16,24,40,.10),
             inset 0 1px 0 rgba(255,255,255,.28);
  transition:transform .14s cubic-bezier(.2,.7,.3,1), box-shadow .14s ease, filter .14s ease;
}
.btn3d:hover{
  text-decoration:none; transform:translateY(-2px); filter:saturate(1.06);
  box-shadow:0 26px 44px -20px var(--b1), 0 3px 6px rgba(16,24,40,.12),
             inset 0 1px 0 rgba(255,255,255,.34);
}
.btn3d:active{transform:translateY(1px);
  box-shadow:0 10px 20px -14px var(--b1), inset 0 2px 5px rgba(0,0,0,.18)}
.btn3d:focus-visible{outline:none; box-shadow:0 0 0 3px color-mix(in srgb,var(--b1) 35%,transparent),
             0 18px 34px -18px var(--b1)}
.btn3d--indigo{--b1:var(--c-indigo); --b2:var(--c-indigo-2)}
.btn3d--teal{--b1:var(--c-teal); --b2:var(--c-teal-2)}
.btn3d--violet{--b1:var(--c-violet); --b2:var(--c-violet-2)}
.btn3d--rose{--b1:var(--c-rose); --b2:var(--c-rose-2)}
.btn3d--sky{--b1:var(--c-sky); --b2:var(--c-sky-2)}
.btn3d--emerald{--b1:var(--c-emerald); --b2:var(--c-emerald-2)}
.btn3d--slate{--b1:var(--c-slate); --b2:var(--c-slate-2)}
.btn3d--sm{padding:8px 14px; font-size:var(--fs-xs); border-radius:var(--r-md)}

/* Give the ordinary primary button the same lift so the language is consistent. */
.btn--primary{
  background:linear-gradient(135deg,var(--c-amber-2),var(--c-amber)); border-color:transparent;
  box-shadow:0 14px 26px -16px var(--c-amber), inset 0 1px 0 rgba(255,255,255,.25);
}
.btn--primary:hover{transform:translateY(-1px); box-shadow:0 20px 32px -18px var(--c-amber)}

/* ---- colourful KPI cards ------------------------------------------------- */
.kpi{
  --k1:var(--c-indigo); --k2:var(--c-indigo-2); --kbg:var(--c-indigo-bg);
  position:relative; overflow:hidden; border-radius:var(--r-xl);
  background:var(--surface); border:1px solid var(--border);
  box-shadow:0 18px 40px -30px var(--k1), var(--sh-1);
  transition:transform .16s cubic-bezier(.2,.7,.3,1), box-shadow .16s ease;
}
.kpi:hover{transform:translateY(-3px); box-shadow:0 28px 52px -28px var(--k1), var(--sh-2); text-decoration:none}
/* A soft tinted wash in the corner instead of a flat coloured card: keeps the
   number high-contrast while still reading as "this metric has an identity". */
.kpi::after{
  content:""; position:absolute; right:-40px; top:-40px; width:130px; height:130px;
  border-radius:50%; background:radial-gradient(circle,var(--kbg),transparent 70%); pointer-events:none;
}
.kpi__chip{background:var(--kbg); color:var(--k1)}
.kpi__value{color:var(--text)}
.kpi--indigo{--k1:var(--c-indigo);--k2:var(--c-indigo-2);--kbg:var(--c-indigo-bg)}
.kpi--teal{--k1:var(--c-teal);--k2:var(--c-teal-2);--kbg:var(--c-teal-bg)}
.kpi--violet{--k1:var(--c-violet);--k2:var(--c-violet-2);--kbg:var(--c-violet-bg)}
.kpi--rose{--k1:var(--c-rose);--k2:var(--c-rose-2);--kbg:var(--c-rose-bg)}
.kpi--amber{--k1:var(--c-amber);--k2:var(--c-amber-2);--kbg:var(--c-amber-bg)}
.kpi--sky{--k1:var(--c-sky);--k2:var(--c-sky-2);--kbg:var(--c-sky-bg)}
.kpi--emerald{--k1:var(--c-emerald);--k2:var(--c-emerald-2);--kbg:var(--c-emerald-bg)}
.kpi--slate{--k1:var(--c-slate);--k2:var(--c-slate-2);--kbg:var(--c-slate-bg)}

/* ---- quick actions ------------------------------------------------------- */
.quick{
  display:flex; gap:var(--s-3); flex-wrap:wrap; align-items:center;
  padding:var(--s-4) var(--s-5); margin-bottom:var(--s-5);
  background:var(--surface); border:1px solid var(--border); border-radius:var(--r-xl);
  box-shadow:var(--sh-1);
}
.quick__label{
  font-size:10px; font-weight:700; letter-spacing:.1em; text-transform:uppercase;
  color:var(--text-mute); margin-right:var(--s-2);
}

/* ---- colourful nav tiles ------------------------------------------------- */
.tile{--t1:var(--c-slate); --tbg:var(--c-slate-bg)}
.tile__icon{background:var(--tbg); color:var(--t1)}
.tile:hover{border-color:var(--t1); box-shadow:0 20px 38px -26px var(--t1), var(--sh-2)}
.tile:hover .tile__icon{background:var(--t1); color:#fff}
.tile--indigo{--t1:var(--c-indigo);--tbg:var(--c-indigo-bg)}
.tile--teal{--t1:var(--c-teal);--tbg:var(--c-teal-bg)}
.tile--violet{--t1:var(--c-violet);--tbg:var(--c-violet-bg)}
.tile--rose{--t1:var(--c-rose);--tbg:var(--c-rose-bg)}
.tile--amber{--t1:var(--c-amber);--tbg:var(--c-amber-bg)}
.tile--sky{--t1:var(--c-sky);--tbg:var(--c-sky-bg)}
.tile--emerald{--t1:var(--c-emerald);--tbg:var(--c-emerald-bg)}

/* Sidebar active state picks up the accent gradient too. */
.side__link.is-active{
  background:linear-gradient(135deg,var(--c-amber-bg),transparent);
  box-shadow:inset 3px 0 0 var(--c-amber);
}


/* --- KPI polish ----------------------------------------------------------
   The corner wash is an absolutely-positioned ::after, so it painted OVER the
   statically-positioned chip and washed it out. Lift the real content above it
   and give the chip a saturated tint so it reads at a glance. */
.kpi > *{position:relative; z-index:1}
.kpi::after{z-index:0; opacity:.75}
.kpi__chip{
  width:38px; height:38px; border-radius:var(--r-md);
  background:linear-gradient(135deg,var(--k2),var(--k1)); color:#fff;
  box-shadow:0 10px 20px -12px var(--k1);
}
.kpi__chip .ic{stroke-width:2.2}
.kpi__label{font-size:11px; font-weight:650; letter-spacing:.07em}
.kpi__value{font-size:34px; font-weight:750; letter-spacing:-.03em; margin-top:var(--s-3)}
.kpi__sub{margin-top:2px}

/* --- tile polish ---------------------------------------------------------- */
.tile__icon{
  width:38px; height:38px;
  background:linear-gradient(135deg,color-mix(in srgb,var(--t1) 14%,var(--surface)),var(--tbg));
  color:var(--t1); box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--t1) 18%,transparent);
}
.tile__icon .ic{stroke-width:2.1}
.tile:hover .tile__icon{
  background:linear-gradient(135deg,var(--t1),color-mix(in srgb,var(--t1) 75%,#fff));
  color:#fff; box-shadow:0 10px 18px -10px var(--t1);
}
.tile{padding:var(--s-4)}


/* Tile chips go SOLID, matching the KPI chips: at 14% tint adjacent sections
   (indigo vs violet, teal vs emerald) were indistinguishable, which defeats
   the point of colour-coding them. */
.tile__icon{
  background:linear-gradient(135deg,var(--t1),color-mix(in srgb,var(--t1) 72%,#ffffff));
  color:#fff; box-shadow:0 8px 16px -10px var(--t1);
}
.tile:hover .tile__icon{
  background:linear-gradient(135deg,color-mix(in srgb,var(--t1) 88%,#000),var(--t1));
  box-shadow:0 12px 22px -10px var(--t1);
}

/* ===========================================================================
   DATE RANGE PICKER  (.drp)
   One field instead of two. Presets on the left, two months on the right —
   the shape operators already know from every analytics tool. Values are
   written into hidden inputs using each page's OWN param names (sd/ed,
   std/end), so no handler had to change.
   =========================================================================== */
.drp{position:relative; display:inline-block}
.drp__field{
  display:inline-flex; align-items:center; gap:9px; cursor:pointer;
  padding:8px 13px; border-radius:var(--r-md);
  border:1px solid var(--border-strong); background:var(--surface); color:var(--text);
  font:inherit; font-size:var(--fs-sm); font-weight:550; white-space:nowrap;
  transition:border-color .12s ease, box-shadow .12s ease;
}
.drp__field:hover{border-color:var(--c-amber)}
.drp__field:focus-visible{outline:none; box-shadow:var(--ring)}
.drp__field .ic{opacity:.55}
.drp__caret{opacity:.5; margin-left:2px}
.drp__pop{
  position:absolute; z-index:95; top:calc(100% + 6px); left:0;
  display:flex; background:var(--surface);
  border:1px solid var(--border-strong); border-radius:var(--r-lg);
  box-shadow:var(--sh-3); overflow:hidden;
}
.drp__pop[hidden]{display:none}
.drp--right .drp__pop{left:auto; right:0}

/* ------------------------------------------------- searchable select -- */
/* Wraps a long <select>; the original stays in the DOM (hidden) as the form
   value, so no handler or no-JS fallback changes. */
.ss{position:relative; display:inline-flex}
.ss > select{
  position:absolute; width:1px; height:1px; opacity:0; pointer-events:none;
  clip:rect(0 0 0 0); overflow:hidden;
}
.ss__field{
  display:inline-flex; align-items:center; gap:var(--s-2);
  min-width:200px; max-width:340px; height:32px; padding:0 var(--s-2) 0 10px;
  font:inherit; font-size:var(--fs-sm); color:var(--text); text-align:left;
  background:var(--surface); border:1px solid var(--border-strong);
  border-radius:var(--r-sm); cursor:pointer;
}
.ss__field:hover{border-color:var(--accent)}
.ss__field:focus-visible{outline:none; box-shadow:var(--ring)}
.ss__txt{flex:1; overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
.ss__caret{opacity:.5}
.ss__pop{
  position:absolute; z-index:95; top:calc(100% + 4px); left:0; width:300px;
  background:var(--surface); border:1px solid var(--border-strong);
  border-radius:var(--r-lg); box-shadow:var(--sh-3); overflow:hidden;
}
.ss__pop[hidden]{display:none}
.ss--right .ss__pop{left:auto; right:0}
.ss__q{width:100%; border:0; border-bottom:1px solid var(--border); border-radius:0; padding:8px 10px}
.ss__q:focus{outline:none; box-shadow:none; border-bottom-color:var(--accent)}
.ss__list{max-height:280px; overflow-y:auto; padding:var(--s-1)}
.ss__opt{
  display:block; width:100%; text-align:left; padding:6px 8px; border:0;
  background:none; font:inherit; font-size:var(--fs-sm); color:var(--text);
  border-radius:var(--r-sm); cursor:pointer;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.ss__opt:hover{background:var(--surface-2)}
.ss__opt.is-sel{background:var(--accent); color:var(--accent-ink)}
.ss__more{padding:8px 10px; font-size:var(--fs-xs); color:var(--text-mute)}

/* multi-select: the field shows chips instead of one label, so it grows with
   the selection rather than truncating it. */
.ss--multi .ss__field{
  min-height:32px; height:auto; padding:4px 8px; align-items:flex-start;
  flex-wrap:wrap; max-width:none; width:100%;
}
.ss--multi .ss__txt{
  display:flex; flex-wrap:wrap; gap:4px; white-space:normal; overflow:visible;
  padding:2px 0; min-height:22px; align-items:center;
}
.ss__ph{color:var(--text-mute)}
.ss__chip{
  display:inline-flex; align-items:center; gap:4px;
  padding:2px 4px 2px 8px; border-radius:var(--r-pill);
  background:var(--navy-800); color:#fff; font-size:var(--fs-xs); font-weight:600;
}
.ss__x{
  border:0; background:rgba(255,255,255,.2); color:#fff; cursor:pointer;
  width:15px; height:15px; line-height:1; border-radius:50%; font-size:12px;
  display:inline-flex; align-items:center; justify-content:center; padding:0;
}
.ss__x:hover{background:var(--bad-fg)}
.ss__tick{display:inline-block; width:14px; color:var(--accent); font-weight:700}

/* inline radio group + helper text used by the portal forms */
.choicerow{display:flex; flex-wrap:wrap; gap:var(--s-2) var(--s-4); align-items:center}
.fhint{margin-top:4px; font-size:var(--fs-xs); color:var(--text-dim)}
.fgrid__full{grid-column:1 / -1}

/* cell-wrap: long values (ids, tokens, user agents) inside a data table. Bounded
   width AND a line clamp — without the clamp a single long token makes one row
   hundreds of pixels tall and the table unreadable. The full value is in the
   cell's title attribute and in the CSV export. */
.cell-wrap{
  max-width:280px; text-align:left; margin:0 auto;
  word-break:break-all; white-space:normal;
  display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:3;
  overflow:hidden;
}
:root[data-density="tight"] .cell-wrap{-webkit-line-clamp:2}
:root[data-density="comfortable"] .cell-wrap{-webkit-line-clamp:4}

/* pixelgrid: the postback URL beside its macro picker. Stacks on narrow
   screens so the URL is never squeezed to a sliver. */
.pixelgrid{display:grid; grid-template-columns:minmax(320px,1fr) minmax(420px,1.3fr); gap:var(--s-4); align-items:start}
@media (max-width:1000px){ .pixelgrid{grid-template-columns:1fr} }
.pixelgrid code.mono{font-family:var(--mono); font-size:var(--fs-xs)}

/* thumb: a creative's banner inside a data table. Bounded so a 728x90 leaderboard
   does not set the row height, and clickable through to the full image. */
.thumb{display:inline-flex; align-items:center; justify-content:center;
  min-width:56px; max-width:120px; min-height:32px; padding:2px;
  border:1px solid var(--border); border-radius:var(--r-sm); background:var(--surface-2);}
.thumb img{max-width:112px; max-height:56px; width:auto; height:auto; display:block}
.thumb--none{color:var(--text-mute); font-size:var(--fs-xs)}

/* ---- header scoped searches (campaign / publisher / advertiser) ---- */
/* Three boxes have to share the toolbar with the density, theme and account
   controls, so they shrink together and drop off smallest-first rather than
   pushing anything off-screen. */
.gsearch{display:flex; align-items:center; gap:var(--s-2); min-width:0; flex:1 1 auto; max-width:760px}
.gsearch__box{position:relative; display:inline-flex; align-items:center; flex:1 1 0; min-width:0}
.gsearch__box > .ic{position:absolute; left:11px; opacity:.45; pointer-events:none}
.gsearch__box input[type=search]{
  width:100%; min-width:0; padding-left:32px; border-radius:var(--r-pill);
}
.gsearch__box .ta{display:block; width:100%; min-width:0}
@media (max-width:1240px){ .gsearch{max-width:460px} }
@media (max-width:980px){ .gsearch__box:nth-child(3){display:none} }
@media (max-width:820px){ .gsearch__box:nth-child(2){display:none} }
@media (max-width:640px){ .gsearch{display:none} }

/* whole-result search notice (replaces the pager while a search is active) */
.findbar{display:flex; align-items:center; gap:var(--s-3); flex-wrap:wrap; font-size:var(--fs-sm)}
.findbar__t{font-weight:600; color:var(--text)}
.findbar__note{color:var(--text-dim); font-size:var(--fs-xs)}
.pager__gap{color:var(--text-mute); padding:0 2px}

.drp__presets{
  width:168px; padding:var(--s-2); border-right:1px solid var(--border);
  background:var(--surface-2); display:flex; flex-direction:column; gap:1px;
}
.drp__preset{
  text-align:left; padding:8px 11px; border:0; border-radius:var(--r-sm);
  background:transparent; color:var(--text-dim); cursor:pointer;
  font:inherit; font-size:var(--fs-sm); white-space:nowrap;
}
.drp__preset:hover{background:var(--n-100); color:var(--text)}
:root[data-theme="dark"] .drp__preset:hover{background:var(--surface)}
.drp__preset.is-active{background:var(--c-amber); color:#fff; font-weight:650}

.drp__right{padding:var(--s-3)}
.drp__cals{display:flex; gap:var(--s-4)}
.drp__cal{width:238px}
.drp__calhead{
  display:flex; align-items:center; justify-content:space-between;
  margin-bottom:var(--s-2); font-size:var(--fs-sm); font-weight:650;
}
.drp__nav{
  border:0; background:transparent; cursor:pointer; color:var(--text-dim);
  padding:4px 7px; border-radius:var(--r-sm); font-size:15px; line-height:1;
}
.drp__nav:hover{background:var(--n-100); color:var(--text)}
.drp__grid{display:grid; grid-template-columns:repeat(7,1fr); gap:1px}
.drp__dow{
  text-align:center; font-size:10px; font-weight:700; color:var(--text-mute);
  padding:4px 0; text-transform:uppercase;
}
.drp__d{
  border:0; background:transparent; cursor:pointer; color:var(--text);
  font:inherit; font-size:var(--fs-sm); padding:7px 0; border-radius:var(--r-sm);
  position:relative;
}
.drp__d:hover:not(:disabled){background:var(--c-amber-bg)}
.drp__d:disabled{color:var(--text-mute); opacity:.35; cursor:default}
.drp__d.is-out{visibility:hidden}
.drp__d.in-range{background:var(--c-amber-bg); border-radius:0}
.drp__d.is-start,.drp__d.is-end{
  background:var(--c-amber); color:#fff; font-weight:700;
  box-shadow:0 6px 14px -8px var(--c-amber);
}
.drp__d.is-start{border-radius:var(--r-sm) 0 0 var(--r-sm)}
.drp__d.is-end{border-radius:0 var(--r-sm) var(--r-sm) 0}
.drp__d.is-start.is-end{border-radius:var(--r-sm)}
.drp__d.is-today::after{
  content:""; position:absolute; left:50%; bottom:4px; transform:translateX(-50%);
  width:4px; height:4px; border-radius:50%; background:var(--c-amber);
}
.drp__d.is-start.is-today::after,.drp__d.is-end.is-today::after{background:#fff}
.drp__foot{
  display:flex; align-items:center; justify-content:space-between; gap:var(--s-3);
  margin-top:var(--s-3); padding-top:var(--s-3); border-top:1px solid var(--border);
}
.drp__sel{font-size:var(--fs-sm); color:var(--text-dim)}
@media (max-width:760px){
  .drp__cals{flex-direction:column}
  .drp__pop{flex-direction:column}
  .drp__presets{width:auto; border-right:0; border-bottom:1px solid var(--border);
    flex-direction:row; flex-wrap:wrap}
}

/* ---- filter bar + active chips ------------------------------------------ */
.filterbar{display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap}
.filterbar label{display:inline-flex; align-items:center; gap:6px; white-space:nowrap;
  font-size:var(--fs-sm); color:var(--text-dim)}
.chips{display:flex; gap:6px; flex-wrap:wrap; align-items:center; margin-top:var(--s-3)}
.chip{
  display:inline-flex; align-items:center; gap:7px; padding:4px 6px 4px 11px;
  border-radius:var(--r-pill); background:var(--c-amber-bg); color:var(--c-amber);
  border:1px solid color-mix(in srgb,var(--c-amber) 25%,transparent);
  font-size:var(--fs-xs); font-weight:650;
}
.chip__x{
  display:grid; place-items:center; width:17px; height:17px; border-radius:50%;
  background:color-mix(in srgb,var(--c-amber) 18%,transparent); color:inherit;
  text-decoration:none; font-size:12px; line-height:1;
}
.chip__x:hover{background:var(--c-amber); color:#fff; text-decoration:none}
.chip__k{opacity:.7; font-weight:550}

/* ===========================================================================
   FORMS
   One component set for every add/edit screen. The shared form.html already
   uses .formgrid; these add the section/actions/choice pieces the bespoke
   forms (campaign, publisher, advertiser, permissions…) need so they stop
   carrying their own markup.
   =========================================================================== */
.formpage{max-width:1080px}
.formpage--wide{max-width:1400px}

/* Section = a titled block of related fields. Replaces bare <fieldset>. */
.fsec{
  background:var(--surface); border:1px solid var(--border); border-radius:var(--r-xl);
  box-shadow:var(--sh-1); margin-bottom:var(--s-4); overflow:hidden;
}
.fsec__head{
  display:flex; align-items:center; gap:var(--s-3);
  padding:var(--s-3) var(--s-5); border-bottom:1px solid var(--border); background:var(--surface-2);
}
.fsec__icon{
  width:30px; height:30px; border-radius:var(--r-md); display:grid; place-items:center;
  background:linear-gradient(135deg,var(--c-indigo-2),var(--c-indigo)); color:#fff; flex:none;
}
.fsec__t{font-size:var(--fs-md); font-weight:650; letter-spacing:-.01em}
.fsec__s{font-size:var(--fs-xs); color:var(--text-mute)}
.fsec__body{padding:var(--s-5)}

/* Label/field grid. --2 gives two field columns on wide screens. */
.fgrid{display:grid; grid-template-columns:210px minmax(0,1fr); gap:var(--s-3) var(--s-4); align-items:start}
.fgrid--2{grid-template-columns:190px minmax(0,1fr) 190px minmax(0,1fr)}
.fgrid > label,.fgrid__label{
  text-align:right; padding-top:9px; font-size:var(--fs-sm); color:var(--text-dim); font-weight:550;
}
.fgrid__field{min-width:0}
.fgrid__field > input[type=text],.fgrid__field > input[type=password],
.fgrid__field > input[type=email],.fgrid__field > input[type=number],
.fgrid__field > textarea,.fgrid__field > select{width:100%; max-width:520px}
.fgrid__hint{display:block; margin-top:4px; font-size:var(--fs-xs); color:var(--text-mute)}
.fgrid__wide{grid-column:2 / -1}
@media (max-width:900px){
  .fgrid,.fgrid--2{grid-template-columns:1fr; gap:var(--s-1)}
  .fgrid > label,.fgrid__label{text-align:left; padding-top:var(--s-2); font-weight:650; color:var(--text)}
}

/* Choice groups: radios/checkboxes as pressable pills rather than bare inputs. */
.choice{display:inline-flex; gap:6px; flex-wrap:wrap}
.choice label{
  display:inline-flex; align-items:center; gap:7px; cursor:pointer;
  padding:7px 13px; border:1px solid var(--border-strong); border-radius:var(--r-pill);
  font-size:var(--fs-sm); color:var(--text-dim); background:var(--surface);
  transition:all .12s ease;
}
.choice label:hover{border-color:var(--c-amber); color:var(--text)}
.choice input{margin:0; accent-color:var(--c-amber)}
.choice input:checked + span{font-weight:650; color:var(--text)}
.choice label:has(input:checked){
  border-color:var(--c-amber); background:var(--c-amber-bg); color:var(--c-amber);
}

/* Dense checkbox grid (admin permissions, column pickers in forms). */
.checkgrid{
  display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr));
  gap:2px 12px; max-height:420px; overflow:auto; padding:2px;
}
.checkgrid label{
  display:flex; align-items:center; gap:8px; padding:6px 8px; border-radius:var(--r-sm);
  font-size:var(--fs-sm); color:var(--text); cursor:pointer;
}
.checkgrid label:hover{background:var(--surface-2)}
.checkgrid input{accent-color:var(--c-amber)}

/* Sticky action bar so Save is reachable on long forms without scrolling back. */
.factions{
  position:sticky; bottom:0; z-index:20;
  display:flex; align-items:center; gap:var(--s-3); justify-content:flex-end;
  padding:var(--s-3) var(--s-5); margin-top:var(--s-4);
  background:color-mix(in srgb,var(--surface) 92%,transparent);
  backdrop-filter:blur(8px);
  border:1px solid var(--border); border-radius:var(--r-xl); box-shadow:var(--sh-2);
}
.factions__note{margin-right:auto; font-size:var(--fs-xs); color:var(--text-mute)}

/* Repeatable rows (media-source names, event rules). */
.repeat__row{
  display:flex; align-items:center; gap:var(--s-2); flex-wrap:wrap;
  padding:var(--s-3); border:1px solid var(--border); border-radius:var(--r-md);
  background:var(--surface-2); margin-bottom:var(--s-2);
}
.repeat__row input[type=text],.repeat__row input[type=search]{flex:1; min-width:180px}

/* chosen.js multiselects, themed to match the rest of the system. */
.chosen-container{font-family:var(--font); font-size:var(--fs-sm); max-width:520px}
.chosen-container-multi .chosen-choices,
.chosen-container-single .chosen-single{
  border:1px solid var(--border-strong)!important; border-radius:var(--r-md)!important;
  background:var(--surface)!important; box-shadow:none!important; padding:4px 6px!important;
  min-height:36px; color:var(--text);
}
.chosen-container-multi .chosen-choices li.search-choice{
  background:var(--c-amber-bg)!important; border:1px solid color-mix(in srgb,var(--c-amber) 25%,transparent)!important;
  border-radius:var(--r-pill)!important; color:var(--c-amber)!important; box-shadow:none!important;
  padding:3px 22px 3px 10px!important; font-size:var(--fs-xs); font-weight:600;
}
.chosen-container .chosen-drop{
  border-color:var(--border-strong)!important; border-radius:0 0 var(--r-md) var(--r-md);
  box-shadow:var(--sh-2); background:var(--surface);
}
.chosen-container .chosen-results li.highlighted{background:var(--c-amber)!important}

/* Chosen affordances redrawn (its sprite PNGs are intentionally not shipped). */
.chosen-container-single .chosen-single div b{
  position:relative; width:100%; height:100%;
}
.chosen-container-single .chosen-single div b::after{
  content:""; position:absolute; top:50%; right:6px; transform:translateY(-60%) rotate(45deg);
  width:6px; height:6px; border-right:2px solid var(--text-mute); border-bottom:2px solid var(--text-mute);
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{
  position:absolute; right:6px; top:50%; transform:translateY(-50%);
  width:12px; height:12px; opacity:.7;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close::before{
  content:"×"; font-size:14px; line-height:12px; color:currentColor;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{opacity:1}
.chosen-container-single .chosen-search input[type=text]{
  border:1px solid var(--border-strong)!important; border-radius:var(--r-sm); padding:6px 8px!important;
}

/* ===========================================================================
   PORTAL CHROME (publisher / advertiser)
   The portals are single-purpose: a handful of screens, used by external
   partners rather than staff. So they get a horizontal nav rather than the
   admin sidebar — fewer destinations, and it reads as "your account" instead
   of "the control room".
   =========================================================================== */
.pnav{
  position:sticky; top:0; z-index:60;
  display:flex; align-items:center; gap:var(--s-4);
  padding:0 var(--s-5); height:64px; color:#fff;
  background:linear-gradient(135deg,var(--navy-800),var(--navy-900) 60%,#0a2c55);
  box-shadow:0 2px 14px rgba(0,21,45,.28);
}
.pnav__brand img{height:30px; display:block}
.pnav__menu{display:flex; gap:2px; align-items:center}
.pnav__link{
  display:inline-flex; align-items:center; gap:7px;
  padding:9px 14px; border-radius:var(--r-md);
  color:rgba(255,255,255,.75); font-size:var(--fs-sm); font-weight:600; white-space:nowrap;
  transition:background .12s ease, color .12s ease;
}
.pnav__link:hover{background:rgba(255,255,255,.12); color:#fff; text-decoration:none}
.pnav__link .ic{opacity:.8}
.pnav__link.is-active{background:var(--c-amber); color:#fff; box-shadow:0 8px 18px -10px var(--c-amber)}
.pnav__link.is-active .ic{opacity:1}
.pnav__spacer{flex:1}
.pnav__who{display:flex; align-items:center; gap:9px; color:#fff}
.pnav__who .av{background:rgba(255,255,255,.16); color:#fff}
.pnav__name{font-size:var(--fs-sm); font-weight:600; max-width:180px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap}
@media (max-width:860px){
  .pnav{gap:var(--s-2); padding:0 var(--s-3); height:auto; flex-wrap:wrap; padding-bottom:var(--s-2)}
  .pnav__link span{display:none}
  .pnav__name{display:none}
}

/* Portal pages are narrower than the admin console — partners read them, they
   don't scan 20-column tables. */
.pnav ~ .page{max-width:1320px}
/* ===========================================================================
   INNERLY DIRECTION — dark rail, warm neutrals, one bright orange
   ---------------------------------------------------------------------------
   Appended as a layer rather than edited into the blocks above, so the whole
   change is one contiguous, revertible section and the earlier system stays
   readable as what it was.

   What changes and why:
     * The navigation moves onto a near-black rail. Sidebar and content were
       both white, so the eye had to find the boundary from a 1px border; a
       dark rail separates "where I am" from "what I am reading" without any
       border at all, and lets the accent carry the active state on its own.
     * One orange, brighter than the old amber, used for exactly three things:
       the active nav item, the primary action, and data marks. Everything that
       used a second accent colour loses it.
     * Warm greys instead of cool ones, so white cards on a white page separate
       by a hairline and a corner radius rather than by shadow.
     * Larger radii and more air. The old scale was built for maximum rows per
       screen; this one trades a little density for legibility, which is the
       trade the reference makes.
   =========================================================================== */
:root[data-skin="modern"]{
  /* The shared sidebar-footer rules read these; under this skin they point at
     the rail rather than at the page surface. */
  --side-bg:var(--rail); --side-line:var(--rail-line);

  /* One accent. Brighter and warmer than the old amber so it reads as a
     deliberate mark on a white page rather than as brown text. */
  --amber-600:#c2410c; --amber-500:#f97316; --amber-400:#fb923c;
  --accent-soft:#fff2e6;

  /* Warm neutrals: white cards separate from a white page by a hairline. */
  --n-0:#ffffff;  --n-25:#fcfcfc; --n-50:#f7f7f8; --n-100:#f1f1f2;
  --n-200:#e8e8ea; --n-300:#d6d6da; --n-400:#9d9da5; --n-500:#71717a;
  --n-600:#52525b; --n-700:#3f3f46; --n-800:#27272a; --n-900:#18181b;

  /* The rail. Fixed values, not theme tokens: it is dark in both themes
     because that is what makes the layout legible, not a preference. */
  --rail:#131316; --rail-2:#1c1c20; --rail-line:#26262b;
  --rail-text:#a1a1aa; --rail-text-strong:#fafafa; --rail-label:#6b6b74;

  --bg:var(--n-0);              /* content sits on white, cards on hairlines */
  --surface:var(--n-0); --surface-2:var(--n-50);
  --border:var(--n-200); --border-strong:var(--n-300);
  --text:var(--n-900); --text-dim:var(--n-500); --text-mute:var(--n-400);
  --link:var(--n-900);

  --fs-xs:11px; --fs-sm:12.5px; --fs-md:13.5px; --fs-lg:15px; --fs-xl:20px; --fs-2xl:27px;

  --r-sm:8px; --r-md:10px; --r-lg:14px; --r-xl:16px;
  /* Almost no shadow. Depth comes from the rail and from radius. */
  --sh-1:0 1px 2px rgba(24,24,27,.04);
  --sh-2:0 6px 18px rgba(24,24,27,.08);
  --sh-3:0 16px 40px rgba(24,24,27,.12);
  --ring:0 0 0 3px rgba(249,115,22,.25);

  --topbar-h:64px;
  --side-w:248px;
}

/* Dark theme keeps the same rail and moves the content to match it. */
:root[data-skin="modern"][data-theme="dark"]{
  --bg:#0f0f11; --surface:#161619; --surface-2:#1c1c20;
  --border:#26262b; --border-strong:#33333a;
  --text:#f4f4f5; --text-dim:#a1a1aa; --text-mute:#71717a;
  --link:#f4f4f5; --accent-soft:#2a1a0e;
}

/* ------------------------------------------------------------- the rail -- */
:root[data-skin="modern"] .side{
  background:var(--rail); border-right:0; padding:var(--s-4) var(--s-3);
  gap:1px; color:var(--rail-text);
}
:root[data-skin="modern"] .side__brand{
  padding:2px 6px var(--s-5); gap:var(--s-3);
}
/* The logo is a dark-on-light mark; on the rail it needs to be light-on-dark. */
:root[data-skin="modern"] .side__brand img{height:24px; filter:brightness(0) invert(1); opacity:.95}
:root[data-skin="modern"] .side__label{
  color:var(--rail-label); font-size:10.5px; letter-spacing:.08em;
  padding:0 10px 6px; font-weight:600;
}
:root[data-skin="modern"] .side__group{margin-top:var(--s-5)}
:root[data-skin="modern"] .side__link{
  color:var(--rail-text); padding:9px 10px; border-radius:var(--r-md);
  font-size:var(--fs-md); font-weight:500;
}
:root[data-skin="modern"] .side__link:hover,
:root[data-skin="modern"][data-theme="dark"] .side__link:hover{background:var(--rail-2); color:var(--rail-text-strong)}
:root[data-skin="modern"] .side__link .ic{opacity:.65}
:root[data-skin="modern"] .side__link.is-active,
:root[data-skin="modern"][data-theme="dark"] .side__link.is-active{
  background:var(--rail-2); color:var(--amber-400); font-weight:600;
}
:root[data-skin="modern"] .side__link.is-active .ic{opacity:1; color:var(--amber-500)}
:root[data-skin="modern"] .side__badge{background:var(--amber-500); color:#fff; font-weight:650}
:root[data-skin="modern"] .side__foot{border-top:1px solid var(--rail-line); padding-top:var(--s-3)}
:root[data-skin="modern"] .side__user{color:var(--rail-text)}
:root[data-skin="modern"] .side__user b,
:root[data-skin="modern"] .side__user strong{color:var(--rail-text-strong)}
:root[data-skin="modern"] .side .avatar{background:var(--rail-2); color:var(--rail-text-strong)}

/* ----------------------------------------------------------- the header -- */
/* White, not navy: with a dark rail a dark header boxes the content in on two
   sides and the page stops reading as a document. */
:root[data-skin="modern"] .topbar{
  background:var(--surface); color:var(--text);
  border-bottom:1px solid var(--border); box-shadow:none;
}
:root[data-skin="modern"] .topbar__link{color:var(--text-dim); font-weight:500}
:root[data-skin="modern"] .topbar__link:hover{background:var(--n-100); color:var(--text)}
:root[data-skin="modern"] .topbar__link--accent{background:var(--amber-500); color:#fff}
:root[data-skin="modern"] .topbar__logo img{height:24px}

/* ------------------------------------------------------------ page head -- */
:root[data-skin="modern"] .page{padding:var(--s-6) var(--s-6) var(--s-8)}
:root[data-skin="modern"] .page-title{font-size:var(--fs-2xl); font-weight:680; letter-spacing:-.025em}
/* The accent rule under the title was decoration standing in for hierarchy.
   Size and weight do that job here, so it goes. */
:root[data-skin="modern"] .page-title::after{display:none}
:root[data-skin="modern"] .crumb{text-transform:none; letter-spacing:0; font-size:var(--fs-sm)}

/* ---------------------------------------------------------------- cards -- */
:root[data-skin="modern"] .card{border-radius:var(--r-xl); border-color:var(--border); box-shadow:none}
:root[data-skin="modern"] .card__head{padding:var(--s-4) var(--s-5); border-bottom:1px solid var(--border)}
:root[data-skin="modern"] .card__body{padding:var(--s-5)}
:root[data-skin="modern"] .card__t{font-size:var(--fs-lg); font-weight:600; letter-spacing:-.01em}

/* --------------------------------------------------------------- action -- */
:root[data-skin="modern"] .btn{
  border-radius:var(--r-md); border-color:var(--border); background:var(--surface);
  font-weight:550; padding:8px 13px;
}
:root[data-skin="modern"] .btn:hover{background:var(--surface-2)}
:root[data-skin="modern"] .btn--primary{background:var(--amber-500); border-color:var(--amber-500); color:#fff}
:root[data-skin="modern"] .btn--primary:hover{background:var(--amber-400); border-color:var(--amber-400)}
:root[data-skin="modern"] .btn--sm{padding:5px 10px; font-size:var(--fs-sm)}

/* ------------------------------------------------------------------ kpi -- */
:root[data-skin="modern"] .kpi{border-radius:var(--r-xl); box-shadow:none; padding:var(--s-5)}
:root[data-skin="modern"] .kpi__label{
  text-transform:none; letter-spacing:0; font-size:var(--fs-sm); font-weight:500;
  color:var(--text-dim);
}
:root[data-skin="modern"] .kpi__value{font-size:30px; font-weight:680; letter-spacing:-.03em}
/* One accent means the KPI chips stop being six different colours. */
:root[data-skin="modern"] .kpi__chip{background:var(--accent-soft); color:var(--amber-600)}
:root[data-skin="modern"][data-theme="dark"] .kpi__chip{background:var(--accent-soft); color:var(--amber-400)}

/* ---------------------------------------------------------------- tiles -- */
:root[data-skin="modern"] .tile{border-radius:var(--r-lg); border-color:var(--border); box-shadow:none}
:root[data-skin="modern"] .tile:hover{border-color:var(--border-strong); box-shadow:var(--sh-1); transform:none}
:root[data-skin="modern"] .tile__icon{background:var(--surface-2); color:var(--text-dim); border-radius:var(--r-md)}
:root[data-skin="modern"] .tile:hover .tile__icon{background:var(--amber-500); color:#fff}
:root[data-skin="modern"] .tile__label{font-size:var(--fs-md); font-weight:550}

/* ---------------------------------------------------------------- table -- */
/* Zebra striping and a grey header did the separating; hairlines and a hover
   row do it with less ink, which matters on a 20-column report. */
:root[data-skin="modern"] table.data thead th{
  background:var(--surface); color:var(--text-mute);
  font-size:10.5px; letter-spacing:.06em; border-bottom:1px solid var(--border);
}
:root[data-skin="modern"] table.data tbody tr:hover td{background:var(--surface-2)}
:root[data-skin="modern"] .toolbar{padding:var(--s-4) var(--s-5); border-radius:var(--r-xl) var(--r-xl) 0 0}
:root[data-skin="modern"] .tablewrap{border-radius:0 0 var(--r-xl) var(--r-xl)}

/* ----------------------------------------------------------------- pill -- */
:root[data-skin="modern"] .pill{border-radius:var(--r-pill); font-weight:600}

/* ------------------------------------------------------------------ tab -- */
:root[data-skin="modern"] .tab.is-active{background:var(--n-900); color:#fff}
:root[data-skin="modern"][data-theme="dark"] .tab.is-active{background:var(--amber-500)}
:root[data-skin="modern"] .pager strong{background:var(--n-900); border-color:var(--n-900)}

/* --- one accent, continued -------------------------------------------------
   The panel had grown an eight-colour identity system: indigo/teal/violet/rose/
   sky/emerald/slate/amber, applied to quick actions, KPI cards and every nav
   tile. On this direction that reads as noise — the colour was decorative, not
   informative, since the hue never told you anything the label did not.

   The colour variables stay defined and the class names stay on the markup, so
   nothing needs re-templating and a single deletion of this block brings the
   old identity straight back. Status pills and chart marks keep their colour:
   there the hue IS the information.
   -------------------------------------------------------------------------- */
:root[data-skin="modern"] .btn3d,
:root[data-skin="modern"] .btn3d--indigo,
:root[data-skin="modern"] .btn3d--teal,
:root[data-skin="modern"] .btn3d--violet,
:root[data-skin="modern"] .btn3d--rose,
:root[data-skin="modern"] .btn3d--sky,
:root[data-skin="modern"] .btn3d--emerald,
:root[data-skin="modern"] .btn3d--slate{
  background:var(--surface); color:var(--text);
  border:1px solid var(--border); border-radius:var(--r-md);
  padding:9px 15px; font-weight:550; box-shadow:none;
}
:root[data-skin="modern"] .btn3d:hover{
  background:var(--surface-2); color:var(--text); transform:none;
  box-shadow:none; filter:none; border-color:var(--border-strong);
}
:root[data-skin="modern"] .btn3d:active{transform:none; box-shadow:none}
:root[data-skin="modern"] .btn3d:focus-visible{outline:none; box-shadow:var(--ring)}
:root[data-skin="modern"] .btn3d .ic{color:var(--text-mute)}

/* Exactly one filled action per row, and it is the first one. Anything else
   makes the eye choose between five equally loud buttons. */
:root[data-skin="modern"] .quick .btn3d:first-of-type,
:root[data-skin="modern"] .quick .btn3d:first-of-type:hover{
  background:var(--amber-500); border-color:var(--amber-500); color:#fff;
}
:root[data-skin="modern"] .quick .btn3d:first-of-type .ic{color:#fff}
:root[data-skin="modern"] .quick{border-radius:var(--r-xl); box-shadow:none; padding:var(--s-4) var(--s-5)}
:root[data-skin="modern"] .quick__label{text-transform:none; letter-spacing:0; font-size:var(--fs-sm); font-weight:500}

/* KPI cards: no coloured wash, no lift, one chip treatment. */
:root[data-skin="modern"] .kpi,
:root[data-skin="modern"] .kpi--indigo,
:root[data-skin="modern"] .kpi--teal,
:root[data-skin="modern"] .kpi--violet,
:root[data-skin="modern"] .kpi--rose,
:root[data-skin="modern"] .kpi--amber,
:root[data-skin="modern"] .kpi--sky,
:root[data-skin="modern"] .kpi--emerald,
:root[data-skin="modern"] .kpi--slate{
  box-shadow:none;
}
:root[data-skin="modern"] .kpi::after{display:none}
:root[data-skin="modern"] .kpi:hover{transform:none; box-shadow:var(--sh-1); border-color:var(--border-strong)}
:root[data-skin="modern"] .kpi__chip,
:root[data-skin="modern"] .kpi--indigo .kpi__chip,
:root[data-skin="modern"] .kpi--teal .kpi__chip,
:root[data-skin="modern"] .kpi--violet .kpi__chip,
:root[data-skin="modern"] .kpi--rose .kpi__chip,
:root[data-skin="modern"] .kpi--amber .kpi__chip,
:root[data-skin="modern"] .kpi--sky .kpi__chip,
:root[data-skin="modern"] .kpi--emerald .kpi__chip,
:root[data-skin="modern"] .kpi--slate .kpi__chip{
  background:var(--accent-soft); color:var(--amber-600); box-shadow:none;
}
:root[data-skin="modern"] .kpi__label{font-size:var(--fs-sm); font-weight:500; letter-spacing:0; text-transform:none}
:root[data-skin="modern"] .kpi__value{font-size:32px; font-weight:680; letter-spacing:-.03em; margin-top:var(--s-2)}

/* Nav tiles: hairline card, muted chip, accent only on hover. */
:root[data-skin="modern"] .tile__icon,
:root[data-skin="modern"] .tile--indigo .tile__icon,
:root[data-skin="modern"] .tile--teal .tile__icon,
:root[data-skin="modern"] .tile--violet .tile__icon,
:root[data-skin="modern"] .tile--rose .tile__icon,
:root[data-skin="modern"] .tile--amber .tile__icon,
:root[data-skin="modern"] .tile--sky .tile__icon,
:root[data-skin="modern"] .tile--emerald .tile__icon{
  background:var(--surface-2); color:var(--text-dim); box-shadow:none;
}
:root[data-skin="modern"] .tile:hover,
:root[data-skin="modern"] .tile--indigo:hover,
:root[data-skin="modern"] .tile--teal:hover,
:root[data-skin="modern"] .tile--violet:hover,
:root[data-skin="modern"] .tile--rose:hover,
:root[data-skin="modern"] .tile--amber:hover,
:root[data-skin="modern"] .tile--sky:hover,
:root[data-skin="modern"] .tile--emerald:hover{
  border-color:var(--border-strong); box-shadow:var(--sh-1); transform:none;
}
:root[data-skin="modern"] .tile:hover .tile__icon,
:root[data-skin="modern"] .tile--indigo:hover .tile__icon,
:root[data-skin="modern"] .tile--teal:hover .tile__icon,
:root[data-skin="modern"] .tile--violet:hover .tile__icon,
:root[data-skin="modern"] .tile--rose:hover .tile__icon,
:root[data-skin="modern"] .tile--amber:hover .tile__icon,
:root[data-skin="modern"] .tile--sky:hover .tile__icon,
:root[data-skin="modern"] .tile--emerald:hover .tile__icon{
  background:var(--amber-500); color:#fff; box-shadow:none;
}

/* The active rail item is a filled pill, not a tinted gradient with a bar. */
:root[data-skin="modern"] .side__link.is-active{
  background:var(--rail-2); box-shadow:none; color:var(--amber-400);
}

/* Primary button loses the lift it was given to match the 3D language. */
:root[data-skin="modern"] .btn--primary{
  background:var(--amber-500); border-color:var(--amber-500); box-shadow:none;
}
:root[data-skin="modern"] .btn--primary:hover{background:var(--amber-400); border-color:var(--amber-400); transform:none; box-shadow:none}

/* The section headings above each tile grid. */
:root[data-skin="modern"] .sect__t{text-transform:none; letter-spacing:0; font-size:var(--fs-sm); font-weight:600; color:var(--text-dim)}

/* --- sidebar footer --------------------------------------------------------
   The nav is forty-odd items long, so the footer sat at the bottom of a long
   scroll: signing out or changing a password meant scrolling the rail to its
   end first. Pinning it to the bottom of the rail costs one row of nav height
   and makes both reachable from anywhere.

   Its contents were styled for a white sidebar. On the rail the avatar was a
   near-white disc and the "Change password" link inherited the near-black body
   link colour, which made it invisible against the dark background.
   -------------------------------------------------------------------------- */

/* A short fade so a scrolling nav item does not appear to collide with the
   pinned footer's top edge. */


:root[data-skin="modern"] .side .av,
:root[data-skin="modern"][data-theme="dark"] .side .av{
  background:var(--rail-2); color:var(--rail-text-strong);
  box-shadow:inset 0 0 0 1px var(--rail-line); font-size:11.5px;
}
:root[data-skin="modern"] .side .cellwho__t{color:var(--rail-text-strong); font-size:12.5px !important; font-weight:600}
:root[data-skin="modern"] .side .cellwho__s{color:var(--rail-label)}
:root[data-skin="modern"] .side .cellwho__s a{color:var(--rail-label)}
:root[data-skin="modern"] .side .cellwho__s a:hover{color:var(--rail-text-strong); text-decoration:none}

/* --- header ----------------------------------------------------------------
   The header carried its own colours inline, which meant the stylesheet could
   not restyle it at all. Those are gone; what is left is making its controls
   share the one shape the rest of the panel now uses — 10px corners, a hairline
   border, a muted icon — instead of three different ones.
   -------------------------------------------------------------------------- */
:root[data-skin="modern"] .topbar{padding:0 var(--s-5); gap:var(--s-3)}
:root[data-skin="modern"] .gsearch__box input[type=search]{
  border-radius:var(--r-md); height:36px; padding-left:34px;
  border:1px solid var(--border); background:var(--surface); font-size:var(--fs-md);
}
:root[data-skin="modern"] .gsearch__box input[type=search]:focus{border-color:var(--border-strong)}
:root[data-skin="modern"] .gsearch__box input[type=search]::placeholder{color:var(--text-mute)}
:root[data-skin="modern"] .gsearch__box > .ic{opacity:.4; left:12px}

:root[data-skin="modern"] .tbctl select{
  height:36px; border-radius:var(--r-md); border-color:var(--border);
  font-weight:550; padding:0 28px 0 12px;
}
:root[data-skin="modern"] .tbctl select:hover{border-color:var(--border-strong)}
:root[data-skin="modern"] .tbctl > .ic{display:none}   /* the select's own label already says what it is */

/* Rounded-square icon buttons, matching the reference's header controls. */
:root[data-skin="modern"] .topbar .iconbtn{
  width:36px; height:36px; border:1px solid var(--border);
  background:var(--surface); border-radius:var(--r-md); color:var(--text-dim);
}
:root[data-skin="modern"] .topbar .iconbtn:hover,
:root[data-skin="modern"][data-theme="dark"] .topbar .iconbtn:hover{
  background:var(--surface-2); color:var(--text); border-color:var(--border-strong);
}

/* The rail's own bottom padding sits below the sticky footer, and scrolled nav
   items showed through that strip. Move the space inside the footer instead. */




/* ===========================================================================
   SIDEBAR FOOTER — applies to every skin
   ---------------------------------------------------------------------------
   Not part of the skin: this is a usability fix, not a look. The nav is forty
   items long, so the footer sat at the end of a long scroll and signing out or
   changing a password meant scrolling the rail to its bottom first. Pinning it
   costs one row of nav height and makes both reachable from anywhere.

   The two tokens below are what let one set of rules serve a white sidebar and
   a near-black one; each skin points them at its own surface.
   =========================================================================== */
:root{ --side-bg:var(--surface); --side-line:var(--border); }

.side__foot{
  position:sticky; bottom:0; z-index:1;
  margin-top:auto; padding:var(--s-3) 0 var(--s-4);
  background:var(--side-bg); border-top:1px solid var(--side-line);
}
/* A short fade so a scrolling nav item does not appear to collide with the
   pinned footer's top edge. */
.side__foot::before{
  content:""; position:absolute; left:0; right:0; top:-20px; height:20px;
  background:linear-gradient(to top,var(--side-bg),transparent); pointer-events:none;
}
/* The rail's own bottom padding sits below a bottom-pinned element, and
   scrolled nav items showed through that strip. The space moves inside. */
.side{padding-bottom:0}
.side__user{padding:var(--s-2) 10px; gap:11px}

/* ===========================================================================
   PORTAL NAV — modern skin
   ---------------------------------------------------------------------------
   The advertiser and publisher screens navigate from a bar across the top
   rather than the admin rail, so the rail work does not reach them. Everything
   else there — buttons, cards, type, spacing — already comes from the tokens
   and changes with the skin on its own; this is the one component that needed
   its own translation.

   It becomes the same near-black surface as the admin rail, so an admin who
   uses "log in as" moves between the two without the look changing underneath
   them, and the active tab carries the accent the way the rail's does.
   =========================================================================== */
:root[data-skin="modern"] .pnav{
  background:var(--rail); box-shadow:none;
  border-bottom:1px solid var(--rail-line); color:var(--rail-text-strong);
}
:root[data-skin="modern"] .pnav__brand img{filter:brightness(0) invert(1); opacity:.95}
:root[data-skin="modern"] .pnav__link{
  color:var(--rail-text); font-weight:550; border-radius:var(--r-md);
}
:root[data-skin="modern"] .pnav__link:hover{
  background:var(--rail-2); color:var(--rail-text-strong);
}
:root[data-skin="modern"] .pnav__link.is-active{
  background:var(--rail-2); color:var(--amber-400); box-shadow:none;
}
:root[data-skin="modern"] .pnav__link.is-active .ic{color:var(--amber-500)}
:root[data-skin="modern"] .pnav__who{color:var(--rail-text-strong)}
:root[data-skin="modern"] .pnav__who .av{
  background:var(--rail-2); color:var(--rail-text-strong);
  box-shadow:inset 0 0 0 1px var(--rail-line);
}
:root[data-skin="modern"] .pnav .iconbtn{color:var(--rail-text)}
:root[data-skin="modern"] .pnav .iconbtn:hover{background:var(--rail-2); color:var(--rail-text-strong)}
:root[data-skin="modern"] .pnav .btn{
  background:transparent; border-color:var(--rail-line); color:var(--rail-text);
}
:root[data-skin="modern"] .pnav .btn:hover{background:var(--rail-2); color:var(--rail-text-strong)}

/* ===========================================================================
   UTILITIES for markup that used to carry its own colours
   ---------------------------------------------------------------------------
   Sixteen places across the panel painted themselves with a literal hex value
   in a style attribute — notice banners, a section header, two bits of warning
   text, the portal nav's links. Inline styles beat every stylesheet rule, so
   those places were the ones that would have stayed on the old palette after a
   skin change, and they were also invisible in dark mode where a #f4f4f4 panel
   sits under white text. They now use these.
   =========================================================================== */
.note--mute{border-color:var(--border); background:var(--surface-2); color:var(--text-dim)}
.muted{color:var(--text-mute)}
.text-bad{color:var(--bad-fg)}
/* A run-in header row inside a .kv sheet. */
.kv__section{background:var(--surface-2); font-weight:650; color:var(--text)}

/* The portal nav's links and its log-out button held their light-on-navy
   colours inline; they read from the nav's own tokens now, which is what lets
   the skin restyle the bar at all. */
.pnav__brand,.pnav__brand:hover{color:inherit; text-decoration:none}
.pnav .btn{
  background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.2); color:#fff;
}
.pnav .btn:hover{background:rgba(255,255,255,.2); color:#fff}
