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.
An issue contents page laid out as a mosaic. The cover story takes a large photographic tile with its category on top and its page count on a rule, an inverted figure states the extent, a bordered tile explains the subscription, and the remaining articles sit in soft tiles beside them.
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/bento9?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/bento9?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/bento9.tsx plus the badge7 eyebrow it uses.
The installed file exports bento9Demo alongside the block: the exact props behind the preview above. Spread it to get a working bento in one line.
import { Bento9, bento9Demo } from "@/components/beste/block/bento9";
export default function Page() {
return <Bento9 {...bento9Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Bento9 } from "@/components/beste/block/bento9";
export default function Page() {
return (
<Bento9
badge={{ label: "This issue" }}
heading="One cover story and everything printed beside it."
cover={{
src: "/issue/cover.jpg",
alt: "Printed letterforms as a type specimen",
category: "Cover story",
title: "The alphabet that took nine months and one apology",
meta: "Issue 12 · 22 pages",
href: "/issue/12/alphabet",
}}
stories={[
{ category: "Interface", title: "Reading is not a feature", meta: "8 pages", href: "/issue/12/reading" },
{ category: "Materials", title: "Cloth, board and the cost of both", meta: "6 pages", href: "/issue/12/cloth" },
]}
figure={{ value: "200", title: "Pages, no advertising" }}
subscribe={{
title: "Printed twice a year",
description: "Posted to anyone who has worked with the studio.",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading above the mosaic |
cover | CoverStory | – | Large photographic tile linking to the lead article |
stories | SideStory[] | [] | Text tiles for the rest of the issue, each one a link |
figure | FigureTile | – | Inverted dark tile holding one number |
subscribe | SubscribeTile | – | Bordered tile describing how the issue is distributed |
className | string | – | Extra classes for the outer <section> |
type CoverStory = {
src: string;
alt: string;
category: string;
title: string;
meta: string;
href: string;
};
type SideStory = {
category: string;
title: string;
meta: string;
href: string;
};
type FigureTile = {
value: string;
title: string;
};
type SubscribeTile = {
title: string;
description: string;
};md:col-span-4 md:row-span-2 and uses justify-between, so its category badge stays pinned to the top of the picture while the title and page count sit at the foot.Badge7 is passed className="text-background/70", which is how the eyebrow reads on a photograph instead of resolving to the page's foreground token.Link, so the photograph, title and meta are one target rather than a small link under an image.justify-between gap-4 with the meta line on a border-t border-current/10 rule, so titles of different lengths still line their page counts up along the bottom of the row.text-background tokens are hardcoded because that surface is fixed rather than adaptive.bento4
Service mosaic whose lead tile floats a photo-strip media piece over a dotted field between its eyebrow and statement, beside a photographic tile captioned on its scrim, an inverted figure tile and three soft icon tiles.
bento3
Work mosaic on a six-column track mixing photographic tiles that carry their caption inside on a gradient scrim with a soft statement tile and an inverted figure tile, the lead project spanning four columns and two rows.
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.
bento5
Process mosaic where the opening phase fills a two-row photographic tile with its eyebrow, explanation and duration on the scrim, beside an inverted summary tile and three smaller phase tiles carrying only their label and length.