Drifting Services Grid

Ways we work

Nothingchangesallatonce.Everythingchangesalittleatatime.

No two people arrive with the same weight. These are the four shapes our work most often takes, and each one bends to fit you.

Talk through your options
Swimmers in clear green water beside a row of parasols

Individual therapy

Weekly sessions with one steady person, for the things that are hard to say and harder to carry alone.

Read more
A rocky cove with wildflowers above turquoise water

Life coaching

Forward-facing work for a season of change: a move, a new role, an ending, or the sense that something has to shift.

Read more
A long sandy beach with a boat on the horizon

Stress and rest

Practical support for a nervous system that has forgotten how to come down, with tools you can keep after we finish.

Read more
A pine-backed cove crowded with swimmers

A single conversation

One long session to lay everything out and leave with a clearer sense of what, if anything, to do next.

Read more
About this block

Drifting Services GridPRO

A 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.

Feature275: Drifting Services Grid

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.

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

Base UI flavor

bash
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.

Quick start

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.

tsx
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:

tsx
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" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringSmall-caps line above the heading
headingstringSection heading, rendered as an h2 through Text1
descriptionstringIntro in the narrow right column
buttonActionButtonPill action, optionally with a Lucide icon
itemsServiceItem[][]Service cards, four across from lg
labels{ readMore?: string }{}Read link wording; the link is dropped when unset
classNamestringExtra classes for the outer <section>
ts
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;
};

Behavior notes

  • The staggered look comes from one selector, 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.
  • Each photograph owns its own scroll listener, so the four drift at their own moment as they reach the viewport instead of moving in lockstep, -8% to 8% against a 1.18 scale.
  • Photos clear from 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.
  • Only the read link is clickable; the card is not wrapped in one, which keeps the description selectable and gives the title a plain accessible name.
  • The arrow lifts only under motion-safe:, so the hover affordance is dropped for reduced motion while the link keeps working.
  • Cards enter with a 0.12s stagger by index, so the row resolves left to right rather than as one slab.
  • Titles are h3 under the section h2, keeping the outline correct wherever the block sits.

More Feature blocks

View all Feature
PRO

feature277

Six Promises

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.

PRO

feature290

Six Cell Grid

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.

PRO

feature209

Sticky Services

Sticky intro column beside a scrollable stack of numbered service blocks.

PRO

feature294

Six Gains Ruled Grid

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.

PRO

feature162

Numbered Steps Grid

3-column grid of numbered steps with titles and descriptions. Ideal for onboarding flows, process overviews, and how-it-works sections.

FREE

feature3

Service Grid With Icons

Centered header, three-column grid of capability cards, and an optional CTA with bottom text. Each card leads with a Lucide icon.