Campfire
Registry

Step

A numbered step with heading and detail.

<Step number="1" heading="Write slides">
  One MDX file per slide — `01-campfire.mdx`, `02-why.mdx`.
</Step>

<Step number="2" heading="Shape the story">
  Layouts and components are plain React.
</Step>

<Step number="3" heading="Present">
  `camp` watches the filesystem and hot reloads.
</Step>

Installation

camp add step

Or with any shadcn-compatible CLI:

bunx shadcn@latest add https://campfire-deck.vercel.app/r/step.json

Copy the source into components/step.tsx. It imports cn from @/lib/utils — scaffolded by camp init, or camp add utils:

components/step.tsx
import type { ComponentProps } from "react";
import { cn } from "@/lib/utils";

export type StepProps = ComponentProps<"div"> & {
  /** The step marker rendered in the badge. */
  number: number | string;
  /** Step heading. */
  heading: string;
};

/** A numbered step with heading and optional detail. */
export default function Step({
  number,
  heading,
  className,
  children,
  ...props
}: StepProps) {
  return (
    <div
      className={cn("flex items-start gap-6", className)}
      data-slot="step"
      {...props}
    >
      <span
        className="flex size-12 shrink-0 items-center justify-center rounded-full bg-primary font-bold text-background text-xl"
        data-slot="step-number"
      >
        {number}
      </span>
      <div className="flex flex-col gap-2">
        <span
          className="font-heading font-semibold text-3xl"
          data-slot="step-heading"
        >
          {heading}
        </span>
        {children ? (
          <div
            className="text-xl leading-relaxed opacity-75"
            data-slot="step-detail"
          >
            {children}
          </div>
        ) : null}
      </div>
    </div>
  );
}

Usage

slides/03-how.mdx
---
title: How it works
---

## How it works

<Step number="1" heading="Write slides">
  One MDX file per slide.
</Step>

<Step number="2" heading="Present">
  `camp` serves a live presentation shell.
</Step>

API Reference

Extends ComponentProps<"div"> — native props are forwarded and className is merged last. Parts expose data-slot="step", step-number, step-heading, and step-detail.

Prop

Type

On this page