Skip to content

No.184 · Data

Activity Stream

An activity log where time has weight: the space between two events grows with the time between them, so a busy half hour reads dense and a quiet afternoon reads as a pause. Days are set in an editorial margin, runs of the same thing fold into one line, and a focused event opens in place.

The prompt

The design brief behind this component — reuse it to regenerate, remix, or explain it.

Build a SaaS activity feed (deploys, comments, uploads, assignments, status changes, approvals) with a strong temporal hierarchy and an editorial feel, not a dotted vertical timeline. Days sit in a left margin: a large serif day numeral, the day name (Today / Yesterday / weekday) and the month, sticky while its events scroll. A full-width ink rule starts each day. Each event is one line: - a mono time column (relative for the last hour, 'just now' / '14 min ago', otherwise HH:MM, with the full date as a title) - a small outlined glyph for the kind - a sentence: bold actor, a verb, the object in medium weight, and an optional status pill (Ready, Failed, Approved, 12 / 12) The central idea is that vertical space encodes elapsed time. The margin before each event is 7·log2(1 + minutes/6)px, clamped to 2–56px, so a burst of activity packs tight and a long silence opens a visible gap. Gaps of 90 minutes or more are named inside the gap in italic serif with a dotted rule ('3 hours quiet'). You read the rhythm of the day before reading a word. Consecutive events with the same groupKey by the same actor within 30 minutes fold into one line ('Hamza uploaded 4 files to Wayfinder'); expanding lists them with their times. Clicking or pressing Enter on an event opens its detail in place (a deploy log, a comment's text) under the sentence, marked by a 2px accent rule — the rest of the stream stays exactly as it is. ↑/↓ move between events. New events enter at the top: existing rows FLIP down (420ms), and the new line fades and drops in with its time in the accent for a moment. There are a loading state (placeholder rows at uneven gaps) and an empty state written as a sentence. Under 34rem the margin becomes an inline day header. Paper and Night themes.

Notes

Interaction
Scan the rhythm, click an event to open it, press 'Simulate new event', or switch to the loading and empty states.
Motion
Arrivals: 420ms FLIP for the stream plus a 520ms drop-in; detail fold 320ms. The spacing itself is static.
Accessibility
A role=feed of articles, each with a button that controls its detail (aria-expanded). Days are labelled regions with full dates, and every time has an absolute-time title. Arrow keys move between events. Reduced motion removes the arrival and fold animations; the time spacing is layout, not motion, so it stays.
Responsive
Under 34rem of container width, the day margin becomes an inline header and the columns tighten.

Featured

301 components