Skip to main content
Pulp
  • Company
Access Demo
    • human interfaces
    • critical decisions
    • persona engine
    • machine health
    • data storytelling
    • persuasive intelligence
    • workforce optimization
    • custom ai/ml
    • policy & governance
    • marketing & media
    • consulting & management
    • finance & markets
    • public engagement
    • thinkwell™ workstation
    • thinkwell™ plugin
    • pulp™ api
  • Company
Access Demo

Overview

  • Introduction
  • Getting started

Guides

  • From draft to decision
  • Score a Reddit thread
  • Ground a claim in evidence
  • Simulate an audience
  • AI Debate Tournament

SDKs

  • Server-Side SDK
    • Radiance
      • RootWords
        • Docs
        • Sections
        • Paras
        • Sentences
        • Clauses
        • Claims
        • Phrases
        • Named Entities
        • Words
        • Characters
        • Special Characters
        • Special Patterns
      • RootCause
      • StemReferences
      • AdCanopy
    • Windfall
      • TrueAura
        • Demographics
        • Psychographics
        • Mindstate
        • Environment
        • Memory
        • Vision
      • NectarRewards
      • PoisonIvy
      • GrapeVine
    • Groundwater
      • WebSoil
      • DomainCrust
      • CodeMantle
      • ServerCore
  • Web SDK
    • loosethreads UI/UX
      • WarpDisplays
      • WeftConversations
      • DyeMedia
      • BightInteractions
      • Component Library
        • Sandbox
          • Cards & panels
            • Expandable card
            • Debug panel
          • Text effects
            • Morphing text
            • Video text
          • Device & browser frames
            • Safari frame
            • iPhone frame
            • Android frame
          • Canvas & 3D
            • Crowd canvas
            • Interactive robot
          • Data & visualization
            • Location map
            • Leaderboard
            • Structured Discussion Bracket
          • Controls & inputs
            • Region Selector
          • Scroll effects
            • Scroll-stack cards
            • Perspective scroll showcase
            • Scroll Scrubber
        • Production

Reference

  • References catalogSoon
  • Conventions
  • PricingSoon
  • Status and roadmapSoon
Introduction
Getting started
$pip install pulp-sdk
From draft to decision
Score a Reddit thread
Ground a claim in evidence
Simulate an audience
AI Debate Tournament
Server-Side SDK
Radiance
RootWords
Docs
📄sample.txt2 paras · 160 chars
Sections
§1 Introduction
Paras
¶1: first paragraph block
¶2: second paragraph block
Sentences
S1S2S3S4
Clauses
C1C2C3C4C5C6
Claims
Claim 1Claim 2Claim 3
Phrases
NPVPNPVPPPNP
Named Entities
Pulp [ORG]
Words
ifwewaitforcertaintywewillbe+20 more
Characters
0 → 159
Special Characters
spaces × 27punct × 8nbsp × 0
Special Patterns
0 patterns detected
RootCause
Ethos
—
Pathos
—
Logos
—
Kairos
—
Style
—
Clarity
—
Focus
—
Awareness
—
Persuasive Velocity—
StemReferences
CensusFECCongressFed. Reg.RegulationsLegiScanGovInfoGDELTCivicWikimediaData.govPodcast Idx
AdCanopy
rank
Windfall
TrueAura
Demographics
life_stageyoung_adult
education_levelbachelors
locationurban
occupationtech
Psychographics
Impelling
Compelling
Repelling
Mindstate
alpha 10 Hzcalm
Environment
vision onhearing onsmell offtouch offtaste off
Memory
purchases 12content 48brands 5
Vision
motivationdesirefear
NectarRewards
define
PoisonIvy
apply
GrapeVine
post
Groundwater
WebSoil
heatmap
DomainCrust
price
CodeMantle
trace
ServerCore
uptimeresize
Web SDK
loosethreads UI/UX
WarpDisplays
📄q3-report.pdf
🖼chart.png
▶keynote.mp4
WeftConversations
ThreadsChatInlineSide panels
DyeMedia
TextToday
ImageToday
SoundSoon
VideoSoon
BightInteractions
MouseKeyboardVoice · soonCombos · soon
Component Library
Sandbox
Cards & panels
Expandable card
Debug panel
Text effects
Morphing text
Video text
Device & browser frames
Safari frame
iPhone frame
Android frame
Canvas & 3D
Crowd canvas
Interactive robot
Data & visualization
Location map
Leaderboard
Structured Discussion Bracket
Controls & inputs
Region Selector
Scroll effects
Scroll-stack cards
Perspective scroll showcase
Scroll Scrubber
Production
Coming soon
Conventions
  1. Web SDK
  2. loosethreads UI/UX
  3. Component Library
  4. Sandbox
  5. Scroll effects
  6. Scroll-stack cards

Scroll-stack cards

A deck of testimonial cards that stack on top of one another, then peel away one by one as you scroll. Scroll inside the preview to peel through them.

Overview

Scroll stack cards render a deck of cards that sit on top of one another, then peel away one at a time as you scroll. Each card maps its own slice of the scroll progress to a translate and rotate, so the stack thins out card by card until the last one stays centered as the resting state.

The effect is self-contained: ContainerScroll ships its own fixed-height, internally scrollable box with a runway several times taller than the frame. Scroll happens inside that box rather than the page, so the peel completes within the preview instead of hijacking the whole viewport. Scroll inside the frame to peel through the stack.

Installation

Import the pattern from loosethreads:

tsx
import {
  ContainerScroll,
  CardsContainer,
  CardTransformed,
  ReviewStars,
} from "@pulp/loosethreads/patterns"

Usage

Compose the three parts: wrap the deck in ContainerScroll, group the cards in CardsContainer (it sets the 3D perspective), and render one CardTransformed per item. Give each card its index and the total arrayLength so it can claim its slice of the scroll:

tsx
import {
  ContainerScroll,
  CardsContainer,
  CardTransformed,
  ReviewStars,
} from "@pulp/loosethreads/patterns"

const reviews = [
  { name: "Priya Nandakumar", quote: "Cut our review turnaround from days to hours.", rating: 5 },
  { name: "Marcus Bell", quote: "We replaced three internal tools with one workflow.", rating: 4.5 },
  { name: "Sofia Alvarez", quote: "The stacking view makes it obvious what needs attention.", rating: 5 },
]

function Testimonials() {
  return (
    <ContainerScroll>
      {/* Pins to the top of the scroll box and centers the stack. */}
      <div style={{ position: "sticky", top: 0, display: "flex", alignItems: "center", justifyContent: "center" }}>
        <CardsContainer>
          {reviews.map((review, index) => (
            <CardTransformed key={review.name} index={index} arrayLength={reviews.length}>
              <ReviewStars rating={review.rating} />
              <p>{review.quote}</p>
              <span>{review.name}</span>
            </CardTransformed>
          ))}
        </CardsContainer>
      </div>
    </ContainerScroll>
  )
}

Props

CardTransformed is the peeling card and carries the configurable props. It also accepts any motion.div prop (including style and event handlers).

PropTypeDefaultDescription
indexnumberRequiredThe card's position in the stack, starting at 0 for the top card. Determines which slice of the scroll progress the card peels across and its stacking order.
arrayLengthnumberRequiredTotal number of cards. Used to size each peel slice; the final card does not peel and stays centered as the resting state.
incrementYnumber10Vertical offset in pixels between each stacked card.
incrementZnumber10Depth step between cards. Scales both the translateZ and the z-index so deeper cards sit further back.
incrementRotationnumber-index + 90Starting rotation in degrees that the card peels from as it leaves the stack.
childrenReactNodeundefinedCard contents. Typically a rating, a quote, and an attribution line.

Anatomy

ContainerScroll is the outer framed box: it clips to a rounded border and holds an inner overflow-y: auto scroller plus a tall runway. It reads that box's scroll progress and shares it through context, so every CardTransformed inside animates off the same value. ReviewStars is a small helper that draws a filled, fractional, and empty star row from a rating (and optional maxRating, default 5).

Keep motion on one package. The cards read a MotionValue from motion/react. A value from a different motion package will not render inside these elements, so import motion from a single entry point.

Accessibility

  • Labels. Each card is a role="group" with an aria-label, and ReviewStars renders a visually hidden "X out of Y stars" label so the rating is announced.
  • Motion. The peel is bound directly to scroll position, which is user input, so nothing auto-plays. There is no ambient animation to gate behind prefers-reduced-motion, and the source does not check it.

Next: Perspective scroll showcase. Back to Scroll effects.

5 out of 5 stars

“Pulp cut our review turnaround from days to hours. The team ships with confidence because the signal is finally in one place.”

Priya NandakumarVP Engineering, Northwind Labs
4.5 out of 5 stars

“We replaced three internal tools with a single workflow. Onboarding took an afternoon, not a quarter.”

Marcus BellHead of Data, Cadence Retail
5 out of 5 stars

“The stacking view makes it obvious what needs attention. Our whole team reads it the same way now.”

Sofia AlvarezFounder, Loomstate
4 out of 5 stars

“Clean, fast, and honest about tradeoffs. It felt built by people who have actually done the work.”

Daniel OseiProduct Lead, Meridian Health