工作日志:一行摆首句,展开就把话说完

从前一条只有一行标题,而人真想回看的东西全躺在留痕里没露过面 ——
凭什么算这一步办完了、那一笔落下哪几行、被拒到底拒在哪儿、发的是哪种卡送到哪儿。
现在每条可展开,细节由 detailOf 摘成**一句句人话**(不摆 execution 这类内部名);
摘不出就是空数组,前端据此不给展开钮 —— 点开是空抽屉比不给还糟。

不摆二级条目(用户定):细节不是「键:值」两栏 —— 那是把留痕的字段名搬到人面前,
人还得自己在脑子里连成句子。每句自带主语与语境,单拎出来也读得通。

连带修一处文档与实现不符:「一轮一句」的口径说埋头办事那几拍的交代「留进工作日志」,
而实现把 internal 整类滤掉了,那几句哪儿都看不到。现在带交代的放行,
章写「交代进展」、记在 AI 名下;排障用的内部痕照旧不摆。
两种交代统一「首句上行、全文进抽屉」,一句话说完的不重复摆;截了才加省略号。

契约:任务详情的日志行新增可选 detail(字符串数组),api-report 同批更新。
门禁:typecheck / lint / depcruise / test(1378)全绿;浏览器实测折叠行高 34-36px 齐平、
展开无键值两栏残留。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 13:10:46 +08:00
co-authored by Claude Opus 5
parent ade0fa5a94
commit 70e83d0b09
8 changed files with 352 additions and 16 deletions
+12
View File
@@ -3139,6 +3139,18 @@
.proto-root .jc-log-t { flex: 1; min-width: 0; }
.proto-root .jc-log-t b { display: block; font-size: 12.5px; font-weight: 600; }
.proto-root .jc-log-t em { display: block; margin-top: 2px; font-style: normal; font-size: 11px; line-height: 1.6; color: var(--ink-3); }
/* 细节抽屉(2026-08-03):折叠时一行不变,展开才现;没有细节的条目连钮都不给 */
.proto-root .jc-log-more { display: flex; align-items: baseline; gap: 6px; width: 100%; padding: 0; border: 0; background: none; text-align: left; cursor: pointer; color: inherit; font: inherit; }
.proto-root .jc-log-more > svg { flex: none; margin-top: 1px; color: var(--ink-4); transition: color var(--t-fast); }
.proto-root .jc-log-more:hover > b { color: var(--brand-deep); }
.proto-root .jc-log-more:hover > svg { color: var(--brand); }
.proto-root .jc-log-more:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; border-radius: 4px; }
/* 展开的正文:一段一句,左缘一道细线把它归到这一条名下 —— 不做键值两栏 */
.proto-root .jc-log-body { margin: 6px 0 2px; padding: 2px 0 2px 10px; border-left: 2px solid var(--line); }
.proto-root .jc-log-body p { margin: 0; font-size: 11.5px; line-height: 1.7; color: var(--ink-2); white-space: pre-wrap; overflow-wrap: anywhere; }
.proto-root .jc-log-body p + p { margin-top: 5px; }
/* 展开那一条轻轻提亮,眼睛回得来 */
.proto-root .jc-log-row.on { background: #fbfcfe; border-radius: 8px; }
/* 成果二级界面的返回键 —— 顶部页签不变,右槽换成它 */
.proto-root .jc-tnav-back { width: auto; padding: 0 9px; gap: 5px; font-size: 11.5px; font-weight: 600; }
@@ -427,16 +427,7 @@ export function ViewRegion({ detail, onReplyOrder, values, onField, locate }: Vi
* (自主率要把「等外面」与「机器干的」分开);人扫这一屏只问
* 「这一步是我办的、AI 办的,还是流程自己走到的」。
*/
<div key={line.id} className={'jc-log-row t-' + line.who}>
<span className="jc-log-at jc-mono">{atMinute(line.at)}</span>
{/* 章摆的是**动作**(四字,与对话区同词),不是归侧 ——
归侧仍在 `t-${side}` 的配色里,度量也照旧靠它 */}
<span className="jc-log-side">{line.action}</span>
<span className="jc-log-t">
<b>{line.title}</b>
{line.summary !== undefined && <em>{line.summary}</em>}
</span>
</div>
<LogRow key={line.id} line={line} />
))}
</div>
) : (
@@ -652,6 +643,53 @@ export function ViewRegion({ detail, onReplyOrder, values, onField, locate }: Vi
* 涟漪说「环在转」,微光工作线说「报告正在一行行写出来」;
* 都是纯 CSS、只动 transform/opacity,prefers-reduced-motion 下静止但状态仍可读。
*/
/**
* 日志一行 —— **折叠时一行,展开才看细节**(2026-08-03 用户:「细节展开不够好」)。
*
* 这一屏的用法是**扫**:一眼看完这单走过哪几步、谁办的。所以密度不能破 ——
* 细节收进抽屉,想深究哪一条点哪一条。**没有细节的条目不给展开钮**:
* 摆一个点开是空的抽屉,比不给还糟(点一次才知道白点)。
*
* 展开不做动画高度:日志动辄几十条,一条一个过渡就是一屏都在抖。
*/
function LogRow({ line }: { line: TaskDetail['log'][number] }) {
const [open, setOpen] = useState(false);
const has = line.detail.length > 0;
return (
<div className={'jc-log-row t-' + line.who + (open ? ' on' : '')}>
<span className="jc-log-at jc-mono">{atMinute(line.at)}</span>
{/* 章摆的是**动作**(四字,与对话区同词),不是归侧 ——
归侧仍在 `t-${side}` 的配色里,度量也照旧靠它 */}
<span className="jc-log-side">{line.action}</span>
<span className="jc-log-t">
{has ? (
<button type="button" className="jc-log-more" onClick={() => setOpen(!open)} aria-expanded={open}>
<b>{line.title}</b>
<Ico name={open ? 'chevron-down' : 'chevron-right'} s={13} />
</button>
) : (
<b>{line.title}</b>
)}
{line.summary !== undefined && <em>{line.summary}</em>}
{/*
* **展开就是把话说完,不摆二级条目**(2026-08-03 用户定)。
*
* 从前展开出来是一摞「键:值」—— 那是把留痕的字段名搬到人面前,
* 人还得自己在脑子里把它们连成一句话。日志是给人读的:
* 该说的直接写成正文,一段说完;真有两三样要说的,一样一段。
*/}
{open && (
<div className="jc-log-body">
{line.detail.map((text, i) => (
<p key={i}>{text}</p>
))}
</div>
)}
</span>
</div>
);
}
function WorkingScene({ doneN }: { doneN: number }) {
return (
<div className="jc-working" aria-live="polite">