:root{--bg:#f4f5f7;--panel:#fff;--border:#e2e5ea;--text:#1f2430;--muted:#6b7280;--accent:#2d5bdb;--accent-ink:#fff;--ok:#2f9e44;--err:#e03131;--warn:#d9822b;--cell-empty:#edeef1;--radius:10px;--shadow:0 1px 2px #1018280f, 0 1px 3px #1018281a}*{box-sizing:border-box}body{background:var(--bg);color:var(--text);margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:14px;line-height:1.5}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}.app-shell{flex-direction:column;min-height:100vh;display:flex}.app-header{background:var(--panel);border-bottom:1px solid var(--border);z-index:10;align-items:center;gap:24px;padding:12px 24px;display:flex;position:sticky;top:0}.brand{color:var(--text);align-items:center;gap:8px;font-weight:700;display:flex}.brand:hover{text-decoration:none}.brand-dot{background:linear-gradient(90deg,#2d5bdb,#37b24d,#e03131);border-radius:50%;width:12px;height:12px;display:inline-block}.app-header nav{gap:8px;display:flex}.app-header nav a{color:var(--muted);border-radius:8px;padding:6px 12px;font-weight:600}.app-header nav a.active{background:var(--bg);color:var(--text)}.header-auth{align-items:center;gap:12px;margin-left:auto;display:flex}.user-chip{color:var(--muted);align-items:center;gap:8px;display:inline-flex}.app-main{flex:1;width:100%;max-width:1100px;margin:0 auto;padding:24px}.app-footer{color:var(--muted);border-top:1px solid var(--border);background:var(--panel);padding:16px 24px;font-size:13px}.footer-hw{color:var(--text);margin-bottom:2px;font-weight:600;display:block}.page-head{justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:16px;display:flex}.page-head h1{margin:4px 0 0;font-size:22px}.muted{color:var(--muted)}.small{font-size:12px}.num{text-align:right;font-variant-numeric:tabular-nums}.btn{background:var(--accent);color:var(--accent-ink);cursor:pointer;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;padding:8px 14px;font-size:14px;font-weight:600;display:inline-flex}.btn:hover{filter:brightness(1.05);text-decoration:none}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.ghost{color:var(--text);border-color:var(--border);background:0 0}.btn.small{padding:4px 10px;font-size:12px}.badge{background:var(--bg);border:1px solid var(--border);color:var(--muted);border-radius:999px;padding:1px 8px;font-size:12px;font-weight:600;display:inline-block}.badge.ok{color:var(--ok);background:#2f9e4414;border-color:#2f9e444d}.badge.err{color:var(--err);background:#e0313114;border-color:#e031314d}.badge.run{color:var(--accent);background:#2d5bdb1a;border-color:#2d5bdb4d}.banner{border-radius:8px;margin-bottom:16px;padding:10px 14px}.banner.error{color:var(--err);background:#e0313114;border:1px solid #e0313140}.banner.failures ul{margin:6px 0 0;padding-left:20px;font-size:13px}.banner.failures li{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.loading{text-align:center;color:var(--muted);padding:40px}.table{border-collapse:collapse;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);width:100%;box-shadow:var(--shadow);overflow:hidden}.table th,.table td{text-align:left;border-bottom:1px solid var(--border);vertical-align:top;padding:10px 12px}.table thead th{text-transform:uppercase;letter-spacing:.03em;color:var(--muted);background:#fafbfc;font-size:12px}.table tbody tr:last-child td{border-bottom:none}.table .sortable{cursor:pointer;-webkit-user-select:none;user-select:none}.row-selected{background:#2d5bdb0d}.phase-panel{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:16px 0;display:grid}.stat{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:14px}.stat-label{color:var(--muted);text-transform:uppercase;letter-spacing:.03em;font-size:12px}.stat-value{font-variant-numeric:tabular-nums;font-size:24px;font-weight:700}.stat-unit{color:var(--muted);margin-left:4px;font-size:13px;font-weight:500}.stat-hint{color:var(--muted);margin-top:2px;font-size:12px}.heatmap{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);max-width:100%;padding:20px;display:inline-block;overflow-x:auto}.hm-line{align-items:stretch;gap:6px;display:flex}.hm-line+.hm-line{margin-top:6px}.hm-yslot{flex:0 0 18px}.hm-axis-x{color:var(--muted);text-align:center;padding-bottom:4px;font-size:12px}.hm-ylabel{writing-mode:vertical-rl;color:var(--muted);white-space:nowrap;justify-content:center;align-items:center;font-size:12px;display:flex;transform:rotate(180deg)}.hm-cols,.hm-grid{flex:1;align-items:center;gap:6px;display:grid}.hm-corner{width:44px}.hm-col-label,.hm-row-label{color:var(--muted);text-align:center;font-size:12px;font-weight:600}.hm-row-label{text-align:right;padding-right:8px}.hm-cell{background:var(--cell-empty);color:#fffffff2;text-shadow:0 1px 1px #00000040;border-radius:8px;justify-content:center;align-items:center;width:64px;height:48px;font-size:11px;font-weight:700;display:flex}.hm-cell.pending{border:1px dashed var(--border)}.hm-cell.skipped{background:repeating-linear-gradient(45deg,#e9eaee,#e9eaee 5px,#dfe1e6 5px 10px)}.hm-cell.errored{background:repeating-linear-gradient(45deg,#e031312e,#e031312e 5px,#e0313152 5px 10px);border:1px solid #e031318c}.hm-err{color:var(--err);text-shadow:none;font-size:16px}.hm-cell.active{outline:3px solid var(--accent);outline-offset:1px;animation:1.2s ease-in-out infinite pulse}.timing-table{margin-top:16px}.timing-title{color:var(--muted);margin-bottom:6px;font-size:12px;font-weight:600}.table-scroll{overflow-x:auto}.table.compact th,.table.compact td{padding:5px 10px;font-size:13px}.table.compact tbody th{color:var(--muted);background:#fafbfc;font-weight:600}.table td.cell-fail{color:var(--err);background:#e031310f;font-weight:600}.table td.cell-skip{color:var(--muted)}.legend{color:var(--muted);align-items:center;gap:8px;margin-top:16px;font-size:12px;display:flex}.legend-bar{background:linear-gradient(90deg,#2d5bdb,#37b24d,#e03131);border-radius:999px;width:120px;height:10px;display:inline-block}.legend-metric{margin-left:8px;font-weight:600}.matrix-row{flex-wrap:wrap;align-items:flex-start;gap:16px;display:flex}.run-activity{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);max-width:560px;box-shadow:var(--shadow);flex:380px;padding:16px}.run-io{border-top:1px solid var(--border);margin-top:12px;padding-top:10px}.run-io>summary{cursor:pointer;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);font-size:12px;font-weight:700}.run-io-block{background:var(--bg);border:1px solid var(--border);white-space:pre-wrap;word-break:break-word;border-radius:6px;max-height:260px;margin:8px 0 0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.45;overflow:auto}.run-io-role{color:var(--accent);margin-bottom:4px;font-weight:700;display:block}.run-activity.stale{border-color:#e0313166}.run-activity-head{text-transform:uppercase;letter-spacing:.03em;color:var(--muted);align-items:center;gap:8px;font-size:12px;font-weight:700;display:flex}.run-activity-dot{background:var(--accent);border-radius:50%;width:9px;height:9px;animation:1.4s ease-in-out infinite pulse}.run-activity-dot.aggregating{background:var(--ok)}.run-activity-dot.finished{background:var(--ok);animation:none}.run-activity-phase{margin:10px 0 12px;font-weight:600}.run-activity-list{grid-template-columns:auto 1fr;gap:4px 12px;margin:0;font-size:13px;display:grid}.run-activity-list dt{color:var(--muted)}.run-activity-list dd{font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.run-activity-list dd.warn{color:var(--err);font-weight:600}.run-activity-warn{color:var(--err);margin:12px 0 0;font-size:12px}.hardware-field{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);flex-direction:column;gap:4px;margin-bottom:16px;padding:12px 16px;font-size:13px;font-weight:600;display:flex}.hardware-field input{border:1px solid var(--border);border-radius:6px;padding:8px 10px;font-size:14px;font-weight:400}.ribbon{gap:8px;margin:0 0 16px;padding:0;list-style:none;display:flex;overflow-x:auto}.ribbon-step{border:1px solid var(--border);border-radius:var(--radius);background:var(--panel);flex-direction:column;flex:1 0 160px;gap:2px;padding:10px 12px;display:flex;position:relative}.ribbon-step .ribbon-index{background:var(--bg);width:20px;height:20px;color:var(--muted);border-radius:50%;justify-content:center;align-items:center;font-size:12px;font-weight:700;display:inline-flex}.ribbon-model{white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.ribbon-status{color:var(--muted);font-size:12px}.ribbon-step.current{border-color:var(--accent);box-shadow:0 0 0 2px #2d5bdb26}.ribbon-step.done{background:#2f9e440f}.ribbon-step.done .ribbon-index{background:var(--ok);color:#fff}.ribbon-step.running .ribbon-index{background:var(--accent);color:#fff}.ribbon-step.error{background:#e031310f}.ribbon-step.error .ribbon-index{background:var(--err);color:#fff}.run-ticker{color:var(--accent);text-align:center;background:#2d5bdb1a;border-bottom:1px solid #2d5bdb40;padding:8px 24px;font-size:13px;font-weight:600;display:block}.run-ticker:hover{background:#2d5bdb29;text-decoration:none}.run-ticker-dot{background:var(--accent);border-radius:50%;width:8px;height:8px;margin-right:8px;animation:1.4s ease-in-out infinite pulse;display:inline-block}@keyframes pulse{0%,to{opacity:1}50%{opacity:.3}}.param-panel{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);margin-bottom:16px;padding:12px 16px}.param-panel>summary{cursor:pointer;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);font-size:13px;font-weight:700}.param-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:12px 0;display:grid}.param-grid label{color:var(--muted);flex-direction:column;gap:4px;font-size:12px;font-weight:600;display:flex}.param-grid input,.param-grid select{border:1px solid var(--border);color:var(--text);border-radius:6px;padding:6px 8px;font-size:14px;font-weight:400}.param-actions{justify-content:space-between;align-items:center;gap:12px;display:flex}.run-options{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);align-items:center;gap:20px;margin-bottom:16px;padding:14px 16px;display:flex}.run-options .check,.run-options .delay{align-items:center;gap:8px;font-weight:600;display:flex}.run-options .delay input{border:1px solid var(--border);border-radius:6px;width:64px;padding:6px 8px}.run-options .btn{margin-left:auto}.run-status-bar{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);flex-wrap:wrap;align-items:center;gap:20px;margin-bottom:16px;padding:12px 16px;display:flex}.progress{background:var(--bg);border:1px solid var(--border);border-radius:999px;flex:1;min-width:180px;height:20px;position:relative;overflow:hidden}.progress-fill{background:linear-gradient(90deg,#2d5bdb,#37b24d);transition:width .4s;position:absolute;inset:0 auto 0 0}.progress span{text-align:center;font-size:12px;font-weight:600;line-height:20px;display:block;position:relative}.run-auto{align-items:center;gap:14px;font-size:13px;font-weight:600;display:flex}.run-auto .check,.run-auto .delay{align-items:center;gap:6px;display:flex}.run-auto .delay input{border:1px solid var(--border);border-radius:6px;width:56px;padding:4px 6px}.run-next{align-items:center;gap:10px;display:flex}.countdown{color:var(--accent);font-weight:600}.run-actions{gap:8px;display:flex}.gate{text-align:center;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:60px 20px}.gate h1{margin-top:0}.gate .btn{margin-top:12px}.run-select{color:var(--muted);align-items:center;gap:8px;font-size:13px;display:flex}.run-select select{border:1px solid var(--border);border-radius:6px;padding:6px 8px}.view-tabs{border:1px solid var(--border);border-radius:8px;margin-bottom:16px;display:inline-flex;overflow:hidden}.view-tabs button{color:var(--muted);background:var(--panel);cursor:pointer;border:none;padding:6px 16px;font-size:13px;font-weight:600}.view-tabs button+button{border-left:1px solid var(--border)}.view-tabs button.active{background:var(--accent);color:var(--accent-ink)}.quadrant{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:16px}.quadrant-axes{gap:16px;margin-bottom:12px;display:flex}.quadrant-axes label{color:var(--muted);align-items:center;gap:6px;font-size:12px;font-weight:600;display:flex}.quadrant-axes select{border:1px solid var(--border);border-radius:6px;padding:4px 8px}.quadrant-svg{width:100%;height:auto}.quadrant-tag{fill:var(--muted);opacity:.55;text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:700}.quadrant-axis-title{fill:var(--muted);font-size:12px;font-weight:600}.quadrant-point{cursor:pointer}.quadrant-point-label{fill:var(--text);font-size:11px}.quadrant-point:hover .quadrant-point-label{font-weight:700}.quadrant-point:hover circle{stroke:var(--text);stroke-width:2px}
