Plain bento: a heading above four cards in a three-column grid, two of them wide, each with a large figure, a title and a line of copy. Theme tokens only, light and dark.
import { cn } from "cn"
import { Heading } from "@/components/editorial/heading"
import {
Section,
SectionContent,
SectionDescription,
SectionHeader,
SectionTitleGroup,
} from "@/components/editorial/section"
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/card"
// The copy: change text here, not in the markup.
const COPY = {
title: "Built for the whole release",
body: "From the first plan to the final handoff, every step stays in one workspace.",
} as const
// span widens a tile from 64rem, when the grid is three across.
const TILES = [
{
value: "3,400+",
title: "Teams planning releases",
body: "Product, design and engineering share one plan, with owners and dates on every line.",
span: "@5xl/section:col-span-2",
},
{
value: "10 min",
title: "Monday meetings",
body: "The weekly digest covers what shipped and what slipped.",
span: "",
},
{
value: "1 link",
title: "Per handoff",
body: "Specs, decisions and files travel together.",
span: "",
},
{
value: "0",
title: "Threads left open",
body: "Review comments close themselves when the change they are about ships, so nothing sits open for weeks.",
span: "@5xl/section:col-span-2",
},
] as const
export default function MinimalBento01() {
return (
<Section>
<SectionHeader>
<SectionTitleGroup>
<Heading>{COPY.title}</Heading>
</SectionTitleGroup>
<SectionDescription>{COPY.body}</SectionDescription>
</SectionHeader>
<SectionContent>
<ul
role="list"
className="grid grid-cols-1 gap-4 @2xl/section:grid-cols-2 @5xl/section:grid-cols-3"
>
{TILES.map((tile) => (
<li key={tile.title} className={cn("flex", tile.span)}>
<Card className="w-full">
<CardHeader>
<p className="font-display text-4xl/none tracking-tight">
{tile.value}
</p>
</CardHeader>
<CardContent className="mt-auto grid gap-1">
<CardTitle role="heading" aria-level={3}>
{tile.title}
</CardTitle>
<CardDescription>{tile.body}</CardDescription>
</CardContent>
</Card>
</li>
))}
</ul>
</SectionContent>
</Section>
)
}
pnpm dlx shadcn add @01orbital/minimal-bento-01npx shadcn add @01orbital/minimal-bento-01yarn shadcn add @01orbital/minimal-bento-01bunx --bun shadcn add @01orbital/minimal-bento-01Free under the MIT license. Add the @01orbital registry to components.json once (install guide), then run the command.
It lands at components/blocks/bento/minimal-bento-01/index.tsx, as source you own and edit.
import MinimalBento01 from "@/components/blocks/bento/minimal-bento-01"
export default function Example() {
return <MinimalBento01 />
}npm: cn. The CLI installs them for you.
Registry pieces it installs with it:
Linked Icon Card Bento
Centred Instrument Serif headline over a three-column grid of five linked feature cards with Phosphor icons that turn to arrows on hover, beside an Orbcore card painted with a graphite Contour Field.
Porthole Window Bento
Row of four unequal glass windows with porthole ends onto one slowly panning Orbital Limb scene. The wide window holds a caption and an altitude label in the dark sky above the horizon.