'use client';
import React from 'react';
import { AbsoluteFill, Easing } from 'remotion';
import { TransitionSeries, linearTiming } from '@remotion/transitions';
import { TrackingIn, trackingInSchema } from '@onda/registry/components/tracking-in/TrackingIn';
import { MatrixDecode, matrixDecodeSchema } from '@onda/registry/components/matrix-decode/MatrixDecode';
import { RgbGlitchText, rgbGlitchTextSchema } from '@onda/registry/components/rgb-glitch-text/RgbGlitchText';
import { SlotMachineRoll, slotMachineRollSchema } from '@onda/registry/components/slot-machine-roll/SlotMachineRoll';
import { WordRotate, wordRotateSchema } from '@onda/registry/components/word-rotate/WordRotate';
import { TextFadeReplace, textFadeReplaceSchema } from '@onda/registry/components/text-fade-replace/TextFadeReplace';
import { ShimmerSweep, shimmerSweepSchema } from '@onda/registry/components/shimmer-sweep/ShimmerSweep';
import { DynamicGrid, dynamicGridSchema } from '@onda/registry/components/dynamic-grid/DynamicGrid';
import { Vignette, vignetteSchema } from '@onda/registry/components/vignette/Vignette';
import { gridPixelate } from '@onda/registry/transitions/grid-pixelate/gridPixelate';
import { chromaticAberration } from '@onda/registry/transitions/chromatic-aberration/chromaticAberration';
// grid-pixelate is the hero cut — a slightly longer timing lets the cells
// dissolve read clearly; chromatic-aberration is a fast glitch flash for accent.
const pixelTiming = linearTiming({ durationInFrames: 34, easing: Easing.bezier(0.16, 1, 0.3, 1) });
const glitchTiming = linearTiming({ durationInFrames: 12, easing: Easing.bezier(0.16, 1, 0.3, 1) });
// A high-energy vertical type teaser. Bold typographic beats are cut together
// with grid-pixelate as the signature transition (with two chromatic-aberration
// flashes for accent) — the pixelate wipe carries the reel.
export const KineticTypeComposition: React.FC = () => {
return (
<AbsoluteFill style={{ backgroundColor: '#08080A' }}>
<DynamicGrid
{...dynamicGridSchema.parse({ variant: 'dots', opacity: 0.22, speed: 0.25, glow: false })}
/>
<TransitionSeries>
{/* 1 — calm open */}
<TransitionSeries.Sequence durationInFrames={50}>
<TrackingIn {...trackingInSchema.parse({ text: 'Onda', fontSize: 200, placement: 'center' })} />
</TransitionSeries.Sequence>
<TransitionSeries.Transition presentation={gridPixelate()} timing={pixelTiming} />
{/* 2 — decode */}
<TransitionSeries.Sequence durationInFrames={55}>
<MatrixDecode {...matrixDecodeSchema.parse({ text: 'DECODE', fontSize: 150, placement: 'center' })} />
</TransitionSeries.Sequence>
<TransitionSeries.Transition presentation={gridPixelate({ cols: 32, rows: 18, seed: 3 })} timing={pixelTiming} />
{/* 3 — glitch */}
<TransitionSeries.Sequence durationInFrames={50}>
<RgbGlitchText {...rgbGlitchTextSchema.parse({ text: 'GLITCH', fontSize: 160, placement: 'center' })} />
</TransitionSeries.Sequence>
<TransitionSeries.Transition presentation={chromaticAberration({ intensity: 16 })} timing={glitchTiming} />
{/* 4 — the number rolls (bold accent scene so the pixelate cuts in/out
of it dissolve dark↔color, not dark↔dark) */}
<TransitionSeries.Sequence durationInFrames={55}>
<AbsoluteFill style={{ backgroundColor: '#D96B82' }}>
<SlotMachineRoll {...slotMachineRollSchema.parse({ text: '2026', fontSize: 200, color: '#08080A', placement: 'center' })} />
</AbsoluteFill>
</TransitionSeries.Sequence>
<TransitionSeries.Transition presentation={gridPixelate({ cols: 20, rows: 36, seed: 9 })} timing={pixelTiming} />
{/* 5 — rotating adjectives */}
<TransitionSeries.Sequence durationInFrames={66}>
<WordRotate {...wordRotateSchema.parse({ phrases: ['fast', 'bold', 'restrained'], fontSize: 150, placement: 'center' })} />
</TransitionSeries.Sequence>
<TransitionSeries.Transition presentation={chromaticAberration({ intensity: 12 })} timing={glitchTiming} />
{/* 6 — the loop (lighter accent scene — second bold-color cut) */}
<TransitionSeries.Sequence durationInFrames={78}>
<AbsoluteFill style={{ backgroundColor: '#E89AAB' }}>
<TextFadeReplace {...textFadeReplaceSchema.parse({ phrases: ['ship', 'render', 'repeat'], fontSize: 150, color: '#08080A', placement: 'center' })} />
</AbsoluteFill>
</TransitionSeries.Sequence>
<TransitionSeries.Transition presentation={gridPixelate({ cols: 28, rows: 16, seed: 5 })} timing={pixelTiming} />
{/* 7 — shimmer sign-off */}
<TransitionSeries.Sequence durationInFrames={56}>
<ShimmerSweep {...shimmerSweepSchema.parse({ text: 'Onda', fontSize: 180, align: 'center', placement: 'center' })} />
</TransitionSeries.Sequence>
</TransitionSeries>
<Vignette {...vignetteSchema.parse({ intensity: 0.5 })} />
</AbsoluteFill>
);
};
1080×1920 · 10s · 30fps
Kinetic type · 10s
Vertical (1080×1920) high-energy type teaser. Seven bold typographic beats — a tracking-in title, a matrix-decode, an rgb-glitch headline, a slot-machine number roll, rotating adjectives, a fade-replace loop, and a shimmer sign-off — are cut together with grid-pixelate as the signature transition (plus two chromatic-aberration flashes). A showcase for the grid-pixelate wipe and Onda's kinetic-type range.
The whole composition
Below is the entire source for this showcase — every component, every transition, every prop. Copy it into your Remotion project as a starting point, then swap copy, swap colors, swap timing.
Install the pieces
This showcase uses the following Onda categories — every item is one CLI install:
entrancesgraphicstransitions
Browse the full component catalog for the individual slugs.
Other showcases
- Explainer · 30s →
- Podcast intro · 10s →
- Music release card · 12s →
- Synthwave promo · 10s →
- Meditation breath cue · 20s →
- Live-stream overlay · loop →
- Social ad · vertical · 15s →
- Q4 performance · 12s →
- KPI snapshot · 8s →
- Tutorial intro · 12s →
- Course complete · 10s →
- Launch countdown · 10s →
- Save the date · 8s →
- Dev demo · 11s →
- Changelog · 9s →
- Product launch · 11s →
- Live metrics · 11s →
- Changelog loop · 6s →
- Deploy reveal · 8s →
- Annotated click · 7s →
- Browser walkthrough · 9s →
- Bento drift · 9s →
- Device assemble · 6s →
- Launch trailer · 9s →
- Integration orbit · 8s →
- Board flow · 8s →
- Dashboard fill · 8s →
- Prompt to dashboard · 8s →
- Pricing focus · 7s →
- Code to preview · 8s →