Luca Perullo
Components

Component

Live

Theme Toggle

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.

TemaClientPersistenza
Open in ClaudeSorgente

Esempio01

theme-toggle.tsx
interattivo · prova a cliccare

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.

Prompt · theme-toggle
Open in Claude
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.