After interacting with the timeline, click the "Save" button to save a snapshot of its current state.
You can subsequently restore the timeline to that state using the "Load Snapshot" drop-down.
We're using serialize() to create a snapshot, and then restoring it using load().
See Also
After interacting with the timeline, click the "Save" button to save a snapshot of its current state.
You can subsequently restore the timeline to that state using the "Load Snapshot" drop-down.
We're using serialize() to create a snapshot, and then restoring it using the spread operator and onTimelineChange (to also capture user state changes).
See Also
import { createTimeline } from "kronograph";
import data, { createPresetSnapshots } from "./data";
const timeline = createTimeline("my-timeline");
// Timeline options
const timelineOptions = {
events: {
heatmapThreshold: 20,
heatmapValue: null,
heatmapDirection: "any",
},
};
timeline.options(timelineOptions);
timeline.set(data);
timeline.fit();
// ------------------------
// VIEW SNAPSHOT MANAGEMENT
// ------------------------
let savedViewCounter = 1;
const savedViews = {};
// Capture initial snapshot and assign preset snapshots
const initialSnapshot = timeline.serialize();
const presetSnapshots = createPresetSnapshots(initialSnapshot);
// Save View
document.getElementById("save-btn").addEventListener("click", () => {
const snapshot = timeline.serialize();
const name = `Saved View ${savedViewCounter++}`;
savedViews[name] = snapshot;
// Add the view to the dropdown
const dropdown = document.getElementById("load-select");
const newView = document.createElement("option");
newView.value = name;
newView.textContent = name;
dropdown.prepend(newView);
});
// Reset View
document.getElementById("reset-btn").addEventListener("click", () => {
// The initial view must be captured
if (!initialSnapshot) {
return;
}
timeline.load(initialSnapshot);
});
// Restore Snapshot Dropdown
document.getElementById("load-select").addEventListener("change", (e) => {
const key = e.target.value;
if (!key) {
return;
}
// Restore saved view
if (savedViews[key]) {
timeline.load(savedViews[key]);
return;
}
// Restore preset view
if (presetSnapshots[key]) {
const snap = presetSnapshots[key]();
if (snap) {
timeline.load(snap);
}
return;
}
}); export default {
entities: {
"Aurora Bancorp": {
color: "#4e79a7",
},
"Better Life Bank": {
color: "#f28e2c",
},
"Ace Financial Group": {
color: "#e15759",
},
"Grand Mutual Bank": {
color: "#76b7b2",
},
"Felicity Financial Services": {
color: "#59a14f",
},
},
events: {
event0: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 103,
},
time: 1716845042401.983,
},
event1: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1522,
},
time: 1704300247970.444,
},
event2: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 2519,
},
time: 1704826361998.4548,
},
event3: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1744,
},
time: 1721561387584.9785,
},
event4: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1292,
},
time: 1721436187577.0662,
},
event5: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1913,
},
time: 1715184891178.0125,
},
event6: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1379,
},
time: 1720022197785.7358,
},
event7: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 2108,
},
time: 1713047293850.0168,
},
event8: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 39987,
},
time: 1719556922296.1238,
},
event9: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 6269,
},
time: 1717726178569.1255,
},
event10: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 4629,
},
time: 1718167137411.861,
},
event11: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 4112,
},
time: 1719690540773.6128,
},
event12: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 44477,
},
time: 1718653783292.392,
},
event13: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 86674,
},
time: 1719055763972.7158,
},
event14: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 96953,
},
time: 1718812764374.0154,
},
event15: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 57831,
},
time: 1717355969771.8218,
},
event16: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 1992,
},
time: 1721029217990.7224,
},
event17: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 471,
},
time: 1722545977814.828,
},
event18: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 2274,
},
time: 1712785338304.0298,
},
event19: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 3067,
},
time: 1706715885813.1304,
},
event20: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 670,
},
time: 1705034721408.0198,
},
event21: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 648,
},
time: 1719489884462.4038,
},
event22: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 325,
},
time: 1721614571235.6663,
},
event23: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 851,
},
time: 1705237236251.1895,
},
event24: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 3121,
},
time: 1721380170448.32,
},
event25: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1778,
},
time: 1719476838892.334,
},
event26: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 3781,
},
time: 1714459016034.4941,
},
event27: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1165,
},
time: 1713136401986.9214,
},
event28: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 2237,
},
time: 1712559528845.578,
},
event29: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1535,
},
time: 1720931783679.7734,
},
event30: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1622,
},
time: 1721528143853.7964,
},
event31: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 523,
},
time: 1709514478039.349,
},
event32: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1257,
},
time: 1715409427247.5706,
},
event33: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 736,
},
time: 1707482336867.2246,
},
event34: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 184,
},
time: 1725199319145.929,
},
event35: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1058,
},
time: 1713232568113.0273,
},
event36: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1429,
},
time: 1721868788309.195,
},
event37: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1197,
},
time: 1707839323010.2188,
},
event38: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 2522,
},
time: 1717712034817.7363,
},
event39: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 3094,
},
time: 1724919209625.5513,
},
event40: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1121,
},
time: 1718493292818.4546,
},
event41: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 2878,
},
time: 1714709244615.406,
},
event42: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1504,
},
time: 1715372672224.4255,
},
event43: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 320,
},
time: 1710331215554.826,
},
event44: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1906,
},
time: 1710184345462.6362,
},
event45: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1246,
},
time: 1725198486655.9883,
},
event46: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1476,
},
time: 1706451804586.463,
},
event47: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 192,
},
time: 1723811742494.3857,
},
},
eventTypes: {
default: {
lineWidth: 2,
color: "#00a2ed",
},
},
};
export function createPresetSnapshots(initialSnapshot) {
// Snapshots can be taken only after the initial render
if (!initialSnapshot) {
return null;
}
const presetSnapshots = {
"preset-1": () => {
// Create a deep clone of the initial snapshot
const snap = structuredClone(initialSnapshot);
// Override annotations
snap.annotations = {
myAnnotation: {
label: "These transactions have warnings",
subject: ["event37", "event0"],
},
};
// Override reveal
snap.reveal = ["event0", "event37"];
// Override range (zoom window)
snap.range = {
start: new Date("2023-12-22T14:28:14.411Z"),
end: new Date("2024-09-13T15:17:52.704Z"),
startNanoseconds: 0,
endNanoseconds: 0,
};
return snap;
},
"preset-2": () => {
const snap = structuredClone(initialSnapshot);
// Override range (zoom window)
snap.range = {
start: new Date("2024-04-19T03:43:05.156Z"),
end: new Date("2024-05-15T03:13:14.663Z"),
startNanoseconds: 0,
endNanoseconds: 0,
};
snap.focus = ["Felicity Financial Services"];
snap.markers = [{ label: "Marker 1", time: new Date("2024-05-10T03:13:14.663Z") }];
return snap;
},
};
return presetSnapshots;
} <!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="story__controls__item">
<button id="save-btn" class="button">Save</button>
<button id="reset-btn" class="button">Reset</button>
</div>
<div class="story__controls__item">
<label for="load-select">Load Snapshot</label>
<select id="load-select" class="select">
<option value="preset-2">Preset 2</option>
<option value="preset-1">Preset 1</option>
<option value="" selected disabled>Select snapshot...</option>
</select>
</div>
</div>
</div>
<script type="module" src="./code.js"></script>
</body>
</html> import React, { useState, useRef, useEffect } from "react";
import { createRoot } from "react-dom/client";
import Timeline from "kronograph/react/Timeline";
import data, { createPresetSnapshots } from "./data";
const options = {
events: {
heatmapThreshold: 20,
heatmapValue: null,
heatmapDirection: "any",
},
};
export const Demo = () => {
const timelineRef = useRef(null);
const initialSnapshotRef = useRef(null);
const presetSnapshotsRef = useRef(null);
const [currentState, setCurrentState] = useState(null);
const [savedViews, setSavedViews] = useState({});
const [savedViewsCounter, setSavedViewsCounter] = useState(1);
// Assign the initial and preset snapshots
useEffect(() => {
// The initial snapshot must be captured
if (!timelineRef.current || initialSnapshotRef.current) {
return;
}
const snapshot = timelineRef.current.serialize();
initialSnapshotRef.current = snapshot;
presetSnapshotsRef.current = createPresetSnapshots(snapshot);
}, []);
// Save view
function onSave() {
const snapshot = timelineRef.current.serialize();
const name = `Saved View ${savedViewsCounter}`;
setSavedViews((prev) => {
return {
[name]: snapshot,
...prev,
};
});
setSavedViewsCounter((c) => c + 1);
}
// Reset View
function onReset() {
// Initial view must be captured
if (!initialSnapshotRef.current) {
return;
}
setCurrentState(initialSnapshotRef.current);
}
function onDropdownChange(e) {
const key = e.target.value;
if (!key) {
return;
}
// Restore a saved view
if (savedViews[key]) {
setCurrentState(savedViews[key]);
return;
}
// Restore a preset view
if (presetSnapshotsRef.current[key]) {
const snap = presetSnapshotsRef.current[key]();
if (snap) {
setCurrentState(snap);
}
return;
}
}
return (
<div className="story">
<Timeline
{...currentState}
className="story__timeline"
ref={timelineRef}
entities={data.entities}
events={data.events}
eventTypes={data.eventTypes}
options={options}
// To be able to restore views, the timeline components are controlled
onTimelineChange={({ why }) => {
if (why === "user") {
setCurrentState(timelineRef.current.serialize());
}
}}
/>
<div className="story__controls story__controls--row">
<div className="story__controls__item">
<button id="save-btn" className="button" onClick={onSave}>
Save
</button>
<button id="reset-btn" className="button" onClick={onReset}>
Reset
</button>
</div>
<div className="story__controls__item">
<label htmlFor="restore-select">Load Snapshot</label>
<select id="restore-select" className="select" onChange={onDropdownChange}>
{Object.keys(savedViews).map((name) => (
<option key={name} value={name}>
{name}
</option>
))}
<option value="preset-2">Preset 2</option>
<option value="preset-1">Preset 1</option>
<option value="" selected disabled>
Select snapshot...
</option>
</select>
</div>
</div>
</div>
);
};
const root = createRoot(document.getElementById("my-timeline"));
root.render(<Demo />); export default {
entities: {
"Aurora Bancorp": {
color: "#4e79a7",
},
"Better Life Bank": {
color: "#f28e2c",
},
"Ace Financial Group": {
color: "#e15759",
},
"Grand Mutual Bank": {
color: "#76b7b2",
},
"Felicity Financial Services": {
color: "#59a14f",
},
},
events: {
event0: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 103,
},
time: 1716845042401.983,
},
event1: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1522,
},
time: 1704300247970.444,
},
event2: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 2519,
},
time: 1704826361998.4548,
},
event3: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1744,
},
time: 1721561387584.9785,
},
event4: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1292,
},
time: 1721436187577.0662,
},
event5: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1913,
},
time: 1715184891178.0125,
},
event6: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 1379,
},
time: 1720022197785.7358,
},
event7: {
entityIds: {
from: "Aurora Bancorp",
to: "Better Life Bank",
},
data: {
amount: 2108,
},
time: 1713047293850.0168,
},
event8: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 39987,
},
time: 1719556922296.1238,
},
event9: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 6269,
},
time: 1717726178569.1255,
},
event10: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 4629,
},
time: 1718167137411.861,
},
event11: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 4112,
},
time: 1719690540773.6128,
},
event12: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 44477,
},
time: 1718653783292.392,
},
event13: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 86674,
},
time: 1719055763972.7158,
},
event14: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 96953,
},
time: 1718812764374.0154,
},
event15: {
entityIds: {
from: "Aurora Bancorp",
to: "Felicity Financial Services",
},
data: {
amount: 57831,
},
time: 1717355969771.8218,
},
event16: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 1992,
},
time: 1721029217990.7224,
},
event17: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 471,
},
time: 1722545977814.828,
},
event18: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 2274,
},
time: 1712785338304.0298,
},
event19: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 3067,
},
time: 1706715885813.1304,
},
event20: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 670,
},
time: 1705034721408.0198,
},
event21: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 648,
},
time: 1719489884462.4038,
},
event22: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 325,
},
time: 1721614571235.6663,
},
event23: {
entityIds: {
from: "Aurora Bancorp",
to: "Ace Financial Group",
},
data: {
amount: 851,
},
time: 1705237236251.1895,
},
event24: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 3121,
},
time: 1721380170448.32,
},
event25: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1778,
},
time: 1719476838892.334,
},
event26: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 3781,
},
time: 1714459016034.4941,
},
event27: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1165,
},
time: 1713136401986.9214,
},
event28: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 2237,
},
time: 1712559528845.578,
},
event29: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1535,
},
time: 1720931783679.7734,
},
event30: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 1622,
},
time: 1721528143853.7964,
},
event31: {
entityIds: {
from: "Aurora Bancorp",
to: "Grand Mutual Bank",
},
data: {
amount: 523,
},
time: 1709514478039.349,
},
event32: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1257,
},
time: 1715409427247.5706,
},
event33: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 736,
},
time: 1707482336867.2246,
},
event34: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 184,
},
time: 1725199319145.929,
},
event35: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1058,
},
time: 1713232568113.0273,
},
event36: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1429,
},
time: 1721868788309.195,
},
event37: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 1197,
},
time: 1707839323010.2188,
},
event38: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 2522,
},
time: 1717712034817.7363,
},
event39: {
entityIds: {
from: "Better Life Bank",
to: "Felicity Financial Services",
},
data: {
amount: 3094,
},
time: 1724919209625.5513,
},
event40: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1121,
},
time: 1718493292818.4546,
},
event41: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 2878,
},
time: 1714709244615.406,
},
event42: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1504,
},
time: 1715372672224.4255,
},
event43: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 320,
},
time: 1710331215554.826,
},
event44: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1906,
},
time: 1710184345462.6362,
},
event45: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1246,
},
time: 1725198486655.9883,
},
event46: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 1476,
},
time: 1706451804586.463,
},
event47: {
entityIds: {
from: "Ace Financial Group",
to: "Felicity Financial Services",
},
data: {
amount: 192,
},
time: 1723811742494.3857,
},
},
eventTypes: {
default: {
lineWidth: 2,
color: "#00a2ed",
},
},
};
export function createPresetSnapshots(initialSnapshot) {
// Snapshots can be taken only after the initial render
if (!initialSnapshot) {
return null;
}
const presetSnapshots = {
"preset-1": () => {
// Create a deep clone of the initial snapshot
const snap = structuredClone(initialSnapshot);
// Override annotations
snap.annotations = {
myAnnotation: {
label: "These transactions have warnings",
subject: ["event37", "event0"],
},
};
// Override reveal
snap.reveal = ["event0", "event37"];
// Override range (zoom window)
snap.range = {
start: new Date("2023-12-22T14:28:14.411Z"),
end: new Date("2024-09-13T15:17:52.704Z"),
startNanoseconds: 0,
endNanoseconds: 0,
};
return snap;
},
"preset-2": () => {
const snap = structuredClone(initialSnapshot);
// Override range (zoom window)
snap.range = {
start: new Date("2024-04-19T03:43:05.156Z"),
end: new Date("2024-05-15T03:13:14.663Z"),
startNanoseconds: 0,
endNanoseconds: 0,
};
snap.focus = ["Felicity Financial Services"];
snap.markers = [{ label: "Marker 1", time: new Date("2024-05-10T03:13:14.663Z") }];
return snap;
},
};
return presetSnapshots;
} <!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>