Skip to content

Commit fee1b0e

Browse files
committed
fix: contrast script should only fail on Solar theme pairs
1 parent ccc6d3f commit fee1b0e

1 file changed

Lines changed: 38 additions & 34 deletions

File tree

scripts/check-contrast.mjs

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
#!/usr/bin/env node
22

33
const pairs = [
4-
{ fg: "#000000", bg: "#ffffff", name: "text on bg (solar)" },
5-
{ fg: "#1a1a1a", bg: "#ffffff", name: "text-secondary on bg (solar)" },
6-
{ fg: "#2a2a2a", bg: "#ffffff", name: "text-tertiary on bg (solar)" },
7-
{ fg: "#0022cc", bg: "#ffffff", name: "primary on bg (solar)" },
8-
{ fg: "#001999", bg: "#ffffff", name: "primary-hover on bg (solar)" },
9-
{ fg: "#ffffff", bg: "#0022cc", name: "primary-text on primary (solar)" },
10-
{ fg: "#004d00", bg: "#ffffff", name: "secondary on bg (solar)" },
11-
{ fg: "#8b0000", bg: "#ffffff", name: "danger on bg (solar)" },
12-
{ fg: "#8b0000", bg: "#ffffff", name: "danger-text on bg (solar)" },
13-
{ fg: "#4a3a00", bg: "#ffffff", name: "warning on bg (solar)" },
14-
{ fg: "#3a2e00", bg: "#ffffff", name: "warning-fill on bg (solar)" },
15-
{ fg: "#000000", bg: "#f5f5f5", name: "text on surface (solar)" },
16-
{ fg: "#001999", bg: "#e0e8ff", name: "tag-text on tag-bg (solar)" },
17-
{ fg: "#ffffff", bg: "#000000", name: "nav-text on nav-bg (solar)" },
18-
{ fg: "#000000", bg: "#ffffff", name: "focus-ring on bg (solar)" },
19-
{ fg: "#171717", bg: "#ffffff", name: "text on bg (light)" },
20-
{ fg: "#6f5f48", bg: "#f7f4ee", name: "text-secondary on bg (light)" },
21-
{ fg: "#0f766e", bg: "#f7f4ee", name: "primary on bg (light)" },
22-
{ fg: "#ffffff", bg: "#0f766e", name: "primary-text on primary (light)" },
23-
{ fg: "#ededed", bg: "#0a0a0a", name: "text on bg (dark)" },
24-
{ fg: "#2dd4bf", bg: "#0a0a0a", name: "primary on bg (dark)" },
25-
{ fg: "#0a0a0a", bg: "#2dd4bf", name: "primary-text on primary (dark)" },
4+
{ fg: "#000000", bg: "#ffffff", name: "text on bg (solar)", required: 10 },
5+
{ fg: "#1a1a1a", bg: "#ffffff", name: "text-secondary on bg (solar)", required: 10 },
6+
{ fg: "#2a2a2a", bg: "#ffffff", name: "text-tertiary on bg (solar)", required: 10 },
7+
{ fg: "#0022cc", bg: "#ffffff", name: "primary on bg (solar)", required: 10 },
8+
{ fg: "#001999", bg: "#ffffff", name: "primary-hover on bg (solar)", required: 10 },
9+
{ fg: "#ffffff", bg: "#0022cc", name: "primary-text on primary (solar)", required: 10 },
10+
{ fg: "#004d00", bg: "#ffffff", name: "secondary on bg (solar)", required: 10 },
11+
{ fg: "#8b0000", bg: "#ffffff", name: "danger on bg (solar)", required: 10 },
12+
{ fg: "#8b0000", bg: "#ffffff", name: "danger-text on bg (solar)", required: 10 },
13+
{ fg: "#4a3a00", bg: "#ffffff", name: "warning on bg (solar)", required: 10 },
14+
{ fg: "#3a2e00", bg: "#ffffff", name: "warning-fill on bg (solar)", required: 10 },
15+
{ fg: "#000000", bg: "#f5f5f5", name: "text on surface (solar)", required: 10 },
16+
{ fg: "#001999", bg: "#e0e8ff", name: "tag-text on tag-bg (solar)", required: 10 },
17+
{ fg: "#ffffff", bg: "#000000", name: "nav-text on nav-bg (solar)", required: 10 },
18+
{ fg: "#000000", bg: "#ffffff", name: "focus-ring on bg (solar)", required: 12 },
19+
{ fg: "#171717", bg: "#ffffff", name: "text on bg (light)", required: 0 },
20+
{ fg: "#6f5f48", bg: "#f7f4ee", name: "text-secondary on bg (light)", required: 0 },
21+
{ fg: "#0f766e", bg: "#f7f4ee", name: "primary on bg (light)", required: 0 },
22+
{ fg: "#ffffff", bg: "#0f766e", name: "primary-text on primary (light)", required: 0 },
23+
{ fg: "#ededed", bg: "#0a0a0a", name: "text on bg (dark)", required: 0 },
24+
{ fg: "#2dd4bf", bg: "#0a0a0a", name: "primary on bg (dark)", required: 0 },
25+
{ fg: "#0a0a0a", bg: "#2dd4bf", name: "primary-text on primary (dark)", required: 0 },
2626
];
2727

2828
function hexToRgb(hex) {
@@ -53,27 +53,31 @@ function contrastRatio(hex1, hex2) {
5353

5454
let failures = 0;
5555

56-
for (const { fg, bg, name } of pairs) {
56+
for (const { fg, bg, name, required } of pairs) {
5757
const ratio = contrastRatio(fg, bg);
5858
const passesText = ratio >= 10.0;
5959
const passesAAA = ratio >= 7.0;
60-
const status = passesText
61-
? "PASS (10:1+)"
62-
: passesAAA
63-
? "WARN (AAA 7:1+)"
64-
: "FAIL";
65-
if (!passesText) failures++;
60+
const meetsRequired = required === 0 || ratio >= required;
61+
62+
let status;
63+
if (required === 0) {
64+
status = "INFO";
65+
} else if (metdsRequired) {
66+
status = "PASS";
67+
} else {
68+
status = "FAIL";
69+
}
70+
71+
if (required > 0 && !meetsRequired) failures++;
6672
console.log(
67-
`${status.padEnd(12)} ${ratio.toFixed(2).padStart(5)}:1 ${name} (${fg} on ${bg})`,
73+
`${status.padEnd(8)} ${ratio.toFixed(2).padStart(5)}:1 ${name} (${fg} on ${bg})`,
6874
);
6975
}
7076

7177
console.log(`\n---`);
7278
if (failures === 0) {
73-
console.log(`All ${pairs.length} pairs meet 10:1 minimum contrast.`);
79+
console.log(`All required contrast pairs meet minimum thresholds.`);
7480
} else {
75-
console.log(
76-
`${failures} pair(s) below 10:1 threshold (but may still pass WCAG AAA 7:1).`,
77-
);
81+
console.log(`${failures} pair(s) below required threshold.`);
7882
process.exitCode = 1;
7983
}

0 commit comments

Comments
 (0)