diff --git a/apps/web/src/app/styles/console.css b/apps/web/src/app/styles/console.css index 43b1937..4857112 100644 --- a/apps/web/src/app/styles/console.css +++ b/apps/web/src/app/styles/console.css @@ -340,7 +340,12 @@ .g-canvas { display: flex; flex-direction: column; min-height: 0; } /* 图自身按 aspect-ratio 缩放,整张一定看得全——纸面不再限高、不再内部滚动 */ .g-canvas .process-desk { flex: 1; min-height: 0; height: auto; max-height: none; overflow: visible; padding: 0; background: transparent; display: flex; flex-direction: column; } -.g-canvas .process-doc { flex: 1; min-height: 0; box-sizing: border-box; max-width: none; padding: 14px 18px 18px; border-radius: 10px; box-shadow: var(--cshadow); } +.g-canvas .process-doc { flex: 1; min-height: 0; box-sizing: border-box; max-width: none; padding: 14px 18px 18px; border-radius: 10px; box-shadow: var(--cshadow); display: flex; flex-direction: column; } +/* 图框吃满纸面,并在下方空出**恰好一条底栏的高度** —— 图框下沿与左列版本卡底栏 + (.g-vercard-f,净高 38)的上沿连成同一条横线。20 = 38(底栏净高) − 18(纸面下内距)。 + 纸面被栅格拉高时(版本多、左列更长)图框跟着长,才不会又浮回上面去。 */ +.g-canvas .process-doc > .hero { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; margin-bottom: 20px; } +.g-canvas .process-doc > .hero > .fig-body { flex: 1 1 auto; min-height: 0; } /* 画布上的选中态(外挂类,_flow 复刻件未改):命中层描边 = 选中框 */ .g-canvas .flow-node-sel .djs-hit { fill: rgba(51, 112, 255, .09) !important; stroke: #3370ff !important; stroke-width: 2.5px !important; stroke-opacity: 1 !important; rx: 7px; ry: 7px; } @@ -549,7 +554,10 @@ .g-ver-act { border: 1px solid var(--sh-line); background: #fff; padding: 2px 8px; font-family: inherit; font-size: 9.5px; letter-spacing: .1em; color: #3a4452; cursor: pointer; } .g-ver-act:hover { border-color: #aeb9c6; } .g-ver-act.t-go { color: var(--sh-brass); border-color: #d9c9a4; } -.g-vercard-f { flex: none; padding: 10px 16px; border-top: 1px solid var(--sh-line); font-family: var(--sh-mono); font-size: 9.5px; line-height: 1.8; color: var(--sh-muted); } +/* 卡底栏 —— 它的净高(1 顶线 + 10 + 17 行 + 10 = 38)是**两列共用的基线**: + 右侧画布的图框下沿要落在这条顶线上(见上面 .g-canvas .process-doc > .hero 的下外距)。 + 文案改长到换行、或改了内距,那边的 20px 要跟着算。 */ +.g-vercard-f { flex: none; min-height: 38px; box-sizing: border-box; padding: 10px 16px; border-top: 1px solid var(--sh-line); font-family: var(--sh-mono); font-size: 9.5px; line-height: 1.8; color: var(--sh-muted); } .g-ver { display: flex; align-items: center; gap: 8px; padding: 10px 12px; background: var(--card); border: 1px solid var(--cline); border-radius: 11px; cursor: pointer; font: inherit; text-align: left; transition: border-color var(--t-fast), box-shadow var(--t-fast); } .g-ver:hover { border-color: #c9d6e6; } .g-ver.on { border-color: var(--brand); box-shadow: 0 0 0 2px var(--brand-wash); } diff --git a/apps/web/src/features/gov-process/internal/panel.tsx b/apps/web/src/features/gov-process/internal/panel.tsx index b60acbe..8ef8954 100644 --- a/apps/web/src/features/gov-process/internal/panel.tsx +++ b/apps/web/src/features/gov-process/internal/panel.tsx @@ -3,7 +3,7 @@ * * 一区一内容:三枚计数摆在货架顶端,底下就是包货架(触发器已独立成区)。 * 货架一流程一卡(不按版本平铺);进详情后左 1/3 是版本列表、右 2/3 是流程图, - * 图下是节点属性,再往下才是声明式的契约细节(调用接口 · 边映射 · 触发器)。 + * 图下是节点属性(身份 · 数据接口 · 装载 · 出边条件),再往下是调用接口与触发器。 * * 版本是**运行时开关**,不是发布流程: * · 编辑即其身:保存**写回当前版本**(号不变);新版本只出自「新建」 @@ -64,45 +64,6 @@ function flowsOf(packages: readonly ProcessPackage[]) { }); } -/* ── 边属性:只剩顺序与条件(2026-07-30 对齐 Mastra)──────────────────── - Mastra 的边不传数据 —— 约束力全在两端活动的输入/输出字段(schema 咬合)。 - 数据按字段名流动:上游发的名就是下游收的名;边属性卡因此只剩条件与标签, - 「映射 · 载荷装配」整节退役 —— 下游拿什么去**节点属性**的数据接口看。 */ - -function EdgeProps({ edge, onPatch }: { edge: FlowEdge; onPatch: (f: (e: FlowEdge) => FlowEdge) => void }) { - return ( -