三面拆分⑫:UI 打磨 —— 补 10 枚缺失图标,蓝图改因果链,台账收成一个模块

图标注册表缺 arrow-left-right/columns/table/tag 等 10 名,用到即渲染成空 SVG —— 补齐;
蓝图四库改真箭头相连的因果链节点卡(卡即入口,删重复的入库段);
驾驶舱终态分布改五色堆叠条;运营数据收成左轨一枚「台账」,域下沉为 2-3 字短名页签
(受理→寻源→定价→议价→替代→共享,按流程序),进模块自动落首域。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-27 22:02:49 +08:00
co-authored by Claude Fable 5
parent 4a19690389
commit 34e207c3e8
11 changed files with 266 additions and 170 deletions
@@ -9,7 +9,8 @@
* 这里**不出现任何运行态数字**(在跑几单、30 天起单数、死信数)。
* 设计者看的是定义完不完整,不是今天忙不忙 —— 混进运行数字,这页就退化成第二个驾驶舱。
*/
import { Clear, Entry, Kpi, Sec, Todo } from '@web-shared/gov/primitives.tsx';
import { Ico } from '@web-shared/Ico.tsx';
import { Clear, Sec, Todo } from '@web-shared/gov/primitives.tsx';
import type { Nav } from '@web-shared/gov/gov-route.ts';
import {
useGovActivities,
@@ -58,38 +59,67 @@ export function BlueprintHome({ nav }: HomeProps) {
const gaps = draftBad.length + missingActivities.length + uncalled.length;
// 因果链那句话写在区说明里(ZM.blueprint.desc),此处不重复 —— 直接上四库读数
// 因果链是这一屏的主角:四库以真箭头相连 —— 箭头编码的是真实依赖
// (流程包引用活动、活动调工具、活动物化数据),节点卡即入口,点卡即入库。
return (
<>
<div className="g-kpis">
<Kpi
ico="workflow"
tone="brand"
label="流程包 · 战略"
value={packages.length}
sub={`草稿 ${drafts.length} · 未闭合 ${draftBad.length}`}
/>
<Kpi
ico="boxes"
tone="auto"
label="活动 · 方法"
value={activities.length}
sub="一个活动 = 一个任务的定义"
/>
<Kpi
ico="wrench"
tone="collab"
label="工具 · 能力"
value={toolRows.length}
sub={`读类 ${toolRows.filter((t) => t.effect === 'read').length} · 写类 ${toolRows.filter((t) => t.effect === 'write').length}`}
/>
<Kpi
ico="database"
tone="ok"
label="数据域 · 对象"
value={domains.length}
sub={`${objectRows.length} 个对象 · 发布即在运营中心长出台账位`}
/>
<div className="g-chain">
<button className="g-chain-node t-brand" onClick={() => nav.jump('workflows', 'pkgs')}>
<span className="g-chain-k">
<span className="ic">
<Ico name="workflow" s={13} />
</span>
战略 · 流程包
</span>
<span className="g-chain-v">{packages.length}</span>
<span className="g-chain-h">
企业以哪些流转运转 —— 草稿 {drafts.length} · 未闭合 {draftBad.length}
</span>
</button>
<span className="g-chain-arr">
<Ico name="chevron-right" s={15} />
</span>
<button className="g-chain-node t-auto" onClick={() => nav.jump('library', 'shelf')}>
<span className="g-chain-k">
<span className="ic">
<Ico name="boxes" s={13} />
</span>
方法 · 活动库
</span>
<span className="g-chain-v">{activities.length}</span>
<span className="g-chain-h">每件事怎么干 —— 一个活动 = 一个任务的定义</span>
</button>
<span className="g-chain-arr">
<Ico name="chevron-right" s={15} />
</span>
<button className="g-chain-node t-collab" onClick={() => nav.jump('tools', 'catalog')}>
<span className="g-chain-k">
<span className="ic">
<Ico name="wrench" s={13} />
</span>
能力 · 工具箱
</span>
<span className="g-chain-v">{toolRows.length}</span>
<span className="g-chain-h">
系统能对世界做什么 —— 读类 {toolRows.filter((t) => t.effect === 'read').length} · 写类{' '}
{toolRows.filter((t) => t.effect === 'write').length}
</span>
</button>
<span className="g-chain-arr">
<Ico name="chevron-right" s={15} />
</span>
<button className="g-chain-node t-ok" onClick={() => nav.jump('data', 'domains')}>
<span className="g-chain-k">
<span className="ic">
<Ico name="database" s={13} />
</span>
对象 · 数据域
</span>
<span className="g-chain-v">{domains.length}</span>
<span className="g-chain-h">
企业运营什么 —— {objectRows.length} 个对象,发布即入运营台账
</span>
</button>
</div>
<Sec ico="flag" title="待补清单" extra="定义上的缺口聚在这里,点进即改 —— 不散落在四库">
@@ -144,34 +174,6 @@ export function BlueprintHome({ nav }: HomeProps) {
)}
</Sec>
<Sec ico="route" title="从这里进四库" extra="每库一页:定义在库里改,缺口在上面看">
<div className="g-entries">
<Entry
ico="workflow"
title="流程包 · 企业以哪些流转运转"
desc="五要素编排、版本谱系、边映射校验;调起规则也在本区"
onClick={() => nav.jump('workflows', 'pkgs')}
/>
<Entry
ico="boxes"
title="活动库 · 每件事怎么干"
desc="已安装活动的资产货架:契约面、范式、两条版本序列"
onClick={() => nav.jump('library', 'shelf')}
/>
<Entry
ico="wrench"
title="工具箱 · 系统能对世界做什么"
desc="读类过程中自由调用,写类只登记动作意向、放行后落地"
onClick={() => nav.jump('tools', 'catalog')}
/>
<Entry
ico="database"
title="数据域 · 企业运营什么"
desc="域与对象的结构定义;行数据在运营中心的台账看"
onClick={() => nav.jump('data', 'domains')}
/>
</div>
</Sec>
</>
);
}