EntryPoint.tsx
import ReactQueryProvider from "./providers/ReactQueryProvider";
import DarkModeProvider from "./providers/DarkModeProvider";
import RootLayout from "./layout/RootLayout";
import { Outlet } from "react-router-dom";
export default function EntryPoint() {
return (
<ReactQueryProvider>
<DarkModeProvider>
<RootLayout>
<Outlet />
</RootLayout>
</DarkModeProvider>
</ReactQueryProvider>
);
}
DarkModeProvider.tsx
import { useLayoutEffect, type PropsWithChildren } from "react";
import useDarkModeStore from "../stores/useDarkModeStore";
export default function DarkModeProvider({ children }: PropsWithChildren) {
const {
isDarkMode,
setIsDarkMode,
isDarkModeInitialized,
setIsDarkModeInitialized,
} = useDarkModeStore();
useLayoutEffect(() => {
if (!isDarkModeInitialized) {
const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
setIsDarkMode(mediaQuery.matches);
setIsDarkModeInitialized(true);
}
}, [isDarkModeInitialized, setIsDarkMode, setIsDarkModeInitialized]);
useLayoutEffect(() => {
if (isDarkMode) {
document.documentElement.classList.add("dark");
} else {
document.documentElement.classList.remove("dark");
}
}, [isDarkMode]);
return (
<div className="min-h-[100dvh] bg-white dark:bg-black text-black dark:text-white">
{children}
</div>
);
}
useDarkModeStore.ts
import { create } from "zustand";
import { persist, createJSONStorage } from "zustand/middleware";
import STORAGE_KEYS from "../constants/storageKeys";
interface DarkModeStore {
isDarkMode: boolean;
isDarkModeInitialized: boolean;
setIsDarkMode: (isDarkMode: boolean) => void;
setIsDarkModeInitialized: (isDarkModeInitialized: boolean) => void;
}
const useDarkModeStore = create(
persist<DarkModeStore>(
(set) => ({
isDarkMode: false,
isDarkModeInitialized: false,
setIsDarkMode: (isDarkMode: boolean) => set({ isDarkMode }),
setIsDarkModeInitialized: (isDarkModeInitialized: boolean) =>
set({ isDarkModeInitialized }),
}),
{
name: STORAGE_KEYS.DARK_MODE,
storage: createJSONStorage(() => localStorage),
}
)
);
export default useDarkModeStore;
index.css
@tailwind utilities;
:root {
color-scheme: light dark;
}
@import "tailwindcss";
@custom-variant dark (&:where(.dark, .dark *));