PreviewCode0123456789012345678901234567890123456789 Usage Copy the component to your project.import { cn } from '@/lib/utils' interface MarqueeProps { className?: string reverse?: boolean pauseOnHover?: boolean children?: React.ReactNode vertical?: boolean repeat?: number [key: string]: any } export function Marquee({ className, reverse, pauseOnHover = false, children, vertical = false, repeat = 4, ...props }: MarqueeProps) { return ( <div {...props} className={cn( 'group flex overflow-hidden p-2 [--duration:40s] [--gap:1rem] [gap:var(--gap)]', { 'flex-row': !vertical, 'flex-col': vertical, }, className )} > {Array(repeat) .fill(0) .map((_, i) => ( <div key={i} className={cn('flex shrink-0 justify-around [gap:var(--gap)]', { 'animate-marquee flex-row': !vertical, 'animate-marquee-vertical flex-col': vertical, 'group-hover:[animation-play-state:paused]': pauseOnHover, '[animation-direction:reverse]': reverse, })} > {children} </div> ))} </div> ) }View CodeChange your tailwind config to include the following keyframes and animations.tailwind.config.tsimport type { Config } from 'tailwindcss' const config: Config = { // ... theme: { extend: { animation: { marquee: "marquee var(--duration) linear infinite", "marquee-vertical": "marquee-vertical var(--duration) linear infinite", }, keyframes: { marquee: { from: { transform: "translateX(0)" }, to: { transform: "translateX(calc(-100% - var(--gap)))" }, }, "marquee-vertical": { from: { transform: "translateY(0)" }, to: { transform: "translateY(calc(-100% - var(--gap)))" }, }, }, }, }, }Use the component. props interface MarqueeProps { className?: string // Additional CSS classes reverse?: boolean // Reverse the direction of the marquee pauseOnHover?: boolean // Pause the animation when hovering children?: React.ReactNode // The content to be displayed in the marquee vertical?: boolean // Whether the marquee should scroll vertically repeat?: number // The number of times to repeat the content [key: string]: any // Additional props }