Bento Grid
Responsive bento box grid layout for React. Create Apple-style dashboard layouts with flexible grid areas. Perfect for landing pages and feature showcases.
Last updated on
AI Analytics Dashboard
A modern, data-driven dashboard layout showcasing AI metrics, system health, and real-time traffic.
"use client";
import {
ArrowUpRight,
Brain,
Cpu,
Globe,
Layers,
Sparkles,
} from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { BentoGrid } from "@/components/ui/bento-grid";
export function BentoGridCustomDemo() {
return (
<BentoGrid className="mx-auto max-w-7xl gap-4 p-4">
{/* Main AI Intelligence Card */}
<Card className="relative overflow-hidden border-primary/20 bg-gradient-to-br from-indigo-500/10 via-purple-500/5 to-background md:col-span-2 lg:row-span-2">
<div className="-right-20 -top-20 absolute h-64 w-64 rounded-full bg-primary/10 blur-3xl" />
<CardHeader className="relative z-10 pb-2">
<div className="flex items-center justify-between">
<Badge
variant="outline"
className="border-primary/30 bg-primary/10 text-primary"
>
<Brain className="mr-1 h-3 w-3" />
AI Core v2.4
</Badge>
<span className="text-muted-foreground text-xs">
Updated 2m ago
</span>
</div>
<CardTitle className="mt-4 font-bold text-3xl tracking-tight">
Neural Network <br />
<span className="text-primary">Intelligence Hub</span>
</CardTitle>
</CardHeader>
<CardContent className="relative z-10 space-y-8">
<p className="max-w-md text-muted-foreground">
Real-time processing of over 1.2M data points per second with
predictive modeling and automated anomaly detection.
</p>
<div className="grid grid-cols-2 gap-6">
<div className="space-y-1">
<p className="text-muted-foreground text-xs uppercase tracking-wider">
Accuracy
</p>
<p className="font-bold font-mono text-2xl text-emerald-500">
99.98%
</p>
</div>
<div className="space-y-1">
<p className="text-muted-foreground text-xs uppercase tracking-wider">
Latency
</p>
<p className="font-bold font-mono text-2xl text-blue-500">14ms</p>
</div>
</div>
<div className="flex flex-wrap gap-2">
<Button size="sm" className="shadow-lg shadow-primary/20">
Deploy Model
<ArrowUpRight className="ml-2 h-4 w-4" />
</Button>
<Button size="sm" variant="outline">
View Logs
</Button>
</div>
</CardContent>
</Card>
{/* Real-time Traffic */}
<Card className="border-border/50 bg-card/50 backdrop-blur-sm">
<CardHeader className="pb-2">
<CardTitle className="flex items-center gap-2 font-medium text-sm">
<Globe className="h-4 w-4 text-blue-500" />
Global Traffic
</CardTitle>
</CardHeader>
<CardContent>
<div className="flex items-baseline gap-2">
<span className="font-bold text-2xl">42.8k</span>
<span className="font-medium text-emerald-500 text-xs">+12%</span>
</div>
<div className="mt-4 flex h-12 items-end gap-1">
{[40, 70, 45, 90, 65, 80, 50, 95, 75, 60].map((h, i) => (
<div
key={i}
className="flex-1 rounded-t-sm bg-blue-500/20 transition-all hover:bg-blue-500"
style={{ height: `${h}%` }}
/>
))}
</div>
</CardContent>
</Card>
{/* System Health */}
<Card className="border-border/50 bg-card/50 backdrop-blur-sm">
<CardHeader className="pb-2">
<CardTitle className="flex items-center gap-2 font-medium text-sm">
<Cpu className="h-4 w-4 text-purple-500" />
System Health
</CardTitle>
</CardHeader>
<CardContent className="space-y-4">
<div className="flex items-center justify-between text-xs">
<span className="text-muted-foreground">CPU Load</span>
<span className="font-medium">24%</span>
</div>
<div className="h-1.5 w-full overflow-hidden rounded-full bg-muted">
<div
className="h-full bg-purple-500 transition-all"
style={{ width: "24%" }}
/>
</div>
<div className="flex items-center justify-between text-xs">
<span className="text-muted-foreground">Memory</span>
<span className="font-medium">4.2GB / 16GB</span>
</div>
<div className="h-1.5 w-full overflow-hidden rounded-full bg-muted">
<div
className="h-full bg-blue-500 transition-all"
style={{ width: "35%" }}
/>
</div>
</CardContent>
</Card>
{/* Active Agents */}
<Card className="border-border/50 bg-card/50 backdrop-blur-sm md:col-span-2">
<CardHeader className="pb-2">
<div className="flex items-center justify-between">
<CardTitle className="flex items-center gap-2 font-medium text-sm">
<Layers className="h-4 w-4 text-amber-500" />
Active AI Agents
</CardTitle>
<Button variant="ghost" size="sm" className="h-8 text-xs">
Manage All
</Button>
</div>
</CardHeader>
<CardContent>
<div className="grid grid-cols-1 gap-4 md:grid-cols-3">
{[
{ name: "DataScout", status: "Running", color: "bg-emerald-500" },
{ name: "TrendBot", status: "Idle", color: "bg-slate-400" },
{
name: "SecuritySentinel",
status: "Running",
color: "bg-emerald-500",
},
].map((agent) => (
<div
key={agent.name}
className="flex items-center gap-3 rounded-lg border bg-background/50 p-3"
>
<div className={`h-2 w-2 rounded-full ${agent.color}`} />
<div className="flex-1 overflow-hidden">
<p className="truncate font-medium text-sm">{agent.name}</p>
<p className="text-[10px] text-muted-foreground uppercase">
{agent.status}
</p>
</div>
</div>
))}
</div>
</CardContent>
</Card>
{/* Recent Insights */}
<Card className="border-border/50 bg-card/50 backdrop-blur-sm">
<CardHeader className="pb-2">
<CardTitle className="flex items-center gap-2 font-medium text-sm">
<Sparkles className="h-4 w-4 text-rose-500" />
AI Insights
</CardTitle>
</CardHeader>
<CardContent className="space-y-3">
<div className="rounded-md border border-rose-500/10 bg-rose-500/5 p-2 text-[11px]">
<p className="font-medium text-rose-600 dark:text-rose-400">
Anomaly Detected
</p>
<p className="text-muted-foreground">
Unusual traffic spike from Asia-Pacific region.
</p>
</div>
<div className="rounded-md border border-emerald-500/10 bg-emerald-500/5 p-2 text-[11px]">
<p className="font-medium text-emerald-600 dark:text-emerald-400">
Optimization Tip
</p>
<p className="text-muted-foreground">
Reduce cache TTL for faster data propagation.
</p>
</div>
</CardContent>
</Card>
</BentoGrid>
);
}Feature Showcase
A premium "Bento Box" style feature grid perfect for SaaS landing pages and product showcases.
"use client";
import { Code2, Fingerprint, Globe2, ShieldCheck, Zap } from "lucide-react";
import { Badge } from "@/components/ui/badge";
import { Card, CardContent } from "@/components/ui/card";
import { BentoGrid } from "@/components/ui/bento-grid";
export function BentoGridPortfolioDemo() {
return (
<BentoGrid className="mx-auto max-w-7xl gap-4 p-4">
{/* Hero Feature - Security */}
<Card className="group relative overflow-hidden border-primary/20 bg-gradient-to-br from-primary/10 via-primary/5 to-background md:col-span-2 lg:row-span-2">
<CardContent className="flex h-full flex-col justify-between p-8">
<div className="relative z-10">
<div className="mb-6 inline-flex rounded-2xl bg-primary/10 p-4 ring-1 ring-primary/20">
<ShieldCheck className="h-10 w-10 text-primary" />
</div>
<h3 className="mb-4 font-bold text-3xl tracking-tight">
Enterprise-Grade <br />
<span className="text-primary">Security Infrastructure</span>
</h3>
<p className="max-w-md text-lg text-muted-foreground leading-relaxed">
Protect your data with military-grade encryption, multi-factor
authentication, and real-time threat detection.
</p>
</div>
<div className="mt-8 flex items-center gap-6">
<div className="-space-x-3 flex">
{[1, 2, 3, 4].map((i) => (
<div
key={i}
className="h-10 w-10 rounded-full border-2 border-background bg-muted ring-1 ring-primary/10"
/>
))}
</div>
<p className="font-medium text-muted-foreground text-sm">
Trusted by <span className="text-foreground">500+</span>{" "}
enterprises
</p>
</div>
</CardContent>
{/* Decorative background element */}
<div className="-bottom-12 -right-12 absolute h-64 w-64 rounded-full bg-primary/5 blur-3xl transition-all group-hover:bg-primary/10" />
</Card>
{/* Lightning Fast */}
<Card className="group border-border/50 bg-card/50 backdrop-blur-sm transition-all hover:border-amber-500/30">
<CardContent className="p-6">
<div className="mb-4 inline-flex rounded-xl bg-amber-500/10 p-3 ring-1 ring-amber-500/20">
<Zap className="h-6 w-6 text-amber-500" />
</div>
<h4 className="mb-2 font-bold text-xl">Lightning Fast</h4>
<p className="text-muted-foreground text-sm">
Experience sub-millisecond latency with our globally distributed
edge network.
</p>
<div className="mt-6 flex items-center gap-2">
<Badge
variant="secondary"
className="bg-amber-500/10 text-amber-600 dark:text-amber-400"
>
99.9% Uptime
</Badge>
</div>
</CardContent>
</Card>
{/* Global Scale */}
<Card className="group border-border/50 bg-card/50 backdrop-blur-sm transition-all hover:border-blue-500/30">
<CardContent className="p-6">
<div className="mb-4 inline-flex rounded-xl bg-blue-500/10 p-3 ring-1 ring-blue-500/20">
<Globe2 className="h-6 w-6 text-blue-500" />
</div>
<h4 className="mb-2 font-bold text-xl">Global Scale</h4>
<p className="text-muted-foreground text-sm">
Deploy your applications to over 200+ locations worldwide with a
single click.
</p>
<div className="mt-6 flex items-center gap-2">
<Badge
variant="secondary"
className="bg-blue-500/10 text-blue-600 dark:text-blue-400"
>
Edge Ready
</Badge>
</div>
</CardContent>
</Card>
{/* Developer Experience */}
<Card className="border-border/50 bg-card/50 backdrop-blur-sm transition-all hover:border-emerald-500/30 md:col-span-2">
<CardContent className="p-8">
<div className="flex flex-col justify-between gap-8 md:flex-row md:items-center">
<div className="flex-1">
<div className="mb-4 inline-flex rounded-xl bg-emerald-500/10 p-3 ring-1 ring-emerald-500/20">
<Code2 className="h-6 w-6 text-emerald-500" />
</div>
<h4 className="mb-2 font-bold text-2xl">Developer First</h4>
<p className="text-muted-foreground">
Comprehensive API documentation, SDKs for every language, and a
powerful CLI to streamline your workflow.
</p>
</div>
<div className="flex-1 rounded-xl border bg-background/50 p-4 font-mono text-xs">
<div className="mb-3 flex gap-1.5">
<div className="h-2 w-2 rounded-full bg-rose-500/50" />
<div className="h-2 w-2 rounded-full bg-amber-500/50" />
<div className="h-2 w-2 rounded-full bg-emerald-500/50" />
</div>
<p className="text-emerald-500">$ npm install @jolyui/core</p>
<p className="mt-1 text-muted-foreground">
{/* Initialize the client */}
</p>
<p className="text-blue-500">
const <span className="text-foreground">client</span> ={" "}
<span className="text-purple-500">new</span>{" "}
<span className="text-amber-500">JolyClient</span>();
</p>
</div>
</div>
</CardContent>
</Card>
{/* Biometric Auth */}
<Card className="group border-border/50 bg-card/50 backdrop-blur-sm transition-all hover:border-purple-500/30">
<CardContent className="p-6">
<div className="mb-4 inline-flex rounded-xl bg-purple-500/10 p-3 ring-1 ring-purple-500/20">
<Fingerprint className="h-6 w-6 text-purple-500" />
</div>
<h4 className="mb-2 font-bold text-xl">Biometric Auth</h4>
<p className="text-muted-foreground text-sm">
Native support for FaceID, TouchID, and WebAuthn for seamless
security.
</p>
<div className="mt-6">
<div className="h-1 w-full rounded-full bg-muted">
<div className="h-full w-3/4 rounded-full bg-purple-500" />
</div>
</div>
</CardContent>
</Card>
</BentoGrid>
);
}Installation
CLI
npx shadcn@latest add "https://jolyui.dev/r/bento-grid"Manual
Copy and paste the following code into your project. component/ui/bento-grid.tsx
import * as React from "react";
import { cn } from "@/lib/utils";
interface BentoGridProps extends React.HTMLAttributes<HTMLDivElement> {
children: React.ReactNode;
}
const BentoGrid = React.forwardRef<HTMLDivElement, BentoGridProps>(
({ className, children, ...props }, ref) => {
return (
<div
ref={ref}
className={cn(
"grid auto-rows-[minmax(180px,1fr)] grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3",
className,
)}
{...props}
>
{children}
</div>
);
},
);
BentoGrid.displayName = "BentoGrid";
export { BentoGrid };API Reference
Prop
Type
Notes
- Responsive grid that adapts from 1 column on mobile to 3 columns on large screens
- Uses CSS Grid with auto-rows for consistent item heights
- Perfect for dashboard layouts, portfolio displays, and content grids
- Items can span multiple columns and rows using standard CSS Grid classes
- Supports all standard div props and custom className for styling
How is this guide?
Animated Table
React data table with sorting, filtering, pagination, and row expansion. Smooth animations on interactions. Built on Radix primitives.
Code Block
Syntax-highlighted code block for React. Copy button, line numbers, file tabs, and terminal styling. Built on Shiki for accurate highlighting.