GODRICH
#css-animation#button#loader#transition#scroll#dashboard#ui#design-trends

Bento Grid Design: 9 Ready-to-Copy Sections

Bento grid design arranges a landing page into tiles of uneven sizes inside one grid, the way a bento box holds different-sized food in one tray.

The one-page mock below stitches all nine pieces into a single scrollable layout, built with the config further down, so you can watch how a big hero tile, a stat card, and a wide CTA band sit next to each other before you copy any one section on its own.

Open the full page

Auto-plays · click a tile to jump to its section · all nine in one zip

Each part below is cut straight out of that page, in the order it appears top to bottom: hero first, then nav, then the sections a SaaS landing page usually stacks after it. If your screen runs dark instead, the Linear-style dark SaaS sections carry the same grid sensibility over a black background, and when a tile's copy has to survive the jump into an inbox, the marketing email templates cover that hand-off.

01Bento hero (2x2 grid)

What you see

The hero splits into a tall headline tile, a small stat tile, and a plain accent block instead of one wide banner — the headline tile alone spans both rows, so it reads first.

Bento hero (2x2 grid)
Open in a new tab

01 · Bento hero (2x2 grid) — Measured area 53.267% · moving frames 16/23Original by GODRICH · SCSS and React ship in the zip · See the password

2x2radius 24호버 확대

Where a bento grid landing page design puts its hero

Reach for this shape on a SaaS landing page's first screen or a portfolio cover, anywhere a single flat banner would waste the extra width.

<section class="grid grid-cols-3 grid-rows-2 gap-4 py-16" style="min-height:340px">
  <div class="col-span-2 row-span-2 flex flex-col justify-center gap-4 rounded-tile bg-white p-10 shadow-bento">
    <p class="text-xs font-bold uppercase tracking-wide text-accent">Nectar</p>
    <h1 class="text-4xl font-extrabold leading-tight">Work and team, one screen</h1>
    <p class="max-w-md text-sm text-ink/70">No email required — your first workspace opens in three minutes.</p>
    <button class="w-fit rounded-pill bg-ink px-6 py-3 text-sm font-bold text-cream">Start free</button>
  </div>
  <div class="flex items-center gap-3 rounded-tile bg-white p-6 shadow-bento">
    <span class="h-3 w-3 rounded-full bg-accent"></span>
    <span class="text-sm font-semibold">Live sync</span>
  </div>
  <div class="rounded-tile bg-accent/15"></div>
</section>

02Rounded pill navbar

The motion

The whole menu sits inside one pill-shaped track, and a filled inner chip slides underneath whichever item is active instead of a plain underline.

Rounded pill navbar
Open in a new tab

02 · Rounded pill navbar — Measured area 4.193% · moving frames 15/23Original by GODRICH · SCSS and React ship in the zip · See the password

radius 999padding 6px그림자 얕게

Good places for it

It fits a landing page's top bar and works just as well for switching tabs inside an app, since the pill shape keeps four or five items readable without a full header bar.

<nav class="mx-auto flex max-w-5xl items-center gap-4 rounded-pill bg-white/80 backdrop-blur px-3 py-2 shadow-bento">
  <span class="pl-3 font-display font-extrabold text-sm">Nectar</span>
  <div class="relative flex flex-1 rounded-pill bg-ink/5 p-1">
    <span class="absolute inset-y-1 left-1 w-1/4 rounded-pill bg-accent"></span>
    <span class="relative z-10 flex-1 text-center text-xs font-semibold py-2">Home</span>
    <span class="relative z-10 flex-1 text-center text-xs font-semibold py-2">Features</span>
    <span class="relative z-10 flex-1 text-center text-xs font-semibold py-2">Pricing</span>
    <span class="relative z-10 flex-1 text-center text-xs font-semibold py-2">Contact</span>
  </div>
  <button class="rounded-pill bg-accent px-4 py-2 text-xs font-bold text-cream">Start free</button>
</nav>

03Core bento card grid

What it does

This is the body of the whole style — four tiles with different column and row spans instead of a uniform three-column grid, so the eye lands on the tallest tile first and only then scans the smaller ones beside it.

Core bento card grid
Open in a new tab

03 · Core bento card grid — Measured area 17.204% · moving frames 20/23Original by GODRICH · SCSS and React ship in the zip · See the password

grid-template-columnsgap 16px2열→1열

When to use it

Use it for a feature showcase or a dashboard summary where one item genuinely deserves more room than the rest.

<div class="grid grid-cols-3 grid-rows-2 gap-4" style="min-height:260px">
  <div class="row-span-2 flex flex-col justify-end gap-3 rounded-tile bg-white p-5 shadow-bento hover:shadow-bento-hover transition-shadow">
    <div class="flex-1 rounded-[14px] bg-accent/10"></div>
    <span class="h-4 w-4 rounded bg-accent"></span>
    <p class="text-sm font-semibold">Fast search</p>
  </div>
  <div class="flex flex-col justify-end gap-2 rounded-tile bg-white p-5 shadow-bento hover:shadow-bento-hover transition-shadow">
    <span class="h-4 w-4 rounded bg-accent"></span>
    <p class="text-sm font-semibold">Auto sort</p>
  </div>
  <div class="flex flex-col justify-end gap-2 rounded-tile bg-white p-5 shadow-bento hover:shadow-bento-hover transition-shadow">
    <span class="h-4 w-4 rounded bg-accent"></span>
    <p class="text-sm font-semibold">Team chat</p>
  </div>
  <div class="col-span-2 flex flex-col justify-end gap-2 rounded-tile bg-white p-5 shadow-bento hover:shadow-bento-hover transition-shadow">
    <span class="h-4 w-4 rounded bg-accent"></span>
    <p class="text-sm font-semibold">Reports</p>
  </div>
</div>

04Icon + number feature cards

What you see

Each card carries one icon block and one oversized number so a reader can scan the pair of tiles at a glance without reading the label under either.

Icon + number feature cards
Open in a new tab

04 · Icon + number feature cards — Measured area 0.728% · moving frames 23/23Original by GODRICH · SCSS and React ship in the zip · See the password

숫자 강조아이콘 40px호버 살짝 뜸

Where it fits

It suits a strip of stats sitting right above a pricing table, or a short product overview where two or three numbers make a stronger case than a paragraph does.

<section class="flex gap-4 py-10">
  <div class="flex-1 rounded-tile bg-white p-6 shadow-bento">
    <span class="mb-2 block h-6 w-6 rounded-lg bg-accent"></span>
    <p class="text-2xl font-extrabold">12,000+</p>
    <p class="text-xs font-semibold text-ink/70">connected apps</p>
    <span class="mt-3 block h-1 w-full rounded-pill bg-accent"></span>
  </div>
  <div class="flex-1 rounded-tile bg-white p-6 shadow-bento">
    <span class="mb-2 block h-6 w-6 rounded-lg bg-accent"></span>
    <p class="text-2xl font-extrabold">99.9%</p>
    <p class="text-xs font-semibold text-ink/70">uptime</p>
    <span class="mt-3 block h-1 w-4/5 rounded-pill bg-accent"></span>
  </div>
</section>

05Plans sized by tier

The motion

The recommended plan sits in a slightly wider tile with its own badge, so a reader can tell which plan you're pushing before comparing a single feature row.

Plans sized by tier
Open in a new tab

05 · Plans sized by tier — Measured area 1.839% · moving frames 21/23Original by GODRICH · SCSS and React ship in the zip · See the password

강조 칸 1.4배border 2pxbadge 위치

Good places for it

It replaces a three-column comparison table on a pricing section, especially when there are only two or three tiers to show.

<div class="flex items-end gap-4">
  <div class="flex-1 rounded-tile bg-white/60 p-6 shadow-[0_6px_12px_rgba(23,20,26,.08)]">
    <p class="font-bold">Free</p>
    <p class="mt-1 text-sm text-ink/70">$0</p>
  </div>
  <div class="relative flex-[1.1] rounded-tile bg-white pt-8 p-6 shadow-bento-hover">
    <span class="absolute -top-3 left-6 rounded-pill bg-accent px-3 py-1 text-xs font-bold text-cream">Recommended</span>
    <p class="font-bold">Pro</p>
    <p class="mt-1 text-sm text-ink/70">$19 / month</p>
  </div>
</div>

06Quote cards mixed into the grid

What it does

A wide quote tile sits next to two smaller cards and a full-width star row, so reviews read as part of the layout instead of a separate carousel bolted on underneath.

Quote cards mixed into the grid
Open in a new tab

06 · Quote cards mixed into the grid — Measured area 33.467% · moving frames 16/23Original by GODRICH · SCSS and React ship in the zip · See the password

따옴표 아이콘별점 옵션1칸 폭

When to use it

Mix testimonials into the grid this way alongside partner logos, where a dedicated review section would otherwise feel like an ad break.

<div class="grid grid-cols-3 gap-4">
  <div class="col-span-2 rounded-tile bg-white p-6 shadow-bento">
    <p class="text-sm font-semibold leading-relaxed">&ldquo;Onboarding time dropped by half.&rdquo;</p>
    <p class="mt-3 text-xs text-ink/60">Dana Cho &middot; Product Manager</p>
  </div>
  <div class="rounded-tile bg-white p-6 shadow-bento">
    <p class="text-sm font-semibold leading-relaxed">&ldquo;Replaced three separate tools.&rdquo;</p>
    <p class="mt-3 text-xs text-ink/60">Seoyeon Park &middot; Ops Lead</p>
  </div>
  <div class="col-span-2 flex items-center justify-center gap-1 rounded-tile bg-white p-6 text-accent shadow-bento" aria-hidden="true">
    <span>&#9733;&#9733;&#9733;&#9733;&#9733;</span>
  </div>
</div>

07Wide horizontal CTA tile

What you see

One tile stretches across the full row width, with a soft glow blurred into the corner behind the heading, so it reads as the last stop after a page full of smaller tiles rather than one more card among many.

Wide horizontal CTA tile
Open in a new tab

07 · Wide horizontal CTA tile — Measured area 19.051% · moving frames 22/23Original by GODRICH · SCSS and React ship in the zip · See the password

열 전체 spanradius 24배경 대비

Where it fits

Put it right before a footer, wherever the page needs a final push toward a free trial or a sign-up.

<section class="py-10">
  <div class="relative overflow-hidden rounded-tile bg-ink px-10 py-12">
    <span class="absolute -right-16 -top-24 h-64 w-64 rounded-full bg-accent opacity-30 blur-sm"></span>
    <h3 class="relative max-w-md text-3xl font-extrabold text-cream">Bring your team in today</h3>
    <button class="relative mt-6 rounded-pill bg-cream px-6 py-3 text-sm font-bold text-ink">Start free</button>
  </div>
</section>

08Link groups as their own tiles

The motion

Every footer column gets its own faint tile instead of sitting on bare background, so the bento pattern carries all the way to the bottom of the page rather than stopping at the last content section.

Link groups as their own tiles
Open in a new tab

08 · Link groups as their own tiles — Measured area 1.765% · moving frames 23/23Original by GODRICH · SCSS and React ship in the zip · See the password

칸 배경 5%4열→2열구분선 없음

Good places for it

It works best on a multi-column footer or a sitemap-style link block, where a plain list of links would otherwise look like an afterthought.

<footer class="grid grid-cols-3 gap-4 py-10">
  <div class="rounded-tile bg-ink/[.04] p-5">
    <p class="mb-2 text-xs font-bold uppercase tracking-wide text-ink/50">Product</p>
    <p class="text-sm font-semibold">Features</p>
  </div>
  <div class="rounded-tile bg-ink/[.04] p-5">
    <p class="mb-2 text-xs font-bold uppercase tracking-wide text-ink/50">Company</p>
    <p class="text-sm font-semibold">About</p>
  </div>
  <div class="rounded-tile bg-ink/[.04] p-5">
    <p class="mb-2 text-xs font-bold uppercase tracking-wide text-ink/50">Support</p>
    <p class="text-sm font-semibold">Help center</p>
  </div>
</footer>

09Radius-12 pill buttons

What it does

The input and its submit button share the same 12px corner radius as the tiles around them, plus a matching focus ring, so a form dropped into the layout reads as one system rather than a separate widget with its own rounding.

Radius-12 pill buttons
Open in a new tab

09 · Radius-12 pill buttons — Measured area 2.1% · moving frames 10/23Original by GODRICH · SCSS and React ship in the zip · See the password

radius 12포커스 링 2px높이 44px

When to use it

Use this pair on any email capture form or search box that sits inside a bento section.

<form class="mx-auto flex max-w-md flex-col gap-3 rounded-tile bg-white p-6 shadow-bento sm:flex-row">
  <label class="relative flex-1 rounded-[12px] bg-cream">
    <input class="w-full rounded-[12px] bg-transparent px-4 py-3 text-sm outline-none ring-2 ring-accent/40" type="email" placeholder="Email address" readonly>
  </label>
  <button class="rounded-[12px] bg-accent px-5 py-3 text-sm font-bold text-cream" type="button">Sign up</button>
</form>

The tailwind.config

Every radius, shadow, color, and gap above comes from one config file rather than from values typed straight into each class. Drop this into a project's tailwind.config.js and every tile, badge, button, and bento grid hover shadow on the page pulls from the same four tokens.

tailwind.config = {
  theme: {
    extend: {
      colors: {
        cream: "#fff7e6",
        ink: "#17141a",
        accent: "#2f6df6",
        line: "rgba(23,20,26,.08)",
      },
      fontFamily: {
        display: ["'Plus Jakarta Sans'", "system-ui", "sans-serif"],
        body: ["'Inter'", "system-ui", "sans-serif"],
      },
      borderRadius: {
        tile: "20px",
        pill: "999px",
      },
      boxShadow: {
        bento: "0 14px 24px rgba(23,20,26,.10)",
        "bento-hover": "0 20px 32px rgba(23,20,26,.16)",
      },
      spacing: {
        gutter: "14px",
      },
    },
  },
};

The vibe-coding prompt

Paste the config above into a project, then hand an agent a short, numbered list of rules rather than a vague "make it look bento." The fragment below is the part that keeps the result from drifting into a generic card grid — everything past it is in the zip's prompt.md.

1. Split the hero into several tiles of different sizes (a 2x2 asymmetric
   mosaic) instead of one big block. Headline + CTA on the biggest tile,
   one badge and one stat on the small ones.
2. Every card uses rounded-tile (20px) and shadow-bento. On hover, only
   shadow-bento-hover grows — nothing shifts position.
3. Background is cream (#fff7e6) alone. Cards stay white or cream; accent
   (#2f6df6) only marks what needs attention. No gradient card fills.
4. Pricing skips the comparison table — the recommended plan tile is just
   1.1x larger than the rest.

Running that exact prompt against run/010/demo/page/index.html produced the page the sections above were cut from, checked at a 1280px viewport:

Result

Where it breaks — the traps

When the tiles stop differing

Bento grids fall apart the moment every tile carries roughly the same amount of content, because the size differences that make the style work stop mapping to anything — a big tile next to three equally full small tiles just reads as an uneven three-column grid with extra whitespace. The pattern also breaks under real copy: swap the two-word feature labels above for a paragraph of actual marketing text, and the small tiles either overflow their fixed height or force every other tile in that row to grow to match, which erases the size contrast the whole layout depends on. Grab the full page, all nine sections, and the config file from the archive rather than rebuilding the grid math by hand — j7zbg3ef unlocks it, typed on this page exactly as it appears, no extra spaces. Carrying a tile's wording into the emails that follow signup is the same discipline at a smaller scale — the transactional email templates are where that copy lands next.

Accessibility

Contrast and reduced motion

Contrast holds up across the set because ink (#17141a) on cream (#fff7e6) and ink on plain white both clear body-text contrast by a wide margin, and the one place color alone carries meaning — the accent-colored recommended badge in 05 — also has the word "Recommended" printed on it, so the tile still reads correctly without color vision. Motion is limited to begin with: only the hero, the pro pricing tile and its badge, and the CTA glow move at all in the demos above, and every one of those honors prefers-reduced-motion by holding still rather than looping. MDN's reference on the prefers-reduced-motion media feature covers how operating systems expose that setting to a page. The grid itself also collapses to a single column under 640px rather than shrinking tiles down to an unreadable size, which matters more for this style than for a plain stack layout since a shrunk 2x2 hero gets cramped fast.

FAQ

Does bento grid design need CSS Grid, or can I fake it with flexbox?

CSS Grid is what makes the uneven tile spans possible — grid-column: span 2 and grid-row: span 2 are what let one tile occupy the space of several without absolute positioning. MDN's guide to line-based placement covers the span syntax the core grid in section 03 is built on. Flexbox can approximate a single row of uneven widths, as sections 04 and 05 above show, but it can't span two rows the way the hero tile does. Adding motion when a pointer lands on these tiles is the next layer, and the bento grid hover animations build exactly that on top of this layout.

How many tiles is too many in bento grid design examples?

Past six or seven tiles in a single grid, most readers stop distinguishing which tile is meant to matter most, since the size contrast that carries the hierarchy gets diluted across too many competing shapes. The core grid in section 03 above stays at four for exactly that reason — three normal tiles plus one obviously bigger one still reads at a glance.

Do bento grid design ideas work on a page that isn't a SaaS landing page?

Yes — the pattern is really just "uneven grid with matched radius and shadow," and it works for portfolios, changelogs, and dashboard summaries as well as it works for a product landing page. The nine sections here happen to be a landing page because that's the layout most of the reference sites for this trend used, but the internal-link roundup on the design category page covers non-landing uses too, and what this site does and doesn't sell is on the about page.

Enter the archive password

The password is inside this article. You will find it as you read.