Single Case Photo Story

(One job, start to finish)

How a coffee roaster ended up with eighteen rooms.

Client

Marchetti Coffee

They arrived with one shop and a bag design they had outgrown. Three years later the same system opens a room in a new city every six weeks, without us in the room.

Pared-back retail interior with monochrome shelving
(First)

Two days behind the counter

Before drawing anything we worked the morning rush, which is where the real constraints live.

Minimal coffee packaging arranged on a concrete surface
(Then)

A bag that survives a shelf

Packaging redrawn for wholesale, where it sits beside brands with twice the budget and half the restraint.

Minimal coffee bag standing against a plain wall
(After)

A kit their fitters could run

Eleven components and a three-page guide, so a new room needs two studio days rather than twenty.

(Where it ended up)
Rooms opened with the kit
18
Studio days per opening
Two
Stockists added
64
About this block

Single Case Photo StoryPRO

One client story told in three photographed steps, opening with the client name on a ruled block beside the heading and closing with three oversized outcome figures.

Usecase53: Single Case Photo Story

One project told end to end: heading with the client on a rule opposite it, a summary paragraph, three photographed steps in sequence, and a closing row of results at figure scale.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/usecase53?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/usecase53?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/usecase53.tsx plus the badge7 eyebrow it uses.

Quick start

The installed file exports usecase53Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.

tsx
import { Usecase53, usecase53Demo } from "@/components/beste/block/usecase53";

export default function Page() {
  return <Usecase53 {...usecase53Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Usecase53 } from "@/components/beste/block/usecase53";

export default function Page() {
  return (
    <Usecase53
      badge={{ label: "One job, start to finish" }}
      heading="How a coffee roaster ended up with eighteen rooms."
      client="Marchetti Coffee"
      summary="They arrived with one shop and a bag design they had outgrown."
      labels={{ clientTitle: "Client", resultsTitle: "Where it ended up" }}
      steps={[
        {
          index: "First",
          title: "Two days behind the counter",
          description: "Before drawing anything we worked the morning rush.",
          src: "/case/counter.jpg",
          alt: "Retail interior with monochrome shelving",
        },
        {
          index: "Then",
          title: "A bag that survives a shelf",
          description: "Packaging redrawn for wholesale.",
          src: "/case/bag.jpg",
          alt: "Minimal coffee packaging",
        },
      ]}
      results={[
        { title: "Rooms opened with the kit", value: "18" },
        { title: "Studio days per opening", value: "Two" },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow label rendered as a Badge7
headingstringSection heading in the left header column
clientstringClient name, set on a rule opposite the heading
summarystringParagraph introducing the case
stepsStoryStep[][]Photographed steps, rendered left to right
resultsStoryResult[][]Closing figures
labelsUsecase53Labels{}Fixed strings that are not content: the client and results titles
classNamestringExtra classes for the outer <section>
ts
type StoryStep = {
  index: string;
  title: string;
  description: string;
  src: string;
  alt: string;
};

type StoryResult = {
  title: string;
  value: string;
};

type Usecase53Labels = {
  clientTitle?: string;
  resultsTitle?: string;
};

Behavior notes

  • The client block sits on its own border-t and is md:justify-self-end, so it reads as a credit line on the heading's baseline rather than a second column of copy.
  • Step indexes are Badge7 eyebrows rather than numerals, which lets the sequence be worded (First, Then, After) instead of forcing a numbered list.
  • Each step's copy sits under a border-t below its picture, so the three steps read as a ruled sequence across the row.
  • Results are a real dl at text-4xl growing to md:text-5xl, deliberately larger than anything in the steps, so the section closes on its outcome.
  • The results row is separated by a wide mt-16 rather than a rule, so it reads as a coda to the story rather than a fourth step.
  • Steps hold aspect-[4/3] at every width and stack in source order below md, keeping the sequence readable on a phone.
  • Every part is optional: without steps the block is a client summary with results, and without results it ends on the last step.

More Use Case blocks

View all Use Case
PRO

usecase61

Linked Story Cards

Three case studies, each card a whole link: a photograph drifting inside its frame, a serif figure with the span it covers, the story in two sentences and an attribution facing an arrow that lifts on hover.

PRO

usecase45

Alternating Scenario Rows

Three use cases as image and text rows, each numbered and carrying a story, two ruled outcome figures and its own outline pill link; pictures stay top-aligned and the side only alternates from lg, so a tablet keeps every image at the top left.

PRO

usecase43

A Day In Appointments

A use case with an eyebrow over a hairline rule, a two-column heading, and three image tiles that each float a live appointment card above a title and description.

PRO

usecase59

Linked Situation Rows

Five situations as ruled rows, each one a whole link: a square photograph pinned left, a serif sentence over its paragraph, and an arrow link at the right end that lifts as the row tints on hover.

PRO

usecase48

Stacked Photo Bands

Three tall photographic bands stacked full width, each carrying an eyebrow, display title, explanation, one outcome figure and its own outline pill link over a tinted scrim; the three-column foot only forms from lg up so the sentence keeps its measure on a tablet.

PRO

usecase42

Multi-Site Locations

A multi-site use case with an eyebrow over a hairline rule, a two-column heading, and three image tiles that each float a live location card above a title and description.