1080×1080 · 9s · 30fps

Changelog · 9s

Square (1080×1080) release-notes video. A ChapterCard stamps the version, a CodeDiff reveals the actual change line-by-line, a stagger calls out the highlights, and an EndCard points to the update. The interface category narrating a real release — the kind of clip a dev tool ships every sprint.

SRC

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.

TSX
'use client';

import React from 'react';
import { AbsoluteFill, Easing } from 'remotion';
import { TransitionSeries, linearTiming } from '@remotion/transitions';
import { ChapterCard, chapterCardSchema } from '@onda/registry/components/chapter-card/ChapterCard';
import { CodeDiff, codeDiffSchema } from '@onda/registry/components/code-diff/CodeDiff';
import { WordStagger, wordStaggerSchema } from '@onda/registry/components/word-stagger/WordStagger';
import { EndCard, endCardSchema } from '@onda/registry/components/end-card/EndCard';
import { MeshGradient, meshGradientSchema } from '@onda/registry/components/mesh-gradient/MeshGradient';
import { Vignette, vignetteSchema } from '@onda/registry/components/vignette/Vignette';
import { crossFade } from '@onda/registry/transitions/cross-fade/crossFade';

const houseTiming = linearTiming({
  durationInFrames: 18,
  easing: Easing.bezier(0.16, 1, 0.3, 1),
});

export const ChangelogComposition: React.FC = () => {
  return (
    <AbsoluteFill>
      <MeshGradient {...meshGradientSchema.parse({ opacity: 0.3, speed: 0.7 })} />

      <TransitionSeries>
        {/* Beat 1 — version stamp */}
        <TransitionSeries.Sequence durationInFrames={70}>
          <ChapterCard
            {...chapterCardSchema.parse({ number: 'v1.4.0', chapter: "What's new", placement: 'center' })}
          />
        </TransitionSeries.Sequence>

        <TransitionSeries.Transition presentation={crossFade()} timing={houseTiming} />

        {/* Beat 2 — the actual diff */}
        <TransitionSeries.Sequence durationInFrames={110}>
          <CodeDiff
            {...codeDiffSchema.parse({
              title: 'motion.ts',
              lines: [
                { text: "const onda = motion('default');", type: 'remove' },
                { text: "const onda = motion('identity');", type: 'add' },
                { text: 'export default onda;', type: 'context' },
              ],
              placement: 'center',
            })}
          />
        </TransitionSeries.Sequence>

        <TransitionSeries.Transition presentation={crossFade()} timing={houseTiming} />

        {/* Beat 3 — highlights */}
        <TransitionSeries.Sequence durationInFrames={60}>
          <WordStagger
            {...wordStaggerSchema.parse({
              text: '12 transitions · 10 components',
              size: 'subheading',
              stagger: 4,
              justify: 'center',
              color: '#F2F2F4',
              fontFamily: '"Space Grotesk", ui-monospace, monospace',
            })}
          />
        </TransitionSeries.Sequence>

        <TransitionSeries.Transition presentation={crossFade()} timing={houseTiming} />

        {/* Beat 4 — update */}
        <TransitionSeries.Sequence durationInFrames={65}>
          <EndCard
            {...endCardSchema.parse({ cta: 'Update now', handles: ['ondajs@latest'], placement: 'center' })}
          />
        </TransitionSeries.Sequence>
      </TransitionSeries>

      <Vignette {...vignetteSchema.parse({ intensity: 0.5 })} />
    </AbsoluteFill>
  );
};

Install the pieces

This showcase uses the following Onda categories — every item is one CLI install:

  • interface
  • scenes
  • entrances

Browse the full component catalog for the individual slugs.

Other showcases