This component no longer exists. It was in godui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-07 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.
Animated Testimonials
godui/animated-testimonialsRemovedComponent
A testimonial carousel with a shuffling image stack, word-by-word quote reveal, and autoplay.
Install it
npx shadcn@latest add https://godui.design/r/animated-testimonials.jsonSource
1"use client";23import { AnimatePresence, motion } from "framer-motion";4import * as React from "react";56export type Testimonial = {7 /** The testimonial quote. */8 quote: string;9 /** Person's name. */10 name: string;11 /** Person's role / company. */12 role: string;13 /** Avatar / portrait image URL. */14 src: string;15};1617export type AnimatedTestimonialsProps = React.HTMLAttributes<HTMLDivElement> & {18 /** Testimonials to cycle through. */19 testimonials: Testimonial[];20 /** Advance automatically. */21 autoplay?: boolean;22 /** Autoplay interval in milliseconds. */23 interval?: number;24};2526const ARROW_BASE =27 "flex size-9 items-center justify-center rounded-full bg-muted text-foreground [transition:background_200ms_ease] hover:bg-accent";2829const AnimatedTestimonials = React.forwardRef<30 HTMLDivElement,31 AnimatedTestimonialsProps32>(33 (34 { testimonials, autoplay = true, interval = 5000, className, ...props },35 ref,36 ) => {37 const [active, setActive] = React.useState(0);38 const count = testimonials.length;3940 const next = React.useCallback(41 () => setActive((prev) => (prev + 1) % count),42 [count],43 );44 const prev = () => setActive((p) => (p - 1 + count) % count);4546 // Stable per-item rotation so inactive cards fan out consistently.47 const rotations = React.useMemo(48 () => testimonials.map(() => Math.floor(Math.random() * 16) - 8),49 [testimonials],50 );5152 // Keyed on `active` so the countdown restarts whenever the slide changes —53 // including manual prev / next — instead of firing on a fixed cadence.54 // biome-ignore lint/correctness/useExhaustiveDependencies: `active` is the intentional reset trigger55 React.useEffect(() => {56 if (!autoplay || count <= 1) return;57 const id = setTimeout(next, interval);58 return () => clearTimeout(id);59 }, [autoplay, interval, next, count, active]);6061 if (count === 0) return null;62 const current = testimonials[active];6364 return (65 <div66 ref={ref}67 data-slot="animated-testimonials"68 className={`grid w-full max-w-3xl gap-8 md:grid-cols-2 ${className ?? ""}`}69 {...props}70 >71 <div className="relative h-72 [perspective:1000px]">72 <AnimatePresence>73 {testimonials.map((t, i) => {74 const isActive = i === active;75 return (76 <motion.img77// … truncated
What it pulls in
npm packages
Other registry items
