···22 PublicationThemeProvider,
23} from "./PublicationThemeProvider";
24import { PubLeafletPublication } from "lexicons/api";
25-import { getColorContrast } from "./themeUtils";
2627// define a function to set an Aria Color to a CSS Variable in RGB
28function setCSSVariableToColor(
···140 //sorting the accents by contrast on background
141 let sortedAccents = [accent1, accent2].sort((a, b) => {
142 return (
143- getColorContrast(
144 colorToString(b, "rgb"),
145 colorToString(showPageBackground ? bgPage : bgLeaflet, "rgb"),
146 ) -
147- getColorContrast(
148 colorToString(a, "rgb"),
149 colorToString(showPageBackground ? bgPage : bgLeaflet, "rgb"),
150 )
···156 // then use the not contrasty option
157158 if (
159- getColorContrast(
160 colorToString(sortedAccents[0], "rgb"),
161 colorToString(primary, "rgb"),
162- ) < 30 &&
163- getColorContrast(
164 colorToString(sortedAccents[1], "rgb"),
165 colorToString(showPageBackground ? bgPage : bgLeaflet, "rgb"),
166- ) > 12
167 ) {
168 accentContrast = sortedAccents[1];
169 } else accentContrast = sortedAccents[0];
···286 bgPage && accent1 && accent2
287 ? [accent1, accent2].sort((a, b) => {
288 return (
289- getColorContrast(
290 colorToString(b, "rgb"),
291 colorToString(bgPage, "rgb"),
292 ) -
293- getColorContrast(
294 colorToString(a, "rgb"),
295 colorToString(bgPage, "rgb"),
296 )
···22 PublicationThemeProvider,
23} from "./PublicationThemeProvider";
24import { PubLeafletPublication } from "lexicons/api";
25+import { getColorDifference } from "./themeUtils";
2627// define a function to set an Aria Color to a CSS Variable in RGB
28function setCSSVariableToColor(
···140 //sorting the accents by contrast on background
141 let sortedAccents = [accent1, accent2].sort((a, b) => {
142 return (
143+ getColorDifference(
144 colorToString(b, "rgb"),
145 colorToString(showPageBackground ? bgPage : bgLeaflet, "rgb"),
146 ) -
147+ getColorDifference(
148 colorToString(a, "rgb"),
149 colorToString(showPageBackground ? bgPage : bgLeaflet, "rgb"),
150 )
···156 // then use the not contrasty option
157158 if (
159+ getColorDifference(
160 colorToString(sortedAccents[0], "rgb"),
161 colorToString(primary, "rgb"),
162+ ) < 0.15 &&
163+ getColorDifference(
164 colorToString(sortedAccents[1], "rgb"),
165 colorToString(showPageBackground ? bgPage : bgLeaflet, "rgb"),
166+ ) > 0.08
167 ) {
168 accentContrast = sortedAccents[1];
169 } else accentContrast = sortedAccents[0];
···286 bgPage && accent1 && accent2
287 ? [accent1, accent2].sort((a, b) => {
288 return (
289+ getColorDifference(
290 colorToString(b, "rgb"),
291 colorToString(bgPage, "rgb"),
292 ) -
293+ getColorDifference(
294 colorToString(a, "rgb"),
295 colorToString(bgPage, "rgb"),
296 )
+4-3
components/ThemeManager/themeUtils.ts
···1-import { parse, contrastLstar, ColorSpace, sRGB } from "colorjs.io/fn";
23// define the color defaults for everything
4export const ThemeDefaults = {
···17};
1819// used to calculate the contrast between page and accent1, accent2, and determin which is higher contrast
20-export function getColorContrast(color1: string, color2: string) {
21 ColorSpace.register(sRGB);
02223 let parsedColor1 = parse(`rgb(${color1})`);
24 let parsedColor2 = parse(`rgb(${color2})`);
2526- return contrastLstar(parsedColor1, parsedColor2);
27}
···1+import { parse, ColorSpace, sRGB, distance, OKLab } from "colorjs.io/fn";
23// define the color defaults for everything
4export const ThemeDefaults = {
···17};
1819// used to calculate the contrast between page and accent1, accent2, and determin which is higher contrast
20+export function getColorDifference(color1: string, color2: string) {
21 ColorSpace.register(sRGB);
22+ ColorSpace.register(OKLab);
2324 let parsedColor1 = parse(`rgb(${color1})`);
25 let parsedColor2 = parse(`rgb(${color2})`);
2627+ return distance(parsedColor1, parsedColor2, "oklab");
28}