UNPKG

@codegouvfr/react-dsfr

Version:

French State Design System React integration library

109 lines (76 loc) 2.9 kB
import { data_fr_scheme, data_fr_theme, rootColorSchemeStyleTagId } from "./constants"; import { fr } from "../fr"; // TODO enhance to use DOMPurify with trustedTypes export const getScriptToRunAsap = ({ defaultColorScheme, nonce = "", trustedTypesPolicyName }) => ` { window.ssrWasPerformedWithIsDark = "${defaultColorScheme}" === "dark"; const sanitizer = typeof trustedTypes !== "undefined" ? trustedTypes.createPolicy("${trustedTypesPolicyName}-asap", { createHTML: s => s }) : { createHTML: s => s, }; const isDark = (() => { const isDarkExplicitlyProvidedAsParameter = (() => { if ("${defaultColorScheme}" === "system") { return undefined; } switch ("${defaultColorScheme}") { case "dark": return true; case "light": return false; } })(); const isDarkFromLocalStorage = (() => { const colorSchemeReadFromLocalStorage = localStorage.getItem("scheme"); if (colorSchemeReadFromLocalStorage === null) { return undefined; } if (colorSchemeReadFromLocalStorage === "system") { return undefined; } switch (colorSchemeReadFromLocalStorage) { case "dark": return true; case "light": return false; } })(); const isDarkFromOsPreference = (() => { if (!window.matchMedia) { return undefined; } return window.matchMedia("(prefers-color-scheme: dark)").matches; })(); const isDarkFallback = false; return ( isDarkFromLocalStorage ?? isDarkExplicitlyProvidedAsParameter ?? isDarkFromOsPreference ?? isDarkFallback ); })(); ["${data_fr_scheme}", "${data_fr_theme}"].forEach(attr => document.documentElement.setAttribute(attr, isDark ? "dark" : "light")); { let element= document.getElementById("${rootColorSchemeStyleTagId}"); if( element !== null ){ element.remove() } element = document.createElement("style"); if ("${nonce}" !== "") { element.setAttribute("nonce", "${nonce}"); } element.id = "${rootColorSchemeStyleTagId}"; element.innerHTML = sanitizer.createHTML(\`:root { color-scheme: \${isDark ? "dark" : "light"}; }\`); document.head.appendChild(element); } { const name = "theme-color"; let element = document.querySelector(\`meta[name=\${name}]\`); if( element !== null ){ element.remove(); } element = document.createElement("meta"); element.name = name; element.content = isDark ? "${fr.colors.getHex({ "isDark": true }).decisions.background.default.grey.default}" : "${fr.colors.getHex({ "isDark": false }).decisions.background.default.grey.default}"; document.head.appendChild(element); } } `; //# sourceMappingURL=scriptToRunAsap.js.map