Inverted Live Counters

Right now

The platform, as it stands this morning

Read from the live database rather than typed into a slide once a quarter. If a number here looks wrong, it is wrong and we would like to know.

Updated every hour, last at 09:15 UK

118

practices live

Running real clinics today, not counting trials or dry runs.

341

clinical rooms

Across the UK and Ireland, the smallest being a single room in Norwich.

18,412

appointments this month

Booked, moved, or attended since the first of the month.

99.97%

availability this quarter

Against a 99.95% commitment, credited automatically when missed.

Appointments this month

18,4129.1%

against the same point last month

One bar per week. The dip in week three was half term, which happens every year and still surprises us.

See the status page
About this block

Inverted Live CountersPRO

A live platform panel on one dark surface, with four light figures on a hairline rule and a floating trend card reading the month week by week.

Stats74: Inverted Live Counters

A live platform panel on one dark surface, with four light figures on a hairline rule and a floating trend card reading the month week by week.

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

Base UI flavor

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

This installs the block to components/beste/block/stats74.tsx, the stats16 trend piece it floats on the panel (installed to components/beste/piece/stats16.tsx), and the badge23 and button21 components it uses for the eyebrow and the action.

Quick start

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

tsx
import { Stats74, stats74Demo } from "@/components/beste/block/stats74";

export default function LivePage() {
  return <Stats74 {...stats74Demo} />;
}

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

tsx
import { Stats16 } from "@/components/beste/piece/stats16";
import { Stats74 } from "@/components/beste/block/stats74";

export default function LivePage() {
  return (
    <Stats74
      badge={{ label: "Right now" }}
      heading="The platform, as it stands this morning"
      description="Read from the live database rather than typed into a slide once a quarter."
      updatedLabel="Updated every hour, last at 09:15 UK"
      counters={[
        {
          value: "118",
          label: "practices live",
          detail: "Running real clinics today, not counting trials.",
        },
        {
          value: "99.97%",
          label: "availability this quarter",
          detail: "Against a 99.95% commitment, credited automatically when missed.",
        },
      ]}
      media={
        <Stats16
          label="Appointments this month"
          value="18,412"
          delta="9.1%"
          direction="up"
          caption="against the same point last month"
          bars={[42, 51, 47, 63, 58, 71, 76, 88]}
        />
      }
      mediaCaption="One bar per week. The dip in week three was half term."
      button={{ label: "See the status page", href: "/status" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }–Eyebrow at the top of the panel, retoned for the dark surface
headingstring–Section heading on the panel
descriptionstring–Supporting paragraph, right-aligned from md up
updatedLabelstring–When the figures were last read
countersCounter[][]Live figures, four across from lg
mediaReactNode–Live asset on the panel, stats16 in the demo
mediaCaptionstring–Caption beside the trend card
button{ label: string; href: string }–Outline action, retoned for the dark surface
classNamestring–Extra classes for the outer section
ts
type ActionLink = {
  label: string;
  href: string;
};

type Counter = {
  value: string;
  label: string;
  detail: string;
};

Behavior notes

  • Nothing here updates on its own. Every figure is a string passed in, which keeps the block safe to server-render and cache. updatedLabel is how you tell the reader when the numbers were actually read, and it needs to come from your own data.
  • The whole panel is bg-foreground, so every text token inside is a fixed background value and hairlines use border-background/20 rather than border-border.
  • The trend card sits directly on the dark panel with no tile or backdrop, which is why it keeps its own surface.
  • The action carries an inline border-background/30 text-background hover:bg-background/10 override on top of tone="outline", since the standard outline is invisible on an inverted surface.
  • detail is required on every counter, so a live number is never published without a sentence saying exactly what it counts. The demo's first counter uses it to exclude trials, which is the kind of qualifier these panels usually omit.
  • Counters use tabular-nums, so a row mixing "118" and "18,412" still aligns.
  • The counters grid reflows one, two, then four across, so a four-item row never leaves an orphan at tablet width.

More Stats blocks

View all Stats
PRO

stats38

Server Monitoring Stats

PRO

stats80

Figure Stages in an Alternating Mosaic

PRO

stats1

Right-Aligned Stats Cards

Get Pro access