Skip to content
Native Animation
Jelly Orb Transcript animation preview

This preview uses fictional demo content. See the props below for the customization options available in this component.

npx nativeanimation add jelly-orb-transcript
Skia

Jelly Orb Transcript

A speaking gel orb with a tappable karaoke transcript and configurable text, reading pace, colors, and font.

$9 for this animation

Add to your project

Copy the component and its assets into your app with the Native Animation CLI, or paste the agent prompt into Claude Code, Codex or Cursor once the MCP server is connected.

About this animation

A speaking gel orb with a tappable karaoke transcript and configurable text, reading pace, colors, and font.

How it works

  1. One continuous spoken shared value tracks the fractional word currently being read.
  2. Each word derives its color and subtle rise from that value, so tapping any word seeks immediately.
  3. Words with at least seven letters launch directional traveling waves around the rim, each with one damped rebound (mass 1, stiffness 64, damping 12; damping ratio 0.75). An optional audio level adds slow deformation.
  4. One compact Canvas combines the violet-to-cyan gel shader, moving caustic filaments, two sliding specular highlights, a radial aura, and up to four translucent bubbles emitted by long words, each rising over 2.6 seconds.
  5. A falling droplet flattens and grows with one subdued rebound; an expanding ambient wash and delayed transcript reveal finish within 1.8 seconds. Each spoken word leaves cyan ink that fades continuously over 800 ms.
  6. Reduced motion skips the introduction and freezes the gel, removing impacts, particles, and text glow while retaining readable state changes.

Install

npx expo install @shopify/react-native-skia expo-linear-gradient react-native-reanimated react-native-worklets

For web, initialize CanvasKit before mounting the component using the application's Skia loader. No native package beyond these Expo SDK compatible dependencies is required.

Usage

import JellyOrbTranscript from './JellyOrbTranscript';

<JellyOrbTranscript text={'A short line.\nA second line.'} />
import { useRef } from 'react';
import { useSharedValue } from 'react-native-reanimated';
import JellyOrbTranscript, { type JellyOrbTranscriptRef } from './JellyOrbTranscript';

const level = useSharedValue(0);
const player = useRef<JellyOrbTranscriptRef>(null);
<JellyOrbTranscript ref={player} level={level} wordsPerSecond={2.7} onOpenChat={openChat} />;
player.current?.seekToWord(4);

Props

PropTypeDefaultDescription
textstringDesign-review jokeTranscript; line breaks are preserved.
wordsPerSecondnumber2.7Word cadence; adds 600 ms after commas, colons, and semicolons, and 1.2 s after sentences.
colorsJellyOrbTranscriptColorsNavy, white, muted violet, and violet-blue-cyan orbFull background and text palette.
levelSharedValue<number>undefinedOptional normalized voice level for orb deformation.
onToggle(playing: boolean) => voidundefinedPlayback state callback.
onOpenChat() => voidundefinedChat button callback.
onBack() => voidundefinedBack button callback.
fontFamilystringSystem fontOptional transcript font.
styleStyleProp<ViewStyle>undefinedContainer style.
testIDstringundefinedRoot test identifier.

The ref exposes play(), pause(), restart(), and seekToWord(index).

Compatibility

Targets Expo SDK 58, React Native 0.88, Reanimated 4.7, and Skia 2.14. Intended for iOS, Android, and web in Expo Go with the matching SDK.

Accessibility

Interactive controls have button roles and labels. Each word is an accessible seek target. Reduced motion removes the introduction, moving shader, traveling waves, bubbles, and text glow while preserving the spoken and pending color distinction. The host screen applies safe-area insets.

Why this one

The transcript and orb share one reading position, turning static speech copy into a seekable voice moment with tactile visual feedback.

Icons: Lucide (ISC).

Calm motion tuning

Timing constants are grouped at the top of JellyOrbTranscript.tsx. The public props and ref methods are unchanged.

The pre-adjustment rush came from these locations in that file (line numbers refer to ticket 1):

SourceBeforeAfter
Playback, lines 364–384 and 461–4923.2 words/s; only em dashes paused2.7 words/s; comma pause 600 ms, sentence pause 1.2 s
Impact dispatch, lines 471–485Every wordOnly words with at least seven letters
Gel waves, lines 70–8020 rad/s; amplitude 0.067; propagation 8 rad/s5.29 rad/s; amplitude 0.03; propagation 2.5 rad/s; one rebound, damping ratio 0.75
Internal flow, lines 79–101Full-speed noise and specular movementQuarter-speed noise, specular, and idle rim motion; six-second breathing cycle
Bubbles, lines 198–214 and 313Up to 12; 1.25 s riseUp to four; 2.6 s rise
Word ink, lines 730–750Exponential fade (263 ms time constant); active row glow switched abruptly80 ms soft onset and continuous fade ending at 800 ms; no abrupt row glow
Introduction, lines 57–60 and 447–4481.4 s; multiple stronger rebounds1.8 s; smaller single damped rebound

Pauses begin after a punctuation-bearing word finishes. Seeking clears any pending pause. Reduced motion retains the same reading cadence without animated gel or glow.