No Buts

A muted objection builds in the corner and a larger reply answers it, repeating, with the last reply in accent.

Installation
$ pnpm dlx shadcn@latest add @remocn/no-buts

Usage

tsx
// src/Root.tsx
import { Composition } from "remotion";
import { NoButs } from "@/components/remocn/no-buts";
 
const NoButsScene = () => (
  <NoButs
    exchanges={[
      { objection: "But I am not a designer.", reply: "You do not need to be." },
      { objection: "But…", reply: "Go on. We will wait." },
    ]}
  />
);
 
export const RemotionRoot = () => (
  <Composition
    id="NoButs"
    component={NoButsScene}
    durationInFrames={255}
    fps={30}
    width={1280}
    height={720}
  />
);

Each exchange builds a muted objection word by word at the top right, then a larger reply along the bottom left; the next exchange pushes the previous one away, and the final reply turns the accent color. Pass exchanges as { objection, reply } pairs. Timing compresses to fit the composition; 226 frames is the uncompressed length of the three defaults. It ships light and dark.

Props5

PropTypeDefault
exchanges
{ objection: string; reply: string }[]DEFAULT_EXCHANGES

Objection and reply pairs, played in order.

accent
string—

Color of the final reply; overrides the theme accent.

background
string—

Background fill; pass "transparent" to drop it.

speed
number1

Playback speed multiplier for the whole timeline.

theme
"dark" | "light""dark"

Light or dark palette.

  • exchanges{ objection: string; reply: string }[]

    Objection and reply pairs, played in order.

    DefaultDEFAULT_EXCHANGES

  • accentstring

    Color of the final reply; overrides the theme accent.

  • backgroundstring

    Background fill; pass "transparent" to drop it.

  • speednumber

    Playback speed multiplier for the whole timeline.

    Default1

  • theme"dark" | "light"

    Light or dark palette.

    Default"dark"