This component no longer exists. It was in ns-ui’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.
Carousel Card Riffle
ns-ui/carousel-card-riffleRemovedComponent
A card-stack navigator that shows its actual card edges as a scrubbable stripe of thin lines — dragging it riffles cards past with quick flip-past kicks, and the same stripe doubles as the pagination readout.
Live preview
live · rendered by the registry
Rendered by ns-ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://design.helpmarq.com/r/carousel-card-riffle.jsonSource
1"use client";23import { useEffect, useRef, useState } from "react";45// ---------------------------------------------------------------------------6// RiffleEdge — a card-stack navigator whose pagination indicator IS the scrub7// control. The stack shows its actual card edges as a stripe of thin lines8// (one 1px --border line per card, the current one recolored --foreground),9// running down the side of the top card like the exposed page-edge of a10// book. Dragging that stripe riffles cards past: each step change kicks the11// top card with a 220ms rotateY(5deg) + translateX(11px) flip-past (deter-12// ministic per-index vertical jitter, so no two steps land identically),13// settling on a smooth ease-out with no overshoot — release settles the14// arrival with the same kick. The two decorative depth layers behind the15// top card (its permanently-visible stacked-thickness read) kick too, on16// the same commit, at a subtler amplitude (9px/3deg then 5px/2deg, reduced17// with depth): an opposite-leaning translate+rotate that eases back to18// their resting offset a beat after the top card, each layer lagging the19// one in front of it — so a step reads as the whole deck visibly20// reshuffling and restacking, cleanly, not a subtle 3px nudge and not a21// glitchy overshoot. Scrub22// velocity governs which: slow drags step discretely (a kick per card), fast23// drags blur the top card through a CSS filter transition instead of24// chattering through kicks — the exposed edge itself carries both roles at25// once, never a separate dot-row or progress bar.26//27// Direct DOM writes (transform/filter) on committed index changes only — no28// per-frame rAF loop. Motion is entirely CSS-transition-driven: a one-off29// double-write (snap to a kicked pose, then rAF back to identity/rest so the30// transition eases the return) for the flip and the two back-layer nudges,31// and a filter transition ramped by the caller for blur. The back layers'32// resting offset is expressed in rem (matching their Tailwind translate33// utility at rest) with the kick's extra nudge layered on top via calc(), so34// the shuffle scales with root font size the same way the static pose35// already did. `prefers-reduced-motion` drops all of it: no rotateY, no36// perspective, no back-layer nudge, no blur ever — steps crossfade via37// opacity instead.38//39// The stripe's *drawn* thickness is deliberately compressed (down to a40// 1.5px-per-card pitch) so a small deck visibly reads thinner than a large41// … truncated
