feat(task-board): refine running state indicator

This commit is contained in:
shiyue
2026-08-13 16:16:19 +08:00
parent 214ff4ec88
commit 93641df1ad
10 changed files with 580 additions and 0 deletions

View File

@@ -466,6 +466,24 @@ async function main() {
assert(/grid-auto-columns:/.test(css), '看板列数和宽度应动态生成');
assert(css.includes(':focus-visible'), 'CSS 应提供键盘焦点样式');
assert(css.includes('@media (prefers-reduced-motion: reduce)'), 'CSS 应尊重减少动态效果偏好');
assert(
css.includes("html[data-theme='wasteland'] .ccweb-task-board__card[data-runtime-state='running']::before")
&& css.includes("html[data-theme='wasteland'] .ccweb-task-board__card[data-runtime-state='running']::after"),
'暗金荒野运行卡片应保留左侧竖条和活动轨迹',
);
assert(
!/html\[data-theme='wasteland'\] \.ccweb-task-board__card\[data-runtime-state='running'\]\s*\{/.test(css)
&& !css.includes('@keyframes ccweb-task-board-wasteland-runtime-card'),
'暗金荒野不得再给整张运行卡片添加背景、边框或呼吸泛光',
);
assert(
css.includes('@keyframes ccweb-task-board-wasteland-runtime-tracer'),
'暗金荒野运行卡片应提供独立的边缘活动轨迹',
);
assert(
/@media \(prefers-reduced-motion: reduce\)[\s\S]*?\.ccweb-task-board__card\[data-runtime-state='running'\]::after\s*\{[^}]*animation:\s*none;/.test(css),
'减少动态效果时左侧活动点必须停止移动',
);
assert(css.includes('.ccweb-task-tracking'), 'CSS 应覆盖可复用任务跟踪开关');
assert(!source.includes('refs.board.replaceChildren'), '数据更新不得清空并重建整个看板');
assert(source.includes('getBoundingClientRect'), '卡片移动应记录更新前后的几何位置');
@@ -650,6 +668,10 @@ async function main() {
assert.strictEqual(byClass(firstCard, 'ccweb-task-board__business-state').length, 0, '卡片不得渲染业务状态胶囊');
assert.strictEqual(byAction(firstCard, 'set-status')[0].value, 'queue-x', '状态选择器应作为业务状态的唯一卡片入口');
assert(firstCard.textContent.includes('运行:运行中'), '卡片应独立显示运行态');
assert.strictEqual(firstTaskState.isRunning, true, '前端公开任务状态应保留服务端明确下发的运行布尔值');
assert.strictEqual(firstCard.dataset.runtimeState, 'running', '运行卡片应暴露稳定的 data-runtime-state 契约');
const idleCard = byClass(root, 'ccweb-task-board__card').find((card) => card.dataset.sessionId === 'session-three');
assert.strictEqual(idleCard.dataset.runtimeState, 'idle', '未运行卡片应保持静态 idle 契约');
assert.strictEqual(firstCard.textContent.includes('Agent Alpha'), false, '任务卡不得显示 Agent 运行器名称');
assert(firstCard.textContent.includes('<img src=x onerror=alert(1)>'), '标题应作为纯文本保留');
assert.strictEqual(walk(firstCard).some((node) => node.tagName === 'IMG'), false, '恶意标题不得解析成 DOM');