Prompt · ripple
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 <Ripple> sonar pulse. Props: - mainCircleSize?: number (px, default 210). - mainCircleOpacity?: number (default 0.24). - numCircles?: number (default 8). - className?: string. Implementazione: - Server component. Wrapper absolute inset-0 overflow-hidden. - Per ogni i in 0..numCircles-1: span absolute left-1/2 top-1/2 rounded-full border border-fg/20, size = mainCircleSize + i*60, opacity = mainCircleOpacity - i * decay. - @keyframes ripple-expand: 0% scale 0.5 opacity 0, 20% opacity peak, 100% scale 3 opacity 0. Animation 4s var(--ease-out) infinite, delay i*0.4s. Output: file completo src/components/ripple.tsx.
