Docs
Bento Grid Features

Bento Grid Features

A modern asymmetric grid layout for showcasing features. Beautiful bento-style design with flexible sizing and optional images.

Everything you need to build amazing products

Powerful features and tools designed for modern development teams.

Developer Tools

Built-in DevTools offer insights, transparency, and easy management of your app's performance and configurations.

Beautiful Design

Create stunning interfaces with our comprehensive design system and component library.

Lightning Fast

Optimized performance with edge computing and global CDN distribution.

Global Infrastructure

Deploy to 150+ edge locations worldwide for optimal performance everywhere.

Enterprise Security

Bank-level encryption, SOC 2 compliance, and advanced security features to protect your data.

Analytics Dashboard

Real-time insights with customizable dashboards and detailed reporting.

Features

  • Asymmetric layout - Modern bento grid design
  • Flexible sizing - Span columns, rows, or both
  • Icon support - Lucide icons with colored backgrounds
  • Visual elements - Add custom React components as visuals
  • Hover effects - Smooth transitions and border animations
  • Clean design - Pure black background with zinc accents
  • Responsive - Adapts from 1 to 3 columns
  • TypeScript support - Full type safety
  • Customizable - Easy to style and extend

Installation

Copy and paste the following code into your project.

import { LucideIcon } from "lucide-react";
import { ReactNode } from "react";
 
interface BentoFeature {
  title: string;
  description: string;
  icon?: LucideIcon;
  span?: "col" | "row" | "both";
  visual?: ReactNode;
  className?: string;
}
 
interface FeatureBentoGridProps {
  headline: string;
  description?: string;
  features: BentoFeature[];
}
 
export function FeatureBentoGrid({
  headline,
  description,
  features,
}: FeatureBentoGridProps) {
  const getSpanClass = (span?: "col" | "row" | "both") => {
    switch (span) {
      case "col":
        return "md:col-span-2";
      case "row":
        return "md:row-span-2";
      case "both":
        return "md:col-span-2 md:row-span-2";
      default:
        return "";
    }
  };
 
  return (
    <section className="w-full bg-black py-12 sm:py-16 lg:py-20">
      <div className="container px-4 md:px-6">
        <div className="mx-auto max-w-3xl space-y-4 text-center">
          <h2 className="text-3xl font-bold tracking-tighter text-white sm:text-4xl md:text-5xl">
            {headline}
          </h2>
          {description && (
            <p className="text-lg text-zinc-400 md:text-xl">{description}</p>
          )}
        </div>
 
        <div className="mx-auto mt-12 grid max-w-6xl gap-4 md:grid-cols-2 lg:grid-cols-3">
          {features.map((feature, index) => {
            const Icon = feature.icon;
 
            return (
              <div
                key={index}
                className={`group relative overflow-hidden rounded-2xl border border-zinc-800/50 bg-zinc-950 p-8 transition-all hover:border-zinc-700 ${getSpanClass(
                  feature.span,
                )} ${feature.className || ""}`}
              >
                <div className="relative">
                  {Icon && (
                    <div className="mb-6 flex items-center gap-3">
                      <div className="rounded-lg bg-blue-500/10 p-2">
                        <Icon className="h-5 w-5 text-blue-400" />
                      </div>
                      <div>
                        <h3 className="text-xl font-semibold text-white">
                          {feature.title}
                        </h3>
                      </div>
                    </div>
                  )}
                  {!Icon && (
                    <h3 className="mb-4 text-xl font-semibold text-white">
                      {feature.title}
                    </h3>
                  )}
                  <p className="text-sm leading-relaxed text-zinc-500">
                    {feature.description}
                  </p>
                </div>
 
                {feature.visual && (
                  <div className="relative mt-6">{feature.visual}</div>
                )}
              </div>
            );
          })}
        </div>
      </div>
    </section>
  );
}

Usage

Basic Usage

import FeatureBentoGrid from "@/components/ui/feature-bento-grid";
import { Zap, Shield, Users } from "lucide-react";
 
export default function Page() {
    return (
        <FeatureBentoGrid
            headline="Powerful Features"
            description="Everything you need in one place."
            features={[
                {
                    title: "Lightning Fast",
                    description: "Blazing fast performance with edge computing.",
                    icon: Zap,
                },
                {
                    title: "Secure",
                    description: "Enterprise-grade security and compliance.",
                    icon: Shield,
                },
                {
                    title: "Collaborative",
                    description: "Work together seamlessly in real-time.",
                    icon: Users,
                },
            ]}
        />
    );
}

With Spanning

<FeatureBentoGrid
    headline="Everything you need"
    features={[
        {
            title: "Feature 1",
            description: "Spans 2 columns",
            icon: Zap,
            span: "col", // Spans 2 columns
        },
        {
            title: "Feature 2",
            description: "Spans 2 rows",
            icon: Shield,
            span: "row", // Spans 2 rows
        },
        {
            title: "Feature 3",
            description: "Spans 2 columns and 2 rows",
            icon: Users,
            span: "both", // Spans both
        },
        {
            title: "Feature 4",
            description: "Normal size",
            icon: Lock,
        },
    ]}
/>

With Visual Elements

<FeatureBentoGrid
    headline="Visual Features"
    features={[
        {
            title: "Dashboard",
            description: "Beautiful analytics dashboard.",
            icon: BarChart,
            span: "col",
            visual: (
                <div className="flex h-24 items-end gap-2">
                    {[40, 70, 45, 80, 55, 90].map((height, i) => (
                        <div
                            key={i}
                            className="w-full rounded-t bg-gradient-to-t from-blue-500 to-blue-400"
                            style={{ height: `${height}%` }}
                        />
                    ))}
                </div>
            ),
        },
        {
            title: "Security",
            description: "Enterprise-grade protection.",
            icon: Shield,
            visual: (
                <div className="flex items-center justify-center py-8">
                    <div className="flex h-24 w-24 items-center justify-center rounded-full border-4 border-blue-500/20 bg-blue-500/10">
                        <Shield className="h-12 w-12 text-blue-500" />
                    </div>
                </div>
            ),
        },
    ]}
/>

Props

PropTypeDefaultDescription
headlinestringRequiredSection headline
descriptionstringundefinedOptional description
featuresBentoFeature[]RequiredArray of features

TypeScript Interface

interface FeatureBentoGridProps {
    headline: string;
    description?: string;
    features: BentoFeature[];
}
 
interface BentoFeature {
    title: string;
    description: string;
    icon?: LucideIcon;
    visual?: ReactNode;
    span?: "col" | "row" | "both";
    className?: string;
}

Span Options

Control how features span across the grid:

  • span: "col" - Spans 2 columns (wider)
  • span: "row" - Spans 2 rows (taller)
  • span: "both" - Spans 2 columns and 2 rows (large)
  • No span - Normal 1x1 size

Grid Behavior

  • Mobile: Single column layout
  • Tablet (md): 2 columns
  • Desktop (lg): 3 columns

Spanning only applies on medium screens and above.

Use Cases

Perfect for:

  • Feature showcases
  • Product highlights
  • Service offerings
  • Capability overviews
  • Platform features
  • Tool collections
  • Benefit displays
  • Portfolio items