html,body,#root{width:100%;min-height:100vh;margin:0}#root{display:block}:root{--bg:#f6f7f9;--panel:#fff;--border:#e1e4ea;--border-strong:#c9ced7;--text:#1b1f24;--muted:#6b727d;--accent:#1464dc;--accent-dim:#e8f0fd;--bad:#dc1e3c;--bad-dim:#fde6ea;--warn:#e68a1e;--good:#2a9b52;--shadow:0 1px 2px #0000000a, 0 4px 12px #0000000f}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.45}code{background:#f1f2f4;border-radius:3px;padding:1px 4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.app{max-width:1400px;margin:0 auto;padding:20px 24px 40px}.app-header{border-bottom:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:flex-end;gap:16px;padding-bottom:14px;display:flex}.brand{align-items:center;gap:14px;display:flex}.brand-mark{background:linear-gradient(135deg, var(--accent), #7b2cbf);border-radius:6px;width:28px;height:28px}.brand-title{letter-spacing:-.01em;font-size:16px;font-weight:600}.brand-sub{color:var(--muted);font-size:12px}.tz-badge{color:var(--muted);font-variant-numeric:tabular-nums;cursor:help;background:#ffffff0f;border-radius:4px;align-items:center;gap:4px;padding:1px 6px;display:inline-flex}.cron-health{font-variant-numeric:tabular-nums;cursor:help;border-radius:4px;align-items:center;gap:5px;padding:1px 6px;display:inline-flex}.cron-dot{border-radius:50%;flex-shrink:0;width:7px;height:7px;display:inline-block}.cron-health-healthy{color:#1a7f37;background:#1a7f371a}.cron-health-healthy .cron-dot{background:#1a7f37;animation:2.4s ease-out infinite cron-pulse;box-shadow:0 0 #1a7f3799}.cron-health-stale{color:#b35200;background:#b352001a}.cron-health-stale .cron-dot{background:#b35200}.cron-health-down{color:#c01030;background:#c010301f}.cron-health-down .cron-dot{background:#c01030}.cron-health-unknown{color:var(--muted);background:#ffffff0f}.cron-health-unknown .cron-dot{background:var(--muted)}@keyframes cron-pulse{0%{box-shadow:0 0 #1a7f378c}70%{box-shadow:0 0 0 6px #1a7f3700}to{box-shadow:0 0 #1a7f3700}}.tabs{gap:4px;display:flex}.tab{cursor:pointer;color:var(--muted);background:0 0;border:1px solid #0000;border-radius:6px;padding:6px 14px;font-size:13px}.tab:hover{color:var(--text);background:#eff1f4}.tab.on{background:var(--panel);color:var(--text);border-color:var(--border);box-shadow:var(--shadow)}.app-body{padding-top:22px}.empty{color:var(--muted);text-align:center;padding:40px}.hint{margin-top:8px;font-size:12px}.alert-banner{background:var(--bad-dim);color:#721220;border:1px solid #f5b8c2;border-radius:8px;align-items:center;gap:12px;margin-bottom:16px;padding:12px 16px;display:flex}.alert-dot{background:var(--bad);border-radius:50%;width:10px;height:10px;animation:1.6s infinite pulse;box-shadow:0 0 #dc1e3c80}@keyframes pulse{0%{box-shadow:0 0 #dc1e3c8c}70%{box-shadow:0 0 0 10px #dc1e3c00}to{box-shadow:0 0 #dc1e3c00}}.latest-grid{grid-template-columns:minmax(0,2.2fr) minmax(260px,1fr);gap:20px;display:grid}.latest-image{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;padding:12px}.latest-image img{border-radius:6px;width:100%;height:auto;display:block}.latest-ts{color:var(--muted);margin-bottom:8px;font-size:12px}.latest-side{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;flex-direction:column;gap:10px;padding:16px;display:flex}.summary-row{border-bottom:1px dashed var(--border);justify-content:space-between;padding:6px 0;display:flex}.summary-row:last-of-type{border-bottom:none}.summary-label{color:var(--muted)}.summary-value{font-variant-numeric:tabular-nums;font-weight:600}.tone-bad .summary-value{color:var(--bad)}.tone-warn .summary-value{color:var(--warn)}.tone-good .summary-value{color:var(--good)}.class-list{flex-direction:column;gap:10px;margin-top:8px;display:flex}.class-list-head{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px;font-size:11px}.class-row{grid-template-columns:12px 1fr 80px;align-items:center;gap:8px;font-size:12px;display:grid}.class-swatch{border-radius:3px;width:12px;height:12px}.class-name{text-transform:capitalize}.class-value{font-variant-numeric:tabular-nums;text-align:right;font-weight:600}.class-bar{background:#f1f2f4;border-radius:3px;grid-column:1/-1;height:4px;overflow:hidden}.class-bar-fill{opacity:.85;border-radius:3px;height:100%}.timeline-view{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;padding:16px}.timeline-controls{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;margin-bottom:12px;display:flex}.range-toggle{background:#f1f2f4;border-radius:7px;gap:4px;padding:3px;display:flex}.range-toggle button{cursor:pointer;color:var(--muted);background:0 0;border:none;border-radius:5px;padding:5px 12px;font-size:12px}.range-toggle button.on{background:var(--panel);color:var(--text);box-shadow:0 1px 2px #00000014}.series-toggle{flex-wrap:wrap;gap:6px;display:flex}.series-chip{border:1px solid var(--border);cursor:pointer;background:var(--panel);border-radius:16px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;display:inline-flex}.series-chip input{display:none}.series-chip:has(input:checked){background:var(--accent-dim);border-color:var(--accent)}.series-dot{border-radius:50%;width:10px;height:10px}.chart-wrap{margin-top:8px}.timeline-footer{color:var(--muted);justify-content:space-between;margin-top:6px;font-size:12px;display:flex}.anomaly-key{align-items:center;gap:6px;display:inline-flex}.anomaly-key-line{background:var(--bad);width:18px;height:2px;display:inline-block}.tooltip{background:var(--panel);border:1px solid var(--border-strong);box-shadow:var(--shadow);border-radius:6px;padding:8px 10px;font-size:12px}.tooltip-label{margin-bottom:4px;font-weight:600}.tooltip-row{grid-template-columns:10px 80px 1fr;align-items:center;gap:6px;display:grid}.tooltip-row strong{font-variant-numeric:tabular-nums;justify-self:end}.tooltip-dot{border-radius:50%;width:8px;height:8px}.gallery-view{grid-template-columns:260px minmax(0,1fr);gap:16px;min-height:600px;display:grid}.gallery-sidebar{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;max-height:720px;padding:10px;overflow-y:auto}.gallery-day{margin-bottom:14px}.gallery-day-head{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);background:var(--panel);z-index:1;padding:4px 6px;font-size:11px;position:sticky;top:-10px}.gallery-sidebar ul{margin:4px 0 0;padding:0;list-style:none}.gallery-item{cursor:pointer;border-radius:5px;grid-template-columns:60px auto 1fr auto;align-items:center;gap:8px;padding:5px 8px;font-size:12px;display:grid;position:relative}.gallery-item:hover{background:#f1f2f4}.gallery-item.is-selected{background:var(--accent-dim);color:var(--accent);font-weight:600}.gallery-time{font-variant-numeric:tabular-nums;color:var(--muted)}.gallery-item.is-selected .gallery-time{color:var(--accent)}.gallery-meta{color:var(--muted);font-variant-numeric:tabular-nums;text-align:right}.gallery-dot{background:var(--bad);border-radius:50%;width:8px;height:8px}.gallery-status{align-items:center;gap:2px;font-size:11px;line-height:1;display:inline-flex}.gallery-status-icon{opacity:1;font-size:11px}.gallery-status-icon.is-muted{opacity:.25}.gallery-progress-bar{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;align-items:stretch;gap:0;margin:6px 0 12px;padding:10px 12px;font-size:12px;display:flex}.gallery-progress-step{flex:1;grid-template-columns:22px 1fr;align-items:center;gap:8px;min-width:0;display:grid;position:relative}.gallery-progress-marker{color:#64748b;background:#e2e8f0;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:22px;height:22px;font-size:13px;font-weight:700;display:flex}.gallery-progress-step.is-done .gallery-progress-marker{color:#fff;background:#16a34a}.gallery-progress-step.is-suppressed .gallery-progress-marker{color:#fff;background:#94a3b8}.gallery-progress-step.is-muted .gallery-progress-marker{color:#cbd5e1;background:0 0}.gallery-progress-text{min-width:0}.gallery-progress-label{color:var(--text);font-weight:600}.gallery-progress-step.is-suppressed .gallery-progress-label{color:#475569}.gallery-progress-step.is-muted .gallery-progress-label{color:#94a3b8;font-weight:500}.gallery-progress-detail{color:var(--muted);margin-top:1px;font-size:11px;line-height:1.3}.gallery-progress-line{background:#cbd5e1;width:8px;height:2px;position:absolute;top:11px;right:-4px}.gallery-main{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;padding:16px}.gallery-head{flex-wrap:wrap;justify-content:space-between;gap:8px;margin-bottom:10px;display:flex}.gallery-meta-row{color:var(--muted);align-items:center;gap:14px;font-size:12px;display:flex}.gallery-meta-row strong{color:var(--text)}.gallery-image{border-radius:6px;width:100%;display:block}.pill-bad{background:var(--bad-dim);color:var(--bad);border:1px solid #f5b8c2;border-radius:10px;padding:1px 8px;font-size:11px}.compare-view{flex-direction:column;gap:16px;display:flex}.compare-pair{grid-template-columns:1fr 1fr;gap:16px;display:grid}.compare-side{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;padding:14px}.compare-picker{align-items:center;gap:8px;margin-bottom:10px;display:flex}.compare-label{background:var(--accent-dim);width:22px;height:22px;color:var(--accent);border-radius:50%;justify-content:center;align-items:center;font-size:11px;font-weight:700;display:inline-flex}.compare-picker select{border:1px solid var(--border);font:inherit;background:var(--panel);border-radius:6px;flex:1;padding:6px 10px}.compare-image{border-radius:6px;width:100%;display:block}.compare-meta{color:var(--muted);gap:14px;margin-top:8px;font-size:12px;display:flex}.compare-meta strong{color:var(--text)}.delta-row{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;padding:14px}.delta-title{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-bottom:8px;font-size:11px}.delta-cells{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;display:grid}.delta-cell{background:#f6f7f9;border-radius:6px;grid-template-columns:12px 1fr auto;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:grid}.delta-cell.tone-up{background:#e9f6ef}.delta-cell.tone-down{background:var(--bad-dim)}.delta-cell.tone-flat{background:#eef0f3}.delta-swatch{border-radius:2px;width:10px;height:10px}.delta-value{font-variant-numeric:tabular-nums;font-weight:600}.delta-cell.tone-up .delta-value{color:var(--good)}.delta-cell.tone-down .delta-value{color:var(--bad)}.delta-cell.tone-flat .delta-value{color:var(--muted)}.notif-btn{border:1px solid var(--border);font:inherit;cursor:pointer;color:var(--muted);background:#f6f7f9;border-radius:6px;align-items:center;gap:4px;margin-right:6px;padding:5px 10px;font-size:12px;display:inline-flex}.notif-btn:hover{background:#eef0f3}.notif-btn.on{background:var(--accent-dim);color:var(--accent);border-color:#b9d2f5}.notif-disabled{color:var(--muted);margin-right:6px;font-size:14px}.tab-badge{background:var(--accent);color:#fff;vertical-align:1px;border-radius:10px;min-width:18px;margin-left:4px;padding:0 5px;font-size:10px;line-height:16px;display:inline-block}.tab.on .tab-badge{color:var(--accent);background:#fff}.alerts-view{flex-direction:column;gap:12px;display:flex}.alerts-toolbar{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;flex-wrap:wrap;align-items:center;gap:16px;padding:10px 14px;font-size:12px;display:flex}.alerts-toolbar .alerts-count{color:var(--muted)}.alerts-toolbar select{border:1px solid var(--border);font:inherit;background:#fff;border-radius:6px;padding:4px 8px}.alerts-list{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.alert-row{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);cursor:pointer;border-radius:8px;grid-template-columns:16px 80px 60px 1fr auto;align-items:center;gap:12px;padding:10px 14px;font-size:13px;transition:background .1s;display:grid}.alert-row:hover{background:#fcfcfd}.alert-row.is-open{background:var(--accent-dim);border-color:#b9d2f5}.alert-swatch{border-radius:3px;width:12px;height:12px}.alert-class{text-transform:capitalize;font-weight:600}.alert-direction{font-variant-numeric:tabular-nums;color:var(--muted);font-size:12px}.alert-time{color:var(--muted);font-variant-numeric:tabular-nums;font-size:12px}.alert-summary{color:var(--muted);text-align:right;font-size:12px}.alert-detail{border-top:1px solid var(--border);grid-column:1/-1;grid-template-columns:minmax(0,2fr) minmax(0,1fr);gap:16px;margin-top:12px;padding-top:12px;display:grid}.alert-detail-grid{grid-template-columns:1fr 1fr;gap:4px 16px;font-size:12px;display:grid}.metric{border-bottom:1px dashed #eef0f3;justify-content:space-between;gap:8px;padding:3px 0;display:flex}.metric-label{color:var(--muted)}.metric-value{color:var(--text);text-align:right}.metric-value.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.alert-frame{flex-direction:column;gap:6px;display:flex}.alert-frame-label{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-size:11px}.alert-frame-img{border:1px solid var(--border);border-radius:6px;width:100%}.dedup-banner{background:#f0f9f1;border-left:4px solid #15803d;border-radius:8px;margin:8px 0 14px;padding:12px 16px;font-size:13px;line-height:1.55}.dedup-banner strong{color:#14532d}.dedup-banner .ok{color:#15803d;font-weight:700}.dedup-banner .no{color:#b91c1c;font-weight:700}.dedup-banner .note{opacity:.7;margin-top:6px;font-size:12px}.dedup-section{border-left:5px solid;border-radius:8px;margin:22px 0 10px;padding:14px 16px}.dedup-section.fire{background:#f0fdf4;border-left-color:#16a34a}.dedup-section.suppress{background:#fef2f2;border-left-color:#dc2626}.dedup-section.untested{background:#f1f5f9;border-left-color:#64748b}.dedup-section-title{letter-spacing:.2px;align-items:center;gap:10px;font-size:15px;font-weight:700;display:flex}.dedup-section-count{background:#00000012;border-radius:999px;padding:2px 10px;font-size:12px;font-weight:600}.dedup-section-subtitle{opacity:.78;margin-top:6px;font-size:12.5px;line-height:1.55}.alert-row.dedup-fire{border-left:4px solid #16a34a!important}.alert-row.dedup-suppress{opacity:.85;border-left:4px solid #dc2626!important}.dedup-strip{border-radius:5px;grid-column:1/-1;align-items:center;gap:8px;margin-top:8px;padding:7px 12px;font-size:12px;font-weight:600;line-height:1.5;display:flex}.dedup-strip.fire{color:#166534;background:#dcfce7;border:1px solid #bbf7d0}.dedup-strip.suppress{color:#991b1b;background:#fee2e2;border:1px solid #fecaca}.dedup-strip-label{text-transform:uppercase;letter-spacing:.5px;font-size:11px}.dedup-rolling-strip{flex-wrap:wrap;grid-column:1/-1;align-items:center;gap:8px;margin-top:6px;font-size:12px;display:flex}.dedup-rolling-pill{color:#78350f;background:#fef3c7;border:1px solid #fde68a;border-radius:999px;padding:3px 10px;font-weight:600}.dedup-rolling-pill strong{font-weight:700}.dedup-rolling-hint{color:var(--muted);font-size:11.5px}.dedup-detail{background:#00000005;border-left:3px solid;border-radius:4px;grid-column:1/-1;margin-top:12px;padding:12px 14px;font-size:13px;line-height:1.55}.dedup-detail.fire{border-left-color:#16a34a}.dedup-detail.suppress{border-left-color:#dc2626}.dedup-detail-title{margin-bottom:8px;font-weight:700}.dedup-detail-row{margin-bottom:6px}.dedup-detail-row em{color:var(--muted);font-style:normal;font-weight:600}.dedup-detail ul{margin:4px 0 0 18px;padding:0}.dedup-detail li{opacity:.9}.masks-view{flex-direction:column;gap:14px;display:flex}.masks-toolbar{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;flex-wrap:wrap;align-items:center;gap:18px;padding:10px 14px;font-size:13px;display:flex}.masks-toolbar label{cursor:pointer;align-items:center;gap:5px;display:inline-flex}.masks-frame-picker{color:var(--muted);align-items:center;gap:6px;margin-left:auto;font-size:12px;display:inline-flex}.masks-canvas-wrap{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;position:relative;overflow:hidden}.masks-image{width:100%;display:block}.masks-overlay{pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.masks-legend{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;flex-direction:column;gap:8px;padding:14px 16px;font-size:13px;display:flex}.legend-row{align-items:center;gap:10px;display:flex}.legend-swatch{border:2px solid;flex-shrink:0;width:18px;height:12px;display:inline-block}.masks-explainer{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;padding:14px 18px;font-size:13px}.masks-explainer h3{margin:0 0 8px;font-size:14px}.masks-explainer ol{margin:0 0 10px 18px;padding:0}.masks-explainer li{margin-bottom:4px}.masks-explainer p{color:var(--muted);margin:8px 0 0}.live-dot-wrap{color:var(--muted);align-items:center;gap:5px;font-size:12px;display:inline-flex}.live-dot{background:var(--good);border-radius:50%;width:7px;height:7px;animation:2s ease-in-out infinite live-pulse;box-shadow:0 0 #2a9b5299}@keyframes live-pulse{0%{box-shadow:0 0 #2a9b528c}70%{box-shadow:0 0 0 6px #2a9b5200}to{box-shadow:0 0 #2a9b5200}}.player-view{flex-direction:column;gap:14px;display:flex}.player-image-wrap{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;position:relative;overflow:hidden}.player-image{width:100%;display:block}.player-overlay-ts{color:#fff;font-variant-numeric:tabular-nums;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);background:#0f1116c7;border-radius:6px;align-items:center;gap:6px;padding:6px 12px;font-size:12px;display:flex;position:absolute;top:12px;left:12px}.player-controls{background:var(--panel);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:10px;flex-direction:column;gap:10px;padding:14px 16px;display:flex}.player-buttons{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.player-buttons button{border:1px solid var(--border);cursor:pointer;font:inherit;color:var(--text);background:#f6f7f9;border-radius:6px;min-width:38px;padding:7px 12px;font-size:14px}.player-buttons button:hover{background:#eef0f3}.player-buttons button.player-play{background:var(--accent);color:#fff;border-color:var(--accent);min-width:96px;font-weight:600}.player-buttons button.player-play:hover{background:#1255bd}.player-scrubber{cursor:pointer;appearance:none;background:0 0;width:100%;height:22px}.player-scrubber::-webkit-slider-runnable-track{background:var(--border-strong);border-radius:3px;height:6px}.player-scrubber::-moz-range-track{background:var(--border-strong);border-radius:3px;height:6px}.player-scrubber::-webkit-slider-thumb{appearance:none;background:var(--accent);border:2px solid #fff;border-radius:50%;width:16px;height:16px;margin-top:-5px;box-shadow:0 1px 3px #0003}.player-scrubber::-moz-range-thumb{background:var(--accent);border:2px solid #fff;border-radius:50%;width:16px;height:16px;box-shadow:0 1px 3px #0003}.player-meta{flex-wrap:wrap;justify-content:space-between;gap:12px;font-size:12px;display:flex}.player-meta strong{color:var(--text)}.player-meta-dim{color:var(--muted)}.player-stats{color:var(--muted);font-variant-numeric:tabular-nums}.player-bottom-row{color:var(--muted);flex-wrap:wrap;align-items:center;gap:16px;font-size:12px;display:flex}.player-speed{align-items:center;gap:4px;display:flex}.speed-btn{border:1px solid var(--border);font:inherit;cursor:pointer;color:var(--text);background:#f6f7f9;border-radius:4px;padding:3px 8px;font-size:12px}.speed-btn:hover{background:#eef0f3}.speed-btn.on{background:var(--accent);color:#fff;border-color:var(--accent)}.player-loop{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:4px;display:flex}.player-help{color:var(--muted);margin-left:auto;font-size:11px}@media (width<=820px){.latest-grid,.compare-pair,.gallery-view{grid-template-columns:1fr}.gallery-sidebar{max-height:300px}.player-help{display:none}}
