Timeline
Events in the order they happened.
On this page
A timeline sets events in the order they happened, on one line: an activity feed, a deployment's history, a changelog. It is an ordered list. Each event has a marker on a column and its words beside it, and a hairline joins the markers.
Timeline
<ol class="timeline max-w(360) mx-auto"> <li class="timeline-item" aria-current="true"> <span class="timeline-marker"></span> <div class="timeline-body"> <p class="timeline-title">Deployed to production</p> <p class="timeline-description">atlas.dev is live in 14 regions.</p> <time class="timeline-time" datetime="2026-11-11T09:42">2 minutes ago</time> </div> </li> <li class="timeline-item"> <span class="timeline-marker"></span> <div class="timeline-body"> <p class="timeline-title">Build completed</p> <p class="timeline-description">38 routes compiled in 48 seconds.</p> <time class="timeline-time" datetime="2026-11-11T09:41">3 minutes ago</time> </div> </li> <li class="timeline-item"> <span class="timeline-marker"></span> <div class="timeline-body"> <p class="timeline-title">Commit pushed to main</p> <time class="timeline-time" datetime="2026-11-11T09:40">4 minutes ago</time> </div> </li></ol>#Markers
An empty timeline-marker is a small dot. The event marked aria-current takes ink and a faint halo: the newest, or the one a reader is at. A marker that holds an icon becomes a small well around it, which :has() decides, so a feed can mix both.
With icons
<ol class="timeline max-w(360) mx-auto"> <li class="timeline-item"> <span class="timeline-marker"> <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="m6 12.5 4 4 8-9" /> </svg> </span> <div class="timeline-body"> <p class="timeline-title">Ada approved the change</p> <time class="timeline-time">Today at 09:12</time> </div> </li> <li class="timeline-item"> <span class="timeline-marker"> <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M5 6h14v10H9l-4 3z" /> </svg> </span> <div class="timeline-body"> <p class="timeline-title">Alan left a comment</p> <p class="timeline-description">The focus ring is cut by the mask. Move it to the group.</p> <time class="timeline-time">Yesterday at 17:40</time> </div> </li> <li class="timeline-item"> <span class="timeline-marker"></span> <div class="timeline-body"> <p class="timeline-title">Pull request opened</p> <time class="timeline-time">Yesterday at 16:05</time> </div> </li></ol>#Timeline or steps
A timeline records what happened; its length is open and every event is done. Steps show a fixed sequence a reader is moving through, with one step current and the rest ahead. Work under way, whose steps may be running or have failed and open to show what stands behind them, is a trace.
#Accessibility
- Use an
<ol>when the order matters, which it nearly always does, and a<time>withdatetimefor each moment. - The markers and the line are drawn by the stylesheet and are not announced. An icon in a marker is decoration: say what happened in the title.
- A feed that updates while it is on screen should be a live region with
aria-live="polite".
#Classes
| Class | Description |
|---|---|
timeline | The list |
timeline-item | An event; a hairline joins its marker to the next |
timeline-marker | A small dot when empty, or a small well around an icon |
timeline-body | The words beside the marker |
timeline-title | What happened, in strong ink |
timeline-description | A quieter line of detail |
timeline-time | When it happened, in tabular figures |
#Custom properties
| Property | Default | Description |
|---|---|---|
--timeline-marker | 1.5rem | Width of the marker column |