Skip to content

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.

minimal/section/features-alternating
Open ↗

Source

import { ArrowRight } from "lucide-react";
import { cn } from "@/lib/utils";

export interface FeaturesAlternatingProps {
  eyebrow?: string;
  title?: string;
  className?: string;
}

function RoutingMock() {
  const rows = [
    { src: "Datadog", rule: "service = payments", to: "Payments on-call", tone: "bg-da-danger" },
    { src: "Sentry", rule: "level ≥ error", to: "Web team", tone: "bg-da-warning" },
    { src: "Grafana", rule: "env = staging", to: "Slack only", tone: "bg-da-muted-fg" },
  ];
  return (
    <div className="da-stroke rounded-da-lg bg-da-surface p-4 text-da-surface-fg shadow-da-lg">
      <p className="font-da-mono text-[11px] text-da-muted-fg">routing-rules.yaml</p>
      <ul className="mt-3 space-y-2">
        {rows.map((r) => (
          <li key={r.src} className="da-stroke flex items-center gap-3 rounded-da-md bg-da-bg px-3 py-2.5 text-[13px]">
            <span className={cn("size-2 rounded-full", r.tone)} />
            <span className="w-16 font-medium">{r.src}</span>
            <span className="hidden flex-1 font-da-mono text-[12px] text-da-muted-fg sm:block">{r.rule}</span>
            <ArrowRight className="size-3.5 text-da-muted-fg" />
            <span className="ml-auto rounded-da-sm bg-da-accent px-1.5 py-0.5 text-[12px] text-da-accent-fg sm:ml-0">{r.to}</span>
          </li>
        ))}
      </ul>
    </div>
  );
}

function ScheduleMock() {
  const days = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
  const who = ["MC", "MC", "JO", "JO", "AK", "AK", "AK"];
  return (
    <div className="da-stroke rounded-da-lg bg-da-surface p-4 text-da-surface-fg shadow-da-lg">
      <div className="flex items-center justify-between">
        <p className="text-[13px] font-medium">Payments · Primary</p>
        <p className="font-da-mono text-[11px] text-da-muted-fg">Week 42</p>
      </div>
      <div className="mt-4 grid grid-cols-7 gap-1.5">
        {days.map((d, i) => (
          <div key={d} className="text-center">
            <p className="text-[11px] text-da-muted-fg">{d}</p>
            <p
              className={cn(
                "mt-1.5 rounded-da-sm py-3 font-da-mono text-[11px] font-medium",
                who[i] === "MC" && "bg-da-primary text-da-primary-fg",
                who[i] === "JO" && "bg-da-accent text-da-accent-fg",
                who[i] === "AK" && "bg-da-muted text-da-fg",
              )}
            >
              {who[i]}
            </p>
          </div>
        ))}
      </div>
      <p className="mt-4 text-[12px] text-da-muted-fg">Night pages this month: MC 3 · JO 2 · AK 3 — balanced ✓</p>
    </div>
  );
}

function PostmortemMock() {
  return (
    <div className="da-stroke rounded-da-lg bg-da-surface p-5 text-da-surface-fg shadow-da-lg">
      <p className="inline-flex items-center gap-1.5 rounded-da-pill bg-da-accent px-2 py-0.5 text-[11px] font-medium text-da-accent-fg">
        ✦ Drafted by Tracewise AI
      </p>
      <p className="mt-3 text-[15px] font-medium">Postmortem · Checkout 5xx (INC-2481)</p>
      <div className="mt-3 space-y-2 text-[13px] text-da-muted-fg">
        <p>
          <span className="font-medium text-da-fg">Impact.</span> 3.1% of checkout requests failed for 9 minutes (14:02–14:11 UTC).
        </p>
        <p>
          <span className="font-medium text-da-fg">Root cause.</span> Deploy a41f9c2 lowered the DB pool size from 50 to 5.
        </p>
        <p>
          <span className="font-medium text-da-fg">Action items.</span> Add a pool-size guard to CI · Alert on pool saturation.
        </p>
      </div>
    </div>
  );
}

const ROWS = [
  {
    kicker: "Route",
    title: "Every alert lands with the one person who can fix it",
    body: "Write routing rules on any field of the payload. Tracewise dedupes, groups and escalates until someone acknowledges.",
    link: { label: "Explore alert routing", href: "#routing" },
    Mock: RoutingMock,
  },
  {
    kicker: "Share",
    title: "On-call that doesn’t burn out your best engineers",
    body: "Rotations, overrides and swap requests in two clicks, with a fairness report that tracks night pages per person.",
    link: { label: "See scheduling", href: "#schedules" },
    Mock: ScheduleMock,
  },
  {
    kicker: "Learn",
    title: "Postmortems that write themselves",
    body: "The timeline, chat, deploys and graphs become a structured draft. Your team edits, assigns follow-ups and moves on.",
    link: { label: "Read a sample postmortem", href: "#postmortems" },
    Mock: PostmortemMock,
  },
];

/** Three alternating rows of copy + HTML product mock-up, zig-zagging on desktop. */
export function FeaturesAlternating({ eyebrow = "How it works", title = "Built for the worst 30 minutes of your week", className }: FeaturesAlternatingProps) {
  return (
    <section aria-labelledby="features-alt-title" className={cn("da-section bg-da-bg text-da-fg", className)}>
      <div className="da-container">
        <div className="mx-auto max-w-2xl text-center">
          <p className="font-da-mono text-xs text-da-accent-fg">{eyebrow}</p>
          <h2 id="features-alt-title" className="mt-3 text-[clamp(1.875rem,4vw,2.75rem)] leading-[1.1] font-semibold tracking-da-display text-balance">
            {title}
          </h2>
        </div>
        <div className="mt-16 space-y-20 lg:space-y-28">
          {ROWS.map((r, i) => (
            <article key={r.kicker} className="grid items-center gap-10 lg:grid-cols-2 lg:gap-20">
              <div className={cn(i % 2 === 1 && "lg:order-2")}>
                <p className="text-sm font-medium text-da-accent-fg">
                  0{i + 1} · {r.kicker}
                </p>
                <h3 className="mt-3 text-2xl leading-tight font-semibold tracking-da-display text-balance sm:text-3xl">{r.title}</h3>
                <p className="mt-4 text-[16px] leading-relaxed text-da-muted-fg">{r.body}</p>
                <a
                  href={r.link.href}
                  className="da-focus da-transition group mt-6 inline-flex items-center gap-1 rounded-da-sm text-sm font-medium hover:text-da-accent-fg"
                >
                  {r.link.label}
                  <ArrowRight aria-hidden className="da-transition size-4 group-hover:translate-x-0.5" />
                </a>
              </div>
              <div aria-hidden className={cn("relative", i % 2 === 1 && "lg:order-1")}>
                <div className="absolute -inset-4 rounded-[24px] bg-da-surface-2" />
                <div className="relative">
                  <r.Mock />
                </div>
              </div>
            </article>
          ))}
        </div>
      </div>
    </section>
  );
}

export default FeaturesAlternating;

modules/minimal/section/features-alternating/index.tsx

Props

PropTypeDefaultDescription
eyebrow / titlestring—Header copy.
classNamestring—Classes on the section.

Other features variants in Minimal

Features in other art directions

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.

BrutalistFeatures

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.

BrutalistFeatures

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.

BrutalistFeatures

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.

BrutalistFeatures

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 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