Bento Grid

Bento layout of feature tiles on a container-query grid that collapses to one column in narrow containers, with per-card column and row spans, icon, title, description and a visual slot that lifts and zooms on hover, a radial spotlight that follows the cursor across the border and surface, a CTA whose arrow nudges on hover, and cards that stagger in when scrolled into view.

Preview

Bento Grid preview width

Install

Add it with the shadcn CLI, or copy the source manually.

$ bunx --bun shadcn add @karaui/bento-grid
@karaui not found? Add it to components.json
{
  "registries": {
    "@karaui": "https://karaui.kamisama-v0.my.id/r/{name}.json"
  }
}

@karaui is in shadcn's public registry directory, so the latest CLI needs no setup. On an older CLI, merge this into the existing file once and every @karaui/… install resolves.

API Reference

BentoGrid

columns?
2 | 3 | 4

Columns once the grid's own container is at least 32rem wide. Default 3.

3
animateOnView?
boolean

Stagger the cards in when the grid scrolls into view. Default true.

true
className?
string
—

BentoCard

title
ReactNode
—
description?
ReactNode
—
icon?
ReactNode

Small icon shown in a tile above the title.

—
visual?
ReactNode

Decorative visual (mini chart, illustration). Lifts and zooms on hover.

—
href?
string

Makes the whole card a link via the CTA.

—
onClick?
(() => void)

Makes the whole card a button via the CTA (ignored when `href` is set).

—
cta?
ReactNode

CTA label. Default "Learn more". Only shown with `href` or `onClick`.

Learn more
colSpan?
1 | 2 | 3 | 4

Columns spanned at wide container sizes. Default 1.

1
rowSpan?
1 | 2 | 3 | 4

Rows spanned at wide container sizes. Default 1.

1
spotlightColor?
string

Spotlight color (any CSS color). Default `var(--primary)`.

var(--primary)
className?
string
—

Keep in mind

Some components on this site are inspired by or recreated from existing work across the web. I'm not here to take credit; just to learn, experiment, and sometimes push things a bit further. If something looks familiar and I forgot to mention you, reach out and I'll fix that right away.

Updated