Before And After Pairs

Before and after

The same practice, measured twice

Every pair below comes from one group of four clinics, counted the month before they moved and the month after they settled.

Time to first booking

Referral arriving to a confirmed appointment in the member's hand.

Before

9 days

After

4 hours

Referral arriving to a confirmed appointment in the member's hand.

Unfilled cancellations per week

Slots that went unused because nobody had time to ring round.

Before

14

After

1

Slots that went unused because nobody had time to ring round.

Month-end close

From the last clinic of the month to a reconciled set of numbers.

Before

2 days

After

3 hours

From the last clinic of the month to a reconciled set of numbers.

Systems in daily use

Counted by what reception actually had open at eleven in the morning.

Before

4

After

1

Counted by what reception actually had open at eleven in the morning.

Soft blue gradient backdrop

Time to first booking

Before

9 days

across three systems

After

4 hours

on one workspace

Median across eleven practices that switched last quarter.

Counted from the practice's own records, not from a survey. The written method is available on request and we will hand it over before you ask twice.

About this block

Before And After PairsPRO

A results section stacking each measure on its own hairline row, moving a muted starting figure to an accented result across an arrow, with a soft closing panel that floats a live comparison card.

Stats67: Before And After Pairs

A results section stacking each measure on its own hairline row, moving a muted starting figure to an accented result across an arrow, with a soft closing panel that floats a live comparison card.

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

Base UI flavor

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

This installs the block to components/beste/block/stats67.tsx, the stats17 comparison piece it floats on the tile (installed to components/beste/piece/stats17.tsx), and the badge23 component it uses for the eyebrow.

Quick start

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

tsx
import { Stats67, stats67Demo } from "@/components/beste/block/stats67";

export default function ResultsPage() {
  return <Stats67 {...stats67Demo} />;
}

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

tsx
import { Stats17 } from "@/components/beste/piece/stats17";
import { Stats67 } from "@/components/beste/block/stats67";

export default function ResultsPage() {
  return (
    <Stats67
      badge={{ label: "Before and after" }}
      heading="The same practice, measured twice"
      description="Counted the month before they moved and the month after they settled."
      beforeLabel="Before"
      afterLabel="After"
      pairs={[
        {
          measure: "Time to first booking",
          before: "9 days",
          after: "4 hours",
          note: "Referral arriving to a confirmed appointment in the member's hand.",
        },
        {
          measure: "Unfilled cancellations per week",
          before: "14",
          after: "1",
          note: "Slots that went unused because nobody had time to ring round.",
        },
      ]}
      media={
        <Stats17
          title="Time to first booking"
          before={{ label: "Before", value: "9 days", caption: "across three systems" }}
          after={{ label: "After", value: "4 hours", caption: "on one workspace" }}
          footnote="Median across eleven practices."
        />
      }
      image={{ src: "/backdrops/blue.jpg", alt: "Soft blue gradient backdrop" }}
      method="Counted from the practice's own records, not from a survey."
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow above the hairline rule, rendered through Badge23
headingstringSection heading in the left column of the header
descriptionstringSupporting paragraph, right-aligned from md up
beforeLabelstringLabel above every starting figure
afterLabelstringLabel above every result figure
pairsPair[][]The measures, one per hairline row
mediaReactNodeLive asset in the closing panel, stats17 in the demo
image{ src: string; alt: string }Backdrop behind the media tile
methodstringHow the figures were counted
classNamestringExtra classes for the outer section
ts
type Pair = {
  measure: string;
  before: string;
  after: string;
  note: string;
};

type TileImage = {
  src: string;
  alt: string;
};

Behavior notes

  • note is rendered twice with opposite visibility: once under the measure with lg:hidden, and once in the third column with hidden lg:block. That is how the row reads as a sentence on mobile and as a table on desktop without duplicating in the output.
  • The direction of improvement is shown by muting the before figure and leaving the after in full contrast, plus the accent on afterLabel. Nothing is coloured green or red, since a lower number is better in half these rows.
  • Figures use tabular-nums, so a column mixing "9 days" and "14" still aligns.
  • The arrow is aria-hidden, and the before and after labels carry the meaning in text.
  • method is a required part of the design rather than decoration: the closing panel exists so a results section is never published without saying how it was counted.
  • The closing panel is bg-muted with a bg-background tile inside it, inverting the usual relationship so the tile reads as raised.
  • Rows carry border-t with no closing rule, so the list flows into the closing panel.

More Stats blocks

View all Stats
FREE

stats66

Outcome Metric Rows

A results section that stacks each metric on its own hairline row, pairing an oversized figure with a short label, a sentence of context, and an optional year-over-year delta.

FREE

stats68

Segmented Total Breakdown

A results section that leads on one oversized total, splits it across a segmented accent bar, then legends each segment on a hairline row aligning its value, share, and what it covers.

PRO

stats70

Annual Report Readings

An annual results section pairing an image tile that floats a live breakdown chart with a light interpretation of it, then four hairline readings that each name their own source, closing on a method panel.

PRO

stats73

Benchmark Comparison Bars

A benchmarking section that pairs an accent bar for the platform median against a muted bar for the sector median on every metric, with a legend above and a sourcing note below.

PRO

stats71

Single Headline Figure

A results section that commits to one enormous light figure, reads it back as a statement under a hairline, qualifies it with three smaller footnotes, and closes on a captioned full-bleed photograph.

PRO

stats1

Right-Aligned Stats Cards

Right-aligned layout with heading, description, and a 2x2 grid of stat cards. Perfect for showcasing key metrics alongside content.