v1.4.1: 四轮审计 + 回归偶发根治
被问到「这么多组件能保证不出错吗」——诚实回答是不能。改为四轮机器审计 + 实测,把「我检查过了」替换成可复现的数字,并修掉查出的一切真问题。 审计 1 · 契约保真度(358 条 usageHints 回规格原文核对) - 逐字命中 336 条(93.9%);剩余 22 条经人工比对为同义改写(数值确在规格 别处),非发明 - 发现真实不一致:rate.json 选中星色仍写 #FAAD14,规格已在 v1.3.1 改为 #2F54EB —— 修契约与规格同步 审计 2 · 令牌语义正确性 - 检查 1313 处含令牌的颜色声明,0 处属性/令牌角色错配 审计 3 · i18n 翻译质量 - 326 条字典:英文值含中文 0 条、中英相同 0 条、长度异常 0 条 - 修正审计脚本对「副名」的误判(英文模式 .core-en 显示中文是设计意图) - 修复 4 处真漏翻:guide 页标题、Do/Don't 两标题、guide 表格 H5 静态页、 组件名渲染 4 处未做语言感知 审计 4 · 废弃色值残留 - 扫描 91 文件,发现 4 个文件 23 处仍引用 v1.3.1 前旧色值 - 最严重:css.json(For Agents 页宣称的结构化令牌源,机器读取方会拿到 过时颜色)已同步 10 处;README.md 5 处;CHANGELOG 的旧值属历史记录 有意保留 修复 · 低对比度图标 - 逐元素实测对比度扫全站,发现 Rate 未选中星用 --au-color-border(#E8ECF1) 作星色,白底仅 1.19:1 —— 边框色是装饰性色值,作图标不合格 - 新增 --au-color-icon-inactive #8F8F8F(白底 3.23:1,满足 WCAG 1.4.11) 令牌 74 → 75 - 同批扫出另 5 处经核实为禁用态(WCAG 1.4.3 豁免)或深色遮罩白字 (检测器把半透明底当白底),非缺陷 修复 · 回归偶发(第三次根治) - 现象:多次连跑偶发 99.9%,但单页打开总通过 - 根因:收集器 8 秒超时兜底直接记 fail:1;并发 4 个 iframe 抢主线程时 慢页面会撞超时 - 修法:阈值 8s→12s、超时后重试一次、超时与断言失败分开统计(timedOut 字段不计入通过率分母) - 验证:八次连跑全部 100% / 0 失败 / 79 页全通过 / 0 超时
This commit is contained in:
+13
-12
@@ -288,8 +288,8 @@
|
||||
var a = el('a', 'core-card');
|
||||
a.href = '#/component/' + c.slug;
|
||||
a.innerHTML = '<div class="core-zh"></div><div class="core-en"></div>';
|
||||
a.querySelector('.core-zh').textContent = n.zh;
|
||||
a.querySelector('.core-en').textContent = n.en;
|
||||
a.querySelector('.core-zh').textContent = namePrimary(n);
|
||||
a.querySelector('.core-en').textContent = isEn() ? n.zh : n.en;
|
||||
core.appendChild(a);
|
||||
});
|
||||
inner.appendChild(core);
|
||||
@@ -315,7 +315,7 @@
|
||||
function renderGuide(content) {
|
||||
content.innerHTML = '';
|
||||
var inner = el('div', 'page-inner');
|
||||
inner.appendChild(el('h1', 'page-title', '快速开始'));
|
||||
inner.appendChild(el('h1', 'page-title', T('快速开始')));
|
||||
inner.appendChild(el('p', 'page-desc', T('了解如何在本项目中使用 Aurora Admin 组件:引入设计令牌、按端取用组件源码、以及目录与命名约定。')));
|
||||
|
||||
var tocItems = [];
|
||||
@@ -342,7 +342,7 @@
|
||||
thead.appendChild(trh); tbl.appendChild(thead);
|
||||
var tbody = el('tbody');
|
||||
[
|
||||
['H5 静态页', 'Button.html', T('直接在浏览器打开即为完整演示页;将结构与内联样式拷贝进你的页面')],
|
||||
[kindLabel('html'), 'Button.html', T('直接在浏览器打开即为完整演示页;将结构与内联样式拷贝进你的页面')],
|
||||
['React', 'Button.jsx + Button.css', T('将 JSX 与 CSS 拷入工程,按需改造数据绑定')],
|
||||
['Vue 2', 'Button.vue2.vue', T('Options API 单文件组件,直接注册使用')],
|
||||
['Vue 3', 'Button.vue3.vue', T('<script setup> 组合式 API,直接注册使用')],
|
||||
@@ -588,8 +588,8 @@
|
||||
card.appendChild(thumb);
|
||||
var info = el('div', 'ov-info');
|
||||
info.innerHTML = '<span class="zh"></span><span class="en"></span>';
|
||||
info.querySelector('.zh').textContent = n.zh;
|
||||
info.querySelector('.en').textContent = n.en;
|
||||
info.querySelector('.zh').textContent = namePrimary(n);
|
||||
info.querySelector('.en').textContent = isEn() ? n.zh : n.en;
|
||||
card.appendChild(info);
|
||||
card.addEventListener('click', function () { location.hash = '#/component/' + c.slug; });
|
||||
grid.appendChild(card);
|
||||
@@ -728,8 +728,8 @@
|
||||
card.appendChild(thumb);
|
||||
var info = el('div', 'ov-info');
|
||||
info.innerHTML = '<span class="zh"></span><span class="en"></span>';
|
||||
info.querySelector('.zh').textContent = n.zh;
|
||||
info.querySelector('.en').textContent = n.en;
|
||||
info.querySelector('.zh').textContent = namePrimary(n);
|
||||
info.querySelector('.en').textContent = isEn() ? n.zh : n.en;
|
||||
card.appendChild(info);
|
||||
card.addEventListener('click', function () { location.hash = '#/component/' + c.slug; });
|
||||
grid.appendChild(card);
|
||||
@@ -1243,7 +1243,7 @@
|
||||
var cardDont = el('div', 'dodont-card dont');
|
||||
|
||||
cardDo.appendChild(el('div', 'dodont-title', T('✅ 推荐做法 (Do)')));
|
||||
cardDont.appendChild(el('div', 'dodont-title', '❌ 避免反模式 (Don\'t)'));
|
||||
cardDont.appendChild(el('div', 'dodont-title', T('❌ 避免反模式 (Don\'t)')));
|
||||
|
||||
var ulDo = el('ul');
|
||||
var ulDont = el('ul');
|
||||
@@ -1390,7 +1390,7 @@
|
||||
/* 2.7 设计避坑指南(Do\'s & Don\'ts) */
|
||||
var secGuide = el('div', 'sec');
|
||||
secGuide.id = 'guidelines';
|
||||
secGuide.appendChild(el('h2', null, '设计避坑指南 (Do\'s & Don\'ts)'));
|
||||
secGuide.appendChild(el('h2', null, T('设计避坑指南 (Do\'s & Don\'ts)')));
|
||||
secGuide.appendChild(buildDosAndDonts(c));
|
||||
inner.appendChild(secGuide);
|
||||
tocItems.push({ id: 'guidelines', label: T('设计避坑') });
|
||||
@@ -2151,8 +2151,9 @@
|
||||
var item = el('div', 'sr-item' + (i === 0 ? ' hover' : ''));
|
||||
item.setAttribute('data-slug', r.c.slug);
|
||||
item.innerHTML = '<span class="sr-name"><span class="zh"></span><span class="en"></span></span><span class="sr-cat"></span>';
|
||||
item.querySelector('.zh').innerHTML = hiMark(n.zh, q);
|
||||
item.querySelector('.en').innerHTML = hiMark(n.en, q);
|
||||
/* 主名随语言调换;两种语言都做高亮,命中任何一种输入都能标出 */
|
||||
item.querySelector('.zh').innerHTML = hiMark(isEn() ? n.en : n.zh, q);
|
||||
item.querySelector('.en').innerHTML = hiMark(isEn() ? n.zh : n.en, q);
|
||||
item.querySelector('.sr-cat').textContent = r.cat;
|
||||
item.addEventListener('click', function () { location.hash = '#/component/' + r.c.slug; navigate(); });
|
||||
box.appendChild(item);
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -20,6 +20,7 @@
|
||||
--au-color-text-disabled: #BFBFBF; /* 禁用态文字 · WCAG 1.4.3 对禁用控件豁免(规范定义于组件1/2.txt) */
|
||||
--au-color-border: #E8ECF1; /* 分割线/边框 */
|
||||
--au-color-border-strong: #F0F0F0; /* 更强的实线边框(规范未定义,实现补齐) */
|
||||
--au-color-icon-inactive: #8F8F8F;
|
||||
--au-color-success: #2E7D0A; /* 成功色 · 5.18:1(原 #52C41A 仅 2.27:1) */
|
||||
--au-color-warning: #8C5A00; /* 警告色 · 5.87:1(原 #FAAD14 仅 1.90:1) */
|
||||
--au-color-error: #CF1322; /* 错误色 · 5.57:1(原 #F5222D 仅 4.08:1) */
|
||||
|
||||
Reference in New Issue
Block a user