Files
workspace/code/g3soft-libs/.changeset/table-cell-status-shapes.md
T
2026-10-15 22:47:42 +08:00

19 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
'@g3soft/ui': minor
---
G3Table:校验态补「左侧语义色竖条」、禁用灰底加深一档 —— 让「格级」与「行级」状态重新分得开。
- **校验态(`errorStyle: 'cell'`)新增左侧 3px 语义色竖条**(error 红 / warning 琥珀),底色浓度不变(8% / 5%)。
- 背景:表体的纵向列线已经去掉(见上一条 changeset)。原来「格级色块被列线围成矩形、行级是一条长带」的**形状差异**没了,校验底色退化成无边界的横带,只剩色相一个通道 —— 「这一格有问题」很容易被读成「这一段行有问题」。左侧竖条把形状还回来:竖条 = 格级,横带 = 行级。
- 画在 `background-image` 上,不是 `border`(进盒模型会顶高行高、破坏虚拟滚动 `translateY` 的基准),也不是 `box-shadow`(单值属性,会与库的单元格选区描边、焦点环、固定列叠色互相整条覆盖)。因此 `background-origin` 按层指定:第 1 层用 `border-box` —— 表体纯文本格有 `--cell-padding-x`(12px)内边距,用默认的 `padding-box` 竖条会飘在格子内部 12px 处。
- 「正在编辑的那一格让位」的既有行为不变:编辑时既无底色也无竖条,只剩语义色焦点环 + 红字。
- **禁用(改不了)灰底从 3% 提到 6%**(暗色 4% → 8%)。灰底与斑马纹同色相、都是一条横带,原来只差约 1% 亮度,肉眼分不出「这行是条纹」还是「这格改不了」;拉开一档后可辨。整列只读 / 整列禁用 / 按行禁用三种情形共用这一套。
- **「既禁用又校验不过」的格子仍然只显示灰**(既有决策:改不了就别再提示这里错了)。灰底规则里**显式写回**库那两层格线(`background-image: var(--bg-border-right), var(--bg-border-bottom)`)—— 竖条加在 `background-image` 第 1 层上,而 background-image 不能按层覆盖,只改 `background-color` 的话灰底上会留一条红 / 黄竖条。亮 / 暗两份灰底规则都要写(只写亮色就会出现「亮色纯灰、暗色留红条」)。
- **注释修正**:`G3Table.vue` 里「灰底权重 (0,6,1) 高于校验态 (0,4,1)」这句是旧数字 —— 校验态选择器带 `:has()`,特异性取参数中最高者,按行禁用那条与校验态实测同为 `(0,7,1)`,胜负实际由「谁写在后面」决定。已改成准确表述并加了警告。
- **失败原因现在有出口了**:`validate` / `validateWarning` 返回的字符串(「金额必须大于 0」)此前在 `resolveEditorStatus` 里**只被取 `.length` 判等级、内容直接丢掉** —— 业务精心写的失败原因没有任何出口,用户只知道「这格红了」。现在该结果归一为 `{ level, message }` 一次带出,挂到内容节点的 `data-validate-message` 上,表格侧 **hover 那一格**时弹一个自绘浮层显示原因(悬停格内任意位置都行,移开 / 滚动即收)。
- 浮层是**全表共用一个 DOM**(`v-if` + 根节点上的 `mouseover` 事件委托),常态下定时器 / 监听器 / DOM 全都不存在;落到出错格上只做一次 `getBoundingClientRect()`,且滚动即关闭、不做跟随,所以滚动路径上不会出现逐帧测量。刻意没有给每个出错格挂 Tooltip:那是每个实例两组监听器,虚拟滚动下还要随行反复挂载销毁,再叠上固定列 `sticky` 的定位与层叠,容易写出「只在某个滚动位置下错位」的问题。
- 委托的判定单位是**格子**(`td`)而不是事件目标的祖先链:空值格的展示 span **宽度为 0**、右对齐数字格也常只有文字那么宽,鼠标绝大多数位置落在 `td` 的内边距上,按祖先链找会静默弹不出来(实测踩到)。
- 有原因时该格的 `title` 会让位(原本它挂的是「值」,用于内容被省略时兜底),避免原生 tooltip 与浮层叠成两个框;`aria-label` 则拼成「金额,金额必须大于 0」供屏幕阅读器。
- 文档(`docs/content/ui/data/table.md` 的「展示形态 `errorStyle`」与「不可改的格子」两节)同步更新。