registry:component
Aavya Theme Toggle
v0.1.0beta
Persisted light/dark toggle backed by HTML class state.
Registry Endpoint
Open JSONnpx shadcn@latest add @aavya/aavya-theme-toggle
One-time setup — add the @aavya registry to your components.json so branded dependencies resolve to Aavya (not stock shadcn):
"registries": { "@aavya": "https://registry-dev.aavya.com/r/{name}.json" }Or install by full URL: npx shadcn@latest add https://registry-dev.aavya.com/r/aavya-theme-toggle.json
Live Preview
Toggle light/dark theme
Usage Snippet
import { ThemeToggle } from '@/components/layout/theme-toggle'
export default function Example() {
return (
<div className="p-6">
<ThemeToggle />
</div>
)
}
Source Preview
'use client'
import { useSyncExternalStore } from 'react'
import { useTheme } from 'next-themes'
import { Moon, Sun } from 'lucide-react'
import { Button } from '@/components/ui/button'
function useIsMounted() {
return useSyncExternalStore(() => () => {}, () => true, () => false)
}
export function ThemeToggle() {
const { resolvedTheme, setTheme } = useTheme()
const mounted = useIsMounted()
const handleToggle = () => {
setTheme(resolvedTheme === 'dark' ? 'light' : 'dark')
}
return (
<Button variant="ghost" size="icon" onClick={handleToggle}>
{mounted && resolvedTheme === 'dark'
? <Sun className="h-4 w-4" />
: <Moon className="h-4 w-4" />}
<span className="sr-only">Toggle theme</span>
</Button>
)
}