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.
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.
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
npx shadcn add "https://ui.beste.co/r/usecase50?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
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.
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.
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:
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",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading in the left header column |
description | string | – | Supporting paragraph in the right header column |
moments | Moment[] | [] | Hours in the timetable, first one selected on mount |
labels | Usecase50Labels | {} | Fixed strings that are not content: the timetable's title |
className | string | – | Extra classes for the outer <section> |
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;
};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.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.grid-cols-[4.5rem_1fr] with tabular-nums on the time, so the hours form a straight column whatever the labels do.border-border to border-foreground and the label gains weight, so it does not rely on colour alone.flex-1 with min-h-[260px], so switching between a tall calendar and a short upload card does not make the panel jump.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.md the timetable stacks above the panel in source order, so a phone reads the day first and then the selected hour.usecase43
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.
usecase1
Tab-based use case section with images, descriptions, and feature checklists that collapse to accordion on mobile. Perfect for showcasing how different teams or departments use your product.
usecase47
Ruled index of jobs on the left that swaps the panel beside it, where each selection brings its own photograph, explanation and two ruled outcome figures.
usecase14
Segmented control style tabs with split layout showing image, description, and bullet point features. Perfect for comparing solution approaches or product capabilities.