Skip to content

Commit 8f31d2e

Browse files
committed
Update to prevent FOUC by injecting script
-> Manual testing: Everything working well
1 parent 7cc8e7c commit 8f31d2e

File tree

5 files changed

+32
-16
lines changed

5 files changed

+32
-16
lines changed

lib/src/client/core/core.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { COOKIE_KEY, DARK, LIGHT, MEDIA, SYSTEM, modes } from "../../constants";
22
import { ColorSchemePreference, Store, useStore } from "../../utils";
33
import { useEffect } from "react";
4+
import { s } from "./script";
45

56
export interface CoreProps {
67
/** force apply CSS transition property to all the elements during theme switching. E.g., `all .3s` */
@@ -54,20 +55,10 @@ export const Core = ({ t, nonce }: CoreProps) => {
5455
}, []);
5556

5657
useEffect(() => {
57-
const resolvedMode = mode === SYSTEM ? systemMode : mode;
5858
const restoreTransitions = modifyTransition(t, nonce);
59-
const el = document.documentElement;
60-
if (resolvedMode === DARK) el.classList.add(DARK);
61-
else el.classList.remove(DARK);
62-
[
63-
["sm", systemMode],
64-
["rm", resolvedMode],
65-
["m", mode],
66-
].forEach(([dataLabel, value]) => el.setAttribute(`data-${dataLabel}`, value));
59+
u(mode, systemMode);
6760
restoreTransitions();
68-
// System mode is decided by current system state and need not be stored in localStorage
69-
localStorage.setItem(COOKIE_KEY, mode);
7061
}, [systemMode, mode, t, nonce]);
7162

72-
return null;
63+
return <script dangerouslySetInnerHTML={{ __html: `(${s.toString()})('${COOKIE_KEY}')` }} />;
7364
};

lib/src/client/core/script.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { ColorSchemePreference, ResolvedScheme } from "../../utils";
2+
3+
declare global {
4+
var u: (mode: ColorSchemePreference, systemMode: ResolvedScheme) => void;
5+
}
6+
export const s = (storageKey: string) => {
7+
const [SYSTEM, DARK] = ["system", "dark"] as const;
8+
u = (mode: ColorSchemePreference, systemMode: ResolvedScheme) => {
9+
const resolvedMode = mode === SYSTEM ? systemMode : mode;
10+
const el = document.documentElement;
11+
if (resolvedMode === DARK) el.classList.add(DARK);
12+
else el.classList.remove(DARK);
13+
[
14+
["sm", systemMode],
15+
["rm", resolvedMode],
16+
["m", mode],
17+
].forEach(([dataLabel, value]) => el.setAttribute(`data-${dataLabel}`, value));
18+
// System mode is decided by current system state and need not be stored in localStorage
19+
localStorage.setItem(storageKey, mode);
20+
};
21+
u(
22+
(localStorage.getItem(storageKey) ?? SYSTEM) as ColorSchemePreference,
23+
matchMedia(`(prefers-color-scheme: ${DARK})`).matches ? DARK : "",
24+
);
25+
};

lib/src/client/switch/switch.module.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
content: "A";
2727
}
2828

29-
[data-rm="light"] .switch {
29+
[data-rm=""] .switch {
3030
box-shadow: 0 0 50px 10px yellow;
3131
background-color: yellow;
3232
border: 1px solid orangered;

lib/src/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { ColorSchemePreference } from "./utils";
22

33
export const SYSTEM: ColorSchemePreference = "system";
44
export const DARK: ColorSchemePreference = "dark";
5-
export const LIGHT: ColorSchemePreference = "light";
5+
export const LIGHT: ColorSchemePreference = "";
66

77
export const COOKIE_KEY = "gx";
88
export const modes: ColorSchemePreference[] = [SYSTEM, DARK, LIGHT];

lib/src/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import useRGS from "r18gs";
22
import { COOKIE_KEY, DARK, LIGHT, MEDIA, SYSTEM } from "./constants";
33

4-
export type ColorSchemePreference = "system" | "dark" | "light";
5-
export type ResolvedScheme = "dark" | "light";
4+
export type ColorSchemePreference = "system" | "dark" | "";
5+
export type ResolvedScheme = "dark" | "";
66
export interface Store {
77
m: ColorSchemePreference;
88
s: ResolvedScheme;

0 commit comments

Comments
 (0)