iter(g85): 进度条补可访问名与语义色

This commit is contained in:
HIsheR
2026-10-26 13:03:43 +08:00
parent b2beb43736
commit bd64e437b1
8 changed files with 68 additions and 32 deletions
+6 -2
View File
@@ -9,10 +9,13 @@ export function progress(props: ProgressProps = {}): HTMLElement {
const track = h('div', { class: 'ua-progress-track' }, fill);
const text = h('span', { class: 'ua-progress-text' });
const withText = props.showText !== false && !!value; // 不确定态没有百分比可显示
const label = props.label; // 可访问名:读屏念「上传进度 50%」而不是干巴巴的百分比
const variant = props.variant ?? 'default'; // 语义色:default 之外都带类名,满格时仍以 variant 为准
const cls = `ua-progress${variant === 'default' ? '' : ` ua-progress-${variant}`}`;
if (!value) {
fill.classList.add('ua-indeterminate'); // 宽度与往复动画交给 CSS
return h('div', { class: 'ua-progress', role: 'progressbar', 'aria-label': '进行中' }, track);
return h('div', { class: cls, role: 'progressbar', 'aria-label': label ?? '进行中' }, track);
}
effect(() => {
const v = clamp(value()); // 依赖收集:信号变化自动写回
@@ -23,8 +26,9 @@ export function progress(props: ProgressProps = {}): HTMLElement {
return h(
'div',
{
class: 'ua-progress',
class: cls,
role: 'progressbar',
'aria-label': label,
'aria-valuemin': '0',
'aria-valuemax': '100',
'aria-valuenow': () => String(Math.round(clamp(value()))),
+2
View File
@@ -314,6 +314,8 @@ export interface SpinnerProps {
export interface ProgressProps {
value?: Signal<number>; // 当前进度 0-100 的信号;不传即不确定态(未知时长的加载)
showText?: boolean; // 是否右侧显示百分比;缺省 true(不确定态忽略)
label?: string; // 可访问名,如「上传进度」;缺省不确定态念「进行中」,定量态无名称
variant?: 'default' | 'success' | 'warning' | 'danger'; // 填充语义色;缺省 default(满格自动切 success)
}
/*** 标签页入参 ***/
+15 -9
View File
@@ -1123,23 +1123,29 @@
{
"n": "value",
"t": "Signal<number>",
"d": "当前进度 0-100 信号,变化自动平滑过渡(越界钳制)"
"d": "当前进度 0-100 的信号;不传即不确定态(未知时长的加载)"
},
{
"n": "showText",
"t": "boolean",
"d": "是否显示百分比文字;缺省 true",
"df": "true"
"d": "是否右侧显示百分比;缺省 true(不确定态忽略)"
},
{
"n": "label",
"t": "string",
"d": "可访问名,如「上传进度」;缺省不确定态念「进行中」"
},
{
"n": "variant",
"t": "'default' | 'success' | 'warning' | 'danger'",
"d": "填充语义色;缺省 default(满格自动切 success)"
}
],
"example": "const pct = signal(0); progress({ value: pct }); setInterval(() => pct((pct() + 5) % 105), 400)",
"steps": [
"时长未知的加载直接 progress() 不传 value:填充块匀速往复,不显示百分比,读屏读作进行中",
"创建数值信号 pct = signal(0),范围 0-100(越界自动钳制)",
"传入 value,填充宽度与百分比文字随信号平滑过渡",
"进行中填充带流动条纹,到 100% 自动变 success 色并停止条纹",
"不需要百分比文字时传 showText: false",
"定量进度用 value 信号:满格自动切 success 色并停止条纹,role=progressbar + aria-valuenow 同步"
"传 value 信号给定量进度,不传则退化为往复的不确定态",
"label 写清这是什么进度,读屏会把名称与百分比一起念出来",
"失败或告警用 variant: 'danger' / 'warning',该颜色在满格时也不被 success 覆盖"
]
},
{
+10
View File
@@ -1364,6 +1364,16 @@ button.ua-step-dot:hover {
animation: none;
opacity: 0;
}
/* 语义色:显式声明在 ua-done 之后,同特异性以调用方 variant 为准(满格不回退 success) */
.ua-progress-success .ua-progress-fill {
background: var(--ua-color-success);
}
.ua-progress-warning .ua-progress-fill {
background: var(--ua-color-warning);
}
.ua-progress-danger .ua-progress-fill {
background: var(--ua-color-danger);
}
/* 不确定态:固定比例填充块匀速往复,宽度与位移都由动画控制 */
.ua-progress-fill.ua-indeterminate {
width: 35%;