Auto Scrolling Client Carousel
ruixen-ui/auto-scrolling-client-carouselFreeComponent
Dual ribbon with grayscale bloom — two rows scroll in opposite directions, monochrome at rest, color blooms on hover with spring-bounce lift.
Live preview
live · rendered by the registry
Rendered by ruixen-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://ruixen.com/r/auto-scrolling-client-carousel.jsonSource
1"use client";23import * as React from "react";4import { cn } from "@/lib/utils";56/* ═══════════════════════════════════════════════════════════7 Auto Scrolling Client Carousel — Dual Ribbon, Grayscale Bloom.89 Two rows of logos scrolling in opposite directions at10 slightly offset speeds. Unlike the other two client11 showcases, this one keeps FULL OPACITY at all times —12 logos are always clearly visible. The "muted" state is13 achieved through CSS grayscale, not opacity dimming:14 monochrome at rest, color blooms on hover.1516 Three paradigms, zero overlap:17 • trusted-clients: STATIC grid, binary OPACITY dim18 • client-carousel: SINGLE drift, proximity OPACITY field19 • auto-scrolling: DUAL ribbon, GRAYSCALE bloom (no opacity)2021 Rows scroll continuously — they never pause, never stop.22 The interaction is purely visual: grayscale(1) → grayscale(0)23 with a spring-bounce scale lift. The motion stays constant.2425 Dual-ribbon rhythm:26 Row 1: clients in order, scrolling left, speed N27 Row 2: clients reversed, scrolling right, speed N × 1.1528 The slight speed offset creates a visual polyrhythm —29 logos phase in and out of vertical alignment.3031 Scale lift: cubic-bezier(0.34, 1.56, 0.64, 1) — spring with32 slight overshoot. Different from trusted-clients' deceleration33 and client-carousel's exponential ease.3435 Seamless loop: three copies of items (not two). With only 2×,36 the track can be shorter than the viewport at the loop point,37 creating a visible gap. With 3×, the track always exceeds38 viewport + one full copy. Per-item padding-left (not flex gap)39 ensures -33.333% lands exactly at one copy boundary.4041 Zero dependencies. No embla, no framer-motion, no next/image.42 ═══════════════════════════════════════════════════════════ */4344export interface AutoScrollingCarouselItem {45 name: string;46 logo?: React.ReactNode;47 href?: string;48}4950export interface AutoScrollingClientCarouselProps {51 title?: string;52 clients?: AutoScrollingCarouselItem[];53 /** Seconds for one full scroll cycle. Lower = faster. */54 speed?: number;55 className?: string;56}5758const defaultClients: AutoScrollingCarouselItem[] = [59 { name: "Vercel" },60 { name: "Linear" },61// … truncated
Files it writes
More from ruixen-ui
All 417 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Editorial Accordionaccordion-editorial | ruixen-ui | Components | Free | no deps | |
| Indexed Accordionaccordion-indexed | ruixen-ui | Components | Free | 1 dep | |
| Account Menuaccount-menu | ruixen-ui | Components | Free | 1 dep | |
| Action Toolbaraction-toolbar | ruixen-ui | Components | Free | 1 dep | |
| Add Task Sheetadd-task-sheet | ruixen-ui | Components | Free | 1 dep | |
| Add To Cart Buttonadd-to-cart-button | ruixen-ui | Components | Free | 1 dep | |
| AI Chat Inputai-chat-input | ruixen-ui | Components | Free | 1 dep | |
| Animated Highlight Textanimated-highlight-text | ruixen-ui | Components | Free | 1 dep |
