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. Text effects
  6. Morphing text

Morphing text

Morphing text cross-fades a headline through an ordered list of words, blurring each into the next so they fuse into one gooey shape mid-transition. Watch it below.

Overview

Morphing text cross-fades through an ordered list of words, one word at a time, looping back to the first. Each transition blurs the outgoing word out and the incoming word in while a threshold filter clamps the alpha channel, so the two blurred shapes fuse into a single gooey form mid-cycle rather than reading as a soft double-exposure.

Use it for a headline that needs to say more than one thing: a rotating set of verbs, product qualities, or audience labels. It renders in --font-garamond at display size and centers itself in its container.

Installation

Import the pattern from loosethreads:

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

Usage

Pass the words you want to cycle through. Drive enabled from the viewer's motion preference so the morph pauses to a static word when reduced motion is requested:

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

function VerbCycle() {
  const [enabled, setEnabled] = useState(true)

  // Turn the morph off for viewers who ask for reduced motion.
  useEffect(() => {
    const query = window.matchMedia("(prefers-reduced-motion: reduce)")
    const update = () => setEnabled(!query.matches)
    update()
    query.addEventListener("change", update)
    return () => query.removeEventListener("change", update)
  }, [])

  return (
    <MorphingText
      texts={["Extract", "Understand", "Reason", "Decide", "Act"]}
      enabled={enabled}
    />
  )
}

Props

PropTypeDefaultDescription
textsstring[]RequiredOrdered list of words to morph through. The component loops back to the first after the last, and joins the list into the container aria-label so the full set is announced at once.
enabledbooleanRequiredRuns the morph loop when true. When false the loop is skipped and the first word renders statically. Wire it to the inverse of prefers-reduced-motion.

Anatomy

Two absolutely-stacked spans hold the outgoing and incoming words. A requestAnimationFrame loop measures real elapsed time and animates each span's filter: blur() and opacity across a short morph window followed by a brief cooldown before the next word. The container applies an SVG feColorMatrix threshold filter, under a component-unique id, that clamps alpha so the two blurred words merge into one shape.

The loop pauses off-screen. While the text is scrolled out of view the RAF loop keeps running but skips the per-frame blur writes, which are the expensive repaint, and resets its clock so the morph does not fast-forward when it returns to view.

Accessibility

  • Labels. The container carries an aria-label built from the full word list, so assistive tech hears every word rather than trying to track the animated glyphs.
  • Motion. The morph auto-plays, so it must honor prefers-reduced-motion. Pass enabled={false} when reduce is set: the loop is skipped and the first word renders static, with no blur and full opacity.

Next: Video text. Back to Text effects.