Use the controls below the timeline to change the styles of events.
Properties for each event are stored within its object in a simple format.
Each event can be styled individually.
See also:
import { createTimeline } from "kronograph";
import { entities, events } from "./data";
const defaultEventType = {
color: "entity",
lineWidth: 2,
showArrows: true,
};
const eventTypes = { default: defaultEventType };
const timeline = createTimeline("my-timeline");
timeline.set({ entities, events, eventTypes });
timeline.fit();
// Define the setting for each select control
const selectToProp = {
color: (value) => {
return { color: value };
},
"line-width": (value) => {
return { lineWidth: Number(value) };
},
"show-arrows": (value) => {
return { showArrows: value === "true" };
},
};
// When a select control changes, apply the setting to the default event type and update the timeline
Object.keys(selectToProp).forEach((selectName) => {
document.getElementById(selectName).addEventListener("change", (e) => {
Object.assign(defaultEventType, selectToProp[selectName](e.target.value));
timeline.set({ entities, events, eventTypes });
});
}); export const entities = {
"smith-johnathan-151": {
label: "John Smith",
},
"west-josephine-126": {
label: "Josephine West",
color: "#ff9147",
},
"roberts-nathaniel-023": {
label: "Nathan Roberts",
color: "#f7d06e",
},
"baxter-eleanor-004": {
label: "Ella Baxter",
color: "#e12d39",
},
};
export const events = {
"email 1": {
entityIds: ["smith-johnathan-151", "roberts-nathaniel-023"],
time: new Date(2025, 7, 14, 8, 49),
},
"email 2": {
entityIds: ["smith-johnathan-151", "baxter-eleanor-004"],
time: new Date(2025, 7, 14, 8, 56),
},
"email 3": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 9, 2),
},
"email 4": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 9, 27),
},
"email 5": {
entityIds: ["baxter-eleanor-004", "roberts-nathaniel-023"],
time: new Date(2025, 7, 14, 10, 20),
},
"email 6": {
entityIds: ["roberts-nathaniel-023", "smith-johnathan-151"],
time: new Date(2025, 7, 14, 10, 30),
},
"email 7": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 10, 34),
},
"email 8": {
entityIds: ["west-josephine-126", "smith-johnathan-151"],
time: new Date(2025, 7, 14, 10, 40),
},
"email 9": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 10, 51),
},
"email 10": {
entityIds: ["west-josephine-126", "smith-johnathan-151"],
time: new Date(2025, 7, 14, 12, 5),
},
"email 11": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 14, 37),
},
"email 12": {
entityIds: ["baxter-eleanor-004", "west-josephine-126"],
time: new Date(2025, 7, 14, 16, 7),
},
"email 13": {
entityIds: ["west-josephine-126", "roberts-nathaniel-023"],
time: new Date(2025, 7, 14, 17, 42),
},
}; <!doctype html>
<html>
<head>
<link rel="stylesheet" href="@ci/theme/kg/css/examples.css" />
</head>
<body>
<div class="story">
<div class="story__timeline" id="my-timeline"></div>
<div class="story__controls story__controls--row">
<div class="stack">
<div class="story__controls__item">
<label for="color">Color</label>
<select id="color" class="story__controls__item__child--flex-2 select">
<option value="from">From</option>
<option value="to">To</option>
<option value="entity" selected>Entity</option>
<option value="inverse">Inverse</option>
<option value="#e12d39">Red</option>
<option value="#e9b949">Yellow</option>
</select>
</div>
</div>
<div class="stack">
<div class="story__controls__item">
<label for="line-width" class="story__controls__item__child--flex-2">Line Width</label>
<select id="line-width" class="select">
<option value="1">1</option>
<option value="2" selected>2</option>
<option value="4">4</option>
<option value="8">8</option>
<option value="16">16</option>
</select>
</div>
<div class="story__controls__item">
<label for="show-arrows" class="story__controls__item__child--flex-2"
>Show Arrows</label
>
<select id="show-arrows" class="select">
<option value="true" selected>True</option>
<option value="false">False</option>
</select>
</div>
</div>
</div>
</div>
<script type="module" src="./code.js"></script>
</body>
</html> import React, { useState } from "react";
import { createRoot } from "react-dom/client";
import Timeline from "kronograph/react/Timeline";
import { entities, events } from "./data";
export const Demo = () => {
const [eventTypes, setEventTypes] = useState({
default: {
color: "entity",
lineWidth: 2,
showArrows: true,
},
});
return (
<div className="story">
<Timeline
className="story__timeline"
entities={entities}
events={events}
eventTypes={eventTypes}
/>
<div className="story__controls story__controls--row">
<div className="stack">
<div className="story__controls__item">
<label htmlFor="color">Color</label>
<select
id="color"
className="story__controls__item__child--flex-2 select"
defaultValue="entity"
onChange={(e) => {
setEventTypes({ default: { ...eventTypes.default, color: e.target.value } });
}}
>
<option value="from">From</option>
<option value="to">To</option>
<option value="entity">Entity</option>
<option value="inverse">Inverse</option>
<option value="#e12d39">Red</option>
<option value="#e9b949">Yellow</option>
</select>
</div>
</div>
<div className="stack">
<div className="story__controls__item">
<label htmlFor="line-width" className="story__controls__item__child--flex-2">
Line Width
</label>
<select
id="line-width"
className="select"
defaultValue="2"
onChange={(e) => {
setEventTypes({
default: { ...eventTypes.default, lineWidth: Number(e.target.value) },
});
}}
>
<option value="1">1</option>
<option value="2">2</option>
<option value="4">4</option>
<option value="8">8</option>
<option value="16">16</option>
</select>
</div>
<div className="story__controls__item">
<label htmlFor="show-arrows" className="story__controls__item__child--flex-2">
Show Arrows
</label>
<select
id="show-arrows"
className="select"
defaultValue="true"
onChange={(e) => {
setEventTypes({
default: { ...eventTypes.default, showArrows: e.target.value === "true" },
});
}}
>
<option value="true">True</option>
<option value="false">False</option>
</select>
</div>
</div>
</div>
</div>
);
};
const root = createRoot(document.getElementById("my-timeline"));
root.render(<Demo />); export const entities = {
"smith-johnathan-151": {
label: "John Smith",
},
"west-josephine-126": {
label: "Josephine West",
color: "#ff9147",
},
"roberts-nathaniel-023": {
label: "Nathan Roberts",
color: "#f7d06e",
},
"baxter-eleanor-004": {
label: "Ella Baxter",
color: "#e12d39",
},
};
export const events = {
"email 1": {
entityIds: ["smith-johnathan-151", "roberts-nathaniel-023"],
time: new Date(2025, 7, 14, 8, 49),
},
"email 2": {
entityIds: ["smith-johnathan-151", "baxter-eleanor-004"],
time: new Date(2025, 7, 14, 8, 56),
},
"email 3": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 9, 2),
},
"email 4": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 9, 27),
},
"email 5": {
entityIds: ["baxter-eleanor-004", "roberts-nathaniel-023"],
time: new Date(2025, 7, 14, 10, 20),
},
"email 6": {
entityIds: ["roberts-nathaniel-023", "smith-johnathan-151"],
time: new Date(2025, 7, 14, 10, 30),
},
"email 7": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 10, 34),
},
"email 8": {
entityIds: ["west-josephine-126", "smith-johnathan-151"],
time: new Date(2025, 7, 14, 10, 40),
},
"email 9": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 10, 51),
},
"email 10": {
entityIds: ["west-josephine-126", "smith-johnathan-151"],
time: new Date(2025, 7, 14, 12, 5),
},
"email 11": {
entityIds: ["smith-johnathan-151", "west-josephine-126"],
time: new Date(2025, 7, 14, 14, 37),
},
"email 12": {
entityIds: ["baxter-eleanor-004", "west-josephine-126"],
time: new Date(2025, 7, 14, 16, 7),
},
"email 13": {
entityIds: ["west-josephine-126", "roberts-nathaniel-023"],
time: new Date(2025, 7, 14, 17, 42),
},
}; <!doctype html>
<html>
<head>
<link rel="stylesheet" href="@ci/theme/kg/css/examples.css" />
</head>
<body>
<div id="my-timeline" style="height: 100vh"></div>
<script type="module" src="./code.jsx"></script>
</body>
</html>