'use client'; import React, { useId } from 'react'; /** * AnimatedLogo * ============ * Standalone preview component — NOT yet wired into Header or Footer. * The existing AvBeatLogo (static A+V monogram) keeps the production * surfaces. This component is the experimental brand mark. * * • Single-A monogram inside a rounded-square tile with the brand * gradient (#2563EB → #1E3A8A). * • Wordmark in Space Grotesk 700, loaded via next/font/google as * --font-display in app/layout.tsx. * • Tagline in Inter (var(--font-sans)) with an accent-rule (a short * blue dash) preceding the text. * * Animations (pure CSS, no library): * • Stroke-draw on mount ~1.1s on the A path * • Cyan signal pulse ~3.2s loop traversing the A * • Subtle sheen sweep ~4.4s loop diagonal across the tile * • Wordmark + tagline fade in ~0.9s, delayed until stroke finishes * * All animations halt under `prefers-reduced-motion: reduce`. * * Props * size — emblem edge length in px (default 64). Wordmark scales. * variant — 'onLight' (default) | 'onDark' — chooses text colors. * showTagline (default true) — toggle the "Inside the Future of Pro * AV" line. * * Accessibility: role="img" with aria-label="AV Beat" on the wrapper. */ export type AnimatedLogoVariant = 'onLight' | 'onDark'; interface Props { size?: number; variant?: AnimatedLogoVariant; showTagline?: boolean; /** If true, emblem only — wordmark + tagline hidden. Use on mobile * breakpoints where horizontal space is tight. */ iconOnly?: boolean; className?: string; } export default function AnimatedLogo({ size = 64, variant = 'onLight', showTagline = true, iconOnly = false, className = '', }: Props) { // useId for stable, SSR-safe unique IDs (the page can render two of // these and the gradients won't collide). const uid = useId().replace(/[:]/g, ''); const tileGradId = `al-tile-${uid}`; const sheenGradId = `al-sheen-${uid}`; const wordmarkColor = variant === 'onDark' ? '#FFFFFF' : '#0F172A'; const taglineColor = variant === 'onDark' ? '#CBD5E1' : '#475569'; const accentColor = '#1D4ED8'; return ( {/* ── EMBLEM ───────────────────────────────────────────────── */} {/* ── WORDMARK + TAGLINE ───────────────────────────────────── */} {!iconOnly && ( AV BEAT {showTagline && ( )} )} {/* Component-scoped CSS. Keeping it inline (style jsx-free) so the component is portable to any Next.js page without globals leak. prefers-reduced-motion blanket-disables every keyframe. */} ); }