Skip to content

Commit 00fafb7

Browse files
committed
test(motion): 改判段控件与 reduced-motion 守卫
1 parent 4c422e0 commit 00fafb7

1 file changed

Lines changed: 24 additions & 0 deletions

File tree

‎app/src/ui/primitives/ViewSwitcher.test.tsx‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ function bodyOf(css: string, sel: string): string {
3737
return at < 0 ? "" : css.slice(at, css.indexOf("}", at));
3838
}
3939

40+
/** W8b(R11.6 追加段)的扫描口径:一段 CSS 里的 `transition` 声明(`;` 切声明、锚属性名) */
41+
const transitionDecls = (css: string): string[] => css.split(";").filter((d) => /(?:^|[;\s])transition\s*:/.test(d));
42+
/** 其中**没走 token** 的那些(空数组 = 都走 token) */
43+
const untokenedTransitions = (css: string): string[] => transitionDecls(css).filter((d) => !/var\(--ed-(?:dur|ease)/.test(d));
44+
4045
const OPTIONS: readonly ViewSwitcherOption[] = [
4146
{ key: "raw", label: "原文", icon: "sessions" },
4247
{ key: "tritrack", label: "三轨对齐", icon: "image" },
@@ -224,4 +229,23 @@ describe("W8 响应层接缝(§8.6.1 第 3 条):`--ed-dur-micro` 120ms +
224229
expect(VS_CSS, "本文件写了 @media(reduced-motion 必须只有 motion.css 一处)").not.toContain("@media");
225230
expect(VS_CSS, "本文件写了动画落点(段控件是响应层,不是环境层)").not.toMatch(/(?:^|[;\s])(?:-(?:webkit|moz|ms|o)-)?animation(?:-name)?\s*:/);
226231
});
232+
233+
/**
234+
* G3 改判(R1.2 / §七 G3 + **R11.6 追认**):与计划 `### 表 4` 的 S5 一致 —— G3 的两条禁令
235+
* (本文件不得写 `@media` / `animation`)**原文逐字保留**(它们守的是别的东西:唯一 reduced-motion
236+
* 块 · 桶边界 · 与 G5 同向),本段**只追加**「transition 的值只许 token」的**正面判据**。
237+
* **更强**:旧版只有禁令 ⇒ 无法区分「没做」与「做对了」(段控件没接缝也是绿);新版**禁令 + 正面
238+
* 判据**双向 ⇒ 每条各有一个独立失败模式。⚠️ 本段不改上面那个 `it` 的一字(`git diff` 可验)。
239+
*/
240+
it("W8b(R11.6 追加):段控件的 `transition` 值只许 token(补禁令的盲区:没接缝也曾经全绿)", () => {
241+
const decls = transitionDecls(VS_CSS);
242+
expect(decls.length, "段控件掉了响应层接缝(`transition`)⇒「切换视图」这一类没有回执").toBeGreaterThan(0);
243+
const untokened = untokenedTransitions(VS_CSS);
244+
expect(untokened, `段控件的时长/缓动必须走 var(--ed-dur-*) / var(--ed-ease*):${untokened.join(" / ")}`).toEqual([]);
245+
// 仪器自证(双跑):反例恰 1 条(**逐序数组相等**)、正例 0 条 —— 否则「0 条」是提取器坏了
246+
expect(untokenedTransitions("transition: background 120ms;"), "提取器抓不到裸值 ⇒ 上面是空真").toEqual([
247+
"transition: background 120ms",
248+
]);
249+
expect(untokenedTransitions("transition: background var(--ed-dur-micro, 120ms);"), "token 正例被判成犯规 ⇒ 上面会假红").toEqual([]);
250+
});
227251
});

0 commit comments

Comments
 (0)