/* 系统管理：服务运行（状态、常驻服务、模型、计算任务、采集水位）、算法运行（月度指标、逐日误差、交付日）、版本与接口 */
.opg{grid-template-columns:minmax(0,1fr) minmax(0,1.2fr)}   /* 运行状态：数据状态 | 算法输入（与交易策略系统同一比例） */
.opg2{grid-template-columns:minmax(0,1.35fr) minmax(0,1fr)}
.rtg{grid-template-columns:minmax(0,1.45fr) minmax(0,1fr)}
@media (max-width:1280px){.opg,.opg2,.rtg{grid-template-columns:minmax(0,1fr)}}

.opsum .st{display:flex;align-items:center;gap:8px;padding:12px 14px 2px;font-size:15px}
.opsum .st i{width:10px;height:10px;border-radius:50%;background:var(--tx3);box-shadow:0 0 0 3px color-mix(in srgb,var(--tx3) 18%,transparent)}
.opsum .st.ok i{background:var(--ok);box-shadow:0 0 0 3px var(--ok-soft)}.opsum .st.warn i{background:var(--wa);box-shadow:0 0 0 3px var(--wa-soft)}.opsum .st.err i{background:var(--er);box-shadow:0 0 0 3px var(--er-soft)}
.opsum .st b{font-weight:650}
.opsum .kv2 b.er{color:var(--er-tx)}.opsum .kv2 b.wa{color:var(--wa-tx)}

.opsv{display:grid;padding:2px 0 4px}
.opsv .r{display:grid;grid-template-columns:minmax(0,1fr) auto 76px;gap:10px;align-items:center;padding:6px 14px;border-bottom:1px solid color-mix(in srgb,var(--ln) 55%,transparent);font-size:12px}
.opsv .r:last-child{border-bottom:0}
.opsv .nm{display:flex;align-items:center;gap:7px;white-space:nowrap;min-width:0}
.opsv .nm i{width:8px;height:8px;border-radius:50%;background:var(--ok);flex:none}.opsv .nm i.stale{background:var(--wa)}
.opsv .nm small{color:var(--tx3);font-size:10.5px}
.opsv .ag{font-family:var(--mono);font-size:11px;color:var(--tx2);text-align:right;white-space:nowrap}.opsv .ag.wa{color:var(--wa-tx)}

.opmd .m{padding:9px 14px 10px;border-bottom:1px solid color-mix(in srgb,var(--ln) 55%,transparent)}.opmd .m:last-child{border-bottom:0}
.opmd .l{display:flex;align-items:center;gap:8px;font-size:12.5px;min-width:0}.opmd .l b{font-weight:650;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.opmd .l span{color:var(--tx2);white-space:nowrap}
.opmd .kv2{padding:6px 0 0}
.opmd code{display:block;font-family:var(--code);font-size:10.5px;color:var(--tx3);margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.opjb{display:grid;font-size:11.5px}
.opjb .r{display:grid;grid-template-columns:70px minmax(0,1fr) 54px 96px minmax(120px,.9fr);gap:0 12px;align-items:center;padding:5px 14px;border-bottom:1px solid color-mix(in srgb,var(--ln) 55%,transparent)}
.opjb .r.hd{background:var(--sf2);color:var(--tx2);font-size:11px}
.opjb .mono{font-family:var(--mono);font-size:11px}
.opjb .ub{display:grid;grid-template-columns:minmax(0,1fr) 56px;gap:6px;align-items:center}.opjb .ub b{text-align:right;font-weight:600;font-variant-numeric:tabular-nums}
.opjb .err{grid-column:2/-1;color:var(--er-tx);font-size:10.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.opsrc{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:6px;padding:10px 12px 12px}
.opsrc .s{border:1px solid var(--ln);border-radius:var(--r1);padding:5px 8px 6px;display:flex;flex-direction:column;gap:1px;font-size:10.5px;color:var(--tx2);background:var(--sf);min-width:0}
.opsrc .s .nm{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--tx);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.opsrc .s .nm i{width:7px;height:7px;border-radius:50%;background:var(--ok);flex:none}
.opsrc .s.old{background:var(--sf2)}.opsrc .s.old .nm i{background:var(--wa)}
.opsrc .s b{color:var(--tx);font-weight:600;font-variant-numeric:tabular-nums}

/* 已发布交付日：按月的日历格，净值着色，点开进单日分析 */
#rt-cal{padding:10px 12px 12px}
#rt-cal .dc{min-height:52px;text-decoration:none}
#rt-cal .dc small{font-size:10px;color:var(--tx3)}
#rt-cal .dc .v.gain{color:var(--gain-tx)}#rt-cal .dc .v.loss{color:var(--loss-tx)}
#rt-cal .dc .v.na{color:var(--tx3);font-weight:500;font-size:11px}
#rt-cal a.dc:hover{border-color:var(--br)}

/* 接口弹窗：按层级整理的字段结构 */
.shape{width:100%;border-collapse:collapse;font-size:11.5px}
.shape th{text-align:left;font-weight:500;color:var(--tx2);background:var(--sf2);padding:5px 10px;border-bottom:1px solid var(--ln)}
.shape td{padding:4px 10px;border-bottom:1px solid color-mix(in srgb,var(--ln) 55%,transparent);white-space:nowrap;max-width:420px;overflow:hidden;text-overflow:ellipsis}
.shape td:first-child{font-family:var(--mono);color:var(--tx)}.shape td .ind{color:var(--tx3)}
.shape td.t{color:var(--tx2)}.shape td.x{font-family:var(--mono);color:var(--tx3)}

/* 算法运行：单次运行的检查项、分时段与训练两图并排、运行记录表、输入与数据的隔离清单 */
.rtg2{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}
@media (max-width:1280px){.rtg2{grid-template-columns:minmax(0,1fr)}}
.rtchk{display:flex;flex-wrap:wrap;gap:5px;align-items:center;padding:0 14px 12px;font-size:11px;color:var(--tx2)}
.rtchk .lb{color:var(--tx3);margin-right:2px}
.srcs.rtr{min-width:1060px}
.srcs.rtr .r{grid-template-columns:150px 50px 42px minmax(120px,1fr) minmax(120px,1fr) 46px 56px 50px 56px 86px 86px;cursor:pointer}
.srcs.rtr .r:hover{background:var(--hov)}.srcs.rtr .r.hd{cursor:default}.srcs.rtr .r.hd:hover{background:var(--sf2)}
.srcs.rtr .r.on{background:var(--br-soft)}
.srcs.rtr .r b{color:var(--tx);font-weight:650}
.srcs.rtr .gain{color:var(--gain-tx)}.srcs.rtr .loss{color:var(--loss-tx)}
.rtq{display:flex;flex-wrap:wrap;gap:5px;padding:0 14px 12px;font-size:11px;color:var(--tx2);align-items:center}
.rtq .lb{color:var(--tx3);margin-right:2px}
.kv2.one{grid-template-columns:minmax(0,1fr)}
.kv2.one .i b{min-width:0;overflow:hidden;text-overflow:ellipsis;text-align:right}
/* 页首状态条 */
.opbar{display:flex;align-items:center;flex-wrap:wrap;gap:6px 18px;margin-top:10px;padding:9px 14px;border:1px solid var(--ln);border-radius:var(--r2);background:var(--sf);box-shadow:var(--sh1);font-size:12.5px;color:var(--tx2)}
.opbar>i{width:9px;height:9px;border-radius:50%;background:var(--ok,#1baf7a);flex:none}.opbar.warn>i{background:var(--wa)}.opbar.err>i{background:var(--er,#e34948)}
.opbar.warn{border-color:color-mix(in srgb,var(--wa) 45%,var(--ln));background:color-mix(in srgb,var(--wa) 7%,var(--sf))}
.opbar>b{color:var(--tx);font-size:13px}.opbar span b{color:var(--tx);font-weight:650}.opbar em{font-style:normal;color:var(--wa-tx);font-weight:650}
.opbar a{margin-left:auto;color:var(--br-h);text-decoration:none;font-size:12px}.opbar a:hover{text-decoration:underline}

/* ============ 2026-10-12 按链路重排：每节一句结论、几个大号数字，再放图 ============ */
.slead{margin:8px 2px 0;font-size:13px;line-height:1.6;color:var(--navy);font-weight:500}
.stg .n .kbar{position:relative}.stg .n .kbar u{position:absolute;top:0;bottom:0;width:2px;margin-left:-1px;background:var(--tx);text-decoration:none}
.stg .n .ksp{position:relative;height:24px;margin:4px 0 0}.stg .n .ksp .spw{position:absolute;inset:0}.stg .n .ksp .spark{display:block;width:100%;height:100%}
.stg .n .v .gain{color:var(--gain-tx)}.stg .n .v .loss{color:var(--loss-tx)}
/* 状态条：更新时间靠右 */
.opbar .at{margin-left:auto;font-size:11.5px;color:var(--tx3)}
/* 发布情况：本月每天一格 */
.pubc{flex:1;display:grid;grid-template-columns:repeat(7,minmax(0,1fr));grid-auto-rows:minmax(34px,1fr);gap:4px;padding:8px 12px 12px}
.pubc .wd{font-size:10.5px;color:var(--tx3);text-align:center;align-self:end;line-height:16px}
.pubc .pd{display:flex;flex-direction:column;justify-content:center;gap:0;padding:3px 7px;border-radius:4px;border:0;background:#f3f5f9;box-shadow:inset 0 0 0 1px #e6eaf1;font-variant-numeric:tabular-nums;min-width:0}
.pubc .pd b{font-size:12px;font-weight:600;color:var(--tx)}.pubc .pd small{font-size:10px;color:var(--tx2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pubc .pd.p{background:color-mix(in srgb,var(--ok) 30%,#fff);box-shadow:none}.pubc .pd.p b{color:var(--tx)}
.pubc .pd.m{background:color-mix(in srgb,var(--wa) 32%,#fff);box-shadow:none}.pubc .pd.m b{color:var(--wa-tx)}
.pubc .pd.c b{color:var(--tx3);font-weight:500}
.pubc .pd.f{background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.7) 0 2px,transparent 2px 4px)}.pubc .pd.f b{color:var(--tx3);font-weight:500}
#c-pub{display:flex;flex-direction:column}
/* 第七节：常驻服务与计算任务两列；服务被拦下的原因写在行尾 */
.opg2c{grid-template-columns:minmax(0,1fr) minmax(0,1.3fr)}
@media (max-width:1280px){.opg2c{grid-template-columns:minmax(0,1fr)}}
.opsv .r .rs{grid-column:1/-1;font-size:10.5px;color:var(--tx3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:-2px}
.srcs.rtr{min-width:0}
.srcs.rtr .holtag{font-style:normal;font-size:10px;font-weight:650;border-radius:3px;padding:0 4px;margin-left:4px;background:linear-gradient(90deg,#ff8a4c,#e8532a);color:#fff}
details.sysd{margin-top:16px}details.sysd>summary{margin-top:0}
.opcol{display:flex;flex-direction:column;gap:10px;min-width:0}.opcol>.card:last-child{flex:1}
.srcs.rtr .r{grid-template-columns:206px 52px 48px minmax(130px,1fr) minmax(84px,.7fr) 76px 56px minmax(130px,1fr)}
.srcs.rtr .r>span:first-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#c-rt-train{display:flex;flex-direction:column}#c-rt-train .bd{flex:1;display:flex;flex-direction:column}#c-rt-train .ch{flex:1;height:auto!important;min-height:270px}
/* 数据接口卡片：路径写全，不出省略号 */
#rt-apis,#apis{grid-template-columns:repeat(auto-fill,minmax(318px,1fr))}
/* ============ 2026-10-13：不出现胶囊形状（圆角小于自身高度的一半：≥16px 用 4px，8–15px 用 2–3px，4–7px 的细条用 1px） ============ */
#rt-run,#runsel{border-radius:4px}
.funnel .fs .fb,.funnel .fs .fb i{border-radius:0 1px 1px 0}
.wmb{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:10px;font-size:11.5px;color:var(--wa-tx)}   /* 算法输入：拦下原因（缺数说明），在时间条与图例之间 */

/* 发布与运行（2026-10-19 第五轮）：发布情况按所选时段逐周排开，时段外的格子留空；单次运行到发布申报建议为止，五步 */
.pubc .pd.o{background:transparent;box-shadow:none}
/* 单次运行五步竖排（与左侧发布情况等高）：序号、步骤、数值、说明、进度条各一列 */
.funnel.f5{grid-template-columns:minmax(0,1fr);row-gap:0;padding:4px 14px 6px}
.funnel.f5 .fs{display:grid;grid-template-columns:16px 104px minmax(96px,auto) minmax(0,1fr) minmax(80px,140px);align-items:center;gap:0 12px;padding:10px 0;border-left:0;border-bottom:1px solid var(--ln)}
.funnel.f5 .fs:last-child{border-bottom:0}
.funnel.f5 .fs b{font-size:19px}
.funnel.f5 .fs .cl{overflow:hidden;text-overflow:ellipsis}
.funnel.f5 .fs .fb{margin-top:0}
.pubc{grid-auto-rows:minmax(30px,1fr)}
/* ============ 2026-10-22 第二轮（H1–H4）：与交易策略系统“数据与状态”同一套写法 ============ */
/* 数据状态（与交易策略系统逐项核对一致）：结论行 .opsum .st（数据正常 / 数据待更新 / 数据需要检查）+ 服务告警小字 .opal；
   上游系统与接口 .ups：表头 .uh 与每行 .ur 同一四列网格（名称与所在系统 | 方式 | 最近成功 | 状态），失败原因单独一行 .why，本地库同步 .ur.sync 放最后；下面 .kv2 两行 */
.opal{padding:3px 14px 0 32px;font-size:12px;line-height:1.6;color:var(--tx2)}.opal b{color:var(--tx);font-weight:600;font-variant-numeric:tabular-nums}.opal em{font-style:normal;color:var(--wa-tx);font-weight:600}.opal .nw{white-space:nowrap}
.opsum{padding-bottom:4px}
.ups{padding:8px 14px 2px}
.ups .uh,.ups .ur{display:grid;grid-template-columns:minmax(0,1fr) 68px 82px 56px;column-gap:12px;align-items:center}
.ups .uh{padding-bottom:5px;border-bottom:1px solid var(--ln);font-size:10.5px;color:var(--tx3);letter-spacing:.06em;white-space:nowrap}
.ups .uh span:last-child{text-align:right}
.ups .ur{padding:6px 0;border-bottom:1px dashed color-mix(in srgb,var(--ln) 80%,transparent);font-size:11.5px;color:var(--tx2)}
.ups .ur.sync{border-top:1px solid var(--ln);border-bottom:0;margin-top:-1px}
.ups .n{min-width:0}.ups .n b{display:block;font-size:12px;font-weight:600;color:var(--navy);line-height:1.35}
.ups .n small{display:block;font-size:10.5px;color:var(--tx3);line-height:1.45;overflow-wrap:anywhere}
.ups .m{white-space:nowrap}.ups .t{color:var(--tx);font-variant-numeric:tabular-nums;white-space:nowrap}
.ups .s{display:inline-flex;align-items:center;justify-content:flex-end;gap:5px;font-weight:600;white-space:nowrap;color:var(--tx2)}
.ups .s i{width:7px;height:7px;border-radius:50%;background:var(--tx3);flex:none}
.ups .s.ok i{background:var(--ok)}.ups .s.warn{color:var(--wa-tx)}.ups .s.warn i{background:var(--wa)}.ups .s.err{color:var(--er-tx)}.ups .s.err i{background:var(--er)}
.ups .why{grid-column:1/-1;font-size:11px;color:var(--er-tx);line-height:1.4;padding-top:2px}
/* 数据截至、有数据的输入：与策略系统数据状态卡的 .kv2 同一写法（单列、虚线分行）；本系统别处的 .kv2 是两列，这里单独限定 */
#c-st .kv2{display:grid;grid-template-columns:minmax(0,1fr);gap:0;padding:4px 14px 10px;font-size:11.5px}
#c-st .kv2 .i{display:flex;justify-content:space-between;gap:12px;padding:5px 0;border-bottom:1px dashed color-mix(in srgb,var(--ln) 80%,transparent);color:var(--tx2);min-width:0;white-space:normal}
#c-st .kv2 .i:last-child{border-bottom:0}
#c-st .kv2 .i span{color:var(--tx2)}#c-st .kv2 .i b{color:var(--tx);font-weight:600;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* 算法输入：与交易策略系统“数据来源”同一块（行与时间条在 pre.css 的 .dsrc） */
.srcw{padding:10px 14px 12px}
.srcw .dsrc{row-gap:11px;grid-template-columns:minmax(150px,220px) minmax(0,1fr) minmax(76px,max-content)}   /* 系统管理卡片较宽（与策略系统数据页同一列宽）；浮层里仍是 118–172px | 1fr | 72px */
.dsrc .tx{font-size:11.5px;color:var(--tx2);font-variant-numeric:tabular-nums}
/* 逐日有效性（原“数据日历”）：组可折叠（默认收起，＋/－ 小方框），组标题“有效 x / 共 y”，行内按日着色；色阶与图例同交易策略系统 */
.vmx{padding:4px 8px 10px}
.vg + .vg{border-top:1px solid color-mix(in srgb,var(--ln) 70%,transparent)}
.vgh{display:flex;align-items:center;gap:8px;width:100%;border:0;background:transparent;border-radius:4px;padding:7px 8px;text-align:left;color:var(--tx);font:inherit;font-size:13px;font-weight:600;cursor:pointer;transition:background var(--d1) var(--ease)}
.vgh:hover{background:var(--hov)}
.vgh .sp{flex:1}
.vgh small{font-size:11.5px;font-weight:400;color:var(--tx3);white-space:nowrap;font-variant-numeric:tabular-nums}
.vgh small b{font-weight:600;color:var(--tx2)}
.vgh small b.wa{color:var(--wa-tx)}.vgh small b.er{color:var(--er-tx)}
.vgh .pm{flex:none;width:18px;height:18px;border-radius:4px;--fc:var(--tx2);--fv:12px;
  background:linear-gradient(var(--fc),var(--fc)) center/12px 1.4px no-repeat,linear-gradient(var(--fc),var(--fc)) center/1.4px var(--fv) no-repeat,var(--bg2);transition:background-size 160ms cubic-bezier(.2,.8,.2,1)}
.vgh:hover .pm{--fc:var(--fr)}
.vg.open > .vgh .pm{--fv:0px}
.vgb{padding:0 0 8px}
.vr{display:grid;align-items:center;gap:0 2px;min-height:21px;font-size:11px}
.vr > span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:6px}
.vr.vh{background:var(--sf);color:var(--tx3);font-size:10px;padding:4px 0 3px;border-bottom:1px solid var(--ln);align-items:end}
.vr.vh .dh{text-align:center;padding:0;position:relative;font-family:var(--mono);font-size:9.5px;line-height:1.1;overflow:visible;align-self:start}
.vr.vh .dh small{display:block;font-size:8.5px;line-height:10px;color:var(--tx3);font-weight:400;white-space:nowrap;font-family:var(--sans)}
.vr.vh .dh.weekend{color:var(--br)}.vr.vh .dh.holiday{color:#e8532a;font-weight:700}.vr.vh .dh.now{color:#fff;background:var(--tx);border-radius:3px}
.vr .nm{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:6px;min-width:0;white-space:normal;line-height:1.35;padding:2px 6px 2px 0}
.vr .nm b{color:var(--tx);font-weight:600;overflow-wrap:anywhere}
.vr .nm small{font-size:10px;color:var(--tx3);white-space:nowrap}
.vr .lt{font-family:var(--mono);font-size:10.5px;color:var(--tx2)}
.vr .rt{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;padding-right:2px}.vr .rt.ok{color:var(--ok-tx)}.vr .rt.wa{color:var(--wa-tx)}.vr .rt.er{color:var(--er-tx)}
.vr i.c,.vlg i.c{display:block;height:14px;border-radius:2px;background:var(--bg2)}
.vr i.c.f,.vlg i.c.f{background:color-mix(in srgb,var(--ok) 30%,#fff)}.vr i.c.p,.vlg i.c.p{background:color-mix(in srgb,var(--ok) 14%,#fff)}
.vr i.c.w,.vlg i.c.w{background:color-mix(in srgb,var(--wa) 32%,#fff)}.vr i.c.z,.vlg i.c.z{background:color-mix(in srgb,var(--er) 26%,#fff)}
.vr i.c.e,.vlg i.c.e{background:#f3f5f9;box-shadow:inset 0 0 0 1px #e6eaf1}
.vr i.c.fut,.vlg i.c.fut{background-image:repeating-linear-gradient(135deg,rgba(255,255,255,.7) 0 2px,transparent 2px 4px)}
.vlg{display:flex;gap:2px;flex-wrap:wrap;font-size:11px;color:var(--tx2)}
.vlg .lg-it{cursor:default;padding:1px 6px}.vlg .lg-it:hover{background:none}
.vlg i.c{width:12px;height:12px}
/* ============ 2026-10-22 晚 N7：节假日与日历同一斜纹（--holx、--holx-k 在 pre.css） ============
   发布情况：没有发布的节假日为白底（不再按休市灰色），节假日不计入统计时叠同一斜纹，发布了的在绿色底上叠斜纹；运行记录里不计入统计的节假日行同一斜纹 */
.pubc .pd.h{background-color:var(--sf);box-shadow:inset 0 0 0 1px var(--ln)}.pubc .pd.h b{color:var(--tx3);font-weight:500}
.pubc .pd.holx,.srcs.rtr .r.holx{background-image:var(--holx)}
.vlg i.c.hx{background:var(--sf) var(--holx-k);box-shadow:inset 0 0 0 1px var(--ln)}
