        /* ═══════════════════════════════════════════════════════════
           CSS Custom Properties — light theme values.
           Dark mode: [data-theme="dark"] overrides below.
           OS preference: @media (prefers-color-scheme: dark) block.
           ═══════════════════════════════════════════════════════════ */
        :root {
            --color-bg: #e8eaed;
            --color-card: #ffffff;
            --color-card-shadow: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06);
            --color-text-primary: #1a1a2e;
            --color-text-secondary: #555555;
            --color-text-muted: #888888;
            --color-border-light: #eeeeee;
            --color-border-medium: #cccccc;
            --color-hover-bg: #f0f0f0;
            --color-accent-server: #26a69a;
            --color-accent-client: #4fc3f7;
            --color-fetching: #f57c00;
            --color-health-clear: #2e7d32;
            --color-canvas-bg: #ffffff;
            --color-canvas-grid: #f0f0f0;
            --color-canvas-axis: #888888;
            --color-canvas-crosshair: #cccccc;
            --color-canvas-edge: #388e3c;
            --color-canvas-dim: #888888;
            --color-canvas-mode: light;
            --color-tooltip-bg: rgba(255, 255, 255, 0.97);
            --color-tooltip-border: #e0e0e0;
            --color-sidebar-width: 260px;
            --color-panel-radius: 12px;
            --color-topbar-height: 48px;
            --color-topbar-bg: var(--color-card);
        }

        /* ── Dark mode overrides ─────────────────────────────── */
        [data-theme="dark"] {
            --color-bg: #121212;
            --color-card: #1e1e1e;
            --color-card-shadow: 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.2);
            --color-text-primary: #e0e0e0;
            --color-text-secondary: #aaaaaa;
            --color-text-muted: #777777;
            --color-border-light: #333333;
            --color-border-medium: #555555;
            --color-hover-bg: #2a2a2a;
            --color-accent-server: #4db6ac;
            --color-accent-client: #81d4fa;
            --color-fetching: #ffb74d;
            --color-health-clear: #81c784;
            --color-canvas-bg: #1e1e1e;
            --color-canvas-grid: #2a2a2a;
            --color-canvas-axis: #999999;
            --color-canvas-crosshair: #555555;
            --color-canvas-edge: #66bb6a;
            --color-canvas-dim: #888888;
            --color-canvas-mode: dark;
            --color-tooltip-bg: rgba(30, 30, 30, 0.97);
            --color-tooltip-border: #444444;
            --color-topbar-bg: var(--color-card);
        }

        /* ── OS preference dark mode (when no explicit data-theme) ─ */
        @media (prefers-color-scheme: dark) {
            :root:not([data-theme="light"]) {
                --color-bg: #121212;
                --color-card: #1e1e1e;
                --color-card-shadow: 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.2);
                --color-text-primary: #e0e0e0;
                --color-text-secondary: #aaaaaa;
                --color-text-muted: #777777;
                --color-border-light: #333333;
                --color-border-medium: #555555;
                --color-hover-bg: #2a2a2a;
                --color-accent-server: #4db6ac;
                --color-accent-client: #81d4fa;
                --color-fetching: #ffb74d;
                --color-health-clear: #81c784;
                --color-canvas-bg: #1e1e1e;
                --color-canvas-grid: #2a2a2a;
                --color-canvas-axis: #999999;
                --color-canvas-crosshair: #555555;
                --color-canvas-edge: #66bb6a;
                --color-canvas-dim: #888888;
                --color-canvas-mode: dark;
                --color-tooltip-bg: rgba(30, 30, 30, 0.97);
                --color-tooltip-border: #444444;
                --color-topbar-bg: var(--color-card);
            }
        }

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

        body {
            font-family: system-ui, -apple-system, sans-serif;
            display: flex;
            flex-direction: column;
            height: 100vh;
            height: 100dvh;
            color: var(--color-text-primary);
            background: var(--color-bg);
            overflow: hidden;
        }

        /* ── Top bar ─────────────────────────────────────────── */

        .topbar {
            display: flex;
            align-items: center;
            gap: 10px;
            height: var(--color-topbar-height);
            min-height: var(--color-topbar-height);
            padding: 0 12px;
            background: var(--color-topbar-bg);
            border-bottom: 1px solid var(--color-border-light);
            box-shadow: var(--color-card-shadow);
            z-index: 50;
            flex-shrink: 0;
        }

        .brand {
            flex: 1;
            font-size: 1rem;
            font-weight: 600;
            color: var(--color-text-primary);
            white-space: nowrap;
        }

        .brand-accent {
            font-weight: 700;
            color: var(--color-accent-client);
        }

        .topbar-actions {
            display: flex;
            align-items: center;
            gap: 8px;
        }

        .theme-toggle, .sidebar-toggle {
            background: none;
            border: 1px solid var(--color-border-medium);
            border-radius: 6px;
            cursor: pointer;
            padding: 4px 8px;
            display: inline-flex;
            align-items: center;
            justify-content: center;
            color: var(--color-text-secondary);
            transition: background 0.15s, color 0.15s;
        }

        .theme-toggle:hover, .sidebar-toggle:hover {
            background: var(--color-hover-bg);
            color: var(--color-text-primary);
        }

        .theme-toggle svg, .sidebar-toggle svg {
            width: 18px;
            height: 18px;
            fill: currentColor;
        }

        /* Hamburger hidden on desktop */
        .sidebar-toggle {
            display: none;
        }

        /* ── App body (sidebar + grid) ──────────────────────── */

        .app-body {
            flex: 1;
            display: flex;
            min-height: 0;
            padding: 12px;
            gap: 12px;
            overflow: hidden;
        }

        /* ── Sidebar backdrop (mobile only) ─────────────────── */

        .sidebar-backdrop {
            position: fixed;
            inset: 0;
            background: rgba(0,0,0,0.4);
            z-index: 55;
            opacity: 0;
            pointer-events: none;
            transition: opacity 0.2s ease;
        }

        /* ── Sidebar ─────────────────────────────────────────── */

        aside {
            width: var(--color-sidebar-width);
            min-width: var(--color-sidebar-width);
            padding: 1rem;
            overflow-y: auto;
            background: var(--color-card);
            border-radius: var(--color-panel-radius);
            box-shadow: var(--color-card-shadow);
            margin: 0;
            flex-shrink: 0;
        }

        /* Sidebar tools row: search input + errors-only chip */
        .sidebar-tools {
            display: flex;
            gap: 8px;
            margin-bottom: 0.75rem;
        }

        /* Search filter input */
        .tag-filter {
            flex: 1;
            min-width: 0;
            padding: 6px 10px;
            font-size: 0.85rem;
            font-family: inherit;
            border: 1px solid var(--color-border-medium);
            border-radius: 6px;
            background: var(--color-bg);
            color: var(--color-text-primary);
            outline: none;
        }

        .tag-filter:focus {
            border-color: var(--color-accent-client);
        }

        /* Errors-only filter chip: muted outline inactive, amber tint active */
        .error-filter-chip {
            display: inline-flex;
            align-items: center;
            gap: 4px;
            flex-shrink: 0;
            padding: 4px 8px;
            font-size: 0.8rem;
            font-family: inherit;
            font-variant-numeric: tabular-nums;
            border: 1px solid var(--color-border-medium);
            border-radius: 6px;
            background: transparent;
            color: var(--color-text-secondary);
            cursor: pointer;
            transition: background 0.15s, color 0.15s, border-color 0.15s;
        }

        .error-filter-chip:hover {
            background: var(--color-hover-bg);
        }

        .error-filter-chip[aria-pressed="true"] {
            background: rgba(245, 124, 0, 0.14);
            color: var(--color-fetching);
            border-color: var(--color-fetching);
        }

        .error-filter-chip svg {
            width: 15px;
            height: 15px;
            fill: currentColor;
            flex-shrink: 0;
        }

        /* Dim hint while errors-only mode waits on health classification */
        .health-pending {
            font-size: 0.75rem;
            color: var(--color-text-secondary);
            margin-bottom: 0.5rem;
        }

        /* Per-list all-clear row in errors-only mode */
        aside li.health-clear {
            color: var(--color-health-clear);
            cursor: default;
            border-left-color: transparent;
        }

        aside li.health-clear:hover {
            background: transparent;
        }

        aside h2 {
            font-size: 0.75rem;
            text-transform: uppercase;
            letter-spacing: 0.08em;
            color: var(--color-text-muted);
            margin-bottom: 0.4rem;
        }

        aside ul {
            list-style: none;
            margin-bottom: 1.25rem;
        }

        aside li {
            padding: 0.3rem 0.5rem;
            border-radius: 4px;
            cursor: pointer;
            font-size: 0.9rem;
            border-left: 3px solid transparent;
            color: var(--color-text-secondary);
        }

        aside li.server-tag,
        aside li.client-tag {
            display: flex;
            flex-direction: column;
            align-items: flex-start;
            gap: 1px;
            padding: 0.35rem 0.5rem;
            position: relative;
        }

        /* Author `display: flex` would otherwise override the UA [hidden]
           rule and leave filtered tags visible. */
        aside li.server-tag[hidden],
        aside li.client-tag[hidden] {
            display: none;
        }

        .tag-name {
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
            max-width: 100%;
        }

        .tag-health {
            font-size: 0.68rem;
            color: var(--color-text-muted);
            font-variant-numeric: tabular-nums;
            letter-spacing: 0.01em;
            line-height: 1.25;
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
            max-width: 100%;
        }

        .tag-health .health-ok {
            opacity: 0.75;
        }

        .tag-health .health-warn {
            color: var(--color-fetching);
            font-weight: 600;
        }

        aside li:hover { background: var(--color-hover-bg); }

        /* Sidebar accent colors by tag type */
        .server-tag {
            border-left-color: var(--color-accent-server);
        }

        .server-tag:hover {
            background: rgba(38, 166, 154, 0.08);
        }

        .client-tag {
            border-left-color: var(--color-accent-client);
        }

        .client-tag:hover {
            background: rgba(79, 195, 247, 0.08);
        }

        /* Sidebar active state — indicates tag has an open panel */
        .server-tag.active, .client-tag.active {
            background: var(--color-hover-bg);
        }

        /* "no matches" row in search filter */
        aside li.no-matches {
            color: var(--color-text-muted);
            font-style: italic;
            cursor: default;
            border-left-color: transparent;
        }

        aside li.no-matches:hover {
            background: transparent;
        }

        /* ── Panel grid (main area) ──────────────────────────── */

        main#panel-grid {
            flex: 1;
            min-width: 0;
            min-height: 0;
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
            grid-auto-rows: minmax(280px, 1fr);
            gap: 12px;
            padding: 0;
            overflow-x: hidden;
            overflow-y: auto;
            -webkit-overflow-scrolling: touch;
        }

        /* ── Empty state message ─────────────────────────────── */

        .empty-message {
            grid-column: 1 / -1;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            color: var(--color-text-muted);
            min-height: 200px;
            text-align: center;
            gap: 8px;
        }

        .empty-message svg {
            width: 48px;
            height: 48px;
            fill: var(--color-text-muted);
            opacity: 0.5;
        }

        .empty-message h3 {
            font-size: 1rem;
            font-weight: 600;
            color: var(--color-text-secondary);
        }

        .empty-message p {
            font-size: 0.85rem;
            color: var(--color-text-muted);
        }

        /* ── Individual graph panel ──────────────────────────── */

        .graph-panel {
            display: flex;
            flex-direction: column;
            background: var(--color-card);
            border-radius: var(--color-panel-radius);
            box-shadow: var(--color-card-shadow);
            overflow: hidden;
            min-height: 280px;
            min-width: 0;
        }

        .panel-header {
            display: flex;
            flex-direction: column;
            padding: 6px 10px;
            background: var(--color-card);
            border-bottom: 1px solid var(--color-border-light);
        }

        .panel-header-top {
            display: flex;
            align-items: center;
            justify-content: space-between;
            min-height: 24px;
            margin-bottom: 4px;
        }

        .panel-tag {
            font-size: 0.85rem;
            font-weight: 600;
            color: var(--color-text-primary);
            overflow: hidden;
            text-overflow: ellipsis;
            white-space: nowrap;
        }

        /* Panel type badge (S/C indicator) — outlined style */
        .panel-badge {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            width: 18px;
            height: 18px;
            border-radius: 3px;
            font-size: 0.65rem;
            font-weight: 700;
            flex-shrink: 0;
            background: transparent;
            border: 1.5px solid;
        }

        .badge-server {
            color: var(--color-accent-server);
            border-color: var(--color-accent-server);
        }

        .badge-client {
            color: var(--color-accent-client);
            border-color: var(--color-accent-client);
        }

        .panel-status {
            font-size: 0.75rem;
            color: var(--color-text-muted);
            margin-right: 6px;
        }

        .panel-close {
            background: none;
            border: none;
            color: var(--color-text-muted);
            font-size: 1.2rem;
            cursor: pointer;
            padding: 0 4px;
            line-height: 1;
            border-radius: 3px;
        }

        .panel-close:hover {
            background: var(--color-hover-bg);
            color: var(--color-text-primary);
        }

        .panel-popout,
        .sidebar-popout {
            background: none;
            border: none;
            color: var(--color-text-muted);
            font-size: 0.85rem;
            cursor: pointer;
            padding: 0 4px;
            line-height: 1;
            border-radius: 3px;
        }

        .panel-popout:hover,
        .sidebar-popout:hover {
            background: var(--color-hover-bg);
            color: var(--color-text-primary);
        }

        /* Sidebar row popout door (plan 22): chrome shared with
           .panel-popout above; absolute because the rows are column-flex.
           Hidden at rest on desktop — hover means pointer, so it can never
           be clickable-while-invisible; :focus keeps it keyboard-reachable. */
        .sidebar-popout {
            position: absolute;
            top: 0.35rem;
            right: 0.35rem;
            opacity: 0;
        }

        aside li:hover .sidebar-popout,
        .sidebar-popout:focus {
            opacity: 1;
        }

        /* ── Attribute toggle button bar ─────────────────────── */

        .panel-attributes {
            display: flex;
            flex-wrap: wrap;
            gap: 4px;
        }

        .attr-btn {
            font-family: system-ui, -apple-system, sans-serif;
            font-size: 0.7rem;
            font-weight: 500;
            padding: 2px 8px;
            border-radius: 10px;
            border: 1px solid var(--color-border-medium);
            background: transparent;
            color: var(--color-text-muted);
            cursor: pointer;
            transition: background 0.15s, color 0.15s, border-color 0.15s;
            line-height: 1.4;
        }

        .attr-btn:hover {
            border-color: var(--color-text-secondary);
            color: var(--color-text-secondary);
        }

        .attr-btn.active {
            color: #fff;
            border-color: currentColor;
        }

        /* ── Hover tooltip ─────────────────────────────────── */

        .graph-tooltip {
            position: fixed;
            pointer-events: none;
            background: var(--color-tooltip-bg);
            border: 1px solid var(--color-tooltip-border);
            border-radius: 6px;
            padding: 6px 10px;
            font-size: 0.75rem;
            line-height: 1.5;
            color: var(--color-text-primary);
            z-index: 1000;
            display: none;
            max-width: 240px;
            box-shadow: 0 2px 12px rgba(0,0,0,0.08);
        }

        .graph-tooltip .tooltip-timestamp {
            color: var(--color-text-muted);
            margin-bottom: 3px;
            font-size: 0.7rem;
        }

        .graph-tooltip .tooltip-row {
            display: flex;
            align-items: center;
            gap: 6px;
        }

        .graph-tooltip .tooltip-dot {
            width: 8px;
            height: 8px;
            border-radius: 50%;
            flex-shrink: 0;
        }

        .graph-tooltip .tooltip-name {
            color: var(--color-text-muted);
            min-width: 60px;
        }

        .graph-tooltip .tooltip-value {
            font-family: 'SF Mono', 'Cascadia Code', 'Consolas', monospace;
            color: var(--color-text-primary);
        }

        .graph-panel canvas {
            flex: 1;
            min-height: 0;
            display: block;
            width: 100%;
            user-select: none;
            -webkit-user-select: none;
            touch-action: pan-y;
            -webkit-touch-callout: none;
        }

        /* ── Responsive: sidebar drawer below 900px ─────────── */

        @media (max-width: 899px) {
            .sidebar-toggle {
                display: inline-flex;
            }

            .theme-toggle, .sidebar-toggle {
                min-width: 44px;
                min-height: 44px;
            }

            .error-filter-chip {
                min-width: 44px;
                min-height: 44px;
            }

            /* No hover on touch: keep the row popout door faintly visible,
               40px outer box (plan-12 convention, sized to the ~44px
               two-line row). Reveal rule lifts it to full opacity. */
            .sidebar-popout {
                opacity: 0.35;
                min-width: 40px;
                min-height: 40px;
                display: inline-flex;
                align-items: center;
                justify-content: center;
            }

            aside {
                position: fixed;
                top: var(--color-topbar-height);
                left: 0;
                width: 80vw;
                max-width: 320px;
                height: calc(100vh - var(--color-topbar-height));
                transform: translateX(-100%);
                transition: transform 0.2s ease;
                z-index: 60;
                border-radius: 0;
            }

            body.sidebar-open aside {
                transform: translateX(0);
            }

            body.sidebar-open .sidebar-backdrop {
                opacity: 1;
                pointer-events: auto;
            }
        }

        /* ── Responsive: single-column grid below 640px ─────── */

        @media (max-width: 639px) {
            main#panel-grid {
                grid-template-columns: 1fr;
            }

            .app-body {
                padding: 8px;
                gap: 8px;
            }
        }

/* ── plan 18: class-based replacements for removed inline styles ── */
.icon-hidden { display: none; }
.tag-empty { color: #555; }
