.dataset-heatmap-root{--hm-bg: #f8f9fb;--hm-surface: #fff;--hm-border: #ddd;--hm-border-light: #eee;--hm-text: #222;--hm-text2: #555;--hm-text3: #888;--hm-purple: #5b52cc;--hm-purple-light: #eeedfa;--hm-green: #1a8a42;--hm-green-light: #eef8f0;--hm-amber: #d97706;--hm-amber-light: #fefbe8;--hm-red: #dc3545;--hm-red-light: #fdf0f0;--hm-cyan: #0891b2;--hm-radius: 8px;--hm-font: "Noto Sans Thai", "IBM Plex Sans Thai", -apple-system, sans-serif;--hm-mono: "SF Mono", "Consolas", monospace;--hm-container: 1200px;--hm-cell-w: 22px;--hm-cell-gap: 2px;font-family:var(--hm-font);color:var(--hm-text);line-height:1.7;background:var(--hm-bg);--bg: var(--hm-bg);--surface: var(--hm-surface);--border: var(--hm-border);--border-light: var(--hm-border-light);--text: var(--hm-text);--text2: var(--hm-text2);--text3: var(--hm-text3);--purple: var(--hm-purple);--purple-light: var(--hm-purple-light);--green: var(--hm-green);--green-light: var(--hm-green-light);--amber: var(--hm-amber);--amber-light: var(--hm-amber-light);--red: var(--hm-red);--red-light: var(--hm-red-light);--cyan: var(--hm-cyan);--radius: var(--hm-radius);--font: var(--hm-font);--mono: var(--hm-mono)}.dataset-heatmap-root *,.dataset-heatmap-root *:before,.dataset-heatmap-root *:after{box-sizing:border-box}.dataset-heatmap-root .hm-topbar{position:sticky;top:0;z-index:200;background:var(--hm-surface);border-bottom:1px solid var(--hm-border);height:52px;display:flex;align-items:center}.dataset-heatmap-root .hm-topbar-inner{max-width:var(--hm-container);width:100%;margin:0 auto;padding:0 24px;display:flex;align-items:center;gap:14px}.dataset-heatmap-root .hm-topbar h1{font-size:15px;font-weight:700;margin:0}.dataset-heatmap-root .hm-topbar h1 span{color:var(--hm-purple)}.dataset-heatmap-root .hm-topbar .hm-sep{width:1px;height:20px;background:var(--hm-border)}.dataset-heatmap-root .hm-topbar .hm-subtitle{font-size:12px;color:var(--hm-text3)}.dataset-heatmap-root .hm-container{max-width:var(--hm-container);margin:0 auto;padding:20px 24px 100px}.dataset-heatmap-root .hm-zone{background:var(--hm-surface);border:1px solid #e2e8f0;border-radius:10px;box-shadow:0 1px 2px #0f172a0a;padding:14px;margin-bottom:12px}.dataset-heatmap-root .hm-zone-title{font-size:12px;font-weight:600;color:#475569;margin:0 0 10px 2px;letter-spacing:-.005em}.dataset-heatmap-root .hm-zone .summary{margin:0}.dataset-heatmap-root .hm-zone .month-overview{margin:12px 0 0}.dataset-heatmap-root .hm-zone .hm-tabs{margin:0 0 8px;border:none;background:transparent}.dataset-heatmap-root .hm-zone .toolbar{margin:0}.dataset-heatmap-root .summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(80px,1fr));gap:6px;margin:8px 0}.dataset-heatmap-root .scard{background:var(--hm-surface);border:1px solid var(--hm-border);border-radius:var(--hm-radius);padding:6px 8px;text-align:center;cursor:pointer;transition:all .15s}.dataset-heatmap-root .scard:hover{box-shadow:0 2px 8px #00000014}.dataset-heatmap-root .scard.active{border-color:var(--hm-purple);background:var(--hm-purple-light)}.dataset-heatmap-root .scard .n{font-size:16px;font-weight:700;line-height:1.1}.dataset-heatmap-root .scard .l{font-size:11px;color:var(--hm-text2);margin-top:2px}.dataset-heatmap-root .month-overview{display:flex;gap:4px;margin:12px 0;align-items:flex-end}.dataset-heatmap-root .mo-col{text-align:center;flex:1}.dataset-heatmap-root .mo-col .bar{height:50px;border-radius:3px;display:flex;flex-direction:column;justify-content:flex-end;overflow:hidden}.dataset-heatmap-root .mo-col .bar div{min-height:1px}.dataset-heatmap-root .mo-col .lbl{font-size:9px;color:var(--hm-text3);margin-top:2px}.dataset-heatmap-root .mo-col .num{font-size:10px;font-weight:600;color:var(--hm-text2)}.dataset-heatmap-root .hm-tabs{display:flex;gap:0;background:var(--hm-surface);border:1px solid var(--hm-border);border-radius:var(--hm-radius);overflow:hidden;margin:16px 0}.dataset-heatmap-root .hm-tab{border:none;background:none;padding:8px 16px;font-family:var(--hm-font);font-size:13px;font-weight:600;color:var(--hm-text2);cursor:pointer;white-space:nowrap}.dataset-heatmap-root .hm-tab:hover{background:var(--hm-purple-light)}.dataset-heatmap-root .hm-tab.active{background:var(--hm-purple);color:#fff}.dataset-heatmap-root .toolbar{display:flex;gap:8px;align-items:center;margin:8px 0;flex-wrap:wrap}.dataset-heatmap-root .toolbar input{width:250px;border:1px solid var(--hm-border);border-radius:var(--hm-radius);padding:8px 12px;font-family:var(--hm-font);font-size:13px;outline:none}.dataset-heatmap-root .toolbar input:focus{border-color:var(--hm-purple);box-shadow:0 0 0 3px #5b52cc1a}.dataset-heatmap-root .toolbar select{border:1px solid var(--hm-border);border-radius:var(--hm-radius);padding:8px 10px;font-family:var(--hm-font);font-size:12px;background:var(--hm-surface);outline:none}.dataset-heatmap-root .month-preset-btn{border:1px solid var(--hm-border);background:var(--hm-surface);border-radius:var(--hm-radius);padding:5px 8px;font-family:var(--hm-font);font-size:11px;cursor:pointer;color:var(--hm-text3)}.dataset-heatmap-root .month-preset-btn:hover{background:var(--hm-purple-light);border-color:var(--hm-purple);color:var(--hm-purple)}.dataset-heatmap-root .legend{display:flex;gap:14px;font-size:13px;align-items:center;margin:6px 0}.dataset-heatmap-root .legend span{display:inline-flex;align-items:center;gap:3px}.dataset-heatmap-root .blk{display:inline-block;width:11px;height:11px;border-radius:2px}.dataset-heatmap-root .blk-p{background:#22c55e}.dataset-heatmap-root .blk-z{background:#bbf7d0}.dataset-heatmap-root .blk-w{background:#facc15}.dataset-heatmap-root .blk-r{background:#ef4444}.dataset-heatmap-root .blk-n{background:#e5e7eb}.dataset-heatmap-root .heatmap-scroll{overflow-x:auto;overflow-y:visible;width:100%}.dataset-heatmap-root .grid-header,.dataset-heatmap-root .row{display:flex;align-items:center;gap:0;padding:3px 0;width:max-content;min-width:100%}.dataset-heatmap-root .grid-header{border-bottom:2px solid var(--hm-border);font-size:12px;font-weight:700;color:var(--hm-text2);position:sticky;top:0;z-index:5;background:var(--hm-surface,#fff)}.dataset-heatmap-root .row{border-bottom:1px solid #f0f0f5;background:var(--hm-surface,#fff)}.dataset-heatmap-root .row:hover{background:var(--hm-purple-light)}.dataset-heatmap-root .col-sel,.dataset-heatmap-root .col-fid,.dataset-heatmap-root .col-tsic,.dataset-heatmap-root .col-name,.dataset-heatmap-root .col-idx,.dataset-heatmap-root .col-qs,.dataset-heatmap-root .col-pct{position:sticky;background:inherit;z-index:2}.dataset-heatmap-root .col-sel{left:0;width:28px;flex-shrink:0;text-align:center;line-height:1;-webkit-user-select:none;user-select:none;display:flex;align-items:center;justify-content:center}.dataset-heatmap-root .col-fid{left:28px;width:120px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis}.dataset-heatmap-root .col-tsic{left:148px;width:72px;flex-shrink:0}.dataset-heatmap-root .col-name{left:220px;width:260px;flex-shrink:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:4px}.dataset-heatmap-root .col-idx{left:480px;width:36px;text-align:center;flex-shrink:0}.dataset-heatmap-root .col-qs{left:516px;width:52px;text-align:center;flex-shrink:0;font-weight:700;font-size:13px;border-radius:4px;margin:2px 0;cursor:pointer;transition:all .15s}.dataset-heatmap-root .col-qs:hover{box-shadow:0 1px 4px #0000001f}.dataset-heatmap-root .col-pct{left:568px;width:64px;text-align:right;flex-shrink:0;padding-right:4px;white-space:nowrap;border-right:1px solid var(--hm-border)}.dataset-heatmap-root .row .col-name .version-tag-icon{color:#7c3aed;margin-right:4px;font-size:11px;vertical-align:middle}.dataset-heatmap-root .col-cells{display:flex;gap:var(--hm-cell-gap);flex-shrink:0}.dataset-heatmap-root .col-btn{width:28px;flex-shrink:0;text-align:center;position:sticky;right:0;background:inherit;z-index:2;border-left:1px solid var(--hm-border)}.dataset-heatmap-root .row .col-fid,.dataset-heatmap-root .row .col-tsic{font-family:var(--hm-mono);font-size:13px;color:var(--hm-text)}.dataset-heatmap-root .row .col-name{font-size:13px;color:var(--hm-text)}.dataset-heatmap-root .grid-header .col-cells{gap:var(--hm-cell-gap)}.dataset-heatmap-root .grid-header .col-cells span{width:var(--hm-cell-w);text-align:center;font-size:10px;line-height:1.2;color:var(--hm-text2)}.dataset-heatmap-root .idx-badge{font-size:10px;font-weight:700;padding:2px 6px;border-radius:8px}.dataset-heatmap-root .idx-y{background:#eeedfa;color:#5b52cc}.dataset-heatmap-root .idx-n{background:#f0f0f5;color:#bbb}.dataset-heatmap-root .anomaly-badge-r{font-size:10px;padding:1px 4px;border-radius:3px;background:#fecaca;color:#dc2626;margin-left:4px}.dataset-heatmap-root .anomaly-badge-w{font-size:10px;padding:1px 4px;border-radius:3px;background:#fef3c7;color:#ca8a04;margin-left:4px}.dataset-heatmap-root .cell{width:var(--hm-cell-w);height:18px;border-radius:2px;cursor:pointer;transition:transform .1s;position:relative}.dataset-heatmap-root .cell:hover{transform:scale(1.3);z-index:5}.dataset-heatmap-root .cell-p{background:#22c55e}.dataset-heatmap-root .cell-z{background:#bbf7d0}.dataset-heatmap-root .cell-w{background:#facc15}.dataset-heatmap-root .cell-r{background:#ef4444}.dataset-heatmap-root .cell-n{background:#e5e7eb}.dataset-heatmap-root .btn-timeline{border:1px solid var(--hm-border);background:var(--hm-surface);border-radius:4px;padding:1px 6px;font-size:11px;cursor:pointer;color:var(--hm-text3);margin-left:4px;flex-shrink:0;line-height:1}.dataset-heatmap-root .btn-timeline:hover{background:var(--hm-purple-light);border-color:var(--hm-purple);color:var(--hm-purple)}.hm-tooltip{display:none;position:fixed;background:#222;color:#fff;padding:6px 10px;border-radius:6px;font-size:12px;font-family:Noto Sans Thai,IBM Plex Sans Thai,sans-serif;z-index:400;pointer-events:none;white-space:nowrap;box-shadow:0 4px 12px #0000004d}.hm-tooltip .tt-month{color:#aaa;font-size:10px}.hm-tooltip .tt-val{font-weight:700;font-size:14px}.hm-tooltip .tt-unit{color:#aaa;font-size:11px}.hm-tooltip .tt-loading{color:#888;font-style:italic}.hm-dialog-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#0006;z-index:2000;display:flex;justify-content:center;align-items:center}.hm-dialog{background:#fff;border-radius:12px;box-shadow:0 8px 32px #00000026;max-width:95vw;width:fit-content;min-width:400px;max-height:85vh;overflow:auto;padding:24px;font-family:Noto Sans Thai,IBM Plex Sans Thai,sans-serif}.hm-dialog h3{font-size:16px;font-weight:700;margin-bottom:12px;display:flex;justify-content:space-between;align-items:center}.hm-dialog h3 .close{background:none;border:none;font-size:22px;cursor:pointer;color:#888;padding:0 4px}.hm-dialog h3 .close:hover{color:#222}.hm-dialog table{width:100%;border-collapse:collapse;font-size:13px}.hm-dialog th{text-align:left;padding:6px 8px;color:#888;font-size:12px;font-weight:600;border-bottom:1px solid #ddd}.hm-dialog td{padding:6px 8px;border-bottom:1px solid #eee}.hm-dialog .mono{font-family:SF Mono,Consolas,monospace;font-size:12px}.hm-dialog .loading{text-align:center;padding:20px;color:#888}.hm-dialog .timeline-table{width:100%;border-collapse:collapse;font-size:12px}.hm-dialog .timeline-table th{background:#fafafa;padding:6px 4px;text-align:center;font-size:10px;color:#888;border-bottom:2px solid #ddd;white-space:nowrap}.hm-dialog .timeline-table td{padding:6px 4px;text-align:right;border-bottom:1px solid #eee;font-family:SF Mono,Consolas,monospace;font-size:12px}.hm-dialog .timeline-table td.empty{color:#ccc;background:#f3f4f6}.hm-dialog .timeline-table td.zero{color:#6cb585;background:#eef8f0}.hm-dialog .timeline-table td.has-val{color:#16a34a;background:transparent;font-weight:600}.hm-dialog .timeline-table td.anomaly{color:#dc3545;background:#fefbe8;font-weight:700;border:2px solid #d97706}.hm-dialog .timeline-table td.critical{color:#fff;background:#f87171;font-weight:700}.hm-dialog .qs-cards{display:flex;gap:12px;margin:16px 0}.hm-dialog .qs-card{flex:1;background:#f8f9fb;border:1px solid #ddd;border-radius:8px;padding:12px 10px;text-align:center}.hm-dialog .qs-card .qs-label{font-size:12px;font-weight:700;color:#555;margin-bottom:4px}.hm-dialog .qs-card .qs-val{font-size:24px;font-weight:700;line-height:1.2}.hm-dialog .qs-card .qs-weight{font-size:11px;color:#888;margin-top:2px}.hm-dialog .qs-card .qs-detail{font-size:11px;color:#555;margin-top:6px;padding-top:6px;border-top:1px solid #eee}.hm-dialog .qs-calc{background:#f8f9fb;border:1px solid #ddd;border-radius:8px;padding:10px 14px;font-size:12px;font-family:SF Mono,Consolas,monospace;color:#555;margin:12px 0}.hm-dialog .qs-checklist{margin:12px 0;font-size:13px;line-height:2}.hm-dialog .qs-checklist .qs-ok{color:#1a8a42}.hm-dialog .qs-checklist .qs-fail{color:#dc3545}.hm-dialog .qs-checklist .qs-warn{color:#d97706}.dataset-heatmap-root .pager{display:flex;gap:4px;align-items:center;justify-content:center;margin:16px 0;flex-wrap:wrap}.dataset-heatmap-root .pg-btn{border:1px solid var(--hm-border);background:var(--hm-surface);border-radius:4px;padding:4px 10px;font-size:12px;cursor:pointer;font-family:var(--hm-font);color:var(--hm-text2)}.dataset-heatmap-root .pg-btn:hover:not(:disabled){border-color:var(--hm-purple);color:var(--hm-purple);background:var(--hm-purple-light)}.dataset-heatmap-root .pg-btn:disabled{opacity:.4;cursor:default}.dataset-heatmap-root .pg-btn.pg-cur{background:var(--hm-purple);color:#fff;border-color:var(--hm-purple);font-weight:700}.dataset-heatmap-root .pg-dots{color:var(--hm-text3);font-size:12px;padding:0 2px}.dataset-heatmap-root .pg-info{font-size:11px;color:var(--hm-text3);margin-left:8px}.dataset-heatmap-root .loading{text-align:center;padding:20px;color:var(--hm-text3)}.dataset-heatmap-root .footer{text-align:center;padding:20px;font-size:12px;color:var(--hm-text3);border-top:1px solid #eee;margin-top:40px}@keyframes compute-stale-pulse{0%,to{box-shadow:0 0 #dc262680}50%{box-shadow:0 0 0 6px #dc262600}}:root{--sidebar-w: 240px;--topbar-h: 48px;--m-bg: #f4f6fa;--m-surface: #ffffff;--m-surface-2: #f8fafc;--m-surface-hover: #f1f5f9;--m-border: #e2e8f0;--m-border-strong: #cbd5e1;--m-fg: #0f172a;--m-fg-muted: #475569;--m-fg-dim: #64748b;--m-fg-subtle: #94a3b8;--m-accent: #2563eb;--m-accent-hover: #1d4ed8;--m-accent-soft: #eff6ff;--m-accent-fg: #ffffff;--m-shadow-sm: 0 1px 2px rgba(15, 23, 42, .04)}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%}body{font-family:Inter,Noto Sans Thai,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:var(--m-bg);color:var(--m-fg);font-size:13px;line-height:1.45;letter-spacing:-.005em;font-feature-settings:"cv11","ss01","ss03";-webkit-font-smoothing:antialiased}.sidebar{position:fixed;top:0;left:0;width:var(--sidebar-w);height:100vh;background:var(--m-surface);border-right:1px solid var(--m-border);overflow-y:auto;overflow-x:hidden;z-index:100;display:flex;flex-direction:column;padding:10px;gap:1px;transition:width .18s ease,padding .18s ease}.sidebar-toggle{position:fixed;top:22px;left:calc(var(--sidebar-w) - 12px);width:24px;height:24px;border-radius:50%;background:var(--m-surface);border:1px solid var(--m-border-strong);display:grid;place-items:center;cursor:pointer;color:var(--m-fg-dim);z-index:110;padding:0;box-shadow:0 1px 4px #0f172a1a;transition:left .18s ease,color .12s,border-color .12s,background .12s}.sidebar-toggle:hover{color:var(--m-accent);border-color:var(--m-accent);background:var(--m-accent-soft)}.sidebar-toggle:focus-visible{outline:2px solid var(--m-accent);outline-offset:1px}.sidebar-logo{display:flex;align-items:center;gap:8px;height:32px;margin-bottom:10px;padding:0 2px}.sidebar-logo-mark{width:32px;height:32px;display:grid;place-items:center;color:var(--m-accent);background:var(--m-accent-soft);border-radius:8px;flex-shrink:0}.sidebar-logo-text{display:flex;flex-direction:column;min-width:0}.sidebar-logo-text h2{font-size:14px;font-weight:620;letter-spacing:-.01em;color:var(--m-fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sidebar-logo-text small{font-size:10px;color:var(--m-fg-dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav-section{padding:4px 0}.nav-section-title{font-size:10px;font-weight:620;text-transform:uppercase;letter-spacing:.08em;color:var(--m-fg-subtle);padding:10px 10px 4px}.nav-item{height:34px;display:flex;align-items:center;gap:10px;padding:0 8px;color:var(--m-fg-dim);border-radius:6px;cursor:pointer;transition:background .12s,color .12s;text-decoration:none;font-size:12px;font-weight:520;margin:1px 0}.nav-item-icon{width:16px;height:16px;display:grid;place-items:center;flex-shrink:0}.nav-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.nav-item-badge{font-family:JetBrains Mono,ui-monospace,monospace;font-size:10px;padding:1px 6px;border-radius:9px;background:var(--m-surface-2);color:var(--m-fg-dim)}.nav-item:hover{background:var(--m-accent-soft);color:var(--m-accent)}.nav-item.active{background:var(--m-accent-soft);color:var(--m-accent);font-weight:620}.nav-item.active .nav-item-badge{background:var(--m-accent);color:var(--m-accent-fg)}.sidebar-spacer{flex:1}.sidebar-footer{margin-top:8px;padding:8px;border-top:1px solid var(--m-border);display:flex;align-items:center;gap:10px}.sidebar-avatar{width:28px;height:28px;background:var(--m-accent);color:var(--m-accent-fg);border-radius:50%;display:grid;place-items:center;font-family:JetBrains Mono,ui-monospace,monospace;font-size:11px;font-weight:620;flex-shrink:0}.sidebar-user-info{min-width:0}.sidebar-user-name{font-size:12px;font-weight:520;color:var(--m-fg);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sidebar-user-role{font-size:10px;color:var(--m-fg-dim);font-family:JetBrains Mono,ui-monospace,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}body[data-sidebar=collapsed]{--sidebar-w: 64px}.sidebar.collapsed{padding:10px 6px}.sidebar.collapsed .sidebar-logo{justify-content:center;padding:0}.sidebar.collapsed .sidebar-logo-text,.sidebar.collapsed .nav-section-title,.sidebar.collapsed .nav-item-label,.sidebar.collapsed .nav-item-badge,.sidebar.collapsed .sidebar-user-info{display:none}.sidebar.collapsed .nav-item{justify-content:center;padding:0;gap:0}.sidebar.collapsed .sidebar-footer{justify-content:center;padding:8px 0;gap:0}.topbar{position:fixed;top:0;left:var(--sidebar-w);right:0;height:var(--topbar-h);background:var(--m-surface);border-bottom:1px solid var(--m-border);display:flex;align-items:center;gap:12px;padding:0 16px;z-index:90;transition:left .18s ease}.topbar-crumbs{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--m-fg-dim)}.topbar-crumbs b{color:var(--m-fg);font-weight:520}.topbar-crumbs .sep{opacity:.5}.topbar-spacer{flex:1}.topbar-avatar{width:28px;height:28px;background:var(--m-accent);color:var(--m-accent-fg);border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:620;font-family:JetBrains Mono,ui-monospace,monospace}.main{margin-left:var(--sidebar-w);margin-top:var(--topbar-h);padding:16px;min-height:calc(100vh - var(--topbar-h));transition:margin-left .18s ease}@media(max-width:768px){.sidebar{display:none}.topbar{left:0}.main{margin-left:0}}
