Skip to content
WingoUI
ComponentsTemplatesDocsPricingAI agentsBlogChangelog
Components
Buttons & Actions
ButtonButton GroupCopy ButtonDelete ButtonTheme ToggleToggleToggle Group
Inputs
Avatar UploadCalendarCheckboxColor PickerComboboxCron PickerCurrency InputDate PickerDate Range PickerDate Time PickerDuration PickerEmail InputFile UploadFilter BuilderInputInput GroupListboxMasked InputMention InputMonth PickerMulti SelectNumber InputOTP InputPassword InputPhone InputRadio GroupRatingSearch InputSegmented ControlSelectSignature PadSliderSwitchTag InputTextareaTime PickerTimezone Select
Forms
Address InputCSV ImportFieldForm WizardInline EditInvoice line itemsRich Text EditorSchema Builder
Navigation
Back To TopBounce SidebarBreadcrumbCommand MenuGlobal SearchGooey NavHook SidebarNav MenuNav TabsPaginationProximity SidebarScroll ProgressSidebarStepsTable Of ContentsTabsTopbarUser MenuWorkspace Switcher
Overlays
Alert DialogContext MenuDialogDrawerDropdown MenuFamily DrawerHover CardPopoverShare DialogSheetShortcuts DialogTooltipTour
Feedback
AlertBannerCookie ConsentEmoji ReactionEmpty StateNotification BellNotification CenterProgressRoute ProgressSetup ChecklistSkeletonSpinnerToast
Data Display
Approval FlowAvatarBadgeCalendar ViewCode BlockComment ThreadContact cardCountdownDescription ListDiff ViewerFile ListFile managerFolderGanttJSON ViewerKbdLog ViewerMarkdownPresenceSchedulerTagTimelineTree View
Tables & Lists
Audit LogData TableDeal PipelineEditable GridKanbanListMembers tablePermissions MatrixTableTask ListVirtual List
Charts & Stats
Animated CounterArea chartBar chartDonut chartFunnel chartGaugeGitHub ActivityHeatmap calendarLeaderboardLine chartRadar chartRadial barSparklineStat CardTrackerTrend badge
Layout
AccordionApp ShellCardCollapsibleDetail LayoutEntity HeaderPage HeaderScroll AreaSeparatorSettings LayoutSplit ViewToolbar
Media
Audio PlayerCarouselCSV ViewerDOCX EditorDOCX ViewerExcel ViewerFile SystemImage compareImage CropperImage LightboxLocation MapPDF ViewerPowerPoint ViewerQR CodeStep PlayerVideo Player
AI Kit
Agent Status CardChat MessageChat ThreadConversation ListFluid OrbGrid RevealMatrix OrbModel PickerPrompt InputReasoning IndicatorRule BuilderSuggestion ChipsTool Call TimelineUsage MeterVoice InputWorkflow Canvas
Text & Effects
Background PatternGravity LettersMarqueeText AnimateText Rotate
Mobile
Action SheetBottom Tab BarFABHaptic ButtonHero HeaderInstall PromptLarge Title HeaderNotification BannerOnboarding CarouselPicker WheelPull To RefreshSlide To ConfirmSticky CTA BarSwipe DeckSwipeable Tabs
Commerce
Cart drawerCategory pickerCheckout stepsCoupon inputFavorite buttonFilter panelListing cardListing gridOrder trackerPricePrice rangePricing tableProduct galleryQuantity stepperReviewsSeller card
Marketing Sections
App Download SectionBlog Cards SectionCTA SectionFAQ SectionFeature GridFeature ShowcaseHero SectionIntegrations SectionLogo CloudMarketing FooterMarketing HeaderMarketing SectionNewsletter SectionPricing SectionStats SectionSteps SectionTeam SectionTestimonials SectionTimeline SectionVideo Section
Blocks
Admin Dashboard PageAdmin ShellAI Chat PageAPI Keys PageAutomation Builder PageCheckout PageCRM Contact PageCRM Pipeline PageError PagesInbox PageInvoice PageKPI DashboardListing Detail PageLogin PageMarketplace Home PageMarketplace Search PageMarketplace ShellMobile App HomeOnboarding FlowPost Listing WizardPricing PageRegister PageSettings PageUsers Admin Page
Templates
About PageAcademy PageAccessibility PageAffiliate PageAI Product PageBlog PageBlog Post PageBug Bounty PageCareers PageChangelog PageCommunity PageCompare PageContact PageCustomer Story PageCustomers PageDemo Booking PageDevelopers PageDocs Home PageDownload PageEnterprise PageEvents PageExperts PageFAQ PageFeature PageGlossary PageHelp Article PageHelp Center PageImpact PageIntegration Detail PageIntegrations PageJob Detail PageLanding PageLaunch PageLegal PageManifesto PagePress PageProduct Tour PagePromo PageReferral PageResearch Report PageRoadmap PageROI Calculator PageSecurity PageSolutions PageStartups PageStatus PageSwitch PageTemplate Gallery PageWaitlist PageYear in Review Page
Hooks & Utilities
AI ChatChart kitCommerceDate utilsFile exportFile typesFiltersForm validationHapticsInvoicingMotion presetsNavigationNumber formatRelative timeRomanian locationsSpreadsheetText matchTonesUIProvideruseClipboarduseConsentuseControllableStateuseCooldownuseDebounceuseKeyboardInsetuseLocaleuseLongPressuseMediaControlsuseMediaQueryuseOverflowItemsusePersistedStateuseScrollEdgesuseScrollStateuseSelectionuseShortcutuseStickToBottom
GalleryTheme

Text & Effects

Marquee

Text & Effects

Marquee React component for Tailwind CSS v4

Gravity LettersText Animate
Live props
Behavior
direction
speed40px/s
pauseOnHover
reverse
showControl
Layout
gap
repeat2
Appearance
fade
fadeSize
State
defaultPaused
Content
pauseLabel
playLabel
Code
import Marquee from "@/components/ui/marquee"

<Marquee />
  1. Home
  2. Components
  3. Text & Effects
  4. Marquee
Pro

Marquee React component for Tailwind CSS v4

v1.0.0·Added in 1.10.0

An infinite scroller for logos, cards, tags or any content, horizontal or vertical, with edge fades and a pause control.

The content glides in a seamless loop at a steady pace in pixels per second, so long and short strips move at the same speed, and the ends fade into the background. Hover the strip, tab into a link inside it or rest a finger on it and it holds still until you let go. With showControl a round pause button sits next to the track; it is a toggle with aria-pressed, reachable with Tab and switched with Enter or Space. Screen readers read the content once, because the moving copies are hidden from them and from the keyboard. Copies are added on their own until the viewport is always covered, it stops painting while scrolled out of view, and under prefers-reduced-motion it turns into a still, wrapped row (or a clipped column). Right-to-left pages are supported.

Marquee is a Pro React component in the React effect components category, written in TypeScript for React 19 and Tailwind CSS v4. It installs as source with npx wingo-ui@latest add marquee, together with Motion presets, UIProvider and useControllableState and the npm packages lucide-react and motion.

Add to a project

Requirements: React 19 and Tailwind CSS v4, in Next.js (App Router or Pages), Vite or React Router. Installation guide · Next.js setup · Vite setup

npx wingo-ui@latest add marquee

Pro item: the CLI needs a Pro account. See plans

Usage

Import Marquee from @/components/ui/marquee.

import Marquee, { MarqueeItem } from "@/components/ui/marquee"

const tags = ["React", "Next.js", "Tailwind CSS", "TypeScript", "Motion", "Radix UI"]

export function TagStrip() {
  return (
    <Marquee speed={30} showControl>
      {tags.map((tag) => (
        <MarqueeItem key={tag} className="rounded-full bg-foreground/5 px-3 py-1.5 text-sm">
          {tag}
        </MarqueeItem>
      ))}
    </Marquee>
  )
}

Props

  • children
    ReactNode

    The items, laid out in a row (or a column for up and down). Wrap each one in MarqueeItem, or pass any elements.

  • directiondefault "left"
    "left" | "right" | "up" | "down"

    Which way the content travels. Up and down make a vertical column that needs a height (h-80 by default).

  • speeddefault 40
    number

    Pixels per second. The loop duration comes from the measured content length, so the pace is the same for any content.

  • gapdefault "md"
    "sm" | "md" | "lg"

    Space between items and between the repeated copies: 16 / 24 / 40px, one step smaller below 640px.

  • repeatdefault 2
    number

    The fewest copies of the content on the track. More copies are added on their own until the viewport is always covered.

  • pauseOnHoverdefault true
    boolean

    Holds still while the strip is hovered, while focus is inside it, and while a finger rests on it on touch screens. The pause control does not count, so play resumes right away.

  • fadedefault true
    boolean

    Fades both ends of the strip into whatever sits behind it, with a CSS mask.

  • fadeSizedefault "md"
    "sm" | "md" | "lg"

    How far the fade reaches: about 5%, 10% or 18% of the strip, with a floor and a ceiling in pixels.

  • reversedefault false
    boolean

    Flips the direction. Handy for stacked rows that should move against each other.

  • paused
    boolean

    Controlled pause state; pair it with onPausedChange. Leave it undefined to let the control (and defaultPaused) own it.

  • defaultPauseddefault false
    boolean

    Starts paused while uncontrolled. Pair it with showControl so people can start it.

  • onPausedChange
    (paused: boolean) => void

    Fires when the pause control is toggled.

  • showControldefault false
    boolean

    Shows a small pause button next to the track, so people can stop motion that runs for long (WCAG 2.2.2). Hidden under reduced motion, where nothing moves.

  • pauseLabeldefault "Pause"
    string

    The control's accessible name. It stays the same in both states; aria-pressed tells whether it is paused.

  • playLabeldefault "Play"
    string

    The control's tooltip while paused.

  • classNames
    Partial<Record<"viewport" | "track" | "group" | "item" | "control", string>>

    Extra classes for the clipping viewport, the moving track, each copy of the content, every MarqueeItem and the pause button.

  • className
    string

    Extra classes for the root, merged last. Set the height of a vertical marquee here, e.g. h-[420px].

Parts

  • MarqueeItem

    component

    An optional wrapper for one item. It never shrinks and picks up classNames.item from the marquee. Takes div props.

  • MarqueeDirection

    type

    The direction union: "left" | "right" | "up" | "down".

  • MarqueeProps

    type

    The props of Marquee: div props plus the options above.

  • MarqueeItemProps

    type

    The props of MarqueeItem, the same as a div.

  • MarqueeGap

    type

    The gap union: "sm" | "md" | "lg".

  • MarqueeFadeSize

    type

    The fade size union: "sm" | "md" | "lg".

  • MarqueeSlot

    type

    The keys of classNames.

Examples

Logo strip

The classic customer row, with wide gaps and soft edges.

Rows in opposite directions

Two rows of cards, the second with reverse, so they slide past each other.

Vertical feed

direction up in a fixed height, fading at the top and bottom.

Tag cloud

Three rows of chips at different speeds.

Announcement bar with a pause button

showControl adds a toggle with aria-pressed, for motion that runs for long.

Dependencies

lucide-reactmotionmotionui-configuse-controllable-state

Files

  • components/ui/marquee.tsx

FAQ

Is the React Marquee component free?

The preview, props and docs are free; copying the source needs a Pro plan. See plans.

How do I install Marquee?

Run npx wingo-ui@latest add marquee. It also adds the Wingo UI items it builds on (Motion presets, UIProvider and useControllableState) and the npm packages lucide-react and motion. With shadcn, add the @wingo-ui registry with your API key, then run npx shadcn@latest add @wingo-ui/marquee.

See also

Logo CloudTestimonials SectionCarouselScroll Area

More React effect components

Text AnimateText RotateBackground PatternGravity Letters
All 5 React effect components
PreviousGravity LettersNext Text Animate
Northwind
Globex
Initech
Umbrella Health
Stark Logistics
Wayne Studio
Hooli
Vandelay
Northwind
Globex
Initech
Umbrella Health
Stark Logistics
Wayne Studio
Hooli
Vandelay

Hover it, or rest a finger on it, to hold it still