Description
When the colorMode property of <ThemeProvider /> is set to auto and SSR is used, it will still be displayed in light mode on browsers that prefer dark mode.
Steps to reproduce
- Set the
colorMode property of <ThemeProvider /> to auto. - Perform Next.js SSR / SSG rendering.
- Open the page on the browser that prefers dark mode.
- The displayed color scheme is
day, not night.
Temporary patch
Add a hook named useAutoColorMode.
import{useEffect,useState}from'react';importuseMediaQueryfrom'@/hooks/useMediaQuery';enumComponentColorMode{auto='auto',day='day',night='night',}constuseAutoColorMode=()=>{const[colorMode,setColorMode]=useState(ComponentColorMode.day);constdarkModeEnabled=useMediaQuery('(prefers-color-scheme: dark)');useEffect(()=>{setColorMode(darkModeEnabled ? ComponentColorMode.night : ComponentColorMode.day);},[darkModeEnabled]);returncolorMode;};exportdefaultuseAutoColorMode;Manually set colorMode in App.tsx.
const App = () => {
+ const colorMode = useAutoColorMode();
// ...
return (
- <ThemeProvider colorMode="auto" preventSSRMismatch>+ <ThemeProvider colorMode={colorMode} preventSSRMismatch>Version
v35.16.0
Browser
Chrome
Description
When the
colorModeproperty of<ThemeProvider />is set toautoand SSR is used, it will still be displayed in light mode on browsers that prefer dark mode.Steps to reproduce
colorModeproperty of<ThemeProvider />toauto.day, notnight.Temporary patch
Add a hook named
useAutoColorMode.Manually set
colorModeinApp.tsx.const App = () => { + const colorMode = useAutoColorMode(); // ... return ( - <ThemeProvider colorMode="auto" preventSSRMismatch>+ <ThemeProvider colorMode={colorMode} preventSSRMismatch>Version
v35.16.0
Browser
Chrome