Project Grid
ComponentsProject Grid
SectionsNew

Project Grid

A portfolio section that earns its space: filter by discipline, scan the work, and open the full case study.

USE IT FORAgency portfoliosCase study galleriesProject collections
React + CSS
01

Installation

Run this in your shadcn-configured React project. The component and stylesheet are added together.

TERMINAL
npx shadcn@latest add http://localhost:5173/r/project-grid.json

This command uses the current site address. For localhost, keep this preview running on the same computer. Files follow your configured components alias.

02

Usage

Import the component and make the details your own.

TypeScript
import { ProjectGrid } from '@/components/anticraft/ProjectGrid';

export function Example() {
  return (
    <ProjectGrid
      title="Selected partnerships"
      items={[
        {
          id: 'kin', title: 'KIN', category: 'Web', href: '/work/kin', year: '2026',
          description: 'Everyday objects. A better shopping experience.',
          media: <div style={{ display: 'grid', placeItems: 'center', background: '#b9c396', color: '#2e3b28', fontSize: 64, fontWeight: 600 }}>KIN</div>,
        },
        {
          id: 'forma', title: 'FORMA', category: 'Brand', href: '/work/forma', year: '2026',
          description: 'A new identity for the way we work.',
          media: <div style={{ display: 'grid', placeItems: 'center', background: '#c85332', color: '#f9e7c6', fontSize: 48, fontFamily: 'Georgia, serif' }}>Forma.</div>,
        },
        {
          id: 'folio', title: 'FOLIO', category: 'Product', href: '/work/folio', year: '2025',
          description: 'Making personal finance feel personal.',
          media: <div style={{ display: 'grid', placeItems: 'center', background: '#c9b9dc', color: '#44315b', fontSize: 48 }}>folio↗</div>,
        },
      ]}
    />
  );
}
03

Props

PropTypeDefaultDescription
itemsProjectGridItem[]RequiredProject cards. Every item needs a unique id, title, category, href and decorative ReactNode media; description and year are optional. Replace the example /work/… URLs with your actual case-study routes. An empty list shows a short empty state.
titlestring'Selected work'The section heading. It also supplies the section’s accessible name.
labelstring'Project categories'An accessible name for the category button group.
onFilterChange(category: string) => voidundefinedReceives the selected category, or All for the full collection. Use a client component when passing a callback. Filtering keeps keyboard focus on the button and announces the number of matching projects.
classNamestring''Additional classes. Customize --ac-project-ink, --ac-project-muted, --ac-project-line, --ac-project-accent, --ac-project-radius and --ac-project-selected-ink. Two columns become one when the component itself is 420px wide or narrower.
item.mediaReactNodeRequiredDecorative artwork or an image with alt="". It fills a 4:3 surface, or 5:3 in the compact layout. Media is hidden from assistive technology and made inert; keep it free of links, buttons and other controls. Put essential information in title and description.
04

Motion & accessibility

Considered by default.

Category buttons filter the visible linked cards immediately. Matching cards enter with a short 9px rise; pointer hover adds a subtle artwork zoom and turns the arrow. Touch users get every project through ordinary links without hover. Reduced motion removes the entrance, zoom transition and arrow transition. The demo opens small local case studies; installed cards follow your supplied href URLs.

Use semantic content and meaningful labels in your composition. Check contrast and keyboard behavior with your own styles and content.

05

Inspiration

Instrument’s recent-work categories and linked case cards informed this practical portfolio structure. Anticraft’s artwork, filtering implementation, responsive layout and motion are original.

Visit Instrument — Work

The component source and demo artwork are original to Anticraft UI. The linked site is the design or content reference.