A Day In The Tool

(One ordinary Tuesday)

The same screen, four times in a working day.

Nothing here is a special case. Pick an hour and see exactly what the studio was looking at.

(The hours)

Catalogue, spring

Reading order decided before layout. Two sections carry the argument, the rest support it.

  • Audience: independent booksellers
  • Success: preorders before print
  • Open: budget ceiling
brief.md

A brief that argues with itself before you do

Clients fill the same short template overnight. Missing answers stay visible instead of quietly becoming assumptions.

Time to first callDown to one day
About this block

A Day In The ToolPRO

Showcase built as a ruled timetable: selecting an hour swaps a soft panel that floats the matching interface piece over a dotted field, then explains the moment and states one outcome on its own rule.

Usecase50: A Day In The Tool

A working day set as a ruled timetable. Pick an hour and the panel beside it shows the interface piece that was open at that moment, with the story and the outcome it produced.

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/usecase50?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/usecase50.tsx, the editor10, calendar11, upload23 and upload20 pieces the demo puts in the panel, and the badge7 eyebrow it uses.

Quick start

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

tsx
import { Usecase50, usecase50Demo } from "@/components/beste/block/usecase50";

export default function Page() {
  return <Usecase50 {...usecase50Demo} />;
}

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

tsx
import { Usecase50 } from "@/components/beste/block/usecase50";
import { Calendar11 } from "@/components/beste/piece/calendar11";
import { Editor10 } from "@/components/beste/piece/editor10";

export default function Page() {
  return (
    <Usecase50
      badge={{ label: "One ordinary Tuesday" }}
      heading="The same screen, four times in a working day."
      description="Pick an hour and see exactly what the studio was looking at."
      labels={{ scheduleTitle: "The hours" }}
      moments={[
        {
          time: "08:40",
          label: "The brief arrives already answered",
          title: "A brief that argues with itself before you do",
          description: "Clients fill the same short template overnight.",
          media: <Editor10 title="Catalogue, spring" code="brief.md" />,
          outcomeTitle: "Time to first call",
          outcome: "Down to one day",
        },
        {
          time: "10:15",
          label: "The week books itself",
          title: "Reviews land where the work already is",
          description: "One ninety-minute session a week, at the same hour.",
          media: <Calendar11 heading="Book the weekly review" date="Thursday, 14 March" />,
          outcomeTitle: "Sessions per project",
          outcome: "One a week, no more",
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }–Eyebrow label rendered as a Badge7
headingstring–Section heading in the left header column
descriptionstring–Supporting paragraph in the right header column
momentsMoment[][]Hours in the timetable, first one selected on mount
labelsUsecase50Labels{}Fixed strings that are not content: the timetable's title
classNamestring–Extra classes for the outer <section>
ts
type Moment = {
  time: string;
  label: string;
  title: string;
  description: string;
  /** Media object for this moment, usually a registry piece */
  media: ReactNode;
  outcomeTitle: string;
  outcome: string;
};

type Usecase50Labels = {
  scheduleTitle?: string;
};

Behavior notes

  • media is a ReactNode per moment, so each hour can show a different piece: the demo runs an editor, a calendar, a single upload and an upload grid without the block knowing anything about them.
  • The piece floats over a dotted field drawn on the panel's own surface, a radial-gradient on currentColor at text-foreground/20, with no second fill and no border, so the panel keeps one surface and the pattern follows the theme.
  • Timetable rows are a grid-cols-[4.5rem_1fr] with tabular-nums on the time, so the hours form a straight column whatever the labels do.
  • Selection is expressed twice: the row's top rule darkens from border-border to border-foreground and the label gains weight, so it does not rely on colour alone.
  • The media area is flex-1 with min-h-[260px], so switching between a tall calendar and a short upload card does not make the panel jump.
  • The outcome line sits on a border-current/10 rule with items-baseline justify-between, so the label and its value stay aligned and wrap cleanly when the panel is narrow.
  • Below md the timetable stacks above the panel in source order, so a phone reads the day first and then the selected hour.

More Use Case blocks

View all Use Case
PRO

usecase43

A Day In Appointments

PRO

usecase1

Interactive Tab Showcase

PRO

usecase47

Job Index With Image Panel

Get Pro access