v1.7.8
Marquee primitive shipped
Marquee renders a seamless auto-scrolling rail from the content you already have. Use it for brand logo rows, launch banners, testimonial snippets, activity signals, status tickers, and compact vertical release feeds.
Marquee creates infinite logo rails, status tickers, release banners, and compact vertical feeds with CSS-only animation and duplicated children for seamless loops.
v1.7.8
Marquee primitive shipped
v1.7.7
CountUp examples refreshed
v1.7.6
Charts SEO expanded
v1.7.5
Rating variants added
Use Show output / Show code on each row. Snippets start with a Variant line naming the axis and token.
Appearance: DEFAULT
Appearance: OUTLINE
Appearance: GHOST
Appearance: CARD
Appearance: SEPARATED
Appearance: SKY
Appearance: ROSE
Appearance: PURPLE
Appearance: PINK
Appearance: ORANGE
Appearance: YELLOW
Appearance: TEAL
Appearance: INDIGO
Appearance: EMERALD
Appearance: GRADIENT-BLUE
Appearance: GRADIENT-GREEN
Appearance: GRADIENT-RED
Appearance: GRADIENT-YELLOW
Appearance: GRADIENT-PURPLE
Appearance: GRADIENT-TEAL
Appearance: GRADIENT-INDIGO
Appearance: GRADIENT-PINK
Appearance: GRADIENT-ORANGE
Size: SM
Size: MD
Size: LG
Orientation: HORIZONTAL
Orientation: VERTICAL
Direction: LEFT
Direction: RIGHT
Direction: UP
Direction: DOWN
Behavior: NO FADE, NO HOVER PAUSE
Override these Marquee variables on :root, a theme selector, or a component wrapper.
Pattern: --zui-<component>-<slot?>-<variant?>-<property>-<state?>-dark?
:root {
--zui-marquee-bg: transparent;
--zui-marquee-fg: oklch(20.8% 0.042 265.755);
--zui-marquee-gap: 1rem;
--zui-marquee-card-bg: #ffffff;
--zui-marquee-card-border: oklch(92.9% 0.013 255.508);
--zui-marquee-outline-border: oklch(86.9% 0.022 252.894);
--zui-marquee-separated-border: oklch(86.9% 0.022 252.894);
--zui-marquee-sky-border: oklch(62.3% 0.214 259.815 / 0.28);
--zui-marquee-rose-border: oklch(58.6% 0.253 17.585 / 0.24);
--zui-marquee-purple-border: oklch(62.7% 0.265 303.9 / 0.24);
--zui-marquee-pink-border: oklch(65.6% 0.241 354.308 / 0.24);
--zui-marquee-orange-border: oklch(70.5% 0.213 47.604 / 0.26);
--zui-marquee-yellow-border: oklch(79.5% 0.184 86.047 / 0.3);
--zui-marquee-teal-border: oklch(70.4% 0.14 182.503 / 0.28);
--zui-marquee-indigo-border: oklch(58.5% 0.233 277.117 / 0.24);
--zui-marquee-emerald-border: oklch(69.6% 0.17 162.48 / 0.28);
--zui-marquee-gradient-blue-from: oklch(62.3% 0.214 259.815);
--zui-marquee-gradient-blue-to: oklch(54.6% 0.245 262.881);
--zui-marquee-gradient-green-from: oklch(72.3% 0.219 149.579);
--zui-marquee-gradient-green-to: oklch(62.7% 0.194 149.214);
--zui-marquee-gradient-red-from: oklch(63.7% 0.237 25.331);
--zui-marquee-gradient-red-to: oklch(57.7% 0.245 27.325);
--zui-marquee-gradient-yellow-from: oklch(85.2% 0.199 91.936);
--zui-marquee-gradient-yellow-to: oklch(79.5% 0.184 86.047);
--zui-marquee-gradient-purple-from: oklch(71.4% 0.203 305.504);
--zui-marquee-gradient-purple-to: oklch(62.7% 0.265 303.9);
--zui-marquee-gradient-teal-from: oklch(77.7% 0.152 181.912);
--zui-marquee-gradient-teal-to: oklch(70.4% 0.14 182.503);
--zui-marquee-gradient-indigo-from: oklch(67.3% 0.182 276.935);
--zui-marquee-gradient-indigo-to: oklch(58.5% 0.233 277.117);
--zui-marquee-gradient-pink-from: oklch(71.8% 0.202 349.761);
--zui-marquee-gradient-pink-to: oklch(65.6% 0.241 354.308);
--zui-marquee-gradient-orange-from: oklch(75% 0.183 55.934);
--zui-marquee-gradient-orange-to: oklch(70.5% 0.213 47.604);
}
/* Dark theme variables follow the same names with -dark appended. */
.dark {
--zui-marquee-card-bg-dark: oklch(20.8% 0.042 265.755 / 0.9);
--zui-marquee-card-border-dark: oklch(37.2% 0.044 257.287);
/* ...same variables with -dark at the end */
}Marquee creates a continuous ticker by rendering two matching content groups and translating the track with CSS keyframes.
It supports horizontal and vertical movement, reverse directions, configurable gap and speed, optional fade masks, and pause-on-hover behavior.
Use Marquee as a wrapper around repeated items such as logo pills, cards, status badges, or testimonials. Configure appearance, size, orientation, direction, speed, gap, fade, and pauseOnHover from props while keeping the child markup fully yours.
Keep marquee content short and non-critical. If the ticker communicates important information, duplicate it elsewhere in static copy or provide an aria-label on the container that summarizes the purpose. Duplicate visual content is hidden from assistive technology.
Marquee is a small client-safe component with no effects, timers, layout measurements, or browser APIs. It works well inside App Router pages while the surrounding SEO content remains server-rendered.
No. Marquee uses CSS keyframes and duplicated children, so it does not require Framer Motion or another animation dependency.
Yes. Set pauseOnHover to pause the track when the user hovers the rail. Reduced-motion users also get a paused animation through motion-reduce styles.
Yes. Set orientation to vertical and use direction up or down. Provide a height with className when the default vertical height does not fit your layout.