fix mismatch

This commit is contained in:
Michael Freno
2025-12-31 01:52:13 -05:00
parent 81b7c6e322
commit ff681e6b3a
2 changed files with 28 additions and 7 deletions

View File

@@ -1,4 +1,4 @@
import { Show } from "solid-js"; import { Show, createSignal, onMount } from "solid-js";
import MoonIcon from "./icons/MoonIcon"; import MoonIcon from "./icons/MoonIcon";
import SunIcon from "./icons/SunIcon"; import SunIcon from "./icons/SunIcon";
import { Typewriter } from "./Typewriter"; import { Typewriter } from "./Typewriter";
@@ -6,12 +6,21 @@ import { useDarkMode } from "~/context/darkMode";
export function DarkModeToggle() { export function DarkModeToggle() {
const { isDark, toggleDarkMode } = useDarkMode(); const { isDark, toggleDarkMode } = useDarkMode();
const [mounted, setMounted] = createSignal(false);
onMount(() => {
setMounted(true);
});
return ( return (
<button <button
onClick={toggleDarkMode} onClick={toggleDarkMode}
class="hover:bg-surface0 flex w-full items-center gap-3 rounded-lg p-3 transition-all duration-200 ease-in-out hover:scale-105" class="hover:bg-surface0 flex w-full items-center gap-3 rounded-lg p-3 transition-all duration-200 ease-in-out hover:scale-105"
aria-label="Toggle dark mode" aria-label="Toggle dark mode"
>
<Show
when={mounted()}
fallback={<div style={{ width: "24px", height: "24px" }} />}
> >
<Show <Show
when={isDark()} when={isDark()}
@@ -19,13 +28,19 @@ export function DarkModeToggle() {
> >
<MoonIcon size={24} fill="var(--color-text)" /> <MoonIcon size={24} fill="var(--color-text)" />
</Show> </Show>
</Show>
<span class="text-lg font-semibold"> <span class="text-lg font-semibold">
<Show
when={mounted()}
fallback={<span style={{ visibility: "hidden" }}>Dark Mode</span>}
>
<Show <Show
when={isDark()} when={isDark()}
fallback={<Typewriter keepAlive={false}>Light Mode</Typewriter>} fallback={<Typewriter keepAlive={false}>Light Mode</Typewriter>}
> >
<Typewriter keepAlive={false}>Dark Mode</Typewriter> <Typewriter keepAlive={false}>Dark Mode</Typewriter>
</Show> </Show>
</Show>
</span> </span>
</button> </button>
); );

View File

@@ -49,7 +49,13 @@ export const DarkModeProvider: ParentComponent = (props) => {
// Initialize with correct theme synchronously // Initialize with correct theme synchronously
const [isDark, setIsDark] = createSignal(getInitialTheme()); const [isDark, setIsDark] = createSignal(getInitialTheme());
// Force update immediately on client to fix hydration mismatch
onMount(() => { onMount(() => {
const actualTheme = getInitialTheme();
if (isDark() !== actualTheme) {
setIsDark(actualTheme);
}
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
// Listen for system theme changes // Listen for system theme changes