Animated List
interlace-ui/animated-listFreeComponent
A feed that reveals its children one at a time, newest on top, each entry springing in from `scale: 0`. One more appears every `delay` ms (1000 by default) until the list is full, then it stops — or restarts, with `loop`.
Install it
npx shadcn@latest add https://ds.interlace.tools/r/animated-list.jsonSource
1"use client";23import {4 Children,5 forwardRef,6 useEffect,7 useMemo,8 useState,9 type ComponentPropsWithoutRef,10 type ReactElement,11 type ReactNode,12} from "react";1314// @interlace/animated-list v1.2.0 — Interlace design system.15// Docs, props and live preview: https://ds.interlace.tools/c/animated-list16// What changed since: https://ds.interlace.tools/c/animated-list#history17// Generated banner — keep it, the upgrade diff reads this version.1819/**20 * @interlace/ui — AnimatedList + AnimatedListItem21 *22 * A feed that reveals its children one at a time, newest on top, each entry23 * springing in from `scale: 0`. One more appears every `delay` ms (1000 by24 * default) until the list is full, then it stops — or restarts, with `loop`.25 *26 * The list is `aria-live="polite"`, so each arrival is announced.27 *28 * ## Provenance29 *30 * Our reimplementation of the Magic UI `AnimatedList` concept. What is ours:31 * the reduced-motion gating, the visible pause control, and a `loop` that32 * really restarts — upstream advanced with `% length` but never reset the33 * visible window, so it stalled at the end instead of looping. The spring34 * physics, gap, direction and per-step delay are all props with structural35 * defaults, so nothing product-specific is baked in.36 *37 * ## Anatomy38 *39 * div.relative40 * ├─ div (data-slot="animated-list", aria-live=polite)41 * │ └─ AnimatedListItem × (data-slot="animated-list-item", motion.div)42 * └─ button (data-slot="animated-list-pause", aria-pressed)43 *44 * ## Motion45 *46 * The sequencing is JS-driven (a `setTimeout` chain) and the pop-in is47 * `motion/react`, so the CSS reset in `styles/preflight.css` reaches neither.48 * Every layer is gated in JS instead:49 *50 * | Layer | Driven by | Under `reduce` |51 * | ---------------- | ---------------------------- | ------------------------------------ |52 * | auto-advance | `setTimeout` chain | `isPlaying` false — never ticks |53 * | visible window | `revealCount` state | full child count, rendered at once |54 * | pause control | — | not rendered (nothing left to pause) |55 * | entry pop-in | `motion/react` spring | `initial={false}` — mounts settled |56 * | reflow slide | `motion/react` `layout` FLIP | `layout` off |57 *58// … truncated
More from interlace-ui
All 140 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| A11y Startera11y-starter | interlace-ui | Components | Free | no deps | |
| Accordionaccordion | interlace-ui | Components | Free | no deps | |
| Alertalert | interlace-ui | Components | Free | no deps | |
| Alert Dialogalert-dialog | interlace-ui | Components | Free | no deps | |
| Animated Gradient Textanimated-gradient-text | interlace-ui | Components | Free | no deps | |
| Animated Grid Patternanimated-grid-pattern | interlace-ui | Components | Free | no deps | |
| Article Cardarticle-card | interlace-ui | Components | Free | no deps | |
| Article List Gridarticle-list-grid | interlace-ui | Components | Free | no deps |
