Photo Band Feature

A quiet pebble beach with a wooded headland

Online sessions

Theroomcomestoyou.Thequietcomeswithit.

Same practitioner, same hour

Online sessions are not a second tier. You keep the person and the rhythm you started with.

A link, nothing to install

One private link that works in any browser. No accounts, no software, no waiting room.

Recorded nowhere

Video is never stored, by us or by the tools we use. When the call ends, it is gone.

About this block

Photo Band FeaturePRO

A feature that opens on a rounded photographic band with a dark scrim and film grain, the photograph drifting as the page scrolls under a serif heading that settles in word by word and a light sliding-marker pill, then three ruled points beneath it.

Feature279: Photo Band Feature

A tall photographic panel with the heading and a pale pill sitting at its foot, then three ruled points printed underneath on the page itself.

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

Base UI flavor

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

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

Quick start

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

tsx
import { Feature279, feature279Demo } from "@/components/beste/block/feature279";

export default function Page() {
  return <Feature279 {...feature279Demo} />;
}

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

tsx
import { Feature279 } from "@/components/beste/block/feature279";

export default function Page() {
  return (
    <Feature279
      eyebrow="Online sessions"
      heading="The room comes to you. The quiet comes with it."
      button={{ label: "Book an online session", href: "/online", tone: "light" }}
      image={{ src: "/photos/valley.jpg", alt: "A wide green valley under soft evening light" }}
      points={[
        { title: "Same practitioner, same hour", description: "Online sessions are not a second tier." },
        { title: "A link, nothing to install", description: "One private link that works in any browser." },
        { title: "Recorded nowhere", description: "Video is never stored, by us or by the tools we use." },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small-caps line above the heading, inside the panel
headingstring–Section heading, rendered as an h2 through Text1
buttonActionButton–Pill at the foot of the panel, defaulting to the light tone
image{ src: string; alt: string }–Photograph behind the panel
pointsPoint[][]Ruled points printed under the panel
classNamestring–Extra classes for the outer <section>
ts
type Point = {
  title: string;
  description: string;
};

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

Behavior notes

  • The panel keeps its ink background whether or not an image is given, so dropping image leaves a solid dark card with grain over it rather than an empty frame.
  • The gradient is weighted to the foot (from-foreground/85 up to foreground/10), because that is where the copy sits; the top of the photograph stays almost untouched.
  • The panel grows by min-h rather than an aspect ratio, 28rem on a phone and 36rem from md, so a long heading pushes it taller instead of being cropped.
  • The heading takes an explicit delay={0.3} so it follows the eyebrow rather than arriving with it, and the button waits until 0.5.
  • The photograph drifts -14% to 14% against a 1.3 scale, and clears from blur(24px) on decode with a complete check on mount for cached files.
  • The points sit outside the panel on the page surface, each with its own border-t and a small dot, so they read as footnotes to the panel rather than as part of it.
  • The grain filter's id comes from useId, so two grain surfaces on one page cannot collide on a global SVG id.

More Feature blocks

View all Feature
PRO

feature297

Photo Band Command

PRO

feature272

Recorded Companion Band

PRO

feature237

Product Accordion Feature

Get Pro access