This component no longer exists. It was in remotionui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-11 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
infinite-marquee
remotionui/infinite-marqueeRemovedComponent
Endlessly scrolling horizontal text band
Live preview
live · rendered by the registry
Rendered by remotionui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://remotionui.com/r/infinite-marquee.jsonSource
1import { measureText } from "@remotion/layout-utils";2import { useCurrentFrame, useVideoConfig } from "remotion";3import { scaleFont } from "@/remotion/lib/layout";45export type InfiniteMarqueeProps = {6 text: string;7 speed?: number;8 fontSize?: number;9 color?: string;10 fontWeight?: number;11 fontFamily?: string;12 gap?: number;13};1415function getItemWidth(16 text: string,17 fontSize: number,18 fontWeight: number,19 fontFamily?: string,20) {21 const family = fontFamily ?? "system-ui";2223 if (typeof document !== "undefined") {24 return measureText({25 text,26 fontFamily: family,27 fontSize,28 fontWeight: String(fontWeight),29 }).width;30 }3132 return text.length * fontSize * 0.55;33}3435export const InfiniteMarquee: React.FC<InfiniteMarqueeProps> = ({36 text,37 speed = 2,38 fontSize: fontSizeProp,39 color = "#f4f4f5",40 fontWeight = 600,41 fontFamily,42 gap = 48,43}) => {44 const frame = useCurrentFrame();45 const { width } = useVideoConfig();46 const fontSize = fontSizeProp ?? scaleFont(56, width);4748 const itemWidth = getItemWidth(text, fontSize, fontWeight, fontFamily);49 const repetitions = Math.max(4, Math.ceil(width / itemWidth) + 2);50 const halfWidth =51 repetitions * itemWidth + Math.max(0, repetitions - 1) * gap;52 const loopPeriodFrames = Math.max(1, Math.round(halfWidth / speed));53 const progress = (frame % loopPeriodFrames) / loopPeriodFrames;5455 return (56 <div57 style={{58 width: "100%",59 overflow: "hidden",60 whiteSpace: "nowrap",61 }}62 >63 <div64 style={{65 display: "inline-flex",66 gap,67 whiteSpace: "nowrap",68 translate: `${-progress * 50}% 0`,69 fontSize,70 fontWeight,71 color,72 ...(fontFamily ? { fontFamily } : {}),73 }}74 >75 {Array.from({ length: repetitions * 2 }, (_, i) => (76 <span key={i}>{text}</span>77 ))}78 </div>79 </div>80 );81};
