Luca Perullo
Components

Component

LiveNew

Particles

Soft repulsion con magnetism per particella. Skip animation se prefers-reduced-motion: reduce.

BackgroundCanvasClient
Open in ClaudeSorgente

Esempio01

particles.tsx
001Default · drift + repel
002Hero card · backdrop layer
Field · live

Sempre in movimento

003Dense small · throughput feel

Note staticity più alto = particelle più ferme. ease più alto = ritorno più lento alla posizione di origine. Color resolve via probe div per leggere il valore di --fg-soft.

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 · particles
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 <Particles> canvas drift + repulsion.
Type:
- Particle = { x, y, tx, ty, size, alpha, targetAlpha, dx, dy, magnetism }
Props:
- quantity?: number (default 100), staticity?: number (default 50), ease?: number (default 50).
- size?: number (default 0.4), color?: string (default reads --fg-soft).
- vx?: number, vy?: number, className?.

Implementazione:
- "use client". useRef<HTMLCanvasElement>, useRef<HTMLDivElement> wrapper, useRef<Particle[]>, useRef<{x,y}> mouse.
- useEffect: leggi prefers-reduced-motion. Probe div per resolve color in rgb. ResizeObserver.
- seed(): N particelle random.
- onMove: imposta mouse coords locali.
- draw loop: per ogni particella, lerp alpha, drift dx/dy + vx/vy, wrap su bordi, repulsion da mouse se dist < staticity*2, applica tx/ty con damping ease, fillRect/circle.
- Cleanup: cancelAnimationFrame, ro.disconnect.

Output: file completo src/components/particles.tsx.

Uso tipico03

tsx
<Particles quantity={100} staticity={50} ease={50} />

Dipendenze04

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

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