iter(g328): 语义三色淡底补令牌并纳入表面阶梯

This commit is contained in:
HIsheR
2026-10-27 01:58:02 +08:00
parent 04433ee19f
commit 2d93480fbf
7 changed files with 50 additions and 16 deletions
+9
View File
@@ -3338,6 +3338,15 @@
"motivation": "步骤条只有 done/current/upcoming 三态,某步校验失败时只能把 active 退回去,于是「失败」和「还没走到」长得一模一样——用户看不出是卡住了还是失败了;另外 clickable 时只有圆点能点,标题文字点不动,手指落在文字上是空操作。", "motivation": "步骤条只有 done/current/upcoming 三态,某步校验失败时只能把 active 退回去,于是「失败」和「还没走到」长得一模一样——用户看不出是卡住了还是失败了;另外 clickable 时只有圆点能点,标题文字点不动,手指落在文字上是空操作。",
"acceptance": "① StepperItem 增可选 status: 'error':该步红点 + 感叹号 + 标题标红,优先级高于进度态、不进 done 也不占 current、不参与回跳;② 失败符号带 role=img + aria-label「第 N 步失败:xx」,读屏不读孤立感叹号;③ clickable 时整个步骤条可点(圆点按钮 + 标题文字),点按钮与点文字各只触发一次 onChange;④ 样式只消费 --ua-*(danger 色 / alpha-soft 淡底 / weight-semibold),audit:visual 计数不涨;⑤ manifest props/步骤与演示同步,npm run check 全绿。", "acceptance": "① StepperItem 增可选 status: 'error':该步红点 + 感叹号 + 标题标红,优先级高于进度态、不进 done 也不占 current、不参与回跳;② 失败符号带 role=img + aria-label「第 N 步失败:xx」,读屏不读孤立感叹号;③ clickable 时整个步骤条可点(圆点按钮 + 标题文字),点按钮与点文字各只触发一次 onChange;④ 样式只消费 --ua-*(danger 色 / alpha-soft 淡底 / weight-semibold),audit:visual 计数不涨;⑤ manifest props/步骤与演示同步,npm run check 全绿。",
"notes": "" "notes": ""
},
{
"id": "g328",
"domain": "visual",
"status": "open",
"title": "语义三色淡底补令牌:同一组件里 info 与其余三色不再两套口径",
"motivation": "accent 有 --ua-color-tint-accent(亮 10% / 暗 14%),语义三色却没有对应令牌,15 处淡底全靠手写 color-mix:同一组 toast / tag 里 info 走令牌(透明叠加)、success / warning / danger 走「与页面底混色」(不透明),四种语义档的底其实两套口径;手写浓度也无法被门禁守住——accent 那档被 audit:surface 抓到过暗色几乎看不见,语义三色同样没有栅栏。",
"acceptance": "① tokens.css 新增 --ua-color-tint-danger / -success / -warning(亮色 var(--ua-alpha-soft),暗色 14%,与 accent 分档同构),tokens.json 同步三键(verify 的名字与值双源校验要过);② ui.css 15 处手写语义淡底(含与页面底混色的 6 处)统一换成令牌,四种语义档只剩一套口径;③ audit:surface 阶梯新增「表面 → 危险/成功/警告淡底」三档(阈值 1.04),四套主题全部实测达标;④ audit:visual 混色浓度计数不涨;⑤ npm run check 全绿。",
"notes": ""
} }
] ]
} }
+1 -1
View File
File diff suppressed because one or more lines are too long
+3
View File
@@ -2803,6 +2803,9 @@ node packages/tools/cli/bin/ua.js <index|list|info <包名|组件id[,组件id…
- --ua-color-danger: #a32d2d(暗色 #d96a6a) - --ua-color-danger: #a32d2d(暗色 #d96a6a)
- --ua-color-success: #0f6e56(暗色 #4fc39e) - --ua-color-success: #0f6e56(暗色 #4fc39e)
- --ua-color-warning: #9a6b1f(暗色 #d9a94f) - --ua-color-warning: #9a6b1f(暗色 #d9a94f)
- --ua-color-tint-danger: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent)(暗色 color-mix(in srgb, var(--ua-color-danger) 14%, transparent))
- --ua-color-tint-success: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-soft), transparent)(暗色 color-mix(in srgb, var(--ua-color-success) 14%, transparent))
- --ua-color-tint-warning: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-soft), transparent)(暗色 color-mix(in srgb, var(--ua-color-warning) 14%, transparent))
- --ua-alpha-soft: 10% - --ua-alpha-soft: 10%
- --ua-alpha-tint: 18% - --ua-alpha-tint: 18%
- --ua-alpha-line: 30% - --ua-alpha-line: 30%
+6
View File
@@ -27,6 +27,9 @@
--ua-color-danger: #a32d2d; /* 危险色:错误、删除、校验失败 */ --ua-color-danger: #a32d2d; /* 危险色:错误、删除、校验失败 */
--ua-color-success: #0f6e56; /* 成功色:完成、通过、正向结果 */ --ua-color-success: #0f6e56; /* 成功色:完成、通过、正向结果 */
--ua-color-warning: #9a6b1f; /* 警告色:提醒、需注意但不阻断 */ --ua-color-warning: #9a6b1f; /* 警告色:提醒、需注意但不阻断 */
--ua-color-tint-danger: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent); /* 语义淡底(危险):错误提示条、失败步骤底、删除按钮悬停底 */
--ua-color-tint-success: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-soft), transparent); /* 语义淡底(成功):通过提示、完成态条底 */
--ua-color-tint-warning: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-soft), transparent); /* 语义淡底(警告):需注意但不断言的提示底 */
/* ---- 混色浓度:color-mix 里「混入多少」的档位,百分比亮暗通用(近档已就近收敛:12→10、16/20/24→18、40→45、65/80→70) ---- */ /* ---- 混色浓度:color-mix 里「混入多少」的档位,百分比亮暗通用(近档已就近收敛:12→10、16/20/24→18、40→45、65/80→70) ---- */
--ua-alpha-soft: 10%; /* 淡底档:选中底、激活项底、语义色淡底 */ --ua-alpha-soft: 10%; /* 淡底档:选中底、激活项底、语义色淡底 */
@@ -167,6 +170,9 @@
--ua-color-danger: #d96a6a; /* 暗色危险色 */ --ua-color-danger: #d96a6a; /* 暗色危险色 */
--ua-color-success: #4fc39e; /* 暗色成功色 */ --ua-color-success: #4fc39e; /* 暗色成功色 */
--ua-color-warning: #d9a94f; /* 暗色警告色 */ --ua-color-warning: #d9a94f; /* 暗色警告色 */
--ua-color-tint-danger: color-mix(in srgb, var(--ua-color-danger) 14%, transparent); /* 暗色语义淡底(危险):与 accent 暗色同档,否则暗底上看不出「这一块是错误」 */
--ua-color-tint-success: color-mix(in srgb, var(--ua-color-success) 14%, transparent); /* 暗色语义淡底(成功) */
--ua-color-tint-warning: color-mix(in srgb, var(--ua-color-warning) 14%, transparent); /* 暗色语义淡底(警告) */
/* 暗色下投影需要更高黑度才看得见:亮色那套在暗底上几乎不可见 */ /* 暗色下投影需要更高黑度才看得见:亮色那套在暗底上几乎不可见 */
--ua-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.3); /* 暗色 1 档:贴地投影 */ --ua-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.3); /* 暗色 1 档:贴地投影 */
+12
View File
@@ -89,6 +89,18 @@
"light": "color-mix(in srgb, var(--ua-color-accent) 5%, transparent)", "light": "color-mix(in srgb, var(--ua-color-accent) 5%, transparent)",
"dark": "color-mix(in srgb, var(--ua-color-accent) 8%, transparent)" "dark": "color-mix(in srgb, var(--ua-color-accent) 8%, transparent)"
}, },
"tintDanger": {
"light": "color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent)",
"dark": "color-mix(in srgb, var(--ua-color-danger) 14%, transparent)"
},
"tintSuccess": {
"light": "color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-soft), transparent)",
"dark": "color-mix(in srgb, var(--ua-color-success) 14%, transparent)"
},
"tintWarning": {
"light": "color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-soft), transparent)",
"dark": "color-mix(in srgb, var(--ua-color-warning) 14%, transparent)"
},
"accentSoft": { "accentSoft": {
"light": "color-mix(in srgb, var(--ua-color-accent) 72%, var(--ua-color-bg))", "light": "color-mix(in srgb, var(--ua-color-accent) 72%, var(--ua-color-bg))",
"dark": "color-mix(in srgb, var(--ua-color-accent) 82%, var(--ua-color-bg))" "dark": "color-mix(in srgb, var(--ua-color-accent) 82%, var(--ua-color-bg))"
+15 -15
View File
@@ -644,7 +644,7 @@ body.ua-col-resizing {
color: var(--ua-color-danger); color: var(--ua-color-danger);
} }
.ua-menu-item.is-danger:hover:not(:disabled) { .ua-menu-item.is-danger:hover:not(:disabled) {
background: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-danger);
} }
.ua-menu-label { .ua-menu-label {
flex: 1; flex: 1;
@@ -899,15 +899,15 @@ body.ua-col-resizing {
} }
.ua-tag-success { .ua-tag-success {
border-color: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-strong), transparent); border-color: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-strong), transparent);
background: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-soft), var(--ua-color-bg)); background: var(--ua-color-tint-success);
} }
.ua-tag-warning { .ua-tag-warning {
border-color: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-strong), transparent); border-color: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-strong), transparent);
background: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-soft), var(--ua-color-bg)); background: var(--ua-color-tint-warning);
} }
.ua-tag-danger { .ua-tag-danger {
border-color: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-strong), transparent); border-color: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-strong), transparent);
background: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), var(--ua-color-bg)); background: var(--ua-color-tint-danger);
} }
.ua-tag-info { .ua-tag-info {
border-color: color-mix(in srgb, var(--ua-color-accent) var(--ua-alpha-strong), transparent); border-color: color-mix(in srgb, var(--ua-color-accent) var(--ua-alpha-strong), transparent);
@@ -1174,7 +1174,7 @@ button.ua-step-dot:hover {
} }
.ua-step-error .ua-step-dot { .ua-step-error .ua-step-dot {
border-color: var(--ua-color-danger); border-color: var(--ua-color-danger);
background: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent); /* 失败步骤只给淡底,不抢当前步的光环 */ background: var(--ua-color-tint-danger); /* 失败步骤只给淡底,不抢当前步的光环 */
color: var(--ua-color-danger); color: var(--ua-color-danger);
font-weight: var(--ua-weight-semibold); font-weight: var(--ua-weight-semibold);
} }
@@ -1427,15 +1427,15 @@ button.ua-step-dot:hover {
} }
.ua-alert-success { .ua-alert-success {
border-color: var(--ua-color-success); border-color: var(--ua-color-success);
background: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-success);
} }
.ua-alert-warning { .ua-alert-warning {
border-color: var(--ua-color-warning); border-color: var(--ua-color-warning);
background: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-warning);
} }
.ua-alert-danger { .ua-alert-danger {
border-color: var(--ua-color-danger); border-color: var(--ua-color-danger);
background: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-danger);
} }
/* —— 独立分页器 —— */ /* —— 独立分页器 —— */
@@ -1611,15 +1611,15 @@ button.ua-step-dot:hover {
} }
.ua-toast-success { .ua-toast-success {
border-color: var(--ua-color-success); border-color: var(--ua-color-success);
background: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-soft), var(--ua-color-bg)); background: var(--ua-color-tint-success);
} }
.ua-toast-warning { .ua-toast-warning {
border-color: var(--ua-color-warning); border-color: var(--ua-color-warning);
background: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-soft), var(--ua-color-bg)); background: var(--ua-color-tint-warning);
} }
.ua-toast-danger { .ua-toast-danger {
border-color: var(--ua-color-danger); border-color: var(--ua-color-danger);
background: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), var(--ua-color-bg)); background: var(--ua-color-tint-danger);
} }
/* —— 加载指示器 —— */ /* —— 加载指示器 —— */
@@ -4264,7 +4264,7 @@ button.ua-step-dot:hover {
padding: var(--ua-space-2) var(--ua-space-3); padding: var(--ua-space-2) var(--ua-space-3);
border: 1px solid color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-mid), transparent); border: 1px solid color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-mid), transparent);
border-radius: var(--ua-radius-sm); border-radius: var(--ua-radius-sm);
background: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-danger);
color: var(--ua-color-danger); color: var(--ua-color-danger);
font-size: var(--ua-font-size-md); font-size: var(--ua-font-size-md);
} }
@@ -6134,17 +6134,17 @@ h5.ua-type-title { font-size: var(--ua-font-size-md); }
.ua-notice-success { .ua-notice-success {
border-color: var(--ua-color-success); border-color: var(--ua-color-success);
background: color-mix(in srgb, var(--ua-color-success) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-success);
} }
.ua-notice-warning { .ua-notice-warning {
border-color: var(--ua-color-warning); border-color: var(--ua-color-warning);
background: color-mix(in srgb, var(--ua-color-warning) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-warning);
} }
.ua-notice-danger { .ua-notice-danger {
border-color: var(--ua-color-danger); border-color: var(--ua-color-danger);
background: color-mix(in srgb, var(--ua-color-danger) var(--ua-alpha-soft), transparent); background: var(--ua-color-tint-danger);
} }
@keyframes ua-notice-roll { @keyframes ua-notice-roll {
+4
View File
@@ -11,6 +11,10 @@ export const LADDER = [
{ label: '表面 → 凹陷底', from: 'surface', to: 'surface-inset', min: 1.02 }, // 凹陷区自带边框与内阴影,可放宽一档 { label: '表面 → 凹陷底', from: 'surface', to: 'surface-inset', min: 1.02 }, // 凹陷区自带边框与内阴影,可放宽一档
{ label: '表面 → 淡底标准档', from: 'surface', to: 'tint-accent', min: 1.04 }, // 选中项底:半透明 accent 压在表面上,浓度调低即看不出「选中」 { label: '表面 → 淡底标准档', from: 'surface', to: 'tint-accent', min: 1.04 }, // 选中项底:半透明 accent 压在表面上,浓度调低即看不出「选中」
{ label: '表面 → 淡底弱档', from: 'surface', to: 'tint-accent-weak', min: 1.04 }, // 悬停底(列表 / 选项 / 行):比标准档更弱,最容易被调到看不见 { label: '表面 → 淡底弱档', from: 'surface', to: 'tint-accent-weak', min: 1.04 }, // 悬停底(列表 / 选项 / 行):比标准档更弱,最容易被调到看不见
// 语义三色淡底:错误 / 成功 / 警告提示条的底,浓度被调低时提示条会退化成普通卡片(只剩边框与图标在说话)
{ label: '表面 → 危险淡底', from: 'surface', to: 'tint-danger', min: 1.04 },
{ label: '表面 → 成功淡底', from: 'surface', to: 'tint-success', min: 1.04 },
{ label: '表面 → 警告淡底', from: 'surface', to: 'tint-warning', min: 1.04 },
]; ];
/*** 作用:按四套主题(亮 / 暗 × 常规 / 高对比)逐档算亮度比,返回明细与未达标项 ***/ /*** 作用:按四套主题(亮 / 暗 × 常规 / 高对比)逐档算亮度比,返回明细与未达标项 ***/