import React, { useState } from 'react' interface PartnerLogo { id: string label: React.ReactNode } interface PartnerTickerProps { ariaLabel: string logos: PartnerLogo[] } export const PARTNER_TICKER_ITEM_WIDTH_PX = 260 export const PARTNER_TICKER_SPEED_PX_PER_SECOND = 48 export const PARTNER_TICKER_MIN_DURATION_SECONDS = 24 export function partnerTickerDurationSeconds(logoCount: number) { if (logoCount <= 0) return 0 const loopDistance = logoCount * PARTNER_TICKER_ITEM_WIDTH_PX return Math.max( PARTNER_TICKER_MIN_DURATION_SECONDS, loopDistance / PARTNER_TICKER_SPEED_PX_PER_SECOND, ) } export function PartnerTicker({ ariaLabel, logos }: PartnerTickerProps) { const [hasFocusWithin, setHasFocusWithin] = useState(false) const [isHovered, setIsHovered] = useState(false) if (logos.length === 0) return null const durationSeconds = partnerTickerDurationSeconds(logos.length) const isPaused = hasFocusWithin || isHovered const renderLogoCopy = (copy: number) => (
{logos.map((logo) => (
{logo.label}
))}
) return (
{ if (!event.currentTarget.contains(event.relatedTarget as Node | null)) { setHasFocusWithin(false) } }} onFocus={() => setHasFocusWithin(true)} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} role="region" style={{ flex: 1, minWidth: 0, overflow: 'hidden', position: 'relative' }} tabIndex={0} >
{renderLogoCopy(0)} {renderLogoCopy(1)}
) }