Files
aurora-admin/tests/mobile/tabbar.html
T
aurora-admin f1fbfc2ddb
Regression / regression (push) Canceled after 0s
feat(品牌标识): 几何 K 图标(favicon/顶栏标记/theme-color) + 并行会话成果入库
## 品牌标识(本次会话)

起因:品牌此前没有任何图形标识 —— 唯一 favicon 是内联 data-URI 里的字母「A」,
那是 v2.0.0「Aurora Admin → Kole UI」改名漏掉的一处(PC 顶栏也是「A」,
移动端站已是「K」;移动端文档站则完全没有 favicon)。

- 几何:24 网格三个互不接触的笔画(竖 + 两斜),圆头描边;
  描边 2.25 → 16px 标签页尺寸下正好 1.5px = 规范原文「描边1.5px」
- 取色分两套(刻意):favicon 硬编码品牌蓝/白(渲染在浏览器标签栏,不继承 kole-dark);
  顶栏标记走 currentColor(实测暗色下自动转 rgb(20,22,28))
- 新增 theme-color 双条(light #FFFFFF / dark #1C1F26,取 --kole-color-card-bg)
- 修 site/app.js hero 标语 KOLE ADMIN → KOLE UI(改名变形残留)
- 移动端 7 个模板补 favicon(此前计数 0)

验收:门禁 9 条全 OK(site-routing/site-routes/mobile-docs/mobile-site/isolation/
theme/nav/i18n/icons);PC 回归 1464/1464 · 移动端 807/807,各连跑 8 次一致;
两端 favicon 405 字节逐字节一致;PC 站控制台错误 1→0。

## 并行会话成果(本次一并入库)

- 图标系统:2576 图标(TDesign/Element Plus,MIT)+ 11 端注入 + 5 个构建门禁工具
  + IconPreview 预览页 + ICON-SPEC.md 冻结规格
- 移动端平台:47 组件 × 6 端 + 文档站 53 页 + 隔离门禁
- PC 组件:103 个大后台组件 / 组件11 批次
- uni-app:PC 端试点 + 移动端端实现 + 真实编译验证

## 工程

- .gitignore 补 .scratch/ 与 .zcode-preexisting-*.txt(会话中间产物,实测 9.1MB,不入库)
- CHANGELOG 补品牌标识条目
- ROADMAP 登 S8-P4(品牌标识任务包 + og:image/apple-touch-icon 未做部分)
2026-09-21 10:05:48 +08:00

107 lines
8.0 KiB
HTML
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.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>tabbar — 移动端测试页</title>
<link rel="stylesheet" href="../../.design_library/kole-ui-mobile/colors_and_type.css">
<style>
/* 移动端测试页独立样式(不引用 site/style.css,避免与 PC 侧耦合) */
body { margin: 0; font-family: var(--kole-font-family); color: var(--kole-color-text-body); background: var(--kole-color-page-bg); }
.t-shell { max-width: 1200px; margin: 0 auto; padding: 24px; }
.t-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; flex-wrap: wrap; gap: 12px; }
.t-head h1 { margin: 0; font-size: 22px; color: var(--kole-color-text-title); }
.t-head h1 .en { font-family: var(--kole-font-family-num); font-size: 14px; color: var(--kole-color-text-secondary); margin-left: 8px; }
.t-nav { display: flex; gap: 8px; }
.t-btn { height: 30px; padding: 0 12px; border-radius: var(--kole-radius-base); border: 1px solid var(--kole-color-border); background: var(--kole-color-card-bg); color: var(--kole-color-text-body); font-size: 13px; cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 4px; }
.t-btn:hover { border-color: var(--kole-color-brand); color: var(--kole-color-brand); }
.t-btn.primary { background: var(--kole-color-brand); border-color: var(--kole-color-brand); color: var(--kole-color-text-inverse); }
.t-section { background: var(--kole-color-card-bg); border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-large); padding: 20px; margin-bottom: 20px; }
.t-section h2 { font-size: 16px; margin: 0 0 12px; color: var(--kole-color-text-title); }
.t-section .desc { color: var(--kole-color-text-secondary); font-size: 13px; margin: 0 0 12px; }
.t-summary { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
.t-pill { display: inline-flex; align-items: center; gap: 4px; height: 22px; padding: 0 10px; border-radius: var(--kole-radius-small); font-size: 12px; background: var(--kole-color-table-header-bg); color: var(--kole-color-text-secondary); font-family: var(--kole-font-family-num); }
.t-pill.pass { background: rgba(82,196,26,.12); color: var(--kole-color-success); }
.t-pill.fail { background: rgba(245,34,45,.12); color: var(--kole-color-error); }
.t-pill.skip { background: var(--kole-color-table-header-bg); color: var(--kole-color-text-placeholder); }
.t-list { display: flex; flex-direction: column; gap: 6px; }
.t-row { display: flex; align-items: center; gap: 10px; padding: 6px 10px; border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-base); font-size: 13px; }
.t-row .id { font-family: var(--kole-font-family-num); color: var(--kole-color-text-secondary); flex: 1; word-break: break-all; }
.t-row .ms { font-family: var(--kole-font-family-num); color: var(--kole-color-text-placeholder); font-size: 12px; }
.t-row .err { color: var(--kole-color-error); font-size: 12px; margin-left: 8px; }
.t-snap-head { display: flex; gap: 8px; align-items: center; margin: 0 0 10px; flex-wrap: wrap; }
/* 移动端演示帧:固定 375×640 视口,让 position:fixed 的导航栏/标签栏落在帧内正确位置 */
#snapshot { border: 1px solid var(--kole-color-border); border-radius: var(--kole-radius-medium); overflow: hidden; background: var(--kole-color-page-bg); padding: 12px 0; }
#snapshot iframe { width: 375px; height: 640px; margin: 0 auto; border: 0; display: block; background: var(--kole-color-card-bg); }
.t-fab { position: fixed; right: 24px; bottom: 24px; display: flex; flex-direction: column; gap: 8px; z-index: 100; }
.t-toast { position: fixed; top: 24px; right: 24px; z-index: 200; padding: 8px 14px; background: var(--kole-color-text-title); color: var(--kole-color-text-inverse); border-radius: var(--kole-radius-base); font-size: 13px; opacity: 0; transition: opacity .2s; pointer-events: none; }
.t-toast.show { opacity: 1; }
</style>
</head>
<body>
<div class="t-shell">
<div class="t-head">
<h1>底部标签栏<span class="en">tabbar(移动端)</span></h1>
<div class="t-nav">
<a class="t-btn" href="../../site/m/component/tabbar.html" target="_blank">← 移动端文档</a>
<button id="run-asserts" class="t-btn primary" type="button">运行断言</button>
<button id="export-log" class="t-btn" type="button">导出日志</button>
<button id="clear-log" class="t-btn" type="button">清空日志</button>
</div>
</div>
<div class="t-section">
<h2>渲染快照(真实演示页 · 375×640 设备帧)</h2>
<p class="desc">iframe 直接加载 <code>frameworks-mobile/TabBar.html</code>:移动端样式与内联手势脚本真实执行,断言在帧内运行(与 PC 侧共用 <code>tests/_runtime.js</code> 引擎,行为动词来自移动端 <code>tests/mobile/_behaviors.js</code>)。</p>
<div class="t-snap-head">
<a class="t-btn" href="../../frameworks-mobile/TabBar.html" target="_blank">↗ 新窗口打开演示页</a>
<button id="reload-frame" class="t-btn" type="button">重载演示页</button>
<span class="t-pill" id="frame-state">加载中…</span>
</div>
<div id="snapshot">
<iframe id="snapshot-frame" src="../../frameworks-mobile/TabBar.html" title="tabbar 移动端组件演示页"></iframe>
</div>
</div>
<div class="t-section">
<h2>断言结果</h2>
<div class="t-summary">
<span class="t-pill" id="sum-total">总数 0</span>
<span class="t-pill pass" id="sum-pass">通过 0</span>
<span class="t-pill fail" id="sum-fail">失败 0</span>
<span class="t-pill skip" id="sum-skip">跳过 0</span>
<span class="t-pill" id="sum-ms">耗时 0 ms</span>
</div>
<ul class="t-list" id="result-list" style="margin-top: 12px; list-style: none; padding: 0;"></ul>
</div>
<div class="t-section">
<h2>通用测试矩阵(自动断言)</h2>
<p class="desc">与 PC 侧同一套矩阵:默认态、变体覆盖、状态可达、可见用例、键盘可达、焦点环、ARIA 属性、对比度、token 一致性;移动端另加触控行为断言(滑动 / 下拉 / 标签切换)。</p>
<ol style="margin: 0; padding-left: 18px; color: var(--kole-color-text-body); font-size: 13px; line-height: 22px;">
<li>默认态渲染:用例节点齐全(<code>data-assert</code>)</li>
<li>变体覆盖:≥2 变体或 ≥2 用例</li>
<li>状态可达:默认态或样式表定义了交互态</li>
<li>可见用例:≥1 个用例默认可见</li>
<li>键盘可达:可点元素必须是原生 button/a 或带 tabindex</li>
<li>焦点环可视::focus-visible 描边已定义</li>
<li>ARIA:非原生可聚焦元素具备 role / aria-*</li>
<li>对比度:用例区文本 ≥ 4.5:1</li>
<li>token 一致性:不出现硬编码 hex 颜色</li>
<li>触控行为:滑动露出操作 / 下拉触发刷新 / 标签切换(帧内真实手势事件)</li>
</ol>
</div>
</div>
<div class="t-fab">
<button id="export-log-2" class="t-btn" type="button" title="下载 JSON">导出</button>
</div>
<div id="toast" class="t-toast">已导出 ✓</div>
<script src="../../site/logger.js"></script>
<script>window.__koleBehaviorSlugs = ["navbar","tabbar","actionsheet","pullrefresh","swipecell","mobile-button","cell","mobile-tag","mobile-popup","mobile-toast","mobile-dialog","mobile-grid","mobile-noticebar","mobile-numberkeyboard","mobile-datepicker","mobile-icon","mobile-link","mobile-loading","mobile-list","mobile-collapse","mobile-progress","mobile-input","mobile-search","mobile-stepper","mobile-switch","mobile-textarea","mobile-checkbox","mobile-form","mobile-radio","mobile-rate","mobile-slider","mobile-cascader","mobile-colorpicker","mobile-message","mobile-overlay","mobile-picker","mobile-popover","mobile-segmented","mobile-sticky","mobile-table","mobile-typography","mobile-upload"]; window.__SLUG__ = "tabbar";</script>
<script src="./_behaviors.js"></script>
<script src="../_runtime.js"></script>
</body>
</html>