三面拆分⑱:属性卡台面化 —— 定高双列,边属性整宽一行排开

- 节点属性卡与激活判据卡**同排定高 560px**:行高由属性卡定,判据卡拉伸补齐;
  内容超高在卡内滚,不把页面撑长 —— 台面件定形,不随内容乱长
- 节点属性两列小卡(等高 250、内部滚):身份与命名 | 类型与责任、输入 | 输出口
- 边属性整宽单列(g-eprops):条件与映射各占满一行;
  映射行 nowrap 一行排开(目标 ← 来源类型 口 路径 删除),输入收缩共分宽度,
  不再有换行错位的怪布局

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-28 20:19:25 +08:00
co-authored by Claude Fable 5
parent a10a7b2855
commit ecfaef1463
2 changed files with 13 additions and 8 deletions
+12 -7
View File
@@ -564,24 +564,29 @@
.g-ex .msg { flex: 1; min-width: 0; font-size: 10.5px; line-height: 1.55; letter-spacing: 0; text-transform: none; color: #3a4452; } .g-ex .msg { flex: 1; min-width: 0; font-size: 10.5px; line-height: 1.55; letter-spacing: 0; text-transform: none; color: #3a4452; }
.g-exfacet { display: flex; align-items: center; gap: 6px; padding: 6px 2px 2px; font: 600 9.5px/1 var(--mono); letter-spacing: 0.14em; text-transform: uppercase; color: var(--sh-steel, #46586a); } .g-exfacet { display: flex; align-items: center; gap: 6px; padding: 6px 2px 2px; font: 600 9.5px/1 var(--mono); letter-spacing: 0.14em; text-transform: uppercase; color: var(--sh-steel, #46586a); }
.g-exfacet.ok { color: #2e7d4f; } .g-exfacet.ok { color: #2e7d4f; }
.g-maprow { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; } .g-maprow { display: flex; align-items: center; gap: 6px; flex-wrap: nowrap; }
.g-maprow .g-input, .g-maprow .g-select { flex: 1 1 90px; min-width: 70px; } .g-maprow .g-input { flex: 1 1 0; min-width: 0; }
.g-maprow .g-select { flex: 0 0 112px; min-width: 0; }
.g-maprow .g-btn { flex: none; padding: 4px 7px; }
.g-maparr { color: var(--sh-steel, #46586a); font-weight: 700; } .g-maparr { color: var(--sh-steel, #46586a); font-weight: 700; }
.g-exboard-empty { padding: 16px 18px; font-family: var(--sh-mono); font-size: 10px; line-height: 1.9; color: var(--sh-muted); } .g-exboard-empty { padding: 16px 18px; font-family: var(--sh-mono); font-size: 10px; line-height: 1.9; color: var(--sh-muted); }
/* 异常板高度随内容走,不被右侧属性卡拉高 —— 三条异常配 900px 空板才是脏 */ /* 激活判据卡与节点属性卡**同排等高**(560px 定高):行高由属性卡定,看板拉伸补齐;
.g-exboard { align-self: start; } 清单超高在卡内滚,不把页面撑长 —— 定高卡片才是台面件,不是随内容乱长的段落 */
.g-exboard { min-height: 0; }
/* 节点属性卡:图纸卡(外壳复用 g-vercard),与流程图同宽;题头右侧是状态字 + 保存芯片 */ /* 节点属性卡:图纸卡(外壳复用 g-vercard),与流程图同宽;题头右侧是状态字 + 保存芯片 */
.g-nodecard { min-height: 0; } .g-nodecard { height: 560px; min-height: 0; }
.g-nodecard .g-vercard-h { height: auto; padding: 13px 18px 10px; } .g-nodecard .g-vercard-h { height: auto; padding: 13px 18px 10px; }
.g-nodecard .g-vercard-h .n { margin-left: auto; } .g-nodecard .g-vercard-h .n { margin-left: auto; }
.g-nodecard .g-vercard-h .g-ver-new { margin-left: 10px; } .g-nodecard .g-vercard-h .g-ver-new { margin-left: 10px; }
/* 内部三段(提示/节点条/属性格)统一 12px 呼吸 —— 从前是裸兄弟,三处贴死 */ /* 内部三段(提示/节点条/属性格)统一 12px 呼吸 —— 从前是裸兄弟,三处贴死 */
.g-nodecard-b { display: flex; flex-direction: column; gap: 12px; padding: 14px 18px 16px; } .g-nodecard-b { flex: 1; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; gap: 12px; padding: 14px 18px 16px; }
/* 小卡与节点条也入图纸语言:方角细线;等高 250,超高的内容自己滚 */ /* 小卡与节点条也入图纸语言:方角细线;等高 250,超高的内容自己滚 */
.g-nodecard .g-pick { border-radius: 0; border-color: var(--sh-line); } .g-nodecard .g-pick { border-radius: 0; border-color: var(--sh-line); }
.g-nodecard .g-props { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); align-items: stretch; gap: 12px; } .g-nodecard .g-props { grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: stretch; gap: 12px; }
/* 边属性:整宽单列 —— 条件与映射各占满一行,映射行才有地方一行排开 */
.g-nodecard .g-props.g-eprops { grid-template-columns: minmax(0, 1fr); }
.g-nodecard .g-prop { height: 250px; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--sh-line); border-radius: 0; box-shadow: none; } .g-nodecard .g-prop { height: 250px; display: flex; flex-direction: column; overflow: hidden; border: 1px solid var(--sh-line); border-radius: 0; box-shadow: none; }
.g-nodecard .g-prop-h { font-family: var(--sh-mono); font-size: 9.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: var(--sh-steel); border-bottom: 1px solid var(--sh-line); } .g-nodecard .g-prop-h { font-family: var(--sh-mono); font-size: 9.5px; font-weight: 600; letter-spacing: .12em; text-transform: uppercase; color: var(--sh-steel); border-bottom: 1px solid var(--sh-line); }
.g-nodecard .g-prop-b { flex: 1; min-height: 0; overflow-y: auto; } .g-nodecard .g-prop-b { flex: 1; min-height: 0; overflow-y: auto; }
@@ -82,7 +82,7 @@ function EdgeProps({ edge, onPatch }: { edge: FlowEdge; onPatch: (f: (e: FlowEdg
const setRows = (next: MapRow[]) => onPatch((e) => ({ ...e, mapping: next })); const setRows = (next: MapRow[]) => onPatch((e) => ({ ...e, mapping: next }));
const patchRow = (i: number, f: (r: MapRow) => MapRow) => setRows(rows.map((r, j) => (j === i ? f(r) : r))); const patchRow = (i: number, f: (r: MapRow) => MapRow) => setRows(rows.map((r, j) => (j === i ? f(r) : r)));
return ( return (
<div className="g-props"> <div className="g-props g-eprops">
<Prop ico="git-branch" title={`${edge.code ?? '边'} · ${edge.from} → ${edge.to}`} extra="多出边异或:命中即走;条件留空 = 默认兜底"> <Prop ico="git-branch" title={`${edge.code ?? '边'} · ${edge.from} → ${edge.to}`} extra="多出边异或:命中即走;条件留空 = 默认兜底">
<Field k="S-FEEL 条件" hint="如 needSourcing = true;可用 and / or 连接。留空即无条件(默认边,至多一条)"> <Field k="S-FEEL 条件" hint="如 needSourcing = true;可用 and / or 连接。留空即无条件(默认边,至多一条)">
<input <input