refactor: 原型迁移 .superpowers/prototype → design/prototype(与 CONTRACT 同目录)
Design Source Checks / design-source (push) Failing after 14m23s

- git mv 全目录(历史保留);.gitignore 收敛为整个 .superpowers/ 忽略
- 全仓 16 处引用同步(CI checks.yml / l1-sync / screens.mjs / hooks /
  CLAUDE.md / CONTRACT / SSR 模板注释 / docs / web 注释)
- 修 pre-commit 路径正则残留;5180 评审服务已切新路径
- 验证:check-ds 12 道 / l1-sync 6 道 / fidelity 抽查全过

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJ1g8XV1YhhmHRzhwWEW7o
This commit is contained in:
wangjia
2026-07-07 18:47:31 +08:00
parent d1b7e8e2e9
commit 05203a9b5b
79 changed files with 46 additions and 48 deletions
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
run: sh scripts/ci/provision-mac.sh
- name: 原型设计系统闸(check-ds 12 道)
run: node .superpowers/prototype/tools/check-ds.mjs
run: node design/prototype/tools/check-ds.mjs
- name: L1 真相源同源闸(tokens 快照 / icons / 官网 token 值 / web hex
run: node tools/check-l1-sync.mjs
+2 -4
View File
@@ -67,10 +67,8 @@ backend/gencode
# iOS 证书私钥(绝不入库)
.ios-certs/
# superpowers 工作目录brainstorm/sdd 是草稿不入库;
# prototype 是设计像素真源 + 设计系统守门闸(check-ds.mjs),入库供 CI 跑。
.superpowers/*
!.superpowers/prototype/
# superpowers 工作目录(草稿不入库)。原型已迁 design/prototype/2026-07-07)。
.superpowers/
# design-distill 保真目检对比图(可重生,见 tools/ds-compare.mjs
design/_compare/
+1 -1
View File
@@ -257,7 +257,7 @@ cd client && flutter test
### 设计真相源分层(原型漂移治理,2026-07-04 拍板)
原型(`.superpowers/prototype/`)与真实页面**不追求全量永久同步**,按层分治:
原型(`design/prototype/`)与真实页面**不追求全量永久同步**,按层分治:
- **L1 设计系统层**`tokens.css` / `atoms.css` / `mobile-atoms.css` / `icons.js` + `index.html` 登记):原型是**单一真源**。新增颜色/组件/图标必须**先登记原型再同步**代码与官网(如 `web/_includes/icons.njk`)。闸:pre-commit `check-ds.mjs` 12 道(本地钩子,新机器先跑 `sh scripts/hooks/install.sh`+ 代码侧 `client/tool/check_ds_code.mjs`
- **L2 屏级三态**(台账 = `design/CONTRACT.md` 块 4「真相源」列):
@@ -6,7 +6,7 @@
<title>{{.PageTitle}}</title>{{.OGTags}}
<style>
/* 设计系统单一真源:变量名与三主题(a 经典蓝浅 / b 琥珀深 / c 酒窖暖浅)色值
逐字取自 .superpowers/prototype/tokens.css。SSR 页自包含无法直接引 tokens.css
逐字取自 design/prototype/tokens.css。SSR 页自包含无法直接引 tokens.css
改配色须先改原型令牌再同步此处。--glow/--seal-bg 为本页派生变量(主色低透明度/表面高透明度)。 */
:root{
--r-md:6px; --r-lg:10px; --r-xl:14px; --r-pill:999px;
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{.PageTitle}}</title>{{.OGTags}}
<style>
/* 设计系统单一真源:变量名与三主题(a/b/c)色值逐字取自 .superpowers/prototype/tokens.css。
/* 设计系统单一真源:变量名与三主题(a/b/c)色值逐字取自 design/prototype/tokens.css。
与商品公开页同族;改配色须先改原型令牌再同步此处。--glow 为本页派生变量(主色低透明度)。 */
:root{
--r-md:6px; --r-lg:10px; --r-xl:14px; --r-pill:999px;
+4 -4
View File
@@ -11,11 +11,11 @@
| 项 | 位置 | 说明 |
|---|---|---|
| token 单源 | `.superpowers/prototype/tokens.css` | 三主题 `[data-theme=a/b/c]`,已 snapshot 到 `client/lib/core/theme/token_source/tokens.css` |
| token 单源 | `design/prototype/tokens.css` | 三主题 `[data-theme=a/b/c]`,已 snapshot 到 `client/lib/core/theme/token_source/tokens.css` |
| token codegen | `client/lib/core/theme/tool/gen_tokens.mjs``app_tokens.g.dart` | 单源生成,**禁手改**`kTokensA/B/C` + `appTokensOf(key)` |
| 实现层 | `themes.dart`buildTheme+ `context_tokens.dart``context.tokens` | AppTokens ThemeExtension 挂三 ThemeData |
| 原型清单 | `.superpowers/prototype/screens/*.html` | 桌面 + `m-*` 移动;viewport 桌面 1280×860 / 移动 390×844 |
| 设计铁律 | `.superpowers/prototype/index.html`atoms 注册)+ `tools/check-ds.mjs` 闸 | 颜色只走 token;组件出自已登记 atoms |
| 原型清单 | `design/prototype/screens/*.html` | 桌面 + `m-*` 移动;viewport 桌面 1280×860 / 移动 390×844 |
| 设计铁律 | `design/prototype/index.html`atoms 注册)+ `tools/check-ds.mjs` 闸 | 颜色只走 token;组件出自已登记 atoms |
| 验收工具 | `~/.claude/skills/design-distill/tools/{shoot-prototype,diff}.mjs` | prototype shoot 已验证三主题可出图 |
### 主题
@@ -206,7 +206,7 @@ AppTokens 目前**仅颜色**。原型还驱动:
> - 关于:旧版 帮助文档/扫码防伪/系统信息 卡删除,构建号并入版本 cell;更新日志走 `/public/release`(与官网时间线同源),接口不可达回退只显当前版本。
**验收法(HTML→Flutter 特例)**HTML(Chromium) 与 Flutter 渲染器不同,**严格 0.1% pixelmatch 不适用跨渲染器**(见 design-distill `references/flutter-golden.md`)。本项目双闸:
1. **保真闸(人工目检)**`node tools/ds-compare.mjs --html .superpowers/prototype/screens/<screen>.html --prefix <prefix>` → 截原型基准 + 与 Flutter golden 用 montage 并排 → `design/_compare/`
1. **保真闸(人工目检)**`node tools/ds-compare.mjs --html design/prototype/screens/<screen>.html --prefix <prefix>` → 截原型基准 + 与 Flutter golden 用 montage 并排 → `design/_compare/`
2. **回归闸(自动)**`test/golden/<screen>_golden_test.dart``pumpGolden`/`goldenAcrossThemes``test/support/golden_harness.dart`)出 A/B/C 三主题 golden,入库随 `flutter test` 同渲染器自比,抓串色/漏 token。
3. token 残留闸:`grep 0xFF…` 该屏为 0(颜色全走 `context.tokens`)。
+1 -1
View File
@@ -327,7 +327,7 @@ flutter build web --dart-define=BASE_URL=https://api.example.com
可隐藏列走列设置菜单;分页 `total` 带控件 / `pagerInfoText` 仅文案。行 hover、表头底色等
全部来自 `context.tokens`(禁硬编码色,闸:`node client/tool/check_ds_code.mjs`)。
其余原子(按钮/输入/徽章/chip/分段/KPI/菜单/toast/柱状图)见 `client/lib/widgets/ds/`
一对一镜像 `.superpowers/prototype/atoms.css`。旧 `DataTableCard`/`FilterableColumnHeader`
一对一镜像 `design/prototype/atoms.css`。旧 `DataTableCard`/`FilterableColumnHeader`
体系已废弃(2026-07-03),勿在新屏使用。
## 移动端 / 响应式 UI 规范
+1 -1
View File
@@ -80,7 +80,7 @@
<h2>四、设计系统(L1 先行——switch 组件不存在)</h2>
<div class="card lead">
<ol>
<li>原型 <code>.superpowers/prototype/atoms.css</code> 登记 <code>.switch</code> 组件(38×22 pill 轨道 + 圆点滑块,on=<code>--primary</code>、off=<code>--border</code>,禁用态 faint;全走 tokens+ <code>index.html</code> 组件清单登记;<code>mobile-atoms.css</code> 如需尺寸变体一并登记。</li>
<li>原型 <code>design/prototype/atoms.css</code> 登记 <code>.switch</code> 组件(38×22 pill 轨道 + 圆点滑块,on=<code>--primary</code>、off=<code>--border</code>,禁用态 faint;全走 tokens+ <code>index.html</code> 组件清单登记;<code>mobile-atoms.css</code> 如需尺寸变体一并登记。</li>
<li>Flutter 对照新建 <code>client/lib/widgets/ds/ds_switch.dart</code>(颜色单源过 <code>check_ds_code</code> 闸)。</li>
<li>状态徽章三态色复用现有 DsBadge tone:在售=ok 绿、库存=info 蓝;「已售」需中性灰 tone——确认 DsBadge 有无 neutral,无则原型 badge 先补 neutral 变体再同步。</li>
<li>原型 <code>inventory.html / m-inventory.html</code>(同步态屏)状态列/徽章文案同步为三态。</li>
+4 -4
View File
@@ -48,7 +48,7 @@
<li><a href="#s1">总览:一次 UI 改动的标准路径</a></li>
<li><a href="#s2">技术栈与目录地图</a></li>
<li><a href="#s3">设计真相源三层分治(L1/L2/L3</a></li>
<li><a href="#s4">原型 .superpowers/prototype</a></li>
<li><a href="#s4">原型 design/prototype</a></li>
<li><a href="#s5">Token Codegen(颜色单源)</a></li>
<li><a href="#s6">各道闸全景</a></li>
<li><a href="#s7">像素验收体系(golden / fidelity</a></li>
@@ -61,7 +61,7 @@
<h2 id="s1">一、总览:一次 UI 改动的标准路径</h2>
<div class="card lead">
<pre>
<b>① 设计真相源</b>.superpowers/prototype/
<b>① 设计真相源</b>design/prototype/
tokens.css(三主题) + atoms.css / mobile-atoms.css + icons.js + index.html 登记
│ 新增颜色/组件/图标 → <b>必须先登记原型</b>L1 先行)
@@ -119,7 +119,7 @@
<p><b>屏归属现状</b>:同步态覆盖绝大多数(库存/往来/基础数据/入出库列表/财务/设备/设置/用户/关于/登录/移动壳/我的/授权/盘点);快照态仅注册页;代码先行 = 授权面板、购买卡及官网若干页;拍板不做 = 移动端建单表单。<b>漂移体检</b>:不逐提交强制同步,大版本前跑 <code>node tools/fidelity.mjs</code> 按报告逐屏决定重新对齐或降级快照。</p>
</div>
<h2 id="s4">四、原型(.superpowers/prototype/</h2>
<h2 id="s4">四、原型(design/prototype/</h2>
<div class="card lead">
<ul>
<li><b>tokens.css</b>:令牌单源。<code>:root</code> 共享标量(间距 sp-*/圆角 r-*/字号 fs-*/字体/阴影/z 阶梯/品牌色/状态栏色)+ 三主题块 <code>[data-theme=a/b/c]</code>(A 经典蓝浅 / B 琥珀深 / C 酒窖暖浅)。屏与组件只准引 <code>var(--token)</code></li>
@@ -133,7 +133,7 @@
<h2 id="s5">五、Token Codegen(颜色单源落地 Flutter</h2>
<div class="card lead">
<pre>
.superpowers/prototype/tokens.css ← 原型真源
design/prototype/tokens.css ← 原型真源
check-l1-sync 闸①:逐字节一致)
client/lib/core/theme/token_source/tokens.css ← 入库快照
│ node client/tool/gen_tokens.mjs
+2 -2
View File
@@ -274,7 +274,7 @@
</div>
<h3>3.3 ds 设计系统(单一真相源)</h3>
<p class="gdesc">UI 的真相源是原型 <code>.superpowers/prototype/</code>tokens + <code>atoms.css</code>);Flutter 侧一对一镜像,屏只组合 ds 组件、不自己堆样式。令牌层由 <code>lib/core/theme/token_source/tokens.css</code> codegen 生成 <code>app_tokens.g.dart / app_dims.g.dart / app_chrome.g.dart</code>——改样式改源后重跑脚本,<b>禁止手改 .g 文件、禁止硬编码色值</b></p>
<p class="gdesc">UI 的真相源是原型 <code>design/prototype/</code>tokens + <code>atoms.css</code>);Flutter 侧一对一镜像,屏只组合 ds 组件、不自己堆样式。令牌层由 <code>lib/core/theme/token_source/tokens.css</code> codegen 生成 <code>app_tokens.g.dart / app_dims.g.dart / app_chrome.g.dart</code>——改样式改源后重跑脚本,<b>禁止手改 .g 文件、禁止硬编码色值</b></p>
<div class="card"><table>
<thead><tr><th style="width:30%">widgets/ds/ 文件</th><th>镜像对象</th></tr></thead>
<tbody>
@@ -292,7 +292,7 @@
<h3>3.4 golden × 3 主题 + fidelity 像素闸</h3>
<ul style="font-size:13px">
<li><b>golden</b><code>client/test/golden/*_golden_test.dart</code> 对每屏 × 三主题(a/b/c)出基准图 <code>test/golden/goldens/&lt;prefix&gt;_&lt;theme&gt;.png</code>;更新用 <code>flutter test --update-goldens</code></li>
<li><b>闸机 2 — fidelity</b><code>tools/fidelity.mjs</code><b>原型截图当基准</b>Playwright 截 <code>.superpowers/prototype/screens/*.html</code>,注入 Noto Sans SC 统一字体)与 Flutter golden 做 pixelmatch diff,超逐屏校准阈值即 exit 1;支持 zones 分区阈值抓局部错位。屏注册表在 <code>tools/screens.mjs</code>fidelity 与人工目检 <code>tools/ds-compare.mjs</code> 共用)。</li>
<li><b>闸机 2 — fidelity</b><code>tools/fidelity.mjs</code><b>原型截图当基准</b>Playwright 截 <code>design/prototype/screens/*.html</code>,注入 Noto Sans SC 统一字体)与 Flutter golden 做 pixelmatch diff,超逐屏校准阈值即 exit 1;支持 zones 分区阈值抓局部错位。屏注册表在 <code>tools/screens.mjs</code>fidelity 与人工目检 <code>tools/ds-compare.mjs</code> 共用)。</li>
</ul>
<pre><code>cd client && flutter test --update-goldens test/golden/inventory_list_golden_test.dart
node tools/fidelity.mjs inventory # 仓库根运行;--themes a,b,c--update 刷新原型基准</code></pre>
+1 -1
View File
@@ -19,4 +19,4 @@ SH
chmod +x "$target"
echo "[ds-gate] ✓ 已安装 pre-commit 钩子 → $target"
echo "[ds-gate] 今后提交若动了 .superpowers/prototype/ 会自动跑 12 道设计系统闸。"
echo "[ds-gate] 今后提交若动了 design/prototype/ 会自动跑 12 道设计系统闸。"
+4 -4
View File
@@ -1,15 +1,15 @@
#!/bin/sh
# 原型设计系统守门闸(本地 pre-commit)。
# 仅当本次提交动了原型(.superpowers/prototype/)时跑 check-ds.mjs 的 12 道检查;
# 仅当本次提交动了原型(design/prototype/)时跑 check-ds.mjs 的 12 道检查;
# 任一违规 → 阻止提交。临时跳过:git commit --no-verify。
#
# 安装(每台机器一次,把仓库内本脚本接到 git 钩子):
# sh scripts/hooks/install.sh
root="$(git rev-parse --show-toplevel)"
gate="$root/.superpowers/prototype/tools/check-ds.mjs"
gate="$root/design/prototype/tools/check-ds.mjs"
# 没动原型 → 直接放行
if ! git diff --cached --name-only | grep -q '^\.superpowers/prototype/'; then
if ! git diff --cached --name-only | grep -q '^design/prototype/'; then
exit 0
fi
@@ -21,7 +21,7 @@ fi
echo "[ds-gate] 原型有改动,跑设计系统守门闸(12 道)…"
if ! node "$gate" >/dev/null 2>&1; then
echo "[ds-gate] ✗ 设计系统检查未通过,提交已阻止。"
echo "[ds-gate] 详情:node .superpowers/prototype/tools/check-ds.mjs"
echo "[ds-gate] 详情:node design/prototype/tools/check-ds.mjs"
echo "[ds-gate] 跳过:git commit --no-verify"
exit 1
fi
+7 -7
View File
@@ -2,7 +2,7 @@
// tools/check-l1-sync.mjs — L1 设计真相源同源闸(四道,纯 Node 零依赖)
//
// 治理依据:CLAUDE.md「设计真相源分层」L1 层——tokens/atoms/icons 以
// .superpowers/prototype/ 为单一真源,client 与 web 只能是它的同步副本。
// design/prototype/ 为单一真源,client 与 web 只能是它的同步副本。
// CI.gitea/workflows/checks.ymlPR + main push)与本地均可直接跑:
// node tools/check-l1-sync.mjs
//
@@ -30,11 +30,11 @@ const problems = [];
// ── ① tokens 快照同源 ──────────────────────────────────────
{
const proto = read('.superpowers/prototype/tokens.css');
const proto = read('design/prototype/tokens.css');
const snap = read('client/lib/core/theme/token_source/tokens.css');
if (proto !== snap) {
problems.push(
'[tokens快照] .superpowers/prototype/tokens.css 与 ' +
'[tokens快照] design/prototype/tokens.css 与 ' +
'client/lib/core/theme/token_source/tokens.css 不一致 —— ' +
'改原型后需拷贝快照并重跑 client/tool/gen_tokens.mjs',
);
@@ -50,7 +50,7 @@ const problems = [];
}
return map;
};
const a = symbols(read('.superpowers/prototype/screens/icons.js'));
const a = symbols(read('design/prototype/screens/icons.js'));
const b = symbols(read('web/_includes/icons.njk'));
for (const id of Object.keys(a)) {
if (!(id in b)) problems.push(`[icons] symbol "${id}" 仅原型有,web/_includes/icons.njk 缺 —— 改原型后同步官网`);
@@ -69,7 +69,7 @@ const problems = [];
Object.fromEntries(
[...css.matchAll(/(--[\w-]+)\s*:\s*([^;}]+)[;}]/g)].map(([, k, v]) => [k, v.replace(/\s+/g, '')]),
);
const proto = read('.superpowers/prototype/tokens.css');
const proto = read('design/prototype/tokens.css');
const root = proto.match(/:root\s*{([^}]*)}/s)?.[1] ?? '';
const themeA = proto.match(/\[data-theme="a"\]\s*{([^}]*)}/s)?.[1] ?? '';
const pv = { ...vars(root), ...vars(themeA) };
@@ -114,7 +114,7 @@ const problems = [];
Object.fromEntries(
[...css.matchAll(/(--[\w-]+)\s*:\s*([^;}]+)[;}]/g)].map(([, k, v]) => [k, v.replace(/\s+/g, '')]),
);
const proto = read('.superpowers/prototype/tokens.css');
const proto = read('design/prototype/tokens.css');
const root = vars(proto.match(/:root\s*{([^}]*)}/s)?.[1] ?? '');
const theme = (t) => vars(proto.match(new RegExp(`\\[data-theme="${t}"\\]\\s*{([^}]*)}`, 's'))?.[1] ?? '');
// 模板私有派生变量(主色低透明度/表面高透明度,模板头注释声明来源)
@@ -148,7 +148,7 @@ const problems = [];
// ── ⑥ 徽章图标映射同集(BADGE_ICON ↔ kStatusIcons)─────────
{
const keysOf = (body) => new Set([...body.matchAll(/'([^']+)'\s*:/g)].map((m) => m[1]));
const js = read('.superpowers/prototype/screens/icons.js');
const js = read('design/prototype/screens/icons.js');
const protoKeys = keysOf(js.match(/BADGE_ICON\s*=\s*{([\s\S]*?)}/)?.[1] ?? '');
const dart = read('client/lib/widgets/ds/status_icon_map.dart');
const dartKeys = keysOf(dart.match(/kStatusIcons\s*=[\s\S]*?{([\s\S]*?)};/)?.[1] ?? '');
+13 -13
View File
@@ -20,7 +20,7 @@ export const SCREENS = {
// 外壳:顶栏(两级品牌+主题器+通知) + 侧栏(分组) + 状态栏。
// 全屏阈值松(内容区空白 vs 原型满表),真正判定看 zones(顶栏带收紧到 4%)。
shell: {
html: '.superpowers/prototype/screens/inventory.html', // 外壳含在每个全框屏里,借库存页取整框
html: 'design/prototype/screens/inventory.html', // 外壳含在每个全框屏里,借库存页取整框
prefix: 'app_shell',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -33,7 +33,7 @@ export const SCREENS = {
],
},
inventory: {
html: '.superpowers/prototype/screens/inventory.html',
html: 'design/prototype/screens/inventory.html',
prefix: 'inventory_list',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -42,7 +42,7 @@ export const SCREENS = {
threshold: 0.07, // 实测 4.7% + 2pp2026-07-07 收紧,原 0.08
},
partners: {
html: '.superpowers/prototype/screens/partners.html',
html: 'design/prototype/screens/partners.html',
prefix: 'partners',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -50,7 +50,7 @@ export const SCREENS = {
threshold: 0.06, // 实测 3.6% + 2pp2026-07-07 收紧,原 0.08
},
products: {
html: '.superpowers/prototype/screens/products.html',
html: 'design/prototype/screens/products.html',
prefix: 'products_archive',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -60,7 +60,7 @@ export const SCREENS = {
threshold: 0.06, // 实测 3.7% + 2pp2026-07-07 收紧,原 0.08
},
devices: {
html: '.superpowers/prototype/screens/devices.html',
html: 'design/prototype/screens/devices.html',
prefix: 'device_management',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -68,7 +68,7 @@ export const SCREENS = {
threshold: 0.06, // 实测 3.5% + 2pp2026-07-07 收紧,原 0.08
},
settings: {
html: '.superpowers/prototype/screens/settings.html',
html: 'design/prototype/screens/settings.html',
prefix: 'settings',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -76,7 +76,7 @@ export const SCREENS = {
threshold: 0.04, // 实测 2.4% + 2pp2026-07-07 收紧,原 0.08
},
users: {
html: '.superpowers/prototype/screens/users.html',
html: 'design/prototype/screens/users.html',
prefix: 'users',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -84,14 +84,14 @@ export const SCREENS = {
threshold: 0.04, // 实测 1.9% + 2pp2026-07-07 收紧,原 0.08
},
about: {
html: '.superpowers/prototype/screens/about.html',
html: 'design/prototype/screens/about.html',
prefix: 'about',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
threshold: 0.05, // 实测 2.7% + 2pp2026-07-07 收紧,原 0.08
},
'stock-in': {
html: '.superpowers/prototype/screens/stock-in-list.html',
html: 'design/prototype/screens/stock-in-list.html',
prefix: 'stock_in_list',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -101,7 +101,7 @@ export const SCREENS = {
threshold: 0.06, // 实测 4.0% + 2pp2026-07-07 收紧,原 0.08
},
'stock-out': {
html: '.superpowers/prototype/screens/stock-out-list.html',
html: 'design/prototype/screens/stock-out-list.html',
prefix: 'stock_out_list',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
@@ -109,7 +109,7 @@ export const SCREENS = {
threshold: 0.06, // 实测 4.0% + 2pp2026-07-07 收紧,原 0.08
},
login: {
html: '.superpowers/prototype/screens/login.html',
html: 'design/prototype/screens/login.html',
prefix: 'login',
width: 1280, height: 900, dpr: 2,
waitFor: '.auth',
@@ -123,14 +123,14 @@ export const SCREENS = {
// (实测 a 15.5 / b 6.2 / c 26%),像素闸无意义。golden 测试仍锁三主题回归;
// 后端补 shop_code/voucher 支持后恢复此注册并收紧到 ~8%:
// register: {
// html: '.superpowers/prototype/screens/register.html',
// html: 'design/prototype/screens/register.html',
// prefix: 'register',
// width: 1280, height: 900, dpr: 2,
// waitFor: '.auth',
// threshold: 0.08,
// },
finance: {
html: '.superpowers/prototype/screens/finance.html',
html: 'design/prototype/screens/finance.html',
prefix: 'finance',
width: 1280, height: 900, dpr: 2,
waitFor: '.app',
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,6 +1,6 @@
/* ============================================================
岩美酒库官网 · 组件与版式层
原子样式一对一镜像 .superpowers/prototype/atoms.css.btn/.card/.badge/.kpi/.chip),
原子样式一对一镜像 design/prototype/atoms.css.btn/.card/.badge/.kpi/.chip),
营销版式(nav/hero/section/footer)用同一批 token 组合。
============================================================ */
+1 -1
View File
@@ -1,6 +1,6 @@
/* ============================================================
岩美酒库官网 · 令牌层
单一真相源:.superpowers/prototype/tokens.css 主题 A(经典蓝)1:1 拷贝
单一真相源:design/prototype/tokens.css 主题 A(经典蓝)1:1 拷贝
+ 「营销扩展」段(仅官网用的大字号/容器宽,App 无此场景)。
规则:页面与组件只引用 var(--token),禁硬编码 hex。
同步纪律:App 原型 token 变更时,此文件对应值需同步。