A feature laid out as a hairline matrix of cells, where a wide first cell carries an image tile floating a live trend metric and the remaining cells hold icon-led capabilities.
A feature laid out as a hairline matrix of cells, where a wide first cell carries an image tile floating a live trend metric and the remaining cells hold icon-led capabilities.
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/feature261?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/feature261?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/feature261.tsx, the stats16 trend piece it floats in the wide cell (installed to components/beste/piece/stats16.tsx), and the badge23 component it uses for the eyebrow.
The installed file exports feature261Demo alongside the block: the exact props behind the preview above. Spread it to get a working matrix in one line.
import { Feature261, feature261Demo } from "@/components/beste/block/feature261";
export default function Page() {
return <Feature261 {...feature261Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Feature261 } from "@/components/beste/block/feature261";
import { Layers, RefreshCw, Users } from "lucide-react";
import { Stats16 } from "@/components/beste/piece/stats16";
export default function Page() {
return (
<Feature261
badge={{ label: "Built to be shared" }}
heading="One workspace the whole practice can be trusted with"
description="Designed for the eleven people who touch a record, not just the one who owns it."
spotlight="Intakes completed since the switch, counted from the records themselves."
media={
<Stats16
label="Intakes completed"
value="1,284"
delta="12.4%"
direction="up"
caption="vs. 1,142 the month before"
bars={[38, 52, 44, 61, 55, 72, 68, 86]}
/>
}
image={{ src: "/backdrops/blue.jpg", alt: "Soft blue gradient backdrop" }}
items={[
{
icon: Users,
title: "Seats, not licences",
description: "Add a locum on Tuesday and remove them on Friday without emailing anyone.",
},
{
icon: RefreshCw,
title: "Changes that propagate",
description: "Move an appointment once and the reminder, room, and invoice follow it.",
},
{
icon: Layers,
title: "Multi-site by default",
description: "Four clinics share one setup and still keep their own schedules.",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the hairline rule, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
spotlight | string | – | Caption under the tile inside the wide cell |
media | ReactNode | – | Live asset in the wide cell, stats16 in the demo |
image | { src: string; alt: string } | – | Backdrop behind the media tile |
items | MatrixCell[] | [] | Icon-led cells filling the rest of the matrix |
className | string | – | Extra classes for the outer section |
import type { LucideIcon } from "lucide-react";
type MatrixCell = {
icon: LucideIcon;
title: string;
description: string;
};
type TileImage = {
src: string;
alt: string;
};gap-px over a bg-border container with bg-card cells makes the background show through as one-pixel seams. Cells never draw their own rules, so the matrix stays perfectly aligned however it reflows.md, so four items fill the first row's remaining column and the second row entirely. A different item count reflows without breaking, but four is the count the layout is tuned for.overflow-hidden, which is what clips the corner cells so the matrix reads as one panel rather than a set of tiles.md the matrix is a single column and the seams become horizontal dividers, so the same markup reads as a stacked list on mobile.lucide-react icon and hand it over; the block renders it at size-5 in a size-10 tinted tile marked aria-hidden, since the title beside it carries the meaning.spotlight sits under the tile inside the wide cell rather than in the header, so it reads as a caption for the figure rather than as section copy.feature241
A capability section with an eyebrow over a hairline rule, a two-column heading, and a responsive grid of icon-led features with tinted chips, titles, and descriptions.
feature257
An interactive feature where a hairline list of four capabilities swaps the image tile beside it, each one floating a different live asset with its own supporting paragraph.
feature242
A feature with an eyebrow over a hairline rule, a two-column heading, and two rich cards that each float a live micro-asset above an eyebrow, title, and checked bullets, closing with a works-with integrations strip.
feature212
Asymmetric bento of capabilities: an image hero cell, accent cell and icon cells.