Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
165adb7
snapshot
camillobruni Jul 1, 2026
5a68128
add-data
camillobruni Jul 1, 2026
12df879
fix
camillobruni Jul 1, 2026
a0b3f1b
timeline: Fix overview layout and scrolling regressions, localize com…
camillobruni Jul 4, 2026
bd69357
fix
camillobruni Jul 6, 2026
800d41c
adding-more-files
camillobruni Jul 6, 2026
f0f713c
timeline: implement search suggestion panel and client-side markdown …
camillobruni Jul 6, 2026
b620d32
timeline: add markdown formatting to all timeline year data files
camillobruni Jul 6, 2026
8db6fc0
timeline: place search box next to language selector in header actions
camillobruni Jul 6, 2026
83b7495
timeline: add styling for parsed markdown links in card descriptions
camillobruni Jul 6, 2026
a8ae799
timeline: add close handlers (blur, escape, click-outside, X button) …
camillobruni Jul 6, 2026
06f32d9
search-data
camillobruni Jul 6, 2026
1fbe1b7
timeline: compile search and suggestions translation assets
camillobruni Jul 6, 2026
89926f3
timeline: add virtualization toggle to switch between browser flex la…
camillobruni Jul 6, 2026
f28a603
timeline: update header layouts, align title top-left, drop search in…
camillobruni Jul 6, 2026
56492a3
more-data-and-style
camillobruni Jul 7, 2026
854e556
add-assets
camillobruni Jul 7, 2026
1a0ac2d
fx
camillobruni Jul 7, 2026
6b88597
update
camillobruni Jul 7, 2026
2ae4234
Add density.js module for timeline density graph calculations
camillobruni Jul 7, 2026
fef6ffb
pre-format
camillobruni Jul 7, 2026
547a61a
fix
camillobruni Jul 7, 2026
26f9b88
fx
camillobruni Jul 8, 2026
22c858c
fix
camillobruni Jul 8, 2026
082874e
fx
camillobruni Jul 8, 2026
bc20680
Merge branch 'main' into 2026-07-01_lazy_load_scroll
camillobruni Jul 8, 2026
cd82c49
more-code
camillobruni Jul 8, 2026
04a458f
fx
camillobruni Jul 8, 2026
9a7f0a2
formatting
camillobruni Jul 8, 2026
f035dcf
fx
camillobruni Jul 8, 2026
c6400cf
update
camillobruni Jul 8, 2026
5eb51c2
steps
camillobruni Jul 8, 2026
1ef492a
fx
camillobruni Jul 8, 2026
dedcc4d
fx
camillobruni Jul 8, 2026
783f685
Merge branch 'main' into 2026-07-01_lazy_load_scroll
camillobruni Jul 15, 2026
53ed158
update
camillobruni Jul 15, 2026
a6b4773
update-content
camillobruni Jul 15, 2026
8c7658b
fx
camillobruni Jul 15, 2026
8b89fb5
format
camillobruni Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 81 additions & 0 deletions suites-experimental/suites.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -280,4 +280,85 @@ export const ExperimentalSuites = freezeSuites([
}),
],
},
{
name: "Timeline-Mithril",
url: "suites-experimental/timeline/dist/index.html",
tags: ["experimental", "timeline", "mithril"],
async prepare(page) {
await page.waitForElement("#app-container");
},
tests: [
new BenchmarkTestStep("Start", (page) => {
const btn = page.querySelector("#btn-explore");
if (btn) {
btn.click();
page.layout();
}
}),
new BenchmarkTestStep("SearchTimeline", (page) => {
const btn = page.querySelector("#btn-explore");
if (btn) {
btn.click();
page.layout();
}
const searchInput = page.querySelector("input.search-input");
if (!searchInput)
return;
const queries = ["C", "Co", "Com", "Comp", "Compu", "Comput", "Compute", "Computer", "", "I", "In", "Int", "Inte", "Intel", "", "A", "Ap", "App", "Appl", "Apple", ""];
for (let round = 0; round < 4; round++) {
for (const q of queries) {
searchInput.setValue(q);
searchInput.dispatchEvent("input");
page.layout();
}
}
}),
new BenchmarkTestStep("FilterByCategory", (page) => {
const btn = page.querySelector("#btn-explore");
if (btn) {
btn.click();
page.layout();
}
const filterPills = page.querySelectorAll(".filter-pill");
if (!filterPills || filterPills.length === 0)
return;
const count = Math.min(filterPills.length, 10);
for (let round = 0; round < 18; round++) {
for (let i = 0; i < count; i++) {
filterPills[i].click();
page.layout();
}
}
}),
new BenchmarkTestStep("SwitchLanguage", (page) => {
const btn = page.querySelector("#btn-explore");
if (btn) {
btn.click();
page.layout();
}
const langButtons = page.querySelectorAll(".lang-selector button.lang-btn");
if (langButtons && langButtons.length > 2) {
for (let round = 0; round < 18; round++) {
langButtons[1].click();
page.layout();
langButtons[2].click();
page.layout();
langButtons[0].click();
page.layout();
}
}
}),
new BenchmarkTestStep("ScrollTimeline", (page) => {
const btn = page.querySelector("#btn-explore");
if (btn) {
btn.click();
page.layout();
}
for (let i = 0; i < 2; i++) {
page.call("stepScrollTimeline");
page.layout();
}
}),
],
},
]);
2 changes: 2 additions & 0 deletions suites-experimental/timeline/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Compiled TypeScript and generated output files
src/**/*.js
18 changes: 18 additions & 0 deletions suites-experimental/timeline/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Timeline Experimental Workload (`suites-experimental/timeline`)

Interactive scrollytelling benchmark tracking computing milestones from 1900 to the present across five localized languages: German (`DE`), French (`FR`), Italian (`IT`), Traditional Chinese (`TW`), and Japanese (`JP`).

## Licensing & Attribution

This experimental workload separates software code from external factual datasets, governed by distinct open-source licenses:

### 1. Software Harness & UI Code (BSD 2-Clause)

All software source code, TypeScript/JavaScript runners, Mithril.js UI components (`src/components/*`, `src/main.ts`, `src/i18n.ts`), test suites (`tests/*`), and build utilities (`generate-index.js`) are licensed under the **BSD 2-Clause License** (see the root [`LICENSE`](../../LICENSE) file).

### 2. Historical Benchmark Data & Translations (CC BY-SA 4.0)

The historical event summaries, descriptions, titles, and localized translations contained within `src/data/*.js` (`1900.js` through `2026.js`) are adapted, condensed, and translated by gemini from articles on **[Wikipedia, The Free Encyclopedia](https://www.wikipedia.org/)**, authored by Wikipedia contributors.

- **License**: All textual content and data structures within `src/data/*.js` are licensed under the **Creative Commons Attribution-ShareAlike 4.0 International License (CC BY-SA 4.0)** (or compatible earlier CC BY-SA 3.0 / GFDL terms where applicable). Full license text: https://creativecommons.org/licenses/by-sa/4.0/
- **Modifications & Translations**: Original Wikipedia article text has been condensed into structured JSON/JS data arrays and translated across German (`DE`), French (`FR`), Italian (`IT`), Traditional Chinese (`TW`), and Japanese (`JP`) using gemini.
86 changes: 86 additions & 0 deletions suites-experimental/timeline/data-generator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
// Copyright (C) 2024-2026 Speedometer Contributors. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted under the terms of the BSD 2-Clause License (see root LICENSE file).

export function generateTimelineData(numEvents = 1000) {
const data = [];
const categories = ["travel", "schools", "medical", "federal", "public-health"];
const severities = ["low", "medium", "high"];

let currentDate = new Date(2020, 0, 1); // Jan 1, 2020

for (let i = 0; i < numEvents; i++) {
const id = `event-${i}`;

if (i % 2 === 0)
currentDate.setDate(currentDate.getDate() + 1);

const dateString = currentDate.toISOString().split("T")[0];

if (i % 50 === 0) {
data.push({
id,
type: "header",
date: dateString,
title: currentDate.toLocaleDateString("en-US", { month: "long", year: "numeric" }),
text: `Phase ${Math.floor(i / 50) + 1} of the pandemic response.`,
});
continue;
}

if (i % 20 === 0) {
data.push({
id,
type: "milestone",
date: dateString,
category: "medical",
title: `Major Milestone: Phase ${Math.floor(i / 20)}`,
text: "Significant progress reported in vaccine development or distribution. National case counts reach new thresholds.",
severity: "high",
});
continue;
}

const category = categories[Math.floor(Math.random() * categories.length)];
const severity = severities[Math.floor(Math.random() * severities.length)];

let title = "";
let text = "";

switch (category) {
case "travel":
title = "Travel Restriction Imposed";
text = "United States imposes travel restrictions on passengers arriving from regions with high infection rates. Screening protocols enhanced at major airports.";
break;
case "schools":
title = "School District Transition";
text = "Major school districts announce transition to remote learning models. Educators and parents adapt to online platforms amidst local case spikes.";
break;
case "medical":
title = "Clinical Trial Update";
text = "Researchers publish preliminary data on therapeutics. Hospitals report on ICU capacity and PPE supply chains.";
break;
case "federal":
title = "Federal Policy Announcement";
text = "Federal agencies issue new guidelines on workplace safety, economic relief packages, or emergency declarations.";
break;
case "public-health":
title = "Public Health Advisory";
text = "CDC updates recommendations on mask-wearing, social distancing, and testing availability. Local officials issue stay-at-home warnings.";
break;
}

data.push({
id,
type: "event",
date: dateString,
category,
title: `${title} (${i})`,
text: `${text} Cumulative impact is assessed by local health departments.`,
severity,
});
}

return data;
}
1 change: 1 addition & 0 deletions suites-experimental/timeline/dist/assets/index.css

Large diffs are not rendered by default.

26 changes: 26 additions & 0 deletions suites-experimental/timeline/dist/assets/index.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions suites-experimental/timeline/dist/assets/index.js.map

Large diffs are not rendered by default.

18 changes: 18 additions & 0 deletions suites-experimental/timeline/dist/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Geschichte des Computers (1900 - 2026)</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&display=swap" rel="stylesheet" />

<script type="module" crossorigin src="./assets/index.js"></script>
<link rel="stylesheet" href="./assets/index.css">
</head>
<body>
<div id="app"></div>

</body>
</html>
Loading
Loading