/* ---------- monthly: sticky compare bar + collapsible timeline ---------- */
.range-bar.sticky-range{position:sticky;top:0;z-index:30;background:var(--surface);
  box-shadow:0 2px 10px rgba(20,32,44,.08);border-radius:12px}
/* ---- collapsible timeline with a faded peek of the real data ---- */
.tl-peek{border-top:1px solid var(--line);padding:14px 16px 16px}
.tl-peekhead{display:flex;align-items:flex-start;gap:12px;margin-bottom:8px}
.tl-headmain{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}
.tl-peekhead h3{margin:0;font-size:14px}
.tl-peekhead .tl-legend{font-size:11.5px;color:var(--muted);font-weight:500;line-height:1.35}
.tl-legend .m{color:#315f89} .tl-legend .g{color:#0f7b55}
.tl-expand{flex:none;display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;
  background:var(--brand);color:#fff;font-size:12px;font-weight:700;padding:7px 14px;border-radius:999px;
  box-shadow:0 4px 12px rgba(47,109,176,.25);transition:.15s}
.tl-expand:hover{filter:brightness(1.07)}
.tl-expand .tl-chevbtn{width:20px;height:20px;border-radius:50%;background:rgba(255,255,255,.22);
  display:grid;place-items:center;font-size:12px;transition:transform .2s ease}
.tl-expand .hide{display:none}
.tl-peekbody{position:relative;max-height:230px;overflow:hidden;transition:max-height .35s ease;
  -webkit-mask-image:linear-gradient(180deg,#000 55%,transparent 100%);mask-image:linear-gradient(180deg,#000 55%,transparent 100%)}
.tl-fade{position:absolute;left:0;right:0;bottom:0;height:130px;display:flex;align-items:flex-end;justify-content:center;
  padding-bottom:8px;cursor:pointer;background:linear-gradient(180deg,transparent,var(--surface) 80%)}
.tl-fadebtn{background:var(--surface);border:1.5px solid var(--brand);color:var(--brand);font-size:12px;font-weight:800;
  padding:7px 16px;border-radius:999px;box-shadow:0 4px 14px rgba(47,109,176,.18)}
.tl-fade:hover .tl-fadebtn{background:var(--brand);color:#fff}
.tl-cb:checked + .tl-peek .tl-peekbody{max-height:6000px;-webkit-mask-image:none;mask-image:none}
.tl-cb:checked + .tl-peek .tl-fade{display:none}
.tl-cb:checked + .tl-peek .tl-expand .show{display:none}
.tl-cb:checked + .tl-peek .tl-expand .hide{display:inline}
.tl-cb:checked + .tl-peek .tl-expand .tl-chevbtn{transform:rotate(180deg)}

/* legend colour chips for the summary metrics */
.lg-chip{display:inline-block;padding:1px 8px;border-radius:6px;font-weight:800;font-size:11px;border-left:3px solid}
.lg-spend{background:#fff3ec;color:#c2410c;border-left-color:#f59e0b}
.lg-omzet{background:#eef4ff;color:#2563eb;border-left-color:#3b82f6}
.lg-winst{background:#eff8f1;color:#15803d;border-left-color:#22c55e}

/* Meta/Google split under the summary Spend total cell */
.msum-split{margin-top:7px;padding-top:6px;border-top:1px dashed var(--line-strong);text-align:left}
.msum-split .ms-cap{font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);margin-bottom:3px}
.msum-split .ms-row{display:flex;align-items:center;gap:6px;margin-top:3px}
.msum-split .ms-yr{font-size:9px;font-weight:800;color:#fff;background:#9aa4b2;border-radius:4px;padding:1px 4px;flex:none}
.msum-split .ms-row:last-child .ms-yr{background:#3b5bdb}
.msum-split .split-bar.mini{height:8px;border-radius:3px;flex:1;min-width:42px}
.msum-split .ms-lab{font-size:9.5px;font-weight:800;font-variant-numeric:tabular-nums;flex:none;white-space:nowrap}
.msum-split .ms-lab .m{color:#315f89} .msum-split .ms-lab .g{color:#0f7b55}
.tl-pv-net{font-size:10px;font-weight:700;color:var(--muted);font-style:italic}

/* ---------- monthly: sticky table headers (stick below the compare bar) ---------- */
body[data-page="monthly"]{--rb:58px}
/* un-clip ancestors so headers can stick to the page, not an inner scroll box */
.panel:has(.msum-table),.panel:has(.month-table){overflow:visible}
.panel:has(.msum-table) .table-wrap,.panel:has(.month-table) .table-wrap{overflow:visible}
/* top summary (single header row) */
.msum-table thead th{position:sticky;top:var(--rb);z-index:6;background:var(--surface);box-shadow:0 2px 0 var(--line)}
.msum-table thead th.msum-shop-h,.msum-table thead th.msum-metric-h{background:var(--surface)}
/* per-shop month table (two header rows) */
.month-table thead tr:first-child th{position:sticky;top:var(--rb);z-index:6}
.month-table thead tr:nth-child(2) th{position:sticky;top:calc(var(--rb) + 37px);z-index:5;box-shadow:0 2px 0 var(--line)}
.month-table thead th{background:var(--surface-2)}
/* campaign timeline tables (only need sticky once expanded) */
.tl-cb:checked + .tl-peek .tl-peekbody{overflow:visible}
.tl-table thead th{background:var(--surface)}
.tl-table thead tr:first-child th{position:sticky;top:var(--rb);z-index:5}
.tl-table thead tr:nth-child(2) th{position:sticky;top:calc(var(--rb) + 20px);z-index:5;box-shadow:0 2px 0 var(--line)}

/* ================= monthly: strategy advisor (per brand) ================= */
.strat{border:1px solid var(--line);overflow:visible}
.strat-topbar{padding:18px 22px 4px}
.strat-eyebrow{font-size:11.5px;font-weight:700;letter-spacing:.02em;color:var(--brand);text-transform:uppercase}
.strat-title{font-size:19px;margin:6px 0 0;letter-spacing:-.01em}
.strat-note{margin:10px 22px 4px;font-size:12px;color:var(--muted);line-height:1.5;background:#fff7ec;border:1px solid #f0dcae;border-radius:10px;padding:10px 13px}
.strat-note b{color:var(--ink)} .strat-note em{font-style:normal;font-weight:700;color:var(--ink)}
.strat-brands{display:grid;grid-template-columns:repeat(auto-fit,minmax(430px,1fr));gap:14px;padding:14px 22px 6px}
.brandcard{border:1px solid var(--line);border-radius:14px;padding:14px;background:var(--surface);border-top:4px solid var(--line)}
.brandcard.stance-scale{border-top-color:var(--good)} .brandcard.stance-fix{border-top-color:var(--bad)} .brandcard.stance-hold{border-top-color:var(--warn)}
.bc-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.bc-stance{margin-left:auto;font-size:12px;font-weight:800}
.bc-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(88px,1fr));gap:9px;margin:12px 0;padding:11px;background:var(--surface-2);border-radius:10px}
.bck{display:flex;flex-direction:column;gap:1px}
.bck span{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.02em;font-weight:700}
.bck b{font-size:16px;font-weight:800;font-variant-numeric:tabular-nums}
.bck em{font-style:normal;font-size:9.5px;color:var(--muted);font-weight:600}
.bc-channels{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin-bottom:12px}
.bcchan{border:1px solid var(--line);border-radius:10px;padding:9px 11px;display:flex;flex-direction:column;gap:3px;border-left:4px solid var(--line-strong)}
.bcchan.ok{border-left-color:var(--good);background:#f2fbf6} .bcchan.bad{border-left-color:var(--bad);background:#fdf3f2} .bcchan.empty{opacity:.55}
.bcchan .pf{align-self:flex-start}
.bcc-roas{font-size:17px;font-weight:800;font-variant-numeric:tabular-nums}
.bcchan.ok .bcc-roas{color:var(--good)} .bcchan.bad .bcc-roas{color:var(--bad)}
.bcc-sub{font-size:10.5px;color:var(--muted);font-weight:600}
.pf{font-size:9.5px;font-weight:800;color:#fff;border-radius:5px;padding:1px 6px;flex:none;display:inline-block}
.pf.meta{background:#315f89} .pf.google{background:#0f7b55}
.bc-lists{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.bcl-h{font-size:12px;font-weight:800;margin-bottom:6px}
.bccamp{display:flex;align-items:center;gap:6px;background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:5px 8px;margin-bottom:5px}
.bcc-name{font-size:11.5px;font-weight:700;color:var(--ink);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
a.bcc-name:hover{color:var(--brand);text-decoration:underline}
.bccamp .bcc-roas{font-size:12px;margin-left:auto}
.bccamp .bcc-roas.good{color:var(--good)} .bccamp .bcc-roas.bad{color:var(--bad)}
.bcl-waste{margin:4px 0 0;font-size:11px;font-weight:700;color:var(--bad)}
.stempty{font-size:11.5px;color:var(--muted);text-align:center;padding:8px 0}
.strat-caveat{margin:0;padding:8px 22px 20px;font-size:11.5px;color:var(--muted);line-height:1.5}
.strat-caveat b{color:var(--ink)} .strat-caveat em{font-style:normal;font-weight:700;color:var(--ink)}
.good{color:var(--good)} .bad{color:var(--bad)}
@media(max-width:520px){.bc-channels,.bc-lists{grid-template-columns:1fr}}

/* ---------- attribution: modeled channel split ---------- */
.mdl-tag{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:#fff;background:#8a5cc2;border-radius:5px;padding:1px 6px;vertical-align:middle;margin-left:6px}
.mdl-table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}
.mdl-table th{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--muted);text-align:left;padding:8px 10px;border-bottom:2px solid var(--line)}
.mdl-table td{padding:9px 10px;border-bottom:1px solid var(--line);font-size:12.5px;vertical-align:middle}
.mdl-table .mdl-num{font-weight:800;font-size:14px}
.mdl-table small{display:block;color:var(--muted);font-weight:600;margin-top:2px}
.mdl-table small.good{color:var(--good)}
.mdl-bar{height:9px;border-radius:999px;background:var(--surface-2);border:1px solid var(--line);overflow:hidden;min-width:120px}
.mdl-bar .seg{display:block;height:100%;background:#647285}
.mdl-bar .seg.good{background:var(--good)}
.mdl-org b.good{color:var(--good)}
.mdl-note{margin:12px 0 0;font-size:11.5px;color:var(--muted);line-height:1.5}
.mdl-note b{color:var(--ink)}

/* ================= journeys dashboard ================= */
.kpi-foot{margin-top:7px;padding-top:7px;border-top:1px solid var(--line);font-size:11px;color:var(--muted);font-weight:600}
.live-dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--good);animation:pulse 2s infinite;vertical-align:middle;margin-left:4px}
.cap-grid{display:grid;grid-template-columns:1fr 1.2fr;gap:20px}
@media(max-width:820px){.cap-grid{grid-template-columns:1fr}}
.cap-chan{margin-bottom:10px}
.cap-top{display:flex;justify-content:space-between;align-items:center;font-size:12.5px;margin-bottom:3px}
.cap-top b{font-variant-numeric:tabular-nums}
.attr-name{display:flex;align-items:center;gap:7px;font-weight:600}
.attr-name i{width:10px;height:10px;border-radius:3px;flex:none}
.attr-bar{height:8px;border-radius:999px;background:var(--surface-2);border:1px solid var(--line);overflow:hidden}
.attr-bar span{display:block;height:100%}
.cap-stream{border-left:1px solid var(--line);padding-left:18px}
.cap-stream-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);margin-bottom:8px}
.cap-ev{display:flex;align-items:center;gap:8px;padding:5px 0;border-bottom:1px solid var(--line);font-size:12px;flex-wrap:wrap}
.cap-camp{color:var(--muted);font-weight:600;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cap-vid{color:var(--muted);font-family:monospace;font-size:11px}
.cap-ev small{margin-left:auto;color:var(--muted);font-variant-numeric:tabular-nums}
.touch{display:inline-block;padding:2px 9px;border-radius:999px;font-size:11.5px;font-weight:700;color:#fff;background:var(--c,#64727f)}
.touch.activity{background:color-mix(in srgb,var(--c,#64727f) 12%,var(--surface));color:var(--c,#64727f);border:1px solid color-mix(in srgb,var(--c,#64727f) 36%,var(--line));font-weight:800}
.touch.activity.cart{background:#fff7eb;color:#9a5e05;border-color:#efc887}
.touch.activity.checkout{background:#eef5fc;color:#245f9a;border-color:#b7d3ee}
.touch.buy{background:#16202c}
.perf-table tr.row-hi td{background:color-mix(in srgb,#2f6db0 8%,var(--surface))}
.perf-table td .split-bar{min-width:120px;height:14px;border-radius:7px;background:color-mix(in srgb,#64727f 16%,var(--surface))}
.perf-table code{font-size:12.5px;font-weight:700}
.bad-text{color:var(--bad);font-variant-numeric:tabular-nums;white-space:nowrap}
.tier{display:inline-block;margin:1px 5px 1px 0;padding:1px 7px;border-radius:6px;background:var(--surface-2);border:1px solid var(--line);font-size:11.5px;font-weight:700;color:var(--muted)}
.tier b{color:var(--ink)}
/* journey filters */
.journey-filters{display:flex;flex-direction:column;gap:9px;padding:11px 13px;margin-bottom:10px;background:var(--surface-2);border:1px solid var(--line);border-radius:12px}
.jf-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.jf-search{flex:1;min-width:200px;padding:8px 13px;border:1px solid var(--line-strong);border-radius:999px;font-size:13px;background:var(--surface);color:var(--ink)}
.jf-count{font-size:12px;color:var(--muted);font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.jf-reset{border:1px solid var(--line-strong);background:var(--surface);color:var(--muted);border-radius:999px;padding:6px 13px;font-size:12px;font-weight:700;cursor:pointer}
.jf-reset:hover{color:var(--ink);border-color:var(--muted)}
.jf-groups{display:flex;gap:18px;flex-wrap:wrap}
.jf-group{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.jf-lbl{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}
.jf-chips{display:flex;gap:6px;flex-wrap:wrap}
.jf-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 11px;border-radius:999px;border:1px solid color-mix(in srgb,var(--c,#64727f) 34%,var(--line));background:color-mix(in srgb,var(--c,#64727f) 9%,var(--surface));color:var(--ink);font-size:12px;font-weight:700;cursor:pointer;line-height:1.5;transition:.12s}
.jf-chip i{width:8px;height:8px;border-radius:50%;background:var(--c,#64727f);flex:none}
.jf-chip b{font-variant-numeric:tabular-nums;opacity:.65;font-weight:800}
.jf-chip:hover{border-color:var(--c,#64727f)}
.jf-chip.on{background:var(--c,#64727f);border-color:var(--c,#64727f);color:#fff}
.jf-chip.on i{background:rgba(255,255,255,.92)}
.jf-chip.on b{opacity:.85}
.jf-empty{margin:14px 4px}
.touch.touch-ad{padding-right:5px}
.touch.touch-ad em{font-style:normal;font-weight:600;margin-left:6px;padding-left:6px;border-left:1px solid rgba(255,255,255,.4);max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle;opacity:.92}
.arrow{color:var(--muted);margin:0 4px;font-weight:700}
.site-chip.sm{font-size:10px;padding:1px 7px}
/* top paths */
.path-list{display:flex;flex-direction:column;gap:8px}
.path-row{display:flex;align-items:center;gap:12px;background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:9px 12px}
.path-count{font-weight:800;font-size:14px;min-width:38px;color:var(--brand)}
.path-steps{display:flex;align-items:center;gap:4px;flex-wrap:wrap;flex:1}
.path-rev{font-variant-numeric:tabular-nums;font-weight:800}
/* model comparison */
.model-col{background:var(--surface-2);border:1px solid var(--line);border-radius:12px;padding:12px}
.model-h{font-size:13px;font-weight:800;margin-bottom:10px;text-align:center;padding-bottom:6px;border-bottom:2px solid var(--line)}
.attr-row{margin-bottom:9px}
.attr-row .attr-top{display:flex;justify-content:space-between;align-items:center;font-size:12px;margin-bottom:3px}
.attr-rev{display:block;font-size:10.5px;color:var(--muted);margin-top:2px;text-align:right}
/* journeys list — aligned column grid */
.journey-table{overflow-x:auto;padding-bottom:4px}
.journey-table-inner{min-width:1180px}
.journey-table-inner{
  --jc-1:420px;--jc-2:128px;--jc-3:160px;--jc-4:104px;--jc-5:116px;
  --jc-6:220px;--jc-7:128px;--jc-8:98px;--jc-9:104px;--jc-10:18px;
  --jcols:var(--jc-1) var(--jc-2) var(--jc-3) var(--jc-4) var(--jc-5) var(--jc-6) var(--jc-7) var(--jc-8) var(--jc-9) var(--jc-10);
}
.journey-list{display:flex;flex-direction:column;gap:8px}
.journey{background:var(--surface-2);border:1px solid var(--line);border-radius:10px}
.journey-cols{display:grid;grid-template-columns:var(--jcols);align-items:center;gap:10px 12px;padding:2px 13px 7px;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);text-align:left}
.journey-cols .r{text-align:left}
.journey-cols>span{position:relative;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px}
.journey-resizer{position:absolute;right:-8px;top:-5px;bottom:-5px;width:18px;cursor:col-resize;border-radius:5px;z-index:2;display:grid;place-items:center;color:#9aa7b6;font-size:10px;line-height:1;background:linear-gradient(90deg,transparent,rgba(47,109,176,.08),transparent)}
.journey-resizer:before{content:"";position:absolute;left:8px;top:4px;bottom:4px;border-left:1px dashed var(--line-strong)}
.journey-resizer:hover,.journey-resizer.active{background:color-mix(in srgb,var(--brand) 18%,transparent);color:var(--brand)}
.journey-head{display:grid;grid-template-columns:var(--jcols);align-items:center;gap:10px 12px;padding:9px 12px}
.journey-path{display:flex;align-items:center;gap:4px;flex-wrap:wrap;min-width:0}
.jp-note{color:var(--muted);font-size:10.5px;white-space:nowrap;margin-left:2px}
.jm-c{min-width:0;font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.jm-who{font-weight:700;color:var(--ink)}
.jm-rev{text-align:left;color:var(--ink);font-weight:700;font-variant-numeric:tabular-nums}
.jm-when{text-align:left;font-size:11px}
.jm-none{color:var(--muted)}
.jm-status .ostatus{max-width:100%}
.jm-camp{max-width:100%}
.device-pill{display:inline-flex;align-items:center;gap:5px;max-width:100%;border-radius:999px;padding:2px 9px;font-size:11.5px;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;background:var(--surface);border:1px solid var(--line-strong);color:var(--muted)}
.device-pill .chip-ico{font-size:10px;font-weight:900;text-transform:uppercase;color:inherit;opacity:.9}
.device-pill.d-mobile{color:#315f89;border-color:#c9d9ee;background:#eef5fc}
.device-pill.d-desktop{color:#0f7b55;border-color:#c9e7d9;background:#edf8f2}
.device-pill.d-tablet{color:#a97719;border-color:#efdcae;background:#fff7e8}
.device-pill.d-bot{color:var(--bad);border-color:#f2c5bf;background:#fbe7e5}
.claim-pill.touch{max-width:100%;gap:4px;background:var(--c,#64727f);color:#fff;border:0}
.claim-pill.touch.unknown{--c:#64727f;background:#64727f;color:#fff}
.jm-claim{display:flex;align-items:center;gap:5px;min-width:0;overflow:hidden}
.match-badge{display:inline-flex;align-items:center;white-space:nowrap;border-radius:6px;padding:2px 6px;font-size:10.5px;font-weight:900;border:1px solid var(--line);background:var(--surface);color:var(--muted)}
.match-badge.m-hard{border-color:color-mix(in srgb,#0f8a55 38%,var(--line));background:#e8f6ef;color:#0f6f46}
.match-badge.m-order{border-color:color-mix(in srgb,#2f6db0 38%,var(--line));background:#e9f1fb;color:#24598f}
.match-badge.m-fallback{border-color:color-mix(in srgb,#c98a1a 38%,var(--line));background:#fff4dc;color:#93640f}
.match-badge.m-direct{border-color:color-mix(in srgb,#64727f 38%,var(--line));background:#eef1f4;color:#53606b}
.match-badge.m-none{border-color:color-mix(in srgb,#b94b4b 38%,var(--line));background:#fdeeee;color:#963737}
.jd-meta-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}

/* ---------- journeys: person profiles + warm visitors ---------- */
.ppl-list{display:flex;flex-direction:column;gap:8px}
.ppl{background:var(--surface-2);border:1px solid var(--line);border-radius:12px;overflow:hidden}
.ppl-main{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 14px;cursor:pointer;flex-wrap:wrap}
.ppl-main:hover{background:var(--surface)}
.ppl-id{display:flex;align-items:center;gap:11px;min-width:0}
.ppl-av{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#3f8fd6,#2f6db0);color:#fff;display:grid;place-items:center;font-weight:800;font-size:16px;flex:none}
.ppl-name{font-size:14px;display:block;color:var(--ink)}
.ppl-mail{font-size:11.5px;color:var(--muted)}
.ppl-stats{display:flex;align-items:center;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--muted)}
.ppl-kpi b{color:var(--ink);font-variant-numeric:tabular-nums}
.ppl-seen{font-size:11px}
.ppl .chev{transition:transform .15s ease;color:var(--muted)}
.ppl.open .chev{transform:rotate(90deg)}
.ppl-detail{padding:4px 14px 14px;border-top:1px solid var(--line);background:var(--surface)}
.ppl-chans{display:flex;gap:5px;flex-wrap:wrap;margin:10px 0}
.ppl-orders{width:100%;border-collapse:collapse;font-size:12.5px}
.ppl-orders th{text-align:left;font-size:11px;text-transform:uppercase;color:var(--muted);padding:5px 8px;border-bottom:1px solid var(--line)}
.ppl-orders td{padding:6px 8px;border-bottom:1px solid var(--line)}
.ppl-orders .ppl-net{text-align:right;font-weight:700;font-variant-numeric:tabular-nums}
.ppl-first{display:block;margin-top:8px;color:var(--muted);font-size:11px}
.warm-table{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}
.warm-table th{font-size:11px;text-transform:uppercase;letter-spacing:.02em;color:var(--muted);text-align:left;padding:8px 10px;border-bottom:2px solid var(--line)}
.warm-table td{padding:8px 10px;border-bottom:1px solid var(--line);font-size:12.5px}
.warm-vid{font-family:monospace;color:var(--muted)}
.warm-n b{font-size:14px}

/* ---------- categories: Meta/Google adspend split ---------- */
.cat-spend{min-width:120px}
.cat-spend b{font-variant-numeric:tabular-nums}
.mg-bar{display:flex;height:12px;border-radius:4px;overflow:hidden;background:var(--surface-2);border:1px solid var(--line);margin:3px 0}
.mg-bar .seg{display:flex;align-items:center;justify-content:center;color:#fff;font-size:9px;font-weight:800;min-width:2px;white-space:nowrap;overflow:hidden}
.mg-bar .seg.m{background:#315f89} .mg-bar .seg.g{background:#0f7b55}
.mg-leg{display:flex;gap:8px;font-size:10px;font-weight:700;font-variant-numeric:tabular-nums}
.mg-leg .m{color:#315f89} .mg-leg .g{color:#0f7b55}

/* ---------- journeys: expandable order + timeline ---------- */
.journey[data-jtoggle] .journey-head{cursor:pointer}
.journey[data-jtoggle] .journey-head:hover{background:var(--surface)}
.journey-head .chev{transition:transform .15s ease;color:var(--muted);text-align:center}
.journey.open .journey-head .chev{transform:rotate(90deg)}
@media(max-width:900px){
  .journey-table{overflow-x:visible}
  .journey-table-inner{min-width:0}
  .journey-cols{display:none}
  .journey-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px}
  .journey-path{flex-basis:100%}
  .jm-c{white-space:nowrap;flex:0 0 auto}
  .jm-who{flex:1 1 auto}
  .jm-rev{margin-left:auto}
}
.journey-detail{border-top:1px dashed var(--line-strong);margin-top:10px;padding-top:12px}
.jd-loading{padding:14px 0!important;text-align:left}
.jd-loading:before{content:"";display:inline-block;width:12px;height:12px;border-radius:50%;border:2px solid var(--line-strong);border-top-color:var(--brand);animation:plspin .8s linear infinite;margin-right:8px;vertical-align:-2px}
.jd-grid{display:grid;grid-template-columns:minmax(240px,1fr) 1.4fr;gap:20px}
@media(max-width:760px){.jd-grid{grid-template-columns:1fr}}
.jd-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);margin-bottom:6px}
.jd-name{font-size:15px;font-weight:800}
.jd-mail{font-size:12.5px;color:var(--brand)} .jd-place{font-size:12px;color:var(--muted)}
.jd-items{width:100%;border-collapse:collapse;font-size:12.5px;margin-top:2px}
.jd-items td{padding:4px 6px;border-bottom:1px solid var(--line);vertical-align:top}
.jd-items .jd-q{color:var(--muted);white-space:nowrap;width:34px}
.jd-items .jd-t{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:700}
.jd-items .jd-tot td{border-top:2px solid var(--line-strong);border-bottom:0;font-weight:800}
.jtl{list-style:none;margin:0;padding:0;position:relative}
.jtl:before{content:"";position:absolute;left:11px;top:4px;bottom:4px;width:2px;background:var(--line)}
.jtl li{display:flex;align-items:flex-start;gap:9px;padding:4px 0;position:relative}
.jtl-ic{width:24px;height:24px;border-radius:50%;background:var(--surface);border:2px solid var(--c,#647285);display:grid;place-items:center;font-size:12px;flex:none;z-index:1}
.jtl-ic .icon-svg{width:14px;height:14px;display:block}
.icon-svg{vertical-align:-2px}
.jtl-tx{flex:1;font-size:12.5px;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.jtl-tx em{font-style:normal;color:var(--muted);font-weight:500}
.jtl-at{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}

/* journeys timeline: gaps between steps + ad highlight */
.jtl li.jtl-gap{padding:1px 0}
.jtl-gap .jtl-ic.gap{background:var(--surface-2);border:2px dashed var(--line-strong);font-size:10px}
.jtl-gap .jtl-tx{font-size:11px;color:var(--muted);font-style:italic;font-weight:600}
.jtl li.jtl-ad{background:color-mix(in srgb, var(--c,#315f89) 6%, transparent);border-radius:8px;padding-right:6px}
.jtl li.jtl-ad .jtl-tx{font-weight:800;white-space:normal}
.jtl li.jtl-device{background:#f5f1fb;border:1px solid #e3d6f3;border-radius:8px;padding:5px 8px 5px 0;margin:3px 0}
.jtl li.jtl-device .jtl-ic{background:#fff;border-color:#8a5cc2;color:#8a5cc2}
.jtl li.jtl-device .jtl-tx{font-weight:900;color:#5f3f8b;white-space:normal}
.jtl li.jtl-device .jtl-tx em{color:#5f3f8b;font-weight:700}
.jtl-count{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:999px;padding:0 5px;color:var(--muted);font-size:10px;font-weight:900;background:var(--surface)}
.ad-detail{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px}
.ad-detail span{display:inline-flex;align-items:center;gap:4px;max-width:100%;border:1px solid color-mix(in srgb,var(--c,#315f89) 24%,var(--line));background:var(--surface);border-radius:5px;padding:2px 6px;color:var(--muted);font-size:10.5px;font-weight:700;overflow:hidden;text-overflow:ellipsis}
.ad-detail b{color:var(--ink);font-size:10px;text-transform:uppercase;letter-spacing:.03em}
.copy-id{border:1px solid var(--line-strong);background:var(--surface-2);color:var(--brand);border-radius:5px;padding:1px 5px;font-size:10px;font-weight:900;font-variant-numeric:tabular-nums;line-height:1.35;cursor:pointer;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.copy-id:hover{border-color:var(--brand);background:#eef5fc}
.copy-id.copied{border-color:#0f8a55;background:#e8f6ef;color:#0f6f46}
.ppl-ltv b{color:var(--good);font-size:15px}
.ppl-repeat{font-size:12px}

/* ---------- journeys: sales-origin hero ---------- */
.model-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:14px}
.origin-snapshot{margin-bottom:14px;display:grid;gap:12px}
.device-summary{background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:10px 12px;display:grid;grid-template-columns:190px 1fr;gap:8px 14px;align-items:center}
.ds-head{display:flex;flex-direction:column;gap:1px}
.ds-head span{font-size:10.5px;font-weight:900;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}
.ds-head b{font-size:13px;color:var(--ink);font-weight:900}
.ds-stack{display:flex;height:12px;border-radius:999px;overflow:hidden;background:var(--surface);border:1px solid var(--line)}
.ds-stack i{display:block;width:var(--w);min-width:3px;background:var(--c)}
.ds-stack i+i{box-shadow:inset 1px 0 0 rgba(255,255,255,.8)}
.ds-items{grid-column:2;display:flex;flex-wrap:wrap;gap:7px 12px}
.ds-items span{display:inline-flex;align-items:center;gap:5px;color:var(--muted);font-size:11.5px;font-weight:750}
.ds-items i{width:8px;height:8px;border-radius:2px;background:var(--c);flex:none}
.ds-items b{color:var(--ink)}
.ds-items small{font-size:10px;color:var(--muted);border-left:1px solid var(--line-strong);padding-left:6px}
.coverage-summary{background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:11px 12px}
.cov-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:9px}
.cov-head div{display:flex;flex-direction:column;gap:1px}
.cov-head span{font-size:10.5px;font-weight:900;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}
.cov-head b{font-size:13px;color:var(--ink);font-weight:900}
.cov-head small{font-size:11px;color:var(--muted);font-weight:750;text-align:right}
.cov-table{display:grid;gap:6px}
.cov-row{display:grid;grid-template-columns:minmax(160px,1fr) minmax(170px,2.2fr) auto auto auto auto auto auto;align-items:center;gap:6px 8px;font-size:11.5px}
.cov-row.total{border-top:1px solid var(--line);padding-top:7px;margin-top:2px;font-weight:900}
.cov-row>span:first-child{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cov-row b{font-variant-numeric:tabular-nums;color:var(--ink);text-align:right}
.cov-row small{color:var(--muted);font-weight:750;white-space:nowrap}
.cov-bar{height:11px;display:flex;overflow:hidden;border-radius:999px;border:1px solid var(--line);background:var(--surface)}
.cov-bar i{display:block;min-width:0}
.cov-bar .hard{background:#0f8a55}
.cov-bar .fallback{background:#d19a2a}
.cov-bar .none{background:#b94b4b}
.cov-bar i+i{box-shadow:inset 1px 0 0 rgba(255,255,255,.8)}
.model-tabs .mtab{border:1px solid var(--line-strong);background:var(--surface);color:var(--muted);border-radius:999px;padding:6px 14px;font-size:12.5px;font-weight:700;transition:.12s}
.model-tabs .mtab:hover{border-color:var(--brand);color:var(--brand)}
.model-tabs .mtab.on{background:var(--brand);border-color:var(--brand);color:#fff}
.model-help{margin:-6px 0 14px}
.model-help p{margin:0;color:var(--muted);font-size:12.5px;line-height:1.45;background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:9px 11px}
.model-help b{color:var(--ink)}
.origin-grid{display:grid;grid-template-columns:1.3fr 1fr;gap:22px}
@media(max-width:820px){.origin-grid{grid-template-columns:1fr}}
.orow{margin-bottom:11px}
.orow-top{display:flex;justify-content:space-between;align-items:center;font-size:13px;margin-bottom:4px}
.orow-top b{font-variant-numeric:tabular-nums}
.origin-channels .attr-name{display:flex;align-items:center;gap:8px;font-weight:700}
.origin-channels .attr-name i{width:11px;height:11px;border-radius:3px;flex:none}
.origin-channels .attr-bar{height:12px}
.origin-camps{border-left:1px solid var(--line);padding-left:20px}
@media(max-width:820px){.origin-camps{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:14px}}
.oc-h{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);margin-bottom:10px}
.ocamp{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--line);font-size:12.5px}
.ocamp .pf{width:20px;height:20px;border-radius:5px;color:#fff;display:grid;place-items:center;font-size:11px;font-weight:800;flex:none}
.ocamp-n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.ocamp b{font-variant-numeric:tabular-nums}
.ocamp-p{color:var(--muted);font-size:11px;min-width:38px;text-align:right}
.oc-sub{font-weight:600;text-transform:none;letter-spacing:0;color:var(--muted);font-size:10.5px;opacity:.75}
a.ocamp-n.lnk{color:var(--accent,#2f6db0);text-decoration:none;cursor:pointer}
a.ocamp-n.lnk:hover{text-decoration:underline}
a.ocamp-n.lnk .ext{font-size:10px;opacity:.7}
.oc-raw{display:inline-block;font-size:9.5px;font-weight:700;color:var(--muted);border:1px solid var(--line);border-radius:4px;padding:0 4px;vertical-align:middle;text-transform:uppercase;letter-spacing:.02em}
.oc-foot{margin:10px 0 0;font-size:11px;color:var(--muted);line-height:1.5}
.oc-foot code{background:var(--line);padding:0 4px;border-radius:3px;font-size:10.5px}
.oc-foot a,.mdl-note a{color:var(--accent,#2f6db0);text-decoration:none}
.oc-foot a:hover,.mdl-note a:hover{text-decoration:underline}
.jm-camp{display:inline-flex;align-items:center;gap:3px;max-width:100%;font-size:11.5px;font-weight:700;color:var(--c,#2f6db0);background:color-mix(in srgb,var(--c,#2f6db0) 10%,transparent);border:1px solid color-mix(in srgb,var(--c,#2f6db0) 30%,transparent);border-radius:5px;padding:1px 7px;overflow:hidden}
.jm-camp a{color:inherit;text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.jm-camp a:hover{text-decoration:underline}
.jm-camp>span,.jm-camp>a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.jm-camp.muted{color:var(--muted);background:transparent;font-weight:600}
.jm-camp .ext,.jtl-camp .ext{font-size:9px;opacity:.7}
.jtl-camp{color:var(--accent,#2f6db0);text-decoration:none;font-weight:700}
a.jtl-camp:hover{text-decoration:underline}
.mdl-note{margin:14px 0 0;font-size:11.5px;color:var(--muted);line-height:1.5}
.mdl-note b{color:var(--ink)}
@media(max-width:760px){
  .device-summary{grid-template-columns:1fr}
  .ds-items{grid-column:1}
  .cov-head{display:block}
  .cov-head small{text-align:left;display:block;margin-top:4px}
  .cov-row{grid-template-columns:1fr;gap:4px;padding:8px 0;border-top:1px solid var(--line)}
  .cov-row:first-child{border-top:0}
  .cov-row b,.cov-row small{display:inline;text-align:left}
}

/* journeys: order payment-status badge */
.ostatus{font-size:11px;font-weight:800;padding:1px 8px;border-radius:6px;white-space:nowrap;display:inline-flex;align-items:center;gap:4px}
.ostatus .icon-svg{width:12px;height:12px;flex:none}
.ostatus.k-paid{background:#e3f6ec;color:var(--good)}
.ostatus.k-unpaid{background:#fdf1dd;color:var(--warn)}
.ostatus.k-refunded{background:#eef2f7;color:#647285}
.ostatus.k-cancelled{background:#fbe7e5;color:var(--bad)}
.ostatus.k-other{background:var(--surface-2);color:var(--muted)}

/* ads-performance: burner (geld verbrand) vs works vs doubt classification */
.kpi.burner-kpi{border:1.5px solid color-mix(in srgb,var(--bad) 45%,var(--line))}
.perf-tree tr.cls-burner td{background:color-mix(in srgb,var(--bad) 10%,var(--surface))}
.perf-tree tr.cls-burner:hover td{background:color-mix(in srgb,var(--bad) 16%,var(--surface))}
.perf-tree tr.cls-works td{background:color-mix(in srgb,var(--good) 6%,var(--surface))}
.perf-tree tr.cls-doubt td{background:color-mix(in srgb,var(--warn) 6%,var(--surface))}
.perf-badge{white-space:nowrap;font-weight:800}
.perf-badge small{font-weight:600;opacity:.8}
.sync-panel .panel-body.sync-rows{display:flex;flex-wrap:wrap;gap:22px;padding:14px 18px}
.sync-row{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--muted)}
.inner-kpis{padding:0 18px 14px;grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}
.inner-kpis .kpi{box-shadow:none;border:1px solid var(--line);padding:12px 14px}

/* ads-performance: sticky table header. Reuses the same nested-scroll-container
   pattern as .profit-summary/.landed-cost tables elsewhere in this app -- give
   the table-wrap its own scrollport (max-height + overflow:auto) so the
   already-global `thead th{position:sticky;top:0}` sticks to the TOP OF THAT
   CONTAINER instead of the page viewport, where it would otherwise collide
   with/hide behind the page-level .filterbar (also sticky, top:0, z-index:20).
   Expand/collapse (toggling `hidden` on rows) and the search/filter toolbar
   (outside .table-wrap) are unaffected by this. */
[data-ads-tree-manager] .table-wrap{max-height:70vh;overflow:auto;position:relative}
[data-ads-tree-manager] .perf-tree thead th{z-index:5;box-shadow:0 2px 0 var(--line)}

/* Klanten page: shop > klant > detail tree, built on the exact same
   bootAdsTree engine + .tree-row/lvl-*/data-node markup as ads-performance
   (see app-core.js bootAdsTree, wired generically via [data-ads-tree-manager]
   in app-boot.js -- no page-specific JS). Level tints reuse the ads-tree's
   own .lvl-adset/.lvl-ad backgrounds from app-base.css; this block only adds
   the klant/detail cell layout that ads-performance doesn't need. */
.cust-tree thead th{z-index:5;box-shadow:0 2px 0 var(--line)}
.cust-tree thead th.sortable a{color:inherit;text-decoration:none;display:block}
.cust-tree thead th.sortable:hover a{color:var(--brand)}
.cust-tree td.num,.cust-tree th.num{font-variant-numeric:tabular-nums}
.cust-tree .cust-name-cell{display:inline-flex;flex-direction:column;vertical-align:middle}
.cust-tree .cust-name-cell b{display:block}
.cust-tree .cust-also-at{color:var(--brand);font-weight:600}
/* v4 identity merge: contact chips (one per member e-mail, all searchable
   and mailto-able), a phone chip when the merged group's orders agree on
   one number, and a badge naming the merge signal(s) that fired. */
.cust-contacts{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:3px}
.cust-email-chip{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--muted)}
.cust-email-chip a{color:inherit}
.cust-email-chip a:hover{color:var(--brand)}
.cust-phone-chip a{color:var(--brand);font-weight:700;font-size:12px;text-decoration:none}
.cust-phone-chip a:hover{text-decoration:underline}
.match-badge.m-merged{border-color:color-mix(in srgb,#0f8a55 38%,var(--line));background:#e8f6ef;color:#0f6f46;margin-left:6px;text-transform:none;font-weight:800}
/* Detail block: bestellingen (with nested items) FIRST and full-width;
   the customer-level "meestgekocht" aggregate is a clearly subordinate
   block underneath -- smaller and muted, not a competing column. */
.cust-detail{display:flex;flex-direction:column;gap:16px;padding:14px 18px;background:var(--surface-2)}
.cust-orders-block>b,.cust-sub-h{display:block;margin-bottom:8px}
.cust-products-block{opacity:.82;font-size:12px}
.cust-products-block .cust-sub-h{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.02em;color:var(--muted)}
/* Meestgekocht: same colgroup/alignment discipline as the order tables,
   not a run-together flex row -- product name is linked as before, qty and
   netto bedrag get their own right-aligned numeric columns. */
.cust-products{width:100%;border-collapse:collapse;font-size:12px;table-layout:fixed}
.cust-products col.cp-name{width:60%} .cust-products col.cp-qty{width:20%} .cust-products col.cp-amt{width:20%}
.cust-products th{text-align:left;font-size:10px;text-transform:uppercase;color:var(--muted);padding:4px 8px;border-bottom:1px solid var(--line)}
.cust-products td{padding:4px 8px;border-bottom:1px solid var(--line);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums}
.cust-products th.num,.cust-products td.num{text-align:right}
.cust-products a{color:inherit;text-decoration:none}
.cust-products a:hover{color:var(--brand)}
/* Orders table: fixed per-column widths via colgroup so numbers never drift
   from their header, at every nesting level (order rows + their item rows).
   Netto/bruto shown side by side per column E -- netto stays the page's
   canonical (refund-aware) figure, bruto is netto+btw for what the
   customer actually paid. */
.cust-orders{width:100%;border-collapse:collapse;font-size:12.5px;table-layout:fixed}
.cust-orders col.co-num{width:14%} .cust-orders col.co-date{width:20%}
.cust-orders col.co-status{width:16%} .cust-orders col.co-net{width:25%} .cust-orders col.co-bruto{width:25%}
.cust-orders th{text-align:left;font-size:11px;text-transform:uppercase;color:var(--muted);padding:5px 8px;border-bottom:1px solid var(--line)}
.cust-orders td{padding:6px 8px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}
.cust-orders th.num,.cust-orders td.num{text-align:right;font-weight:700}
.cust-order-items-row td{padding:0;border-bottom:1px solid var(--line)}
/* Order-level contact snapshot (naam/bedrijf/adres/telefoon/e-mail AS THEY
   WERE on that specific order) -- one compact muted line under the item
   table, so the raw billing details are visible per order without a
   separate query or another expandable level. */
.cust-order-contact{display:flex;flex-wrap:wrap;align-items:center;gap:10px;padding:6px 8px 8px 26px;font-size:11.5px;color:var(--muted);border-bottom:1px solid var(--line)}
.cust-order-contact b{color:var(--ink);font-weight:700}
.cust-order-contact a{color:var(--brand);text-decoration:none}
.cust-order-contact a:hover{text-decoration:underline}
.cust-items{width:100%;border-collapse:collapse;font-size:12px;table-layout:fixed}
.cust-items col.ci-name{width:40%} .cust-items col.ci-qty{width:12%}
.cust-items col.ci-price{width:16%} .cust-items col.ci-net{width:16%} .cust-items col.ci-bruto{width:16%}
.cust-items th{text-align:left;font-size:10px;text-transform:uppercase;color:var(--muted);padding:4px 8px 4px 26px;border-bottom:1px solid var(--line)}
.cust-items td{padding:4px 8px 4px 26px;border-bottom:1px solid var(--line);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cust-items th.num,.cust-items td.num{text-align:right;padding-left:8px}
.cust-items a{color:var(--brand);text-decoration:none}
.cust-items a:hover{text-decoration:underline}
/* D: zebra tint per ORDER BLOCK (order row + its items sub-table, header
   included, + its contact line share one tint) so consecutive orders are
   visually separable at a glance. Every row of the block gets an EXPLICIT
   background for both blk-a and blk-b -- not just blk-b with blk-a left to
   inherit whatever the ancestor .cust-detail happens to be painted -- so
   the items header/rows and contact line can never "revert to white"
   against a differently-shaded ancestor. .cust-items/.cust-order-contact
   themselves carry no background of their own (see above): every pixel of
   the block is covered by one of the four rules below, blk-a or blk-b. */
.cust-order-row.blk-a td,.cust-order-items-row.blk-a td,.cust-order-items-row.blk-a .cust-items,
.cust-order-contact-row.blk-a td,.cust-order-contact-row.blk-a .cust-order-contact{background:var(--surface)}
.cust-order-row.blk-b td,.cust-order-items-row.blk-b td,.cust-order-items-row.blk-b .cust-items,
.cust-order-contact-row.blk-b td,.cust-order-contact-row.blk-b .cust-order-contact{background:color-mix(in srgb,var(--brand) 5%,var(--surface))}
.cust-search-bar{display:flex;align-items:center;gap:10px;padding:12px 18px;border-bottom:1px solid var(--line)}
.cust-search-bar input[type=search]{flex:1;max-width:360px;padding:8px 12px;border:1px solid var(--line-strong);border-radius:8px;font-size:13px;background:var(--surface);color:var(--ink)}
.cust-outreach{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:7px;background:var(--brand);color:#fff;font-size:12px;font-weight:700;text-decoration:none;white-space:nowrap}
.cust-outreach:hover{opacity:.88}
.inner-kpis .kpi .value{font-size:19px}
