# Bento With Static Chart Visuals

> Bento grid whose hero automation tile carries a bar-chart visual, with supporting tiles showing deploy times, progress bars, and headline numbers.

A shadcn/ui block from the [@7ovr](https://7ovr.com) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/7ovr/bento-4).

- Page, with a live preview: https://shadcn.exchange/r/7ovr/bento-4
- Screenshot: https://abzjhwgwpdpz7ua5.public.blob.vercel-storage.com/shots/7ovr/bento-4-light-637b1058045d68d4.png
- Registry item: https://7ovr.com/r/bento-4.json
- Categories: bento
- Listed: 2026-10-13, source last changed 2026-10-13

## Install

```bash
npx shadcn@latest add https://7ovr.com/r/bento-4.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: `@base-ui/react`
- Registry items: `card`

## Files

### `registry/blocks/bento/4/bento-block.tsx`

```tsx
import { Card } from "@/components/ui/card"
import { cn } from "@/lib/utils"
import { IconPlaceholder } from "@/components/icons/icon-placeholder"
import type * as React from "react"

type IconProps = { className?: string; size?: number | string }

type IconRenderer = (props: IconProps) => React.ReactNode

export default function BentoBlock() {
  return (
    <section className="flex w-full items-center justify-center bg-muted/30 px-6 py-16 text-foreground">
      <div className="mx-auto w-full max-w-6xl">
        <div className="max-w-2xl">
          <span className="text-sm font-medium tracking-widest text-muted-foreground uppercase">
            Capabilities
          </span>
          <h2 className="mt-3 font-heading text-3xl font-bold tracking-tight sm:text-4xl">
            Everything Acme runs on, in one grid
          </h2>
          <p className="mt-3 text-muted-foreground">
            A composable platform that scales from your first deploy to your
            millionth request, without changing tools.
          </p>
        </div>

        <div className="mt-12 grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-4 md:grid-rows-[repeat(2,minmax(0,1fr))_auto]">
          <Card className="relative flex flex-col justify-between gap-8 overflow-hidden rounded-lg border-border p-8 sm:col-span-2 md:col-span-2 md:row-span-2">
            <div className="flex flex-col gap-4">
              <span className="flex size-12 items-center justify-center rounded-lg border border-border bg-primary text-primary-foreground">
                <IconPlaceholder
                  lucide="Sparkles"
                  tabler="IconSparkles"
                  hugeicons="SparklesIcon"
                  phosphor="Sparkle"
                  remixicon="RiSparklingLine"
                  className="size-6"
                  aria-hidden="true"
                />
              </span>
              <div>
                <h3 className="font-heading text-2xl font-semibold tracking-tight">
                  Intelligent automation engine
                </h3>
                <p className="mt-3 max-w-sm text-muted-foreground">
                  Define workflows once and let Acme orchestrate retries,
                  scaling, and rollbacks across every environment automatically.
                </p>
              </div>
            </div>
            <div className="flex items-end gap-1.5" aria-hidden="true">
              {[28, 40, 33, 52, 45, 66, 54, 78, 64, 92].map((h, i, arr) => (
                <div
                  key={i}
                  className={cn(
                    "flex-1",
                    i === arr.length - 1 ? "bg-primary" : "bg-primary/25"
                  )}
                  style={{ height: `${h}px` }}
                />
              ))}
            </div>
          </Card>

          <Tile
            icon={(p: IconProps) => (
              <IconPlaceholder
                lucide="Clock"
                tabler="IconClock"
                hugeicons="TimeIcon"
                phosphor="Clock"
                remixicon="RiTimeLine"
                {...p}
              />
            )}
            title="Sub-second deploys"
            description="Ship globally in under 30 seconds from any branch."
          >
            <div className="mt-5 flex items-center gap-2" aria-hidden="true">
              <span className="text-3xl font-bold tracking-tight">0.4</span>
              <span className="text-sm text-muted-foreground">sec avg</span>
            </div>
          </Tile>

          <Tile
            icon={(p: IconProps) => (
              <IconPlaceholder
                lucide="ShieldCheck"
                tabler="IconShieldCheck"
                hugeicons="Shield01Icon"
                phosphor="ShieldCheck"
                remixicon="RiShieldCheckLine"
                {...p}
              />
            )}
            title="Zero-trust security"
            description="Granular policies and encryption on by default."
          >
            <div className="mt-5 space-y-2" aria-hidden="true">
              {[92, 74, 88].map((w, i) => (
                <div key={i} className="flex items-center gap-2">
                  <span className="size-2.5 shrink-0 bg-primary" />
                  <span className="h-1.5 flex-1 bg-muted">
                    <span
                      className="block h-full bg-primary/40"
                      style={{ width: `${w}%` }}
                    />
                  </span>
                </div>
              ))}
            </div>
          </Tile>

          <Tile
            icon={(p: IconProps) => (
              <IconPlaceholder
                lucide="ChartBar"
                tabler="IconChartBar"
                hugeicons="BarChartIcon"
                phosphor="ChartBar"
                remixicon="RiBarChartBoxLine"
                {...p}
              />
            )}
            title="Live analytics"
            description="Custom metrics with sub-second refresh."
          >
            <div className="mt-5 flex items-end gap-1.5" aria-hidden="true">
              {[34, 50, 40, 60, 48, 74].map((h, i, arr) => (
                <div
                  key={i}
                  className={cn(
                    "flex-1",
                    i === arr.length - 1 ? "bg-primary" : "bg-primary/30"
                  )}
                  style={{ height: `${h}px` }}
                />
              ))}
            </div>
          </Tile>

          <Tile
            icon={(p: IconProps) => (
              <IconPlaceholder
                lucide="Cpu"
                tabler="IconCpu"
                hugeicons="CpuIcon"
                phosphor="Cpu"
                remixicon="RiCpuLine"
                {...p}
              />
            )}
            title="Elastic compute"
            description="Scale to zero, burst to thousands of cores."
          >
            <div className="mt-5 space-y-1.5" aria-hidden="true">
              <div className="h-2 w-full rounded-sm bg-muted">
                <div className="h-full w-3/4 rounded-lg bg-primary/40" />
              </div>
              <div className="h-2 w-full rounded-sm bg-muted">
                <div className="h-full w-1/2 rounded-sm bg-primary/40" />
              </div>
            </div>
          </Tile>

          <Tile
            className="sm:col-span-2 md:col-span-4"
            icon={(p: IconProps) => (
              <IconPlaceholder
                lucide="GitBranch"
                tabler="IconGitBranch"
                hugeicons="GitBranchIcon"
                phosphor="GitBranch"
                remixicon="RiGitBranchLine"
                {...p}
              />
            )}
            title="Preview every branch"
            description="Each pull request gets an isolated, shareable environment with its own URL and data snapshot."
          >
            <div className="mt-5 flex items-center gap-3" aria-hidden="true">
              <span className="size-3 rounded-md bg-primary" />
              <span className="h-px flex-1 bg-border" />
              <span className="size-2.5 rounded-sm border border-border bg-muted" />
              <span className="h-px flex-1 bg-border" />
              <span className="size-2.5 rounded-sm border border-border bg-muted" />
            </div>
          </Tile>
        </div>
      </div>
    </section>
  )
}

function Tile({
  icon: Icon,
  title,
  description,
  className,
  children,
}: {
  icon: IconRenderer
  title: string
  description: string
  className?: string
  children?: React.ReactNode
}) {
  return (
    <Card
      className={cn("flex flex-col rounded-lg border-border p-6", className)}
    >
      <span className="flex size-10 items-center justify-center rounded-md border border-border bg-muted">
        <Icon className="size-5" aria-hidden="true" />
      </span>
      <h3 className="mt-4 font-heading font-semibold tracking-tight">
        {title}
      </h3>
      <p className="mt-2 text-sm text-muted-foreground">{description}</p>
      {children}
    </Card>
  )
}
```
