- 基于第七版稳定基线(be647bb)重构 admin 前端为模块化架构:
tokens.css(设计token唯一来源) + shared.css(公共组件) + core.js(状态/API/事件总线/轮询/路由)
+ main.js(入口) + layouts/{flowline,ledger,strata}.{css,js}(三方向独立布局)
+ layouts/shared.js(三方向共用数据视图与操作绑定)
- 三个页面(A装配线/B值班台账/C地层剖面)通过 ?layout= 查询参数独立可达、可刷新、可前进后退导航,
共享登录态、真实后端数据(overview/sources/jobs/batches/datasets/audit)、错误处理与主题
- 六大板块(总览/数据源/调度任务/盘后发布/数据集/审计)在三个方向均可查看与操作(探测/触发/回滚/补数)
- 修正健康状态语义:CircuitBreaker closed/half_open/open 与适配器 ok/error/empty/unconfigured/unknown
统一归一化为 ok/warn/error/unconfigured/unknown 供三方向一致展示
- 事件驱动动效:A 水平接力光梭、B 行级高亮+实时调用跑马灯、C 纵向贯穿光点+分层标记;
统一使用 transform/opacity/WAAPI,避免 transition:all,支持 prefers-reduced-motion 静态降级
- 修复响应式布局在 1024/1280 断点因 CSS Grid 默认 min-width:auto 被内部宽表格撑爆轨道的问题
- 修复布局切换/前进后退时残留 setTimeout 回调在 unmount 后访问 null root 导致的报错(mounted 标志位+
safeTimeout+统一清理定时器)
- 自测:Playwright 全断点(1440/1280/1024)x 双主题矩阵截图、90 次连续布局切换+前进后退压力测试无报错、
探测/触发/回滚danger操作流程验证、reduced-motion 验证;后端 pytest 全量 133 用例通过,无回归
- 未改动:登录/鉴权契约、后端 API、'问天'冻结区、生产数据/权限
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: multica-agent <github@multica.ai>
61 lines
4.2 KiB
CSS
61 lines
4.2 KiB
CSS
/* C · 地层剖面 Strata —— 来源层→加工层→发布层→审计沉积层 四条全宽横带。
|
|
真实事件自上而下贯穿;整齐、纵向追踪;选中/关联状态解决跨层追踪费眼问题。 */
|
|
#st-root { padding: var(--sp3) var(--sp4); max-width: 1680px; margin: 0 auto; position: relative; }
|
|
#st-spine { position: absolute; left: 46px; top: 56px; bottom: 12px; width: 2px; background: var(--line); z-index: 0; }
|
|
#st-dot { position: absolute; left: 41px; width: 12px; height: 12px; border-radius: 50%; background: var(--packet); opacity: 0; z-index: 3; pointer-events: none; box-shadow: 0 0 0 4px var(--bg0); }
|
|
|
|
.st-band { position: relative; display: flex; gap: 16px; padding: 14px 16px 16px 62px; margin-bottom: 10px; z-index: 1; border-left: 3px solid transparent; transition: border-color var(--dur-ui) var(--ease-out), background var(--dur-ui) var(--ease-out); }
|
|
.st-band > div { min-width: 0; }
|
|
.st-band.pulse { border-left-color: var(--action); background: var(--action-soft); }
|
|
.st-band.pulse.err { border-left-color: var(--error); background: var(--error-soft); }
|
|
.st-band .st-idx { position: absolute; left: 6px; top: 14px; width: 36px; text-align: center; }
|
|
.st-band .st-idx .n { font-family: var(--font-mono); font-size: 18px; font-weight: 700; color: var(--t3); display: block; }
|
|
.st-band .st-idx .lb { font-size: 9.5px; color: var(--t3); letter-spacing: .12em; display: block; margin-top: 2px; }
|
|
|
|
#st-sources { display: grid; grid-template-columns: repeat(4, 1fr) auto; gap: 12px; flex: 1; min-width: 0; }
|
|
/* 防止内部宽表格用 min-width:auto 撑爆 1fr 轨道,参见 ledger.css 同类注释。 */
|
|
#st-sources > *, #st-process > *, #st-publish > * { min-width: 0; }
|
|
.st-src { padding: 8px 10px; cursor: pointer; border: 1px solid var(--line); border-radius: var(--r-card); transition: border-color var(--dur-ui) var(--ease-out); }
|
|
.st-src.sel { border-color: var(--action); box-shadow: 0 0 0 1px var(--action) inset; }
|
|
.st-src .row { display: flex; align-items: center; gap: 6px; }
|
|
.st-src .nm { font-size: 13px; font-weight: 600; color: var(--t1); flex: 1; }
|
|
.st-src .sub { font-size: 10.5px; color: var(--t3); margin-top: 2px; }
|
|
.st-src .lat { font-size: 11px; color: var(--t2); }
|
|
.st-reserved { align-self: center; font-size: 11px; color: var(--t3); white-space: nowrap; padding: 0 8px; }
|
|
|
|
#st-process { flex: 1; display: grid; grid-template-columns: 1.3fr 1fr; gap: 14px; }
|
|
.st-jobs .st-job { display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--line-soft); font-size: 12px; cursor: pointer; border-radius: 4px; }
|
|
.st-jobs .st-job:last-child { border-bottom: 0; }
|
|
.st-jobs .st-job.sel { background: var(--action-soft); }
|
|
.st-jobs .st-job .nm { flex: 1; color: var(--t1); }
|
|
.st-jobs .st-job .at { color: var(--t3); font-size: 11px; }
|
|
.st-runs table.grid td, .st-runs table.grid th { padding: 4px 6px; font-size: 11px; }
|
|
.st-runs tr.hi td { background: var(--action-soft); }
|
|
|
|
#st-publish { flex: 1; display: grid; grid-template-columns: 220px 1fr; gap: 16px; }
|
|
.st-gate .bignum { display: flex; align-items: baseline; gap: 8px; }
|
|
.st-gate .bignum .n { font-size: var(--fs-hero); font-weight: 700; color: var(--t1); }
|
|
.st-gate .bignum .cap { font-size: 11px; color: var(--t3); }
|
|
.st-gate .win { font-size: 11px; color: var(--t2); margin-top: 8px; line-height: 1.7; }
|
|
.st-datasets table.grid td, .st-datasets table.grid th { padding: 4px 6px; font-size: 11px; }
|
|
.st-datasets tr.hi td { background: var(--action-soft); }
|
|
|
|
#st-audit { flex: 1; display: flex; flex-direction: column; gap: 6px; }
|
|
.st-audit-line { font-size: 11.5px; color: var(--t2); font-family: var(--font-mono); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
.st-audit-line b { color: var(--t1); }
|
|
.st-audit-line.warn { color: var(--act); }
|
|
|
|
@media (max-width: 1280px) {
|
|
#st-sources { grid-template-columns: repeat(2, 1fr); }
|
|
.st-reserved { grid-column: 1 / -1; }
|
|
#st-process, #st-publish { grid-template-columns: 1fr; }
|
|
}
|
|
@media (max-width: 1100px) {
|
|
#st-root { padding: var(--sp2) var(--sp3); }
|
|
#st-spine { left: 30px; }
|
|
#st-dot { left: 25px; }
|
|
.st-band { padding-left: 46px; gap: 10px; }
|
|
.st-band .st-idx { width: 26px; }
|
|
.st-band .st-idx .n { font-size: 14px; }
|
|
}
|