/* global-heatmap.css */
body.heatmap-page {width: 100%; height: 100%;
            overflow: hidden;
            font-family: 'Inter', sans-serif;
            background: #03060f;
            color: #e0f0ff;}

:root {
            --accent: #00f0ff;
            --accent2: #00ffc8;
            --accent-rgb: 0, 240, 255;
            --glow: 0 0 20px rgba(0,240,255,0.3);
        }
        * { margin: 0; padding: 0; box-sizing: border-box; }
        html, 
        #bg-canvas { position: fixed; inset: 0; z-index: 0; }
        #map-canvas { position: fixed; inset: 0; z-index: 1; }

        /* ===== 顶部状态栏 ===== */
        .top-bar {
            position: fixed; top: 0; left: 0; right: 0;
            height: 56px;
            background: linear-gradient(180deg, rgba(3,6,15,0.98) 0%, rgba(3,6,15,0.85) 100%);
            backdrop-filter: blur(20px);
            border-bottom: 1px solid rgba(var(--accent-rgb),0.12);
            display: flex; align-items: center;
            padding: 0 24px;
            z-index: 100;
        }
        .top-bar .brand {
            display: flex; align-items: center; gap: 12px;
            font-family: 'Orbitron', sans-serif;
            font-weight: 700;
        }
        .top-bar .brand .logo {
            width: 36px; height: 36px;
            background: linear-gradient(135deg, var(--accent), var(--accent2));
            border-radius: 10px;
            display: flex; align-items: center; justify-content: center;
            font-size: 18px; color: #03060f; font-weight: 900;
            box-shadow: var(--glow);
        }
        .top-bar .brand .title {
            font-size: 16px;
            background: linear-gradient(90deg, var(--accent), var(--accent2));
            -webkit-background-clip: text; -webkit-text-fill-color: transparent;
            letter-spacing: 1px;
        }
        .top-bar .brand .sub {
            font-size: 10px; color: #4a6a8a;
            font-family: 'Inter', sans-serif; font-weight: 400;
            letter-spacing: 2px; text-transform: uppercase;
        }

        /* 角色切换器 */
        .role-switcher {
            display: flex; gap: 4px;
            margin-left: 48px;
            background: rgba(255,255,255,0.03);
            border: 1px solid rgba(255,255,255,0.05);
            border-radius: 12px;
            padding: 4px;
        }
        .role-btn {
            padding: 8px 18px;
            border: none; background: transparent;
            color: #4a6a8a;
            font-family: 'Inter', sans-serif;
            font-size: 12px; font-weight: 600;
            border-radius: 8px;
            cursor: pointer;
            transition: all 0.35s cubic-bezier(0.4,0,0.2,1);
            white-space: nowrap;
            display: flex; align-items: center; gap: 6px;
            position: relative;
        }
        .role-btn i { font-size: 13px; }
        .role-btn:hover { color: #8ab0d0; background: rgba(255,255,255,0.04); }
        .role-btn.active {
            color: var(--accent);
            background: rgba(var(--accent-rgb),0.08);
            box-shadow: 0 0 20px rgba(var(--accent-rgb),0.15), inset 0 0 20px rgba(var(--accent-rgb),0.03);
        }
        .role-btn.active::after {
            content: '';
            position: absolute; bottom: -5px; left: 50%; transform: translateX(-50%);
            width: 20px; height: 2px;
            background: var(--accent);
            border-radius: 2px;
            box-shadow: 0 0 8px var(--accent);
        }

        /* 速度控制 */
        .speed-control {
            display: flex; align-items: center; gap: 6px;
            margin-left: 20px;
            padding: 4px 10px;
            background: rgba(255,255,255,0.03);
            border: 1px solid rgba(255,255,255,0.05);
            border-radius: 12px;
            transition: border-color 0.3s;
        }
        .speed-control:hover { border-color: rgba(var(--accent-rgb),0.25); }
        .speed-control .speed-icon { color: var(--accent); font-size: 12px; text-shadow: 0 0 8px rgba(var(--accent-rgb),0.6); }
        .speed-btn {
            padding: 4px 10px; border: none; background: transparent;
            color: #4a6a8a; font-family: 'Inter', sans-serif;
            font-size: 11px; font-weight: 600;
            border-radius: 6px; cursor: pointer;
            transition: all 0.3s cubic-bezier(0.4,0,0.2,1);
            white-space: nowrap;
        }
        .speed-btn:hover { color: #8ab0d0; background: rgba(255,255,255,0.04); }
        .speed-btn.active {
            color: var(--accent);
            background: rgba(var(--accent-rgb),0.1);
            box-shadow: 0 0 12px rgba(var(--accent-rgb),0.15);
        }
        .speed-control input[type="range"] {
            width: 80px; height: 3px;
            -webkit-appearance: none; appearance: none;
            background: rgba(var(--accent-rgb),0.2); border-radius: 2px;
            outline: none; cursor: pointer;
        }
        .speed-control input[type="range"]::-webkit-slider-thumb {
            -webkit-appearance: none; appearance: none;
            width: 12px; height: 12px; border-radius: 50%;
            background: var(--accent);
            box-shadow: 0 0 8px rgba(var(--accent-rgb),0.7);
            cursor: pointer;
            transition: transform 0.2s;
        }
        .speed-control input[type="range"]::-webkit-slider-thumb:hover { transform: scale(1.3); }
        .speed-control input[type="range"]::-moz-range-thumb {
            width: 12px; height: 12px; border: none; border-radius: 50%;
            background: var(--accent);
            box-shadow: 0 0 8px rgba(var(--accent-rgb),0.7);
            cursor: pointer;
        }
        .speed-value {
            font-family: 'JetBrains Mono', monospace;
            font-size: 11px; color: var(--accent);
            text-shadow: 0 0 8px rgba(var(--accent-rgb),0.5);
            min-width: 36px; text-align: center;
        }

        .top-right {
            margin-left: auto;
            display: flex; align-items: center; gap: 20px;
        }
        .clock {
            font-family: 'JetBrains Mono', monospace;
            font-size: 14px;
            color: var(--accent);
            text-shadow: 0 0 10px rgba(var(--accent-rgb),0.5);
            letter-spacing: 1px;
        }
        .status-indicator {
            display: flex; align-items: center; gap: 8px;
            font-size: 11px; color: #00ffc8;
        }
        .status-indicator .dot {
            width: 8px; height: 8px;
            background: #00ffc8; border-radius: 50%;
            box-shadow: 0 0 10px #00ffc8;
            animation: pulseDot 2s ease infinite;
        }
        @keyframes pulseDot {
            0%,100% { opacity:1; transform:scale(1); }
            50% { opacity:0.5; transform:scale(0.8); }
        }
        .view-controls { display: flex; gap: 4px; }
        .view-btn {
            width: 34px; height: 34px;
            background: rgba(255,255,255,0.04);
            border: 1px solid rgba(255,255,255,0.06);
            border-radius: 8px;
            color: #4a6a8a;
            cursor: pointer; font-size: 14px;
            display: flex; align-items: center; justify-content: center;
            transition: 0.2s;
        }
        .view-btn:hover { color: var(--accent); border-color: rgba(var(--accent-rgb),0.2); }

        /* 语音按钮聆听状态 */
        .view-btn.listening {
            color: #ff6b6b;
            border-color: rgba(255,107,107,0.5);
            background: rgba(255,107,107,0.08);
            animation: micPulse 1.2s ease-out infinite;
        }
        @keyframes micPulse {
            0% { box-shadow: 0 0 0 0 rgba(255,107,107,0.45); }
            100% { box-shadow: 0 0 0 10px rgba(255,107,107,0); }
        }

        /* 语音聆听提示条 */
        .voice-hint {
            position: fixed; top: 70px; left: 50%; transform: translateX(-50%) translateY(-12px);
            display: flex; align-items: center; gap: 10px;
            padding: 8px 18px;
            background: rgba(8,14,30,0.92);
            border: 1px solid rgba(255,107,107,0.35);
            border-radius: 24px;
            color: #ffb4b4; font-size: 13px; font-weight: 500;
            backdrop-filter: blur(12px);
            box-shadow: 0 8px 30px rgba(0,0,0,0.5), 0 0 20px rgba(255,107,107,0.15);
            z-index: 300;
            opacity: 0; pointer-events: none;
            transition: all 0.35s cubic-bezier(0.4,0,0.2,1);
            white-space: nowrap;
        }
        .voice-hint.show { opacity: 1; transform: translateX(-50%) translateY(0); }
        .voice-hint i { color: #ff6b6b; animation: micPulse 1.2s ease-out infinite; }
        .vh-bars { display: flex; align-items: flex-end; gap: 2px; height: 12px; }
        .vh-bars i {
            width: 3px; border-radius: 2px; background: #ff6b6b;
            animation: vbar 0.9s ease-in-out infinite;
        }
        .vh-bars i:nth-child(1) { height: 6px; animation-delay: 0s; }
        .vh-bars i:nth-child(2) { height: 12px; animation-delay: 0.15s; }
        .vh-bars i:nth-child(3) { height: 8px; animation-delay: 0.3s; }
        .vh-bars i:nth-child(4) { height: 11px; animation-delay: 0.45s; }
        @keyframes vbar {
            0%, 100% { transform: scaleY(0.5); opacity: 0.5; }
            50% { transform: scaleY(1.4); opacity: 1; }
        }

        /* 语音指令反馈 toast */
        .voice-feedback {
            position: fixed; bottom: 36px; left: 50%; transform: translateX(-50%) translateY(16px);
            padding: 12px 22px;
            background: linear-gradient(135deg, rgba(8,14,30,0.96), rgba(10,22,42,0.96));
            border: 1px solid rgba(var(--accent-rgb),0.35);
            border-radius: 14px;
            color: #e0f0ff; font-size: 14px; font-weight: 500;
            backdrop-filter: blur(14px);
            box-shadow: 0 12px 40px rgba(0,0,0,0.6), 0 0 24px rgba(var(--accent-rgb),0.15);
            z-index: 300;
            opacity: 0; pointer-events: none;
            transition: all 0.35s cubic-bezier(0.4,0,0.2,1);
            text-align: center; max-width: 70vw;
        }
        .voice-feedback.show { opacity: 1; transform: translateX(-50%) translateY(0); }
        .voice-feedback b { color: var(--accent); }
        .voice-feedback .sp { font-family: 'JetBrains Mono', monospace; color: var(--accent2); font-weight: 700; margin-left: 4px; }

        /* ===== KPI 顶栏 ===== */
        .kpi-bar {
            position: fixed; top: 56px; left: 0; right: 0;
            height: 80px;
            background: linear-gradient(180deg, rgba(3,6,15,0.9) 0%, transparent 100%);
            display: flex; align-items: center;
            padding: 0 32px;
            gap: 16px;
            z-index: 90;
            pointer-events: none;
        }
        .kpi-card {
            flex: 1;
            max-width: 240px;
            background: linear-gradient(135deg, rgba(10,20,40,0.8), rgba(5,10,25,0.9));
            border: 1px solid rgba(var(--accent-rgb),0.1);
            border-radius: 12px;
            padding: 10px 16px;
            position: relative;
            overflow: hidden;
            pointer-events: auto;
            backdrop-filter: blur(10px);
            transition: all 0.3s;
        }
        .kpi-card::before {
            content: '';
            position: absolute; top:0; left:0; right:0; height: 2px;
            background: linear-gradient(90deg, transparent, var(--accent), transparent);
            opacity: 0.6;
        }
        .kpi-card:hover {
            border-color: rgba(var(--accent-rgb),0.25);
            transform: translateY(-2px);
            box-shadow: 0 8px 30px rgba(var(--accent-rgb),0.1);
        }
        .kpi-card .label {
            font-size: 10px; color: #4a7a9a;
            text-transform: uppercase; letter-spacing: 1px;
            font-weight: 600;
            display: flex; align-items: center; gap: 6px;
        }
        .kpi-card .label i { font-size: 10px; color: var(--accent); }
        .kpi-card .value {
            font-family: 'Orbitron', 'JetBrains Mono', monospace;
            font-size: 24px; font-weight: 800;
            color: #fff;
            margin-top: 2px;
            text-shadow: 0 0 20px rgba(var(--accent-rgb),0.3);
            line-height: 1.2;
        }
        .kpi-card .value .unit {
            font-size: 12px; font-weight: 400; color: #4a7a9a;
            margin-left: 4px;
        }
        .kpi-card .change {
            font-size: 11px; margin-top: 1px;
            display: flex; align-items: center; gap: 4px;
        }
        .kpi-card .change.up { color: #00ffc8; }
        .kpi-card .change.down { color: #ff6b6b; }
        .kpi-card .sparkline {
            position: absolute; bottom: 0; right: 0;
            width: 80px; height: 30px;
            opacity: 0.4;
        }

        /* ===== 左侧面板 ===== */
        .side-panel {
            position: fixed;
            left: 16px;
            top: 152px;
            bottom: 60px;
            width: 300px;
            z-index: 80;
            display: flex; flex-direction: column;
            gap: 12px;
            pointer-events: none;
        }
        .panel-card {
            background: linear-gradient(135deg, rgba(8,16,32,0.92), rgba(4,8,20,0.95));
            border: 1px solid rgba(var(--accent-rgb),0.08);
            border-radius: 14px;
            padding: 14px 16px;
            backdrop-filter: blur(16px);
            pointer-events: auto;
            overflow: hidden;
            position: relative;
        }
        .panel-card::before {
            content: '';
            position: absolute; top:0; left:0;
            width: 3px; height: 100%;
            background: linear-gradient(180deg, var(--accent), transparent);
            border-radius: 3px;
        }
        .panel-title {
            font-size: 10px; font-weight: 700;
            color: #4a7a9a;
            text-transform: uppercase; letter-spacing: 1.5px;
            margin-bottom: 10px;
            display: flex; align-items: center; gap: 8px;
        }
        .panel-title i { color: var(--accent); font-size: 11px; }
        .panel-title .badge {
            margin-left: auto;
            font-size: 9px;
            padding: 1px 8px;
            background: rgba(var(--accent-rgb),0.1);
            border-radius: 10px;
            color: var(--accent);
        }

        /* 热点列表 */
        .hub-item {
            display: flex; align-items: center; gap: 10px;
            padding: 8px 0;
            border-bottom: 1px solid rgba(255,255,255,0.03);
            cursor: pointer;
            transition: 0.2s;
        }
        .hub-item:last-child { border-bottom: none; }
        .hub-item:hover { padding-left: 4px; }
        .hub-item .rank {
            width: 22px; height: 22px;
            background: rgba(255,255,255,0.04);
            border-radius: 6px;
            display: flex; align-items: center; justify-content: center;
            font-family: 'JetBrains Mono', monospace;
            font-size: 11px; font-weight: 700;
            color: #4a7a9a;
            flex-shrink: 0;
        }
        .hub-item:nth-child(1) .rank { background: rgba(255,200,0,0.15); color: #ffc800; }
        .hub-item:nth-child(2) .rank { background: rgba(192,192,192,0.15); color: #c0c0c0; }
        .hub-item:nth-child(3) .rank { background: rgba(205,127,50,0.15); color: #cd7f32; }
        .hub-item .hub-info { flex:1; min-width:0; }
        .hub-item .hub-name {
            font-size: 12px; font-weight: 600;
            color: #c0d8f0;
            display: flex; align-items: center; gap: 4px;
        }
        .hub-item .hub-name .flag { font-size: 11px; }
        .hub-item .hub-meta {
            font-size: 10px; color: #3a5a7a;
            font-family: 'JetBrains Mono', monospace;
        }
        .hub-item .hub-value {
            font-family: 'Orbitron', monospace;
            font-size: 14px; font-weight: 700;
            color: var(--accent);
            text-shadow: 0 0 10px rgba(var(--accent-rgb),0.3);
        }
        .hub-item .hub-bar {
            width: 100%; height: 3px;
            background: rgba(255,255,255,0.04);
            border-radius: 3px;
            margin-top: 3px;
            overflow: hidden;
        }
        .hub-item .hub-bar .fill {
            height: 100%;
            background: linear-gradient(90deg, var(--accent), var(--accent2));
            border-radius: 3px;
            transition: width 1s cubic-bezier(0.4,0,0.2,1);
        }

        /* ===== 右侧面板 ===== */
        .right-panel {
            position: fixed;
            right: 16px;
            top: 152px;
            bottom: 60px;
            width: 280px;
            z-index: 80;
            display: flex; flex-direction: column;
            gap: 12px;
            pointer-events: none;
        }

        /* 实时数据流 */
        .feed-item {
            display: flex; gap: 8px;
            padding: 6px 0;
            border-bottom: 1px solid rgba(255,255,255,0.02);
            font-size: 11px;
            animation: feedSlide 0.5s ease;
        }
        @keyframes feedSlide {
            from { opacity:0; transform: translateX(-10px); }
            to { opacity:1; transform: translateX(0); }
        }
        .feed-item .feed-time {
            font-family: 'JetBrains Mono', monospace;
            color: var(--accent);
            font-size: 9px;
            flex-shrink: 0;
            opacity: 0.7;
        }
        .feed-item .feed-text { color: #6a9aba; line-height: 1.4; }
        .feed-item .feed-text .hl { color: var(--accent); font-weight: 600; }
        .feed-item .feed-text .val { color: var(--accent2); font-family: 'JetBrains Mono', monospace; font-weight: 600; }

        /* 趋势指标 */
        .trend-row {
            display: flex; justify-content: space-between; align-items: center;
            padding: 5px 0;
            font-size: 12px;
        }
        .trend-row .trend-label { color: #4a7a9a; display: flex; align-items: center; gap: 6px; }
        .trend-row .trend-val { font-family: 'JetBrains Mono', monospace; font-weight: 600; }
        .trend-row .trend-val.good { color: #00ffc8; }
        .trend-row .trend-val.warn { color: #ffc800; }
        .trend-row .trend-val.bad { color: #ff6b6b; }
        .trend-row .trend-bar {
            width: 80px; height: 4px;
            background: rgba(255,255,255,0.04);
            border-radius: 4px;
            overflow: hidden;
        }
        .trend-row .trend-bar .fill {
            height: 100%; border-radius: 4px;
        }

        /* ===== 底部数据流 ===== */
        .bottom-ticker {
            position: fixed; bottom: 0; left:0; right:0;
            height: 36px;
            background: linear-gradient(0deg, rgba(3,6,15,0.98) 0%, rgba(3,6,15,0.8) 100%);
            border-top: 1px solid rgba(var(--accent-rgb),0.08);
            display: flex; align-items: center;
            padding: 0 20px;
            z-index: 100;
            overflow: hidden;
        }
        .ticker-label {
            font-size: 10px; font-weight: 700;
            color: var(--accent);
            background: rgba(var(--accent-rgb),0.1);
            padding: 3px 10px;
            border-radius: 4px;
            margin-right: 16px;
            flex-shrink: 0;
            display: flex; align-items: center; gap: 6px;
            animation: tickerPulse 2s infinite;
        }
        @keyframes tickerPulse {
            0%,100% { opacity:1; }
            50% { opacity:0.6; }
        }
        .ticker-track {
            display: flex; gap: 32px;
            animation: tickerScroll 60s linear infinite;
            white-space: nowrap;
        }
        .ticker-item {
            font-size: 11px; color: #5a8aaa;
            font-family: 'JetBrains Mono', monospace;
        }
        .ticker-item .val { color: var(--accent2); font-weight: 600; }
        .ticker-item .arrow-up { color: #00ffc8; }
        .ticker-item .arrow-down { color: #ff6b6b; }
        @keyframes tickerScroll {
            0% { transform: translateX(0); }
            100% { transform: translateX(-50%); }
        }

        /* ===== 中心标题 ===== */
        .center-overlay {
            position: fixed;
            top: 50%; left: 50%;
            transform: translate(-50%, -50%);
            pointer-events: none;
            z-index: 50;
            text-align: center;
            opacity: 0;
            transition: opacity 0.5s;
        }
        .center-overlay.show { opacity:1; }
        .center-overlay .main-kpi {
            font-family: 'Orbitron', monospace;
            font-size: clamp(48px, 6vw, 96px);
            font-weight: 900;
            background: linear-gradient(135deg, var(--accent), var(--accent2), #fff);
            -webkit-background-clip: text; -webkit-text-fill-color: transparent;
            text-shadow: none;
            line-height: 1;
            filter: drop-shadow(0 0 40px rgba(var(--accent-rgb),0.4));
        }
        .center-overlay .main-label {
            font-size: 14px; color: #4a7a9a;
            text-transform: uppercase; letter-spacing: 4px;
            margin-top: 8px;
        }

        /* ===== Tooltip ===== */
        .map-tooltip {
            position: fixed;
            background: linear-gradient(135deg, rgba(8,16,32,0.96), rgba(4,8,20,0.98));
            border: 1px solid rgba(var(--accent-rgb),0.2);
            border-radius: 10px;
            padding: 12px 16px;
            font-size: 12px;
            color: #c0d8f0;
            pointer-events: none;
            z-index: 200;
            backdrop-filter: blur(20px);
            box-shadow: 0 8px 40px rgba(0,0,0,0.5), 0 0 30px rgba(var(--accent-rgb),0.1);
            display: none;
            min-width: 180px;
            transition: opacity 0.15s;
        }
        .map-tooltip .tt-title {
            font-size: 14px; font-weight: 700;
            color: var(--accent);
            margin-bottom: 6px;
            display: flex; align-items: center; gap: 6px;
        }
        .map-tooltip .tt-row {
            display: flex; justify-content: space-between;
            padding: 2px 0;
            font-family: 'JetBrains Mono', monospace;
        }
        .map-tooltip .tt-row .tt-l { color: #4a7a9a; }
        .map-tooltip .tt-row .tt-v { color: #fff; font-weight: 600; }

        /* ===== 扫描环 ===== */
        .scan-ring {
            position: fixed;
            pointer-events: none;
            z-index: 5;
            border-radius: 50%;
            border: 1px solid rgba(var(--accent-rgb),0.06);
        }

        /* ===== 加载动画 ===== */
        .loading-overlay {
            position: fixed; inset:0; z-index: 1000;
            background: #03060f;
            display: flex; flex-direction: column;
            align-items: center; justify-content: center;
            gap: 20px;
            transition: opacity 0.8s;
        }
        .loading-overlay.hide { opacity:0; pointer-events:none; }
        .loading-ring {
            width: 60px; height: 60px;
            border: 2px solid rgba(var(--accent-rgb),0.1);
            border-top-color: var(--accent);
            border-radius: 50%;
            animation: spin 1s linear infinite;
        }
        @keyframes spin { to { transform: rotate(360deg); } }
        .loading-text {
            font-family: 'Orbitron', sans-serif;
            font-size: 12px;
            color: var(--accent);
            letter-spacing: 3px;
            animation: loadPulse 1.5s ease infinite;
        }
        @keyframes loadPulse {
            0%,100% { opacity:0.4; }
            50% { opacity:1; }
        }
        .loading-bar {
            width: 200px; height: 2px;
            background: rgba(255,255,255,0.05);
            border-radius: 2px;
            overflow: hidden;
        }
        .loading-bar .fill {
            height: 100%;
            background: linear-gradient(90deg, var(--accent), var(--accent2));
            border-radius: 2px;
            animation: loadBar 2s ease forwards;
        }
        @keyframes loadBar {
            0% { width: 0; }
            100% { width: 100%; }
        }

        /* 角标装饰 */
        .corner-deco {
            position: fixed;
            width: 60px; height: 60px;
            z-index: 60;
            pointer-events: none;
        }
        .corner-deco.tl { top:62px; left:8px; border-top:1px solid rgba(var(--accent-rgb),0.15); border-left:1px solid rgba(var(--accent-rgb),0.15); }
        .corner-deco.tr { top:62px; right:8px; border-top:1px solid rgba(var(--accent-rgb),0.15); border-right:1px solid rgba(var(--accent-rgb),0.15); }
        .corner-deco.bl { bottom:42px; left:8px; border-bottom:1px solid rgba(var(--accent-rgb),0.15); border-left:1px solid rgba(var(--accent-rgb),0.15); }
        .corner-deco.br { bottom:42px; right:8px; border-bottom:1px solid rgba(var(--accent-rgb),0.15); border-right:1px solid rgba(var(--accent-rgb),0.15); }

        /* 角色主题色 */
        body[data-role="ceo"] { --accent:#00f0ff; --accent2:#00d4ff; --accent-rgb:0,240,255; }
        body[data-role="cfo"] { --accent:#ffb400; --accent2:#ffd700; --accent-rgb:255,180,0; }
        body[data-role="coo"] { --accent:#00ffc8; --accent2:#00ffa3; --accent-rgb:0,255,200; }
        body[data-role="chro"] { --accent:#ff6b9d; --accent2:#ff9ec4; --accent-rgb:255,107,157; }
        body[data-role="intl"] { --accent:#a855f7; --accent2:#c084fc; --accent-rgb:168,85,247; }
        body[data-role="cto"] { --accent:#60a5fa; --accent2:#93c5fd; --accent-rgb:96,165,250; }

        /* 网格坐标 */
        .coord-display {
            position: fixed; bottom: 44px; right: 16px;
            font-family: 'JetBrains Mono', monospace;
            font-size: 10px; color: #2a5a7a;
            z-index: 70; pointer-events: none;
        }

body.heatmap-page {
    background: #08080e !important;
    color: #e0e0e0 !important;
}
