Luca Perullo
Components

Component

LiveNew

Text Reveal

Listener scroll passive. Calcola progress in base alla posizione del rect rispetto al viewport. Niente IntersectionObserver.

TextScrollClient
Open in ClaudeSorgente

Esempio01

text-reveal.tsx
001Default · scroll the page

Le parole si accendono una alla volta mentre scorri la pagina, trasformando un blocco di testo lungo in un piccolo viaggio editoriale.

002Quote · longer reveal

Il design è la cosa che si vede quando si toglie tutto il superfluo, e ciò che resta deve guadagnarsi il proprio posto. Ogni componente di questo catalogo prova a rispettare questa regola.

003Brand statement · short

Niente librerie pesanti. Solo CSS, design tokens, e una selezione attenta di animazioni motivate.

Note Funziona meglio in un blocco di testo lungo (almeno 30+ parole) e richiede che il container abbia altezza maggiore del viewport perché il progress si veda.

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 · text-reveal
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 <TextReveal> word-by-word reveal su scroll.
Props:
- children: string.
- className?: string.

Implementazione:
- "use client". useRef<HTMLParagraphElement>, useState<number> progress 0–1.
- useEffect: handler scroll passive che legge getBoundingClientRect → calcola t = (rect.top - end) / (start - end), progress = clamp(0, 1, 1 - t). Anche listener resize.
- words = children.split(/\s+/). reachedIndex = floor(progress * words.length).
- Render <p ref={ref}>: per ogni word, span con color = lit ? var(--fg) : var(--fg-soft), transition-colors duration-300 var(--ease-out).

Output: file completo src/components/text-reveal.tsx.

Uso tipico03

tsx
<TextReveal>Long form text che si illumina con lo scroll della pagina.</TextReveal>

Dipendenze04

npm
  • tailwind-merge
  • clsx
Interno
  • @/lib/utils#cn

Ti è servito? Dimmelo, oppure proponi il prossimo componente.