Skip to content
Template Empire
Browse components

Bento Grid

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

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.

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.

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:

{
  "registries": {
    "@te": "https://templateempire.io/r/{name}.json"
  }
}

Then install the component:

npx shadcn@latest add @te/feat-bento-grid

Usage

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

PropTypeDefaultDescription
childrenReactNoderequiredGrid cells. A cell may set data-span="2" (two columns) or data-span-row="2" (two rows).
classNamestringundefinedAdditional 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.

Related components

Want the full page this belongs to?Template Empire builds complete Next.js templates with this motion system throughout. Browse the paid templates that pair with these free components.Explore Template Empire templates