:root { color: #1f2933; background: #eef2f5; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; line-height: 1.4; } * { box-sizing: border-box; } body { margin: 0; min-width: 320px; } button, input, select { font: inherit; } .dashboard { width: min(1440px, 100%); margin: 0 auto; padding: 28px; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-bottom: 22px; } .eyebrow { margin: 0 0 4px; color: #607080; font-size: 0.78rem; font-weight: 700; letter-spacing: 0; text-transform: uppercase; } h1, h2, h3, p { margin: 0; } h1 { color: #12202f; font-size: clamp(2rem, 4vw, 3.5rem); letter-spacing: 0; } h2 { color: #182736; font-size: 1.08rem; } h3 { color: #233242; font-size: 0.94rem; } .refresh-button { min-height: 42px; border: 1px solid #0f6b8f; border-radius: 6px; padding: 0 18px; color: #ffffff; background: #0f6b8f; cursor: pointer; } .refresh-button:disabled { cursor: default; opacity: 0.6; } .filters { display: grid; grid-template-columns: 120px minmax(200px, 1fr) minmax(200px, 1fr) minmax(180px, 0.8fr); gap: 14px; margin-bottom: 18px; } .filters label { display: grid; gap: 6px; color: #425466; font-size: 0.82rem; font-weight: 700; } .filters input, .filters select { width: 100%; min-height: 40px; border: 1px solid #c8d2dc; border-radius: 6px; padding: 0 10px; color: #17212b; background: #ffffff; } .notice { border: 1px solid #c8d2dc; border-radius: 6px; margin-bottom: 16px; padding: 12px 14px; background: #ffffff; } .notice.error { border-color: #d94f4f; color: #8a1f1f; background: #fff4f4; } .cards { display: grid; grid-template-columns: repeat(3, minmax(120px, 1fr)) minmax(260px, 1.8fr); gap: 12px; margin-bottom: 18px; } .stat, .panel, .trend-card { border: 1px solid #d5dde5; border-radius: 8px; background: #ffffff; } .stat { min-height: 96px; padding: 16px; } .stat span, .panel-header span, .trend-card p { color: #607080; font-size: 0.82rem; } .trend-card p { display: grid; gap: 2px; } .stat strong { display: block; margin-top: 8px; color: #132232; font-size: 1.9rem; } .stat.wide strong { font-size: 1rem; } .stat small { display: block; margin-top: 8px; color: #607080; } .panel { margin-bottom: 18px; overflow: hidden; } .panel-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; border-bottom: 1px solid #d5dde5; padding: 14px 16px; } .table-wrap { overflow-x: auto; } table { width: 100%; min-width: 1260px; border-collapse: collapse; } th, td { border-bottom: 1px solid #e6ebf0; padding: 11px 12px; text-align: left; white-space: nowrap; } th { color: #536171; font-size: 0.78rem; text-transform: uppercase; } td { color: #1b2836; font-size: 0.9rem; } .cohort-cell { display: grid; gap: 2px; } .cohort-cell strong, .trend-card p span { color: #1b2836; font-size: 0.78rem; font-weight: 700; } .cohort-cell span, .trend-card p span + span { color: #607080; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; font-size: 0.72rem; } .badge { display: inline-flex; align-items: center; justify-content: center; min-width: 52px; border-radius: 999px; padding: 4px 9px; font-size: 0.75rem; font-weight: 800; text-transform: uppercase; } .badge.pass { color: #166534; background: #dcfce7; } .badge.fail { color: #991b1b; background: #fee2e2; } .badge.muted { opacity: 0.78; } .source-badge { display: inline-flex; align-items: center; border-radius: 999px; padding: 4px 9px; color: #1f2933; background: #e8edf2; font-size: 0.75rem; font-weight: 800; white-space: nowrap; } .source-scheduled_main { color: #065f46; background: #d1fae5; } .source-pr { color: #1d4ed8; background: #dbeafe; } .source-local { color: #7c2d12; background: #ffedd5; } .empty { padding: 28px 16px; color: #607080; } .empty.full-width { grid-column: 1 / -1; } .trend-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 12px; padding: 14px; } .trend-card { display: grid; gap: 10px; min-width: 0; padding: 14px; } .trend-chart { width: 100%; min-height: 190px; color: #0f6b8f; overflow: visible; } .chart-shell { position: relative; display: grid; gap: 10px; min-width: 0; } .axis-line { stroke: #9aa8b6; stroke-width: 1; } .grid-line { stroke: #e4e9ee; stroke-width: 1; } .axis-label { fill: #667789; font-size: 10px; } .point-pass { fill: #0f6b8f; outline: none; } .point-fail { fill: #d94f4f; outline: none; } .point-hit-area { fill: transparent; outline: none; cursor: pointer; } .point-marker { pointer-events: none; } .point-hit-area:focus + .point-marker { stroke: #17212b; stroke-width: 2; } .hover-tooltip { position: absolute; z-index: 2; display: grid; gap: 2px; min-width: 132px; max-width: 190px; border: 1px solid #22313f; border-radius: 6px; padding: 8px 10px; color: #ffffff; background: #17212b; font-size: 0.78rem; pointer-events: none; transform: translate(10px, -100%); box-shadow: 0 10px 24px rgb(15 23 42 / 22%); } .hover-tooltip strong { font-size: 0.9rem; } .point-tooltip { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 10px; border: 1px solid #d5dde5; border-radius: 6px; padding: 10px; color: #263646; background: #f8fafc; font-size: 0.78rem; } .point-tooltip strong { grid-column: 1 / -1; color: #132232; font-size: 0.9rem; } .point-tooltip a { color: #0f6b8f; font-weight: 700; } .empty-chart { display: grid; min-height: 96px; place-items: center; color: #72808f; background: #f5f7f9; } @media (max-width: 760px) { .dashboard { padding: 18px; } .topbar, .panel-header { align-items: flex-start; flex-direction: column; } .refresh-button { width: 100%; } .filters, .cards { grid-template-columns: 1fr; } }