Skip to content

Features Grid

Six features in a single ruled box (1/2/3 columns) with numbered tiles, color-cycling icon blocks that press on hover, and a two-column section header.

brutalist/section/features-grid
Open ↗

Source

import { Bell, GitMerge, Globe, Languages, LayoutTemplate, Sparkles, type LucideIcon } from "lucide-react";
import { cn } from "@/lib/utils";

export interface FeaturesGridItem {
  icon: LucideIcon;
  title: string;
  description: string;
}

export interface FeaturesGridProps {
  kicker?: string;
  title?: string;
  description?: string;
  features?: FeaturesGridItem[];
  className?: string;
}

const DEFAULT_FEATURES: FeaturesGridItem[] = [
  {
    icon: GitMerge,
    title: "From merge to changelog",
    description: "Connect GitHub or GitLab. Every merged PR with a label becomes a draft entry — grouped, deduplicated, ready to publish.",
  },
  {
    icon: Sparkles,
    title: "AI release summaries",
    description: "Turn 40 commit messages into three sentences your customers understand. You always review before it ships.",
  },
  {
    icon: Bell,
    title: "In-app widget",
    description: "A 9 kB launcher that shows unread updates right inside your product. Badge counts, deep links, no iframe.",
  },
  {
    icon: LayoutTemplate,
    title: "Hosted changelog page",
    description: "A fast, SEO-friendly public page on your domain with RSS, search and per-release permalinks.",
  },
  {
    icon: Languages,
    title: "Localized in 24 languages",
    description: "Machine translation with a glossary you control. Customers read updates in the language of their workspace.",
  },
  {
    icon: Globe,
    title: "Email & Slack digests",
    description: "Weekly or per-release digests to subscribers and your own #releases channel. Zero copy-pasting.",
  },
];

const TILE_ACCENTS = ["bg-da-primary text-da-primary-fg", "bg-da-accent text-da-accent-fg", "bg-da-secondary text-da-secondary-fg"];

export function FeaturesGrid({
  kicker = "[ 02 ] What you get",
  title = "Everything between “merged” and “my users know about it”.",
  description = "Shipyard plugs into the tools you already use and does the boring part of communicating releases.",
  features = DEFAULT_FEATURES,
  className,
}: FeaturesGridProps) {
  return (
    <section className={cn("da-section da-stroke-b bg-da-bg text-da-fg", className)} aria-labelledby="features-grid-title">
      <div className="da-container">
        <div className="grid gap-6 lg:grid-cols-[1fr_1fr] lg:items-end">
          <div>
            <p className="font-da-mono text-xs font-bold tracking-da-label text-da-muted-fg uppercase">{kicker}</p>
            <h2 id="features-grid-title" className="mt-3 font-da-display text-[clamp(2rem,5vw,3.5rem)] leading-[0.95] tracking-da-display uppercase">
              {title}
            </h2>
          </div>
          <p className="max-w-md text-lg text-da-muted-fg lg:justify-self-end">{description}</p>
        </div>

        {/* Grid rules are the 3px gaps revealing the border color behind the tiles. */}
        <ul className="da-stroke mt-12 grid gap-(--da-border-width) bg-da-border text-da-surface-fg shadow-da-lg sm:grid-cols-2 lg:grid-cols-3">
          {features.map((f, i) => {
            const Icon = f.icon;
            return (
              <li
                key={f.title}
                className="group flex flex-col gap-4 bg-da-surface p-6 sm:p-8"
              >
                <div className="flex items-center justify-between">
                  <span
                    className={cn(
                      "da-stroke da-transition grid size-12 place-items-center shadow-da-sm group-hover:translate-x-[3px] group-hover:translate-y-[3px] group-hover:shadow-none",
                      TILE_ACCENTS[i % TILE_ACCENTS.length],
                    )}
                  >
                    <Icon aria-hidden className="size-6" strokeWidth={2.25} />
                  </span>
                  <span aria-hidden className="font-da-mono text-xs font-bold text-da-muted-fg">
                    {String(i + 1).padStart(2, "0")}
                  </span>
                </div>
                <h3 className="text-xl leading-tight font-bold">{f.title}</h3>
                <p className="text-da-muted-fg">{f.description}</p>
              </li>
            );
          })}
        </ul>
      </div>
    </section>
  );
}

export default FeaturesGrid;

modules/brutalist/section/features-grid/index.tsx

Props

PropTypeDefaultDescription
kickerstring"[ 02 ] What you get"Mono label above the title.
titlestring—Section title (h2).
descriptionstring—Paragraph aligned right of the title on desktop.
featuresFeaturesGridItem[]6 Shipyard features{ icon: LucideIcon, title, description }. Works best with 3, 6 or 9 items.
classNamestring—Extra classes on the <section>.

Other features variants in Brutalist

Features in other art directions

Features Bento

Glass bento grid on 6 columns: a large AI-recap tile with a mock summary and owner chips, plus five smaller frosted tiles with gradient squircle icons.

GlassFeatures

Features Glass Grid

Centered header and six frosted feature cards with gradient squircle icons; cards lift with an overshoot and reveal a soft corner glow on hover.

GlassFeatures

Features Orbit

Integrations section: copy with a chip list on one side, and a central gradient orb with integration bubbles orbiting on two counter-rotating glass rings (bubbles stay upright). Pure CSS.

GlassFeatures

Features Tabs

Glass pill tab bar (Radix Tabs) with gradient active tab switching a large frosted panel: title, copy and bullets on the left, a layered glass preview on the right.

GlassFeatures

Features Alternating

Three zig-zag rows, each pairing a numbered kicker, title, copy and link with an HTML product mock-up (routing rules, on-call week, AI postmortem) on a soft tinted plate.

MinimalFeatures

Features Bento

Bento grid of five hairline tiles on a 6-column layout, each with a small token-themed HTML illustration (routing lines, uptime bars, MTTR metric, on-call week) above an icon, title and description.

MinimalFeatures

Features List

Dense four-column feature list: each item has a small indigo line icon, a title and a one-sentence description under a hairline top rule. Eight defaults, left-aligned header.

MinimalFeatures

Features Steps

Five-step workflow (detect, page, coordinate, resolve, learn) laid out horizontally on desktop and vertically on mobile, joined by a hairline, with numbered nodes and timing labels.

MinimalFeatures

Features Index

Features as a numbered index: a label + headline in the left columns, and a two-column ruled list on the right where each item is “01 — Title” with a short description.

Mono CleanFeatures

Features Numbered

Three large numbered steps: giant outlined-looking numerals in muted ink above a hairline, step title and text; columns on desktop, stacked on mobile.

Mono CleanFeatures

Features Showcase

Work showcase as the feature: an asymmetric grid (fixed row heights; wide, tall, square and full-width spans) of neutral gray image frames with mono captions (studio — project, template used); captions underline on hover.

Mono CleanFeatures

Features Specs

Technical spec sheet: grouped key/value definition lists in a 4-column grid, each group under a full-ink rule with a mono heading — reads like a product data sheet.

Mono CleanFeatures

Features Bento

Data-driven bento grid of bordered cards: cash-flow line chart, DSO metric, approval flow, currency list and integrations — each a small realistic mock.

Neo CorporateFeatures

Features Grid

Classic 3×2 bordered feature grid sharing hairline borders (one outer frame), each cell with a blue icon square, title, text and a “Learn more” link.

Neo CorporateFeatures

Features Tabs

Underline tabs (Radix Tabs) switching between product areas: copy + check points on the left, a bordered data card (status rows) on the right.

Neo CorporateFeatures

Features Versus

Before/after comparison: a muted “spreadsheets and email” column with red crosses next to a blue-bordered “with Ledgerly” column with green checks.

Neo CorporateFeatures

Features Alternating

Alternating zig-zag rows: copy with check points on one side, a soft blob-shaped tinted panel holding a small product vignette (suppliers, actions, report) on the other.

Organic SoftFeatures

Features Bento

Soft bento: rounded tinted tiles of mixed sizes — a monthly emissions bar chart, a human equivalence (“= 42 flights”), supplier avatars, a certifications tile and a leaf quote.

Organic SoftFeatures

Features Cards

Three tall rounded cards in sage, clay and paper tints; each has an icon sitting in an organic blob, a serif title and calm copy.

Organic SoftFeatures

Features Journey

Horizontal journey: numbered circles connected by a hand-drawn wavy dashed path (vertical list on mobile), each step with a serif title, text and a mono time estimate.

Organic SoftFeatures

Features Checklist

Interactive split section: copy and a mint progress bar on the left, a white card of four round-checkbox steps on the right that turn mint with a bouncy tick when clicked; celebration at 100%.

Soft FlatFeatures

Features Icons

Centered 4-column grid of eight small features, each with a large round pastel icon badge (colors rotate), rounded title and one-liner.

Soft FlatFeatures

Features Pastel

2×2 grid of large pastel feature cards (peach, mint, lavender, butter), each with icon, rounded title, copy and a tiny flat illustration (mini board, bar week, reminder toast, chat bubbles).

Soft FlatFeatures

Features Steps

Three numbered step cards in peach, lavender and mint joined by a dashed path on desktop, each with a white emoji medallion, mono step label, title and text.

Soft FlatFeatures