# Bento grids 02

> A row of collection cards, one twice as wide, each with a product photo bleeding off the top, a title, a short description and a link.

A shadcn/ui block from the [@flx](https://ui.flexnative.com/?utm_source=shadcn.exchange) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/flx/bento-grids-02).

- Page, with a live preview: https://shadcn.exchange/r/flx/bento-grids-02
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/flx/bento-grids-02-light-ea98b39f3510ee91.png
- Registry item: https://ui.flexnative.com/r/bento-grids-02.json
- Listed: 2026-10-22, source last changed 2026-10-22

## Install

```bash
npx shadcn@latest add https://shadcn.exchange/r/flx/bento-grids-02.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- npm packages: `lucide-react`, `react-wrap-balancer`
- Registry items: `button`

## Files

### `registry/blocks/bento-grids/bento-grids-02/bento-grids-02.tsx`

```tsx
import { ArrowRight } from 'lucide-react'
import Balancer from 'react-wrap-balancer'

import { Button } from '@/components/ui/button'
import { cn } from '@/lib/utils'

const collections = [
  {
    title: 'Peripherals',
    description:
      'Quiet, precise tools that keep your desk calm and your hands moving.',
    image:
      'https://images.unsplash.com/photo-1527814050087-3793815479db?q=80&w=1200&auto=format&fit=crop',
    alt: 'Alt 1',
    className: 'md:col-span-1',
  },
  {
    title: 'Immersive',
    description:
      'Spatial headsets built for focus, play and long sessions in comfort.',
    image:
      'https://images.unsplash.com/photo-1622979135225-d2ba269cf1ac?q=80&w=1600&auto=format&fit=crop',
    alt: 'Alt 2',
    className: 'md:col-span-2',
  },
  {
    title: 'Audio',
    description:
      'Balanced sound for deep work, slow mornings and every commute.',
    image:
      'https://images.unsplash.com/photo-1583394838336-acd977736f90?q=80&w=1200&auto=format&fit=crop',
    alt: 'Alt 3',
    className: 'md:col-span-1',
  },
]

export function BentoGrids02() {
  return (
    <section className="bg-background w-full">
      <div className="mx-auto grid w-full max-w-7xl grid-cols-1 gap-6 px-6 py-20 sm:py-28 md:grid-cols-4">
        {collections.map((collection) => (
          <article
            key={collection.title}
            className={cn(
              'bg-muted relative isolate flex min-h-[28rem] flex-col justify-end overflow-hidden rounded-3xl p-8 sm:min-h-[32rem]',
              collection.className,
            )}
          >
            <div className="absolute inset-x-0 top-0 -z-10 h-[62%] mask-b-from-60% mask-b-to-100% mix-blend-multiply dark:opacity-80 dark:mix-blend-normal"
            >
              <img
                src={collection.image}
                alt={collection.alt}
                decoding="async"
                className="size-full object-cover grayscale"
              />
            </div>

            <div className="flex flex-col items-start gap-3">
              <h2 className="text-foreground text-2xl font-medium tracking-tight sm:text-3xl">
                {collection.title}
              </h2>
              <p className="text-muted-foreground max-w-xs text-sm sm:text-base">
                <Balancer>{collection.description}</Balancer>
              </p>
              <Button
                variant="link"
                className="text-foreground mt-2 h-10 gap-2 px-0"
                nativeButton={false}
                render={<a href="#" />}
              >
                Explore collection
                <ArrowRight className="size-4" />
              </Button>
            </div>
          </article>
        ))}
      </div>
    </section>
  )
}
```
