A simple and customizable timeline component for react apps with additional dependencies written in Typescript.
See the Live Demo
npm install react-timeline --save
Dependency | Version |
---|---|
React | ^17.0.2 |
Styled Components | ^5.3.3 |
import Timeline, {
TimelineTheme,
TimelineProps,
ITimelineEvent
}
from 'react-timeline';
interface Props {
events: ITimelineEvent[]
}
// Optionally customize the default theme,
// or define your own
const theme = {
...TimelineTheme.default,
card: {
...TimelineTheme.default.card,
colors: {
text: '#5F646A',
background: '#FFFFFF',
active: {
border: '#3498CC',
background: '#FFFFFF',
text: '#5F646A',
}
},
}
};
const MyComponent = ({ events }: ): JSX.Element => (
<Timeline
events={events}
height={600}
showHeader
showDetailPanel
theme={theme}
/>,
);
- Highly customizable to fit different design systems
- Lazy loads event content with content cache for optimal performance
- Render timelines with custom icons
- Support for date ranges, including 'Present'
- Implements sleek skeleton loading animations
- Supports either controlled and uncontrolled implementations
The props provided to the <Timeline />
component
Parameter | Type | Description |
---|---|---|
isLoading |
boolean |
Displays the loading indicator when set to true |
events |
ITimelineEvent[] |
The events to render. See definition below. |
activeEventId? |
string |
set which event is active (for controlled timeline). Defaults to the first event in the events array |
height |
number |
The overall height of the timeline, in pixels |
width |
number |
The overal width of the timeline, in pixels. (Note: this is overriden for responsive layouts |
icon |
ReactNode |
An optional react component to override the default timeline point icon |
title? |
string |
The title text, if rendering the header |
showHeader? |
boolean |
Displays the title header, when set to true |
showDetailPanel? |
boolean |
Renders the event detail panel; |
display |
'normal' , 'condensed |
Sets the layout type for the timeline. Defaults to normal |
customDateRenderer? |
(date: DateRange ) => string |
Optional function which overrides the default date render |
onClick? |
(id: string) => void |
Fired when a timeline event is clicked |
onMouseEnter? |
(id: string) => void |
'Fired when the mouse enters the bounds of a timeline event |
onMouseLeave? |
(id: string) => void |
'Fired when the mouse leaves the bounds of a timeline event |
This is the type for the events provided to the Timeline for render
Parameter | Type | Description |
---|---|---|
id |
string |
The event id |
title |
string |
The event title |
date |
Date or DateRange |
The date or date range for the events |
description? |
string |
The event description |
active |
boolean |
Whether or not the event is active |
icon? |
ReactNode |
A custom icon, specific to the individual event |
content? |
() => Promise<React.ReactNode> |
An asyncronous function which returns the details for the event (for rendering in the detail panel) |
React timeline supports both singular dates (as Javascript Date
instances) or with a DateRange
:
type DateRange = {
start: Date;
end: Date | 'present';
};
To customize the way dates are rendered in the timeline, you need to provide a a customDateRenderer
to the Timeline component. The function must accept either a Date or a Date range, depending on which date types you are implementing.
Here's an example implementation:
const renderDate = (date: Date | DateRange): string => {
if (date instanceof Date) {
return date.toLocaleString();
} else {
let start = date.start.toLocaleDateString();
let end;
if (date.end === 'present') {
end = 'Present';
} else {
end = date.end.toLocaleDateString();
}
return `${start} - ${end}`;
}
};