Skip to the page
TACTILE UI

Kit part · Timelines

Timeline

An event log like the roll of a chart recorder. The rail is engraved down the plate and each event is a tick stamped across it, with its time in tabular figures and its words beside it. A lamp on the rail is the only colour, and a marker for the present separates what has happened from what is still to come.

Element
ol.tui-timeline
Needs
kit.css
Rules
timeline.rules.md · 6
Finishes
Aluminium · Graphite · Porcelain · Black
Volumes
Tactile · Quiet
On this page
  1. Variants
  2. Every state, at once
  3. API
  4. Markup
  5. Accessibility
  6. How it’s built
  7. Rules
  8. Related parts
01

Variants

  1. Merged: rate limits

    Pull request 481, two reviewers.

  2. Branch cut

    release/4.2 from main.

  3. Freeze

    No merges until the canary is done.

Plain: time, tick, words
  1. Build passed

    412 tests in three minutes.

  2. Canary at 5%

    Watching the error rate for ten minutes.

  3. Rolled back

    p95 latency passed 800 ms on the canary.

With lamps
  1. Rolled back

    p95 latency passed 800 ms on the canary.

  2. Fix shipped

    Latency back under 200 ms. Canary at 100%.

  3. Now
The pen
  1. Now
  2. Release review

    Booked with the platform team.

  3. Freeze lifts

Still to come
  1. Build passed

    412 tests in three minutes.

  2. Canary at 5%

    Watching the error rate for ten minutes.

  3. Rolled back

    p95 latency passed 800 ms on the canary.

Compact · --sm
02

Every state, at once

Both finishes, side by side. Hover, pressed and focus are forced with .is-hover, .is-down and .is-focus; checked and disabled are real.

Aluminium

PartEventLampsThe penTo come
Timeline
  1. Merged

  2. Cut

  1. Passed

  2. Watching

  3. Failed

  1. Shipped

  2. Now
  1. Now
  2. Review

Graphite

PartEventLampsThe penTo come
Timeline
  1. Merged

  2. Cut

  1. Passed

  2. Watching

  3. Failed

  1. Shipped

  2. Now
  1. Now
  2. Review

03

API

NameKindValuesWhat it does
ol.tui-timelineelementaria-label · aria-liveThe roll. An ordered list, named. Add aria-live="polite" if events arrive while it is on screen.
--smclasscompactThe same roll at a tighter pitch, for a card or a side panel.
li.tui-timeline__eventclasstime · tick · bodyOne event: its time, its tick on the rail, and its words.
time.tui-timeline__timeelementdatetimeThe time, printed in tabular figures. Give it a datetime.
.tui-timeline__tickclasslamp optionalThe stamped tick on the rail. Put a lamp in it and the lamp takes the tick’s place.
.tui-lamp[data-lamp]elementgreen · amber · red · blue · whiteA state lamp set into the rail. Give it role="img" and an aria-label, since a colour says nothing to a screen reader.
.tui-timeline__title · __textclasswordsA heading and one line. The heading level is yours; h3 is a default.
li.tui-timeline__nowclassthe penMarks the present. Everything after it is still to come and sits on dotted rail. Use one, or none.
--tl-time · --tl-rail · --tl-tick · --tl-bgcustom propertylengths · a colourThe width of the time column and of the rail, how far down each tick is stamped, and the plate the pen’s halo matches.
data-newattributeset by timelineAppendOn an event for the first 400ms: the tick lands and settles.
timelineAppend(list, event, { future })functionkit.mjsAdds an event before the pen (or at the end with future: true) and returns the <li>.
timelineEventHTML(event) · timelineClock(date)functionkit.mjsThe same event as a string of markup, for a server; and “14:02” from a Date.
04

Markup

<ol class="tui-timeline" aria-label="Deploys today" aria-live="polite">
  <li class="tui-timeline__event">
    <time class="tui-timeline__time" datetime="2026-09-29T09:31">09:31</time>
    <span class="tui-timeline__tick">
      <span class="tui-lamp" data-on role="img" aria-label="Passed"></span>
    </span>
    <div class="tui-timeline__body">
      <h3 class="tui-timeline__title">Build passed</h3>
      <p class="tui-timeline__text">412 tests in three minutes.</p>
    </div>
  </li>
  …
  <li class="tui-timeline__now" aria-current="time">
    <span class="tui-timeline__time">Now</span>
    <span class="tui-timeline__tick" aria-hidden="true"></span>
    <div class="tui-timeline__body"><time datetime="2026-09-29T11:40">11:40</time></div>
  </li>
</ol>
import { timelineAppend } from '/kit/kit.mjs';   // optional: the markup needs no script

// Stamps a new event in above the pen. Time and datetime default to now.
timelineAppend(document.querySelector('.tui-timeline'), {
  title: 'Alert cleared',
  text: 'Error rate under 0.1% for an hour.',
  lamp: 'green',           // 'green' | 'amber' | 'red' | 'blue' | 'white'
  state: 'Passed',         // what the lamp says, in words
});

// Something still to come goes after the pen:
timelineAppend(list, { time: '14:00', title: 'Release review' }, { future: true });

Needs kit.css only, no script. How to install the kit.

05

Accessibility

  • It is an ordered list, so a screen reader says how many events there are and which one it is on. Each time is a <time datetime>.
  • A lamp is state and nothing else, and it is given a spoken name (role="img" and an aria-label such as “Failed”); the ticks and rails are hidden from assistive technology.
  • The pen is aria-current="time", so “Now” is said where it stands in the list.
  • The dotted rail after the pen is not the only sign that events are still to come: they follow the pen in the reading order, and their text is a step quieter, still above 4.5:1.
  • With aria-live="polite" on the list, an appended event is read out when it arrives without pulling focus.
  • With reduced motion a new event simply appears; nothing is lost.
06

How it’s built

One grid per event: the time, a rail cell and the words. Each event draws its own length of the rail, a 2px groove darker than the plate with its lower edge lit by the lamp above, so the rail is continuous with nothing to position. The tick is a 14px bar stamped across it; with a lamp in it, the lamp is set in the rail instead. The rail below the pen is the same groove dotted in, done with one sibling selector, so there is no “future” class to forget. The pen is the kit’s contrast cap on the time side, a diamond on the rail and a rule across. Appending stamps the tick in with a short overshoot; there is no script needed to draw any of it.

07

Rules

timeline.rules.mdIn the brain

What happened, in order, with the state of each thing said by a lamp and in words.

6 rules in this file, with the foundations they rest on and the anti-patterns that break them. Full rules ship in the brain with the Pass.

08
  1. IntroPiano, room mics1:12
  2. LodeFull band4:05
  3. Night reelVocal and tape3:42

List

Rows in a rack: a mark, a title, a second line and a fact or a key at the end. Chosen rows sink into a recess with their check key latched; in a running order, a row lifts out of the rack on its skirt and slides past the others, from the keyboard or by its grip.

Lamp

The only colour in the kit: a lamp that is on. Green is on, amber is waiting, red is recording or failing, blue is linked, white is standing by. Always next to words.

Chart recorder

A strip-chart recorder: gridded paper advancing under a pen that rides a rail, drawing the live value as the paper moves and printing the time in the margin. For p95 latency, tokens per second, grid frequency, a cold room’s log.

Docs
Finish
Volume