Portfolio / components /ui /theme-toggle.tsx
Reubencf's picture
new portfolio
44ec4f2
'use client'
import * as React from 'react'
import { Moon, Sun } from 'lucide-react'
import { Button } from '@/components/ui/button'
function getPreferredTheme(): 'light' | 'dark' {
if (typeof window === 'undefined') return 'light'
const stored = window.localStorage.getItem('theme') as 'light' | 'dark' | null
if (stored === 'light' || stored === 'dark') return stored
const prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
return prefersDark ? 'dark' : 'light'
}
export function ThemeToggle() {
const [theme, setTheme] = React.useState<'light' | 'dark'>(() => getPreferredTheme())
React.useEffect(() => {
const root = document.documentElement
if (theme === 'dark') {
root.classList.add('dark')
} else {
root.classList.remove('dark')
}
window.localStorage.setItem('theme', theme)
}, [theme])
const toggle = () => setTheme((t) => (t === 'dark' ? 'light' : 'dark'))
return (
<Button variant="ghost" size="icon" aria-label="Toggle theme" onClick={toggle}>
<Sun className="h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
<Moon className="absolute h-5 w-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
<span className="sr-only">Toggle theme</span>
</Button>
)
}
export default ThemeToggle