Timeline

Molecule

Chronological activity feed with sticky day headings, drawn with the same DOM as kui-react. Grouping uses the day in `timeZone`, not the raw ISO date: an event at 23:50 UTC otherwise lands under the wrong heading for anyone east or west of the server. A server-rendered page formats in the server's zone unless `timeZone` is given, so pass the viewer's zone when you know it. `title`, `body` and `meta` are escaped text (kui-react takes a node); `titlePartial` / `bodyPartial` / `metaPartial` include a partial instead. `icon` is a Font Awesome class. An item with an invalid date is skipped.

Grouped by day

Preview
  1. Tuesday, August 25, 2026
  2. Reply received Replied
    “Interesting — can you send details?”
  3. Email sent
    Re: shipping integration
  4. Monday, August 24, 2026
  5. Call completed
    4m 12s · reached the right person
  6. Enriched
    18 employees · logistics software
Code
<%- include('modules/ui/Timeline', {
  timeZone: viewerZone,
  items: activities.map((a) => ({
    id: a.activityId,
    at: a.occurredAt,
    title: a.type,
    body: a.summary,
    icon: 'fa-solid fa-envelope',
    tone: 'info',
  })),
}) %>

Empty, and ungrouped

Preview

No activity on this company yet.

  1. Bounced
  2. Queued
Code
<%- include('modules/ui/Timeline', { items: [], emptyMessage: 'No activity yet.' }) %>
<%- include('modules/ui/Timeline', { items: items, groupByDay: false }) %>

Another time zone

Preview
  1. Mittwoch, 26. August 2026
  2. Nächster Tag in Auckland Auto
  3. Dienstag, 25. August 2026
  4. Spät in UTC
    Gleicher Tag wie der Eintrag darunter
  5. Kurz davor
Code
<%- include('modules/ui/Timeline', { timeZone: 'Pacific/Auckland', locale: 'de-DE', items: items }) %>
Source modules/ui/Timeline.ejs