diff --git a/apps/web/src/app/styles/console.css b/apps/web/src/app/styles/console.css index 882559d..5cf4f8d 100644 --- a/apps/web/src/app/styles/console.css +++ b/apps/web/src/app/styles/console.css @@ -630,13 +630,48 @@ /* 两面都齐:一枚小检验章,别再占一整张卡 */ .g-okstamp { display: inline-flex; align-items: center; gap: 6px; margin-top: 4px; padding: 5px 11px; border: 1px solid rgba(46, 125, 79, .45); font: 600 10px/1 var(--sh-mono); letter-spacing: .08em; color: #2e7d4f; } -/* 节点属性**平铺**(2026-07-30):节点只决定几件事 —— 分类卡把四五个字段摊成半屏, - 撤掉;一列字段直排,字段之间一条细线断句就够。 */ +/* ── 节点属性 = 图签(title block):字段名住左格(mono 竖签 + 细分隔线),值住右格 ── + 与图框右下角的图签、左栏的版本条同一形制;卡顶一枚**画布同款皮肤**的节点芯片, + 「你点的就是它」不用回图上找。 */ .g-nodeform { display: flex; flex-direction: column; gap: 0; } -.g-nodeform > .g-field { padding: 11px 2px; border-bottom: 1px dashed var(--line-soft); } -.g-nodeform > .g-field:last-child { border-bottom: 0; } -.g-nodeform > .g-note { margin: 11px 0 0; } -.g-nodeform > .g-btn { align-self: flex-start; margin-top: 11px; } + +/* 节点芯片:画布皮肤原样(活动蓝 E8F1FB/4E7DAF · 审批琥珀 FBF0DC/B98432), + 左上角标 = 画布的 code 角标同款 mono 小字 */ +.g-nchip { position: relative; display: flex; align-items: center; gap: 8px; margin: 2px 0 12px; padding: 13px 12px 12px 14px; border: 1.5px solid #4e7daf; border-radius: 7px; background: #e8f1fb; } +.g-nchip > i { position: absolute; left: 7px; top: 3px; font: 600 8.5px/1 var(--sh-mono); font-style: normal; color: #8a93a0; } +.g-nchip > b { font-size: 13px; font-weight: 700; color: var(--sh-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.g-nchip > em { margin-left: auto; font: 600 8.5px/1 var(--sh-mono); font-style: normal; letter-spacing: .12em; color: #4e7daf; } +.g-nchip.apr { border-color: #b98432; background: #fbf0dc; } +.g-nchip.apr > em { color: #b98432; } + +/* 图签行:76px 标签格(右缘细线即「格线」)+ 值格;行间细实线 —— 表格,不是表单 */ +.g-tbrow { display: grid; grid-template-columns: 76px minmax(0, 1fr); align-items: center; gap: 0 12px; padding: 9px 0; border-bottom: 1px solid var(--sh-grid, #edf1f5); } +.g-tbrow > em { align-self: start; padding-top: 2px; border-right: 1px solid var(--sh-line); font: 600 9px/1.7 var(--sh-mono); font-style: normal; letter-spacing: .14em; text-transform: uppercase; color: var(--sh-steel); } +.g-tbrow > .v { min-width: 0; font-size: 12.5px; color: var(--sh-ink); } +.g-tbrow > .v.mono { font-family: var(--sh-mono); font-weight: 700; font-size: 12px; } +.g-tbrow > .v.col { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; } +.g-tbrow > .v small.warn { font-size: 10px; color: var(--sh-brass); } +/* 值格输入:无框,聚焦时行底线转钢蓝 —— 格子本身就是边界,不再套一层输入框 */ +.g-tbin { width: 100%; box-sizing: border-box; border: 0; background: transparent; padding: 1px 0; color: var(--sh-ink); font: inherit; font-size: 12.5px; } +.g-tbin.mono { font-family: var(--sh-mono); font-size: 11.5px; } +.g-tbin::placeholder { color: #a8b2be; } +.g-tbin:focus { outline: 0; } +.g-tbrow:focus-within, .g-tbedge:focus-within { border-bottom-color: #4e7daf; } +.g-tbin.sel { appearance: none; padding-right: 18px; background: transparent url('data:image/svg+xml;utf8,') no-repeat right 2px center; cursor: pointer; } +.g-tblink { display: inline-flex; align-items: center; gap: 4px; border: 0; background: transparent; padding: 0; font-size: 11px; color: #23507e; cursor: pointer; } +.g-tblink:hover { text-decoration: underline; } +.g-tbrow .g-seg { align-self: center; } + +/* 出边带 + 路由行:E号 → 去向(名),条件在下一行的值位 —— 一条共用提示住带右角 */ +.g-tbband { display: flex; align-items: baseline; gap: 8px; margin-top: 14px; padding: 7px 0 6px; border-bottom: 1px solid var(--sh-line); font: 600 9.5px/1 var(--sh-mono); letter-spacing: .14em; text-transform: uppercase; color: var(--sh-steel); } +.g-tbband .x { margin-left: auto; font-size: 8.5px; letter-spacing: .04em; text-transform: none; color: var(--sh-muted); } +.g-tbedge { display: flex; flex-direction: column; gap: 3px; padding: 8px 0 9px; border-bottom: 1px solid var(--sh-grid, #edf1f5); } +.g-tbedge .rt { display: flex; align-items: baseline; gap: 6px; font-family: var(--sh-mono); font-size: 10px; color: var(--sh-muted); } +.g-tbedge .rt b { font-size: 11px; font-weight: 700; color: var(--sh-ink); } +.g-tbedge .rt svg { align-self: center; color: var(--sh-muted); } +.g-tbedge .rt .to { font-weight: 700; color: var(--sh-steel); } +.g-tbedge .rt .nm { font-family: var(--sans); font-size: 11px; color: var(--sh-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.g-tbedge .g-tbin { padding-left: 0; } /* 字段 = 图签小格:微墨签(mono 大写)+ 纸上填线(输入只留底线,聚焦底线转钢蓝) */ .g-nodecard .g-field { gap: 3px; } @@ -772,27 +807,34 @@ .tb-well-none { margin: 0; padding: 10px 12px; font-size: 11px; line-height: 1.8; color: var(--sh-muted); } .tb-well-t { margin: 0; padding: 0 12px 11px; font-size: 10px; line-height: 1.7; color: var(--sh-muted); } -/* ── ① 一封信:外界的东西 —— 全屏唯一的无衬线区,标签在左、底线在下 ── */ -.tb-ml { display: flex; flex-direction: column; padding: 2px 14px 12px; } -.tb-ml-r { display: grid; grid-template-columns: 56px minmax(0, 1fr); align-items: center; gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--sh-line); } -.tb-ml-r.tall { align-items: start; } -.tb-ml-r:last-child { border-bottom: 0; } -.tb-ml-r > em { font: 600 9px/1.7 var(--sh-mono); letter-spacing: .14em; text-transform: uppercase; font-style: normal; color: var(--sh-muted); padding-top: 1px; } -.tb-ml-i { width: 100%; box-sizing: border-box; border: 0; background: transparent; padding: 3px 0; color: var(--sh-ink); font: 400 13px/1.7 var(--sans); resize: vertical; } -.tb-ml-i::placeholder { color: var(--sh-muted); } -.tb-ml-i:focus { outline: 0; } -.tb-ml-r:focus-within { border-bottom-color: var(--sh-live); } -.tb-ml-i.sel { appearance: none; padding-right: 20px; background: transparent url('data:image/svg+xml;utf8,') no-repeat right 4px center; cursor: pointer; } -.tb-ml-i.sel option { background: var(--sh-panel); color: var(--sh-ink); } -.tb-ml-at { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 2px 0; } -.g-att { display: inline-flex; align-items: center; gap: 5px; padding: 4px 6px 4px 8px; border: 1px solid var(--sh-line); border-radius: 6px; background: var(--sh-panel-2); font-size: 11px; color: var(--sh-ink); } -.g-att svg { color: var(--sh-steel); } -.g-att i { font-style: normal; font-family: var(--sh-mono); font-size: 9.5px; color: var(--sh-muted); } -.g-att button { display: inline-flex; padding: 2px; border: 0; background: transparent; color: var(--sh-muted); cursor: pointer; } -.g-att button:hover { color: var(--sh-alarm); } -.g-att-add { display: inline-flex; align-items: center; gap: 5px; padding: 5px 9px; border: 1px dashed var(--sh-lineb); border-radius: 6px; background: transparent; color: var(--sh-steel); font: inherit; font-size: 11px; cursor: pointer; } -.g-att-add:hover { border-color: var(--sh-steel); color: var(--sh-ink); } -.g-att-add:focus-visible, .g-att button:focus-visible { outline: 2px solid var(--sh-live); outline-offset: 1px; } +/* ── ① 一封信 = 一张**纸**压在暗台面上:整台仪器里唯一的浅色面 ── + 「机器说 mono、信是外界」推到视觉结论 —— 外界伸进仪器的那件东西,长得像张纸。 + 暖白纸面、纸边细线、投影浮起;信上全是无衬线,只有标签是小号暖灰。 */ +.tb-paper { margin: 12px 14px 14px; border: 1px solid #d9d3c4; border-radius: 5px; background: #fbfaf6; box-shadow: 0 2px 10px rgba(0, 0, 0, .38), 0 8px 26px -10px rgba(0, 0, 0, .5); } +.tb-pp-h { padding: 4px 16px 0; } +.tb-pp-r { display: grid; grid-template-columns: 52px minmax(0, 1fr); align-items: center; gap: 10px; padding: 8px 0 7px; border-bottom: 1px solid #ece7da; } +.tb-pp-r > em { font: 600 10px/1.6 var(--sans); font-style: normal; color: #8b8674; } +.tb-pp-i { width: 100%; box-sizing: border-box; border: 0; background: transparent; padding: 0; color: #2b3040; font: 400 13px/1.7 var(--sans); } +.tb-pp-i.strong { font-weight: 600; } +.tb-pp-i::placeholder { color: #b3ad9c; } +.tb-pp-i:focus { outline: 0; } +.tb-pp-r:focus-within { border-bottom-color: #b98432; } +.tb-pp-i.sel { appearance: none; padding-right: 20px; background: transparent url('data:image/svg+xml;utf8,') no-repeat right 4px center; cursor: pointer; } +.tb-pp-i.sel option { background: #fbfaf6; color: #2b3040; } +/* 正文:纸上的一片空,不描边不描线 —— 写信不是填表 */ +.tb-pp-body { display: block; width: 100%; box-sizing: border-box; border: 0; background: transparent; padding: 12px 16px 6px; color: #2b3040; font: 400 13px/1.9 var(--sans); resize: none; min-height: 110px; } +.tb-pp-body::placeholder { color: #b3ad9c; } +.tb-pp-body:focus { outline: 0; } +/* 附件签条:纸的下沿,一条虚线隔开 —— 夹在信末的东西 */ +.tb-pp-att { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 9px 16px 12px; border-top: 1px dashed #ddd7c8; } +.tb-att { display: inline-flex; align-items: center; gap: 5px; padding: 3px 6px 3px 8px; border: 1px solid #ddd7c8; border-radius: 4px; background: #f4f1e8; font: 500 11px/1.5 var(--sans); color: #4a4536; } +.tb-att svg { color: #8b8674; } +.tb-att i { font-style: normal; font-family: var(--sh-mono); font-size: 9px; color: #8b8674; } +.tb-att button { display: inline-flex; padding: 2px; border: 0; background: transparent; color: #8b8674; cursor: pointer; } +.tb-att button:hover { color: #b0413e; } +.tb-att-add { display: inline-flex; align-items: center; gap: 5px; padding: 4px 9px; border: 1px dashed #c9c2ae; border-radius: 4px; background: transparent; color: #8b8674; font: 500 11px/1.5 var(--sans); cursor: pointer; } +.tb-att-add:hover { border-color: #8b8674; color: #4a4536; } +.tb-att-add:focus-visible, .tb-att button:focus-visible, .tb-pp-i:focus-visible { outline: 2px solid #b98432; outline-offset: 1px; } /* ── ② 节点指派:一条竖轨挂着所有节点,右端是插座 —— 插了人点琥珀 ── */ .tb-asn { display: flex; flex-direction: column; padding: 6px 14px 10px; } diff --git a/apps/web/src/features/gov-process/internal/panel.tsx b/apps/web/src/features/gov-process/internal/panel.tsx index f19bc20..1856141 100644 --- a/apps/web/src/features/gov-process/internal/panel.tsx +++ b/apps/web/src/features/gov-process/internal/panel.tsx @@ -852,37 +852,49 @@ function FlowLab({ * 也不再摆数据契约声明:数据契约**归活动自己**,要看去活动库看(下面那枚钮直达)。 */