forked from ChaiHao/BPOS-MVP
人手改的那一手真正落得下去;界面不撒谎那几处补齐
手改是**兜 AI 的错**的那一手 —— 这一轮把它从「摆在那儿但落不了地」做成真的: 件上就地改 · 保存**按地址收**,不看当下那张卡:载荷从前借道工单的 `blocks[i]` 取列名, 于是熔断卡(没有 blocks)在屏上时,人补的那一格一个字都送不出去 —— 而他要补的恰恰是把这一单卡住的那个必填格。授权面改由活动清单的台账声明把关。 · **能增删行**:错不止「这一格填错了」,还有「这一行不该在」与「漏了一行」。 删挂记号不当场抹掉(看得见、可后悔),且**删要说出来**(`drops`)—— 「没回传就是删了」会把一次不完整的回传变成一次删表。 · **必填没填按不下提交**:与放行门 L1 同一个数同一套算法;闸上摆出差在哪一行哪一格。 · 只写真改了的那几行 —— 改一格却留「修订 4 行」的痕,那句话是假的。 判据与门 · 裁量判据带谓词时**谓词说了算**:「选填缺口已补齐」基座数得出来, 人填好的目标价它照样判「客户未提供」的毛病由此消掉。 · 验收卡判据**读时现算** —— 人在成果件上补一格,判据跟着变。 · 放行门认「**办完了没有**」不认「有人写过」:从前写个 `false` 就把门推开, 于是一单没打标就进了放行门。三个数全由基座现数。 · 拒回把「活没干完」说成「数或行对不上」的毛病:判据点名的表一行都没写时直说那一步没办。 **指向两扇打不开的门,比不指还糟。** 界面不撒谎 · 日志只有三色:负责人绿 · 智能体蓝 · 系统灰(归侧五种是度量的分法,不是给人看的)。 · 验收收口答两件事:落了什么(按**交付物**点名,一份成果的几张表并成一行)、 往哪儿去(转出哪一口、带过去哪些字段);一个口都没发就直说到此为止。 · 签完到收尾之间那一段有自己的话「字已签下,正在落地」—— 中间态本来就该说出来,只是要说对。 · 消息不再被内部事件刷屏:只有从通道进来的件才谈得上「无人认领」。 · 建客户公司与联系人**一次确认落两行**;联系人编码自增不问人;卡面摆表的人读名。 A1 三案例端到端全 released:全 A 类直通 12 拍 / 客户点名跳一条 10 拍 / 新客户缺必填 14 拍。 五道门禁全绿(971 passed)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JsTDjoHovERXyy6Wmw1ALp
This commit is contained in:
@@ -226,6 +226,56 @@
|
||||
.g-card-h svg { color: var(--ink-4); }
|
||||
.g-card-h .x { margin-left: auto; font-size: 10.5px; font-weight: 600; color: var(--ink-4); }
|
||||
.g-card-b { padding: 14px 16px; display: flex; flex-direction: column; gap: 12px; }
|
||||
/* `.g-card-b` 全仓库无一处使用——`Card` 组件的 `children` 直接落进 `.g-card`,从没吐过这层内容区。
|
||||
自带边框/内边距的件(`.g-rows` 等)塞进去还成立,`.g-entries` 网格自身 `padding: 0`,
|
||||
数据域一塞就和外框贴死成两条 1px 边框叠一条线(设计中心 · 数据域实测四面 0-1px)。
|
||||
`Card` 有 26 处调用横跨十个治理台面板,动 `Card` 本身或 `.g-card` 得逐面板复核会不会
|
||||
变成双重内边距,面太大;这里只在「网格直吐进卡体」这一种组合上后代选择器精确落刀,
|
||||
不碰共享组件与其余调用点。取值同 `.g-card-b`(与 `.g-card-h` 的 16px 横向对齐)。 */
|
||||
.g-card > .g-entries { padding: 14px 16px; }
|
||||
/* `.g-newflow`(新建流程 / 新建审批活动两处表单容器)此前**全仓库零条规则**——
|
||||
`Card` 的 children 直落 `.g-card`(见上一条注释),这层什么都不兜:输入框贴着卡的
|
||||
圆角边框「漏」出去、字段之间没有竖向行距、操作条贴死卡的右边缘(治理台实测截图为证)。
|
||||
两处调用点(gov-activity 审批活动表单 · gov-process 新建流程表单)结构相同,直接给
|
||||
`.g-newflow` 补一份通用表单容器,两边一起受益;取值抄 `.g-card-b`——那条规则本来就是
|
||||
给「直落 .g-card 的内容」定的,只是从没接线,不是发明新数字。 */
|
||||
.g-newflow { padding: 14px 16px; display: flex; flex-direction: column; gap: 12px; }
|
||||
/* ── 数据域:按**性质**分区(2026-07-31)────────────────────────────────
|
||||
从前这一屏只按域分组,19 张表看着一模一样 —— 人分不出哪几张是要治理的主数据、
|
||||
哪几张只是一单一份的凭证。而「该不该管它、谁有权改它」全看性质:
|
||||
主数据要治理(谁能改、依据、去重、时效),单据只需查得到、派生根本不该手写。
|
||||
所以分区要**看得见**:一条带色的区头 + 一句说清这一类是什么。 */
|
||||
.g-kind { display: flex; flex-direction: column; gap: 12px; }
|
||||
.g-kind + .g-kind { margin-top: 22px; }
|
||||
.g-kind-h { display: grid; grid-template-columns: auto auto auto 1fr; align-items: center; gap: 8px;
|
||||
padding: 10px 14px; border-left: 3px solid var(--kind-c, var(--brand)); border-radius: 0 8px 8px 0;
|
||||
background: var(--kind-bg, var(--brand-wash)); }
|
||||
.g-kind-h svg { color: var(--kind-c, var(--brand)); }
|
||||
.g-kind-h b { font-size: 13.5px; font-weight: 800; color: var(--ink); letter-spacing: .02em; }
|
||||
.g-kind-h .n { padding: 1px 8px; border-radius: 999px; background: #fff;
|
||||
font: 700 10.5px/1.7 var(--sh-mono, ui-monospace); color: var(--kind-c, var(--brand)); }
|
||||
/* 说辞占满剩下那一格,窄屏时整条换行到下一行 —— 它不是装饰,是这一类的定义 */
|
||||
.g-kind-h p { grid-column: 4; margin: 0; font-size: 11.5px; line-height: 1.7; color: var(--ink-3); }
|
||||
@media (max-width: 1100px) {
|
||||
.g-kind-h { grid-template-columns: auto auto auto; }
|
||||
.g-kind-h p { grid-column: 1 / -1; margin-top: 4px; }
|
||||
}
|
||||
/* 四档各一个色:主数据(要治理)最重,派生用警示色 —— 它标的是「这本不该手写」 */
|
||||
.g-kind.t-m { --kind-c: #1a6dd6; --kind-bg: #eff5ff; }
|
||||
.g-kind.t-r { --kind-c: #5b6b7f; --kind-bg: #f4f6f9; }
|
||||
.g-kind.t-d { --kind-c: #b8791a; --kind-bg: #fdf6ea; }
|
||||
.g-kind.t-u { --kind-c: #9aa4b2; --kind-bg: #f6f7f9; }
|
||||
|
||||
/*
|
||||
卡内网格改 `auto-fill` —— **每张卡一样大,不随本域有几个对象变形**(2026-07-31)。
|
||||
`auto-fit` 会把空轨道**折叠掉**,剩下的轨道再把整行分完:于是同一屏上
|
||||
只有 1 个对象的域(customer / quote_archive)那张卡被拉成**整行宽**、
|
||||
2 个对象的域(supplier / quote_pricing / quote_negotiate)每张占**半行**、
|
||||
≥3 个的才是正常的三分之一 —— 一页里三种尺寸,看着像三种东西。
|
||||
`auto-fill` 保留空轨道:轨道宽只由容器宽定,与本域对象数无关,
|
||||
1 个对象就摆 1 张、右边留白,尺寸和别的域一模一样。
|
||||
留白是对的:卡的大小该表示「它是一张对象卡」,不该表示「这个域有几个对象」。 */
|
||||
.g-card > .g-entries { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); }
|
||||
.g-code { display: block; padding: 11px 13px; border-radius: 10px; background: #f5f7fa; border: 1px solid var(--line-soft); font-family: var(--mono); font-size: 11.5px; line-height: 1.75; color: var(--ink-2); overflow-wrap: anywhere; }
|
||||
|
||||
/* ============ 矩阵表 ============ */
|
||||
@@ -426,6 +476,12 @@
|
||||
/* 审批依据:一行两格 + 删 */
|
||||
.g-basis { display: flex; flex-direction: column; gap: 6px; }
|
||||
.g-basis-r { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; gap: 6px; }
|
||||
/* 「加一条」按钮是 `.g-basis`(纵向 flex)的直接子项,继承默认 `align-items: stretch`
|
||||
被拉成贯穿整行的横杠、看着像一行内容而不是按钮(实测截图为证)。`.g-basis-r` 那几行
|
||||
要满宽(两个输入 + 一枚删除钮),不能把 `.g-basis` 整体收窄去将就按钮,所以只钉住
|
||||
这一枚按钮自己的 cross-axis,不碰 `.g-basis` 本身、也不影响别处的 `.g-ver-act`
|
||||
(全仓库 `.g-basis` 只此一处调用,这条选择器不会外溢)。 */
|
||||
.g-basis > .g-ver-act { align-self: flex-start; }
|
||||
|
||||
/* 幽灵卡:同尺寸的虚线位 —— 一眼看出「这儿还能再添一条」 */
|
||||
.g-fcard.ghost { flex-direction: row; justify-content: center; align-items: center; gap: 7px; min-height: 122px; border-style: dashed; border-color: #c0cbd8; background: #fcfdfe; box-shadow: none; color: var(--ink-4); font: 600 12.5px/1 var(--sans); cursor: pointer; }
|
||||
@@ -936,6 +992,67 @@
|
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .04), 0 10px 26px -16px rgba(8, 15, 28, .55);
|
||||
}
|
||||
|
||||
/* ── 单在另一台上:页签是人点的,不抢 —— 只在这一台顶上挂一句「它在那边」 ── */
|
||||
.tb-else { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border: 1px solid var(--sh-line); border-radius: 8px; background: rgba(0, 0, 0, .22); }
|
||||
.tb-else b { font: 600 11px/1 var(--sh-mono); letter-spacing: .08em; color: var(--sh-steel); }
|
||||
.tb-else span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; color: var(--sh-muted); }
|
||||
.tb-else .tb-ghost { margin-left: auto; flex: none; }
|
||||
|
||||
/* 起单入参纸上的必填记号 —— 一枚星号,跟在字段名后半格(「必填」二字挤得字段名折行) */
|
||||
.tb-pp-r > em .req { margin-left: 2px; font-style: normal; font-weight: 700; color: #c0553c; }
|
||||
|
||||
/* ── 契约面读数:起单前就该看见这个活动手上有什么 ──
|
||||
跑不动的原因八成在这几行里:工具没装、模型没绑、台账没物化、预算给太紧。 */
|
||||
.tb-face { display: flex; flex-direction: column; gap: 2px; padding: 8px 0 2px; }
|
||||
.tb-face-r { display: grid; grid-template-columns: 46px minmax(0, 1fr); align-items: baseline; gap: 10px; padding: 6px 0; border-bottom: 1px solid #16233c; }
|
||||
.tb-face-r > em { font: 600 10px/1.5 var(--sh-mono); font-style: normal; letter-spacing: .1em; color: var(--sh-muted); }
|
||||
.tb-face-r .v { display: flex; flex-wrap: wrap; gap: 5px; min-width: 0; font-size: 12px; color: var(--sh-ink); }
|
||||
.tb-face-r .v.mono { font: 500 11px/1.5 var(--sh-mono); color: var(--sh-steel); }
|
||||
.tb-face-r .v.none { font-size: 11.5px; color: var(--sh-muted); }
|
||||
.tb-face-r .chip { font: 500 10.5px/1.5 var(--sh-mono); font-style: normal; padding: 1px 7px; border: 1px solid var(--sh-line); border-radius: 999px; color: var(--sh-steel); overflow-wrap: anywhere; }
|
||||
|
||||
/* ── 预算读数三格:Harness 在环外掐的就是这三个数 ── */
|
||||
.tb-gauges { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; padding: 12px 0 4px; }
|
||||
.tb-g { display: flex; flex-direction: column; gap: 5px; padding: 9px 12px; border: 1px solid #1b2a44; border-radius: 9px; background: rgba(0, 0, 0, .22); }
|
||||
.tb-g > em { font: 600 9.5px/1 var(--sh-mono); font-style: normal; letter-spacing: .16em; text-transform: uppercase; color: var(--sh-muted); }
|
||||
.tb-g > b { font: 700 15px/1 var(--sh-mono); color: var(--sh-live); }
|
||||
.tb-g > b > i { font: 500 11px/1 var(--sh-mono); font-style: normal; color: var(--sh-muted); }
|
||||
.tb-g .bar { display: block; height: 3px; border-radius: 2px; background: #16233a; overflow: hidden; }
|
||||
.tb-g .bar > i { display: block; height: 100%; background: var(--sh-live); transition: width var(--t-fast); }
|
||||
.tb-g.warm > b, .tb-g.warm .bar > i { color: var(--sh-brass); background-color: var(--sh-brass); }
|
||||
.tb-g.warm > b { background: none; }
|
||||
.tb-g.hot > b, .tb-g.hot .bar > i { color: var(--sh-alarm); background-color: var(--sh-alarm); }
|
||||
.tb-g.hot > b { background: none; }
|
||||
.tb-reason { margin: 6px 0 0; font-size: 12px; color: var(--sh-brass); }
|
||||
|
||||
/* ── 逐拍轨迹:活动内部的流水账 —— 「第三拍为什么被拒」这句话只在这儿 ── */
|
||||
.tb-trail { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; }
|
||||
.tb-trail li { display: grid; grid-template-columns: 62px minmax(0, 1fr); gap: 10px; padding: 5px 0; border-bottom: 1px solid #141f34; }
|
||||
.tb-trail li .t { font: 500 10px/1.6 var(--sh-mono); color: var(--sh-muted); }
|
||||
.tb-trail li .b { min-width: 0; font-size: 12px; line-height: 1.6; color: var(--sh-steel); overflow-wrap: anywhere; }
|
||||
.tb-trail li .b .d { display: block; font: 400 10.5px/1.6 var(--sh-mono); font-style: normal; color: var(--sh-muted); overflow-wrap: anywhere; }
|
||||
/* 三种要紧的行各给一色:干成了(磷光)/ 被拒(珊瑚)/ 引擎迁移(黄铜) */
|
||||
.tb-trail li.k-action .b { color: var(--sh-live); }
|
||||
.tb-trail li.k-result .b { color: var(--sh-ink); }
|
||||
.tb-trail li.k-engine-transition .b { color: var(--sh-brass); }
|
||||
|
||||
/* ── 台账草稿:成果就是这些行 ── */
|
||||
.tb-drafts { display: flex; flex-direction: column; gap: 10px; padding: 8px 0 2px; }
|
||||
.tb-draft-g .addr { display: block; font: 600 10px/1.8 var(--sh-mono); letter-spacing: .08em; color: var(--sh-muted); }
|
||||
/* 主键那一列给够宽:它是「这一行是谁」(询价单号 · PN),88px 会把它折成三行 */
|
||||
.tb-draft-g .row { display: grid; grid-template-columns: minmax(0, clamp(110px, 24%, 220px)) minmax(0, 1fr); gap: 10px; padding: 4px 0; border-bottom: 1px solid #141f34; }
|
||||
.tb-draft-g .row .k { font: 600 11px/1.6 var(--sh-mono); color: var(--sh-live); overflow-wrap: anywhere; }
|
||||
.tb-draft-g .row .p { font: 400 10.5px/1.6 var(--sh-mono); color: var(--sh-steel); overflow-wrap: anywhere; }
|
||||
.tb-none { margin: 8px 0 0; font-size: 11.5px; line-height: 1.75; color: var(--sh-muted); }
|
||||
|
||||
/* ── 卡:问了谁什么 ── */
|
||||
.tb-cards { display: flex; flex-direction: column; padding: 6px 0 2px; }
|
||||
.tb-cards .row { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; align-items: baseline; gap: 9px; padding: 6px 0; border-bottom: 1px solid #141f34; }
|
||||
.tb-cards .row .m { font: 600 9.5px/1.6 var(--sh-mono); letter-spacing: .06em; color: var(--sh-brass); }
|
||||
.tb-cards .row .t { min-width: 0; font-size: 12px; color: var(--sh-ink); overflow-wrap: anywhere; }
|
||||
.tb-cards .row .s { font: 500 10px/1.6 var(--sh-mono); color: var(--sh-brass); }
|
||||
.tb-cards .row.done .s { color: var(--sh-muted); }
|
||||
|
||||
/* ── 仪器顶条:一盏灯 + 状态词 —— 装配态与观测态共用同一根 ── */
|
||||
.tb-strip { display: flex; align-items: center; gap: 11px; min-height: 30px; padding: 2px 2px 10px; border-bottom: 1px solid #1b2a44; margin-bottom: 2px; }
|
||||
.tb-lamp { flex: none; width: 9px; height: 9px; border-radius: 50%; background: currentColor; box-shadow: 0 0 9px currentColor; }
|
||||
@@ -1026,7 +1143,10 @@
|
||||
|
||||
/* ── ② 节点指派:一条竖轨挂着所有节点,右端是插座 —— 插了人点琥珀 ── */
|
||||
.tb-asn { display: flex; flex-direction: column; padding: 4px 0 10px; }
|
||||
.tb-asn-r { display: grid; grid-template-columns: 20px 34px minmax(0, 1fr) 40px minmax(150px, 190px); align-items: center; gap: 9px; padding: 6px 0; }
|
||||
.tb-asn-r { display: grid; grid-template-columns: 20px 34px minmax(0, 1fr) 40px minmax(184px, 238px); align-items: center; gap: 9px; padding: 6px 0; }
|
||||
/* 单活动那一台只有一格插座、没有「活动/审批」那一列 —— 少一格就得少一列,
|
||||
不然 select 掉进 40px 那一格里,名字挤成一坨(踩过:「下拉框尺寸不够」) */
|
||||
.tb-asn-r.solo { grid-template-columns: 20px 52px minmax(0, 1fr) minmax(184px, 238px); }
|
||||
.tb-asn-r .rail { position: relative; align-self: stretch; }
|
||||
.tb-asn-r .rail::before { content: ""; position: absolute; left: 50%; top: 0; bottom: 0; border-left: 1px solid var(--sh-line); }
|
||||
.tb-asn-r:first-child .rail::before { top: 50%; }
|
||||
@@ -1057,6 +1177,63 @@
|
||||
.tb-go:disabled { opacity: .45; cursor: default; }
|
||||
.tb-go:focus-visible { outline: 2px solid var(--sh-live); outline-offset: 2px; }
|
||||
|
||||
/* ── 附件格:选的是**真文件** —— 一件一枚签条,读出来什么就写什么 ── */
|
||||
.tb-files { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 4px 0; }
|
||||
.tb-file { display: inline-flex; align-items: center; gap: 6px; max-width: 100%; padding: 3px 6px 3px 8px; border: 1px solid #ddd7c8; border-radius: 4px; background: #f4f1e8; font: 500 11px/1.5 var(--sans); color: #4a4536; }
|
||||
.tb-file svg { flex: none; color: #6a8f5e; }
|
||||
.tb-file.blind svg { color: #c0885c; }
|
||||
.tb-file b { flex: none; font-weight: 600; }
|
||||
.tb-file i { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 400 10px/1.5 var(--sh-mono); font-style: normal; color: #8b8674; }
|
||||
.tb-file button { display: inline-flex; flex: none; padding: 2px; border: 0; background: transparent; color: #8b8674; cursor: pointer; }
|
||||
.tb-file button:hover { color: #b0413e; }
|
||||
.tb-file-add { display: inline-flex; align-items: center; gap: 5px; padding: 4px 9px; border: 1px dashed #c9c2ae; border-radius: 4px; color: #8b8674; font: 500 11px/1.5 var(--sans); cursor: pointer; }
|
||||
.tb-file-add:hover { border-color: #8b8674; color: #4a4536; }
|
||||
.tb-file-add:focus-within { outline: 2px solid #8b8674; outline-offset: 1px; }
|
||||
.tb-file-add input { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }
|
||||
|
||||
/* ── 试跑存档:目录一行一次试跑 —— 读数 mono、题目无衬线,右端一枚删 ── */
|
||||
.tb-logs { display: flex; flex-direction: column; gap: 6px; }
|
||||
/* 第二列是**试跑短号**(2026-07-31 加):同一条流反复试跑,主题一模一样,
|
||||
没有号就只能靠报时分秒指认「哪一次」—— 号在最前面才好一眼扫到并对上话 */
|
||||
.tb-log-r { display: grid; grid-template-columns: 44px 74px minmax(0, 1fr) 82px 168px 138px 92px 24px; align-items: center; gap: 10px; width: 100%; padding: 9px 12px; border: 1px solid var(--sh-line); border-radius: 8px; background: var(--sh-panel); text-align: left; cursor: pointer; transition: border-color var(--t-fast), background var(--t-fast); }
|
||||
.tb-log-r:hover { border-color: var(--sh-lineb); background: var(--sh-panel-2); }
|
||||
.tb-log-r:focus-visible { outline: 2px solid var(--sh-live); outline-offset: 1px; }
|
||||
.tb-log-r .kd { justify-self: start; padding: 2px 6px; border-radius: 4px; border: 1px solid var(--sh-line); font: 600 9px/1.5 var(--sh-mono); letter-spacing: .1em; color: var(--sh-muted); }
|
||||
/* 试跑短号 —— 等宽、可点、点了拷完整 id;列表与详情共用一枚 */
|
||||
.tb-runid { justify-self: start; padding: 2px 6px; border-radius: 4px; border: 1px dashed var(--sh-line); background: transparent; font: 600 10px/1.5 var(--sh-mono); letter-spacing: .04em; color: var(--sh-muted); cursor: pointer; white-space: nowrap; transition: color var(--t-fast), border-color var(--t-fast); }
|
||||
.tb-runid:hover { color: var(--sh-live); border-color: var(--sh-live); border-style: solid; }
|
||||
.tb-runid:focus-visible { outline: 2px solid var(--sh-live); outline-offset: 1px; }
|
||||
/* 拷上了就实心亮一下 —— 界面不撒谎:拷不上不会走到这个态 */
|
||||
.tb-runid.ok { color: var(--sh-live); border-color: var(--sh-live); border-style: solid; }
|
||||
/* 详情页那一枚跟在标题后面,别跟标题挤在一起 */
|
||||
.tb-strip .tb-runid { margin-left: 8px; }
|
||||
.tb-log-r .kd.package { border-color: rgba(98, 169, 224, .34); color: var(--sh-live); }
|
||||
.tb-log-r .kd.activity { border-color: rgba(242, 180, 92, .4); color: var(--sh-brass); }
|
||||
.tb-log-r .sub { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
|
||||
.tb-log-r .sub b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12.5px; font-weight: 600; color: var(--sh-ink); }
|
||||
.tb-log-r .sub em { font: 400 9.5px/1 var(--sh-mono); font-style: normal; letter-spacing: .06em; color: var(--sh-muted); }
|
||||
.tb-log-r .st { font: 600 10px/1 var(--sh-mono); letter-spacing: .06em; color: var(--sh-muted); }
|
||||
.tb-log-r .st.ok { color: var(--sh-live); }
|
||||
.tb-log-r .st.bad { color: var(--sh-alarm); }
|
||||
.tb-log-r .st.cut { color: var(--sh-brass); }
|
||||
.tb-log-r .rd { font: 400 10px/1 var(--sh-mono); color: var(--sh-muted); }
|
||||
.tb-log-r .at { font: 400 10px/1 var(--sh-mono); color: var(--sh-steel); }
|
||||
.tb-log-r .del { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border-radius: 5px; color: var(--sh-muted); cursor: pointer; transition: color var(--t-fast), background var(--t-fast); }
|
||||
.tb-log-r .del:hover { background: rgba(224, 96, 92, .14); color: var(--sh-alarm); }
|
||||
.tb-log-r .del:focus-visible { outline: 2px solid var(--sh-alarm); outline-offset: 1px; }
|
||||
|
||||
/* 存档正文:逐拍轨迹 / 草稿 / 人卡 —— 三张表同一副骨架,一行一条 */
|
||||
.tb-trail { display: flex; flex-direction: column; max-height: 420px; overflow: auto; }
|
||||
.tb-trail-r { display: grid; grid-template-columns: 62px 116px minmax(0, 1fr) auto; align-items: baseline; gap: 10px; padding: 6px 14px; border-bottom: 1px solid var(--sh-line); }
|
||||
.tb-trail-r:last-child { border-bottom: 0; }
|
||||
.tb-trail-r .at { font: 400 10px/1.6 var(--sh-mono); color: var(--sh-muted); }
|
||||
.tb-trail-r .at.cut { color: var(--sh-brass); }
|
||||
.tb-trail-r .kd { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 600 9.5px/1.6 var(--sh-mono); letter-spacing: .08em; color: var(--sh-steel); }
|
||||
.tb-trail-r .tt { min-width: 0; font-size: 11.5px; line-height: 1.6; color: var(--sh-ink); word-break: break-word; }
|
||||
.tb-trail-r .tt.mono { font: 400 10.5px/1.7 var(--sh-mono); color: var(--sh-steel); }
|
||||
/* 草稿与人卡那两张只有三格:头一格空着比错位好 */
|
||||
.tb-trail-r > :first-child:not(.at) { grid-column: 1 / span 2; }
|
||||
|
||||
/* 空台面:没有生效流 —— 一个虚线的空槽,指路去流程包 */
|
||||
.tb-slot { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 9px; padding: 44px 16px 46px; border: 1.5px dashed var(--sh-line); border-radius: 10px; text-align: center; }
|
||||
.tb-slot svg { color: var(--sh-muted); opacity: .7; }
|
||||
|
||||
Reference in New Issue
Block a user