In the room
An hour that belongs to you
Sixty or seventy-five minutes in a room chosen for its quiet. No clock on the wall, no next appointment pressing at the door, and a kettle for afterwards.
More about thisIn the room
Sixty or seventy-five minutes in a room chosen for its quiet. No clock on the wall, no next appointment pressing at the door, and a kettle for afterwards.
More about thisOnline
A private link, no software, no waiting room. Half our sessions happen on video now, with the same practitioner and the same rhythm as the room.
More about thisOn foot
Some things are easier to say side by side than face to face. Walking sessions run every Friday, rain permitting, and end with soup.
More about thisThe classic zigzag: under a serif heading that settles in word by word and a pill action, rows alternate a photograph drifting inside its frame with an eyebrow, a serif title, a description and an arrow link, switching sides on every row.
Alternating rows: each one pairs a photograph that drifts inside its frame with a small-caps eyebrow, a serif title, a paragraph and a read link, swapping sides down the section.
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/feature282?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/feature282?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/feature282.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports feature282Demo alongside the block: the exact props behind the preview above. Spread it to get a working alternating feature rows in one line.
import { Feature282, feature282Demo } from "@/components/beste/block/feature282";
export default function Page() {
return <Feature282 {...feature282Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Feature282 } from "@/components/beste/block/feature282";
export default function Page() {
return (
<Feature282
eyebrow="The work, up close"
heading="Three kinds of session, one way of listening."
button={{ label: "Compare them side by side", href: "/compare", tone: "outline" }}
rows={[
{
eyebrow: "In the room",
title: "An hour that belongs to you",
description: "Sixty or seventy-five minutes in a room chosen for its quiet.",
href: "/in-the-room",
image: { src: "/rooms/bench.jpg", alt: "A sunlit room with a low timber bench" },
},
]}
labels={{ more: "More about this" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the section heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
button | ActionButton | – | Pill action beside the heading |
rows | Row[] | [] | Feature rows, alternating sides down the section |
labels | { more?: string } | {} | Read link wording; the link is dropped when unset |
className | string | – | Extra classes for the outer <section> |
type Row = {
eyebrow: string;
title: string;
description: string;
href: string;
image: { src: string; alt: string };
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};md:col-start values on index % 2 while both cells stay in md:row-start-1, so the visual order flips without the DOM order changing. The image always comes first in the markup, which is what keeps the reading order sane for a screen reader on every row.md the column starts drop away entirely and every row stacks image-then-copy, so the alternation never turns into an inconsistent mobile order.-10% to 10% against a 1.2 scale, so rows do not move in lockstep down the page.eyebrow separate from the section's, so the rows can be labelled (In the room, Online, On foot) without repeating the section title.motion-safe:, so the hover affordance is dropped for reduced motion while the link keeps working.gap-20 that grows to gap-28, not with rules, so the section reads as a sequence of scenes rather than a table.h3 under the section h2, and only the read link is clickable, which keeps the paragraphs selectable.feature220
Centered header above three zigzag rows, each pairing a 4:3 image with a title, description, and tag chips on alternating sides.
feature197
Zig-zag layout where each feature alternates an image with a content block — a colored icon badge, bold title, and description. Configurable icon badge accent color (emerald, primary, foreground, rose, blue, amber, violet, sky, orange, teal). Ideal for product modules, services, or capabilities.
feature248
Feature rows that alternate the image side on every second entry, each pairing an eyebrow, display title and explanation with one oversized outcome figure on its own rule, headed by an outline pill CTA pinned to the top right.