/* ── Auctus Ops canonical favicon (copy into every new page <head>) ────────
   <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 55 95'><path fill='%236DCCD1' d='M33.8 62.1l-3.2 5.6L43 88.8l-33.2.1 5.6-9.9 14-24.4-3.1-5.3L0 94.7l52.8-.1z'/></svg>">
   ───────────────────────────────────────────────────────────────────────── */
/* shared.css — Auctus Ops Dashboard common styles */

/* Auth overlay — single source of truth lives in /auth-overlay.css.
   @import MUST stay above all style rules below (CSS spec). */
@import url("/auth-overlay.css");

/* ── Site header — shared across all dashboard pages ── */
.biq-hdr { position: sticky; top: 0; z-index: 200; background: rgba(8,8,14,.92); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border-bottom: 1px solid rgba(109,204,209,.35); padding: 0 40px; height: 72px; display: flex; align-items: center; gap: 20px; box-shadow: 0 8px 32px rgba(0,0,0,.35); }
.biq-hdr::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: linear-gradient(90deg, transparent, #6DCCD1 30%, #94D6DC 50%, #6DCCD1 70%, transparent); opacity: .7; }
.biq-hdr-logo { display: flex; align-items: center; padding-right: 20px; border-right: 1px solid rgba(255,255,255,.1); flex-shrink: 0; }
.biq-hdr-logo svg { height: 34px; width: auto; display: block; }
.biq-hdr-title { flex: 1; display: flex; flex-direction: column; gap: 2px; }
.biq-hdr-name { font-size: 20px; line-height: 1; letter-spacing: .1em; color: #fff; font-weight: 900; text-transform: uppercase; }
.biq-hdr-name .thin { font-weight: 300; opacity: .7; margin-right: 3px; color: #C4A24A; }
.biq-hdr-rule { height: 1px; background: linear-gradient(90deg, #C4A24A, rgba(196,162,74,.3), transparent); opacity: .6; margin-top: 3px; }
.biq-hdr-sub { font-size: 9px; letter-spacing: .22em; color: #6DCCD1; text-transform: uppercase; opacity: .8; }
.header-user { font-size: 12px; color: rgba(255,255,255,.45); display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.header-user-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--teal); }
/* Time-of-day greeting card — centered, floating, auto-fades after 30s (auth-gate.js) */
.greeting-card {
  position: fixed; top: 88px; left: 50%; transform: translateX(-50%) translateY(-8px);
  z-index: 150; display: flex; align-items: center; gap: 10px;
  padding: 11px 22px; border-radius: 999px;
  background: rgba(8,8,14,.92); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px);
  border: 1px solid rgba(109,204,209,.35); box-shadow: 0 8px 32px rgba(0,0,0,.35);
  color: #fff; font-weight: 700; font-size: 14px; letter-spacing: .01em;
  white-space: nowrap; pointer-events: none;
  opacity: 0; transition: opacity .6s ease, transform .6s ease;
}
.greeting-card.show { opacity: 1; transform: translateX(-50%) translateY(0); }
.greeting-card .greeting-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--teal); flex-shrink: 0; }
.greeting-card .greeting-close {
  pointer-events: auto; cursor: pointer; flex-shrink: 0;
  margin: -4px -12px -4px 4px; padding: 0; width: 22px; height: 22px;
  display: flex; align-items: center; justify-content: center;
  background: none; border: none; border-radius: 50%;
  color: rgba(255,255,255,.55); font-size: 18px; line-height: 1;
  transition: color .15s ease, background .15s ease;
}
.greeting-card .greeting-close:hover { color: #fff; background: rgba(255,255,255,.12); }

/* ── Content approval badges (content.html) ── */
.content-badge { display: inline-block; padding: 2px 8px; border-radius: 20px; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; }
.cb-ig-reel    { background: rgba(109,40,217,0.12); color: #8b5cf6; }
.cb-li-video   { background: rgba(37,99,235,0.12);  color: #3b82f6; }
.cb-yt-long    { background: rgba(220,38,38,0.12);  color: #ef4444; }
.cb-carousel   { background: rgba(107,114,128,0.12); color: var(--text-secondary); }
.cb-quote-card { background: rgba(217,119,6,0.12);  color: #d97706; }
.cb-caption    { background: rgba(22,163,74,0.12);  color: #16a34a; }
.cb-blog       { background: rgba(22,163,74,0.12);  color: #16a34a; }
.cb-ig         { background: rgba(157,23,77,0.12);  color: #db2777; }
.cb-li         { background: rgba(37,99,235,0.12);  color: #3b82f6; }
.cb-yt         { background: rgba(220,38,38,0.12);  color: #ef4444; }
.cb-multi      { background: rgba(107,114,128,0.12); color: var(--text-secondary); }
.cb-web        { background: rgba(22,163,74,0.12);  color: #16a34a; }
.cb-meme       { background: rgba(217,119,6,0.12);  color: #d97706; }
.chip-wrap     { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
.cb-fb         { background: rgba(37,99,235,0.12);  color: #3b82f6; }
.cb-gg         { background: rgba(217,119,6,0.12);  color: #d97706; }

/* ── Ops sub-dashboard header mark (used on every sub-page) ── */
.ops-hdr-wrap{display:flex;align-items:center;gap:18px}
.ops-hdr-mark{width:32px;height:auto;flex-shrink:0}
.ops-eyebrow{font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:#6DCCD1;margin-bottom:6px}
.ops-back{color:#6DCCD1;text-decoration:none}
.ops-back:hover{text-decoration:underline}

/* ── Shared error / empty state utilities ── */
.ops-error { padding: 20px 24px; background: rgba(220,38,38,0.08); border-left: 3px solid #ef4444; border-radius: 4px; font-size: 13px; color: #ef4444; display: flex; align-items: center; gap: 10px; }
.ops-error::before { content: '⚠'; font-size: 16px; flex-shrink: 0; }
.ops-empty { padding: 48px 24px; text-align: center; color: var(--text-muted); font-size: 13px; }
.ops-empty-icon { font-size: 28px; margin-bottom: 10px; opacity: 0.4; }
.ops-empty-msg { font-weight: 700; color: var(--text-secondary); margin-bottom: 4px; font-size: 14px; }
.ops-empty-sub { font-size: 12px; opacity: 0.7; }

/* ── Inter-dashboard quick nav ── */
.dash-nav {
  position: relative;
  flex-shrink: 0;
  font-family: 'Lato', sans-serif;
}
/* Trigger lives inside the always-dark header — hardcoded dark palette */
.dash-nav-trigger {
  background: transparent;
  border: 1px solid #444;
  color: #9f9f9f;
  padding: 5px 12px 5px 10px;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  cursor: pointer;
  font-family: 'Lato', sans-serif;
  border-radius: 3px;
  display: flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
  transition: border-color 0.15s, color 0.15s;
}
.dash-nav-trigger:hover,
.dash-nav.open .dash-nav-trigger { border-color: #6DCCD1; color: #6DCCD1; }
.dash-nav-arrow { display: inline-block; transition: transform 0.2s; font-size: 8px; }
.dash-nav.open .dash-nav-arrow { transform: rotate(180deg); }
/* Dropdown opens into page content — theme-aware */
.dash-nav-menu {
  display: none;
  position: absolute;
  right: 0;
  top: calc(100% + 6px);
  background: var(--surface);
  border: 1px solid var(--border-strong);
  border-radius: 4px;
  min-width: 210px;
  padding: 6px 0;
  box-shadow: 0 8px 24px rgba(0,0,0,0.45);
  z-index: 1000;
}
.dash-nav.open .dash-nav-menu { display: block; }
.dash-nav-menu a {
  display: block;
  padding: 8px 16px;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-secondary);
  text-decoration: none !important;
  white-space: nowrap;
  transition: background 0.1s, color 0.1s;
}
.dash-nav-menu a:hover { color: var(--text); background: var(--surface-alt); }
.dash-nav-menu a.dash-current { color: var(--gold) !important; }
.dash-nav-divider { height: 1px; background: var(--border-strong); margin: 4px 0; }

/* ══════════════════════════════════════════════════════════════
   DROPDOWN CANON — platform-wide. The line is NOT "form select vs action menu" — it's
   "will a user OPEN and read this menu?" A native <select>'s OPEN list is OS-rendered and
   CANNOT be styled (white OS box, blue system highlight), so it never matches the design once
   opened. The CLOSED .dd-select pill looks on-canon, which is exactly why this slips past static
   mockups — you never click it open in a mock (caught live 2026-07-07, Voice Engine surface picker).
   Decision rule:
     1. ANY dropdown a user opens and reads (VALUE picker OR action menu) → use the .dd component
        below (trigger button + .dd-menu of <a>/<button> items; toggle ".open" on click; close on
        outside-click; mirrors .dash-nav-menu). Track the chosen value in JS + update the trigger
        label. Ref impl: salesbrief "Archive as" / Voice Engine surface picker.
     2. Native FORM select + class "dd-select" → ONLY for dense/utility FILTER bars where the brief
        OS open-menu is acceptable. Gives appearance:none + teal chevron on the closed box; the open
        list STAYS OS-rendered — accept that, or use .dd. When in doubt, use .dd.
   ══════════════════════════════════════════════════════════════ */
/* ONE canonical dropdown (variant D, locked 2026-07-06): rounded 8px, surface fill,
   teal chevron in a subtle surface-alt "well". `select.dd-select` (0,1,1) outranks every
   legacy box companion (.filter-select/.wm-sel/.form-select, all 0,1,0) so every existing
   dropdown adopts this with ZERO per-page edits — no !important needed. */
.dd-select, select.dd-select { -webkit-appearance:none; appearance:none; cursor:pointer; outline:none;
  color:var(--text); font-family:'Lato',sans-serif; font-size:13px; font-weight:400;
  background-color:var(--surface); border:1px solid var(--border-mid); border-radius:8px;
  padding:9px 42px 9px 12px;
  background-image:url("data:image/svg+xml,%3Csvg width='11' height='7' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%236DCCD1' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"), linear-gradient(var(--surface-alt), var(--surface-alt));
  background-repeat:no-repeat, no-repeat;
  background-position:right 15px center, right center;
  background-size:auto, 36px 100%; }
select.dd-select:focus { border-color:var(--teal); }
.dd { position:relative; display:inline-block; }
.dd-menu { display:none; position:absolute; right:0; top:calc(100% + 4px); background:var(--surface);
  border:1px solid var(--border-strong); border-radius:7px; min-width:150px; padding:5px 0;
  box-shadow:0 8px 24px rgba(0,0,0,0.22); z-index:1000; }
.dd.open .dd-menu { display:block; }
.dd-menu a, .dd-menu button { display:block; width:100%; text-align:left; background:none; border:0;
  padding:7px 14px; font-size:12px; font-weight:600; color:var(--text-secondary); cursor:pointer;
  white-space:nowrap; font-family:inherit; }
.dd-menu a:hover, .dd-menu button:hover { color:var(--teal); background:var(--surface-alt); }
.dd-sep { height:1px; background:var(--border-strong); margin:4px 0; }
.dd-menu a.dd-muted, .dd-menu button.dd-muted { color:var(--text-muted); }

/* ── .ddp — auto-upgraded canon dropdown. dd-picker.js turns EVERY <select class="dd-select">
   into this so the OPEN menu is on-design (not OS-rendered). The native <select> stays hidden
   underneath as the value source (all existing .value reads + change listeners keep working).
   Menu is position:fixed (coords set by JS) to escape overflow:hidden section cards — the
   .dd-menu clipping gotcha (see overlay-positioning note). Locked 2026-07-07. ── */
.ddp { position:relative; display:inline-block; vertical-align:middle; }
.ddp-trig { display:inline-flex; align-items:center; gap:10px; justify-content:space-between;
  background-color:var(--surface); border:1px solid var(--border-mid); border-radius:8px; color:var(--text);
  font-family:'Lato',sans-serif; font-size:13px; font-weight:400; padding:9px 12px; cursor:pointer; text-align:left; }
.ddp-trig:focus { outline:none; border-color:var(--teal); }
.ddp.open .ddp-trig { border-color:var(--teal); }
.ddp-chev { color:var(--teal); font-size:11px; flex-shrink:0; background:var(--surface-alt); border-radius:5px; padding:2px 7px; margin:-2px -6px -2px 0; }
.ddp-menu { position:fixed; display:none; background:var(--surface); border:1px solid var(--border-strong);
  border-radius:8px; padding:5px 0; box-shadow:0 8px 24px rgba(0,0,0,0.24); z-index:99999; max-height:280px; overflow:auto; }
.ddp-menu.open { display:block; }
.ddp-opt { display:block; width:100%; text-align:left; background:none; border:0; padding:8px 14px; font-size:12.5px;
  font-weight:400; color:var(--text); cursor:pointer; white-space:nowrap; font-family:inherit; }
.ddp-opt:hover { background:var(--surface-alt); color:var(--teal); }
.ddp-opt.sel { color:var(--teal); font-weight:700; }

/* ══════════════════════════════════════════════════════════════
   TOOLTIP CANON (locked 2026-06-16). Hover/focus popover for any "ⓘ"/help affordance.
   NEVER hand-roll a per-page tooltip and NEVER rely on the native `title=` attribute
   (slow, unstyled, no touch, can't theme). CSS-only → CSP-safe (no JS, no on*= handlers).
   Usage: put .tip on the anchor (add tabindex="0" for keyboard reach), nest a .tip-pop bubble.
     <span class="tip" tabindex="0">Conf.<span class="th-i">ⓘ</span>
       <span class="tip-pop" role="tooltip"><p>…</p></span></span>
   Modifiers: .tip-r right-aligns the bubble (use when the anchor sits near the right edge).
   (Reference impl: salesbrief "Conf." column header.)
   ══════════════════════════════════════════════════════════════ */
.tip { position:relative; cursor:help; }
.tip-pop { position:absolute; top:calc(100% + 7px); left:0; z-index:1000; width:290px; padding:11px 13px;
  background:var(--surface); color:var(--text); border:1px solid var(--border-strong); border-radius:9px;
  box-shadow:var(--shadow-hover, 0 10px 30px rgba(0,0,0,.45));
  font-size:11.5px; font-weight:400; line-height:1.55; text-transform:none; letter-spacing:0;
  text-align:left; white-space:normal; opacity:0; visibility:hidden; transform:translateY(-3px);
  transition:opacity .13s ease, transform .13s ease; pointer-events:none; }
.tip-pop.tip-r { left:auto; right:0; }
.tip-pop::before { content:""; position:absolute; bottom:100%; left:14px; border:6px solid transparent;
  border-bottom-color:var(--border-strong); }
.tip-pop.tip-r::before { left:auto; right:14px; }
.tip-pop p { margin:0 0 7px; } .tip-pop p:last-child { margin:0; }
.tip-pop b { font-weight:700; }
.tip:hover .tip-pop, .tip:focus-within .tip-pop { opacity:1; visibility:visible; transform:translateY(0); }

/* ══════════════════════════════════════════════════════════════
   THEME SYSTEM
   Dark is default. Light activates via html[data-theme="light"].
   ══════════════════════════════════════════════════════════════ */

/* ── Semantic tokens (dark defaults) ── */
:root {
  --bg:            #000000;
  --surface:       #080808;
  --surface-alt:   #111111;
  --surface-deep:  #030808;
  --border:        #1a1a1a;
  --border-mid:    #2a2a2a;
  --border-strong: #333333;
  --text:          #ffffff;
  --text-secondary: #9F9F9F;
  --text-muted:    #555555;
  /* brand tokens stay the same in both modes */
  --teal:  #6DCCD1;
  --gold:  #C4A24A;

  /* ── Canon v1 (DASHBOARD_DESIGN_SPEC.md, locked 2026-06-12) ── */
  --radius: 8px;                    /* cards/panels/sections/buttons; pills stay 100px, dots 50% */
  --shadow-hover: 0 2px 12px rgba(0,0,0,.25);   /* hover-only; nothing at rest */
  /* status — dusty trio (family recipe ~50% sat / ~60% light) */
  --ok:     #57B98A;  --ok-text:     #43A370;
  --warn:   #DC9A4F;  --warn-text:   #B97A33;
  --danger: #DC6B6B;  --danger-text: #C95A5A;
  /* grey chip ramp — dark-mode values */
  --chip-ghost-bg: transparent; --chip-ghost-bd: #2a2a2a; --chip-ghost-tx: #6b675f;
  --chip-light-bg: #141414;     --chip-light-bd: #262626; --chip-light-tx: #8a857c;
  --chip-mid-bg:   #1f1e1c;     --chip-mid-bd:   #343230; --chip-mid-tx:   #b3aea5;
  --chip-graphite-bg: #E9E6E0;  --chip-graphite-tx: #2a2824;  /* inverts per mode: always max-contrast neutral */
}

/* ── Light mode token overrides ── */
[data-theme="light"] {
  --bg:            #FBFAF8;   /* canon: warm ramp (was cool #f9fafb) */
  --surface:       #FFFFFF;
  --surface-alt:   #F5F4F0;
  --surface-deep:  #EFEDE7;
  --border:        #E0DED8;
  --border-mid:    #CCC8C0;
  --border-strong: #B8B4AC;
  --text:          #111111;
  --text-secondary: #5C5C5A;
  --text-muted:    #888886;
  --shadow-hover: 0 2px 12px rgba(0,0,0,.12);
  /* grey chip ramp — light-mode (warm-keyed) */
  --chip-ghost-bg: transparent; --chip-ghost-bd: #E3E0DA; --chip-ghost-tx: #9B968D;
  --chip-light-bg: #F5F4F0;     --chip-light-bd: #E0DCD4; --chip-light-tx: #8A857C;
  --chip-mid-bg:   #E9E6E0;     --chip-mid-bd:   #D6D2C9; --chip-mid-tx:   #5C5852;
  --chip-graphite-bg: #3D3A35;  --chip-graphite-tx: #F5F4F0;
}

/* ── Canon components — status pills + grey chips + scorecard base ── */
.pill-ok, .pill-warn, .pill-danger,
.chip-ghost, .chip-light, .chip-mid, .chip-graphite {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 10px; border-radius: 100px;
  font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
  white-space: nowrap;
}
.pill-ok     { background: rgba(98,194,142,.22);  border: 1px solid rgba(98,194,142,.55);  color: var(--ok-text);     font-weight: 800; }
.pill-warn   { background: rgba(220,154,79,.24);  border: 1px solid rgba(220,154,79,.55);  color: var(--warn-text);   font-weight: 800; }
.pill-danger { background: rgba(220,107,107,.22); border: 1px solid rgba(220,107,107,.55); color: var(--danger-text); font-weight: 800; }
.chip-ghost    { background: var(--chip-ghost-bg);    border: 1px solid var(--chip-ghost-bd); color: var(--chip-ghost-tx); }
.chip-light    { background: var(--chip-light-bg);    border: 1px solid var(--chip-light-bd); color: var(--chip-light-tx); }
.chip-mid      { background: var(--chip-mid-bg);      border: 1px solid var(--chip-mid-bd);   color: var(--chip-mid-tx); }
.chip-graphite { background: var(--chip-graphite-bg); border: 1px solid var(--chip-graphite-bg); color: var(--chip-graphite-tx); }
.chip-restricted { background: rgba(196,162,74,.12); border: 1px solid rgba(196,162,74,.35); color: var(--gold); }

/* ── CANON BASE PRIMITIVES (badge / chip / btn / stat / modal) — lifted 2026-06-23.
   Dashboards CONSUME these; semantic color variants (.badge-<x>, .chip-<x>) layer on top.
   Enforced by canon-struct-guard.py. ── */
.badge { display:inline-block;font-size:9px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;padding:2px 7px;border-radius:100px;white-space:nowrap;border:1px solid transparent;background:var(--surface-alt);color:var(--text-muted); }
.chip { display:inline-block;font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;padding:2px 7px;border-radius:100px;white-space:nowrap;background:var(--surface-deep);color:var(--text-secondary); }
.btn { display:inline-flex;align-items:center;justify-content:center;gap:6px;font-family:'Lato',sans-serif;font-size:13px;font-weight:700;padding:8px 16px;border-radius:100px;border:1px solid var(--border-mid);background:transparent;color:var(--text);cursor:pointer;transition:all .15s;white-space:nowrap; }
.btn:hover { border-color:var(--teal); }
.btn-primary { background:var(--teal);border-color:var(--teal);color:#08080e; }
.btn-ghost { background:transparent;border-color:var(--border-mid);color:var(--text-secondary); }
.btn-danger { background:var(--danger);border-color:var(--danger);color:#08080e; }
.btn-danger:hover { border-color:var(--danger);filter:brightness(1.08); }
.stat-card { padding:10px 13px;border:1px solid var(--border);border-radius:var(--radius,8px);background:var(--surface); }  /* density 2026-07-04: was 14/16 */
.stat-label { font-size:10px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--text-muted);margin-bottom:4px; }
.stat-num { font-size:20px;font-weight:900;color:var(--teal);letter-spacing:-.02em;line-height:1; }  /* density 2026-07-04: was 24 */
/* Canon performance tiers — apply ONLY to metrics with a real target/threshold (not neutral counts).
   Default (no tier) = teal. Tier assigned by canon-tier.js (canonTier(ratio)); see that file for thresholds.
   Standalone so they work on any number element (.stat-num, .kpi-value, etc.). */
.tier-bad   { color: var(--danger) !important; }
.tier-warn  { color: var(--warn)   !important; }
.tier-good  { color: var(--teal)   !important; }
.tier-great { color: var(--gold)   !important; }
.stat-sub { font-size:11px;color:var(--text-muted);margin-top:3px; }
/* ── Canon layout + card bases (consolidated 2026-07-04 — ONE fleet source.
   Replaces per-page .hub-card / .section-hdr / .section-label. ── */
.stats-grid { display:flex;flex-wrap:wrap;gap:10px; }
.stats-grid > .stat-card { flex:1;min-width:168px; }
.section-head { font-size:10px;font-weight:700;letter-spacing:.15em;text-transform:uppercase;color:var(--gold);margin:16px 0 9px;display:flex;align-items:center;gap:10px; }
.section-head::after { content:"";flex:1;height:1px;background:var(--border); }
.nav-card { background:var(--surface);border:1px solid var(--border);border-top:3px solid var(--teal);border-radius:var(--radius,8px);padding:22px 24px 20px;text-decoration:none;display:flex;flex-direction:column;gap:8px;transition:border-top-color .15s,box-shadow .15s; }
.nav-card:hover { border-top-color:var(--gold);box-shadow:var(--shadow-hover);text-decoration:none; }
.nav-card.kpi-warn { border-top-color:var(--warn); }
.nav-card.kpi-bad { border-top-color:var(--danger); }
.nav-card-eyebrow { font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--text-muted); }
.nav-card-title { font-size:16px;font-weight:900;color:var(--text);letter-spacing:.01em; }
.nav-card-desc { font-size:12px;color:var(--text-secondary);line-height:1.6;flex:1; }
.nav-card-cta { font-size:13px;font-weight:700;color:var(--teal);align-self:flex-end;margin-top:4px; }
.modal-overlay { position:fixed;inset:0;background:rgba(0,0,0,.75);display:flex;align-items:center;justify-content:center;z-index:100;opacity:0;pointer-events:none;transition:opacity .2s; }
.modal-overlay.open { opacity:1;pointer-events:all; }
.modal { background:var(--surface);border:1px solid var(--border-mid);border-radius:var(--radius,8px);width:580px;max-width:92vw;padding:32px;display:flex;flex-direction:column;gap:24px; }
.modal-title { font-family:'Lato',sans-serif;font-size:20px;font-weight:700;color:var(--text); }
.modal-actions { display:flex;gap:12px;justify-content:flex-end; }

/* scorecard (KPI tiles — ticker overlay + biz panels) */
.c-scorecard {
  background: var(--surface); border: 1px solid var(--border);
  border-left: 3px solid var(--ok); border-radius: var(--radius);
  padding: 11px 14px 9px; display: flex; flex-direction: column; gap: 3px;
  color: var(--text); text-decoration: none; transition: box-shadow .15s;
}
.c-scorecard:hover { box-shadow: var(--shadow-hover); text-decoration: none; }
.c-scorecard.warn { border-left-color: var(--warn); }
.c-scorecard.bad  { border-left-color: var(--danger); }

/* ── Theme toggle — matches Billing IQ pill pattern ── */
.biq-mode-toggle {
  display: flex;
  align-items: center;
  background: rgba(255,255,255,.05);
  border: 1px solid rgba(255,255,255,.1);
  border-radius: 100px;
  padding: 3px;
  gap: 1px;
  flex-shrink: 0;
}
.biq-mode-btn {
  padding: 5px 13px;
  border-radius: 100px;
  border: none;
  background: transparent;
  color: rgba(255,255,255,.35);
  font-family: 'Lato', sans-serif;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: .1em;
  cursor: pointer;
  transition: all .22s ease;
  white-space: nowrap;
}
.biq-mode-btn.active { background: #6DCCD1; color: #08080e; }
.biq-mode-btn:not(.active):hover { color: rgba(255,255,255,.65); }
/* Mobile */
@media (max-width:640px) {
  .biq-mode-btn { padding: 4px 7px; font-size: 9px; letter-spacing: .06em; }
}

/* ── Light mode — global ── */
/* Note: biq-hdr stays dark always (matches Billing IQ behaviour) */
[data-theme="light"] body { background: var(--bg); color: var(--text); }

/* ── Light mode — .header (motherboard) ── */
/* Header stays dark always — same behaviour as biq-hdr and Billing IQ */

/* ── Light mode — status strip ── */
[data-theme="light"] .status-strip {
  background: var(--surface-alt) !important;
  border-bottom-color: var(--border) !important;
}
[data-theme="light"] .status-label { color: var(--text-muted) !important; }
[data-theme="light"] .status-val   { color: var(--text-secondary) !important; }
[data-theme="light"] .status-divider { background: var(--border) !important; }

/* ── Light mode — page chrome ── */
[data-theme="light"] .page-label   { color: var(--gold) !important; }
[data-theme="light"] .page-title   { color: var(--text) !important; }
[data-theme="light"] .page-desc    { color: var(--text-secondary) !important; }
[data-theme="light"] .section-head,
[data-theme="light"] .section-label { color: var(--gold) !important; }
[data-theme="light"] .task-panel-label { color: var(--text-muted) !important; }

/* ── Light mode — nav cards (index) ── */
[data-theme="light"] .nav-card {
  border-color: var(--border) !important;
  background: var(--surface) !important;
}
[data-theme="light"] .nav-card:hover {
  border-color: var(--teal) !important;
  background: var(--surface-alt) !important;
}
[data-theme="light"] .nav-card-eyebrow { color: var(--text-muted) !important; }
[data-theme="light"] .nav-card-title   { color: var(--text) !important; }
[data-theme="light"] .nav-card-desc    { color: var(--text-secondary) !important; }
[data-theme="light"] .nav-card-cta     { color: var(--teal) !important; }

/* ── Light mode — task rows (donkey) ── */
[data-theme="light"] .task-row {
  border-color: var(--border) !important;
  background: var(--surface) !important;
}
[data-theme="light"] .task-title { color: var(--text) !important; }
[data-theme="light"] .task-due   { color: var(--text-muted) !important; }
[data-theme="light"] .task-empty { color: var(--text-muted) !important; }

/* ── Light mode — costs table (donkey) ── */
[data-theme="light"] .costs-table th { color: var(--text-muted) !important; border-bottom-color: var(--border) !important; }
[data-theme="light"] .costs-table td { border-bottom-color: var(--surface-deep) !important; }
[data-theme="light"] .costs-table tr:hover td { background: var(--surface-alt) !important; }
[data-theme="light"] .cost-name  { color: var(--text) !important; }
[data-theme="light"] .cost-vendor { color: var(--text-secondary) !important; }
[data-theme="light"] .cost-notes { color: var(--text-muted) !important; }
[data-theme="light"] .cat-badge  { background: var(--surface-alt) !important; color: var(--text-muted) !important; border-color: var(--border) !important; }
[data-theme="light"] .costs-total { border-top-color: var(--border) !important; }
[data-theme="light"] .costs-total-item { color: var(--text-secondary) !important; }
[data-theme="light"] .costs-total-item strong { color: var(--text) !important; }

/* ── Light mode — AI group rows ── */
[data-theme="light"] .ai-group-hdr td {
  background: #EDF8F9 !important;
  border-top-color: rgba(109,204,209,0.25) !important;
  border-bottom-color: rgba(109,204,209,0.25) !important;
}
[data-theme="light"] .ai-group-hdr:hover td { background: #E3F4F6 !important; }
[data-theme="light"] .ai-group-count { color: var(--text-muted) !important; }
[data-theme="light"] .ai-tool-row td { background: #FAFFFE !important; }
[data-theme="light"] .ai-tool-row:hover td { background: #EDF8F9 !important; }

/* ── Light mode — back link ── */
[data-theme="light"] .back-link {
  border-color: rgba(109,204,209,0.4) !important;
  color: var(--teal) !important;
}
[data-theme="light"] .back-link:hover { background: rgba(109,204,209,0.08) !important; }

/* ── Light mode — auth overlay intentionally NOT overridden: stays dark in both themes (matches biq-hdr) ── */
[data-theme="light"] .lost-screen { background: var(--bg) !important; }
[data-theme="light"] .lost-title  { color: var(--text) !important; }
[data-theme="light"] .lost-sub    { color: var(--text-secondary) !important; }

/* ── Light mode — tables (index + motherboard admin pages) ── */
[data-theme="light"] .table-wrap { border-color: var(--border) !important; }
[data-theme="light"] thead th {
  background: var(--surface-alt) !important;
  color: var(--text-muted) !important;
  border-bottom-color: var(--border-mid) !important;
}
[data-theme="light"] tbody tr { border-bottom-color: var(--border) !important; }
[data-theme="light"] tbody tr:hover { background: var(--surface-alt) !important; }
[data-theme="light"] tbody td { color: var(--text) !important; }
[data-theme="light"] .td-email { color: var(--text-secondary) !important; }
[data-theme="light"] .td-time  { color: var(--text-muted) !important; }

/* ── Light mode — announcements row ── */
[data-theme="light"] .ann-row { border-color: var(--border) !important; }
[data-theme="light"] .ann-row-input { color: var(--text) !important; }
[data-theme="light"] .ann-active-msg { color: var(--text) !important; }

/* ── Light mode — admin modals and forms ── */
[data-theme="light"] .modal {
  background: var(--surface) !important;
  border-color: var(--border-mid) !important;
}
[data-theme="light"] .modal-title { color: var(--text) !important; }
[data-theme="light"] .form-label  { color: var(--text-muted) !important; }
[data-theme="light"] .form-input {
  background: var(--surface-alt) !important;
  border-color: var(--border-mid) !important;
  color: var(--text) !important;
}
[data-theme="light"] .checkbox-row { color: var(--text-secondary) !important; }

/* ── Light mode — access chips ── */
[data-theme="light"] .chip-all     { color: #1a7a7f !important; }
[data-theme="light"] .chip-ops     { color: #7a5a1a !important; }
[data-theme="light"] .chip-idr     { color: #2a5a8a !important; }
[data-theme="light"] .chip-content { color: #7a2a6a !important; }

/* ── Light mode — user action buttons ── */
[data-theme="light"] .btn-edit { border-color: var(--border-mid) !important; }
[data-theme="light"] .btn-edit:hover { background: rgba(109,204,209,0.08) !important; }
[data-theme="light"] .btn-remove {
  border-color: var(--border) !important;
  color: var(--text-muted) !important;
}

/* ── Light mode — monitoring card ── */
[data-theme="light"] .mon-card {
  background: var(--surface) !important;
  border-color: var(--border) !important;
}
[data-theme="light"] .mon-row  { border-bottom-color: var(--border) !important; }
[data-theme="light"] .mon-name { color: var(--text) !important; }
[data-theme="light"] .mon-ts   { color: var(--text-muted) !important; }

/* ══════════════════════════════════════════════════════════════
   BUTTON SYSTEM — BIQ-aligned pill shape (applies to all pages)
   ══════════════════════════════════════════════════════════════ */

/* All interactive buttons → full pill (mirrors BIQ .pf-btn border-radius) */
.btn-add,
.btn-ann-publish,
.btn-invite,
.btn-edit,
.btn-remove,
.btn-ann-clear,
.btn-cancel,
.btn-back,
.back-link { border-radius: 100px !important; }

/* Primary CTAs → teal fill (BIQ .pf-btn-teal pattern; yellow fill = v1 mistake) */
.btn-add,
.btn-ann-publish { background: #6DCCD1 !important; color: #08080e !important; }

/* Ghost hover — replace hard #0d2a2b fill with subtle teal wash */
.btn-edit:hover,
.btn-back:hover,
.back-link:hover { background: rgba(109,204,209,0.08) !important; }

/* ─────────────────────────────────────────────────────────────────────────────
   CANON COMPONENT PRIMITIVES — base components dashboards must CONSUME, not redefine.
   Lifted 2026-06-23 from their most-evolved consumers (task-row: donkey; form fields:
   motherboard) so structure has a single source of truth, the way color does.
   Enforced by canon-struct-guard.py. Add new primitives here; never re-roll locally.
   ───────────────────────────────────────────────────────────────────────────── */
/* Task component (donkey pattern: .task-row column wrapper > .task-row-main single-line row) */
.task-sections { display:flex;flex-direction:column;gap:0;margin-bottom:12px;border:1px solid var(--border);border-radius:var(--radius,8px);overflow:hidden; }
.task-panel { border-bottom:1px solid var(--border); }
.task-panel:last-child { border-bottom:none; }
.task-panel-hdr { display:flex;align-items:center;gap:10px;padding:9px 14px;background:var(--surface-alt);cursor:pointer;user-select:none; }
.task-panel-hdr:hover { background:var(--surface); }
.task-panel-count { font-size:11px;color:var(--text-muted);font-weight:600; }
.task-panel-chevron { font-size:9px;transition:transform .2s;color:var(--text-muted);margin-left:auto; }
.task-panel.panel-closed .task-panel-chevron { transform:rotate(-90deg); }
.task-panel-body { padding:8px 10px;display:flex;flex-direction:column;gap:6px; }
.task-panel.panel-closed .task-panel-body { display:none; }
.task-row { display:flex;flex-direction:column;gap:4px;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius,8px);background:var(--surface); }
.task-row-main { display:flex;align-items:center;gap:8px;width:100%;position:relative; }
.task-row.task-flash { outline:2px solid var(--teal);transition:outline .1s; }
.task-check { width:16px;height:16px;border-radius:3px;border:2px solid var(--border-mid);cursor:pointer;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:900;color:transparent;transition:all .15s; }
.task-check:hover { border-color:var(--teal); }
.task-check.done { background:var(--teal);border-color:var(--teal);color:#08080e; }
.task-title { flex:1;font-size:13px;color:var(--text); }
.task-title.done-title { text-decoration:line-through;color:var(--text-secondary); }
.task-due { font-size:11px;color:var(--text-muted);white-space:nowrap; }
.task-empty { text-align:center;padding:24px 20px;color:var(--text-secondary);font-size:12px;font-style:italic; }
.task-actions { display:flex;align-items:center;gap:6px;flex-shrink:0; }
.ta-btn { font-family:'Lato',sans-serif;font-size:10px;font-weight:700;letter-spacing:.06em;padding:3px 9px;border-radius:100px;border:1px solid var(--border);cursor:pointer;transition:all .12s;white-space:nowrap;background:transparent;color:var(--text-muted); }
.ta-btn:hover { color:var(--teal);border-color:var(--teal); }
.task-filter-bar { display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px;align-items:center; }
.task-filter-btn { background:none;border:1px solid var(--border);color:var(--text-muted);font-family:'Lato',sans-serif;font-size:10px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;padding:3px 11px;cursor:pointer;border-radius:100px;transition:all .15s; }
.task-filter-btn:hover { color:var(--text);border-color:var(--border-strong); }
.task-filter-btn.active { background:var(--teal);color:#08080e;border-color:var(--teal); }
/* Form fields (input/select/textarea share one base; select + textarea are new siblings) */
.form-group { display:flex;flex-direction:column;gap:8px; }
.form-label { font-size:11px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--text-muted); }
.form-input,.form-select,.form-textarea { background:var(--surface-alt);border:1px solid var(--border-mid);color:var(--text);padding:10px 14px;font-family:'Lato',sans-serif;font-size:14px;border-radius:var(--radius,8px);outline:none;transition:border-color .15s;width:100%;box-sizing:border-box; }
.form-input:focus,.form-select:focus,.form-textarea:focus { border-color:var(--teal); }
.form-textarea { min-height:80px;resize:vertical; }
.form-select { -webkit-appearance:none;appearance:none;cursor:pointer; }

/* Event badges → pill shape */
.event-signin,
.event-signout,
.event-invite,
.ann-active-badge { border-radius: 100px !important; }

/* ── Light mode — event badges (auth activity table) ── */
[data-theme="light"] .event-signin  { background: rgba(109,204,209,0.12) !important; color: #1a7a7f !important; border-color: rgba(109,204,209,0.3) !important; }
[data-theme="light"] .event-signout { background: var(--surface-alt) !important; color: var(--text-muted) !important; border-color: var(--border) !important; }
[data-theme="light"] .event-invite  { background: #eff6ff !important; color: #1d4ed8 !important; border-color: rgba(29,78,216,0.2) !important; }

/* ── Light mode — active announcement badge ── */
[data-theme="light"] .ann-active-badge { background: rgba(98,194,142,.14) !important; color: var(--ok-text) !important; border-color: rgba(98,194,142,.32) !important; }

/* ── Light mode — donkey badges + priority pills (canon dusty status tokens) ── */
[data-theme="light"] .badge-sub  { background:#FFF8E6 !important; color:#9A7B2A !important; border-color:#E8D89A !important; }
[data-theme="light"] .badge-payg { background:#EDF8F9 !important; color:#1a7a7f !important; border-color:rgba(109,204,209,.3) !important; }
[data-theme="light"] .prio-urgent { background:rgba(220,107,107,.13) !important; color:var(--danger-text) !important; border-color:rgba(220,107,107,.32) !important; }
[data-theme="light"] .prio-soon   { background:rgba(220,154,79,.15) !important; color:var(--warn-text) !important; border-color:rgba(220,154,79,.32) !important; }

/* ── Light mode — donkey section panels ── */
[data-theme="light"] .stats-grid { border-color: var(--border) !important; background: var(--surface) !important; }
[data-theme="light"] .stat-block { border-color: var(--border) !important; background: var(--surface) !important; }
[data-theme="light"] .stat-label { color: var(--text-muted) !important; }
[data-theme="light"] .stat-sub   { color: var(--text-muted) !important; }
[data-theme="light"] .activity-wrap { border-color: var(--border) !important; background: var(--surface) !important; }
[data-theme="light"] .act-lbl    { color: var(--text-muted) !important; }
[data-theme="light"] .coverage-stat { color: var(--text-muted) !important; }
[data-theme="light"] .coverage-stat strong { color: var(--text) !important; }
[data-theme="light"] .cov-table  { border-color: var(--border) !important; }
[data-theme="light"] .cov-table th { color: #fff !important; border-bottom: 2px solid var(--teal) !important; background: #1e1e1e !important; }
[data-theme="light"] .cov-tier-badge { background: var(--gold) !important; color: #fff !important; }
[data-theme="light"] .cov-tier-hdr td { background: var(--surface-alt) !important; }
[data-theme="light"] .cov-table td { border-color: var(--border) !important; background: var(--surface) !important; }
[data-theme="light"] .cov-table tr:hover td { background: var(--surface-alt) !important; }
[data-theme="light"] .cov-name  { color: var(--text) !important; }
[data-theme="light"] .cov-bar-wrap { background: var(--border-mid) !important; }
[data-theme="light"] .cov-last  { color: var(--text-muted) !important; }
[data-theme="light"] .budget-summary { border-color: var(--border) !important; }
[data-theme="light"] .bsum-mo { color: var(--text-muted) !important; }
[data-theme="light"] .bsum-annual { color: var(--text-muted) !important; }
[data-theme="light"] .bsum-annual strong { color: var(--text) !important; }
[data-theme="light"] .bsum-split { color: var(--text-muted) !important; }
[data-theme="light"] .bsum-split strong { color: var(--text) !important; }
[data-theme="light"] .costs-toggle-btn { color: var(--text-muted) !important; }
[data-theme="light"] .auto-wrap { border-color: var(--border) !important; }
[data-theme="light"] .auto-group-hdr { background: var(--surface-alt) !important; border-color: var(--border) !important; }
[data-theme="light"] .auto-row { border-color: var(--border) !important; background: var(--surface) !important; }
[data-theme="light"] .auto-row:hover { background: var(--surface-alt) !important; }
[data-theme="light"] .auto-name { color: var(--text) !important; }
[data-theme="light"] .auto-desc { color: var(--text-muted) !important; }
[data-theme="light"] .routines-wrap { border-color: var(--border) !important; }
[data-theme="light"] .routine-row { border-color: var(--border) !important; background: var(--surface) !important; }
[data-theme="light"] .routine-freq { color: var(--text-muted) !important; }
[data-theme="light"] .routine-name { color: var(--text) !important; }
[data-theme="light"] .routine-desc { color: var(--text-muted) !important; }
[data-theme="light"] .section-note { color: var(--text-muted) !important; }
[data-theme="light"] .sec-chevron  { color: var(--text-muted) !important; }

/* ── Data source strip ─────────────────────────────────────────────────────── */
.data-strip {
  margin-top: 20px;
  background: rgba(255,255,255,0.03);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 7px 12px;
  display: flex;
  align-items: center;
  font-size: 11px;
  color: #555;
  flex-wrap: wrap;
  gap: 0;
}
.data-strip .ds-src + .ds-src::before,
.data-strip .ds-cadence::before { content: '·'; margin: 0 7px; color: #333; }
.data-strip .ds-src { color: #666; }
.data-strip .ds-cadence { margin-left: auto; color: #444; font-size: 10px; white-space: nowrap; padding-left: 16px; }
.ds-dot { width: 5px; height: 5px; border-radius: 50%; display: inline-block; margin-right: 7px; flex-shrink: 0; }
.ds-dot-live   { background: #22c55e; }
.ds-dot-cron   { background: #C4A24A; }
.ds-dot-static { background: #444; }
[data-theme="light"] .data-strip { background: rgba(0,0,0,0.03); color: #aaa; }
[data-theme="light"] .data-strip .ds-src { color: #999; }
[data-theme="light"] .data-strip .ds-cadence { color: #bbb; }
[data-theme="light"] .data-strip .ds-src + .ds-src::before,
[data-theme="light"] .data-strip .ds-cadence::before { color: #ddd; }

/* ── Shared layout components ─────────────────────────── */
.table-wrap { background: var(--surface); border: 1px solid var(--border); border-radius: 8px; overflow: hidden; }

.review-panel { background: var(--surface); border: 1px solid var(--border); border-left: 4px solid var(--teal); border-radius: 8px; overflow: hidden; }
.review-panel-hdr { padding: 12px 18px; display: flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
.review-panel-hdr:hover { background: var(--surface-alt); }
.review-panel-title { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--teal); }
.review-panel-sub { font-size: 11px; color: var(--text-secondary); flex: 1; }
.review-panel-badge { font-size: 11px; font-weight: 700; background: var(--teal); color: #fff; border-radius: 10px; padding: 1px 8px; white-space: nowrap; }
.review-panel-arrow { font-size: 10px; color: var(--text-secondary); transition: transform 0.2s; display: inline-block; }
.review-panel.open .review-panel-arrow { transform: rotate(180deg); }
.review-panel-body { display: none; border-top: 1px solid var(--border); }
.review-panel.open .review-panel-body { display: block; }

/* ══════════════════════════════════════════════════════════════
   DATEPICKER CANON (.dp) — locked 2026-06-22. Platform-wide.
   NEVER ship a raw native <input type="date"> for a date field: its OPEN
   calendar popup is OS-rendered and cannot be styled, so it never matches
   the design (same rule as the native <select> open-list under DROPDOWN CANON).
   Mechanism: /dp.js auto-upgrades every <input type="date"> on the page —
   it hides the native input (keeps it as the value source-of-truth, shadows
   .value so existing reads/writes + change events keep working) and renders
   the .dp UI below. Panel shell + pill month/year jump. Theme-safe (pure tokens).
   Reference impl: sm-oversight task deadlines.
   ══════════════════════════════════════════════════════════════ */
.dp { position:relative; display:inline-block; }
.dp-native { position:absolute; width:1px; height:1px; opacity:0; pointer-events:none; margin:0; padding:0; border:0; }
.dp-field { display:inline-flex; align-items:center; gap:8px; width:100%; background:var(--surface-alt);
  border:1px solid var(--border-strong); border-radius:7px; padding:8px 12px; font-size:12px; font-weight:600;
  font-family:inherit; color:var(--text); cursor:pointer; user-select:none; text-align:left; }
.dp-field:hover { border-color:var(--text-muted); }
.dp.open .dp-field { border-color:var(--teal); }
.dp-field .dp-val { white-space:nowrap; }
.dp-field .dp-val.dp-empty { color:var(--text-muted); }
.dp-field .dp-cal-ico { margin-left:auto; flex-shrink:0; }

/* position:fixed + JS-set left/top (dp.js place()) so the popup escapes any
   overflow:hidden ancestor (section cards, scroll rows). Coordinates are
   viewport-relative and recomputed on scroll/resize. Updated 2026-07-07. */
.dp-pop { display:none; position:fixed; z-index:3000; width:286px;
  background:var(--surface); border:1px solid var(--border-strong); border-radius:9px; overflow:hidden;
  box-shadow:0 8px 24px rgba(0,0,0,0.22); }
.dp.open .dp-pop { display:block; }

.dp-hd { display:flex; align-items:center; justify-content:space-between;
  background:rgba(109,204,209,.10); border-bottom:1px solid var(--border-strong); padding:10px 12px; }
.dp-nav { width:28px; height:28px; border:0; background:none; border-radius:6px; font-size:16px; line-height:1;
  color:var(--teal); cursor:pointer; display:grid; place-items:center; font-family:inherit; }
.dp-nav:hover { background:rgba(109,204,209,.16); }
.dp-jump { background:var(--surface-alt); border:1px solid var(--border-strong); border-radius:100px;
  font-family:inherit; font-weight:700; font-size:13px; color:var(--text); cursor:pointer;
  display:inline-flex; align-items:center; gap:7px; padding:5px 11px; }
.dp-jump .dp-cx { font-size:8px; color:var(--teal); }
.dp-jump:hover { border-color:var(--teal); background:rgba(109,204,209,.12); }

.dp-body { padding:12px; }
.dp-dow { display:grid; grid-template-columns:repeat(7,1fr); border-bottom:1px solid var(--border);
  margin-bottom:6px; padding-bottom:6px; }
.dp-dow span { text-align:center; font-size:9px; font-weight:800; text-transform:uppercase;
  letter-spacing:.05em; color:var(--text-secondary); }
.dp-grid { display:grid; grid-template-columns:repeat(7,1fr); gap:3px; }
.dp-zoom { display:grid; grid-template-columns:repeat(3,1fr); gap:6px; }
.dp-cell { aspect-ratio:1; border:0; background:none; border-radius:6px; font-size:13px; font-weight:600;
  font-family:inherit; color:var(--text); cursor:pointer; display:grid; place-items:center; }
.dp-cell:hover { background:var(--surface-alt); }
.dp-cell:disabled { color:var(--text-muted); cursor:default; }
.dp-cell.dp-mute { color:var(--text-muted); }
.dp-cell.dp-today { box-shadow:inset 0 0 0 1.5px var(--teal); color:var(--teal); }
.dp-cell.dp-sel { background:var(--teal); color:#08080e; font-weight:800; box-shadow:none; }
.dp-zcell { border:0; background:none; border-radius:6px; font-size:12px; font-weight:600; font-family:inherit;
  color:var(--text); cursor:pointer; display:grid; place-items:center; padding:13px 0; }
.dp-zcell:hover { background:var(--surface-alt); color:var(--teal); }
.dp-zcell:disabled { color:var(--text-muted); cursor:default; }
.dp-zcell.dp-today { box-shadow:inset 0 0 0 1.5px var(--teal); color:var(--teal); }
.dp-zcell.dp-sel { background:var(--teal); color:#08080e; font-weight:800; }

.dp-foot { display:flex; gap:8px; padding:0 12px 12px; }
.dp-foot button { flex:1; border:1px solid var(--border-strong); background:none; border-radius:6px;
  padding:7px 0; font-size:11px; font-weight:700; color:var(--text-secondary); cursor:pointer; font-family:inherit; }
.dp-foot button:hover { border-color:var(--teal); color:var(--teal); }
.dp-foot .dp-today-btn { background:var(--teal); color:#08080e; border-color:var(--teal); }
.dp-foot .dp-today-btn:hover { background:var(--teal); color:#08080e; }

/* ── .dp-range — date-range variant (opt-in via data-dp-range pairing on two
   inputs). One two-month popup; click start → end; days between connect in a
   teal band. Used only where a genuine range exists (event start/end, filters).
   Built by /dp.js — same theme-safe tokens as .dp. ── */
.dp-rpop { width:560px; max-width:92vw; }
.dp-rpop .dp-months { display:flex; }
.dp-rpop .dp-mo { flex:1; padding:12px; }
.dp-rpop .dp-mo + .dp-mo { border-left:1px solid var(--border); }
.dp-rpop .dp-motitle { text-align:center; font-size:12px; font-weight:700; color:var(--text); margin-bottom:8px; }
.dp-rcell { position:relative; aspect-ratio:1; border:0; background:none; font-size:12px; font-weight:600; font-family:inherit;
  color:var(--text); cursor:pointer; display:grid; place-items:center; z-index:1; }
.dp-rcell:hover { color:var(--teal); }
.dp-rcell.dp-mute { color:var(--text-muted); cursor:default; }
.dp-rcell.dp-in::before    { content:""; position:absolute; inset:0; background:rgba(109,204,209,.14); z-index:-1; }
.dp-rcell.dp-start::before { content:""; position:absolute; inset:0; left:50%;  background:rgba(109,204,209,.14); z-index:-1; }
.dp-rcell.dp-end::before   { content:""; position:absolute; inset:0; right:50%; background:rgba(109,204,209,.14); z-index:-1; }
.dp-rcell.dp-only::before  { display:none; }
.dp-rcell.dp-start > i, .dp-rcell.dp-end > i, .dp-rcell.dp-only > i {
  position:absolute; inset:2px; background:var(--teal); border-radius:6px; z-index:-1; }
.dp-rcell.dp-start, .dp-rcell.dp-end, .dp-rcell.dp-only { color:#08080e; font-weight:800; }
.dp-rcell.dp-today:not(.dp-start):not(.dp-end):not(.dp-only) {
  box-shadow:inset 0 0 0 1.5px var(--teal); border-radius:6px; color:var(--teal); }
.dp-rfoot { display:flex; align-items:center; justify-content:space-between; gap:8px; padding:10px 14px; border-top:1px solid var(--border); }
.dp-rsummary { font-size:11px; color:var(--text-secondary); font-weight:600; }
.dp-rsummary b { color:var(--text); }
.dp-ractions { display:flex; gap:8px; }
.dp-ractions button { border:1px solid var(--border-strong); background:none; border-radius:6px; padding:6px 12px;
  font-size:11px; font-weight:700; color:var(--text-secondary); cursor:pointer; font-family:inherit; }
.dp-ractions button:hover { border-color:var(--teal); color:var(--teal); }
.dp-ractions .dp-apply { background:var(--teal); color:#08080e; border-color:var(--teal); }
.dp-ractions .dp-apply:disabled { opacity:.4; cursor:default; background:var(--surface-alt); color:var(--text-muted); border-color:var(--border-strong); }

/* ══════════════════════════════════════════════════════════════
   PERCEIVED-QUALITY CANON (locked 2026-06-22). Platform-wide polish primitives:
   skeleton loaders, optimistic save-states, toasts, cache badges. Paired with
   /ops-skel.js, which auto-upgrades existing "Loading…" placeholders into
   shimmer (no per-page wiring) and exposes window.OpsSkel for optimistic
   writes + toasts. Theme-safe (pure tokens → works dark & light).
   Reference impl: the four IG "vibe-coded polish" ideas, applied in-skin.
   ══════════════════════════════════════════════════════════════ */

/* ── ① Skeleton loader ── shimmer placeholder in the data's final shape.
   Put .skel on any box; or let /ops-skel.js swap it in for "Loading…" text. */
@keyframes ops-shimmer { 0% { background-position:100% 0; } 100% { background-position:-100% 0; } }
.skel {
  background:linear-gradient(90deg, var(--surface-alt) 25%, var(--border-mid) 37%, var(--surface-alt) 63%);
  background-size:400% 100%; animation:ops-shimmer 1.4s ease infinite;
  border-radius:5px; color:transparent !important; pointer-events:none; user-select:none;
}
@media (prefers-reduced-motion: reduce) { .skel { animation:none; opacity:.65; } }
.skel-line { display:block; height:12px; margin:8px 0; }       /* stacked text bar */
.skel-line.sk-sm { width:55%; } .skel-line.sk-lg { height:20px; width:72%; }
.skel-inline { display:inline-block; height:12px; width:84px; vertical-align:middle; border-radius:4px; }
/* graceful give-up: /ops-skel.js converts a skeleton that never resolved (hung
   fetch) into this muted note rather than shimmering forever. */
.skel-stuck { color:var(--text-muted); font-size:12px; font-style:italic; padding:4px 0; }

/* ── ③ Optimistic save-state ── tiny status word next to an instantly-updated row. */
.ops-st { font-size:10px; font-weight:700; letter-spacing:.04em; transition:opacity .2s, color .2s; }
.ops-st-saving { color:var(--warn-text); } .ops-st-saved { color:var(--ok-text); } .ops-st-failed { color:var(--danger-text); }
.ops-pending { opacity:.55; transition:opacity .2s; }   /* row mid-save */

/* ── Toast ── transient confirm / error surfaced by OpsSkel.toast(). */
.ops-toast-zone { position:fixed; bottom:22px; left:50%; transform:translateX(-50%); z-index:4000;
  display:flex; flex-direction:column; gap:9px; align-items:center; pointer-events:none; }
.ops-toast { pointer-events:auto; background:var(--surface); border:1px solid var(--border-strong);
  border-left:3px solid var(--teal); border-radius:8px; padding:11px 16px; font-size:12.5px; color:var(--text);
  font-family:'Lato',sans-serif; box-shadow:0 12px 34px rgba(0,0,0,.45); display:flex; align-items:center; gap:10px;
  max-width:360px; opacity:0; transform:translateY(8px); transition:opacity .25s ease, transform .25s ease; }
.ops-toast.show { opacity:1; transform:translateY(0); }
.ops-toast.ok { border-left-color:var(--ok); } .ops-toast.err { border-left-color:var(--danger); }
.ops-toast b { font-weight:700; }

/* ── ② Cache badge ── 8px chip showing a panel served from cache vs fetched live. */
.ops-cache { font-size:8.5px; font-weight:700; letter-spacing:.05em; text-transform:uppercase;
  padding:2px 7px; border-radius:100px; display:inline-flex; align-items:center; gap:4px; vertical-align:middle; }
.ops-cache.hit  { background:rgba(98,194,142,.14); color:var(--ok-text);   border:1px solid rgba(98,194,142,.32); }
.ops-cache.live { background:rgba(220,154,79,.15); color:var(--warn-text); border:1px solid rgba(220,154,79,.32); }

/* ── Error + empty state actions ── paired with OpsSkel.error()/.empty() and the
   stuck-fetch fallback. (.ops-error / .ops-empty base styles live above.) */
.ops-error-txt { flex:1; line-height:1.45; }
.ops-error-txt small { display:block; color:rgba(239,68,68,.72); font-size:11px; margin-top:3px; font-weight:400; }
.ops-retry { flex-shrink:0; background:none; border:1px solid #ef4444; color:#ef4444; border-radius:100px;
  padding:5px 14px; font-family:inherit; font-size:11px; font-weight:700; cursor:pointer; white-space:nowrap; transition:background .15s; }
.ops-retry:hover { background:rgba(239,68,68,.12); }
.ops-empty-cta { margin-top:14px; background:var(--teal); color:#08080e; border:none; border-radius:100px;
  padding:8px 18px; font-family:inherit; font-size:12px; font-weight:700; cursor:pointer; }
.ops-empty-cta:hover { background:#7fd8dd; }
