All components
Bento Grid
cardsBento grid is a layout used to showcase the features of a product in a simple and elegant way.
responsive · 640px
Install
Same command in any shadcn project — React (Vite/CRA), Next.js, Remix, Astro, and more:
$
npx shadcn@latest add https://your-domain/r/magic-ui-bento-grid.jsonUsage
import { BentoCard, BentoGrid } from "@/registry/magic-ui/bento-grid";
import { BellIcon, Share2Icon, FileTextIcon, GlobeIcon } from "lucide-react";
const features = [
{
Icon: FileTextIcon,
name: "Save your files",
description: "We automatically save your files as you type.",
href: "#",
cta: "Learn more",
background: (
<div className="absolute inset-0 bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-950 dark:to-blue-900" />
),
className: "lg:row-start-1 lg:row-end-4 lg:col-start-2 lg:col-end-3",
},
{
Icon: Share2Icon,
name: "Integrations",
description: "Supports 100+ integrations and counting.",
href: "#",
cta: "Learn more",
background: (
<div className="absolute inset-0 bg-gradient-to-br from-purple-50 to-purple-100 dark:from-purple-950 dark:to-purple-900" />
),
className: "lg:col-start-1 lg:col-end-2 lg:row-start-1 lg:row-end-3",
},
{
Icon: GlobeIcon,
name: "Multilingual",
description: "Supports 100+ languages and counting.",
href: "#",
cta: "Learn more",
background: (
<div className="absolute inset-0 bg-gradient-to-br from-green-50 to-green-100 dark:from-green-950 dark:to-green-900" />
),
className: "lg:col-start-1 lg:col-end-2 lg:row-start-3 lg:row-end-4",
},
{
Icon: BellIcon,
name: "Notifications",
description: "Get notified when something happens.",
href: "#",
cta: "Learn more",
background: (
<div className="absolute inset-0 bg-gradient-to-br from-orange-50 to-orange-100 dark:from-orange-950 dark:to-orange-900" />
),
className: "lg:col-start-3 lg:col-end-3 lg:row-start-1 lg:row-end-2",
},
];
export default function Demo() {
return (
<div className="w-full max-w-4xl p-4">
<BentoGrid>
{features.map((feature) => (
<BentoCard key={feature.name} {...feature} />
))}
</BentoGrid>
</div>
);
}Component source
import { type ComponentPropsWithoutRef, type ReactNode } from "react"
import { ArrowRightIcon } from "@radix-ui/react-icons"
import { cn } from "@/lib/utils"
import { Button } from "@/components/ui/button"
interface BentoGridProps extends ComponentPropsWithoutRef<"div"> {
children: ReactNode
className?: string
}
interface BentoCardProps extends ComponentPropsWithoutRef<"div"> {
name: string
className: string
background: ReactNode
Icon: React.ElementType
description: string
href: string
cta: string
}
const BentoGrid = ({ children, className, ...props }: BentoGridProps) => {
return (
<div
className={cn(
"grid w-full auto-rows-[22rem] grid-cols-3 gap-4",
className
)}
{...props}
>
{children}
</div>
)
}
const BentoCard = ({
name,
className,
background,
Icon,
description,
href,
cta,
...props
}: BentoCardProps) => (
<div
key={name}
className={cn(
"group relative col-span-3 flex flex-col justify-between overflow-hidden rounded-xl",
// light styles
"bg-background [box-shadow:0_0_0_1px_rgba(0,0,0,.03),0_2px_4px_rgba(0,0,0,.05),0_12px_24px_rgba(0,0,0,.05)]",
// dark styles
"dark:bg-background transform-gpu dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset] dark:[border:1px_solid_rgba(255,255,255,.1)]",
className
)}
{...props}
>
<div>{background}</div>
<div className="p-4">
<div className="pointer-events-none z-10 flex transform-gpu flex-col gap-1 transition-all duration-300 lg:group-hover:-translate-y-10">
<Icon className="h-12 w-12 origin-left transform-gpu text-neutral-700 transition-all duration-300 ease-in-out group-hover:scale-75" />
<h3 className="text-xl font-semibold text-neutral-700 dark:text-neutral-300">
{name}
</h3>
<p className="max-w-lg text-neutral-400">{description}</p>
</div>
<div
className={cn(
"pointer-events-none flex w-full translate-y-0 transform-gpu flex-row items-center transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:hidden"
)}
>
<Button
variant="link"
asChild
size="sm"
className="pointer-events-auto p-0"
>
<a href={href}>
{cta}
<ArrowRightIcon className="ms-2 h-4 w-4 rtl:rotate-180" />
</a>
</Button>
</div>
</div>
<div
className={cn(
"pointer-events-none absolute bottom-0 hidden w-full translate-y-10 transform-gpu flex-row items-center p-4 opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 lg:flex"
)}
>
<Button
variant="link"
asChild
size="sm"
className="pointer-events-auto p-0"
>
<a href={href}>
{cta}
<ArrowRightIcon className="ms-2 h-4 w-4 rtl:rotate-180" />
</a>
</Button>
</div>
<div className="pointer-events-none absolute inset-0 transform-gpu transition-all duration-300 group-hover:bg-black/3 group-hover:dark:bg-neutral-800/10" />
</div>
)
export { BentoCard, BentoGrid }Dependencies
@radix-ui/react-icons
Registry dependencies
button
Source: Magic UI