Wide photograph carrying numbered markers placed by percentage coordinates, paired with a ruled four-column list where the selected entry repeats the marker as a filled seal, darkens its rule and brings its text forward.
An annotated photograph: numbered markers sit on the image at coordinates you supply, and a ruled index underneath explains each one. Selecting either the marker or its entry moves the whole section to that callout.
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/feature247?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/feature247?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/feature247.tsx plus the badge7 eyebrow it uses.
The installed file exports feature247Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Feature247, feature247Demo } from "@/components/beste/block/feature247";
export default function Page() {
return <Feature247 {...feature247Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Feature247 } from "@/components/beste/block/feature247";
export default function Page() {
return (
<Feature247
badge={{ label: "Read the picture" }}
heading="Four decisions you can see from the doorway."
description="Every mark on the photograph is a choice we had to defend."
image={{ src: "/work/lobby.jpg", alt: "Signage across a lobby wall" }}
callouts={[
{
index: "1",
title: "Type at reading height",
description: "Set at 44 millimetres so it lands at eye level for a standing adult.",
x: 22,
y: 32,
},
{
index: "2",
title: "One rule, never two",
description: "A single hairline separates the directory from the wall.",
x: 48,
y: 58,
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading in the left header column |
description | string | – | Supporting paragraph in the right header column |
image | { src: string; alt: string } | – | The photograph the markers are placed on |
callouts | Callout[] | [] | Markers and their explanations, in reading order |
className | string | – | Extra classes for the outer <section> |
type Callout = {
index: string;
title: string;
description: string;
/** Horizontal position of the marker, as a percentage of the image width */
x: number;
/** Vertical position of the marker, as a percentage of the image height */
y: number;
};x and y are percentages of the image box, applied as inline left and top with a -translate-x-1/2 -translate-y-1/2 offset, so a marker stays on the same part of the picture at every screen width.useState(0)), which means the section never opens in a blank state.ring-4 halo, the index entry's seal inverts to bg-foreground text-background, and its top rule darkens from border-border to border-foreground. Colour alone is never the signal.text-muted-foreground/60 rather than hiding it, so the whole list stays readable and scannable.button elements with aria-pressed and, on the markers, an aria-label carrying the callout title, so the state is exposed to assistive technology.aspect-[16/10] on mobile becomes md:aspect-[2/1], which keeps marker coordinates meaningful without letterboxing a phone.md, so a set of four callouts lines up with the markers left to right.feature253
Cinematic image band carrying a pill label in its corner, followed by a ruled four-column row where each measured fact pairs an oversized figure with a sentence of testing context, with the outline pill CTA sitting on the heading line.
feature250
A single tall photograph pinned with position sticky, captioned without a rule, while a column of eyebrow-led notes scrolls past it, each note after the first opening on its own hairline.
feature227
Sticky left intro paired with a stacked, numbered list of feature blocks, each with a title, description, and small image.
feature230
Three tall portrait images in a row, each paired with a padded numeral, title, and description — a monochrome statement of guiding principles.