Skip to content
Esc
navigateopen⌘Jpreview

Feature tour

Promise, workflow, benefits: the three-beat explainer for a feature nobody has seen yet.

16:9 · every frame here is the frame odori export writes.

The files

A block is a directory, not a bundle. Pick a file to read the source it ships with.

videos/components/end-card/feature-stack/stage/title-reveal/workflow-steps/feature-tour/
videos/feature-tour/video.tsx
import {Scene, Video, defineVideoMetadata} from "odori";
import {EndCard} from "../components/end-card/end-card";
import {FeatureStack} from "../components/feature-stack/feature-stack";
import {Stage} from "../components/stage/stage";
import {TitleReveal} from "../components/title-reveal/title-reveal";
import {WorkflowSteps} from "../components/workflow-steps/workflow-steps";
import {productLayout} from "../layout";
import {tourInput} from "./schema";

/**
 * The three-beat product tour: name the promise, walk the workflow, land the
 * benefits. Every beat is one component, so retiming is a duration edit.
 */
export const metadata = defineVideoMetadata({
  title: "Feature tour",
  description: "Promise, workflow, benefits: the three-beat product tour.",
  duration: "16s",
  layout: productLayout,
  schema: tourInput,
  tags: ["explainer", "product"],
  thumbnailFrame: 60,
});

export default function FeatureTourVideo({headline, callToAction}: {headline: string; callToAction: string}) {
  return (
    <Video>
      <Scene id="promise" duration="4s" name="Promise">
        <Stage>
          <TitleReveal title={headline} detail="Three beats, one cut." />
        </Stage>
      </Scene>
      <Scene id="workflow" duration="6s" name="Workflow">
        <Stage grid={false}>
          <WorkflowSteps headline="How a video gets made" steps={["Author", "Preview", "Test", "Export"]} hold={40} />
        </Stage>
      </Scene>
      <Scene id="benefits" duration="4s" name="Benefits">
        <Stage>
          <FeatureStack
            headline="What you get"
            features={[
              {title: "Fast", detail: "Preview needs no encode."},
              {title: "Typed", detail: "Inputs validated before a render starts."},
            ]}
            hold={60}
          />
        </Stage>
      </Scene>
      <Scene id="end" duration="2s" name="End">
        <Stage>
          <EndCard title="Author. Preview. Ship." callToAction={callToAction} />
        </Stage>
      </Scene>
    </Video>
  );
}

Remix it

Scaffold a project, install the components this block uses, then paste the entry into videos/feature-tour/video.tsx. Every file above is yours to edit from that point on.

pnpm create odori@latest my-video
pnpm odori add @odori/stage @odori/title-reveal @odori/workflow-steps @odori/feature-stack @odori/end-card

Other blocks