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. Canvas & 3D
  6. Crowd canvas

Crowd canvas

A canvas that fills its box with small OpenPeeps characters walking across the bottom on a continuous loop. Hover anywhere to raise a magnifier lens and zoom in on the crowd.

Overview

The crowd canvas fills its container with small OpenPeeps characters that walk across the bottom of the box on a continuous loop. Each character is one frame sampled from a sprite sheet; a set of animation timelines slides them left and right at varied speeds so the crowd never lines up. Hover anywhere over the box to raise a magnifier lens that samples and zooms the region under the cursor.

It is a decorative, ambient piece: a lively background for a hero, an empty state, or a section header. The component fills its nearest positioned parent, so size and clip it by styling the wrapper rather than the canvas.

Installation

Import the pattern from loosethreads:

tsx
import { CrowdCanvas } from "@pulp/loosethreads/patterns"

Usage

Give the component a sprite sheet URL and the grid it is laid out on, then wrap it in a positioned, fixed-height box. It reads reduced-motion as a reducedMotion prop rather than checking the media query itself, so resolve the preference once and pass it down:

tsx
import { CrowdCanvas } from "@pulp/loosethreads/patterns"
import { useEffect, useState } from "react"

// The component takes reduced motion as a prop, so resolve it once and pass it in.
function usePrefersReducedMotion() {
  const [reduced, setReduced] = useState(false)
  useEffect(() => {
    const mq = window.matchMedia("(prefers-reduced-motion: reduce)")
    const update = () => setReduced(mq.matches)
    update()
    mq.addEventListener("change", update)
    return () => mq.removeEventListener("change", update)
  }, [])
  return reduced
}

function WalkingCrowd() {
  const reducedMotion = usePrefersReducedMotion()

  return (
    <div style={{ position: "relative", width: "100%", height: 520, overflow: "hidden" }}>
      <CrowdCanvas
        src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/175711/open-peeps-sheet.png"
        rows={15}
        cols={7}
        reducedMotion={reducedMotion}
      />
    </div>
  )
}

Props

PropTypeDefaultDescription
srcstringRequiredURL of the sprite sheet to draw from. The canvas only draws the image and never reads its pixels, so a cross-origin URL works without crossOrigin.
rowsnumberRequiredNumber of character columns across the sheet (the sheet is divided into rows slices horizontally to find each frame width).
colsnumberRequiredNumber of character rows down the sheet. Combined with rows this gives the total pool of unique characters.
reducedMotionbooleanRequiredWhen true, the crowd renders a single static frame and the continuous animation loop never starts. Wire this to the user's prefers-reduced-motion setting.

Anatomy

Two stacked canvases fill the wrapper. The base canvas draws the crowd: characters are placed on animation timelines driven by a shared ticker, and each one is redrawn every frame as it walks across the stage and recycles when it exits. The overlay canvas is the hover lens; while the cursor is over the box it samples a zoomed region of the base canvas each frame, so the magnified characters stay in sync with the ones underneath.

Off-screen the per-frame draw pauses. The base canvas skips its clear and redraw while it is scrolled out of view, so an ambient crowd low on a long page costs no main-thread time until it scrolls back in.

Accessibility

  • Decorative. Both canvases are aria-hidden, so assistive tech skips the animation. Keep any real content out of the canvas.
  • Motion. The walk is an auto-playing loop that runs longer than five seconds, so it honors prefers-reduced-motion (WCAG 2.2.2): when reducedMotion is true the component paints one static frame and never starts the ticker. You must supply that prop for the gate to work.

Next: Interactive robot. Back to Canvas & 3D.

Crowd canvas
Hover to magnify · Adapted from Skiper UI