Features Versus
Before/after comparison: two slightly tilted cards side by side — the old way in paper with red crosses, the new way in solid yellow with ink checks — row by row on the same topics.
brutalist/section/features-versusSource
import { Check, X } from "lucide-react";
import { cn } from "@/lib/utils";
export interface FeaturesVersusRow {
topic: string;
before: string;
after: string;
}
export interface FeaturesVersusProps {
kicker?: string;
title?: string;
beforeLabel?: string;
afterLabel?: string;
rows?: FeaturesVersusRow[];
className?: string;
}
export function FeaturesVersus({
kicker = "[ 04 ] Before / after",
title = "The old way was a Google Doc.",
beforeLabel = "Without Shipyard",
afterLabel = "With Shipyard",
rows = [
{ topic: "Writing notes", before: "PM chases engineers on Friday", after: "Drafted from merged PRs" },
{ topic: "Publishing", before: "Copy-paste to 4 tools", after: "One click, every channel" },
{ topic: "Translations", before: "Agency, 2 weeks", after: "24 languages, instantly" },
{ topic: "Adoption", before: "“Wait, we have that?”", after: "In-app badge, +2× usage" },
{ topic: "Cost", before: "~6 hours per release", after: "~10 minutes to review" },
],
className,
}: FeaturesVersusProps) {
return (
<section className={cn("da-section da-stroke-b bg-da-bg text-da-fg", className)} aria-labelledby="features-versus-title">
<div className="da-container">
<p className="font-da-mono text-xs font-bold tracking-da-label text-da-muted-fg uppercase">{kicker}</p>
<h2 id="features-versus-title" className="mt-3 font-da-display text-[clamp(2rem,5vw,3.5rem)] leading-[0.95] tracking-da-display uppercase">
{title}
</h2>
<div className="mt-12 grid gap-6 lg:grid-cols-2">
{([
{ label: beforeLabel, key: "before", tone: "bg-da-surface text-da-surface-fg", icon: X, iconTone: "bg-da-danger text-da-danger-fg", rotate: "lg:-rotate-1" },
{ label: afterLabel, key: "after", tone: "bg-da-primary text-da-primary-fg", icon: Check, iconTone: "bg-da-fg text-da-bg", rotate: "lg:rotate-1" },
] as const).map((col) => {
const Icon = col.icon;
return (
<div key={col.key} className={cn("da-stroke shadow-da-lg", col.tone, col.rotate)}>
<h3 className="da-stroke-b px-6 py-4 font-da-display text-2xl tracking-da-display uppercase">{col.label}</h3>
<dl>
{rows.map((r, i) => (
<div key={r.topic} className={cn("grid grid-cols-[auto_1fr] items-start gap-4 px-6 py-4", i > 0 && "da-stroke-t")}>
<span aria-hidden className={cn("da-stroke mt-0.5 grid size-6 place-items-center", col.iconTone)}>
<Icon className="size-3.5" strokeWidth={4} />
</span>
<div>
<dt className="font-da-mono text-[11px] font-bold tracking-da-label uppercase opacity-70">{r.topic}</dt>
<dd className="mt-0.5 text-lg font-bold">{col.key === "before" ? r.before : r.after}</dd>
</div>
</div>
))}
</dl>
</div>
);
})}
</div>
</div>
</section>
);
}
export default FeaturesVersus;
modules/brutalist/section/features-versus/index.tsx
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| kicker | string | — | Mono label. |
| title | string | — | Section title (h2). |
| beforeLabel / afterLabel | string | — | Column headings. |
| rows | FeaturesVersusRow[] | — | { topic, before, after }[]. |
| className | string | — | Classes on the <section>. |
Other features variants in Brutalist
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.
Features Numbered
Full-width ruled rows with giant faded step numbers, uppercase titles, descriptions and a stat chip; each row floods with a different primary color on hover and the number turns solid.
Features Tabs
Tabbed feature explorer: ruled mono tab bar (ink active tab), then a big split panel with title, description and square-bullet list on the left and a stacked mock preview of the channel on the right.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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%.
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.
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).
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.