About this animation
A voice assistant with a charging orb and reactive wave fields, with configurable status copy, home content, colors, and fonts.
Why this one
The orb carries the listening state as visible material: its edge catches a cool refracted rim, eight moving energy filaments wind around a bright core, and warm and cool wave bands meet at its center. The same orb travels toward the microphone tile as the glass dashboard home appears.
How it works
- One Reanimated clock feeds the Skia shaders without React renders. The optional
levelshared value drives the orb's filament speed and the amplitude of both wave fields. - Eight inclined, noisy 3D rings are projected analytically into thin additive light filaments. The dark glass body adds a luminous core, a circular Fresnel rim, interior shadow, and an upper specular arc. Its Canvas measures exactly the orb diameter; no ray marching, animated blur masks, or screen-sized orb rendering.
- A shallow second Canvas paints three variable-width luminous ribbons per side, with a soft halo and brighter edges. Tapping the microphone uses a Gesture Handler tap and one active value to flatten and dim them.
- The close action moves and scales the orb to the measured microphone badge on the home talk tile, with an interruptible spring, while the greeting, action cards, recent searches, and glass navigation bar appear.
- A separate static background shader paints two soft night-color pools and fine grain. Expo BlurView samples that background through an SDK 58 BlurTargetView for the dashboard glass, including Android SDK 31+.
- Reduced motion keeps the shaders still and uses short fades for state changes. Autoplay stops when the user touches the demo.
Install
npx expo install @expo/vector-icons @shopify/react-native-skia expo-blur expo-linear-gradient react-native-gesture-handler react-native-reanimated react-native-workletsFor web, initialize CanvasKit before mounting the component through the host app's Skia loader.
Usage
import PlasmaOrbListening, { type PlasmaOrbListeningRef } from './plasma-orb-listening';
const assistant = useRef<PlasmaOrbListeningRef>(null);
<PlasmaOrbListening ref={assistant} onMicToggle={(listening) => saveListeningState(listening)} />;
assistant.current?.goHome();Theme and copy can be replaced independently:
<PlasmaOrbListening
title="Northstar"
assistantName="Northstar Assistant"
hint="Find a little more clarity in your day."
colors={{ background: ['#10182C', '#202647', '#3B2854'], mic: ['#6946D8', '#B15AEF'] }}
/>Props
| Prop | Type | Default | Purpose |
|---|---|---|---|
title | string | Lumen AI | Header title. |
assistantName | string | Lumen Assistant | Listening screen heading. |
listeningLabel / pausedLabel | string | Listening / Paused | Listening status copy. |
hint | string | Personalized guidance sentence | Supporting listening copy. |
greeting | string | Sam | Name in the home greeting. |
colors | object | Night blue and violet palette | Background stops, warm and cool wave colors, five filament colors, and microphone gradient. |
fontFamily | string | Geist_400Regular | Typeface used by body and home copy. |
level | SharedValue<number> | Simulated level | Optional normalized audio level from 0 to 1. |
onMicToggle | (listening: boolean) => void | undefined | Called when listening changes. |
onChatPress / onImagePress | () => void | undefined | Called by the chat shortcut and image-search card. |
onClose | () => void | undefined | Called when returning home. |
accessibilityLabels | object | English control labels | Accessible names for icon-only controls. |
home | object | Lumen home labels and three recent items | Home greeting, action, navigation, and recent search copy. |
style | StyleProp<ViewStyle> | undefined | Root container style. |
testID | string | undefined | Root test identifier; microphone uses the -mic suffix. |
The ref exposes listen(), pause(), goHome(), and openListening().
Compatibility
Targets Expo SDK 58, React Native 0.88.0, Reanimated 4.7.1, Worklets 0.13.0, and Skia 2.14.0. Uses Expo Go bundled modules. Supports iOS, Android, and web.
Accessibility
Microphone, close, chat, and home actions have button semantics and labels. The microphone supports tap as the direct alternative to audio input. Reduced motion freezes the shaders, removes flight and scale motion, disables blur, and uses 200 ms fades. The host applies safe-area insets. Layout follows the measured container, including a 300 × 400 embed; the dashboard scrolls on short screens and caps its content width on tablets.
Icons: Feather from @expo/vector-icons.
statusFontFamily optionally supplies a serif status face; by default the status uses fontFamily or the system face. The optional home.greetingPrefix string replaces the complete greeting prefix (default: "Hi,"). All existing props and ref methods remain supported. The greeting, cards, and navigation keep the reference hierarchy, with original assistant copy and colored icon badges. The procedural orb approximates refraction; it is not a physically traced glass render.



