Kontaktkarte: CTA-Button mit 4,5:1 Kontrast (Weiß auf dunklerem Blau)
Weiß auf #0793CF kam nur auf 3,45:1 (hell und dunkel). Der Button auf der Kontaktkarte nutzt jetzt hsl(198 93% 35%) = 4,76:1, beim Hovern hsl(198 93% 30%) = 6,08:1. Der Test nimmt den Button nicht mehr aus, sondern prüft Ruhe- und Hover-Farbe aller Buttons auf den Karten. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
003f9e67aa
commit
e6d603cd0c
2 files changed
+25
-3
No files matched your search
@@ -39,9 +39,11 @@ const Contact = () => {
|
||||
data-analytics-cta="Potenzialanalyse starten"
|
||||
data-analytics-location="contact_section"
|
||||
>
|
||||
{/* Etwas dunkleres Blau als der Standard-Button (3,45:1 -> 4,76:1 mit weißem Text, Hover 6,08:1);
|
||||
die Farbe gilt in beiden Themes, weil der Button nicht von Theme-Farben abhängt. */}
|
||||
<Button
|
||||
size="lg"
|
||||
className="btn-minimal rounded-full px-8 py-6 text-base font-medium group"
|
||||
className="btn-minimal rounded-full px-8 py-6 text-base font-medium group bg-[hsl(198,93%,35%)] hover:bg-[hsl(198,93%,30%)]"
|
||||
>
|
||||
Potenzialanalyse starten
|
||||
<ArrowRight className="w-4 h-4 ml-2 group-hover:translate-x-1 transition-transform" />
|
||||
|
||||
@@ -629,14 +629,34 @@ describe("A1 Karten (BorderGlow) im hellen Modus lesbar", () => {
|
||||
const hintergrund = { hell: farbe(karte.style.getPropertyValue("--card-bg-light")), dunkel: farbe(karte.style.getPropertyValue("--card-bg-dark")) };
|
||||
for (const thema of THEMEN) {
|
||||
// text-foreground (Titel, Hover-Zustand der Icons) und text-muted-foreground (Fließtext, Icons).
|
||||
// Der blaue CTA-Button im Kontaktabschnitt hat eigene Farben (Weiß auf #0793CF, 3,45:1, in beiden Themes gleich)
|
||||
// und gehört nicht zu den Theme-Farben; siehe Bericht.
|
||||
// Der blaue CTA-Button im Kontaktabschnitt hat eigene, themeunabhängige Farben und wird im nächsten Test geprüft.
|
||||
for (const name of ["foreground", "muted-foreground"]) {
|
||||
expect(kontrast(tokenFarbe(thema, name), hintergrund[thema === "hell" ? "hell" : "dunkel"])).toBeGreaterThanOrEqual(4.5);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it.each(KARTEN)("$name: Buttons auf den Karten (Text weiß auf eigener Farbe) erreichen in Ruhe und beim Hovern mindestens 4,5:1", ({ ui, name }) => {
|
||||
const { container } = zeige(ui);
|
||||
const buttons = [...container.querySelectorAll<HTMLElement>(".border-glow-card button")];
|
||||
if (name.startsWith("Kontaktabschnitt")) expect(buttons).toHaveLength(1);
|
||||
const arbitraerFarbe = (klassen: string[], praefix: string) =>
|
||||
klassen.filter((k) => k.startsWith(`${praefix}bg-[`)).map((k) => k.slice(praefix.length + 4, -1));
|
||||
for (const button of buttons) {
|
||||
const klassen = [...button.classList];
|
||||
// Weiß auf der eigenen Farbe; die Farbe ist themeunabhängig, gilt also in hell und dunkel gleich.
|
||||
expect(klassen).toContain("text-white");
|
||||
const ruhe = arbitraerFarbe(klassen, "");
|
||||
const hover = arbitraerFarbe(klassen, "hover:");
|
||||
// twMerge muss die Standardfarbe des Buttons ersetzen, nicht ergänzen
|
||||
expect(ruhe).toHaveLength(1);
|
||||
expect(hover).toHaveLength(1);
|
||||
for (const hintergrundFarbe of [ruhe[0], hover[0]]) {
|
||||
expect(kontrast([255, 255, 255], farbe(hintergrundFarbe))).toBeGreaterThanOrEqual(4.5);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it("BorderGlow wählt die Kartenfarbe per CSS nach Theme und zeigt im hellen Modus einen sichtbaren Rand", () => {
|
||||
const css = lies("src/components/BorderGlow.css");
|
||||
expect(css).toMatch(/--card-bg:\s*var\(--card-bg-dark/);
|
||||
|
||||
Reference in new issue
Block a user