Animated Image Grid
shadcn-extras/animated-image-gridFreeComponent
A fluid CSS grid that beautifully reflows items when they are added or removed.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/NayanDevLab/shadcn-extras/dev/public/c/animated-image-grid.jsonSource
1import * as React from 'react';2import { cn } from '@/lib/utils';3import './animated-image-grid.css';45import { cva, type VariantProps } from 'class-variance-authority';67const itemVariants = cva(8 'animated-image-grid-item overflow-hidden transition-all duration-300',9 {10 variants: {11 variant: {12 default: 'rounded-lg border-2 border-primary/20 shadow-sm',13 circle: 'rounded-full border-4 border-white shadow-md',14 polaroid: 'rounded-sm bg-white p-2 pb-8 shadow-lg',15 minimal: 'rounded-md shadow-none border-none',16 },17 },18 defaultVariants: {19 variant: 'default',20 },21 }22);2324export interface AnimatedImageGridItem {25 id: string | number;26 src: string;27 alt?: string;28}2930export interface AnimatedImageGridProps31 extends32 React.HTMLAttributes<HTMLDivElement>,33 VariantProps<typeof itemVariants> {34 items: AnimatedImageGridItem[];35 gap?: string;36 size?: string;37 itemClassName?: string;38 imageClassName?: string;39}4041export const AnimatedImageGrid = React.forwardRef<42 HTMLDivElement,43 AnimatedImageGridProps44>(45 (46 {47 className,48 items,49 gap,50 size,51 variant,52 itemClassName,53 imageClassName,54 style,55 ...props56 },57 ref58 ) => {59 // Inject the customizable gap and size variables if provided60 const customStyle = {61 ...(gap ? { '--grid-gap': gap } : {}),62 ...(size ? { '--grid-size': size } : {}),63 ...style,64 } as React.CSSProperties;6566 return (67 <div68 ref={ref}69 className={cn('animated-image-grid h-full w-full p-4', className)}70 style={customStyle}71 {...props}72 >73 {items.map((item, index) => (74 <div75 key={item.id}76 className={cn(itemVariants({ variant }), itemClassName)}77 style={{ '--index': index } as React.CSSProperties}78 >79 {/* eslint-disable-next-line @next/next/no-img-element */}80 <img81 src={item.src}82 alt={item.alt || `Grid image ${index}`}83 className={cn('h-full w-full object-cover', imageClassName)}84 />85 </div>86 ))}87 {/* Hidden filler element required to stretch the container height hack */}88 <div89 className='animated-image-grid-item animated-image-grid-filler'90 style={{ '--index': items.length } as React.CSSProperties}91 />92 </div>93 );94 }95);96// … truncated
Files it writes
More from shadcn-extras
All 33 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Blog Card Fourblog-card-four | shadcn-extras | Components | Free | 1 dep | |
| Blog Card Oneblog-card-one | shadcn-extras | Components | Free | no deps | |
| Blog Card Threeblog-card-three | shadcn-extras | Components | Free | 1 dep | |
| Blog Card Twoblog-card-two | shadcn-extras | Components | Free | 1 dep | |
| Bulb Iconbulb-icon | shadcn-extras | Components | Free | 2 deps | |
| Chevron Stepschevron-steps | shadcn-extras | Components | Free | no deps | |
| Circular Gallerycircular-gallery | shadcn-extras | Components | Free | no deps · 3 files | |
| Clock Iconclock-icon | shadcn-extras | Components | Free | 2 deps |
