Band and Figures

The practice in numbers

Small,andmeasuredbytherightthings.

A rocky cove with wildflowers above turquoise water

We do not count sessions sold. We count the people who came back, the ones who ended well, and the ones who sent a friend.

Read the yearly letter
0%
Ended on purpose, not by drifting away
0%
Arrived because a friend sent them
0
Months, the average stay
0
Sessions cut short for the next appointment
About this block

Band and FiguresPRO

An about section built around a wide photograph that drifts inside its frame: a serif heading that settles in word by word above it, then an intro with a sliding-marker pill beside four ruled serif figures that count up as they arrive.

About82: Band and Figures

A wide photographic band under the heading, then a set of figures that count up as they arrive, each on its own rule, beside a short paragraph explaining what the practice counts and what it refuses to.

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

Base UI flavor

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

This installs the block to components/beste/block/about82.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.

Quick start

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

tsx
import { About82, about82Demo } from "@/components/beste/block/about82";

export default function Page() {
  return <About82 {...about82Demo} />;
}

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

tsx
import { About82 } from "@/components/beste/block/about82";

export default function Page() {
  return (
    <About82
      eyebrow="The practice in numbers"
      heading="Small, and measured by the right things."
      image={{ src: "/photos/field.jpg", alt: "Tall grass in a sunlit field" }}
      description="We do not count sessions sold. We count the people who came back."
      button={{ label: "Read the yearly letter", href: "/letter", tone: "outline" }}
      figures={[
        { value: 82, suffix: "%", label: "Ended on purpose, not by drifting away" },
        { value: 41, suffix: "%", label: "Arrived because a friend sent them" },
        { value: 19, label: "Months, the average stay" },
        { value: 0, label: "Sessions cut short for the next appointment" },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringSmall-caps line above the heading
headingstringSection heading, rendered as an h2 through Text1
image{ src: string; alt: string }Wide band between the heading and the figures
descriptionstringShort paragraph in the narrow left column
buttonActionButtonPill action under the paragraph
figuresFigure[][]Counting figures, two across from sm
classNamestringExtra classes for the outer <section>
ts
type Figure = {
  value: number;
  suffix?: string;
  label: string;
};

type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

Behavior notes

  • The band is a 21/9 frame with the photograph scaled to 1.3 and drifting -14% to 14%, the widest travel in the set. A letterbox crop can carry that much movement without ever showing an edge, which a portrait frame cannot.
  • Each figure counts from zero when it personally reaches the viewport, and useInView is set to once, so scrolling back up does not restart it.
  • The count is rounded every frame and printed in tabular-nums, so nothing shifts sideways while the number climbs. Unlike the sibling figure blocks, this one prints the raw number with no thousands grouping, which suits percentages and small counts.
  • A value of 0 is honest here: it animates from zero to zero and simply reads 0, so a deliberate "none" is not mistaken for a figure that failed to load.
  • Figures are dd before dt inside a dl, so the number is the value and the sentence under it is the term describing it.
  • Each figure carries its own border-t, so the rules come from the items themselves and a two-column grid produces an even ruled field at any count.
  • Every part is optional: without image the figures follow straight after the heading, and without figures the section is a heading, a paragraph and an action.

More About blocks

View all About
PRO

about75

Practitioner Portraits

A team section: a serif heading that settles in word by word beside the intro and a pill action, then three portrait photographs that drift inside their frames as the page scrolls, each with a serif name, a small-caps role and a short bio.

PRO

about33

About With Stats Band

About section with an eyebrow label and read-more action on the left, a bold heading with two side-by-side images on the right, and a four-column stats band below.

PRO

about80

Story Split

The classic about split: a serif heading that settles in word by word, two paragraphs, a sliding-marker pill and three ruled figures that count up on the left, and a portrait photograph drifting inside its frame on the right.

PRO

about38

Overlap Heading About

About where a large heading overlaps a portrait, with a paragraph, CTA and a bottom stat ribbon.

PRO

about81

Three Values

A values section: a serif heading that settles in word by word beside the intro and a pill action, then three soft muted cards with a round icon, a serif title and a description that rise into view in turn.

PRO

about34

About Stats Grid

About section: eyebrow label, two-tone heading, two portraits beside a 2x2 stats grid.