EventTimeline
Events and selection
- successRadio
Channel 04 has a stable carrier.
- info– Service
A duration event with explicit start and end.
- warningRadio
Round-trip latency exceeded the reference threshold.
Supply a start/end window and stable, unique event IDs. Times use Unix epoch
milliseconds and display in UTC. Point events use diamonds; a later end produces
a duration bar clipped to the window. The text list retains full timestamps.
Each entry leads with the event title and keeps severity at the right edge. The timestamp and category share a secondary metadata row, followed by the description. Selectable titles use a text action; a selected entry gains a border and a visible selection label.
<EventTimeline
start={range.start}
end={range.end}
events={[
{ id: "link", label: "Link acquired", start: linkTime, lane: "Radio", severity: "success" },
{
id: "service",
label: "Inspection",
start: inspectionStart,
end: inspectionEnd,
lane: "Service",
},
]}
selectedId={selectedId}
onSelectionChange={setSelectedId}
/>
Selection is controlled and persists across window changes. onSelectionChange
enables selection buttons; otherwise the list is read-only. Overlapping events
remain individually available in the list.
Invalid timestamps and reversed intervals are omitted and counted. Events wholly outside the window are excluded. Invalid or empty windows show an explanation.
Empty
No events in this time range.
Disabled selection
- successRadio
Channel 04 has a stable carrier.
- info– Service
A duration event with explicit start and end.
- warningRadio
Round-trip latency exceeded the reference threshold.
Props
| PROP | TYPE | DEFAULT | REQUIRED |
|---|---|---|---|
eventsReadonly TimelineEvent array. Invalid timestamps and reversed intervals are omitted with an explicit count. The visible list is sorted by start time. | array | — | yes |
startInclusive visible window start, Unix epoch milliseconds. | number | — | yes |
endInclusive visible window end, Unix epoch milliseconds. Must follow start. | number | — | yes |
selectedIdControlled selected event ID, or null for no selection. Filtering the visible window never changes the supplied selection. | string | — | no |
onSelectionChange(id: string) => void. Adds native selection buttons to the event list; Enter and Space select an event. | function | — | no |
disabledDisables selection buttons while keeping data readable. | boolean | false | no |
labelAccessible name of the group. The event list is named after it with "list" added (label="Service events" names the list "Service events list"). | string | "Event timeline" | no |
emptyMessage | string | "No events in this time range." | no |
Accessibility
- The chronological list includes every visible event, lane, full timestamp, and description. It is named after
labelwith "list" added, solabel="Service events"names it "Service events list". - The list stays in the page however many events it holds, so it remains the complete record and never becomes a second scrolling box. Selecting an event or resizing the timeline redraws only what changed, so long lists stay quick to update.
- Selection buttons support Enter/Space and visible focus; selected events expose text, a border, and
aria-pressed. - Badges state severity. The SVG is
aria-hidden; the list provides complete data.
Manifest entry
<EventTimeline events={events} start={range.start} end={range.end} selectedId={selectedId} onSelectionChange={setSelectedId} label="Service events" />View agent manifest
{
"description": "UTC event graphic with lanes, clipped duration bars, point markers, and a complete accessible event list. Event titles lead each entry, severity aligns at the trailing edge, and timestamps/categories form a secondary metadata row.",
"props": {
"events": {
"type": "array",
"items": {
"id": "string (required, unique)",
"label": "string (required)",
"start": "number (required, epoch milliseconds)",
"end": "number (optional, epoch milliseconds, inclusive)",
"lane": "string (optional, defaults to Events)",
"description": "string (optional)",
"severity": "enum [neutral, info, success, warning, error] (default neutral)"
},
"required": true,
"description": "Readonly TimelineEvent array. Invalid timestamps and reversed intervals are omitted with an explicit count. The visible list is sorted by start time."
},
"start": {
"type": "number",
"required": true,
"description": "Inclusive visible window start, Unix epoch milliseconds."
},
"end": {
"type": "number",
"required": true,
"description": "Inclusive visible window end, Unix epoch milliseconds. Must follow start."
},
"selectedId": {
"type": "string",
"description": "Controlled selected event ID, or null for no selection. Filtering the visible window never changes the supplied selection."
},
"onSelectionChange": {
"type": "function",
"description": "(id: string) => void. Adds native selection buttons to the event list; Enter and Space select an event."
},
"disabled": {
"type": "boolean",
"default": false,
"description": "Disables selection buttons while keeping data readable."
},
"label": {
"type": "string",
"default": "Event timeline",
"description": "Accessible name of the group. The event list is named after it with \"list\" added (label=\"Service events\" names the list \"Service events list\")."
},
"emptyMessage": {
"type": "string",
"default": "No events in this time range."
}
},
"composable_with": [
"TimeRange",
"SplitPane",
"Card"
],
"never_inside": [
"Button"
],
"example": "<EventTimeline events={events} start={range.start} end={range.end} selectedId={selectedId} onSelectionChange={setSelectedId} label=\"Service events\" />"
}