Toggle tema con due bottoni segmentati (Sole / Luna). Persiste la scelta in localStorage, rispetta prefers-color-scheme al primo load, ed evita il flash applicando la classe .dark sul <html> in mount.
Note — Per evitare il flash al primo paint, aggiungi nel <head> uno script inline che applichi la classe .dark prima dell'idratazione, leggendo da localStorage o da matchMedia.
Prompt LLM02
Incolla in Claude o ChatGPT per generare la tua variante. Include il contesto del brand, i token e i vincoli del progetto.
Sei un senior frontend engineer. Stai lavorando su un sito Next.js 16 + React 19 + Tailwind v4 in italiano, look chanhdai-inspired: colonna stretta 672px, Geist Sans + Geist Mono, hairline 1px, divisori a stripe diagonale, palette zinc.
Token CSS disponibili: --bg, --bg-alt, --fg, --fg-muted, --fg-soft, --border, --border-strong, --accent. Usa SEMPRE queste variabili tramite le utility tailwind generate (bg-bg, text-fg-muted, border-border, ecc.). Helper "cn" da "@/lib/utils". Niente librerie UI extra: solo lucide-react e tailwind-merge.
Genera un componente client <ThemeToggle>: un segmented control con due bottoni icona Sole/Luna che switcha .dark sul <html>.
Props:
- className?: string
Comportamento:
- "use client".
- All'init legge da localStorage["lp-theme"] altrimenti da window.matchMedia("(prefers-color-scheme: dark)"). Setta lo state e applica la classe sul documentElement.
- Click su un bottone => imposta lo state, scrive in localStorage, aggiorna la classe .dark.
- Pre-mount: evita flash rendendo placeholder con la stessa larghezza ma senza icone attive.
Layout: container rounded-full border border-border bg-bg-alt p-0.5, due <button> 28px square con icone Sun/Moon (lucide-react), il bottone attivo ha bg-bg + ring-1 ring-border-strong. aria-pressed correttamente impostato.
Output: file completo .tsx + suggerimento per lo script anti-flicker da inserire in layout.tsx.
Uso tipico03
tsx
<ThemeToggle />
Dipendenze04
npm
lucide-react
tailwind-merge
clsx
Interno
@/lib/utils#cn
html.dark class
Ti è servito? Dimmelo, oppure proponi il prossimo componente.