A free bento grid feature section with staggered reveals and hover lift.
Relay platform
Ship it, watch it, and put it back if you have to
One platform for the unglamorous half of shipping: builds that finish, previews a reviewer can open, and traces that point at the commit responsible.
Deploys
Push to production in under a minute
Every commit builds, runs your checks and ships to the edge on its own. Roll back to any earlier release in one click, with no redeploy.
12,480 releases shipped this way last week
Production deploymain
58spush to live
4b81ce0Ship the checkout rewrite
Build
24s
Tests
20s
Release
14s
Live in 27 edge regions, previous release kept warm
Previews
A URL for every branch
Each pull request gets an isolated environment, seeded with production-shaped data and torn down on merge.
feat/pricing-v2Ready
pricing-v2.relay.dev
chore/copy-sweepReady
copy-sweep.relay.dev
fix/webhook-retryBuilding
webhook-retry.relay.dev
feat/saved-cartsReady
saved-carts.relay.dev
Observability
See every request end to end
Traces, logs and metrics arrive linked to the deploy that produced them, so a slow span leads straight to the line of code behind it.
Latencyp95
184msdown 38%
GET /api/cart, last hour
Traces today
4.2M
Error rate
0.02%
Scale
Zero-config autoscaling
Instances follow concurrent load and settle back to zero when traffic fades, so idle services never bill you.
0 to 4,200 rps in 90s
Security
Secrets that rotate themselves
Credentials are encrypted at rest, injected at runtime and rotated on the schedule you set once.
Rotated every 30 days
Collaboration
Review together, ship together
Leave comments directly on a preview deployment and resolve them from the pull request, so design and engineering sign off in one place.
IMTAPR
Ines, Tobi and Priya cleared 6 comments on pricing-v2 before standup
Bento Grid is a free bento grid React component for Next.js feature sections, built with Motion and styled with Tailwind. It lays your cells out on a responsive CSS grid, one column on mobile, two at md and three at lg, and reveals them with a staggered rise the first time the grid scrolls into view.
You bring the cells as ordinary children; the grid wraps each one in a plain container that handles the entrance and a 4px hover lift on fine pointers. A cell can claim two columns with data-span from md, or two rows with data-span-row from lg, and both collapse cleanly to a single column on mobile. The server HTML carries no hidden styles, so crawlers, no-JS visitors and reduced-motion users always see the complete grid immediately.
Install
Add the @te registry to your components.json once:
import { BentoGrid } from "@/components/feat-bento-grid";
export default function Page() {
return (
<BentoGrid>
<article data-span="2" className="rounded-xl border border-border p-6">
<h3>Push to production in under a minute</h3>
<p>Every commit builds, ships to the edge and can be rolled back.</p>
</article>
<article className="rounded-xl border border-border p-6">
<h3>A URL for every branch</h3>
<p>Each pull request gets its own isolated preview environment.</p>
</article>
<article data-span-row="2" className="rounded-xl border border-border p-6">
<h3>See every request end to end</h3>
<p>Traces, logs and metrics linked to the deploy that produced them.</p>
</article>
</BentoGrid>
);
}
Props
Prop
Type
Default
Description
children
ReactNode
required
Grid cells. A cell may set data-span="2" (two columns) or data-span-row="2" (two rows).
className
string
undefined
Additional classes merged onto the grid root.
Customisation
Bento Grid declares no tokens of its own; it is a layout frame that consumes the global semantic tokens through the Tailwind utilities on its root, and your cell markup owns the card styling. Override the grid from the className prop, for example to change the gap or the column count at a breakpoint, and retheme the cells through the same semantic tokens the rest of the library uses:
<BentoGrid className="gap-6 lg:grid-cols-4">
{cells}
</BentoGrid>
/* cells styled with semantic tokens */
:root {
--border: oklch(from var(--color-neutral-50) l c h / 0.16);
}
Frequently asked questions
Is Bento Grid free for commercial use?
Yes. Bento Grid is MIT licensed, so you can use it in personal and commercial projects without attribution.
Does Bento Grid affect performance or accessibility?
The reveal animates transform and opacity only, inside space the grid has already reserved, so layout shift is zero. The entrance starts from whileInView and runs once, the 4px hover lift is limited to fine pointers and never hides content or moves it away from the cursor, and with reduced motion enabled the full grid renders immediately with no reveal and no lift. The grid itself is layout only, with no grid role, so your own cell markup keeps its natural heading structure and focus behaviour.
How do I make a cell span two columns or two rows?
Set data-span="2" on a cell to span two columns, or data-span-row="2" to span two rows. Column spans apply from md, where they read as a full-width band across the two-column grid. Row spans wait until lg, where three columns can absorb them: in a two-column grid a row span holds one column open across two rows, which pushes any wide cell after it onto a new row and can leave a half-width gap that dense flow has nothing narrow enough to fill. Both collapse automatically to the single mobile column.