Asymmetric bento grid: one large anchor card and a constellation of small ones.
Built for the details
The unglamorous parts of great interfaces, handled once and handled well.
Motion that settles once
Three shared springs power every hover, reveal, and layout shift, so the whole page moves as one body. Entrances breathe a single time — nothing wobbles, nothing nags. Override per component only when the physics genuinely call for it.
Token-pure theming
Every color, radius, and shadow resolves through CSS variables. Flip one attribute for a full light theme.
Composed, not configured
Blocks accept plain content props — arrays in, polished sections out. No config files, no schema wrangling.
Accessible by default
Focus rings, aria wiring, and keyboard paths ship in every component, with reduced-motion fallbacks throughout.
Fast where it counts
Transform-only animation and lazy ambient effects keep interaction under a frame, even on modest hardware.
Install
Copies the component source — plus its small internal deps — into your project. You own the code from the first minute.
terminal
npx lumora-ui@latest add features
Import
Using the workspace package instead? Deep imports keep cold starts lean; the barrel is fully tree-shakable either way.
app/page.tsx
import { FeatureBento } from"@lumora/ui/blocks/features";
// or from the barrel:import { FeatureBento } from"@lumora/ui";
Props worth knowing
items take { icon?, title, body } in display order — the first fills the large 2×2 anchor cell, the rest flow into small cells. heading and subheading top the section. Props extend the natural HTML element, so className, event handlers, and aria attributes pass straight through.