Built for modern teams
Features
- ✅ 3-column responsive grid - Adapts to 2 columns on tablet, 1 on mobile
- ✅ Gradient icons - Beautiful gradient backgrounds for all icons
- ✅ Smooth animations - Staggered fade-in with 100ms delays
- ✅ Hover effects - Scale, glow, and shadow animations
- ✅ Color variety - 9 unique gradient colors that cycle
- ✅ Optional badge - Add a category badge above headline
- ✅ Optional description - Include a subheading
- ✅ Shadcn components - Built with Card and Badge
- ✅ TypeScript support - Full type safety
- ✅ Production-ready - Premium polish, copy and paste to use
Installation
Copy and paste the following code into your project.
"use client";
import { Badge } from "@/components/ui/badge";
import { Card, CardContent } from "@/components/ui/card";
import { LucideIcon } from "lucide-react";
interface Feature {
icon: LucideIcon;
title: string;
description: string;
}
interface FeatureGrid3ColProps {
badge?: string;
headline: string;
description?: string;
features: Feature[];
}
export function FeatureGrid3Col({
badge,
headline,
description,
features,
}: FeatureGrid3ColProps) {
const colors = [
"from-blue-500 to-cyan-500",
"from-purple-500 to-pink-500",
"from-orange-500 to-amber-500",
"from-green-500 to-emerald-500",
"from-red-500 to-rose-500",
"from-indigo-500 to-violet-500",
"from-yellow-500 to-orange-500",
"from-teal-500 to-cyan-500",
"from-fuchsia-500 to-pink-500",
];
return (
<section className="relative overflow-hidden py-24 sm:py-32">
<div className="absolute inset-0 -z-10">
<div className="absolute left-1/2 top-0 -z-10 h-[600px] w-[600px] -translate-x-1/2 rounded-full bg-gradient-to-br from-primary/20 via-primary/5 to-transparent blur-3xl" />
<div className="absolute right-0 top-1/2 -z-10 h-[400px] w-[400px] -translate-y-1/2 rounded-full bg-gradient-to-l from-purple-500/10 to-transparent blur-3xl" />
</div>
<div className="container mx-auto px-6">
<div className="mx-auto mb-16 max-w-3xl text-center">
{badge && (
<div className="mb-6 inline-flex animate-in fade-in slide-in-from-bottom-3 duration-700">
<Badge
variant="outline"
className="border-primary/20 bg-primary/10 px-4 py-1.5 text-sm font-medium text-primary backdrop-blur-sm"
>
<span className="relative mr-2 flex h-2 w-2">
<span className="absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-75"></span>
<span className="relative inline-flex h-2 w-2 rounded-full bg-primary"></span>
</span>
{badge}
</Badge>
</div>
)}
<h2 className="mb-6 animate-in fade-in slide-in-from-bottom-4 text-4xl font-bold tracking-tight duration-1000 sm:text-5xl md:text-6xl">
{headline}
</h2>
{description && (
<p className="animate-in fade-in slide-in-from-bottom-5 text-lg leading-relaxed text-muted-foreground duration-1000 sm:text-xl">
{description}
</p>
)}
</div>
<div className="grid gap-8 sm:grid-cols-2 lg:grid-cols-3">
{features.map((feature, index) => {
const Icon = feature.icon;
const gradientColor = colors[index % colors.length];
return (
<div
key={index}
className="group relative animate-in fade-in slide-in-from-bottom-6 duration-1000"
style={{ animationDelay: `${index * 100}ms` }}
>
<div
className={`absolute -inset-0.5 rounded-2xl bg-gradient-to-r ${gradientColor} opacity-0 blur transition-all duration-500 group-hover:opacity-20`}
/>
<Card className="relative h-full border-border/50 bg-card/50 backdrop-blur-sm transition-all duration-300 hover:border-border hover:bg-card hover:shadow-xl">
<CardContent className="p-8">
<div className="mb-6 inline-flex">
<div
className={`relative rounded-xl bg-gradient-to-br ${gradientColor} p-4 shadow-lg transition-all duration-300 group-hover:scale-110 group-hover:shadow-xl`}
>
<Icon className="h-7 w-7 text-white" />
</div>
</div>
<h3 className="mb-3 text-2xl font-semibold tracking-tight transition-colors">
{feature.title}
</h3>
<p className="leading-relaxed text-muted-foreground">
{feature.description}
</p>
<div className="absolute right-6 top-6 h-10 w-10 opacity-0 transition-opacity duration-300 group-hover:opacity-100">
<div
className={`h-full w-full rounded-full bg-gradient-to-br ${gradientColor} opacity-20 blur-lg`}
/>
</div>
</CardContent>
</Card>
</div>
);
})}
</div>
</div>
</section>
);
}Update the import paths to match your project setup.
Usage
Basic Usage
import FeatureGrid3Col from "@/components/ui/feature-grid-3col";
import { Zap, Shield, Sparkles } from "lucide-react";
export default function FeaturesPage() {
return (
<FeatureGrid3Col
headline="Why choose us"
features={[
{
icon: Zap,
title: "Lightning Fast",
description: "Optimized for speed and performance.",
},
{
icon: Shield,
title: "Secure",
description: "Enterprise-grade security built-in.",
},
{
icon: Sparkles,
title: "AI-Powered",
description: "Leverage cutting-edge AI technology.",
},
]}
/>
);
}With Badge and Description
<FeatureGrid3Col
badge="Features"
headline="Everything you need to succeed"
description="Powerful features to help you build, ship, and scale your product."
features={[
// ... your features
]}
/>Full Example with 9 Features
import FeatureGrid3Col from "@/components/ui/feature-grid-3col";
import {
Zap,
Shield,
Sparkles,
Rocket,
Lock,
Globe,
Code,
Users,
Database,
} from "lucide-react";
export default function FeaturesPage() {
return (
<FeatureGrid3Col
badge="Platform Features"
headline="Built for modern teams"
description="Everything you need to build, ship, and scale your product."
features={[
{
icon: Zap,
title: "Lightning Fast",
description:
"Optimized for speed with edge computing and global CDN.",
},
{
icon: Shield,
title: "Secure by Default",
description: "Enterprise-grade security with SOC 2 compliance.",
},
{
icon: Sparkles,
title: "AI-Powered",
description: "Leverage AI to automate workflows and boost productivity.",
},
{
icon: Rocket,
title: "Deploy Instantly",
description: "Push to production in seconds with zero downtime.",
},
{
icon: Globe,
title: "Global Scale",
description: "Serve millions worldwide with 99.99% uptime.",
},
{
icon: Code,
title: "Developer Friendly",
description: "Clean APIs and comprehensive documentation.",
},
{
icon: Users,
title: "Team Collaboration",
description: "Real-time collaboration with role-based access.",
},
{
icon: Lock,
title: "Privacy First",
description: "Your data stays yours. GDPR compliant.",
},
{
icon: Database,
title: "Reliable Storage",
description: "Distributed database with automatic backups.",
},
]}
/>
);
}Props
FeatureGrid3ColProps
| Prop | Type | Default | Description |
|---|---|---|---|
badge | string | undefined | Optional badge text above headline |
headline | string | Required | Main section headline |
description | string | undefined | Optional description below headline |
features | Feature[] | Required | Array of feature objects |
Feature Object
| Prop | Type | Description |
|---|---|---|
icon | LucideIcon | Icon component from lucide-react |
title | string | Feature title |
description | string | Feature description |
TypeScript Interface
import { LucideIcon } from "lucide-react";
interface Feature {
icon: LucideIcon;
title: string;
description: string;
}
interface FeatureGrid3ColProps {
badge?: string;
headline: string;
description?: string;
features: Feature[];
}Customization
Change Grid Columns
Adjust the grid layout:
{/* 2 columns on desktop */}
<div className="grid gap-8 sm:grid-cols-2">
{/* 4 columns on desktop */}
<div className="grid gap-8 sm:grid-cols-2 lg:grid-cols-4">Customize Icon Colors
The component uses 9 predefined gradient colors. To customize:
const colors = [
"from-red-500 to-rose-500",
"from-green-500 to-emerald-500",
"from-yellow-500 to-orange-500",
// Add more colors...
];Modify Card Style
Customize the card appearance:
<Card className="rounded-3xl border-2 bg-gradient-to-br from-background to-muted p-10">
{/* content */}
</Card>Adjust Icon Size
Change icon dimensions:
<div className="p-5">
<Icon className="h-8 w-8 text-white" />
</div>Use Cases
Perfect for:
- Product feature pages
- Service offerings
- Platform capabilities
- Benefits sections
- Value propositions
- Technology showcases
- Tool comparisons
- Key differentiators
Best Practices
- Optimal feature count - 6-9 features work best for 3-column layout
- Keep descriptions concise - 1-2 sentences per feature
- Use consistent icons - Stick to one icon style (outline or filled)
- Prioritize features - Put most important features first
- Mobile optimization - Test on mobile devices
- Icon relevance - Choose icons that clearly represent the feature
- Balanced content - Keep similar description lengths