Timeline
Events on a tube that is lit up to now.
Elevated error rates on the EU API
Affects api.eu · fra1, lhr1
- Completed: InvestigatingError rates rose to 4.2% minutes after the 09:05 deploy. We're looking into it.
- Completed: IdentifiedA lower connection pool limit in v4.19.0 starves requests under peak load.
- Completed: Fix deployedRolled back to v4.18.2 in fra1 and lhr1.
- MonitoringError rates are back under 0.1%. We'll keep watching for the next hour.
- Upcoming: Resolved
Installation
npx shadcn@latest add https://neonkit.heyaadi.com/r/timeline.jsonUsage
import { Timeline, TimelineItem } from "@/components/ui/timeline"
<Timeline>
<TimelineItem title="Identified" time="09:31 UTC" dateTime="2026-10-11T09:31Z">
A connection pool limit starves requests under load.
</TimelineItem>
<TimelineItem status="current" title="Monitoring" time="10:05 UTC">
Error rates are back under 0.1%.
</TimelineItem>
<TimelineItem status="upcoming" title="Resolved" />
</Timeline>Examples
With icons
An icon replaces the dot in the marker. Durations use an ISO 8601 duration as their dateTime.
Horizontal
ISO date strings are formatted for you and rendered as <time>. Each item is at least 10rem wide, so put long timelines in a horizontal ScrollArea.
Advancing
When an item moves to current, the segment before it fills and its marker strikes like a tube.
API reference
Timeline
Renders an <ol>. Also accepts native list attributes. Pass TimelineItem elements as direct children.
| Prop | Type | Default |
|---|---|---|
orientation | "vertical"Vertical runs the tube down the left. Horizontal runs it along the top with content below. | "vertical" |
formatTime | (date: Date) => ReactNodeFormats a Date or ISO string time. The default is a short en-US format in UTC, so server and client render the same text. | None |
statusLabels | Partial<Record<"done" | "upcoming", string>>Visually hidden words read before each title. Translate them here. | { done: "Completed", upcoming: "Upcoming" } |
color | NeonColorPalette name or hex. Falls back to --neon-accent, then cyan. | inherited |
TimelineItem
Renders an <li>. Children become the description and may contain any block content.
| Prop | Type | Default |
|---|---|---|
title | ReactNodeThe event name. | None |
status | "done"Done and current items light the tube. The current marker pulses softly and gets aria-current="step". | "done" |
time | ReactNodeA Date or ISO string renders a formatted <time dateTime>. Anything else renders as given. | None |
dateTime | stringMachine-readable value for a human time such as "2 hours ago". Renders a <time>. | None |
icon | ReactNodeReplaces the dot inside the marker. | None |
Accessibility
- It's an ordered list, so screen readers announce the number of events and each one's position.
- Status isn't conveyed by light alone: done and upcoming items carry visually hidden labels, and the current item has aria-current="step".
- Times with a machine-readable value render as <time dateTime>, so assistive tech and parsers get the exact moment.
- With reduced motion the tube doesn't fill on mount and the current marker holds a steady glow instead of pulsing.