Location mosaic mixing photographic tiles captioned on their own scrim with an inverted address tile carrying a directions link, a soft opening-hours tile and a full-width bordered visit row whose pill CTA sits opposite the copy.
A contact section built from the place itself. Photographs of the building caption themselves on their own scrims, an inverted tile carries the address and directions link, a ruled tile lists opening hours, and a full-width bordered tile closes with the CTA.
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/bento10?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/bento10?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/bento10.tsx plus the badge7 eyebrow and button12 pill button it uses.
The installed file exports bento10Demo alongside the block: the exact props behind the preview above. Spread it to get a working bento in one line.
import { Bento10, bento10Demo } from "@/components/beste/block/bento10";
export default function Page() {
return <Bento10 {...bento10Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Bento10 } from "@/components/beste/block/bento10";
export default function Page() {
return (
<Bento10
badge={{ label: "Come and see" }}
heading="The studio is a real place with a real doorbell."
labels={{ hoursTitle: "Open to visitors" }}
images={[
{ src: "/studio/front.jpg", alt: "Studio facade", caption: "The front, second floor up" },
{ src: "/studio/table.jpg", alt: "Shared worktable", caption: "The table everything happens on" },
]}
address={{
title: "Auralis Studio",
lines: ["Scheepmakerskade 34", "3011 VX Rotterdam", "Netherlands"],
linkLabel: "Get directions",
href: "https://maps.example.com/auralis",
}}
hours={[
{ title: "Monday to Thursday", value: "10:00 to 18:00" },
{ title: "Friday", value: "10:00 to 15:00" },
]}
visit={{
title: "Coffee is decent, the lift is slow",
description: "Someone is always at the long table.",
buttonLabel: "Arrange a visit",
href: "/contact",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading above the mosaic |
images | StudioImage[] | [] | Photographic tiles; the first one takes the tall lead tile |
address | AddressTile | – | Inverted tile with the postal address and a directions link |
hours | OpeningHour[] | [] | Ruled opening-hours list |
visit | VisitTile | – | Full-width bordered tile holding the Button12 CTA |
labels | Bento10Labels | {} | Fixed strings that are not content: the hours tile's eyebrow |
className | string | – | Extra classes for the outer <section> |
type StudioImage = {
src: string;
alt: string;
caption: string;
};
type AddressTile = {
title: string;
lines: string[];
linkLabel: string;
href: string;
};
type OpeningHour = {
title: string;
value: string;
};
type VisitTile = {
title: string;
description: string;
buttonLabel: string;
href: string;
};
type Bento10Labels = {
hoursTitle?: string;
};md:col-span-3 each, with the photograph also taking md:row-span-2 so the hours tile slots in beneath the address.string[], so a three-line Dutch address and a five-line American one both render without changing the block.dl with rows separated by border-t border-current/10; the row is flex-wrap with items-baseline, so a long day label and its time stay aligned and wrap cleanly instead of colliding.text-background tokens are hardcoded because that surface is fixed rather than adaptive.shrink-0, so on a narrow screen the button drops under the text at full size instead of being squeezed.aspect-[4/3] below md and switch to md:aspect-auto, letting md:auto-rows-[minmax(13rem,auto)] decide their height on desktop.bento2
Studio mosaic whose lead tile floats a mood-board media piece over a dotted field between its own eyebrow and statement, beside a photographic tile captioned on its scrim, an inverted figure tile, a soft quote tile and a bordered CTA tile.
bento6
Product mosaic pairing a two-row hero photograph captioned on its scrim with a tall specification tile, then two square macro tiles that carry their caption inside and an inverted figure tile closing the row.
bento7
Team mosaic where portraits carry their name and role inside the tile on a scrim, interleaved with an inverted quote tile and a wide soft tenure figure tile that closes the grid flush.
bento9
Magazine mosaic whose cover story fills a two-row photographic tile with its category and page count on the scrim, beside an inverted figure tile, a bordered publication note and three soft article tiles.