Comments (1)
I was able to resolve this on my own.
It looks like the issue was that in useEffect
the resolution of the the theme had not yet been calculated.
Moving the usage of the resolvedTheme
further in the code yielded the expected results.
'use client';
import { useState, useEffect } from 'react'
import { useTheme } from 'next-themes'
import { classNames } from '@/lib/tailwind';
import { Switch } from '@headlessui/react'
import { track } from '@vercel/analytics';
import { SunIcon, MoonIcon } from "@heroicons/react/24/outline";
const ThemeSwitch = () => {
const [mounted, setMounted] = useState(false)
const { theme, resolvedTheme, setTheme } = useTheme()
const darkMode = resolvedTheme === 'dark';
// useEffect only runs on the client, so now we can safely show the UI
useEffect(() => {
setMounted(true)
}, [])
if (!mounted) {
return (
<div className='self-center rounded-full h-7 w-11 bg-gray-200 dark:bg-zinc-800 skeleton-box'></div>
)
}
console.log(`darkMode2: ${darkMode}`);
console.log(`theme2: ${theme}`);
console.log(`resolvedTheme2: ${resolvedTheme}`);
track('theme', { theme: resolvedTheme ?? "unknown" });
return (
<>
<Switch checked={darkMode} onChange={() => setTheme(darkMode ? 'light' : 'dark')}
className="bg-ww-accent relative inline-flex h-7 w-11 flex-shrink-0 cursor-pointer self-center rounded-full border-2 border-transparent bg-amber-500 ease-in-out focus:outline-none sm:ml-4">
<span className="sr-only">Toggle Dark Mode</span>
<span className={classNames(darkMode ? 'translate-x-4' : 'translate-x-0', 'pointer-events-none relative inline-block h-6 w-6 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out dark:bg-zinc-800')}>
<span className={classNames(darkMode ? 'opacity-0 duration-100 ease-out' : 'opacity-100 duration-200 ease-in', 'absolute inset-0 flex h-full w-full items-center justify-center transition-opacity')} aria-hidden="true">
<SunIcon className="h-5 w-5 text-gray-400" />
</span>
<span className={classNames(darkMode ? 'opacity-100 duration-200 ease-in' : 'opacity-0 duration-100 ease-out', 'absolute inset-0 flex h-full w-full items-center justify-center transition-opacity')} aria-hidden="true">
<MoonIcon className="h-5 w-5 text-gray-400 dark:text-zinc-400" />
</span>
</span>
</Switch>
</>
)
}
export default ThemeSwitch
I am leaving the issue here but marking it as closed in case someone else finds it useful
from next-themes.
Related Issues (20)
- How to disable syncing themes between tabs HOT 2
- Documentation out of date with Tailwind's new dark-mode API
- Should `resolvedTheme` obey `forcedTheme`? HOT 3
- Allow nested providers HOT 2
- Theme object is injected into the "data-theme" property. HOT 1
- useTheme doesn't work in monorepo ui library. HOT 1
- `TypeError: Cannot read properties of undefined (reading 'addListener')` using `vitest`/`@testing-library/react` HOT 1
- Support for changing both class and data-theme attribute simultaneously HOT 1
- Callback Version of `setTheme` Passes Itself HOT 1
- Possibility to share across sub-domains? HOT 1
- ThemeProvider returns multiple types HOT 3
- setTheme not working HOT 1
- Theme flashing v0.3.0 HOT 7
- Next.js suspense triggered twice with next-themes HOT 1
- Flash Of Unstyled Content (FOUC) on Live Website HOT 6
- The way avoid hydration errors has a negative impact on SEO. HOT 2
- [Feature request]:setTheme multiple classes for next-themes HOT 5
- [Feature request]: The opportunity not to store theme value in LS
- [Feature request]: react 19 support HOT 2
- [Bug]: NextJs dark mode background is black on overscroll
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from next-themes.