Build Status DeepScan grade Codacy Badge react-chrono Snyk Vulnerabilities for GitHub Repo Depfu https://badgen.net/bundlephobia/min/react
Features 🚥 Render timelines in three different modes (Horizontal, Vertical, Vertical-Alternating). 📺 Auto play the timeline with the slideshow mode. 🖼️ Display Images & Videos in the timeline with ease. ⌨ Keyboard accessible. 🔧 Render custom content easily. ⚡ Data driven API. 🎨 Customize colors with ease. 🎭 Use custom icons in the timeline. 💪 Built with Typescript. 🎨 Styled with emotion. Table of Contents ⚡ Installation Getting Started 🚥Vertical Mode 🚥Vertical Alternating 📺Slideshow Props Mode Timeline item Model ⌨Keyboard Navigation Scrollable 📺Media 🛠Rendering custom content 🎭Custom icons for the Timeline Slideshow mode Item Width 🎨Theme 📦CodeSandbox Examples 📚Storybook 🔨Build Setup 🧪Tests 🤝Contributing 🧱Built with Meta Contributors ✨ ⚡ Installation yarn add react-chrono Getting Started Please make sure you wrap the component in a container that has a width and height.
When no mode is specified, the component defaults to HORIZONTAL mode. Please check props for all the available options.
import React from "react" import { Chrono } from "react-chrono";
const Home = () => { const items = [{ title: "May 1940", cardTitle: "Dunkirk", cardSubtitle:"Men of the British Expeditionary Force (BEF) wade out to..", cardDetailedText: "Men of the British Expeditionary Force (BEF) wade out to..", media: { type: "IMAGE", source: { url: "http://someurl/image.jpg" } } }, ...];
return (
<div style={{ width: "500px", height: "400px" }}>
<Chrono items={items} />
</div>
)
} app-home
🚥Vertical Mode To render the timeline vertically use the VERTICAL mode
🚥Vertical Alternating In VERTICAL_ALTERNATING mode the timeline is rendered vertically with cards alternating between left and right side.
📺Slideshow Play the timeline automatically with the slideShow mode. This prop enables the play button on the ui controls.
each array entry will be created as a paragraph inside the timeline card.
⌨Keyboard Navigation The timeline can be navigated via keyboard.
For HORIZONTAL mode use your LEFT RIGHT arrow keys for navigation. For VERTICAL or VERTICAL_ALTERNATING mode, the timeline can be navigated via the UP DOWN arrow keys. To easily jump to the first item or the last item in the timeline, use HOME or END keys. To disable keyboard navigation set disableNavOnKey to true.
Scrollable With the scrollable prop, you can enable scrolling on both VERTICAL and VERTICAL_ALTERNATING modes. The scrollbar is not shown by default. To enable the scrollbar, pass an object with prop scrollbar to scrollable prop.<Chrono items={items} scrollable={{scrollbar: true}} /> 📺Media Both images and videos can be embedded in the timeline.
Just add the media attribute to the Timeline Item model and the component will take care of the rest.
To embed a image { title: "May 1940", cardTitle: "Dunkirk", media: { name: "dunkirk beach", source: { url: "http://someurl/image.jpg" }, type: "IMAGE" } } To embed a video Videos start playing automatically when active and will be automatically paused when not active.
Like images, videos are also automatically hidden when not in the visible viewport of the container.
{ title: "7 December 1941", cardTitle: "Pearl Harbor", media: { source: { url: "/pearl-harbor.mp4", type: "mp4" }, type: "VIDEO", name: "Pearl Harbor" } } To embed YouTube videos, use the right embed url.
{ title: "7 December 1941", cardTitle: "Pearl Harbor", media: { source: { url: "https://www.youtube.com/embed/f6cz9gtMTeI", type: "mp4" }, type: "VIDEO", name: "Pearl Harbor" } } media
🛠Rendering custom content The component also supports embedding custom content in the Timeline cards.
To insert custom content, just pass the blocked elements between the Chrono tags.
For e.g the below snippet will create 2 timeline items. Each div element is automatically converted into a timeline item and inserted into the timeline card. The items collection is completely optional and custom rendering is supported on all 3 modes.
Lorem Ipsum. Lorem Ipsum. Lorem Ipsum
The following snippet sets the the title and cardTitle for the custom contents.
const items = [ {title: "Timeline title 1", cardTitle: "Card Title 1"}, {title: "Timeline title 2", cardTitle: "Card Title 2"} ];
Lorem Ipsum. Lorem Ipsum. Lorem Ipsum
The icons are sequentially set (i.e) the first image you pass will be used as the icon for the first timeline item and so on.
Please make sure to pass in the image collection inside a container with a special className chrono-icons. This convention is mandatory as the component uses this class name to pick the images.
custom icons also works if you are rendering custom content inside the cards.Lorem Ipsum. Lorem Ipsum. Lorem Ipsum
setting this prop enables the play button in the timeline control panel.
Item Width The itemWidth prop can be used to set the width of each individual timeline sections. This setting is applicable only for the HORIZONTAL mode.🎨Theme Customize colors with the theme prop.
<Chrono items={items} theme={{ primary: "red", secondary: "blue", cardBgColor: "yellow", cardForeColor: "violet", titleColor: "red" }} /> 📦CodeSandbox Examples Horizontal Basic Vertical basic Vertical Alternating Vertical All Images Vertical Custom content Vertical Custom content with items collections Custom Icons 📚Storybook Deep dive into wide variety of examples hosted as a Storybook.
Horizontal Collection Vertical Collection 🔨Build Setup
yarn install
yarn run start
yarn run lint:css
yarn run eslint
yarn run lint
yarn run rollup 🧪Tests
yarn run test
yarn run cypress:test 🤝Contributing Fork it Create your feature branch (git checkout -b new-feature) Commit your changes (git commit -am 'Add feature') Push to the branch (git push origin new-feature) Create a new Pull Request 🧱Built with Typescript. Styled with emotion. Powered by snowpack Meta Huge thanks to BrowserStack for the Open Source License!
Distributed under the MIT license. See LICENSE for more information.
Prabhu Murthy – @prabhumurthy2 – [email protected] https://github.com/prabhuignoto
Buy Me A Coffee
Contributors ✨ Thanks goes to these wonderful people (emoji key):
Alois 📖 Koji 📖 Alexandre Girard 💻 Ryuya 📖 This project follows the all-contributors specification. Contributions of any kind welcome!