Skip to content

Release Card

Changelog entry card: yellow version/date column (top bar on mobile), uppercase title (optional link), summary and a list of changes tagged new / improved / fixed / breaking with fixed-width colored labels.

brutalist/ui/release-card
Open ↗

Source

import { cn } from "@/lib/utils";

export type ReleaseCardChangeKind = "new" | "improved" | "fixed" | "breaking";

export interface ReleaseCardProps {
  version: string;
  date: string;
  title: string;
  summary?: string;
  changes?: { kind: ReleaseCardChangeKind; text: string }[];
  href?: string;
  className?: string;
}

const KIND: Record<ReleaseCardChangeKind, string> = {
  new: "bg-da-success text-da-success-fg",
  improved: "bg-da-secondary text-da-secondary-fg",
  fixed: "bg-da-accent text-da-accent-fg",
  breaking: "bg-da-danger text-da-danger-fg",
};

export function ReleaseCard({ version, date, title, summary, changes = [], href, className }: ReleaseCardProps) {
  return (
    <article className={cn("da-stroke grid bg-da-surface text-da-surface-fg shadow-da-md sm:grid-cols-[9rem_1fr]", className)}>
      <header className="da-stroke-b flex items-center justify-between gap-2 bg-da-primary p-4 text-da-primary-fg sm:da-stroke-r sm:flex-col sm:items-start sm:justify-start sm:border-b-0">
        <p className="font-da-display text-2xl tracking-da-display">{version}</p>
        <time className="font-da-mono text-xs font-bold uppercase">{date}</time>
      </header>
      <div className="p-5">
        <h3 className="font-da-display text-xl leading-tight tracking-da-display uppercase">
          {href ? (
            <a href={href} className="da-focus underline decoration-transparent decoration-[3px] underline-offset-4 hover:decoration-current">
              {title}
            </a>
          ) : (
            title
          )}
        </h3>
        {summary && <p className="mt-2 text-da-muted-fg">{summary}</p>}
        {changes.length > 0 && (
          <ul className="mt-4 space-y-2">
            {changes.map((c) => (
              <li key={c.text} className="flex items-start gap-3 text-sm font-medium">
                <span className={cn("da-stroke w-20 shrink-0 py-0.5 text-center font-da-mono text-[10px] font-bold tracking-da-label uppercase", KIND[c.kind])}>{c.kind}</span>
                {c.text}
              </li>
            ))}
          </ul>
        )}
      </div>
    </article>
  );
}

export default ReleaseCard;

modules/brutalist/ui/release-card/index.tsx

Props

PropTypeDefaultDescription
version*string—Version label.
date*string—Formatted date (rendered in <time>).
title*string—Release title (h3).
summarystring—Short paragraph.
changes{ kind: "new" | "improved" | "fixed" | "breaking"; text: string }[]—Tagged change list.
hrefstring—Makes the title a link.
classNamestring—Classes on the <article>.

Other card variants in Brutalist

Card in other art directions

Card

Composable frosted card (Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter) with frosted / tinted-gradient / solid variants, specular top edge and interactive lift.

GlassCard

Meeting Card

Meeting recap glass card: title, time / duration / platform meta, gradient participant stack with +N, AI summary panel, action items with checkboxes and owners, and a transcript link.

GlassCard

Profile Card

Teammate glass card: gradient cover, large initials avatar with presence dot, role and timezone, status pill, three stats, expertise tags and Message / Schedule actions.

GlassCard

Stat Ring Card

KPI glass card with a primary→accent gradient progress ring (SVG) showing the percentage, the value over its max and a caption; the ring draws in on mount.

GlassCard

Card

Composable hairline card (Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter) with default / raised / ghost variants and an interactive hover lift.

MinimalCard

Incident Card

Incident summary card: severity chip, id and duration, linked title, service chips, a 4-step status progress bar, commander avatar, stacked responder avatars and update count.

MinimalCard

Integration Card

Integration tile: logo/monogram, name, category, description, a Radix Switch to enable it, live status meta and a Configure link. Controlled or uncontrolled.

MinimalCard

Metric Card

KPI card: muted label, big mono value, inline SVG sparkline with area fill and end dot, and a colored delta chip vs. the previous period (lowerIsBetter flips the colors).

MinimalCard

Profile Card

Studio/person profile card in the Read.cv spirit: square gray portrait with initials, name, role and city in mono, availability dot in signal color, short bio and a list of links with ↗.

Mono CleanCard

Project Card

Portfolio project card: neutral image frame that darkens slightly on hover with a “View case ↗” overlay, then a mono meta row (index, client, year) and the title with discipline tags.

Mono CleanCard

Stat Card

Analytics stat: mono label, large display value, change in mono, and a row of thin vertical bars (last bar in ink, others gray) — no chart chrome.

Mono CleanCard

Template Card

Template tile: a wireframe preview drawn with hairlines (nav, giant title, image grid) in a bordered frame, then name, author, category and usage count, with a “Use template” button revealed on hover/focus.

Mono CleanCard

Account Card

Bank account card: institution + masked number header, big balance with available amount, sync timestamp, and three recent inflow/outflow rows.

Neo CorporateCard

Invoice Card

Invoice summary card: number + status, bill-to and dates grid, line items table with mono amounts, subtotal/tax/total, and download/send actions.

Neo CorporateCard

Kpi Card

Metric card: label, big mono value, colored delta vs. period and an area sparkline in the primary color along the bottom.

Neo CorporateCard

Plan Card

Billing/subscription card: current plan + price + renewal date, usage meters (progressbar semantics, turning amber at 80% and red at 95%), manage and upgrade actions.

Neo CorporateCard

Action Card

Reduction action card: serif title, description, saving and cost figures, leaf-rated impact/effort, and an “Add to plan” pill that toggles to a sage “In your plan” state.

Organic SoftCard

Article Card

Journal article card: an organic shaped “cover” (arch, blob or circle) with a hand-drawn leaf, category and read time, serif title that underlines on hover, excerpt; whole card is one link.

Organic SoftCard

Metric Card

Emissions metric card: label, big serif value with mono unit, a change chip (down = good, sage; up = clay) and a human equivalence line with a small leaf.

Organic SoftCard

Supplier Card

Supplier card: arch-shaped initials avatar, name, category and country, status pill, share of your footprint and a rounded data-completeness bar with a reminder action.

Organic SoftCard

Profile Card

Rounded teammate card: pastel header band, big emoji avatar in a white circle, name, role, status pill, three stats in soft wells, skill pills and a “Say hi” button.

Soft FlatCard

Project Card

Pastel project card: white emoji tile, name link covering the card, description, chunky rounded progress bar with percentage, tasks-left and due chips, member dots.

Soft FlatCard

Stat Card

Friendly KPI tile: emoji in a white circle, change pill, label, big rounded number and a row of rounded mini bars (last one highlighted); five tones.

Soft FlatCard

Task Card

Kanban task card: round done checkbox with bouncy tick, pastel label, title (struck when done), subtask progress, due chip that turns red when overdue, comment/attachment counts and avatar dots.

Soft FlatCard