/* 云识别控制台新增样式(style.css 迁自上游桌面调试台,逐字未改;这里只放四页新增的组件) */
.console-nav a b{letter-spacing:0}
.console-nav a{gap:6px}

/* 实时监看:会话网格 */
.grid-toolbar{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-bottom:14px;font-size:12px}
.grid-toolbar #grid-summary{margin-right:auto}
.grid-toolbar input[type=search]{width:260px}
.session-platforms{display:flex;flex-direction:column;gap:24px}
.session-platform-title{font-size:15px;margin:0 0 12px;color:var(--mint)}
.session-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,350px),1fr));gap:14px}
.session-platforms>.empty{padding:40px 0}
.session-card{display:grid;grid-template-columns:150px minmax(0,1fr);grid-template-rows:260px;gap:14px;border:1px solid var(--line);border-radius:11px;padding:12px;background:var(--panel);cursor:pointer;min-width:0}
.session-card:hover,.session-card:focus-visible{border-color:#406f63;outline:none}
.session-card.stale{border-color:#554b32}
.session-card.ended{opacity:.72}
.session-card-frame{position:relative;height:260px;border-radius:7px;background:#070c10;border:1px solid #1c2830;overflow:hidden}
.session-card-frame img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain}
.session-card-placeholder{position:absolute;inset:0;display:grid;place-items:center;color:#5d7480;font-size:11px;text-align:center;padding:8px}
.session-card-body{min-width:0;overflow:hidden;display:flex;flex-direction:column;gap:12px;font-size:12px;padding:8px 0}
.session-card-heading{display:flex;align-items:center;gap:6px;min-width:0}
.session-card-os{flex-shrink:0}
.session-card-model{min-width:0;font-size:15px;font-weight:650;color:#edf6f4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.session-card-connection{display:flex;gap:7px;align-items:center;margin-bottom:8px}
.session-card-hand{color:#c9dbe1;line-height:1.6;overflow-wrap:anywhere;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:6;overflow:hidden}
@media(max-width:760px){.session-grid{grid-template-columns:1fr}.session-card{grid-template-columns:110px minmax(0,1fr);grid-template-rows:200px}.session-card-frame{height:200px}.session-card-hand{-webkit-line-clamp:4}}

/* 实时监看:会话详情新增 */
.event-row.note.warn,.event-row.note.warning{border-left-color:#8a6f3c;color:#e6c78f}
.event-row.note.error{border-left-color:#8a4652;color:#f0acb7}
.session-hands{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.session-hand{display:inline-flex;gap:6px;align-items:center;padding:4px 8px;border:1px solid var(--line);border-radius:7px;background:#0f171d;color:#a5bcc4;text-decoration:none;font-size:11px}
.session-hand:hover{border-color:#406f63;color:#dfe9ed}
.session-hand .outcome-tag{font-size:9px;padding:1px 6px}
.recording-list .recording-actions a.button{padding:4px 9px;font-size:10px}

/* 牌局档案:筛选条 */
.filters{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:0 0 12px;padding:10px 13px;border:1px solid var(--line);border-radius:8px;background:#0f171d;font-size:12px}
.filters label{display:flex;gap:6px;align-items:center;color:var(--muted)}
.filters select{font-size:12px;padding:6px 8px;max-width:260px}
.filters .filters-note{margin-left:auto}
.recording-unavailable{color:var(--muted);font-size:10px}

/* 手牌回放:没有 key 时的手牌选择 */
.replay-picker{display:flex;flex-direction:column;gap:6px;max-height:520px;overflow:auto}
.replay-picker a{display:flex;gap:10px;align-items:center;padding:7px 10px;border:1px solid var(--line);border-radius:7px;background:#0f171d;color:#c9dbe1;text-decoration:none;font-size:12px}
.replay-picker a:hover{border-color:#406f63}
.replay-picker .outcome-tag{font-size:9px;padding:1px 6px}

/* 回归测试 */
.regress-grid{display:grid;grid-template-columns:minmax(280px,.7fr) minmax(0,2fr);gap:20px;align-items:start}
.regress-runs{display:flex;flex-direction:column;gap:6px;max-height:calc(100vh - 260px);overflow:auto}
.regress-run{display:flex;flex-direction:column;gap:5px;padding:9px 11px;border:1px solid var(--line);border-radius:8px;background:#0f171d;cursor:pointer;text-align:left;white-space:normal}
.regress-run:hover{border-color:#406f63}
.regress-run.selected{border-color:var(--mint);background:#13241f}
.regress-run b{font-size:12px;color:#edf6f4;overflow-wrap:anywhere}
.regress-counts{display:flex;gap:6px;flex-wrap:wrap}
.regress-detail{min-width:0;display:flex;flex-direction:column;gap:14px}
.regress-summary{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.regress-stat{display:flex;flex-direction:column;gap:3px;padding:9px 13px;border:1px solid var(--line);border-radius:8px;background:#0f171d;min-width:92px}
.regress-stat span{color:var(--muted);font-size:10px}
.regress-stat strong{font-size:20px;font-weight:600}
.regress-stat.same strong{color:var(--mint)}
.regress-stat.diff strong{color:var(--amber)}
.regress-stat.fail strong{color:var(--red)}
.regress-fingerprint{display:grid;grid-template-columns:120px 1fr;gap:6px 12px;margin:0;font-size:11px}
.regress-fingerprint dt{color:#718d98}
.regress-fingerprint dd{margin:0;color:#aabfc9;overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.regress-toolbar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;font-size:12px}
.regress-cases td{white-space:normal;overflow-wrap:anywhere;vertical-align:top}
.regress-cases tr.case-row{cursor:pointer}
.regress-cases tr.case-row:hover td{background:#14212a}
.regress-cases tr.case-row.selected td{background:#16302a}
.regress-cases td.status-same{color:var(--mint)}
.regress-cases td.status-diff{color:var(--amber)}
.regress-cases td.status-fail{color:var(--red)}
.regress-case-head{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.regress-diff td{white-space:normal;overflow-wrap:anywhere;text-align:left;font-size:10px;vertical-align:top}
.regress-diff th{text-align:left}
.regress-diff td.layer-识别层{color:var(--red)}
.regress-diff td.layer-逻辑层{color:var(--amber)}
.regress-briefs{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.regress-briefs pre{margin:0}
.regress-empty{padding:60px 0;text-align:center;color:var(--muted);font-size:14px;line-height:2}
@media(max-width:1170px){.regress-grid{grid-template-columns:1fr}.regress-runs{max-height:320px}.regress-briefs{grid-template-columns:1fr}}
/* 回归页:目录名截头显示(同 #archive-root);用例表左对齐、状态不折行;折叠标题靠左(.panel summary 默认两端对齐) */
#regress-root{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:right}
#regress-root.mono{max-width:360px;display:inline-block}
.panel .hand-fold summary{justify-content:flex-start}
.panel .hand-fold summary>span{margin-left:auto}
.regress-cases th,.regress-cases td{text-align:left;padding-right:12px}
.regress-cases td:first-child{max-width:none;color:#8aa3ad}
.regress-cases td:nth-child(2){min-width:190px}
.regress-cases td:nth-child(3),.regress-cases td:nth-child(4){white-space:nowrap}
.regress-cases td:last-child{white-space:nowrap;text-align:right;padding-right:0}
/* 上游 .recording-actions 是 flex;放在 <td> 上会让单元格脱离表格布局(行高、选中底色错位):表格里保持 table-cell */
td.recording-actions{display:table-cell;text-align:right;white-space:nowrap;vertical-align:top}
td.recording-actions>*+*{margin-left:6px}
/* 面板标题行:标题不折行;右侧说明(上游 flex-shrink:0)可能很长(录屏段号 · 时段 · 尺寸 · 来源、列表说明),让说明折行,
   而不是把中文标题挤成一列或溢出面板 */
.panel-top>h3{white-space:nowrap}
.panel-top>.muted{flex-shrink:1;min-width:0;text-align:right;overflow-wrap:anywhere}
.regress-stat small{font-size:9px;line-height:1.4}

/* 服务端版本独立于客户端 App 版本，四页共享。 */
.server-version-bar {display:flex; align-items:center; flex-wrap:wrap; gap:10px 20px; padding:12px 24px; border-bottom:1px solid var(--border, #29343c);}
.server-version-bar label {display:flex; align-items:center; gap:10px; min-width:0;}
.server-version-bar select {max-width:100%; min-width:240px;}
@media (max-width:600px) {.server-version-bar {padding:12px 16px;} .server-version-bar label {width:100%;} .server-version-bar select {flex:1; min-width:0;}}

/* 实时监看详情的顶部按钮栏多了「打开牌局档案 ↗」:顶栏允许随内容长高(窄屏折行时不再被裁到顶栏上沿之外),
   会话下拉收窄,1440 宽仍放得下一行。style.css 是上游原样,不改它。 */
@media (min-width:761px) {.topbar{height:auto;min-height:81px;padding-top:8px;padding-bottom:8px} .top-actions #session-select{max-width:150px}}

/* 账号登录:顶栏显示当前账号 */
.auth-who{color:var(--muted);white-space:nowrap;align-self:center}

/* 登录页 */
.login-page{min-height:100vh;display:grid;place-items:center;background:#0b1014}
.login-shell{width:min(400px,100% - 32px);padding:40px 0}
.login-brand{display:flex;gap:12px;align-items:center;color:#edf6f4;font-size:16px;font-weight:650;margin-bottom:22px}
.login-brand small{display:block;color:var(--muted);font-size:10px;letter-spacing:.14em;font-weight:600;margin-top:2px}
.login-card{display:flex;flex-direction:column;gap:8px;padding:26px 24px;border:1px solid var(--line);border-radius:12px;background:var(--panel)}
.login-card h1{margin:0;font-size:20px;color:#edf6f4}
.login-card p{margin:0 0 10px;font-size:12px}
.login-card label{color:#aec3ba;font-size:12px;margin-top:6px}
.login-card input{width:100%;color:#cad7df;background:#0e161c;border:1px solid var(--line);border-radius:7px;padding:10px}
.login-card button{margin-top:14px;padding:11px}
.login-notice{color:var(--red);font-size:12px;margin-top:6px}
.login-foot{font-size:11px;margin-top:16px;text-align:center}
.login-foot code{color:#cad7df}

/* 牌局档案(上游 3c074a3c 同步):人工改判标签与按钮、整手记录维度行、耗时表四街与虚线分组、版本成功率曲线。
   style.css 是上游原样不改(其中 .timing-table{min-width:1460px} 由下面覆盖成四街的宽度)。 */
.override-tag{display:inline-block;padding:4px 7px;border-radius:6px;font-size:11px;font-weight:700;line-height:1.2;color:#d7c8ff;background:#2a2140;border:1px solid #7b64c4;white-space:nowrap;flex-shrink:0}
.override-tag.big{font-size:12px;padding:6px 10px}
.outcome-override{padding:4px 10px;font-size:11px;border-radius:6px;white-space:nowrap}
.outcome-head .outcome-override{margin-left:auto}
.outcome-notes.record-check.invalid{color:var(--red)}
.outcome-notes.record-check.incomplete{color:var(--amber)}
.timing-table{min-width:2660px}
.timing-table .sub-start{border-left:1px dashed #2e3d46}
.trend-chart{margin-top:8px}.trend-svg{display:block}.trend-grid{stroke:#24313a;stroke-width:1}.trend-axis{fill:var(--muted);font-size:10px}.trend-line{fill:none;stroke:#4f8f86;stroke-width:1.5}.trend-point{cursor:pointer}.trend-point circle{fill:#78e2c1;stroke:#0f171d;stroke-width:1.5}.trend-point.few circle{fill:#0f171d;stroke:#78e2c1}.trend-point.current circle{fill:#edbd73;stroke:#edbd73}.trend-point.current.few circle{fill:#0f171d}.trend-point:hover circle{stroke:#dfe9ed}.trend-value{fill:#dfe9ed;font-size:10px}.trend-point.current .trend-value{fill:#edbd73}.trend-label{fill:#b9cbd2;font-size:10px}.trend-count{fill:var(--muted);font-size:9px}.trend-table{margin-top:8px;max-width:760px}.trend-table td{padding:6px 8px;white-space:nowrap}.trend-table tr.trend-version{cursor:pointer}.trend-table tr.trend-version:hover td{background:#152028}.trend-table tr.current td{color:var(--mint)}.trend-table td.few{color:var(--amber)}

/* 鱿鱼 tag 与详情：两页共用，独立于橙色暴击局标签。 */
.squid-tag{display:inline-block;padding:4px 8px;border-radius:6px;font-size:11px;font-weight:700;line-height:1.2;color:#9ce8e0;background:#123735;border:1px solid #449e95;white-space:nowrap;flex-shrink:0}
.squid-tag.big{font-size:12px;padding:4px 10px;margin-left:10px;vertical-align:middle}td>.squid-tag{margin-left:6px}
.squid-info{margin:12px 0;padding:12px;background:#102827;border:1px solid #2b5f59;border-radius:8px;min-width:0}
.squid-heading{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.squid-fields{margin-top:10px}.squid-fields dd{overflow-wrap:anywhere}

/* 程序座位几何：随采样帧保存，档案、实时详情与回放共用。 */
.seat-geometry-controls{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:10px 0;font-size:11px}
.seat-geometry-controls label{display:flex;align-items:center;gap:6px}
.seat-geometry-controls select{padding:5px;font-size:11px}
.seat-geometry-note{flex-basis:100%;color:#9bc3d3;font-size:11px;line-height:1.6;overflow-wrap:anywhere}
.seat-frame-strip{grid-template-columns:repeat(auto-fill,minmax(min(100%,280px),1fr))}
.seat-frame-thumb{margin:0;max-width:100%}
.seat-frame-thumb canvas{display:block;width:100%;height:auto;background:#080e12;border-radius:6px}
.seat-frame-thumb .seat-geometry-note{max-width:300px;margin-top:6px}
.recognition-inspector{margin-top:12px;border-top:1px solid #304752;padding-top:12px}
.recognition-toolbar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;font-size:12px}
.recognition-toolbar select{max-width:100%;font-size:11px;padding:6px}
.recognition-summary{font-size:11px;line-height:1.7;color:#9bc3d3;margin:10px 0}
.recognition-issues{display:grid;gap:6px;max-height:240px;overflow:auto}
.recognition-issue{width:100%;text-align:left;white-space:normal;line-height:1.6;font-size:12px;padding:9px;border:1px solid #64502c;border-radius:6px;background:#30291b;color:#f4cd8b}
.recognition-issue.error{background:#39232a;border-color:#85505d;color:#ffbbc2}
.recognition-issue small{display:block;color:inherit;font-size:10px;overflow-wrap:anywhere}
.recognition-details{margin-top:12px}.recognition-details summary{font-size:12px;cursor:pointer}
.recognition-elements{max-height:360px;overflow:auto;display:grid;gap:6px;margin-top:10px}
.recognition-element{display:grid;gap:5px;white-space:normal;text-align:left;font-size:11px;line-height:1.5;overflow-wrap:anywhere}
.recognition-element.selected{border-color:white;background:#274453}.recognition-element span,.recognition-element small{color:#99b6c6}
.recognition-state{font-size:11px;line-height:1.7}.recognition-state h4{font-size:12px;margin:14px 0 7px}
.recognition-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:5px 10px}
.recognition-seats{display:grid;gap:6px;margin:10px 0}.recognition-seats>div{padding:6px;background:#172831;border-radius:4px}
.recognition-timeline-controls{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:12px 0}.recognition-timeline-controls input{min-width:100px;flex:1}
.archive-recognition-canvas{display:block;max-width:100%;width:420px;height:auto;max-height:75vh;object-fit:contain;margin:auto}
/* 数据直接上图；完整来源保留在点击详情里。 */
.recognition-verbose{display:flex;align-items:center;gap:4px;color:#98b4c1;font-size:11px}
.recognition-issue small{display:none}
.recognition-issue:hover small,.recognition-issue:focus small{display:block}
.recognition-state>summary{margin:12px 0;cursor:pointer;font-size:12px;color:#a9c4cf}
.diagnostic-row{display:grid;grid-template-columns:minmax(280px,1fr) minmax(330px,1.15fr) minmax(340px,1.1fr);gap:20px;margin-top:20px;align-items:start}
.diagnostic-row .logs-column{grid-column:1}
.recognition-visual-wrap{aspect-ratio:9/16;max-height:72vh;position:relative}
.recognition-visual-wrap canvas{position:absolute;inset:0;width:100%;height:100%;object-fit:contain}
.recognition-visual-wrap #recognition-motion{pointer-events:none;z-index:2}
.recognition-visual-wrap #recognition-visual{z-index:1}
.recognition-geometry-controls{margin:0 0 10px;flex-wrap:wrap}
.recognition-geometry-controls select{padding:4px 7px;font-size:11px;margin-left:4px}
@media(max-width:1170px){.diagnostic-row{grid-template-columns:1fr 1fr}.diagnostic-row .logs-column{grid-column:1}.recognition-column{grid-column:1/-1}}
@media(max-width:760px){.diagnostic-row{display:flex;flex-direction:column}.diagnostic-row .logs-column{width:100%}.recognition-column{width:100%}}
