Zum Hauptinhalt springen

Timeline

Every example on this page is live, drawn by the library's Storybook, where you can also change its props and see the result.

An event timeline with dots and connecting lines, running down a column or across a band. Give an event an icon to draw it in place of the dot, or number every event for a list of steps. Mark one current to make it the one solid mark on the line. Set fit to fill a box and the timeline shows as many whole events as the box holds.

Import​

import { Timeline } from "~lib/data-display/timeline";

Props​

NameTypeRequiredDefaultDescription
events{ title: string; description?: string; timestamp?: string; icon?: IconName | ReactElement; current?: boolean }[]YesN/ATimeline events; current marks the event drawn solid, such as the next one due
size"xs" | "sm" | "md"No"md"Type size and spacing; the smaller sizes suit slim columns
linesnumberNoN/AKeep each title to at most this many lines, ending in "…"
maxRowsnumberNoN/AShow at most this many events
fit"content" | "fill" | numberNo"content"Fill a flex parent or take a height in pixels; a vertical timeline shows only the events that fit
numberedbooleanNofalseMark each event with its step number in place of its dot or icon
direction"vertical" | "horizontal"No"vertical"Run the events down a column, or side by side across a band
minColumnWidthnumberNo120With direction="horizontal", the narrowest a column gets, in pixels, before fewer events show

Examples​

Default​

Default in Storybook öffnen

With Timestamps​

With Timestamps in Storybook öffnen

Single Event​

Single Event in Storybook öffnen

With Icons​

An event's icon is drawn in place of its dot, with the line running into it from above and on from below. Give it an Icon name such as "person-walking" or "bus", or any small element of your own. Icons grow with size.

With Icons in Storybook öffnen

For a route from a directions API, travelModeIconName turns each step's travel mode into an icon name. A mode it does not know keeps the dot.

import { travelModeIconName } from "~lib/icon";
import { Timeline } from "~lib/data-display/timeline";

const Steps = ({
steps,
}: {
steps: { instruction: string; mode: string }[];
}) => (
<Timeline
events={steps.map((step) => ({
title: step.instruction,
icon: travelModeIconName(step.mode),
}))}
size="sm"
fit="fill"
/>
);
Compact With Icons in Storybook öffnen

Numbered Steps​

numbered marks each event with its step number in a filled circle, for a recipe's method or any other list of steps. The numbers take the place of the dots, and of any icons.

Numbered in Storybook öffnen

The circles shrink with size, and a number with more digits is set smaller to fit its circle.

Compact Numbered in Storybook öffnen

Compact​

size="xs" tightens the type and the room between events for a slim column.

Compact in Storybook öffnen

Clamped Titles​

lines keeps each title to at most that many lines, ending in "…".

Clamped Titles in Storybook öffnen

At Most a Few Rows​

maxRows shows at most that many events.

Max Rows in Storybook öffnen

Fill a Box​

With fit="fill" the timeline takes the room its flex parent leaves and shows as many whole events as fit, so a widget does not have to guess how many rows its box holds. A number takes that height in pixels instead.

Fill Box in Storybook öffnen

Current Event​

Mark an event current, such as the next prayer of the day or the step a journey is on, and it is the one drawn solid: the other events' dots are outlined, so the eye lands on it without a word written beside it. Pass the flag on the event itself, so it stays with the right event however the list is sorted or cut.

import { Timeline } from "~lib/data-display/timeline";

const Prayers = ({
prayers,
now,
}: {
prayers: { name: string; time: Date; label: string }[];
now: Date;
}) => {
const next = prayers.find((prayer) => prayer.time > now);
return (
<Timeline
events={prayers.map((prayer) => ({
title: prayer.name,
timestamp: prayer.label,
current: prayer === next,
}))}
size="sm"
/>
);
};
Current Event in Storybook öffnen

A current event's icon is drawn in the background color on a filled disc, and the other icons stay as they are.

Current Step in Storybook öffnen

In a numbered timeline the current step's circle stays filled and the others are outlined.

Current Numbered in Storybook öffnen

Horizontal​

direction="horizontal" lays the events out side by side for a band along the top or bottom of the frame: equal columns across the width, the markers and the line along the top, each event's title, description and timestamp beneath its marker. lines clamps the titles as it does down a column.

Horizontal in Storybook öffnen

It shows as many events, from the first, as the width holds at minColumnWidth each, and drops the rest, so in a narrower box the later events give way rather than every column squeezing. The line runs on past the last column shown when more events follow. The browser counts the columns from the box's own width, so a saved render shown in a narrower box drops columns too.

Horizontal Narrow in Storybook öffnen

current and numbered work the same way across a band.

Horizontal Current in Storybook öffnen

See Also​