|
5 | 5 | MOTION_CSS = ROOT / "demo-seydi-animee" / "motion.css" |
6 | 6 |
|
7 | 7 |
|
8 | | -def test_animated_fact_gradient_never_fades_to_transparent(): |
9 | | - css = MOTION_CSS.read_text(encoding="utf-8") |
| 8 | +def css_rule(css: str, selector: str) -> str: |
10 | 9 | match = re.search( |
11 | | - r"\.motion-page \.facts strong\s*\{(?P<body>.*?)\}", |
| 10 | + re.escape(selector) + r"\s*\{(?P<body>.*?)\}", |
12 | 11 | css, |
13 | 12 | flags=re.DOTALL, |
14 | 13 | ) |
15 | | - assert match, "Règle animée des chiffres introuvable" |
16 | | - rule = match.group("body") |
| 14 | + assert match, f"Règle CSS introuvable : {selector}" |
| 15 | + return match.group("body").lower() |
| 16 | + |
17 | 17 |
|
18 | | - # currentColor becomes transparent when the same rule sets color: transparent. |
19 | | - assert "currentColor" not in rule |
20 | | - assert "var(--navy)" in rule |
21 | | - assert "#8a6324" in rule.lower() |
| 18 | +def test_animated_facts_use_text_color_without_a_background(): |
| 19 | + css = MOTION_CSS.read_text(encoding="utf-8") |
| 20 | + rule = css_rule(css, ".motion-page .facts strong") |
22 | 21 |
|
23 | | - # Text must remain readable when background-clip:text is unsupported. |
24 | | - assert "@supports" in css |
25 | | - assert ".motion-page .facts strong {\n color: var(--navy);" in css |
26 | | - assert "-webkit-text-fill-color: transparent" in css |
| 22 | + assert "background" not in rule |
| 23 | + assert "transparent" not in rule |
| 24 | + assert "--fact-color-start" in rule |
| 25 | + assert "--fact-color-end" in rule |
| 26 | + assert "background-clip: text" not in css |
| 27 | + assert "text-fill-color: transparent" not in css |
27 | 28 |
|
28 | 29 |
|
29 | | -def test_dark_property_fact_gradient_ends_in_gold(): |
| 30 | +def test_dark_property_fact_animation_finishes_in_gold(): |
30 | 31 | css = MOTION_CSS.read_text(encoding="utf-8") |
31 | | - match = re.search( |
32 | | - r"\.motion-page \.property-dark \.facts strong\s*\{(?P<body>.*?)\}", |
33 | | - css, |
34 | | - flags=re.DOTALL, |
35 | | - ) |
36 | | - assert match, "Variante dorée des chiffres sur fond sombre introuvable" |
37 | | - rule = match.group("body").lower() |
38 | | - |
39 | | - assert "var(--navy)" not in rule |
40 | | - assert "#bd9b5d" in rule |
41 | | - assert "#d6ad62" in rule |
42 | | - assert "#f4deb0" in rule |
43 | | - assert "-webkit-text-fill-color: currentColor" in css |
| 32 | + rule = css_rule(css, ".motion-page .property-dark .facts strong") |
| 33 | + keyframes = css.split("@keyframes number-shine", 1)[1].split( |
| 34 | + "@keyframes monogram-pulse", 1 |
| 35 | + )[0].lower() |
| 36 | + |
| 37 | + assert "background" not in rule |
| 38 | + assert "--fact-color-start: #f4deb0" in rule |
| 39 | + assert "--fact-color-mid: #d6ad62" in rule |
| 40 | + assert "--fact-color-end: #bd9b5d" in rule |
| 41 | + assert "color: var(--fact-color-end)" in keyframes |
| 42 | + |
| 43 | + |
| 44 | +def test_reduced_motion_displays_final_fact_color_directly(): |
| 45 | + css = MOTION_CSS.read_text(encoding="utf-8") |
| 46 | + reduced_motion = css.split("@media (prefers-reduced-motion: reduce)", 1)[1] |
| 47 | + rule = css_rule(reduced_motion, ".motion-page .facts strong") |
| 48 | + |
| 49 | + assert "color: var(--fact-color-end)" in rule |
| 50 | + assert "background" not in rule |
| 51 | + assert "animation: none" in rule |
0 commit comments