/* NXT NVR Dashboard — Dark/Light theme */

:root {
    --thumb-size: 280px;
}

/* Dark theme (default) */
.dark {
    --bg: #0d1117;
    --card-bg: #161b22;
    --border: #30363d;
    --text: #e6edf3;
    --text-muted: #8b949e;
    --accent: #2f81f7;
    --accent-dim: #1a4a8a;
    --success: #3fb950;
    --warning: #d29922;
    --danger: #f85149;
    --overlay-bg: rgba(0, 0, 0, 0.8);

    /* Status-pill tokens — one palette for every state indicator in the UI.
       Rule: red is reserved for REC + critical state only. Active/running = green.
       Warn = amber. Info/neutral = muted grey. No blue "active" pills. */
    --pill-bg-idle:   transparent;
    --pill-fg-idle:   var(--text-muted);
    --pill-br-idle:   var(--border);
    --pill-bg-active: rgba(63, 185, 80, 0.15);
    --pill-fg-active: var(--success);
    --pill-br-active: rgba(63, 185, 80, 0.35);
    --pill-bg-warn:   rgba(210, 153, 34, 0.18);
    --pill-fg-warn:   var(--warning);
    --pill-br-warn:   rgba(210, 153, 34, 0.40);
    --pill-bg-crit:   rgba(248, 81, 73, 0.18);
    --pill-fg-crit:   var(--danger);
    --pill-br-crit:   rgba(248, 81, 73, 0.45);
    --pill-bg-rec:    var(--danger);
    --pill-fg-rec:    #ffffff;

    /* Aliases — many selectors were written against token names that never
       existed in the theme block and fell back to dark-only hardcoded
       literals (the reason light theme was broken in admin/pools/files/
       modals). Map them onto real tokens so light theme inherits for free.
       --bg-secondary = chrome (tab bars, table heads, modal headers).
       --bg-tertiary  = recessed/inset (card bodies, input wells).
       --text-primary   = --text, --text-secondary / --text-dim = --text-muted. */
    --bg-secondary:   var(--card-bg);
    --bg-tertiary:    var(--bg);
    --text-primary:   var(--text);
    --text-secondary: var(--text-muted);
    --text-dim:       var(--text-muted);

    /* Refine scrub mark-in / mark-out semantic colors */
    --mark-in:  #00aaff;
    --mark-out: #ff6644;

    /* Tile sparkline Y-axis label colour (dark theme: keep the warm amber
       token; light theme overrides below with a darker shade for contrast). */
    --spark-axis-label: var(--warning);
}

/* Light theme */
.light {
    --bg: #f6f8fa;
    --card-bg: #ffffff;
    --border: #d0d7de;
    --text: #1f2328;
    --text-muted: #656d76;
    --accent: #0969da;
    --accent-dim: #ddf4ff;
    --success: #1a7f37;
    --warning: #9a6700;
    --danger: #cf222e;
    --overlay-bg: rgba(0, 0, 0, 0.5);

    --pill-bg-idle:   transparent;
    --pill-fg-idle:   var(--text-muted);
    --pill-br-idle:   var(--border);
    --pill-bg-active: rgba(26, 127, 55, 0.12);
    --pill-fg-active: var(--success);
    --pill-br-active: rgba(26, 127, 55, 0.28);
    --pill-bg-warn:   rgba(154, 103, 0, 0.14);
    --pill-fg-warn:   var(--warning);
    --pill-br-warn:   rgba(154, 103, 0, 0.32);
    --pill-bg-crit:   rgba(207, 34, 46, 0.12);
    --pill-fg-crit:   var(--danger);
    --pill-br-crit:   rgba(207, 34, 46, 0.32);
    --pill-bg-rec:    var(--danger);
    --pill-fg-rec:    #ffffff;

    /* Aliases (see dark block for rationale) */
    --bg-secondary:   var(--card-bg);
    --bg-tertiary:    var(--bg);
    --text-primary:   var(--text);
    --text-secondary: var(--text-muted);
    --text-dim:       var(--text-muted);

    /* Refine scrub mark-in / mark-out — deeper shades for contrast on light bg */
    --mark-in:  #0969da;
    --mark-out: #d64b1f;

    /* Tile sparkline labels — deeper amber so numbers stay readable on
       light card-bg. The theme --warning (#9a6700) is still a bit washy
       over a tinted area fill; bump to a chocolate-brown tone. */
    --spark-axis-label: #6f3d00;
}

* { margin: 0; padding: 0; box-sizing: border-box; }

/* Themed scrollbars */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--text-muted); }
::-webkit-scrollbar-corner { background: transparent; }
* { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }

body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
    background: var(--bg);
    color: var(--text);
    overflow-x: hidden;
}

/* Header */
header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 1rem;
    height: 42px;
    background: var(--card-bg);
    border-bottom: 1px solid var(--border);
    position: sticky;
    top: 0;
    z-index: 100;
}

/* Header groups and separators */
.hgroup { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
.hgroup.right { margin-left: auto; }
.hsep { width: 1px; height: 22px; background: var(--border); flex-shrink: 0; margin: 0 6px; }
.hvsep { width: 1px; height: 16px; background: var(--border); flex-shrink: 0; margin: 0 4px; }

/* Narrow viewport — split the header into two rows. Health bar (the widest
   element) gets its own first row; logo+search, view+refresh, and the
   right cluster (clock/nav/theme/user) share the second row. Threshold
   1800px chosen because the Dashboard view-controls slot adds extra
   buttons that push the single-row layout into overflow at ~1790. Vertical
   .hsep separators are hidden in wrapped mode — the row break replaces
   them visually. */
@media (max-width: 1800px) {
    header {
        flex-wrap: wrap;
        height: auto;
        min-height: 42px;
        padding: 4px 1rem;
        row-gap: 4px;
        align-items: center;
    }
    .health-bar {
        order: 0;
        flex: 1 1 100%;
        width: 100%;
    }
    header > .hgroup,
    header > .hsep { order: 1; }
    header > .hsep { display: none; }
    .hgroup.right { margin-left: auto; }
}

/* Nav toggle (Dashboard/Admin switcher) */
.nav-toggle { display: flex; gap: 1px; background: var(--bg); padding: 2px; border-radius: 5px; flex-shrink: 0; }
.nav-btn { padding: 3px 10px; border: none; border-radius: 3px; font-size: 0.7rem; cursor: pointer; background: none; color: var(--text-muted); white-space: nowrap; }
.nav-btn.active { background: var(--accent); color: #fff; }
.nav-btn:not(.active):hover { color: var(--text); }

.header-left .logo {
    font-weight: 700;
    font-size: 0.95rem;
    color: var(--accent);
}

.logo-wrap {
    position: relative;
}
.logo-wrap .logo {
    cursor: pointer;
    user-select: none;
}
.logo-wrap .logo:hover { opacity: 0.8; }

.logo-dropdown {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 340px;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    box-shadow: 0 4px 12px rgba(0,0,0,0.3);
    z-index: 50;
    margin-top: 6px;
}
.logo-dropdown.open { display: block; }

.logo-dropdown .dd-header {
    padding: 8px 12px;
    font-weight: 600;
    font-size: 0.85rem;
    border-bottom: 1px solid var(--border);
    color: var(--text);
}

.logo-dropdown .dd-body { padding: 6px 0; }

.proc-row {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 5px 12px;
    font-size: 0.8rem;
}

.proc-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    flex-shrink: 0;
}
.proc-dot.running { background: var(--success); }
.proc-dot.stopped { background: var(--danger); }
.proc-dot.unknown { background: var(--warning); }
.proc-dot.failed { background: var(--danger); }

.proc-name { font-weight: 600; min-width: 50px; }
.proc-ver { color: var(--text-muted); min-width: 48px; }
.proc-status { color: var(--text-muted); min-width: 54px; }

/* === System tab gauges + compact key/value grid ==========================
   Used in the health dropdown's System panel (ddSysBody). Gauges are pure CSS
   conic-gradient rings, sized to read at a glance without being flashy. */
.sys-gauges {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 8px;
    padding: 12px 14px 8px;
}
.sys-gauge-wrap {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    min-width: 0;
}
.sys-gauge {
    --size: 64px;
    --thickness: 6px;
    --pct: 0;
    --gauge-color: var(--success);
    width: var(--size);
    height: var(--size);
    border-radius: 50%;
    position: relative;
    background:
        conic-gradient(var(--gauge-color) calc(var(--pct) * 1%), var(--border) 0);
    transition: background 0.4s linear;
}
.sys-gauge::before {
    content: '';
    position: absolute;
    inset: var(--thickness);
    border-radius: 50%;
    background: var(--card-bg);
}
.sys-gauge.empty { background: var(--border); }
.sys-gauge-inner {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    line-height: 1;
    z-index: 1;
}
.sys-gauge-val {
    font-size: 0.95rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    color: var(--text);
    letter-spacing: -0.02em;
}
.sys-gauge-label {
    font-size: 0.55rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-muted);
    margin-top: 2px;
}
.sys-gauge-sub {
    font-size: 0.62rem;
    color: var(--text-muted);
    text-align: center;
    font-variant-numeric: tabular-nums;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sys-kv-grid {
    display: grid;
    grid-template-columns: max-content 1fr;
    column-gap: 12px;
    row-gap: 4px;
    padding: 10px 14px 14px;
    border-top: 1px solid var(--border);
    margin-top: 4px;
    font-size: 0.72rem;
}
.sys-kv-k {
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.04em;
    font-size: 0.6rem;
    align-self: center;
}
.sys-kv-v {
    color: var(--text);
    font-variant-numeric: tabular-nums;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Pool cards in the health-dropdown Pools tab — one per pool */
.pool-dd-card {
    padding: 10px 14px;
    border-bottom: 1px solid var(--border);
}
.pool-dd-card:last-child { border-bottom: none; }

.pool-dd-head {
    display: flex;
    align-items: center;
    gap: 8px;
}
.pool-dd-name {
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--text);
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.pool-dd-tags { display: flex; gap: 4px; flex-shrink: 0; }
.pool-dd-tag {
    display: inline-block;
    padding: 1px 6px;
    font-size: 0.55rem;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--text-muted);
    background: var(--bg);
    border: 1px solid var(--border);
    border-radius: 3px;
    font-variant-numeric: tabular-nums;
}

.pool-dd-path {
    margin-top: 4px;
    font-family: monospace;
    font-size: 0.65rem;
    color: var(--text-muted);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.pool-dd-usage {
    margin-top: 4px;
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 0.7rem;
    color: var(--text);
    font-variant-numeric: tabular-nums;
}
.pool-dd-dot { color: var(--text-muted); }

.pool-dd-bar {
    margin-top: 6px;
    height: 4px;
    background: var(--border);
    border-radius: 2px;
    overflow: hidden;
}
.pool-dd-bar-fill {
    height: 100%;
    background: var(--success);
    border-radius: 2px;
    transition: width 0.3s ease, background 0.3s ease;
}
.pool-dd-bar-fill[data-state="warn"] { background: var(--warning); }
.pool-dd-bar-fill[data-state="crit"] { background: var(--danger); }
.pool-dd-bar-fill[data-state="idle"] { background: var(--text-muted); }

/* Kind tag in the Tasks dropdown — tiny uppercase label in front of each task */
.task-kind {
    display: inline-block;
    padding: 1px 6px;
    font-size: 0.55rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    border-radius: 3px;
    background: var(--bg);
    color: var(--text-muted);
    border: 1px solid var(--border);
    min-width: 3.5em;
    text-align: center;
}
.proc-uptime { color: var(--text-muted); min-width: 40px; font-size: 0.75rem; }
.proc-controls { display: flex; gap: 3px; margin-left: auto; }

.proc-controls .ctrl-btn {
    font-size: 0.7rem;
    padding: 2px 6px;
    border-radius: 3px;
    border: 1px solid var(--border);
    background: transparent;
    color: var(--text-muted);
    cursor: pointer;
}
.proc-controls .ctrl-btn:hover { background: var(--border); color: var(--text); }
.proc-controls .ctrl-btn.danger:hover { background: rgba(248,81,73,0.2); color: var(--danger); border-color: var(--danger); }

.logo-dd-warnings {
    padding: 6px 12px;
    font-size: 0.72rem;
    color: var(--warning);
    border-top: 1px solid var(--border);
    line-height: 1.4;
}
.logo-dd-warnings:empty { display: none; }

.header-center {
    display: flex;
    gap: 1rem;
}

.status-badge {
    font-size: 0.8rem;
    color: var(--text-muted);
    display: inline-block;
    min-width: 7ch;
    text-align: right;
}

.header-right {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.icon-btn {
    background: none;
    border: 1px solid var(--border);
    color: var(--text);
    padding: 2px 8px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.85rem;
}
.icon-btn:hover { background: var(--border); }

.user-menu { position: relative; }

.popover {
    position: absolute;
    top: 100%;
    right: 0;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    padding: 0.5rem;
    min-width: 120px;
    z-index: 200;
}
.popover a {
    display: block;
    padding: 0.3rem 0.5rem;
    color: var(--text);
    text-decoration: none;
    font-size: 0.85rem;
}
.popover a:hover { background: var(--border); border-radius: 4px; }

.hidden { display: none !important; }

/* --- Preferences modal (per-user TZ + locale picker) --- */
.prefs-modal-backdrop {
    position: fixed; inset: 0; z-index: 1000;
    background: rgba(0, 0, 0, 0.45);
    display: flex; align-items: center; justify-content: center;
}
.prefs-modal {
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 8px;
    width: min(420px, calc(100vw - 32px));
    max-height: calc(100vh - 64px);
    display: flex; flex-direction: column;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
}
.prefs-modal-header {
    display: flex; align-items: center; justify-content: space-between;
    padding: 0.7rem 1rem;
    border-bottom: 1px solid var(--border);
    font-weight: 600;
}
.prefs-close {
    background: transparent; border: 0; color: var(--text);
    font-size: 1rem; cursor: pointer; padding: 0 0.3rem;
}
.prefs-modal-body {
    padding: 1rem;
    display: flex; flex-direction: column; gap: 0.8rem;
}
.prefs-row { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.85rem; }
.prefs-label { color: var(--text-muted, var(--text)); font-weight: 500; }
.prefs-input-wrap { display: flex; gap: 0.4rem; align-items: stretch; }
.prefs-input-clearable {
    flex: 1; min-width: 0; position: relative;
    display: flex; align-items: stretch;
}
.prefs-input-clearable input {
    flex: 1; min-width: 0;
    background: var(--bg, var(--card-bg));
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: 4px;
    padding: 0.35rem 1.6rem 0.35rem 0.5rem;
    font: inherit;
}
.prefs-clear {
    position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
    background: transparent; border: 0; color: var(--text-muted, var(--text));
    cursor: pointer; padding: 0 4px; font-size: 0.85rem; line-height: 1;
    opacity: 0.6;
}
.prefs-clear:hover { opacity: 1; }
.prefs-auto {
    background: transparent; color: var(--text);
    border: 1px solid var(--border); border-radius: 4px;
    padding: 0.3rem 0.6rem; cursor: pointer;
    font-size: 0.8rem;
}
.prefs-auto:hover { background: var(--border); }
.prefs-preview-row {
    display: flex; flex-direction: column; gap: 0.3rem;
    padding-top: 0.5rem; border-top: 1px dashed var(--border);
    font-size: 0.85rem;
}
.prefs-preview {
    font-family: var(--mono, monospace);
    background: var(--bg, transparent);
    padding: 0.4rem 0.5rem; border-radius: 4px;
    border: 1px solid var(--border);
    word-break: break-word;
}
.prefs-modal-footer {
    display: flex; align-items: center; gap: 0.5rem;
    padding: 0.7rem 1rem;
    border-top: 1px solid var(--border);
}
.prefs-spacer { flex: 1; }
.prefs-reset, .prefs-cancel, .prefs-save {
    border: 1px solid var(--border); border-radius: 4px;
    padding: 0.35rem 0.8rem; cursor: pointer;
    font: inherit;
}
.prefs-reset { background: transparent; color: var(--text); }
.prefs-cancel { background: transparent; color: var(--text); }
.prefs-save { background: var(--accent, #4a8); color: #fff; border-color: transparent; }
.prefs-save:hover { filter: brightness(1.1); }
.prefs-reset:hover, .prefs-cancel:hover { background: var(--border); }

/* --- Phase 3 layout hardening for per-user-tz formats ---------------------
   Defensive constraints so TZ-aware timestamps (longer than the legacy
   YYYY-MM-DD HH:MM:SS) don't push siblings off-screen or trigger a
   <body> horizontal scrollbar at 1024×600. Visual walk + 6×6 (TZ ×
   locale) matrix is the merge gate — these are preventative, not
   exhaustive. See dev-docs/specs/2026-05-10-per-user-tz.md §6.
--------------------------------------------------------------------------- */

/* Timestamp text containers — never wrap inside the label itself; the
   parent flex container handles wrapping or ellipsis at its own boundary. */
.alert-time, .cc-time, .clock { white-space: nowrap; }

/* CC popup row: long CC text shouldn't squeeze the timestamp out of view.
   The timestamp is already display:block above the text, but the row
   needs min-width:0 so the .cc-text child can shrink with ellipsis. */
.cc-entry { min-width: 0; }
.cc-entry .cc-text { overflow-wrap: anywhere; }

/* EPG detail card: dc-time is "HH:MM — HH:MM" today; with a long-form TZ
   suffix it could exceed the card's natural width. Allow wrap rather than
   push the card. */
.epg-detail-card .dc-time { white-space: normal; word-wrap: break-word; }

/* Header clock area: ensure the clock can shrink when sibling nav buttons
   need space at narrow widths. min-width:0 lets flex-shrink actually work. */
.hgroup.right .clock { min-width: 0; flex-shrink: 1; }

.search-wrap {
    position: relative;
    display: flex;
    align-items: center;
}
#searchInput {
    width: 260px;
    min-width: 140px;
    padding: 5px 24px 5px 10px;
    background: var(--bg);
    border: 1px solid var(--border);
    border-radius: 5px;
    color: var(--text);
    font-size: 0.85rem;
    flex-shrink: 1;
    box-shadow: 0 0 6px rgba(47,129,247,0.15);
}
#searchInput:focus {
    border-color: var(--accent);
    outline: none;
    box-shadow: 0 0 10px rgba(47,129,247,0.35);
}
.search-clear {
    position: absolute;
    right: 4px;
    background: none;
    border: none;
    color: var(--text-muted);
    font-size: 1.1rem;
    cursor: pointer;
    padding: 0 4px;
    line-height: 1;
}
.search-clear:hover { color: var(--text); }

.clock { font-size: 0.72rem; color: var(--text-muted); font-variant-numeric: tabular-nums; white-space: nowrap; }

.view-controls { display: flex; gap: 3px; flex-shrink: 0; }

.size-controls {
    display: flex;
    gap: 4px;
}

.refresh-controls {
    display: flex;
    align-items: center;
    gap: 4px;
    margin-left: 12px;
}
.refresh-label {
    font-size: 0.75rem;
    color: var(--text-muted);
    margin-right: 2px;
}
.refresh-btn {
    background: none;
    border: 1px solid var(--border);
    color: var(--text-muted);
    padding: 2px 8px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.75rem;
}
.refresh-btn:hover { background: var(--border); }
.refresh-btn.active {
    background: var(--accent);
    color: #fff;
    border-color: var(--accent);
}

/* Channel Grid */
#channelGrid {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    padding: 8px;
    justify-content: flex-start;
}

.channel-tile {
    width: var(--thumb-size);
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    overflow: hidden;
    cursor: pointer;
    transition: border-color 0.15s;
    position: relative;
}
.channel-tile:hover { border-color: var(--accent); }
.channel-tile.down { border-color: var(--danger); }

.tile-img {
    width: 100%;
    aspect-ratio: 16/9;
    object-fit: cover;
    background: #000;
    display: block;
}

/* Status overlay for tiles without signal */
.tile-status-overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    aspect-ratio: 16/9;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    gap: 6px;
    background: rgba(0, 0, 0, 0.75);
    pointer-events: none;
    z-index: 1;
}
.tile-status-overlay.hidden { display: none; }
.tile-status-icon {
    font-size: 1.4rem;
    line-height: 1;
    opacity: 0.7;
}
.tile-status-label {
    font-size: 0.65rem;
    font-weight: 700;
    letter-spacing: 1px;
    text-transform: uppercase;
}
.tile-status-overlay.no-signal { color: var(--warning); }
.tile-status-overlay.offline { color: var(--danger); }

.tile-info {
    padding: 4px 8px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-size: 0.75rem;
    min-height: 28px;
}

.tile-name {
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    flex: 1;
}

.tile-badges {
    display: flex;
    gap: 4px;
    flex-shrink: 0;
}

.badge {
    font-size: 0.65rem;
    padding: 1px 4px;
    border-radius: 3px;
    font-weight: 600;
}

.badge-signal { color: var(--success); }
.badge-signal.down { color: var(--danger); }
.badge-rec { background: var(--danger); color: #fff; }
.badge-cc { background: var(--accent); color: #fff; }
.badge-bitrate { color: var(--text-muted); }
.badge-bitrate-pill { font-size: 0.55rem; color: var(--success); background: none; font-weight: 600; font-variant-numeric: tabular-nums; }
.badge-down { background: var(--danger); color: #fff; }
.badge-warn { background: var(--warning); color: #fff; }
.badge-sig { background: var(--accent); color: #fff; }

/* Player Popup */
#playerOverlay {
    position: fixed;
    top: 0; left: 0; right: 0; bottom: 0;
    background: var(--overlay-bg);
    z-index: 500;
    display: flex;
    align-items: center;
    justify-content: center;
}

#playerPopup {
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 8px;
    width: 90vw;
    max-width: 1200px;
    max-height: 90vh;
    overflow: auto;
}

.popup-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.5rem 1rem;
    border-bottom: 1px solid var(--border);
}

#popupTitle { font-weight: 600; font-size: 1rem; }

.meta-pill { font-size: 0.6rem; padding: 2px 6px; border-radius: 3px; background: var(--bg); color: var(--text-muted); font-weight: 500; font-variant-numeric: tabular-nums; }
.meta-pill:empty { display: none; }
.meta-pill-muted { background: none; border: 1px solid var(--border); color: var(--text-muted); min-width: 5ch; text-align: center; }

.popup-controls {
    display: flex;
    gap: 0.5rem;
    align-items: center;
}

.popup-controls select {
    background: var(--bg);
    border: 1px solid var(--border);
    color: var(--text);
    padding: 2px 6px;
    border-radius: 4px;
    font-size: 0.8rem;
}

.player-container {
    position: relative;
    background: #000;
}

#videoWrap {
    flex: 1;
    position: relative;
    width: 100%;
    min-width: 0;
    aspect-ratio: 16 / 9;
    overflow: hidden;
}

#videoPlayer {
    width: 100%;
    height: 100%;
    display: block;
    object-fit: cover;
}

/* Timeline */
#timeline {
    padding: 0.5rem 1rem;
    border-top: 1px solid var(--border);
}


/* #timelineBar: new styles from .timeline-bar block below */

#timelineSegments {
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    overflow: hidden;
    border-radius: 3px;
}

.timeline-segment {
    position: absolute;
    top: 0;
    height: 100%;
    background: var(--success);
    opacity: 0.5;
    border-radius: 1px;
    transition: opacity 0.15s, box-shadow 0.15s;
}
.timeline-segment:hover {
    opacity: 0.85;
    box-shadow: 0 0 10px rgba(63,185,80,0.6), 0 0 20px rgba(63,185,80,0.25);
}

.timeline-segment--active {
    position: absolute;
    top: 0;
    height: 100%;
    background: var(--warning);
    opacity: 0.6;
    border-radius: 1px;
    transition: opacity 0.15s, box-shadow 0.15s;
}
.timeline-segment--active:hover {
    opacity: 0.9;
    box-shadow: 0 0 10px rgba(210,153,34,0.6), 0 0 20px rgba(210,153,34,0.25);
}

/* Old #timeline* ID rules removed — new .t-* class rules below */

/* Transport controls */
.transport-controls {
    display: flex;
    gap: 3px;
}
.transport-btn {
    background: none;
    border: 1px solid var(--border);
    color: var(--text-muted);
    min-width: 28px;
    height: 24px;
    padding: 0 6px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.75rem;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.1s;
    white-space: nowrap;
}
.transport-btn:hover { border-color: var(--text-muted); color: var(--text); }
.transport-btn:active { background: var(--accent); color: #fff; border-color: var(--accent); }
.transport-btn.active { border-color: var(--success); color: var(--success); background: rgba(63,185,80,0.1); }
.transport-btn.disabled { opacity: 0.25; pointer-events: none; }
.transport-sep { width: 1px; height: 18px; background: var(--border); align-self: center; margin: 0 1px; }


/* === Pill bars (admin sys-bar + CC mode selector) === */
.pill-bar {
    display: flex;
    gap: 2px;
    background: var(--bg);
    padding: 3px;
    border-radius: 6px;
}

.pill {
    display: flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    border-radius: 4px;
    font-size: 0.7rem;
    color: var(--text-muted);
    cursor: pointer;
    border: none;
    background: none;
    white-space: nowrap;
    transition: all 0.15s;
}
.pill:hover { color: var(--text); background: rgba(255,255,255,0.05); }
.pill.active { color: var(--success); background: rgba(63,185,80,0.15); }
.pill.disabled { opacity: 0.25; pointer-events: none; }

/* Supervisor / System pills */
.sup-pill {
    display: flex;
    align-items: center;
    gap: 5px;
    padding: 4px 10px;
    border-radius: 6px;
    background: var(--bg);
    border: 1px solid var(--border);
    cursor: pointer;
    transition: all 0.15s;
    font-size: 0.7rem;
    color: var(--text-muted);
    position: relative;
}
.sup-pill:hover { border-color: var(--text-muted); }
.sup-pill.open { border-color: var(--success); background: rgba(63,185,80,0.1); color: var(--success); }

/* === Unified status-pill primitive =========================================
   One pill shape, state driven by [data-state]. Use for every indicator:
   header health counters, tile badges (REC/CC/SIG/DOWN), channel list rows,
   channel-details tasks, etc. Legacy .badge / .badge-pill / .ch-badge will
   be migrated to this over time. */
.status-pill {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 1px 7px;
    border-radius: 10px;
    font-size: 0.62rem;
    font-weight: 700;
    line-height: 1.5;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    font-variant-numeric: tabular-nums;
    border: 1px solid var(--pill-br-idle);
    background: var(--pill-bg-idle);
    color: var(--pill-fg-idle);
    white-space: nowrap;
    user-select: none;
}
.status-pill[data-state="active"] { background: var(--pill-bg-active); color: var(--pill-fg-active); border-color: var(--pill-br-active); }
.status-pill[data-state="warn"]   { background: var(--pill-bg-warn);   color: var(--pill-fg-warn);   border-color: var(--pill-br-warn); }
.status-pill[data-state="crit"]   { background: var(--pill-bg-crit);   color: var(--pill-fg-crit);   border-color: var(--pill-br-crit); }
.status-pill[data-state="rec"]    { background: var(--pill-bg-rec);    color: var(--pill-fg-rec);    border-color: var(--pill-bg-rec); }
/* Counter variant — numeric pill (e.g. "3/47") without uppercase/letter-spacing */
.status-pill.count { text-transform: none; letter-spacing: 0; font-size: 0.65rem; padding: 1px 8px; }

/* Dropdown panels */
.sup-dropdown {
    display: none;
    position: absolute;
    top: 100%;
    width: 480px;
    max-height: 440px;
    overflow-y: auto;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 8px;
    box-shadow: 0 12px 40px rgba(0,0,0,0.5);
    z-index: 50;
    margin-top: 6px;
}
.sup-dropdown.open { display: block; }
.sup-dropdown.left { left: 0; right: auto; }
.sup-dropdown.right { right: 0; left: auto; }

.dd-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px 14px;
    border-bottom: 1px solid var(--border);
    font-weight: 600;
    font-size: 0.8rem;
}

.dd-body { padding: 6px 0; }

.ctrl-btn {
    font-size: 0.65rem;
    padding: 3px 8px;
    border: 1px solid var(--border);
    border-radius: 4px;
    cursor: pointer;
    background: var(--bg);
    color: var(--text-muted);
}
.ctrl-btn:hover { background: var(--border); }
.ctrl-btn.start { border-color: var(--success); color: var(--success); }
.ctrl-btn.stop { border-color: var(--danger); color: var(--danger); }
.ctrl-btn.restart { border-color: var(--warning); color: var(--warning); }

/* Unified Health Bar */
.health-bar {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: 6px;
    background: var(--bg);
    border: 1px solid var(--border);
    cursor: pointer;
    transition: border-color 0.15s, background 0.15s;
    font-size: 0.7rem;
    color: var(--text-muted);
    position: relative;
    flex-shrink: 0;
}
.health-bar:hover { border-color: var(--text-muted); }
.health-bar.open { border-color: var(--accent); background: rgba(47,129,247,0.06); }

.hb-stat { white-space: nowrap; font-variant-numeric: tabular-nums; min-width: 4ch; }
.hb-stat[data-tab] { cursor: pointer; padding: 2px 6px; border-radius: 3px; transition: background 0.1s; }
.hb-stat[data-tab]:hover { background: rgba(128,128,128,0.12); }
.hb-muted { opacity: 0.7; }
.hb-kv {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    white-space: nowrap;
    padding: 1px 4px;
    border-radius: 3px;
    transition: background 0.1s;
}
.hb-kv[data-tab]:hover { background: rgba(128,128,128,0.12); }
.hb-k { font-size: 0.6rem; }
.hb-v { font-weight: 600; font-variant-numeric: tabular-nums; min-width: 2.8ch; text-align: right; display: inline-block; }
.hb-v[data-state="warn"] { color: var(--pill-fg-warn); }
.hb-v[data-state="crit"] { color: var(--pill-fg-crit); }
.hb-sep { width: 1px; height: 14px; background: var(--border); flex-shrink: 0; }
.hb-hidden { display: none !important; }

/* Health dropdown */
.health-dd {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    width: 520px;
    max-height: 480px;
    overflow-y: auto;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 8px;
    box-shadow: 0 12px 40px rgba(0,0,0,0.5);
    z-index: 50;
    margin-top: 6px;
    cursor: default;
}
.health-dd.open { display: block; }

.hd-tabs {
    display: flex;
    border-bottom: 1px solid var(--border);
    padding: 0 8px;
    position: sticky;
    top: 0;
    background: var(--card-bg);
    z-index: 1;
}
.hd-tab {
    padding: 8px 14px;
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--text-muted);
    background: none;
    border: none;
    border-bottom: 2px solid transparent;
    cursor: pointer;
    transition: color 0.15s, border-color 0.15s;
}
.hd-tab:hover { color: var(--text); }
.hd-tab.active { color: var(--accent); border-bottom-color: var(--accent); }

.hd-panel { display: none; padding: 6px 0; }
.hd-panel.active { display: block; }

/* Admin channel tiles */
.admin-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(var(--thumb-size), 1fr));
    gap: 8px;
    padding: 8px;
}

.admin-tile {
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    overflow: hidden;
    cursor: pointer;
    transition: border-color 0.15s;
    /* Match dashboard tile footprint: image (16:9 @ thumb-size) + info bar. */
    height: calc(var(--thumb-size) * 9 / 16 + 30px);
    display: flex;
    flex-direction: column;
}
.admin-tile .admin-tile-body {
    flex: 1 1 0;
    min-height: 0;
    overflow: hidden;
    display: flex;
    flex-direction: column;
}
.admin-tile:hover { border-color: var(--text-muted); }
.admin-tile.down { border-color: var(--danger); }
.admin-tile.degraded { border-color: var(--warning); }
.admin-tile.selected { border-color: var(--success); box-shadow: 0 0 12px rgba(63,185,80,0.12); }

.admin-tile-top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 8px;
    height: 28px;
    background: var(--bg);
    border-bottom: 2px solid var(--success);
    font-size: 0.75rem;
}
.admin-tile-top.down { border-bottom-color: var(--danger); }
.admin-tile-top.degraded { border-bottom-color: var(--warning); }

.admin-tile-body { padding: 6px 8px; }

.admin-tile-row {
    display: flex;
    justify-content: space-between;
    font-size: 0.68rem;
    padding: 1px 0;
}
.admin-tile-row .k { color: var(--text-muted); }
.admin-tile-row .v { font-variant-numeric: tabular-nums; }
/* Tile sparkline fills the remaining tile body vertically so it scales with
   the current zoom level. min-height keeps it visible on the smallest sizes. */
.admin-tile .tile-chart {
    display: block;
    width: 100%;
    flex: 1 1 auto;
    min-height: 28px;
    margin-top: 6px;
    border-radius: 3px;
}

.admin-storage-bar {
    width: 100%;
    height: 3px;
    background: var(--bg);
    border-radius: 2px;
    overflow: hidden;
    margin-top: 4px;
}
.admin-storage-fill { height: 100%; border-radius: 2px; }

/* Channel popover */
.ch-popover {
    position: absolute;
    width: 420px;
    max-height: 480px;
    overflow-y: auto;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 8px;
    box-shadow: 0 16px 48px rgba(0,0,0,0.6);
    z-index: 90;
    display: none;
}
.ch-popover.open { display: block; }

.pop-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 10px 14px;
    border-bottom: 1px solid var(--border);
    background: var(--bg);
}
.pop-header h3 { font-size: 0.9rem; display: flex; align-items: center; gap: 6px; }

.pop-section {
    padding: 10px 14px;
    border-bottom: 1px solid var(--bg);
}
.pop-section:last-child { border-bottom: none; }

.pop-section-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 6px;
}
.pop-section-title {
    font-size: 0.65rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

.pop-row {
    display: flex;
    justify-content: space-between;
    font-size: 0.72rem;
    padding: 2px 0;
}
.pop-row .k { color: var(--text-muted); }
.pop-row .v { font-variant-numeric: tabular-nums; }
.pop-row .v.action {
    color: var(--accent);
    cursor: pointer;
    text-decoration: underline;
    text-decoration-style: dotted;
    text-underline-offset: 2px;
}


/* Mark in/out lines on timeline */
.mark-line {
    position: absolute;
    top: 0;
    width: 2px;
    height: 100%;
    background: var(--accent);
    z-index: 8;
    pointer-events: none;
}
.mark-line.hidden { display: none; }
.mark-line::after {
    content: '';
    position: absolute;
    top: -4px;
    left: -3px;
    width: 0; height: 0;
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
    border-top: 4px solid var(--accent);
}
.mark-region {
    position: absolute;
    top: 0;
    height: 100%;
    background: rgba(47,129,247,0.12);
    border-left: 1px solid var(--accent);
    border-right: 1px solid var(--accent);
    z-index: 3;
    pointer-events: none;
}
.mark-region.hidden { display: none; }

/* CC panels — position variants */
.cc-panel-side {
    position: absolute;
    top: 0;
    width: 280px;
    height: 100%;
    padding: 10px 8px;
    display: none;
    flex-direction: column;
    gap: 4px;
    overflow-y: auto;
    z-index: 2;
}
.cc-panel-side.right { right: 0; border-left: 1px solid var(--border); }
.cc-panel-side.left { left: 0; border-right: 1px solid var(--border); }
.cc-panel-side.visible { display: flex; }

.cc-panel-hz {
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    width: 60%;
    max-height: 100px;
    padding: 6px 12px;
    display: none;
    flex-direction: column;
    gap: 2px;
    overflow: hidden;
    z-index: 2;
    border-radius: 4px;
}
.cc-panel-hz.bottom { bottom: 8px; flex-direction: column-reverse; }
.cc-panel-hz.top { top: 8px; flex-direction: column-reverse; }
.cc-panel-hz.visible { display: flex; }

/* CC panel background — opacity driven by --cc-panel-opacity (0%-100%)
   set at runtime by applyCCMode(). 100% = fully card-bg (opaque panel).
   Lower values mix with transparent. At 0% the panel is invisible but
   entries still read over the video. */
.cc-panel-side, .cc-panel-hz {
    background: color-mix(in srgb, var(--card-bg) var(--cc-panel-opacity, 100%), transparent);
    backdrop-filter: blur(6px);
}

/* CC overlay lines */
.cc-overlay-panel {
    position: absolute;
    display: none;
    flex-direction: column;
    gap: 4px;
    overflow-y: auto;
    z-index: 2;
}
.cc-overlay-panel.visible { display: flex; }
.cc-overlay-panel .cc-text {
    background: rgba(0,0,0,0.7);
    color: #fff;
    padding: 2px 6px;
    border-radius: 2px;
    display: inline-block;
}
.cc-overlay-panel.right { top: 0; right: 0; width: 280px; height: 100%; padding: 10px 8px; }
.cc-overlay-panel.left { top: 0; left: 0; width: 280px; height: 100%; padding: 10px 8px; }
.cc-overlay-panel.bottom { bottom: 8px; left: 50%; transform: translateX(-50%); width: 60%; max-height: 100px; padding: 6px 12px; flex-direction: column-reverse; overflow: hidden; }
.cc-overlay-panel.top { top: 8px; left: 50%; transform: translateX(-50%); width: 60%; max-height: 100px; padding: 6px 12px; flex-direction: column-reverse; overflow: hidden; }

/* Solid CC panels — flex layout, take space from video */
.player-container.cc-solid-right,
.player-container.cc-solid-left { display: flex; flex-direction: row; max-height: 70vh; }
.player-container.cc-solid-top,
.player-container.cc-solid-bottom { display: flex; flex-direction: column; }

.cc-solid-panel {
    display: none;
    background: var(--card-bg);
    border: none;
    overflow-y: auto;
    flex-shrink: 0;
}
.cc-solid-panel.visible { display: flex; flex-direction: column; gap: 4px; }
.cc-solid-panel.side { width: 260px; padding: 10px 8px; min-height: 0; }
.cc-solid-panel.hz { height: 80px; padding: 6px 12px; overflow: hidden; flex-direction: column-reverse; }
.cc-solid-panel.left { order: -1; border-right: 1px solid var(--border); }
.cc-solid-panel.right { order: 1; border-left: 1px solid var(--border); }
.cc-solid-panel.top { order: -1; border-bottom: 1px solid var(--border); }
.cc-solid-panel.bottom { order: 1; border-top: 1px solid var(--border); }

/* CC entry — font size is driven by --cc-font-size on the active panel (set
   from the gear-menu font slider). Older lines fade so the "now" line stands out. */
.cc-entry { margin-bottom: 4px; opacity: 0.55; transition: opacity 0.15s; }
.cc-entry.cc-entry-current { opacity: 1; }
.cc-entry .cc-time { font-size: 0.6rem; color: var(--text-muted); display: block; font-variant-numeric: tabular-nums; }
.cc-entry .cc-text { font-size: var(--cc-font-size, 14px); line-height: 1.35; }
.cc-entry.cc-entry-current .cc-text { font-weight: 600; }

/* Top and bottom CC panels (horizontal band) should read broadcast-style:
   text centered within the band, and the timestamp hidden (it's a ribbon,
   not a log). Side panels stay left-aligned so multi-line scroll reads naturally. */
.cc-panel-hz.top, .cc-panel-hz.bottom,
.cc-overlay-panel.top, .cc-overlay-panel.bottom {
    text-align: center;
}
.cc-panel-hz.top .cc-entry .cc-time,
.cc-panel-hz.bottom .cc-entry .cc-time,
.cc-overlay-panel.top .cc-entry .cc-time,
.cc-overlay-panel.bottom .cc-entry .cc-time { display: none; }

.cc-head {
    font-size: 0.6rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    padding-bottom: 4px;
    border-bottom: 1px solid var(--border);
    margin-bottom: 4px;
    flex-shrink: 0;
}
.cc-panel-hz .cc-head,
.cc-solid-panel.hz .cc-head { display: none; }

/* LIVE badge */
.live-badge {
    position: absolute;
    top: 10px;
    right: 12px;
    background: var(--danger);
    color: #fff;
    padding: 3px 10px;
    border-radius: 4px;
    font-size: 0.7rem;
    font-weight: 700;
    z-index: 5;
    display: flex;
    align-items: center;
    gap: 5px;
}
.live-badge .pulse-dot {
    width: 6px;
    height: 6px;
    background: #fff;
    border-radius: 50%;
    animation: pulse-dot 1.5s infinite;
}
@keyframes pulse-dot {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.3; }
}

/* System bar */
.sys-bar {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 1rem;
    background: var(--bg);
    border-bottom: 1px solid var(--border);
    position: relative;
}
.sys-bar .sup-pills { display: flex; gap: 6px; }
.sys-bar .spacer { flex: 1; }

.sys-inline {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: 0.65rem;
}
.sys-inline .label { color: var(--text-muted); }
.sys-inline .val { font-weight: 600; font-variant-numeric: tabular-nums; }

.mini-bar {
    width: 48px;
    height: 4px;
    background: var(--bg);
    border-radius: 2px;
    overflow: hidden;
}
.mini-bar-fill { height: 100%; border-radius: 2px; }

/* Color utilities */
.c-ok { color: var(--success) !important; }
.c-warn { color: var(--warning) !important; }
.c-err { color: var(--danger) !important; }
.bg-ok { background: var(--success); }
.bg-warn { background: var(--warning); }
.bg-err { background: var(--danger); }

/* Process rows in supervisor dropdowns */
.proc-row {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 5px 14px;
    font-size: 0.7rem;
    border-bottom: 1px solid var(--bg);
}
.proc-row:last-child { border-bottom: none; }
.proc-row:hover { background: rgba(255,255,255,0.02); }
.proc-row.proc-down { background: rgba(248,81,73,0.05); }
.proc-left { display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0; }
.proc-key { color: var(--text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.proc-meta { color: var(--text-muted); font-size: 0.65rem; font-variant-numeric: tabular-nums; white-space: nowrap; }
.proc-sep { color: var(--border); }
.proc-actions { display: flex; gap: 3px; flex-shrink: 0; }
.proc-actions .ctrl-btn { font-size: 0.6rem; padding: 1px 5px; }

/* Status dots */
.dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.dot-green { background: var(--success); }
.dot-yellow { background: var(--warning); }
.dot-red { background: var(--danger); }

/* Dropdown sections */
.dd-section-title {
    font-size: 0.6rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    padding: 8px 14px 4px;
}
.dd-placeholder {
    padding: 12px 14px;
    font-size: 0.7rem;
    color: var(--text-muted);
    font-style: italic;
}

/* System dropdown stat rows and bars */
.stat-row {
    display: flex;
    justify-content: space-between;
    padding: 2px 0;
    font-size: 0.72rem;
}
.stat-label { color: var(--text-muted); }
.stat-value { font-weight: 600; font-variant-numeric: tabular-nums; }
.bar-bg {
    width: 100%;
    height: 5px;
    background: var(--bg);
    border-radius: 2px;
    overflow: hidden;
    margin: 3px 0 6px;
}
.bar-fill { height: 100%; border-radius: 2px; }

/* Alert rows */
.alert-row {
    padding: 6px 14px 6px 10px;
    border-bottom: 1px solid var(--bg);
    border-left: 3px solid transparent;
    font-size: 0.7rem;
}
.alert-row:last-child { border-bottom: none; }
/* Severity accent: left border + subtle bg tint distinguishes critical/error
   from warning from info at a glance. */
.alert-row.sev-critical { border-left-color: var(--danger); background: color-mix(in srgb, var(--danger) 10%, transparent); }
.alert-row.sev-error    { border-left-color: var(--danger); background: color-mix(in srgb, var(--danger) 6%, transparent); }
.alert-row.sev-warning  { border-left-color: var(--warning); background: color-mix(in srgb, var(--warning) 6%, transparent); }
.alert-row.sev-info     { border-left-color: var(--accent); }
/* Acked rows: dimmed, no tint, italic for the type label. */
.alert-row.acked { opacity: 0.5; background: transparent; }
.alert-row.acked .alert-type { font-style: italic; }
.alert-hdr { display: flex; gap: 8px; align-items: center; margin-bottom: 2px; }
.alert-time { color: var(--text-muted); font-size: 0.6rem; font-variant-numeric: tabular-nums; }
.alert-sev { font-weight: 700; font-size: 0.6rem; text-transform: uppercase; }
.alert-sev.sev-critical { color: var(--danger); }
.alert-sev.sev-error    { color: var(--danger); }
.alert-sev.sev-warning  { color: var(--warning); }
.alert-sev.sev-info     { color: var(--accent); }
.alert-ack-tag {
    font-size: 0.55rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text-muted);
    border: 1px solid var(--text-muted);
    border-radius: 2px;
    padding: 0 4px;
}
.alert-type { color: var(--text); }
.alert-channel { color: var(--accent); font-weight: 600; margin-left: auto; }
.alert-details { color: var(--text-muted); font-size: 0.65rem; }
.alert-diff { list-style: none; margin: 2px 0; padding: 0; }
.alert-diff li { padding: 1px 0; font-variant-numeric: tabular-nums; }
.alert-meta { margin-top: 3px; opacity: 0.75; font-size: 0.6rem; }

/* Popover action buttons row */
.pop-actions { display: flex; gap: 4px; }

/* Action link (coming soon placeholder) */
.action-link {
    color: var(--accent);
    cursor: pointer;
    text-decoration: underline;
    text-decoration-style: dotted;
    text-underline-offset: 2px;
    font-variant-numeric: tabular-nums;
}
.action-link:hover { color: var(--accent); opacity: 0.8; }

/* Additional badge variants */
.badge-sig { background: var(--accent); color: #fff; }
.badge-down { background: var(--danger); color: #fff; }
.badge-warn { background: var(--warning); color: #000; }

/* Admin list view */
.admin-list-body { background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px; overflow: hidden; }
.admin-list-header {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 6px 12px;
    font-size: 0.62rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    border-bottom: 1px solid var(--border);
}
.admin-list-header .dot-placeholder { width: 6px; flex-shrink: 0; }
.admin-list-row {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 6px 12px;
    font-size: 0.75rem;
    border-bottom: 1px solid var(--bg);
    cursor: pointer;
    transition: background 0.1s;
}
.admin-list-row:hover { background: rgba(128,128,128,0.06); }
.admin-list-row.selected { background: color-mix(in srgb, var(--success) 8%, transparent); border-left: 2px solid var(--success); padding-left: 10px; }

/* Disabled channels — clearly separated from active rows but still clickable.
   Muted text, desaturated dot/badges, and a faint zebra tint so the block at
   the bottom of the list reads as "off" at a glance. */
.admin-list-row.disabled { opacity: 0.55; background: color-mix(in srgb, var(--text-muted) 5%, transparent); }
.admin-list-row.disabled:hover { opacity: 0.75; }
.admin-list-row.disabled .list-name { font-weight: 500; }
.admin-list-row.disabled .badge { filter: grayscale(0.6); }
.admin-list-row.disabled .list-bar-fill { background: var(--text-muted) !important; }

/* Sortable header columns */
.admin-list-header .sortable {
    cursor: pointer;
    user-select: none;
    position: relative;
    transition: color 0.1s;
}
.admin-list-header .sortable:hover { color: var(--text); }
.admin-list-header .sortable.sort-asc::after,
.admin-list-header .sortable.sort-desc::after {
    content: '';
    display: inline-block;
    margin-left: 5px;
    width: 0; height: 0;
    border-left: 4px solid transparent;
    border-right: 4px solid transparent;
    vertical-align: middle;
}
.admin-list-header .sortable.sort-asc::after  { border-bottom: 5px solid var(--accent); }
.admin-list-header .sortable.sort-desc::after { border-top:    5px solid var(--accent); }
.admin-list-header .sortable.sort-asc,
.admin-list-header .sortable.sort-desc { color: var(--accent); }
.list-pos { width: 32px; color: var(--text-muted); font-variant-numeric: tabular-nums; font-size: 0.7rem; text-align: right; flex-shrink: 0; }
.list-name { font-weight: 600; width: 200px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.list-badges { display: flex; gap: 4px; width: 100px; }
.list-field { color: var(--text-muted); font-variant-numeric: tabular-nums; width: 120px; }
.list-field.source { width: 200px; font-size: 0.68rem; }
.list-bar-wrap { width: 80px; }
.list-bar { height: 3px; background: var(--bg); border-radius: 2px; overflow: hidden; }
.list-bar-fill { height: 100%; border-radius: 2px; }

/* Storage + Headroom columns.
   Storage: bar (fill = used_gb / limit_gb) + percent label. Colour tracks
   the storage warning/critical thresholds via .bar-green|yellow|red.
   Headroom: text-only ("2h left" / "1.9d left" / "over"). */
.list-storage-wrap {
    display: inline-flex; align-items: center; gap: 8px;
    width: 100px;
}
.list-storage-wrap .list-bar { flex: 0 0 56px; }
.list-storage-label {
    color: var(--text-muted);
    font-size: 0.7rem;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}
.list-headroom-wrap {
    color: var(--text-muted);
    font-size: 0.7rem;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    width: 76px;
    text-align: right;
}
.list-headroom-wrap.over {
    color: var(--danger, #f85149);
    font-weight: 600;
}
.list-headroom-wrap.rolling {
    color: var(--success, #3fb950);
}
.list-bar-fill.bar-green  { background: var(--success, #3fb950); }
.list-bar-fill.bar-yellow { background: var(--warning, #d29922); }
.list-bar-fill.bar-red    { background: var(--danger, #f85149); }

/* Weekly coverage heatstrip (list column + popover block) */
.wk-heat {
    display: grid;
    gap: 1px;
    background: var(--bg);
    border-radius: 2px;
    padding: 1px;
}
.wk-heat span { background: var(--border); }
.wk-heat span.full { background: var(--success, #3fb950); }
.wk-heat span.part { background: var(--warning, #d29922); }
.wk-heat span.gap  { background: var(--danger, #f85149); }
.wk-heat-sm {
    grid-template-columns: repeat(24, 4px);
    grid-template-rows: repeat(7, 2px);
    flex-shrink: 0;
}
.list-wk-wrap { display: flex; align-items: center; gap: 8px; width: 144px; flex-shrink: 0; }
.list-wk-pct { font-size: 0.65rem; color: var(--text-muted); font-variant-numeric: tabular-nums; min-width: 32px; }
.list-wk-pct.warn { color: var(--warning, #d29922); }
.list-wk-pct.err  { color: var(--danger, #f85149); }

.wk-block {
    padding: 10px 8px 12px;
    border-bottom: 1px solid var(--border);
    background: rgba(0,0,0,0.15);
}
.wk-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    font-size: 0.62rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    margin-bottom: 6px;
}
.wk-summary { color: var(--text); text-transform: none; letter-spacing: 0; font-size: 0.7rem; }
.wk-summary b { color: var(--success, #3fb950); font-weight: 600; }
.wk-summary.warn b { color: var(--warning, #d29922); }
.wk-summary.err  b { color: var(--danger, #f85149); }
.wk-heat-wrap { display: flex; gap: 4px; align-items: stretch; width: 100%; }
.wk-heat-labels {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    font-size: 0.52rem;
    color: var(--text-muted);
    padding: 1px 0;
    flex: 0 0 30px;
    text-align: right;
}
.wk-heat-lg {
    flex: 1 1 0%;
    min-width: 0;
    grid-template-columns: repeat(24, minmax(0, 1fr));
    grid-template-rows: repeat(7, 14px);
    padding: 2px;
}
.wk-heat-lg span { border-radius: 1px; }
.wk-heat-xaxis {
    display: flex;
    justify-content: space-between;
    font-size: 0.6rem;
    color: var(--text-muted);
    padding: 2px 4px 0 36px;
}

/* Responsive */
@media (max-width: 768px) {
    :root { --thumb-size: 160px; }
    #channelGrid { gap: 4px; padding: 4px; }
}

/* --- EPG --- */

/* Tile EPG lower-third */
.tile-epg {
    position: absolute;
    bottom: 28px; /* above .tile-info */
    left: 0;
    right: 0;
    background: rgba(0, 0, 0, 0.75);
    color: #fff;
    font-size: 0.6rem;
    padding: 2px 6px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    pointer-events: none;
}

/* === LIVE POPUP V2 === */

/* Feed selectors — top-left of video */
.video-feeds {
    position: absolute;
    top: 36px;
    left: 12px;
    z-index: 6;
    display: flex;
    gap: 4px;
}
.video-feeds .feed-btn {
    background: rgba(0,0,0,0.6);
    border: 1px solid rgba(255,255,255,0.18);
    color: rgba(255,255,255,0.8);
    border-radius: 4px;
    height: 24px;
    padding: 0 8px;
    cursor: pointer;
    font-size: 0.65rem;
    display: flex;
    align-items: center;
    gap: 4px;
    white-space: nowrap;
}
.video-feeds .feed-btn:hover { background: rgba(0,0,0,0.8); color: #fff; }
.video-feeds .feed-btn.disabled { opacity: 0.35; pointer-events: none; }
.video-feeds .feed-btn .feed-label { color: rgba(255,255,255,0.45); font-size: 0.55rem; font-weight: 600; }
.video-feeds .feed-btn .feed-value { color: rgba(255,255,255,0.8); }
.video-feeds .feed-btn .feed-arrow { color: rgba(255,255,255,0.35); font-size: 0.5rem; }

/* CC + gear overlay — top-right of video */
.video-cc {
    position: absolute;
    top: 36px;
    right: 12px;
    z-index: 6;
    display: flex;
    gap: 3px;
}
.video-cc .vbtn {
    background: rgba(0,0,0,0.6);
    border: 1px solid rgba(255,255,255,0.18);
    color: rgba(255,255,255,0.8);
    border-radius: 4px;
    height: 24px;
    padding: 0 7px;
    cursor: pointer;
    font-size: 0.7rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 3px;
}
.video-cc .vbtn:hover { background: rgba(0,0,0,0.8); color: #fff; }
.video-cc .vbtn.active { border-color: var(--accent); color: var(--accent); background: rgba(47,129,247,0.2); }
.video-cc .vbtn.gear { min-width: 22px; font-size: 0.65rem; padding: 0 5px; }

/* CC settings popup (from gear click). Theme-aware: reads from theme tokens
   so both labels AND <select>s are legible in dark and light. The popup
   floats over the video but may spill onto light chrome during layout
   edge cases — keep it a real theme surface, not a hand-rolled dark panel. */
.cc-settings-popup {
    position: absolute;
    top: 64px;
    right: 12px;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    padding: 8px 10px;
    min-width: 160px;
    z-index: 20;
    font-size: 0.7rem;
    color: var(--text);
    box-shadow: 0 6px 20px rgba(0,0,0,0.4);
    display: none;
}
.cc-settings-popup.visible { display: block; }
.cc-settings-popup .cc-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 5px; }
.cc-settings-popup .cc-row:last-child { margin-bottom: 0; }
.cc-settings-popup .cc-lbl,
.cc-settings-popup .cc-label {
    color: var(--text-muted);
    font-size: 0.6rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
}
.cc-settings-popup select {
    background: var(--bg);
    border: 1px solid var(--border);
    color: var(--text);
    border-radius: 3px;
    font-size: 0.7rem;
    padding: 2px 4px;
    height: 22px;
    cursor: pointer;
}
.cc-settings-popup select:focus { outline: 1px solid var(--accent); border-color: var(--accent); }

/* EPG pill — top-center of video */
.video-epg {
    position: absolute;
    top: 10px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 6;
    background: rgba(0,0,0,0.6);
    border-radius: 4px;
    padding: 3px 10px;
    font-size: 0.7rem;
    white-space: nowrap;
    display: flex;
    align-items: center;
    gap: 6px;
}
.video-epg .epg-time { color: rgba(255,255,255,0.5); }
.video-epg .epg-title { color: #fff; font-weight: 500; }
.video-epg .epg-remain { color: var(--warning); font-size: 0.65rem; }

/* Pause badge and step indicator — on video */
.video-pause-badge {
    position: absolute;
    top: 10px;
    left: 12px;
    background: rgba(0,0,0,0.75);
    color: var(--text);
    font-size: 0.7rem;
    padding: 3px 8px;
    border-radius: 3px;
    font-weight: 500;
    z-index: 6;
}
.video-step-indicator {
    position: absolute;
    bottom: 12px;
    left: 12px;
    background: rgba(0,0,0,0.75);
    color: var(--warning);
    font-size: 0.7rem;
    padding: 3px 8px;
    border-radius: 3px;
    font-weight: 600;
    z-index: 11;
    transition: bottom 0.25s ease, opacity 0.25s ease;
    font-family: monospace;
    white-space: nowrap;
}
.video-step-indicator .pill-glyph { color: var(--warning); margin-right: 4px; font-size: 0.85rem; }
.video-step-indicator .sk { color: var(--text-muted); margin: 0 4px; }
.video-step-indicator .sk-action { color: var(--accent); font-weight: 700; margin-left: 6px; }
.video-step-indicator .sk-key {
    display: inline-block;
    background: rgba(255,255,255,0.15);
    border: 1px solid rgba(255,255,255,0.25);
    padding: 0 4px;
    margin-left: 3px;
    border-radius: 2px;
    font-size: 0.6rem;
    color: #fff;
}
#videoWrap:hover .video-step-indicator { bottom: 56px; }

.video-pause-pill {
    position: absolute;
    bottom: 36px;
    left: 12px;
    background: rgba(0,0,0,0.75);
    color: var(--warning);
    font-size: 0.7rem;
    padding: 3px 8px;
    border-radius: 3px;
    font-weight: 600;
    z-index: 11;
    transition: bottom 0.25s ease, opacity 0.25s ease;
    font-family: monospace;
    white-space: nowrap;
}
.video-pause-pill .pill-glyph { color: var(--warning); margin-right: 4px; font-size: 0.85rem; }
.video-pause-pill .sk { color: var(--text-muted); margin: 0 4px; }
.video-pause-pill .sk-key {
    display: inline-block;
    background: rgba(255,255,255,0.15);
    border: 1px solid rgba(255,255,255,0.25);
    padding: 0 4px;
    margin: 0 2px;
    border-radius: 2px;
    font-size: 0.6rem;
    color: #fff;
}
#videoWrap:hover .video-pause-pill { bottom: 80px; }

/* Hover-reveal: all overlays hidden by default, shown on video hover */
#videoWrap .video-feeds,
#videoWrap .video-cc,
#videoWrap .video-epg,
#videoWrap .floating-transport,
#videoWrap .video-pause-badge.visible,
#videoWrap .video-step-indicator.visible,
#videoWrap .cc-settings-popup.visible {
    opacity: 0;
    transition: opacity 0.25s ease;
}
#videoWrap:hover .video-feeds,
#videoWrap:hover .video-cc,
#videoWrap:hover .video-epg,
#videoWrap:hover .floating-transport,
#videoWrap:hover .video-pause-badge.visible,
#videoWrap:hover .video-step-indicator.visible,
#videoWrap:hover .cc-settings-popup.visible {
    opacity: 1;
}

/* Floating transport — overlays video bottom */
.floating-transport {
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.5rem 1rem;
    background: rgba(0,0,0,0.80);
    z-index: 10;
}
.ft-btn {
    background: rgba(255,255,255,0.08);
    border: 1px solid rgba(255,255,255,0.18);
    color: rgba(255,255,255,0.8);
    border-radius: 4px;
    height: 26px;
    min-width: 26px;
    padding: 0 6px;
    cursor: pointer;
    font-size: 0.75rem;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 3px;
    white-space: nowrap;
}
.ft-btn:hover { background: rgba(255,255,255,0.18); color: #fff; }
.ft-btn.active { border-color: var(--accent); color: var(--accent); background: rgba(47,129,247,0.2); }
.ft-btn.mark { border-color: var(--accent); color: var(--accent); }
.ft-btn.mark.set { background: var(--accent); color: #fff; }
.ft-btn.refine {
    border-color: var(--mark-in); color: var(--mark-in); font-weight: 700;
    min-width: 28px; text-align: center; letter-spacing: 1px;
}
.ft-btn.refine:not(.dim):hover { background: color-mix(in srgb, var(--mark-in) 13%, transparent); }
.ft-btn.refine:not(.dim):active { background: var(--mark-in); color: #fff; }
.ft-btn.danger { border-color: var(--danger); color: var(--danger); }
/* "Jump to Live" — ACTION button, distinct from the LIVE indicator.
   Visible only when the viewer is off the live edge (.at-live hides it).
   Neutral accent styling — no red, no pulsing dot. */
.ft-btn.go-live {
    border-color: var(--accent);
    color: var(--accent);
    font-weight: 600;
    display: flex;
    align-items: center;
    gap: 4px;
    letter-spacing: 0.03em;
}
.ft-btn.go-live:hover { background: color-mix(in srgb, var(--accent) 14%, transparent); }
.ft-btn.go-live.at-live { display: none; }
.ft-btn.export { border-color: var(--success); color: var(--success); font-weight: 600; }
.ft-btn.dim { opacity: 0.3; pointer-events: none; }
.ft-sep { width: 1px; height: 18px; background: rgba(255,255,255,0.12); margin: 0 0.3rem; }
.ft-spacer { flex: 1; }
.ft-time { font-family: 'SF Mono', 'Consolas', monospace; font-size: 0.8rem; color: #fff; letter-spacing: 0.02em; }
.ft-mark-range { font-family: monospace; font-size: 0.7rem; color: var(--accent); }
.ft-mark-range.dim { opacity: 0.3; }
.ft-format {
    background: rgba(0,0,0,0.5);
    border: 1px solid rgba(255,255,255,0.18);
    color: rgba(255,255,255,0.8);
    border-radius: 3px;
    font-size: 0.65rem;
    padding: 1px 4px;
    height: 22px;
}

/* Zoomable timeline section */
.timeline-zoom {
    padding: 0.35rem 1rem 0.2rem;
    border-top: 1px solid var(--border);
    background: var(--card-bg);
    position: relative;
}
.timeline-zoom-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 3px;
}
.tz-meta { font-size: 0.65rem; color: var(--text-muted); display: flex; align-items: center; gap: 0.8rem; }
.zoom-badge {
    font-size: 0.6rem;
    font-weight: 600;
    padding: 1px 6px;
    border-radius: 3px;
    background: rgba(47,129,247,0.15);
    color: var(--accent);
    font-family: monospace;
}
.tz-segment-info { font-size: 0.65rem; color: var(--text); font-family: 'SF Mono', 'Consolas', monospace; }
.tz-segment-info .dim { color: var(--text-muted); }
.tz-hint { font-size: 0.6rem; color: var(--text-muted); }
.date-nav { display: flex; align-items: center; gap: 4px; font-size: 0.65rem; }
.date-nav .date-label { color: var(--text); font-family: 'SF Mono', 'Consolas', monospace; }
.date-btn {
    background: none;
    border: 1px solid var(--border);
    color: var(--text-muted);
    border-radius: 3px;
    width: 20px;
    height: 18px;
    cursor: pointer;
    font-size: 0.6rem;
    display: flex;
    align-items: center;
    justify-content: center;
}
.date-btn:hover { border-color: var(--text-muted); color: var(--text); }

/* Timeline bar (new v2 overlay children) */
.timeline-bar {
    height: 24px;
    background: var(--bg);
    border-radius: 3px;
    position: relative;
    overflow: visible;
    cursor: pointer;
    user-select: none;
    -webkit-user-select: none;
}
.t-segment { position: absolute; top: 0; height: 100%; border-radius: 2px; transition: opacity 0.15s, box-shadow 0.15s; }
.t-segment.green { background: var(--success); opacity: 0.4; }
.t-segment.green:hover { opacity: 0.8; box-shadow: 0 0 8px rgba(63,185,80,0.5); }
.t-segment.yellow { background: var(--warning); opacity: 0.5; }
.t-segment.yellow:hover { opacity: 0.85; box-shadow: 0 0 8px rgba(210,153,34,0.5); }
.t-playhead { position: absolute; top: 0; width: 2px; height: 100%; background: var(--danger); z-index: 5; }
.t-mark { position: absolute; top: 0; width: 2px; height: 100%; background: var(--accent); z-index: 6; }
.t-mark::before {
    content: '';
    position: absolute;
    top: -4px; bottom: -4px;
    left: -6px; right: -6px;
    cursor: ew-resize;
}
.t-mark:hover { box-shadow: 0 0 0 1px var(--accent); }
.t-overflow-arrow {
    position: absolute;
    top: auto;
    height: 11px;
    width: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--accent);
    font-size: 11px;
    line-height: 1;
    pointer-events: none;
    user-select: none;
    z-index: 5;
}
.t-overflow-arrow.left  { left: 2px; }
.t-overflow-arrow.right { right: 2px; }
.t-mark-region {
    position: absolute;
    top: 0;
    height: 100%;
    background: repeating-linear-gradient(
        45deg,
        rgba(47,129,247,0.22) 0 6px,
        rgba(47,129,247,0.08) 6px 12px
    );
    z-index: 3;
    pointer-events: none;
}
.t-cap-band {
    position: absolute;
    top: 0;
    height: 11px;
    background: var(--accent);
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0 4px;
    font-family: monospace;
    font-size: 0.58rem;
    font-weight: 700;
    color: #fff;
    letter-spacing: 0.3px;
    border-radius: 2px 2px 0 0;
    overflow: hidden;
    white-space: nowrap;
    z-index: 4;
    pointer-events: none;
    user-select: none;
}
.t-cap-band .lbl-full,
.t-cap-band .lbl-compact,
.t-cap-band .lbl-dur { display: none; }
.t-cap-band.f-full .lbl-full,
.t-cap-band.f-compact .lbl-compact {
    display: flex;
    justify-content: space-between;
    width: 100%;
}
.t-cap-band.f-dur .lbl-dur {
    display: block;
    width: 100%;
    text-align: center;
}
.t-cap-band.f-dot { padding: 0; }
.t-chip {
    position: absolute;
    top: -16px;
    transform: translateX(-50%);
    height: 14px;
    padding: 0 5px;
    display: inline-flex;
    align-items: center;
    font-size: 0.58rem;
    font-weight: 700;
    letter-spacing: 0.3px;
    color: #fff;
    background: var(--accent);
    border-radius: 2px;
    font-family: monospace;
    z-index: 10;
    white-space: nowrap;
    pointer-events: none;
}
.t-chip::after {
    content: '';
    position: absolute;
    top: 100%;
    left: 50%;
    transform: translateX(-50%);
    width: 0; height: 0;
    border-left: 3px solid transparent;
    border-right: 3px solid transparent;
    border-top: 3px solid var(--accent);
}
.t-hover { position: absolute; top: 0; width: 1px; height: 24px; background: var(--text-muted); opacity: 0.4; z-index: 2; pointer-events: none; }
.t-tooltip {
    position: absolute;
    bottom: calc(100% + 4px);
    transform: translateX(-50%);
    background: var(--card-bg);
    border: 1px solid var(--border);
    color: var(--text);
    font-size: 0.65rem;
    padding: 2px 6px;
    border-radius: 3px;
    font-family: monospace;
    z-index: 20;
    pointer-events: none;
    white-space: nowrap;
}
.t-thumb {
    position: absolute;
    bottom: calc(100% + 22px);
    transform: translateX(-50%);
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 4px;
    padding: 2px;
    z-index: 19;
    pointer-events: none;
    box-shadow: 0 2px 8px rgba(0,0,0,0.5);
    user-select: none;
    -webkit-user-select: none;
}
.t-thumb img {
    display: block;
    width: 240px;
    height: auto;
    border-radius: 2px;
    background: #000;
    user-select: none;
    -webkit-user-select: none;
    -webkit-user-drag: none;
    pointer-events: none;
}
.t-thumb.loading img { opacity: 0.4; }
.t-thumb-time {
    position: absolute;
    left: 4px;
    bottom: 4px;
    font-family: monospace;
    font-size: 0.7rem;
    color: #fff;
    background: rgba(0,0,0,0.6);
    padding: 1px 5px;
    border-radius: 2px;
    pointer-events: none;
    user-select: none;
    -webkit-user-select: none;
    text-shadow: 0 1px 2px rgba(0,0,0,0.8);
}
.t-labels { position: relative; height: 14px; font-size: 0.6rem; color: var(--text-muted); margin-top: 2px; margin-bottom: 2px; }

/* EPG ribbon */
.epg-ribbon {
    padding: 0.15rem 0 0.3rem;
    position: relative;
    height: 24px;
    overflow: hidden;
}
.epg-block {
    height: 20px;
    border-radius: 2px;
    display: flex;
    align-items: center;
    padding: 0 6px;
    font-size: 0.6rem;
    overflow: hidden;
    white-space: nowrap;
    cursor: pointer;
    flex-shrink: 0;
    transition: filter 0.15s;
}
.epg-block:hover { filter: brightness(1.3); }
.epg-block.now { outline: 1px solid var(--text-muted); outline-offset: -1px; }
.epg-block.narrow { padding: 0 3px; font-size: 0.5rem; }
.epg-block.ctx-active { outline: 2px solid var(--accent); outline-offset: -1px; filter: brightness(1.4); }
.epg-block.future { opacity: 0.35; cursor: default; pointer-events: none; }

/* EPG block color variants */
.epg-block.c1 { background: rgba(139,92,246,0.18); color: #8b5cf6; border: 1px solid rgba(139,92,246,0.25); }
.epg-block.c2 { background: rgba(6,182,212,0.18); color: #06b6d4; border: 1px solid rgba(6,182,212,0.25); }
.epg-block.c3 { background: rgba(245,158,11,0.18); color: #f59e0b; border: 1px solid rgba(245,158,11,0.25); }
.epg-block.c4 { background: rgba(236,72,153,0.18); color: #ec4899; border: 1px solid rgba(236,72,153,0.25); }
.epg-block.c5 { background: rgba(16,185,129,0.18); color: #10b981; border: 1px solid rgba(16,185,129,0.25); }

/* EPG context menu */
.epg-ctx-menu {
    position: absolute;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    padding: 4px 0;
    min-width: 200px;
    box-shadow: 0 8px 24px rgba(0,0,0,0.5);
    z-index: 100;
    font-size: 0.78rem;
    display: none;
}
.epg-ctx-menu.visible { display: block; }
.epg-ctx-menu .ctx-header {
    padding: 4px 12px 6px;
    font-size: 0.65rem;
    color: var(--text-muted);
    border-bottom: 1px solid var(--border);
    margin-bottom: 2px;
}
.epg-ctx-menu .ctx-header strong { color: var(--text); font-weight: 600; }
.ctx-item {
    padding: 5px 12px;
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--text);
}
.ctx-item:hover { background: rgba(47,129,247,0.15); }
.ctx-item .ctx-icon { width: 16px; text-align: center; font-size: 0.7rem; color: var(--accent); }
.ctx-item .ctx-label { flex: 1; }
.ctx-item .ctx-key { font-size: 0.6rem; color: var(--text-muted); font-family: monospace; }
.ctx-sep { height: 1px; background: var(--border); margin: 3px 0; }
.ctx-item.disabled { color: var(--text-muted); opacity: 0.5; cursor: default; }

/* === EPG PAGE === */

/* Page layout — CSS grid: sidebar + timeline */
.epg-page {
    display: grid;
    grid-template-columns: 180px 1fr;
    grid-template-rows: 30px 24px 1fr;
    height: calc(100vh - 42px - 24px);
    overflow: hidden;
}

/* Spacer — spans both header rows in col 1 (replaces old filter box) */
.epg-page .ch-search-spacer {
    grid-column: 1; grid-row: 1 / 3;
    background: var(--card-bg); border-right: 1px solid var(--border);
    border-bottom: 1px solid var(--border);
}
/* Inline EPG search in controls bar */
.epg-search-input {
    padding: 2px 8px; border: 1px solid var(--border);
    border-radius: 3px; background: var(--bg); color: var(--text);
    font-size: 0.8rem; outline: none; width: 160px;
}
.epg-search-input:focus { border-color: var(--accent); }
.epg-search-input::placeholder { color: var(--text-muted); }

/* Channel list — col 1, row 3, scroll-synced with grid */
.epg-page .ch-list {
    grid-column: 1; grid-row: 3;
    overflow-y: auto; scrollbar-width: none;
    background: var(--card-bg); border-right: 1px solid var(--border);
}
.epg-page .ch-list::-webkit-scrollbar { display: none; }

/* Channel row */
.epg-page .ch-row {
    display: flex; align-items: center; padding: 0 8px;
    height: calc(39px * var(--epg-scale, 1)); gap: 5px; flex-shrink: 0;
    border-bottom: 1px solid var(--border); cursor: pointer;
    transition: background 0.1s;
}
.epg-page .ch-row:hover { background: var(--bg); }
.epg-page .ch-row.active { background: rgba(47,129,247,0.08); border-left: 2px solid var(--accent); }
.epg-page .ch-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }
.epg-page .ch-dot.on { background: var(--success); }
.epg-page .ch-dot.off { background: var(--danger); }
.epg-page .ch-name {
    font-size: 0.85rem; white-space: nowrap; overflow: hidden;
    text-overflow: ellipsis; flex: 1; min-width: 0;
}
.epg-page .ch-badges { display: flex; gap: 3px; flex-shrink: 0; margin-left: auto; }
.epg-page .ch-badge {
    font-size: 0.6rem; padding: 2px 5px; border-radius: 2px;
    font-weight: 600; letter-spacing: 0.02em;
}
.epg-page .ch-badge.rec { background: rgba(63,185,80,0.15); color: var(--success); }
.epg-page .ch-badge.cc  { background: rgba(47,129,247,0.15); color: var(--accent); }
.epg-page .ch-badge.off { background: rgba(248,81,73,0.15); color: var(--danger); }

/* Controls bar — col 2, row 1 */
.epg-page .tl-controls {
    grid-column: 2; grid-row: 1;
    display: flex; align-items: center; gap: 6px; padding: 0 10px;
    background: var(--card-bg); border-bottom: 1px solid var(--border);
    overflow: hidden;
}
.epg-page .tl-controls .date-input {
    background: var(--bg); border: 1px solid var(--border); color: var(--text);
    border-radius: 3px; padding: 2px 6px; font-size: 0.8rem;
    font-family: 'SF Mono', Consolas, 'Liberation Mono', monospace;
}
.epg-page .tl-controls .zlabel { font-size: 0.8rem; color: var(--text-muted); }
.epg-page .tl-controls .zbtn {
    padding: 2px 8px; background: var(--bg); border: 1px solid var(--border);
    color: var(--text-muted); border-radius: 3px; font-size: 0.8rem; cursor: pointer;
}
.epg-page .tl-controls .zbtn:hover { color: var(--text); }
.epg-page .tl-controls .zbtn.sel {
    background: rgba(47,129,247,0.08); color: var(--accent); border-color: var(--accent);
}

/* Time ruler — col 2, row 2 */
.epg-page .time-ruler {
    grid-column: 2; grid-row: 2;
    background: var(--card-bg); border-bottom: 1px solid var(--border);
    overflow: hidden; position: relative;
}
.epg-page .time-ruler-inner { display: flex; height: 100%; position: relative; }
.epg-page .time-tick {
    display: flex; align-items: flex-end; padding: 0 0 3px 6px;
    font-size: 0.75rem; color: var(--text-muted);
    font-family: 'SF Mono', Consolas, 'Liberation Mono', monospace;
    border-left: 1px solid var(--border); flex-shrink: 0;
}

/* EPG grid — col 2, row 3 */
.epg-page .tl-grid {
    grid-column: 2; grid-row: 3;
    overflow: auto; position: relative;
}
.epg-page .tl-grid-inner { position: relative; }

/* Now line */
.epg-page .now-line {
    position: absolute; top: 0; width: 2px; background: var(--danger);
    z-index: 10; pointer-events: none;
}
.epg-page .now-dot {
    position: absolute; top: -4px; left: -3px; width: 8px; height: 8px;
    background: var(--danger); border-radius: 50%;
}
.epg-page .now-time-label {
    position: absolute; top: -1px; left: 6px;
    font-size: 0.7rem; color: var(--danger); font-weight: 600;
    font-family: 'SF Mono', Consolas, 'Liberation Mono', monospace; white-space: nowrap;
}

/* EPG row */
.epg-page .epg-row { border-bottom: 1px solid var(--border); position: relative; }
.epg-page .epg-blocks { height: calc(30px * var(--epg-scale, 1)); position: relative; }

/* EPG blocks — muted colors */
.epg-page .epg-blk {
    position: absolute; top: 2px; height: calc(24px * var(--epg-scale, 1)); border-radius: 2px;
    display: flex; align-items: center; padding: 0 6px;
    font-size: 0.8rem; overflow: hidden; white-space: nowrap;
    cursor: pointer; transition: filter 0.15s;
}
.epg-page .epg-blk:hover { filter: brightness(1.3); z-index: 3; }
.epg-page .epg-blk.now { outline: 1px solid var(--text-muted); outline-offset: -1px; }
.epg-page .epg-blk.c1 { background: rgba(124,111,155,0.12); color: #7c6f9b; border: 1px solid rgba(124,111,155,0.20); }
.epg-page .epg-blk.c2 { background: rgba(90,154,168,0.12); color: #5a9aa8; border: 1px solid rgba(90,154,168,0.20); }
.epg-page .epg-blk.c3 { background: rgba(184,154,90,0.12); color: #b89a5a; border: 1px solid rgba(184,154,90,0.20); }
.epg-page .epg-blk.c4 { background: rgba(168,114,138,0.12); color: #a8728a; border: 1px solid rgba(168,114,138,0.20); }
.epg-page .epg-blk.c5 { background: rgba(106,158,130,0.12); color: #6a9e82; border: 1px solid rgba(106,158,130,0.20); }

/* Recording coverage track — thin gap spacing */
.epg-page .rec-track { height: calc(5px * var(--epg-scale, 1)); position: relative; margin-bottom: 4px; }
.epg-page .rec-seg { position: absolute; top: 1px; height: 3px; border-radius: 1px; }
.epg-page .rec-seg.complete  { background: var(--success); opacity: 0.45; }
.epg-page .rec-seg.recording { background: var(--success); opacity: 0.8; animation: epg-rec-pulse 2s ease-in-out infinite; }
.epg-page .rec-seg.gap       { background: var(--danger); opacity: 0.3; }
@keyframes epg-rec-pulse { 0%,100% { opacity: 0.6; } 50% { opacity: 1; } }

/* Floating detail card */
.epg-detail-card {
    display: none; position: fixed;
    background: var(--card-bg); border: 1px solid var(--border);
    border-radius: 6px; padding: 10px 14px;
    min-width: 240px; max-width: 340px;
    box-shadow: 0 8px 24px rgba(0,0,0,0.5);
    z-index: 200; font-size: 0.9rem;
}
.epg-detail-card.visible { display: block; }
.epg-detail-card .dc-title { font-weight: 600; margin-bottom: 3px; }
.epg-detail-card .dc-time {
    font-size: 0.8rem; color: var(--text-muted);
    font-family: 'SF Mono', Consolas, 'Liberation Mono', monospace;
}
.epg-detail-card .dc-genre { font-size: 0.8rem; color: var(--accent); margin-top: 2px; }
.epg-detail-card .dc-desc {
    font-size: 0.8rem; color: var(--text-muted);
    margin-top: 4px; line-height: 1.4;
    display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.epg-detail-card .dc-sep { border-top: 1px solid var(--border); margin: 6px 0; }
.epg-detail-card .dc-rec {
    font-size: 0.8rem; padding: 2px 6px; border-radius: 2px; display: inline-block;
}
.epg-detail-card .dc-rec.yes { background: rgba(63,185,80,0.15); color: var(--success); }
.epg-detail-card .dc-rec.no  { background: rgba(248,81,73,0.1); color: var(--danger); }
.epg-detail-card .dc-rec.fut { color: var(--text-muted); }
.epg-detail-card .dc-actions { display: flex; gap: 6px; margin-top: 8px; }
.epg-detail-card .dc-btn {
    padding: 4px 10px; border: 1px solid var(--border); border-radius: 4px;
    background: var(--bg); color: var(--text-muted); font-size: 0.8rem;
    cursor: pointer;
}
.epg-detail-card .dc-btn:hover { color: var(--text); border-color: var(--accent); }
.epg-detail-card .dc-btn.primary { background: var(--accent); color: #fff; border-color: var(--accent); }
.epg-detail-card .dc-btn.primary:hover { filter: brightness(1.1); }

/* Legend bar */
.epg-legend {
    display: flex; align-items: center; gap: 12px; padding: 4px 10px;
    background: var(--card-bg); border-top: 1px solid var(--border);
    font-size: 0.8rem; color: var(--text-muted);
}
.epg-legend .legend-item { display: flex; align-items: center; gap: 4px; }
.epg-legend .legend-swatch { width: 16px; height: 3px; border-radius: 1px; }
.epg-legend .legend-swatch.rec-ok { background: var(--success); opacity: 0.5; }
.epg-legend .legend-swatch.rec-now { background: var(--success); }
.epg-legend .legend-swatch.rec-gap { background: var(--danger); opacity: 0.4; }
.epg-legend .legend-dot { width: 8px; height: 8px; border-radius: 2px; }
.epg-legend .legend-dot.epg-now { outline: 1px solid var(--text-muted); outline-offset: -1px; background: rgba(124,111,155,0.12); }
.epg-legend .legend-line { width: 2px; height: 10px; background: var(--danger); }
.ctx-item.disabled:hover { background: none; }

/* ---- Refine Scrub Popup ---- */
.refine-overlay {
    position: absolute; inset: 0;
    background: rgba(0, 0, 0, 0.85);
    z-index: 200;
    display: flex; align-items: center; justify-content: center;
}
.refine-overlay.hidden { display: none; }

.refine-popup {
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 10px;
    width: 90vw; max-width: 1200px;
    overflow: hidden;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
}

.refine-header {
    display: flex; align-items: center; justify-content: space-between;
    padding: 14px 20px;
    border-bottom: 1px solid var(--border);
    background: var(--bg-secondary);
}
.refine-title { font-size: 15px; font-weight: 600; display: flex; align-items: center; gap: 4px; }
.refine-which { color: var(--mark-in); }
.refine-which.out { color: var(--mark-out); }
.refine-mark-date {
    font-family: monospace;
    font-size: 11px;
    color: var(--text-muted);
    margin-left: 8px;
    letter-spacing: 0.3px;
}
.refine-mark-date.cross-day { color: var(--accent); font-weight: 600; }
.rri-span { color: var(--accent); font-weight: 600; }

.refine-switch-hint {
    display: inline-flex; align-items: center; gap: 6px;
    margin-left: 16px; padding: 5px 12px;
    background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 6px;
    font-size: 12px; color: var(--text-muted);
    cursor: pointer; transition: border-color 0.15s, background 0.15s;
}
.refine-switch-hint:hover { border-color: var(--text-muted); background: var(--bg); }
.refine-switch-hint kbd {
    background: var(--accent-dim); color: var(--accent); padding: 2px 7px;
    border-radius: 3px; font-family: monospace; font-size: 12px;
    font-weight: 700; border: 1px solid var(--border);
}
.refine-arrow { color: var(--text-dim, #666680); font-size: 14px; }
.refine-switch-target { font-weight: 600; font-size: 13px; }
.refine-switch-target.mark-in { color: var(--mark-in); }
.refine-switch-target.mark-out { color: var(--mark-out); }

.refine-controls { display: flex; align-items: center; gap: 10px; }
.refine-window-label { font-size: 12px; color: var(--text-dim, #666680); }
.refine-window-select {
    background: var(--bg); color: var(--text); border: 1px solid var(--border);
    border-radius: 4px; padding: 4px 8px; font-size: 12px; cursor: pointer;
}
.refine-close-btn {
    background: none; border: none; color: var(--text-dim, #666680);
    font-size: 18px; cursor: pointer; padding: 4px 8px; border-radius: 4px;
}
.refine-close-btn:hover { color: var(--text); background: var(--border); }

.refine-video-wrap {
    position: relative; background: #000;
    display: flex; align-items: center; justify-content: center;
    width: 100%; aspect-ratio: 16 / 9;
    overflow: hidden;
}
.refine-video-wrap video { width: 100%; height: 100%; object-fit: contain; }
.refine-loading { position: absolute; color: var(--text-dim, #666680); font-size: 14px; }

.refine-scrub { padding: 16px 20px 12px; border-top: 1px solid var(--border); }
.refine-track-wrap { position: relative; height: 36px; margin-bottom: 8px; cursor: pointer; }
.refine-hover-line {
    position: absolute; top: 0; width: 1px; height: 100%;
    background: var(--text-muted); opacity: 0.5; z-index: 3; pointer-events: none;
}
.refine-thumb { bottom: calc(100% + 10px); z-index: 30; }
.refine-thumb canvas { display: block; width: 240px; height: auto; border-radius: 2px; background: #000; }
.refine-track {
    position: absolute; top: 12px; left: 0; right: 0; height: 12px;
    background: var(--border); border-radius: 6px; overflow: hidden;
}
.refine-fill {
    height: 100%; background: linear-gradient(90deg, var(--accent-dim), var(--accent));
    border-radius: 6px; width: 0%; transition: width 0.03s linear;
}
.refine-handle {
    position: absolute; top: 6px; width: 3px; height: 24px;
    background: var(--accent); border-radius: 2px; transform: translateX(-1px);
    box-shadow: 0 0 8px var(--accent-dim); pointer-events: none;
}
.refine-orig-mark {
    position: absolute; top: 4px; width: 2px; height: 28px;
    border-radius: 1px; pointer-events: none; z-index: 2;
}
.refine-orig-mark.in  { background: var(--mark-in); }
.refine-orig-mark.out { background: var(--mark-out); }

.refine-ticks {
    display: flex; justify-content: space-between;
    font-size: 10px; color: var(--text-dim, #666680); font-family: monospace;
    padding: 0 2px; margin-bottom: 12px;
}
.refine-range-info {
    display: flex; align-items: center; gap: 8px;
    padding: 6px 12px; margin-bottom: 10px;
    background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 6px;
    font-family: monospace; font-size: 12px;
}
.rri-label { color: var(--text-dim, #666680); font-size: 11px; }
.rri-val { color: var(--text); }
.rri-sep { color: var(--text-dim, #666680); font-size: 10px; }
.rri-size { color: var(--accent); font-weight: 600; }

.refine-transport { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.refine-frame-btns { display: flex; gap: 4px; }
.refine-btn {
    background: var(--bg-secondary); color: var(--text); border: 1px solid var(--border);
    border-radius: 4px; padding: 6px 12px; font-size: 13px; cursor: pointer;
    font-family: monospace; transition: background 0.1s;
}
.refine-btn:hover { background: var(--border); }
.refine-btn:active, .refine-btn.pressed { background: var(--accent); color: var(--bg); }
.refine-btn.jump { font-size: 11px; color: var(--text-dim, #666680); }
.refine-btn.jump:active, .refine-btn.jump.pressed { background: var(--accent); color: var(--bg); }

.refine-time-display {
    font-family: monospace; font-size: 20px; color: var(--accent);
    text-align: center; flex: 1; letter-spacing: 0.5px;
}
.refine-frame-num { font-size: 11px; color: var(--text-dim, #666680); margin-top: 2px; }

.refine-lock-btn {
    background: var(--accent); color: var(--bg); border: none;
    border-radius: 6px; padding: 8px 24px; font-size: 14px;
    font-weight: 600; cursor: pointer; transition: opacity 0.15s;
}
.refine-lock-btn:hover { opacity: 0.85; }
.refine-lock-btn.pressed { opacity: 0.7; transform: scale(0.97); }
.refine-close-btn.pressed { background: var(--border); color: var(--text); }

.refine-footer {
    display: flex; align-items: center; justify-content: center;
    padding: 10px 20px;
    border-top: 1px solid var(--border);
    background: var(--bg-secondary);
}
.refine-hints { font-size: 12px; color: var(--text-muted); }
.refine-hints kbd {
    display: inline-block; background: var(--bg); color: var(--text);
    padding: 1px 6px; border-radius: 3px; font-family: monospace;
    font-size: 11px; border: 1px solid var(--border);
}

/* Admin tab bar */
.admin-tabs {
    display: flex; gap: 0;
    background: var(--bg-secondary, #111);
    border-bottom: 2px solid var(--border, #333);
    padding: 0 16px;
}
.admin-tab {
    padding: 10px 20px; font-size: 13px;
    color: var(--text-muted, #888);
    background: none; border: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -2px; cursor: pointer;
    transition: color 0.2s;
}
.admin-tab:hover { color: var(--text-primary, #fff); }
.admin-tab.active {
    color: var(--text-primary, #fff);
    border-bottom-color: var(--accent, #4af);
}
.admin-tab-content { padding: 16px; }

/* ---- Settings Tab ---- */

.settings-layout {
    display: flex;
    height: 100%;
    min-height: 0;
}

.settings-sidebar {
    width: 180px;
    flex-shrink: 0;
    background: var(--card-bg);
    border-right: 1px solid var(--border);
    padding: 10px 0;
    overflow-y: auto;
}

.settings-level-label {
    font-size: 0.65rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-muted);
    padding: 4px 14px;
}

.settings-nav {
    display: block;
    width: 100%;
    text-align: left;
    background: none;
    border: none;
    border-left: 3px solid transparent;
    padding: 7px 14px;
    font-size: 0.82rem;
    color: var(--text-muted);
    cursor: pointer;
    transition: color 0.15s, background 0.15s;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.settings-nav:hover { color: var(--text); background: rgba(47,129,247,0.06); }
.settings-nav.active {
    color: var(--accent);
    border-left-color: var(--accent);
    background: rgba(47,129,247,0.08);
}

.settings-main {
    flex: 1;
    min-width: 0;
    overflow-y: auto;
    padding: 0;
    display: flex;
    flex-direction: column;
}

.settings-form {
    padding: 20px 24px;
    max-width: 680px;
}

.settings-group-title {
    font-size: 1rem;
    font-weight: 600;
    margin-bottom: 16px;
    padding-bottom: 8px;
    border-bottom: 1px solid var(--border);
}

.settings-fields {
    display: flex;
    flex-direction: column;
    gap: 14px;
    margin-bottom: 20px;
}

.settings-field {
    display: grid;
    grid-template-columns: 220px 1fr;
    align-items: start;
    gap: 8px 16px;
}

.settings-label {
    font-size: 0.85rem;
    color: var(--text);
    padding-top: 7px;
    font-weight: 500;
}

.settings-desc {
    grid-column: 2;
    font-size: 0.75rem;
    color: var(--text-muted);
    margin-top: -4px;
}

.settings-input {
    background: var(--bg);
    border: 1px solid var(--border);
    border-radius: 4px;
    color: var(--text);
    font-size: 0.85rem;
    padding: 6px 10px;
    width: 100%;
    outline: none;
    transition: border-color 0.15s;
}
.settings-input:focus { border-color: var(--accent); }
.settings-input option { background: var(--card-bg); }

/* Toggle switch */
.settings-toggle {
    display: inline-flex;
    align-items: center;
    cursor: pointer;
    padding-top: 4px;
}
.settings-toggle input[type="checkbox"] {
    display: none;
}
.settings-toggle-slider {
    width: 36px;
    height: 20px;
    background: var(--border);
    border-radius: 10px;
    position: relative;
    transition: background 0.2s;
    flex-shrink: 0;
}
.settings-toggle-slider::after {
    content: '';
    position: absolute;
    top: 3px;
    left: 3px;
    width: 14px;
    height: 14px;
    background: var(--text-muted);
    border-radius: 50%;
    transition: transform 0.2s, background 0.2s;
}
.settings-toggle input:checked + .settings-toggle-slider {
    background: var(--accent);
}
.settings-toggle input:checked + .settings-toggle-slider::after {
    background: #fff;
    transform: translateX(16px);
}

/* TOML editor */
.toml-editor {
    width: 100%;
    min-height: 400px;
    background: var(--bg);
    border: 1px solid var(--border);
    border-radius: 4px;
    color: var(--text);
    font-family: 'SF Mono', Consolas, 'Liberation Mono', monospace;
    font-size: 0.82rem;
    line-height: 1.5;
    padding: 12px;
    resize: vertical;
    outline: none;
    transition: border-color 0.15s;
    display: block;
    margin-bottom: 14px;
}
.toml-editor:focus { border-color: var(--accent); }

/* Save bar */
.settings-save-bar {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    padding-top: 4px;
}

/* Banner */
.settings-banner {
    padding: 10px 24px;
    font-size: 0.85rem;
    font-weight: 500;
    border-bottom: 1px solid transparent;
}
.settings-banner.hidden { display: none; }
.settings-banner-success {
    background: rgba(63,185,80,0.12);
    color: var(--success);
    border-bottom-color: rgba(63,185,80,0.2);
}
.settings-banner-error {
    background: rgba(248,81,73,0.12);
    color: var(--danger);
    border-bottom-color: rgba(248,81,73,0.2);
}

/* Buttons */
.btn-primary {
    background: var(--accent);
    color: #fff;
    border: none;
    border-radius: 4px;
    padding: 7px 18px;
    font-size: 0.85rem;
    font-weight: 600;
    cursor: pointer;
    transition: filter 0.15s;
}
.btn-primary:hover { filter: brightness(1.1); }
.btn-primary:active { filter: brightness(0.9); }

.btn-secondary {
    background: var(--bg);
    color: var(--text-muted);
    border: 1px solid var(--border);
    border-radius: 4px;
    padding: 6px 18px;
    font-size: 0.85rem;
    cursor: pointer;
    transition: color 0.15s, border-color 0.15s;
}
.btn-secondary:hover { color: var(--text); border-color: var(--text-muted); }

/* State messages */
.settings-loading, .settings-empty, .settings-error {
    padding: 24px;
    font-size: 0.85rem;
    color: var(--text-muted);
}
.settings-error { color: var(--danger); }

/* --- Storage tab (formerly "Pools") — Root + Storage pools --- */
.pool-section-title {
    font-size: 0.62rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-muted);
    padding: 14px 14px 6px;
    border-top: 1px solid var(--border);
    margin-top: 4px;
}
.pool-section-title:first-of-type { border-top: none; margin-top: 0; padding-top: 10px; }
.pool-grid { display: flex; gap: 16px; flex-wrap: wrap; padding: 4px 14px 14px; }
.pool-card {
    flex: 1; min-width: 300px; max-width: 500px;
    background: var(--bg-tertiary, #1a1a2e);
    border: 1px solid var(--border, #333);
    border-radius: 6px; overflow: hidden;
}
.pool-header {
    padding: 10px 14px; background: var(--bg-secondary, #222);
    display: flex; justify-content: space-between; align-items: center;
}
.pool-name { font-size: 14px; color: var(--text-primary, #fff); font-weight: 600; }
.pool-path { font-size: 11px; color: var(--text-muted, #888); margin-left: 8px; }
.pool-health { font-size: 11px; padding: 2px 8px; border-radius: 3px; font-weight: 600; }
.health-healthy  { background: var(--pill-bg-active); color: var(--pill-fg-active); border: 1px solid var(--pill-br-active); }
.health-warning  { background: var(--pill-bg-warn);   color: var(--pill-fg-warn);   border: 1px solid var(--pill-br-warn); }
.health-critical { background: var(--pill-bg-crit);   color: var(--pill-fg-crit);   border: 1px solid var(--pill-br-crit); }
.pool-health-critical { background: var(--pill-bg-crit); color: var(--pill-fg-crit); border: 1px solid var(--pill-br-crit); margin-left: 6px; }
.pool-card-unwritable { border-color: var(--danger, #f66); }
.pool-unwritable { padding: 8px 14px; background: rgba(255, 80, 80, 0.08); color: var(--danger, #f66); font-size: 12px; border-top: 1px solid var(--border, #333); border-bottom: 1px solid var(--border, #333); }
.pool-body { padding: 12px 14px; }
.pool-disk-bar { background: var(--bg-secondary, #111); border-radius: 4px; height: 20px; overflow: hidden; margin-bottom: 4px; }
.pool-disk-fill { height: 100%; display: flex; align-items: center; padding-left: 8px; border-radius: 4px; }
.pool-disk-pct { font-size: 11px; color: #000; font-weight: 600; }
.pool-disk-labels { display: flex; justify-content: space-between; font-size: 11px; color: var(--text-muted, #888); margin-bottom: 12px; }
.pool-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: 8px; margin-bottom: 12px; }
.pool-stat { background: var(--bg-secondary, #111); padding: 8px 10px; border-radius: 4px; }
.pool-stat-label { font-size: 10px; color: var(--text-muted, #888); text-transform: uppercase; }
.pool-stat-value { font-size: 16px; color: var(--text-primary, #fff); font-weight: 600; }
.pool-stat-sub { font-size: 11px; color: var(--text-muted, #888); font-weight: 400; margin-left: 4px; }
.pool-actions { display: flex; gap: 8px; padding-top: 12px; border-top: 1px solid var(--border, #222); flex-wrap: wrap; }

/* ----- Pool tier controls (hot/cold) ----------------------------------
 * Rendered only when [hot_pool].enabled = true. Treats the section as an
 * instrument-rack subpanel: top divider, small-caps header with role tag
 * on the right, then a row of status pills + a numeric cap stepper. The
 * pills are tri-state visually (off / warn-on / danger-on); off uses an
 * outline against the recessed inset, on fills with the semantic accent.
 * ---------------------------------------------------------------------- */
.pool-tier-section { margin-top: 12px; padding-top: 10px; border-top: 1px dashed var(--border, #30363d); }
.pool-tier-section-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.pool-tier-section-title { font-size: 10px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--text-muted, #8b949e); }
.tier-role { font-size: 9px; font-weight: 700; letter-spacing: 0.12em; padding: 2px 6px; border-radius: 2px; font-family: ui-monospace, "SF Mono", "Roboto Mono", monospace; }
.tier-role-hot { color: #ffb454; background: rgba(210, 153, 34, 0.12); border: 1px solid rgba(210, 153, 34, 0.45); }
.tier-role-cold { color: #58a6ff; background: rgba(47, 129, 247, 0.10); border: 1px solid rgba(47, 129, 247, 0.35); }
.pool-tier-section-body { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }

.tier-pill { display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px 5px 8px; background: var(--bg-tertiary, #0d1117); border: 1px solid var(--border, #30363d); border-radius: 4px; color: var(--text-muted, #8b949e); font-size: 11px; font-weight: 500; cursor: pointer; transition: background 120ms ease, border-color 120ms ease, color 120ms ease; user-select: none; }
.tier-pill:hover { border-color: var(--text-muted, #8b949e); color: var(--text-primary, #c9d1d9); }
.tier-pill:focus-visible { outline: 2px solid var(--accent, #2f81f7); outline-offset: 1px; }
.tier-pill-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--border, #30363d); box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.4); flex: 0 0 auto; transition: background 120ms ease, box-shadow 120ms ease; }
.tier-pill-label { line-height: 1; }
.tier-pill-on { color: var(--text-primary, #c9d1d9); }
.tier-pill-on.tier-pill-warn { background: rgba(210, 153, 34, 0.10); border-color: rgba(210, 153, 34, 0.55); }
.tier-pill-on.tier-pill-warn .tier-pill-dot { background: var(--warning, #d29922); box-shadow: 0 0 6px rgba(210, 153, 34, 0.6); }
.tier-pill-on.tier-pill-danger { background: rgba(248, 81, 73, 0.10); border-color: rgba(248, 81, 73, 0.55); }
.tier-pill-on.tier-pill-danger .tier-pill-dot { background: var(--danger, #f85149); box-shadow: 0 0 6px rgba(248, 81, 73, 0.6); }

.tier-cap { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px 4px 8px; background: var(--bg-tertiary, #0d1117); border: 1px solid var(--border, #30363d); border-radius: 4px; font-size: 11px; color: var(--text-muted, #8b949e); margin-left: auto; }
.tier-cap-label { text-transform: uppercase; letter-spacing: 0.06em; font-size: 10px; font-weight: 600; }
.tier-cap-input { width: 3.6em; padding: 2px 4px; background: transparent; border: 1px solid var(--border, #30363d); border-radius: 3px; color: var(--text-primary, #c9d1d9); font-family: ui-monospace, "SF Mono", "Roboto Mono", monospace; font-size: 12px; font-weight: 600; text-align: right; -moz-appearance: textfield; }
.tier-cap-input::-webkit-outer-spin-button, .tier-cap-input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.tier-cap-input:hover { border-color: var(--text-muted, #8b949e); }
.tier-cap-input:focus { outline: none; border-color: var(--accent, #2f81f7); box-shadow: 0 0 0 1px var(--accent, #2f81f7); }
.tier-cap-unit { font-family: ui-monospace, "SF Mono", "Roboto Mono", monospace; font-size: 10px; color: var(--text-muted, #8b949e); }
/* ----- end pool tier controls ----------------------------------------- */

.btn-danger { padding: 6px 12px; background: var(--pill-bg-crit); border: 1px solid var(--pill-br-crit); border-radius: 4px; font-size: 11px; color: var(--pill-fg-crit); cursor: pointer; font-weight: 600; }
.btn-danger:hover { background: var(--danger); color: #fff; border-color: var(--danger); }

/* Per-channel retention modal */
.modal-backdrop {
    position: fixed; inset: 0; background: rgba(0,0,0,0.7);
    display: flex; align-items: center; justify-content: center;
    z-index: 9999;
}
.modal-card {
    background: var(--bg-tertiary, #1a1a2e);
    border: 1px solid var(--border, #333);
    border-radius: 6px; width: 720px; max-width: 92vw;
    max-height: 84vh; display: flex; flex-direction: column;
}
.modal-header {
    display: flex; justify-content: space-between; align-items: center;
    padding: 12px 16px; background: var(--bg-secondary, #222);
    border-bottom: 1px solid var(--border, #333);
}
.modal-header h3 { margin: 0; font-size: 14px; color: var(--text-primary, #fff); }
.modal-close { background: none; border: none; font-size: 24px; color: var(--text-muted, #888); cursor: pointer; line-height: 1; padding: 0 4px; }
.modal-close:hover { color: var(--text-primary, #fff); }
.modal-body { padding: 12px 16px; overflow-y: auto; }
.modal-hint { font-size: 12px; color: var(--text-muted, #888); margin: 0 0 12px; }
.modal-hint strong { color: var(--text-primary, #fff); }
.modal-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.modal-table th { text-align: left; padding: 6px 10px; background: var(--bg-secondary, #111); font-size: 10px; color: var(--text-muted, #888); text-transform: uppercase; border-bottom: 1px solid var(--border, #222); }
.modal-table td { padding: 6px 10px; border-bottom: 1px solid var(--bg-secondary, #1a1a1a); color: var(--text-secondary, #aaa); }
.modal-table td:first-child { color: var(--text-primary, #fff); }
.ch-days-input { background: var(--bg-secondary, #111); border: 1px solid var(--border, #333); color: var(--text-primary, #fff); padding: 3px 6px; border-radius: 3px; font-size: 12px; }
.btn-xs { padding: 3px 8px; font-size: 11px; border: none; border-radius: 3px; cursor: pointer; margin-right: 4px; }
.tag { display: inline-block; padding: 1px 6px; border-radius: 3px; font-size: 10px; }
.tag-override { background: #3a2a4a; color: #caf; }
.tag-inherit { background: #2a3a4a; color: #8bf; }

/* ---- Files Tab (Pool Files + Exports) ---- */
.files-subtabs { display: flex; gap: 0; border-bottom: 1px solid var(--border, #222); margin-bottom: 12px; }
.files-subtab { padding: 8px 14px; font-size: 12px; background: none; border: none; color: var(--text-muted, #666); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.files-subtab.active { color: var(--text-primary, #fff); border-bottom-color: var(--accent, #4af); }
.files-filter-bar { display: flex; align-items: center; gap: 8px; padding: 8px 0; margin-bottom: 12px; }
.files-filter-label { font-size: 12px; color: var(--text-muted, #888); }
.filter-btn { background: var(--bg-tertiary, #1a1a2e); border: 1px solid var(--border, #333); padding: 4px 12px; border-radius: 3px; font-size: 12px; color: var(--text-muted, #888); cursor: pointer; }
.filter-btn.active { border-color: var(--accent, #4af); color: var(--accent, #4af); }
.files-summary { font-size: 12px; color: var(--text-muted, #888); margin-left: auto; }
.files-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.files-table th { text-align: left; padding: 8px 12px; background: var(--bg-secondary, #111); font-size: 10px; color: var(--text-muted, #888); text-transform: uppercase; border-bottom: 1px solid var(--border, #222); }
.files-table th.sortable { cursor: pointer; }
.files-table th.sortable:hover { color: var(--text-primary, #fff); }
.files-table td { padding: 10px 12px; border-bottom: 1px solid var(--bg-secondary, #1a1a1a); color: var(--text-secondary, #aaa); }
.files-table td:first-child { color: var(--text-primary, #fff); }
.files-table tbody tr:hover { background: var(--bg-tertiary, #1a1a2e); }
.btn-link { padding: 3px 8px; background: var(--accent-dim); border: 1px solid var(--accent-dim); border-radius: 3px; font-size: 10px; color: var(--accent); cursor: pointer; text-decoration: none; display: inline-block; }
.btn-link:hover { background: var(--accent); color: #fff; border-color: var(--accent); }
.btn-danger-sm { padding: 3px 8px; background: var(--pill-bg-crit); border: 1px solid var(--pill-br-crit); border-radius: 3px; font-size: 10px; color: var(--pill-fg-crit); cursor: pointer; }
.btn-danger-sm:hover { background: var(--danger); color: #fff; border-color: var(--danger); }
.btn-warn-sm { padding: 3px 8px; background: var(--pill-bg-warn); border: 1px solid var(--pill-br-warn); border-radius: 3px; font-size: 10px; color: var(--pill-fg-warn); cursor: pointer; }
.btn-warn-sm:hover { background: var(--warning); color: #fff; border-color: var(--warning); }
/* Two-stage stop in the admin Exports table — armed state matches the
   .vexp-stop pattern in the viewer pill (amber fill, white text). */
.btn-warn-sm.armed,
.btn-warn-sm.armed:hover { background: var(--warning); color: #fff; border-color: var(--warning); opacity: 1; }

/* Database tab */
.db-sidebar { width: 180px; background: var(--bg-secondary, #111); border-right: 1px solid var(--border, #222); padding: 12px 0; flex-shrink: 0; }
.db-main { flex: 1; padding: 16px; overflow-x: auto; }
.db-heading { font-size: 14px; color: var(--text-primary, #fff); font-weight: 600; margin-bottom: 8px; }
.db-chips { display: flex; gap: 8px; flex-wrap: wrap; }
.db-chip { background: var(--bg-tertiary, #1a1a2e); border: 1px solid var(--border, #333); padding: 4px 10px; border-radius: 3px; font-size: 11px; color: var(--text-secondary, #aaa); cursor: pointer; }
.db-chip.active { border-color: var(--accent, #4af); color: var(--accent, #4af); }
.db-chip-count { color: var(--text-muted, #888); }
.db-schema { background: var(--bg-secondary, #111); border: 1px solid var(--border, #333); border-radius: 4px; padding: 12px; color: var(--text-secondary, #aaa); font-family: monospace; font-size: 12px; overflow-x: auto; white-space: pre-wrap; }

/* ── Bitrate bottom strip (fixed to viewport bottom) ─────────── */
.bitrate-strip {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    height: 25vh;
    min-height: 140px;
    background: var(--card-bg);
    border-top: 1px solid var(--border);
    z-index: 10;
    padding: 8px 16px;
}
/* strip-label is now inside .strip-header */
.strip-header {
    display: flex;
    align-items: center;
    gap: 10px;
    position: absolute;
    top: 6px;
    left: 16px;
    right: 16px;
    z-index: 2;
}
.strip-label { font-size: 0.65rem; color: var(--text-muted); }
.strip-legend { display: flex; gap: 10px; font-size: 0.55rem; color: var(--text-muted); }
.legend-item { display: inline-flex; align-items: center; gap: 3px; }
.legend-line { display: inline-block; width: 14px; height: 2px; border-radius: 1px; }
.legend-agg { background: var(--text-muted); }
.legend-ch { background: var(--success); }
.strip-reset {
    margin-left: auto;
    font-size: 0.55rem;
    padding: 2px 8px;
    border: 1px solid var(--border);
    border-radius: 3px;
    background: var(--bg);
    color: var(--text-muted);
    cursor: pointer;
}
.strip-reset:hover { color: var(--text); border-color: var(--text-muted); }
/* uPlot drag-to-zoom selection — visible in both themes */
.bitrate-strip .u-select,
.pop-chart-wrap .u-select {
    background: var(--accent) !important;
    opacity: 0.2 !important;
}
.strip-chart {
    width: 100%;
    height: calc(100% - 16px);
    margin-top: 12px;
}

/* Admin content scrolls above the fixed strip */
#adminPanelContent.strip-active {
    max-height: calc(100vh - 42px - 38px - max(25vh, 140px));
    overflow-y: auto;
}
#adminListContent.strip-active {
    max-height: calc(100vh - 42px - 38px - max(25vh, 140px));
    overflow-y: auto;
}

/* ── Popover redesign ──────────────────────────────────────────── */
.ch-popover-overlay {
    position: fixed;
    top: 0; left: 0; right: 0; bottom: 0;
    background: rgba(0, 0, 0, 0.5);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 200;
}
.ch-popover-overlay.hidden { display: none; }

.ch-popover-new {
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 8px;
    width: 500px;
    max-height: 90vh;
    overflow-y: auto;
    box-shadow: 0 8px 32px rgba(0,0,0,0.4);
}

.pop-header-new {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 10px 14px;
    border-bottom: 1px solid var(--border);
}
.pop-title-new { font-weight: 700; font-size: 0.9rem; color: var(--text); }
.pop-badges { display: flex; gap: 3px; }
.pop-close-new {
    margin-left: auto;
    background: none;
    border: none;
    color: var(--text-muted);
    cursor: pointer;
    font-size: 0.9rem;
    padding: 4px;
}

.pop-metrics {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: 5px;
    padding: 10px 14px;
}
.pop-metric {
    background: var(--bg);
    border-radius: 4px;
    padding: 6px 4px;
    text-align: center;
}
.pop-metric-val { font-size: 0.8rem; font-weight: 700; line-height: 1.2; }
.pop-metric-label { font-size: 0.42rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.3px; margin-top: 1px; }

.pop-tabs {
    display: flex;
    border-bottom: 1px solid var(--border);
    padding: 0 14px;
}
.pop-tab {
    padding: 6px 10px;
    font-size: 0.6rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    background: none;
    border: none;
    border-bottom: 2px solid transparent;
    cursor: pointer;
}
.pop-tab.active { color: var(--accent); border-bottom-color: var(--accent); }
.pop-tab-dot {
    display: inline-block;
    width: 5px; height: 5px;
    border-radius: 50%;
    background: var(--success);
    margin-right: 4px;
    vertical-align: middle;
}

/* Fixed-height tab body so switching tabs doesn't change popover dimensions.
   Overflow scrolls internally — the popover itself stays put. */
.pop-tab-body {
    padding: 8px 14px;
    height: 220px;
    overflow-y: auto;
    font-size: 0.68rem;
}
.pop-section-title {
    font-size: 0.55rem;
    font-weight: 700;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--text-muted);
    margin: 4px 0 6px;
}
.pop-row-hint { color: var(--text-muted); font-size: 0.65rem; margin-bottom: 8px; }
.pop-test-bar { display: flex; gap: 6px; align-items: center; margin-bottom: 8px; }
.pop-test-status { color: var(--text-muted); font-size: 0.65rem; margin: 4px 0 6px; font-variant-numeric: tabular-nums; }
.pop-test-results { display: flex; flex-direction: column; gap: 2px; }
.pop-test-error {
    color: var(--pill-fg-crit);
    background: var(--pill-bg-crit);
    border: 1px solid var(--pill-br-crit);
    border-radius: 4px;
    padding: 6px 8px;
    font-size: 0.68rem;
}

/* Tasks tab (in channel details popup) — one row per running per-channel task. */
.pop-tasks-list { display: flex; flex-direction: column; gap: 4px; }
.pop-task-row {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 5px 0;
    border-bottom: 1px solid var(--border);
    font-size: 0.72rem;
}
.pop-task-row:last-child { border-bottom: none; }
.pop-task-row.degraded { opacity: 0.6; }
.pop-task-label { color: var(--text); font-weight: 500; flex-shrink: 0; }
.pop-task-meta { color: var(--text-muted); font-size: 0.65rem; margin-left: auto; font-variant-numeric: tabular-nums; }

/* Reports tab (in details popup) — single-row layout so summaries don't wrap. */
.pop-rep-filters { display: flex; gap: 4px; margin-bottom: 8px; flex-wrap: wrap; }
.pop-rep-kind {
    padding: 3px 10px;
    font-size: 0.6rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--text-muted);
    background: var(--bg);
    border: 1px solid var(--border);
    border-radius: 3px;
    cursor: pointer;
}
.pop-rep-kind:hover { color: var(--text); }
.pop-rep-kind.active { color: var(--accent); border-color: var(--accent); background: color-mix(in srgb, var(--accent) 10%, transparent); }

.pop-rep-table { display: flex; flex-direction: column; gap: 2px; }
.pop-rep-row {
    display: grid;
    grid-template-columns: 128px 1fr;
    gap: 8px;
    align-items: baseline;
    padding: 3px 0;
    border-bottom: 1px solid var(--border);
    font-size: 0.66rem;
}
.pop-rep-row:last-child { border-bottom: none; }
.pop-rep-ts {
    font-family: monospace;
    color: var(--text-muted);
    font-size: 0.62rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.pop-rep-summary {
    color: var(--text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Inline multicast+port+probe row in the edit-channel Stream tab */
.chedit-mcast-line { display: flex; gap: 6px; align-items: center; }
.chedit-mcast-line .chedit-mcast-addr { flex: 1; min-width: 0; }
.chedit-mcast-line .chedit-mcast-port { width: 84px; flex-shrink: 0; }
.chedit-mcast-line .pop-action-btn { flex-shrink: 0; white-space: nowrap; }
.chedit-mcast-status {
    margin-top: 6px;
    font-size: 0.65rem;
    padding: 4px 8px;
    border-radius: 3px;
    border: 1px solid var(--border);
}
.chedit-mcast-status.chedit-status-ok   { color: var(--pill-fg-active); background: var(--pill-bg-active); border-color: var(--pill-br-active); }
.chedit-mcast-status.chedit-status-warn { color: var(--pill-fg-warn);   background: var(--pill-bg-warn);   border-color: var(--pill-br-warn); }
.chedit-mcast-status.chedit-status-err  { color: var(--pill-fg-crit);   background: var(--pill-bg-crit);   border-color: var(--pill-br-crit); }
.pop-row {
    display: flex;
    justify-content: space-between;
    padding: 3px 0;
    border-bottom: 1px solid rgba(128,128,128,0.06);
}
.pop-row-label { color: var(--text-muted); }
.pop-row-value { color: var(--text); font-variant-numeric: tabular-nums; }

.pop-actions-bar {
    display: flex;
    gap: 4px;
    padding: 8px 14px;
    border-top: 1px solid rgba(128,128,128,0.06);
}
.pop-action-btn {
    font-size: 0.58rem;
    padding: 4px 10px;
    border-radius: 4px;
    border: 1px solid var(--border);
    background: none;
    color: var(--text-muted);
    cursor: pointer;
}
.pop-action-btn.primary { border-color: rgba(41,128,185,0.3); color: var(--accent); }
.pop-action-btn.danger { border-color: rgba(248,81,73,0.3); color: var(--danger); }

/* --- Channel Edit Modal (PR7b) --------------------------------------- */
.chedit-readonly { background: var(--bg) !important; color: var(--text-muted) !important; cursor: not-allowed; }
.chedit-overlay { z-index: 250; }
.chedit-modal {
    width: 720px;
    max-width: 94vw;
    max-height: 92vh;
    overflow-y: auto;  /* modal itself scrolls if the user shrinks the viewport */
}
/* Edit-modal tab body: grow to fit content. The fixed 220px height that
   stabilises the channel details popover does NOT apply here — the edit
   form needs room for all of its fields without double-scrollbars. */
.pop-tab-body.chedit-body {
    height: auto;
    min-height: 280px;
    overflow: visible;
}
.chedit-tabs .chedit-tab.disabled {
    opacity: 0.45;
    cursor: not-allowed;
    font-style: italic;
}
.chedit-body {
    padding: 10px 14px 4px;
    min-height: 220px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.chedit-field {
    display: flex;
    flex-direction: column;
    gap: 3px;
}
.chedit-label {
    font-size: 0.58rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.4px;
}
.chedit-hint {
    font-size: 0.58rem;
    color: var(--text-muted);
    opacity: 0.8;
}
.chedit-input {
    background: var(--bg);
    color: var(--text);
    border: 1px solid var(--border);
    border-radius: 4px;
    padding: 5px 8px;
    font-size: 0.72rem;
    width: 100%;
    box-sizing: border-box;
}
.chedit-input:focus {
    outline: none;
    border-color: var(--accent);
}
.chedit-textarea { font-family: inherit; resize: vertical; }
.chedit-row { display: flex; gap: 14px; flex-wrap: wrap; }
.chedit-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 0.68rem;
    color: var(--text);
    cursor: pointer;
}
.chedit-check { margin: 0; }
.chedit-error {
    margin: 8px 14px 0;
    padding: 6px 10px;
    border-radius: 4px;
    background: rgba(248,81,73,0.12);
    border: 1px solid rgba(248,81,73,0.35);
    color: var(--danger);
    font-size: 0.65rem;
}
.chedit-stub {
    color: var(--text-muted);
    font-size: 0.68rem;
    font-style: italic;
    padding: 20px 4px;
    text-align: center;
}
.chedit-footer {
    align-items: center;
    justify-content: flex-end;
}
.chedit-dirty-hint {
    margin-right: auto;
    font-size: 0.58rem;
    color: var(--warning);
    text-transform: uppercase;
    letter-spacing: 0.5px;
}
.pop-action-btn.chedit-disabled,
.pop-action-btn[disabled] {
    opacity: 0.45;
    cursor: not-allowed;
}

/* PR7d — Disable/Enable 2-stage + Purge button in Edit-mode footer */
.chedit-footer-left {
    margin-right: auto;
    display: inline-flex;
    gap: 8px;
    align-items: center;
}
.pop-action-btn.chedit-disable-btn {
    border-color: rgba(248,81,73,0.5);
    color: var(--danger);
}
.pop-action-btn.chedit-disable-btn.armed {
    background: var(--danger);
    border-color: var(--danger);
    color: #fff;
    font-weight: 600;
}
.pop-action-btn.chedit-enable-btn {
    border-color: rgba(46,160,67,0.5);
    color: var(--success, #2ea043);
}
.pop-action-btn.chedit-purge-btn {
    font-weight: 600;
}
.chedit-purge-hint {
    font-size: 0.58rem;
    color: var(--text-muted);
    font-style: italic;
}

/* PR7d — Purge modal (typed-slug confirm + progress) */
.chpurge-overlay { z-index: 260; }
.chpurge-modal { width: 600px; max-width: 96vw; }
.chpurge-header { border-bottom: 1px solid rgba(248,81,73,0.35); }
.chpurge-body { gap: 12px; }
.chpurge-warn {
    padding: 8px 10px;
    border-radius: 4px;
    background: rgba(248,81,73,0.10);
    border: 1px solid rgba(248,81,73,0.40);
    color: var(--danger);
    font-size: 0.68rem;
    line-height: 1.4;
}
.chpurge-cascade-head,
.chpurge-pending-head {
    font-size: 0.60rem;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: var(--text-muted);
    margin-bottom: 4px;
}
.chpurge-cascade-grid {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 3px 12px;
    font-size: 0.68rem;
}
.chpurge-cascade-label { color: var(--text-muted); }
.chpurge-cascade-value { color: var(--text); font-variant-numeric: tabular-nums; }

.chpurge-pending-note {
    font-size: 0.62rem;
    color: var(--warning);
    margin-bottom: 6px;
}
.chpurge-pending-row {
    display: grid;
    grid-template-columns: auto 1fr auto;
    gap: 8px;
    align-items: center;
    padding: 6px 8px;
    border: 1px solid var(--border);
    border-radius: 4px;
    margin-bottom: 4px;
    font-size: 0.66rem;
}
.chpurge-pending-id { font-weight: 600; }
.chpurge-pending-range { color: var(--text-muted); font-size: 0.60rem; }
.chpurge-blocker {
    background: rgba(248,81,73,0.08);
    border: 1px solid rgba(248,81,73,0.3);
    color: var(--danger);
    padding: 6px 10px;
    border-radius: 4px;
    font-weight: 600;
    margin-bottom: 6px;
}

.chpurge-confirm { display: flex; flex-direction: column; gap: 4px; }
.chpurge-confirm-input { font-family: monospace; }
.chpurge-confirm-indicator {
    font-size: 0.60rem;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    min-height: 12px;
}
.chpurge-confirm-indicator.match { color: var(--success, #2ea043); }
.chpurge-confirm-indicator.nomatch { color: var(--text-muted); }

.chpurge-progress-card {
    padding: 12px;
    border-radius: 6px;
    border: 1px solid var(--border);
    background: var(--bg);
}
.chpurge-progress-card.done  { border-color: var(--success, #2ea043); }
.chpurge-progress-card.error { border-color: var(--danger); }
.chpurge-progress-head { font-weight: 600; font-size: 0.78rem; margin-bottom: 6px; }
.chpurge-progress-stage { font-size: 0.66rem; color: var(--text-muted); margin-bottom: 8px; }
.chpurge-progress-bar {
    height: 6px;
    background: rgba(255,255,255,0.08);
    border-radius: 3px;
    overflow: hidden;
}
.chpurge-progress-bar-inner {
    height: 100%;
    background: var(--danger);
    transition: width 0.3s ease;
}
.chpurge-progress-card.done .chpurge-progress-bar-inner { background: var(--success, #2ea043); }
.chpurge-progress-counts {
    margin-top: 8px;
    font-size: 0.66rem;
    color: var(--text-muted);
    display: grid;
    gap: 2px;
}

/* PR7c — Diagnostics tab */
.chedit-diag-target {
    font-size: 0.85rem;
    color: var(--text-muted);
    margin: 8px 0;
}
.chedit-diag-card {
    margin-top: 12px;
    padding: 10px 12px;
    border-radius: 6px;
    border: 1px solid var(--border);
    background: var(--bg);
}
.chedit-diag-ok        { border-color: var(--success); }
.chedit-diag-error     { border-color: var(--danger);  background: rgba(200, 60, 60, 0.08); }
.chedit-diag-saturated { border-color: var(--warning); background: rgba(200, 160, 40, 0.08); }
.chedit-diag-heading {
    font-weight: 600;
    margin-bottom: 6px;
}
.chedit-diag-msg { font-size: 0.9rem; }
.chedit-diag-dl {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 4px 12px;
    margin: 0;
    font-size: 0.85rem;
}
.chedit-diag-dl dt { color: var(--text-muted); }
.chedit-diag-dl dd { margin: 0; }
.chedit-diag-stderr {
    margin-top: 8px;
    padding: 8px;
    background: rgba(0,0,0,0.35);
    border-radius: 4px;
    max-height: 180px;
    overflow: auto;
    font-size: 0.75rem;
    font-family: ui-monospace, monospace;
    white-space: pre-wrap;
    word-break: break-word;
}

/* PR7c — Reports tab (PR4 reshape: per-kind sub-tab bar) */
.chedit-rep-filters {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
    padding: 4px 0 10px;
    border-bottom: 1px solid var(--border);
    margin-bottom: 8px;
}
.chedit-rep-kind {
    font-size: 0.72rem;
    padding: 4px 10px;
    border-radius: 4px;
    border: 1px solid var(--border);
    background: none;
    color: var(--text-muted);
    cursor: pointer;
}
.chedit-rep-kind:hover { color: var(--text); }
.chedit-rep-kind.active {
    color: var(--accent);
    border-color: rgba(41,128,185,0.4);
    background: rgba(41,128,185,0.08);
}
.chedit-rep-badge {
    display: inline-block;
    padding: 1px 7px;
    border-radius: 10px;
    font-size: 0.68rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    background: var(--border);
    color: var(--text);
}
.chedit-rep-event  { background: #3b5bdb; color: #fff; }
.chedit-rep-state  { background: #1c7ed6; color: #fff; }
.chedit-rep-alert  { background: #c92a2a; color: #fff; }
.chedit-rep-daily  { background: #5f3dc4; color: #fff; }
.chedit-rep-table {
    display: flex;
    flex-direction: column;
    max-height: 340px;
    overflow: auto;
    border: 1px solid var(--border);
    border-radius: 4px;
}
.chedit-rep-row {
    display: grid;
    grid-template-columns: 150px 70px 1fr;
    gap: 10px;
    padding: 6px 10px;
    border-bottom: 1px solid var(--border);
    font-size: 0.82rem;
}
.chedit-rep-row:last-child { border-bottom: none; }
.chedit-rep-ts { color: var(--text-muted); font-family: ui-monospace, monospace; }
.chedit-rep-summary { overflow: hidden; text-overflow: ellipsis; }

/* PR7c — Add Channel toolbar + flash banner */
.admin-list-toolbar {
    display: flex;
    justify-content: flex-end;
    gap: 8px;
    padding: 6px 12px;
    border-bottom: 1px solid var(--border);
}
.chedit-add-btn { font-weight: 600; }
.admin-flash {
    position: fixed;
    bottom: 24px;
    right: 24px;
    z-index: 400;
    padding: 10px 16px;
    border-radius: 6px;
    background: var(--success);
    color: #fff;
    font-weight: 600;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}

.pop-chart-wrap {
    height: 150px;
    margin: 8px 14px 14px;
    background: var(--bg);
    border-radius: 6px;
    overflow: hidden;
    position: relative;
}
.pop-chart-reset {
    position: absolute;
    top: 4px;
    right: 6px;
    z-index: 2;
    font-size: 0.55rem;
    padding: 2px 8px;
    border: 1px solid var(--border);
    border-radius: 3px;
    background: var(--card-bg);
    color: var(--text-muted);
    cursor: pointer;
}
.pop-chart-reset:hover { color: var(--text); border-color: var(--text-muted); }
.pop-chart-wrap .u-select {
    background: var(--accent) !important;
    opacity: 0.2 !important;
}

/* ---------------------------------------------------------------------------
 * Disabled channels card — same tile-footprint, dropped into the last grid
 * slot on dashboard (#channelGrid) and admin (.admin-grid).
 * ------------------------------------------------------------------------- */
.disabled-card {
    width: var(--thumb-size);
    /* Dashboard tile height ≈ (thumb-size * 9/16 image) + info bar. */
    height: calc(var(--thumb-size) * 9 / 16 + 30px);
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    overflow: hidden;
    display: flex;
    flex-direction: column;
    transition: border-color 0.15s;
}
.admin-grid .disabled-card {
    /* Match admin tile footprint (which now matches dashboard tile). */
    width: auto;
    height: calc(var(--thumb-size) * 9 / 16 + 30px);
}
.disabled-card:hover { border-color: var(--accent); }

.disabled-card .dc-head {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 6px 10px;
    font-size: 0.75rem;
    background: var(--bg);
    border-bottom: 1px solid var(--border);
    color: var(--text-muted);
    flex-shrink: 0;
}
.disabled-card .dc-head .dc-title {
    font-weight: 600;
    color: var(--text);
    letter-spacing: 0.02em;
}
.disabled-card .dc-head .dc-count {
    background: var(--border);
    color: var(--text);
    padding: 0 6px;
    border-radius: 8px;
    font-size: 0.65rem;
    font-variant-numeric: tabular-nums;
}
.disabled-card .dc-head .dc-spacer { flex: 1; }
.disabled-card .dc-head button {
    font-size: 0.65rem;
    padding: 2px 8px;
    border-radius: 3px;
    border: 1px solid var(--border);
    background: transparent;
    color: var(--text-muted);
    cursor: pointer;
}
.disabled-card .dc-head button:hover { color: var(--text); border-color: var(--accent); }

.disabled-card .dc-list {
    list-style: none;
    flex: 1 1 0;
    min-height: 0;
    overflow-y: auto;
    overflow-x: hidden;
    margin: 0;
    padding: 0;
    font-size: 0.7rem;
}
.disabled-card .dc-list li {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 3px 10px;
    border-bottom: 1px solid var(--bg);
    color: var(--text-muted);
}
.disabled-card .dc-list li:last-child { border-bottom: none; }
.disabled-card .dc-list li:hover { background: var(--bg); color: var(--text); }
.disabled-card .dc-list .dc-name {
    flex: 1;
    color: var(--text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.disabled-card .dc-list .dc-slug {
    font-family: ui-monospace, Menlo, monospace;
    font-size: 0.62rem;
    opacity: 0.65;
}
.disabled-card .dc-empty {
    padding: 10px;
    font-size: 0.7rem;
    color: var(--text-muted);
    text-align: center;
}
.disabled-card .dc-list::-webkit-scrollbar { width: 6px; }
.disabled-card .dc-list::-webkit-scrollbar-thumb {
    background: var(--border);
    border-radius: 3px;
}

/* ---------------------------------------------------------------------------
 * Disabled channels management modal
 * ------------------------------------------------------------------------- */
.dcm-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.65);
    z-index: 1000;
    display: flex;
    align-items: center;
    justify-content: center;
}
.dcm-overlay.hidden { display: none; }
.dcm-modal {
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    width: min(900px, 92vw);
    max-height: 85vh;
    display: flex;
    flex-direction: column;
    box-shadow: 0 12px 48px rgba(0, 0, 0, 0.5);
}
.dcm-head {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 14px;
    border-bottom: 1px solid var(--border);
    font-size: 0.85rem;
}
.dcm-head .dcm-title { font-weight: 600; }
.dcm-head .dcm-count {
    background: var(--bg);
    color: var(--text-muted);
    padding: 1px 8px;
    border-radius: 10px;
    font-size: 0.7rem;
}
.dcm-head .dcm-spacer { flex: 1; }
.dcm-close {
    border: none;
    background: transparent;
    color: var(--text-muted);
    font-size: 1.2rem;
    cursor: pointer;
    padding: 0 4px;
}
.dcm-close:hover { color: var(--text); }

.dcm-body {
    flex: 1;
    overflow-y: auto;
    padding: 4px 0;
}
.dcm-table {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.78rem;
}
.dcm-table thead th {
    position: sticky;
    top: 0;
    background: var(--bg);
    color: var(--text-muted);
    text-align: left;
    padding: 6px 10px;
    border-bottom: 1px solid var(--border);
    font-weight: 500;
    font-size: 0.7rem;
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.dcm-table tbody td {
    padding: 5px 10px;
    border-bottom: 1px solid var(--bg);
    vertical-align: middle;
}
.dcm-table tbody tr:hover { background: var(--bg); }
.dcm-table .dcm-name { font-weight: 500; color: var(--text); }
.dcm-table .dcm-slug,
.dcm-table .dcm-mcast {
    font-family: ui-monospace, Menlo, monospace;
    font-size: 0.72rem;
    color: var(--text-muted);
}
.dcm-table .dcm-actions {
    display: flex;
    gap: 4px;
    justify-content: flex-end;
}
.dcm-table button {
    font-size: 0.7rem;
    padding: 3px 9px;
    border-radius: 3px;
    border: 1px solid var(--border);
    background: var(--card-bg);
    color: var(--text);
    cursor: pointer;
}
.dcm-table button:hover { border-color: var(--accent); }
.dcm-table button.primary {
    background: var(--accent);
    border-color: var(--accent);
    color: #fff;
}
.dcm-table button.danger {
    background: transparent;
    border-color: var(--danger);
    color: var(--danger);
}
.dcm-table button.danger:hover { background: var(--danger); color: #fff; }
.dcm-table button[disabled] { opacity: 0.4; cursor: not-allowed; }

.dcm-foot {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 14px;
    border-top: 1px solid var(--border);
    font-size: 0.75rem;
    color: var(--text-muted);
}
.dcm-foot .dcm-spacer { flex: 1; }
.dcm-foot button {
    font-size: 0.75rem;
    padding: 5px 12px;
    border-radius: 3px;
    border: 1px solid var(--border);
    background: var(--card-bg);
    color: var(--text);
    cursor: pointer;
}
.dcm-foot button:hover { border-color: var(--accent); }
.dcm-foot button.primary {
    background: var(--accent);
    border-color: var(--accent);
    color: #fff;
}
.dcm-foot button.danger {
    border-color: var(--danger);
    color: var(--danger);
}
.dcm-foot button.danger:hover { background: var(--danger); color: #fff; }
.dcm-foot button[disabled] { opacity: 0.4; cursor: not-allowed; }
.dcm-flash {
    padding: 6px 14px;
    font-size: 0.72rem;
    background: var(--bg);
    border-top: 1px solid var(--border);
}
.dcm-flash.ok { color: var(--success); }

/* === Viewer role-gates =====================================================
 * Centralized hide rules driven by body[data-role="viewer"] (set in
 * header.js applyRoleGates from NvrAuth.getRole, AND by the inline
 * <body> script in index.html that runs before first paint). Viewers
 * see a stripped UI: only the dashboard, the channels they can stream,
 * and a single exports pill replacing the system + health pills.
 *
 * The exports pill itself is hidden for non-viewers (display:none below
 * is overridden by the viewer rule). Keeps DOM static; CSS does the gate.
 *
 * FOUC gate: body stays invisible until data-role lands. Without this,
 * a viewer hard-refresh shows full admin/EPG header + system pill for
 * one frame before the role attribute is applied. Inline <body> script
 * is synchronous so the attribute is set before the browser paints.
 * ========================================================================= */
/* Scoped to .dashboard-page only — login.html and player.html share
   this stylesheet but do not run the role-gate script (no role-gated
   chrome to hide). Without the class scope, the gate would blank the
   login form and the player popup until something set [data-role],
   which never happens on those pages. */
body.dashboard-page:not([data-role]) { visibility: hidden; }
.viewer-exports-pill { display: none; }

body[data-role="viewer"] #healthBar > :not(.viewer-exports-pill) { display: none !important; }
/* For viewers the health-bar would wrap a single exports pill, so the
   chrome (border, background, padding) looks empty around it.
   `display: contents` removes the box from layout entirely — the
   exports pill becomes a direct visual child of the header. */
body[data-role="viewer"] #healthBar { display: contents; }
body[data-role="viewer"] .viewer-exports-pill {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    position: relative;
    cursor: pointer;
    padding: 4px 10px;
    border-radius: 6px;
    border: 1px solid var(--border);
    background: var(--bg);
    transition: border-color 0.15s, background 0.15s;
}
body[data-role="viewer"] .viewer-exports-pill:hover { border-color: var(--text-muted); }
body[data-role="viewer"] #logoWrap { pointer-events: none; }
body[data-role="viewer"] #logoDropdown { display: none !important; }
body[data-role="viewer"] #navEpg,
body[data-role="viewer"] #navAdmin { display: none !important; }
body[data-role="viewer"] #adminTabBar { display: none !important; }
body[data-role="viewer"] .video-feeds { display: none !important; }
body[data-role="viewer"] #ftRefineBtn { display: none !important; }

.viewer-exports-pill .hb-k { font-size: 0.78rem; color: var(--text-muted, #9da5b4); }
.viewer-exports-dd {
    display: none;
    position: absolute;
    top: calc(100% + 6px);
    right: 0;
    min-width: 360px;
    max-width: 480px;
    max-height: 60vh;
    overflow-y: auto;
    background: var(--card-bg, #1c2128);
    color: var(--text, #e6edf3);
    border: 1px solid var(--border, #30363d);
    border-radius: 6px;
    box-shadow: 0 6px 20px rgba(0,0,0,0.4);
    z-index: 1000;
}
.viewer-exports-dd.open { display: block; }
.viewer-exports-dd .dd-header {
    padding: 8px 12px;
    border-bottom: 1px solid var(--border, #30363d);
    font-weight: 600;
    font-size: 0.85rem;
    color: var(--text, #e6edf3);
}
.vexp-body { padding: 4px 0; }
.vexp-empty {
    padding: 16px;
    text-align: center;
    color: var(--text-muted, #8b949e);
    font-size: 0.85rem;
}
.vexp-row {
    padding: 8px 12px;
    border-bottom: 1px solid var(--border, #30363d);
    font-size: 0.82rem;
    color: var(--text, #e6edf3);
    overflow-wrap: anywhere;
    word-break: break-word;
}
.vexp-row:last-child { border-bottom: none; }
.vexp-top {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 2px;
}
.vexp-ch { font-weight: 600; min-width: 0; flex: 1 1 auto; }
.vexp-status { font-size: 0.75rem; padding: 1px 6px; border-radius: 3px; flex: 0 0 auto; white-space: nowrap; }
.vexp-status[data-status="completed"] { color: var(--success, #3fb950); }
.vexp-status[data-status="running"],
.vexp-status[data-status="processing"] { color: var(--accent, #4a9ff5); }
.vexp-status[data-status="failed"] { color: var(--danger, #f85149); }
.vexp-status[data-status="queued"],
.vexp-status[data-status="cancelled"] { color: var(--text-muted, #888); }
.vexp-meta { color: var(--text-muted, #8b949e); font-size: 0.75rem; overflow-wrap: anywhere; }
.vexp-timing { color: var(--text-muted, #8b949e); font-size: 0.72rem; margin-top: 2px; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.vexp-error { color: var(--danger, #f85149); font-size: 0.72rem; margin-top: 2px; word-break: break-word; }
.vexp-actions {
    margin-top: 4px;
    display: flex;
    align-items: center;
    gap: 6px;
}
.vexp-btn {
    display: inline-block;
    padding: 3px 10px;
    font-size: 0.75rem;
    background: var(--accent, #2f81f7);
    color: #fff;
    border: none;
    border-radius: 3px;
    text-decoration: none;
    cursor: pointer;
    font-family: inherit;
    line-height: 1.4;
}
.vexp-btn:hover { opacity: 0.85; }
.vexp-btn[disabled] { opacity: 0.5; cursor: not-allowed; }
/* Two-stage delete — neutral until armed, red on click 1, fires on click 2.
   Pushed to the far right via margin-left:auto so it sits opposite the
   download button regardless of how many actions there are. */
.vexp-delete {
    margin-left: auto;
    background: transparent;
    color: var(--text-muted, #8b949e);
    border: 1px solid var(--border, #30363d);
}
.vexp-delete:hover {
    color: var(--danger, #f85149);
    border-color: var(--danger, #f85149);
}
.vexp-delete.armed,
.vexp-delete.armed:hover {
    background: var(--danger, #f85149);
    color: #fff;
    border-color: var(--danger, #f85149);
    opacity: 1;
}
/* Two-stage stop — same shape as .vexp-delete but armed state goes amber
   (warn) instead of red so it reads as "interrupt" rather than "destroy".
   Sits inline with the actions row, no margin-left:auto since running
   rows have no Download button to balance against. */
.vexp-stop {
    background: transparent;
    color: var(--text-muted, #8b949e);
    border: 1px solid var(--border, #30363d);
}
.vexp-stop:hover {
    color: var(--warning, #d29922);
    border-color: var(--warning, #d29922);
}
.vexp-stop.armed,
.vexp-stop.armed:hover {
    background: var(--warning, #d29922);
    color: #fff;
    border-color: var(--warning, #d29922);
    opacity: 1;
}
/* Sidecar SRT download — secondary affordance next to the main Download
   button. Muted by default since most users will rely on the embedded
   mov_text track in the MP4; the standalone file is for editing/
   translating captions. */
.vexp-srt {
    background: transparent;
    color: var(--text-muted, #8b949e);
    border: 1px solid var(--border, #30363d);
}
.vexp-srt:hover {
    color: var(--accent, #2f81f7);
    border-color: var(--accent, #2f81f7);
}

/* Badge wrapper — holds 1 or 2 child .status-pill spans so running
   (green) and ready-to-download (amber) read as distinct states
   instead of merging into a single "1 / 1" pill. Children keep the
   primitive .status-pill chrome (rounded, bordered, uppercase). */
.vexp-badges {
    display: inline-flex;
    align-items: center;
    gap: 4px;
}
/* Map "ready" state onto the warn palette — primitive only ships
   visuals for active/warn/crit/rec/idle, so without this the ready
   pill falls through to idle grey. */
.vexp-badges .status-pill[data-state="ready"] {
    background: var(--pill-bg-warn);
    color: var(--pill-fg-warn);
    border-color: var(--pill-br-warn);
}

.dcm-flash.err { color: var(--danger); }

/* ── Calendar popout ─────────────────────────────────────────────────
   Anchored under the timeline date label. Heatmap tints from the
   pill-bg/pill-fg tokens so dark + light themes both pick up. */
.calendar-popout {
    position: fixed;
    z-index: 9000;
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
    padding: 8px;
    min-width: 240px;
    color: var(--text);
    font-size: 12px;
    user-select: none;
}

.calendar-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 4px 6px;
    border-bottom: 1px solid var(--border);
    margin-bottom: 6px;
}

.calendar-month-label {
    font-weight: 600;
    color: var(--text);
}

.calendar-nav {
    background: transparent;
    border: 1px solid var(--border);
    color: var(--text);
    border-radius: 3px;
    padding: 2px 8px;
    cursor: pointer;
    font-size: 11px;
}
.calendar-nav:hover { border-color: var(--text-muted); }
.calendar-nav.disabled,
.calendar-nav:disabled {
    opacity: 0.35;
    cursor: not-allowed;
    color: var(--text-muted);
}
.calendar-nav.disabled:hover,
.calendar-nav:disabled:hover { border-color: var(--border); }

.calendar-loading {
    padding: 32px 0;
    text-align: center;
    color: var(--text-muted);
}

.calendar-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
}

.calendar-weekday {
    text-align: center;
    color: var(--text-muted);
    font-size: 10px;
    padding: 2px 0;
}

.calendar-cell {
    aspect-ratio: 1 / 1;
    background: transparent;
    border: 1px solid transparent;
    border-radius: 3px;
    color: var(--text);
    cursor: pointer;
    font-size: 11px;
    padding: 0;
    transition: border-color 0.1s;
}
.calendar-cell:hover:not(.disabled) {
    border-color: var(--text-muted);
}
.calendar-cell.out-of-month { color: var(--text-muted); opacity: 0.5; }
.calendar-cell.disabled {
    cursor: not-allowed;
    opacity: 0.3;
    color: var(--text-muted);
}

.calendar-cell.cov-low {
    background: var(--pill-bg-warn);
    color: var(--pill-fg-warn);
}
.calendar-cell.cov-mid {
    background: var(--pill-bg-active);
    color: var(--pill-fg-active);
}
.calendar-cell.cov-high {
    background: var(--pill-bg-active);
    color: var(--pill-fg-active);
    box-shadow: inset 0 0 0 1px var(--pill-br-active);
}

.calendar-cell.current {
    border-color: var(--accent);
    box-shadow: 0 0 0 1px var(--accent);
}
.calendar-cell.today {
    font-weight: 700;
    text-decoration: underline;
}
