/* SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p7-web-probe-sentinel-dashboard. */ /* Responsibility: Responsive visual foundation for the web-probe sentinel dashboard. */ :root { color-scheme: light; --bg: #f6f7f9; --panel: #ffffff; --panel-soft: #f0f5f7; --text: #18212f; --muted: #667085; --border: #d9e0e7; --blue: #2563eb; --green: #059669; --amber: #b7791f; --red: #c2413d; --violet: #6d5bd0; --shadow: 0 8px 24px rgb(30 41 59 / 8%); } * { box-sizing: border-box; } html, body { min-height: 100%; } body { margin: 0; background: var(--bg); color: var(--text); font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; letter-spacing: 0; } button, select, input { font: inherit; } .sentinel-shell { width: min(1440px, 100%); margin: 0 auto; padding: 24px; } .sentinel-topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 18px; } .sentinel-title { display: flex; align-items: center; min-width: 0; gap: 12px; } .sentinel-mark { width: 36px; height: 36px; border-radius: 8px; background: linear-gradient(135deg, rgb(37 99 235 / 90%), rgb(5 150 105 / 88%)), #2563eb; box-shadow: inset 0 0 0 1px rgb(255 255 255 / 30%); flex: 0 0 auto; } h1, h2, p { margin: 0; } h1 { font-size: 22px; line-height: 1.18; font-weight: 700; } h2 { font-size: 15px; line-height: 1.3; font-weight: 700; } #sentinel-subtitle, .panel-subtitle, .metric-card small { color: var(--muted); } #sentinel-subtitle { margin-top: 3px; font-size: 13px; overflow-wrap: anywhere; } .sentinel-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; } .status-pill, .severity-pill { display: inline-flex; align-items: center; min-height: 28px; padding: 4px 10px; border-radius: 999px; border: 1px solid transparent; font-size: 12px; font-weight: 700; text-transform: uppercase; white-space: nowrap; } .status-healthy, .status-operational { background: #e8f7ef; color: var(--green); border-color: #b9e6cc; } .status-warning, .status-degraded, .severity-warning, .severity-amber { background: #fff6df; color: var(--amber); border-color: #f2d893; } .status-blocked, .status-error, .severity-red, .severity-critical, .severity-error { background: #fdecea; color: var(--red); border-color: #f4bbb7; } .status-idle, .severity-info, .severity-unknown { background: #eef2f7; color: #526071; border-color: #d8e0ea; } .refresh-toggle { display: inline-flex; align-items: center; gap: 6px; min-height: 34px; padding: 4px 8px; color: #344054; font-size: 13px; white-space: nowrap; } .refresh-toggle input { width: 16px; height: 16px; } select, .icon-button { min-height: 34px; border: 1px solid var(--border); border-radius: 8px; background: #ffffff; color: #1f2937; } select { padding: 0 28px 0 10px; } .icon-button { padding: 0 12px; font-size: 13px; font-weight: 700; cursor: pointer; } .icon-button:disabled { cursor: progress; opacity: 0.62; } .banner { margin-bottom: 14px; padding: 10px 12px; border-radius: 8px; border: 1px solid var(--border); font-size: 13px; overflow-wrap: anywhere; } .banner-muted { background: #edf4ff; color: #1d4ed8; border-color: #bfd5ff; } .banner-danger { background: #fff0ee; color: var(--red); border-color: #f2c0bc; } .metric-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 14px; } .metric-card, .panel { background: var(--panel); border: 1px solid var(--border); border-radius: 8px; box-shadow: var(--shadow); } .metric-card { min-height: 112px; padding: 14px; display: grid; align-content: space-between; gap: 8px; } .metric-label { color: var(--muted); font-size: 12px; font-weight: 700; text-transform: uppercase; } .metric-card strong { min-width: 0; font-size: 24px; line-height: 1.1; overflow-wrap: anywhere; } .metric-card small { font-size: 12px; line-height: 1.35; overflow-wrap: anywhere; } .dashboard-grid { display: grid; grid-template-columns: minmax(0, 1.55fr) minmax(320px, 0.9fr); gap: 14px; } .panel { min-width: 0; overflow: hidden; } .panel-header { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 52px; padding: 14px 16px; border-bottom: 1px solid var(--border); } .table-frame { width: 100%; overflow: auto; } .runs-table { width: 100%; min-width: 760px; border-collapse: collapse; } .runs-table th, .runs-table td { padding: 11px 12px; border-bottom: 1px solid #edf0f4; text-align: left; vertical-align: top; font-size: 13px; } .runs-table th { color: var(--muted); background: #f8fafc; font-size: 11px; font-weight: 800; text-transform: uppercase; } .runs-table tr { cursor: pointer; } .runs-table tr:hover { background: #f7fbff; } .mono { font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace; font-size: 12px; overflow-wrap: anywhere; } .finding-list { display: grid; gap: 10px; padding: 12px; } .finding-item { display: grid; gap: 8px; padding: 12px; border: 1px solid #e3e8ef; border-radius: 8px; background: var(--panel-soft); } .finding-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .finding-title { min-width: 0; font-weight: 700; overflow-wrap: anywhere; } .finding-meta, .detail-grid { color: var(--muted); font-size: 12px; line-height: 1.45; } .detail-panel { margin-top: 14px; } .detail-content { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; padding: 14px 16px 16px; } .detail-block { min-width: 0; padding: 2px 0 2px 12px; border-left: 3px solid #dbe5ee; } .detail-block strong { display: block; margin-bottom: 8px; font-size: 12px; text-transform: uppercase; color: var(--muted); } .empty-state { padding: 28px 16px; color: var(--muted); text-align: center; font-size: 13px; } [hidden] { display: none !important; } @media (max-width: 980px) { .sentinel-shell { padding: 16px; } .sentinel-topbar { align-items: flex-start; flex-direction: column; } .sentinel-toolbar { justify-content: flex-start; width: 100%; } .metric-grid, .dashboard-grid, .detail-content { grid-template-columns: 1fr; } .metric-card { min-height: 96px; } } @media (max-width: 560px) { .sentinel-shell { padding: 12px; } h1 { font-size: 19px; } .sentinel-toolbar > * { flex: 1 1 auto; } .status-pill { justify-content: center; } .icon-button { width: 100%; } .panel-header { align-items: flex-start; flex-direction: column; } }