Catalog

Edit Props (live)

JSON
config
config

Source

85 lines
// Demo block. Source text here is kept byte-compatible with the `source`
// field seeded into RemotionBlock by scripts/seed-demo-blocks.ts so the
// live catalog preview renders the exact same component the bundler
// Lambda will produce once it ships.

import React from 'react';
import {
  AbsoluteFill,
  interpolate,
  useCurrentFrame,
  useVideoConfig,
} from 'remotion';

interface Props {
  items: { label: string; status: string }[];
  tagline: string;
  accentColor: string;
}

export default function TerminalChecklist({
  items,
  tagline,
  accentColor,
}: Props) {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();
  const perItem = fps * 0.6;

  return (
    <AbsoluteFill style={{ backgroundColor: '#000', padding: 80 }}>
      {items.map((item, i) => {
        const appear = interpolate(
          frame - i * perItem,
          [0, fps * 0.3],
          [0, 1],
          {
            extrapolateLeft: 'clamp',
            extrapolateRight: 'clamp',
          }
        );
        return (
          <div
            key={i}
            style={{
              opacity: appear,
              transform: `translateY(${(1 - appear) * 12}px)`,
              border: '1px solid #333',
              borderRadius: 8,
              padding: '18px 22px',
              marginBottom: 16,
              color: '#fff',
              fontFamily: 'monospace',
              display: 'flex',
              justifyContent: 'space-between',
            }}
          >
            <div>
              <span style={{ color: accentColor, marginRight: 12 }}>
                {String(i + 1).padStart(2, '0')}
              </span>
              <span style={{ fontWeight: 700 }}>{item.label}</span>
            </div>
            <div style={{ color: accentColor, fontSize: 16 }}>
              {item.status}
            </div>
          </div>
        );
      })}
      <div
        style={{
          position: 'absolute',
          bottom: 120,
          left: 80,
          color: accentColor,
          fontFamily: 'monospace',
          fontSize: 36,
          fontWeight: 800,
        }}
      >
        {tagline}
      </div>
    </AbsoluteFill>
  );
}

Schema (Zod)

import { z } from 'zod';

export const Schema = z.object({
  items: z
    .array(z.object({ label: z.string(), status: z.string() }))
    .describe('$port:json Checklist items (array of {label, status})'),
  tagline: z.string().default('CONNECTS TO EVERY TOOL').describe('Tagline'),
  accentColor: z.string().default('#22c55e'),
});

Terminal Checklist

terminal_checklist

Green-on-black terminal checklist with staggered item reveal and a payoff tagline. Inspired by Andy's hook_animations_v2 reel.

Workflow Inputs (1)

  • Checklist items (array of {label, status})
    items
    JSONRequired

Config Fields (2)

  • tagline
  • accentColor

Meta

Updated
4/21/2026