components/marquee/index.tsx (36 lines of code) (raw):

import React, { ReactNode, useRef, useState } from 'react'; import styles from './index.module.css'; interface MarqueeProps { children: ReactNode; className?: string; pauseOnHover?: boolean; hasFadingEdges?: boolean; } export const Marquee: React.FC<MarqueeProps> = ({ children, className = '', pauseOnHover = false, hasFadingEdges = true, }) => { const containerRef = useRef<HTMLDivElement>(null); const [isPaused, setIsPaused] = useState(false); const handleMouseEnter = () => { if (pauseOnHover) { setIsPaused(true); } }; const handleMouseLeave = () => { if (pauseOnHover) { setIsPaused(false); } }; return ( <div className={`${styles.marquee} ${hasFadingEdges ? styles.fadingEdges : ''} ${className}`} ref={containerRef} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave} > <div className={`${styles.group} ${isPaused ? styles.paused : ''}`} data-testid={'marquee-component'}>{children}</div> <div className={`${styles.group} ${styles.duplicate} ${isPaused ? styles.paused : ''}`}>{children}</div> </div> ); };