Segmented Total Breakdown

Where the hours go

Ninety-six clinical hours, split four ways

One week at a four-site group, counted from the rota rather than estimated afterwards. The fourth segment is the one everybody is trying to shrink.

96

clinical hours booked last week

Consultations

40 hrs

42%

First appointments and the longer reviews that follow a referral.

Follow-ups

27 hrs

28%

Repeat visits inside an existing care plan, mostly half-hour slots.

Assessments

18 hrs

19%

Structured assessments that need a room, a clinician, and a full hour.

Admin held in clinical rooms

11 hrs

11%

Time a room was blocked for paperwork. Down from 23 hours before the switch, and still falling.

Percentages are rounded to the nearest whole number, so they do not always total exactly one hundred.

See your own breakdown
About this block

Segmented Total BreakdownFREE

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.

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.

Free block

This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/stats68"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/stats68"

This installs the block to components/beste/block/stats68.tsx plus the badge23 and button21 components it uses for the eyebrow and the action.

Quick start

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

tsx
import { Stats68, stats68Demo } from "@/components/beste/block/stats68";

export default function BreakdownPage() {
  return <Stats68 {...stats68Demo} />;
}

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

tsx
import { Stats68 } from "@/components/beste/block/stats68";

export default function BreakdownPage() {
  return (
    <Stats68
      badge={{ label: "Where the hours go" }}
      heading="Ninety-six clinical hours, split four ways"
      description="One week at a four-site group, counted from the rota."
      totalValue="96"
      totalLabel="clinical hours booked last week"
      segments={[
        {
          label: "Consultations",
          value: "40 hrs",
          percent: 42,
          description: "First appointments and the longer reviews that follow a referral.",
        },
        {
          label: "Admin held in clinical rooms",
          value: "11 hrs",
          percent: 11,
          description: "Time a room was blocked for paperwork. Down from 23 hours.",
        },
      ]}
      footnote="Percentages are rounded to the nearest whole number."
      button={{ label: "See your own breakdown", href: "/reports" }}
    />
  );
}

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
totalValuestringThe headline total, set at display scale
totalLabelstringWhat the total counts
segmentsSegment[][]The split, each with its share of the bar
footnotestringRounding note beside the action
button{ label: string; href: string }Outline action
classNamestringExtra classes for the outer section
ts
type Segment = {
  label: string;
  value: string;
  percent: number;
  description: string;
};

Behavior notes

  • percent is a number and is used directly as an inline width on the bar, so the segments must add up to roughly one hundred yourself. Nothing is normalised, so a set summing to 80 leaves a visible gap and a set summing to 130 overflows.
  • The bar tints come from a fixed four-step table of accent opacities, cycled with index % segmentFills.length. A fifth segment reuses the first tint, so four is the count this block is built for.
  • The same table paints the legend swatch, which is what ties each row to its slice without a separate colour prop.
  • The bar is aria-hidden, since every segment is repeated in the legend with its value and share as text.
  • value and percent are separate columns rather than one derived from the other, so the value can carry its own unit like "40 hrs".
  • Segment rows are a four-track grid from md: label and swatch, value, share, then the description. Below md they stack in that order.
  • footnote is where the rounding caveat goes, which matters because the shares are authored rather than computed.

More Stats blocks

View all Stats
PRO

stats9

Image with Stacked Stats

Split layout with a tall image on the left and vertically stacked stats with descriptions on the right, separated by horizontal borders.

PRO

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.

PRO

stats52

Mortgage Breakdown Stats

Monthly mortgage payment breakdown with visual proportion bars showing principal, interest, taxes, and insurance.

PRO

stats42

Review Distribution Stats

Star rating breakdown with horizontal progress bars for each rating level, overall score, and total review count like Amazon or App Store.

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.

PRO

stats6

Inline Stats Strip

Compact horizontal row of stats separated by vertical dividers. Minimal design ideal for use between other sections.