Email AtlasHomeAtlasTokensChromeContributeChangelog

Email components

The full toolkit from _shared/email-templates/components.ts — every component rendered live with its prop signature. All are pure functions returning HTML strings (no JSX, no framework); charts are table+div based (no inline SVG) so they survive Gmail and Outlook.

Eyebrow

Eyebrow({ text })

Tracked small-caps label above a hero heading.

Heading

Heading({ text, level?: 1|2|3, align? })

Paragraph

Paragraph(text, variant?: primary|secondary|muted, { align?, size?: body|lead })

Button

Button({ url, text, variant?: primary|secondary|success, gif? })

Ink pill (primary), ghost (secondary), or an animated 300×168 GIF card via gif slug.

Card

Card({ content, variant?: default|highlight|warning|success })

SpecTable

SpecTable({ rows: [{ label, value }] })

The signature key/value list of the Apple emails.

InfoRow

InfoRow({ icon?, label, value })

Divider

Divider({ spacing?: small|medium|large })

Spacer

Spacer(4|8|12|14|16|20|24|28|32|36|40|48|56|64)

Vertical rhythm. A 24px gap shown between two rules.

StatusBadge

StatusBadge({ status: confirmed|pending|cancelled|reminder|new, text? })

AlertBox

AlertBox({ type: info|warning|success|error, title?, message })

CodeBox

CodeBox({ code, label? })

Avatar

Avatar({ name, src?, size? })

Image, or monogram on a light disc (image-block safe).

JourneyStepper

JourneyStepper({ steps, current, tone?: active|muted, loadingColor?: green|ink|null })

RoleCard

RoleCard({ eyebrow?, title, pillText?, rows, rail?, ctaHtml?, matchPct?, stealth? })

The flagship hero card — eyebrow + title + match pill + spec + optional rail/CTA.

WhyList

WhyList({ title?, items })

QuoteCard

QuoteCard({ name, quote, role?, avatarUrl? })

MetricStat

MetricStat({ value, label, delta?, tone?: positive|negative|neutral, sublabel? })

MetricGrid

MetricGrid({ metrics: MetricStat[], columns?: 2|3 })

BarRow

BarRow({ label, value, max, valueLabel?, fill?: ink|success|warning|error|muted })

BarChart

BarChart({ title?, rows: [{ label, value, valueLabel?, fill? }], max? })

Sparkline

Sparkline({ values, height?, fill?, caption? })

VideoCallCard

VideoCallCard({ platform, platformName, joinUrl, meetingId?, password?, dialIn?, instructions? })

AttendeeList

AttendeeList({ attendees: [{ name, email?, isOrganizer?, status? }], maxShow? })

MeetingPrepCard

MeetingPrepCard({ meetingType?: interview|general|intro, companyName?, interviewerName?, prepGuideUrl? })

CalendarButtons

CalendarButtons({ title, startDate, endDate, description?, location? })

SchemaEvent

SchemaEvent({ name, startDate, endDate, location?, description?, organizerName?, organizerEmail?, attendees? })

Non-visual — emits schema.org JSON-LD for calendar-aware clients. Source shown.

<script type="application/ld+json">
      {
  "@context": "http://schema.org",
  "@type": "Event",
  "name": "Interview — Northwind",
  "startDate": "2026-07-02T13:00:00.000Z",
  "endDate": "2026-07-02T13:45:00.000Z",
  "eventStatus": "https://schema.org/EventScheduled",
  "eventAttendanceMode": "https://schema.org/OnlineEventAttendanceMode",
  "location": {
    "@type": "VirtualLocation",
    "url": "https://meet.thequantumclub.com/x"
  },
  "organizer": {
    "@type": "Organization",
    "name": "The Quantum Club",
    "url": "https://thequantumclub.com"
  }
}
    </script>