Skip to content

Commit e333bb5

Browse files
committed
Refactor contrast logic and only add for light or dark mode
1 parent 1521c5f commit e333bb5

File tree

1 file changed

+27
-40
lines changed

1 file changed

+27
-40
lines changed

dotcom-rendering/src/components/FootballMatchStat.tsx

Lines changed: 27 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -82,23 +82,32 @@ const barCss = css`
8282
border-radius: 8px;
8383
`;
8484

85-
const barAddContrastLightCss = css`
86-
@media (prefers-color-scheme: light) {
87-
border: 1px solid ${palette('--football-match-stat-border')};
88-
}
89-
[data-color-scheme='light'] & {
90-
border: 1px solid ${palette('--football-match-stat-border')};
91-
}
92-
`;
85+
const decideContrastRequired = (colour: string) => {
86+
// https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html
87+
const minimumContrast = 3.1;
9388

94-
const barAddContrastDarkCss = css`
95-
@media (prefers-color-scheme: dark) {
96-
border: 1px solid ${palette('--football-match-stat-border')};
97-
}
98-
[data-color-scheme='dark'] & {
99-
border: 1px solid ${palette('--football-match-stat-border')};
100-
}
101-
`;
89+
const backgroundLight = sourcePalette.neutral[97];
90+
const backgroundDark = sourcePalette.neutral[10];
91+
92+
if (getContrast(colour, backgroundLight) < minimumContrast) return 'light';
93+
if (getContrast(colour, backgroundDark) < minimumContrast) return 'dark';
94+
95+
return 'none';
96+
};
97+
98+
const addContrastingBorderCss = (colour: string) => {
99+
const mode = decideContrastRequired(colour);
100+
if (mode === 'none') return null;
101+
102+
return css`
103+
@media (prefers-color-scheme: ${mode}) {
104+
border: 1px solid ${palette('--football-match-stat-border')};
105+
}
106+
[data-color-scheme='${mode}'] & {
107+
border: 1px solid ${palette('--football-match-stat-border')};
108+
}
109+
`;
110+
};
102111

103112
type MatchStatistic = {
104113
teamName: string;
@@ -129,20 +138,6 @@ export const FootballMatchStat = ({
129138
const homePercentage = (home.value / (home.value + away.value)) * 100;
130139
const awayPercentage = (away.value / (home.value + away.value)) * 100;
131140

132-
const minimumContrast = 3.1; // https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html
133-
134-
const backgroundLight = sourcePalette.neutral[97];
135-
const backgroundDark = sourcePalette.neutral[10];
136-
137-
const homeNeedsContrastWhenLight =
138-
getContrast(home.teamColour, backgroundLight) < minimumContrast;
139-
const awayNeedsContrastWhenLight =
140-
getContrast(away.teamColour, backgroundLight) < minimumContrast;
141-
const homeNeedsContrastWhenDark =
142-
getContrast(home.teamColour, backgroundDark) < minimumContrast;
143-
const awayNeedsContrastWhenDark =
144-
getContrast(away.teamColour, backgroundDark) < minimumContrast;
145-
146141
return (
147142
<div css={containerCss}>
148143
<div css={[headerCss, raiseLabelOnDesktop && raiseLabelCss]}>
@@ -180,22 +175,14 @@ export const FootballMatchStat = ({
180175
</div>
181176
<div aria-hidden="true" css={chartCss}>
182177
<div
183-
css={[
184-
barCss,
185-
homeNeedsContrastWhenLight && barAddContrastLightCss,
186-
homeNeedsContrastWhenDark && barAddContrastDarkCss,
187-
]}
178+
css={[barCss, addContrastingBorderCss(home.teamColour)]}
188179
style={{
189180
'--match-stat-percentage': `${homePercentage}%`,
190181
'--match-stat-team-colour': home.teamColour,
191182
}}
192183
></div>
193184
<div
194-
css={[
195-
barCss,
196-
awayNeedsContrastWhenLight && barAddContrastLightCss,
197-
awayNeedsContrastWhenDark && barAddContrastDarkCss,
198-
]}
185+
css={[barCss, addContrastingBorderCss(away.teamColour)]}
199186
style={{
200187
'--match-stat-percentage': `${awayPercentage}%`,
201188
'--match-stat-team-colour': away.teamColour,

0 commit comments

Comments
 (0)