This component no longer exists. It was in obsidianui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-05 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-moving-cards
obsidianui/infinite-moving-cardsRemovedComponent
obsidianui publishes no description for this item.
Live preview
live · rendered by the registry
Rendered by obsidianui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://obsidianui.dev/r/infinite-moving-cards.jsonSource
1"use client";23import { cn } from "@/lib/utils";4import React, { useEffect, useState } from "react";56export interface InfiniteMovingCardsProps {7 items: {8 quote: string;9 name: string;10 title: string;11 }[];12 direction?: "left" | "right";13 speed?: "fast" | "normal" | "slow";14 pauseOnHover?: boolean;15 className?: string;16}1718export const InfiniteMovingCards = ({19 items,20 direction = "left",21 speed = "fast",22 pauseOnHover = true,23 className,24}: InfiniteMovingCardsProps) => {25 const containerRef = React.useRef<HTMLDivElement>(null);26 const scrollerRef = React.useRef<HTMLUListElement>(null);2728 useEffect(() => {29 addAnimation();30 }, []);31 const [start, setStart] = useState(false);32 function addAnimation() {33 if (containerRef.current && scrollerRef.current) {34 const scrollerContent = Array.from(scrollerRef.current.children);3536 scrollerContent.forEach((item) => {37 const duplicatedItem = item.cloneNode(true);38 if (scrollerRef.current) {39 scrollerRef.current.appendChild(duplicatedItem);40 }41 });4243 getDirection();44 getSpeed();45 setStart(true);46 }47 }48 const getDirection = () => {49 if (containerRef.current) {50 if (direction === "left") {51 containerRef.current.style.setProperty(52 "--animation-direction",53 "forwards"54 );55 } else {56 containerRef.current.style.setProperty(57 "--animation-direction",58 "reverse"59 );60 }61 }62 };63 const getSpeed = () => {64 if (containerRef.current) {65 if (speed === "fast") {66 containerRef.current.style.setProperty("--animation-duration", "20s");67 } else if (speed === "normal") {68 containerRef.current.style.setProperty("--animation-duration", "40s");69 } else {70 containerRef.current.style.setProperty("--animation-duration", "80s");71 }72 }73 };74 return (75 <div76 ref={containerRef}77 className={cn(78 "scroller relative z-20 max-w-7xl overflow-hidden ",79 className80 )}81 >82 <ul83 ref={scrollerRef}84 className={cn(85// … truncated
