Skip to content

Commit c1e1c8b

Browse files
docs: fix dark mode background flash
1 parent b1f2a98 commit c1e1c8b

File tree

3 files changed

+35
-36
lines changed

3 files changed

+35
-36
lines changed

www/islands/ThemeToggle.tsx

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
1-
import { useEffect, useState } from "preact/hooks";
1+
import { useState } from "preact/hooks";
22
import { IS_BROWSER } from "fresh/runtime";
33

44
export default function ThemeToggle() {
5-
const getPreferredTheme = () => {
5+
const [theme, setTheme] = useState(() => {
66
if (!IS_BROWSER) return "light";
7-
const storedTheme = localStorage.getItem("theme");
8-
if (storedTheme) return storedTheme;
9-
return window.matchMedia("(prefers-color-scheme: dark)").matches
10-
? "dark"
11-
: "light";
12-
};
13-
14-
const [theme, setTheme] = useState(getPreferredTheme);
15-
16-
useEffect(() => {
17-
document.documentElement.classList.remove("light", "dark");
18-
document.documentElement.classList.add(theme);
19-
document.documentElement.setAttribute("data-theme", theme);
20-
localStorage.setItem("theme", theme);
21-
}, [theme]);
7+
return document.documentElement.dataset.theme ?? "light";
8+
});
229

2310
const toggleTheme = () => {
24-
setTheme((prev) => (prev === "light" ? "dark" : "light"));
11+
setTheme((prev) => {
12+
const theme = prev === "light" ? "dark" : "light";
13+
document.documentElement.setAttribute("data-theme", theme);
14+
localStorage.setItem("theme", theme);
15+
return theme;
16+
});
2517
};
2618

2719
return (

www/routes/_app.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { define } from "../utils/state.ts";
33

44
export default define.page(function App({ Component, state, url }) {
55
return (
6-
<html lang="en" class="dark" data-theme="dark">
6+
<html lang="en">
77
<head>
88
<meta charset="utf-8" />
99
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -23,6 +23,7 @@ export default define.page(function App({ Component, state, url }) {
2323
? <meta property="og:image" content={state.ogImage} />
2424
: null}
2525
{state.noIndex ? <meta name="robots" content="noindex" /> : null}
26+
<meta name="color-scheme" content="light dark" />
2627
<link
2728
rel="preload"
2829
href={asset("/fonts/FixelVariable.woff2")}
@@ -42,8 +43,17 @@ export default define.page(function App({ Component, state, url }) {
4243
</>
4344
)
4445
: null}
45-
<script src="/theme.client.js"></script>
46-
<script type="module" src="/theme-toggle.client.js"></script>
46+
<script
47+
type="module"
48+
dangerouslySetInnerHTML={{
49+
__html: `
50+
const isDarkMode = localStorage.theme === "dark"
51+
|| (!("theme" in localStorage)
52+
&& window.matchMedia("(prefers-color-scheme: dark)").matches);
53+
document.documentElement.dataset.theme = isDarkMode ? "dark" : "light";`,
54+
}}
55+
>
56+
</script>
4757
</head>
4858
<body>
4959
<Component />

www/static/styles.css

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
@tailwind utilities;
44

55
/* Light and dark theme variables */
6-
.light {
6+
:root {
77
--fresh: 50deg, 100%, 56%;
88
--fresh-green: 142deg, 71%, 29%;
99

@@ -17,7 +17,7 @@
1717

1818
--info: 194deg, 76%, 41%;
1919
}
20-
.dark {
20+
html[data-theme="dark"]:root {
2121
--fresh: 50deg, 100%, 56%;
2222
--fresh-green: 142deg, 71%, 29%;
2323

@@ -57,19 +57,8 @@
5757
}
5858

5959
body {
60-
font-family:
61-
Fixel,
62-
system-ui,
63-
-apple-system,
64-
BlinkMacSystemFont,
65-
"Segoe UI",
66-
Roboto,
67-
Oxygen,
68-
Ubuntu,
69-
Cantarell,
70-
"Open Sans",
71-
"Helvetica Neue",
72-
sans-serif;
60+
font-family: Fixel, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
61+
Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
7362
font-weight: 450;
7463
font-size: 1.125rem;
7564
line-height: 1.5;
@@ -104,3 +93,11 @@ hr {
10493
.dark-mode-toggle-button img {
10594
@apply fill-foreground-primary;
10695
}
96+
97+
::selection {
98+
background-color: #b1d5ff;
99+
}
100+
101+
html[data-theme="dark"] ::selection {
102+
background-color: #064c9c;
103+
}

0 commit comments

Comments
 (0)