Individual therapy
Weekly sessions with one steady person, for the things that are hard to say and harder to carry alone.
Read moreWays we work
Weekly sessions with one steady person, for the things that are hard to say and harder to carry alone.
Read moreForward-facing work for a season of change: a move, a new role, an ending, or the sense that something has to shift.
Read morePractical support for a nervous system that has forgotten how to come down, with tools you can keep after we finish.
Read moreOne long session to lay everything out and leave with a clearer sense of what, if anything, to do next.
Read moreA services section with a serif heading that settles in word by word beside its intro and pill button, then four staggered portrait cards whose photographs drift inside their frames as the page scrolls.
Four services in a staggered grid: a wide heading beside the intro and a pill, then portrait photographs that drift inside their frames, each above a serif title, a paragraph and a read link.
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.
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
npx shadcn add "https://ui.beste.co/r/feature275?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/feature275?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/feature275.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports feature275Demo alongside the block: the exact props behind the preview above. Spread it to get a working services grid in one line.
import { Feature275, feature275Demo } from "@/components/beste/block/feature275";
export default function Page() {
return <Feature275 {...feature275Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Feature275 } from "@/components/beste/block/feature275";
export default function Page() {
return (
<Feature275
eyebrow="Ways we work"
heading="Nothing changes all at once. Everything changes a little at a time."
description="No two people arrive with the same weight. These are the four shapes our work most often takes."
button={{ label: "Talk through your options", href: "/contact" }}
items={[
{
title: "Individual therapy",
description: "Weekly sessions with one steady person.",
href: "/services/therapy",
image: { src: "/photos/pines.jpg", alt: "Pine trees standing in soft morning fog" },
},
]}
labels={{ readMore: "Read more" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
description | string | – | Intro in the narrow right column |
button | ActionButton | – | Pill action, optionally with a Lucide icon |
items | ServiceItem[] | [] | Service cards, four across from lg |
labels | { readMore?: string } | {} | Read link wording; the link is dropped when unset |
className | string | – | Extra classes for the outer <section> |
type ServiceItem = {
title: string;
description: string;
href: string;
image: { src: string; alt: string };
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
icon?: LucideIcon;
};lg:[&>*:nth-child(even)]:mt-16, rather than per-card classes, so the offset applies to any number of cards and disappears below lg where it would only look like broken spacing.-8% to 8% against a 1.18 scale.blur(24px) on decode, with a complete check on mount so a cached image is not left blurred waiting for an event that already fired.motion-safe:, so the hover affordance is dropped for reduced motion while the link keeps working.0.12s stagger by index, so the row resolves left to right rather than as one slab.h3 under the section h2, keeping the outline correct wherever the block sits.feature277
A values grid: a serif heading settling in word by word beside the intro and a pill action, then six numbered promises in three columns whose top rules draw themselves in one after another, over a slowly drifting soft light.
feature290
A ruled two-by-three grid of features, each cell with a bare icon, a serif title and a description, arriving row by row under a serif heading that settles in word by word and a sliding-marker pill.
feature209
Sticky intro column beside a scrollable stack of numbered service blocks.
feature294
A header with a serif headline that settles in word by word and, at its right end, a rounded pill that copies the install command on click; below it a ruled two by three grid of thin icons, serif titles and short paragraphs that settle in one after another as they scroll into view.