Story Split

About the practice

Smallonpurpose,since2019.

Altair began as two rooms above a bakery and one conviction: that most people already know what they need, and lack only the time, the quiet and the company to hear it.

Seven years later there are three practitioners, one address, an evening practice and a Friday walk. There is still no slogan, and nobody is rushed.

Meet the three of us
0
Practitioners
0
Founded
0+
People this year
Swimmers in clear green water beside a row of parasols
About this block

Story SplitPRO

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.

About80: Story Split

A story split down the middle: heading, two paragraphs and a pill action on one side above a ruled row of figures that count up when they reach the viewport, a portrait photograph drifting inside its frame on the other.

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

Base UI flavor

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

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

Quick start

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

tsx
import { About80, about80Demo } from "@/components/beste/block/about80";

export default function Page() {
  return <About80 {...about80Demo} />;
}

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

tsx
import { About80 } from "@/components/beste/block/about80";

export default function Page() {
  return (
    <About80
      eyebrow="About the practice"
      heading="Small on purpose, since 2019."
      paragraphs={[
        "We began as two rooms above a bakery and one conviction about what people already know.",
        "Seven years later there are three practitioners, one address and nobody in a hurry.",
      ]}
      button={{ label: "Meet the three of us", href: "/team", tone: "dark" }}
      image={{ src: "/rooms/table.jpg", alt: "A calm room with a long stone table and linen chairs" }}
      figures={[
        { value: 3, label: "Practitioners" },
        { value: 2019, label: "Founded" },
        { value: 140, suffix: "+", label: "People this year" },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringSmall-caps line above the heading
headingstringSection heading, rendered as an h2 through Text1
paragraphsstring[][]Body copy, one <p> per entry
buttonActionButtonPill action under the paragraphs
image{ src: string; alt: string }Photograph in the right column
figuresFigure[][]Counting figures in the ruled row, always three across
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

  • Each figure counts independently: the count starts when that figure enters the viewport, not when the section does, so a number is never already finished by the time it is read.
  • Thousands grouping is switched on only above 2100, which is what keeps a founding year rendering as 2019 rather than 2,019 while a real count of 2,400 still gets its separator.
  • Values are rounded on every frame and set in tabular-nums, so the figures do not jitter in width while they climb.
  • The count is only ever run forward from zero once. useInView is set to once, so scrolling back up does not replay it.
  • The row is a dl with the dd before its dt, which is deliberate: the figure is the value and the label describes it, and the pairing survives being read out of order by a screen reader.
  • The two columns are vertically centred, so a short paragraph column stays optically level with a tall photograph instead of riding at its top edge.
  • The grid is fixed at grid-cols-3, so three figures is the intended count; a fourth wraps to a new row rather than compressing the first three.

More About blocks

View all About
PRO

about63

Studio Story Split

Image-led about split with a tall portrait, an offset statement heading, supporting copy, mono studio facts, and a seal CTA.

PRO

about5

Image & Text Split

Side-by-side layout with a tall image on the left and company story, inline stats, and CTAs on the right.

PRO

about82

Band and Figures

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.

PRO

about47

Split Panel About

A hard light/dark split about panel: dark statement side and a light image-and-facts side.

PRO

about66

About with Stats Grid

Two-column about with a tall image on one side and an eyebrow, heading, description, and 2x2 stats grid on the other.

PRO

about21

Checklist & Image Split

Two-column layout with checklist highlights on the left, featured image and testimonial quote on the right, plus a full-width stats row.