diff --git a/suites-experimental/suites.mjs b/suites-experimental/suites.mjs index a47d6aa89..edb91d1f5 100644 --- a/suites-experimental/suites.mjs +++ b/suites-experimental/suites.mjs @@ -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(); + } + }), + ], + }, ]); diff --git a/suites-experimental/timeline/.gitignore b/suites-experimental/timeline/.gitignore new file mode 100644 index 000000000..f9efed21e --- /dev/null +++ b/suites-experimental/timeline/.gitignore @@ -0,0 +1,2 @@ +# Compiled TypeScript and generated output files +src/**/*.js \ No newline at end of file diff --git a/suites-experimental/timeline/README.md b/suites-experimental/timeline/README.md new file mode 100644 index 000000000..27902a484 --- /dev/null +++ b/suites-experimental/timeline/README.md @@ -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. diff --git a/suites-experimental/timeline/data-generator.js b/suites-experimental/timeline/data-generator.js new file mode 100644 index 000000000..a96d43df5 --- /dev/null +++ b/suites-experimental/timeline/data-generator.js @@ -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; +} diff --git a/suites-experimental/timeline/dist/assets/index.css b/suites-experimental/timeline/dist/assets/index.css new file mode 100644 index 000000000..b560bab84 --- /dev/null +++ b/suites-experimental/timeline/dist/assets/index.css @@ -0,0 +1 @@ +:root{--bg-color: #050505;--text-color: #f1f5f9;--sidebar-bg: rgba(10, 10, 10, .7);--border-color: rgba(255, 255, 255, .08);--primary-color: #38bdf8;--primary-hover: #7dd3fc;--header-bg: rgba(5, 5, 5, .75);--card-bg: rgba(15, 15, 20, .6);--shadow: 0 10px 30px -5px rgba(0, 0, 0, .5), 0 8px 10px -6px rgba(0, 0, 0, .5);--card-shadow: 0 15px 35px rgba(0, 0, 0, .6), 0 5px 15px rgba(0, 0, 0, .4);--timeline-line-color: rgba(255, 255, 255, .15);--glass-border: 1px solid rgba(255, 255, 255, .1);--glass-glow: 0 0 20px rgba(56, 189, 248, .15);--tag-hardware-bg: rgba(56, 189, 248, .1);--tag-hardware-color: #38bdf8;--tag-software-bg: rgba(52, 211, 153, .1);--tag-software-color: #34d399;--tag-consumer-bg: rgba(192, 132, 252, .1);--tag-consumer-color: #c084fc;--tag-networking-bg: rgba(251, 191, 36, .1);--tag-networking-color: #fbbf24;--tag-milestone-bg: rgba(248, 113, 113, .1);--tag-milestone-color: #f87171;--tag-gaming-bg: rgba(236, 72, 153, .1);--tag-gaming-color: #ec4899;--tag-art-bg: rgba(249, 115, 22, .1);--tag-art-color: #f97316;--tag-military-bg: rgba(100, 116, 139, .1);--tag-military-color: #64748b}body{margin:0;font-family:Plus Jakarta Sans,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;background:radial-gradient(circle at 10% 20%,#111827,#000000 70%);background-attachment:fixed;color:var(--text-color);display:flex;flex-direction:column;height:100vh;overflow:hidden}#app{height:100%;display:flex;flex-direction:column}#app-container{display:flex;flex-direction:column;height:100%}#app-header{background-color:var(--header-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:var(--glass-border);padding:12px 20px;display:flex;flex-direction:column;align-items:flex-start;gap:8px;z-index:10;box-shadow:var(--shadow)}.header-title-section{display:flex;flex-direction:column;gap:4px}#app-header h1{margin:0;font-size:1.4rem;font-weight:800;letter-spacing:-.02em;background:linear-gradient(135deg,#38bdf8,#c084fc,#f472b6);-webkit-background-clip:text;-webkit-text-fill-color:transparent;text-shadow:0 0 30px rgba(192,132,252,.3);line-height:1.1}.header-title-section .subtitle{font-size:.8rem;font-weight:600;color:#94a3b8;letter-spacing:.1em;text-transform:uppercase}.header-actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:100%;justify-content:space-between}.action-group{display:flex;align-items:center;gap:12px;padding:0 16px;height:38px;box-sizing:border-box;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.05);border-radius:16px;box-shadow:inset 0 2px 10px #0000001a}.action-group:focus-within{border-color:var(--primary-color);background:rgba(255,255,255,.04);box-shadow:0 0 15px #38bdf826,inset 0 2px 10px #0000001a}.group-label{font-size:.75rem;font-weight:700;color:#64748b;text-transform:uppercase;letter-spacing:.05em}#filter-panel{display:flex;flex-wrap:wrap;gap:12px;align-items:center}span.filter-pill{cursor:pointer;-webkit-user-select:none;user-select:none}.tag.inactive{opacity:.4;filter:grayscale(.8);background-color:transparent!important;border-color:#ffffff1a!important;color:#ffffff80!important;box-shadow:none!important}.tag.inactive:hover{opacity:.8;background-color:#ffffff0d!important}.search-replace-panel{display:flex;gap:8px;align-items:center}.search-replace-panel input[type=text]{background:rgba(0,0,0,.2);border:1px solid rgba(255,255,255,.1);color:#fff;border-radius:8px;padding:6px 12px;font-family:inherit;font-size:.8rem;outline:none;width:140px}.search-replace-panel input[type=text]:focus{border-color:var(--primary-color);background:rgba(0,0,0,.4);box-shadow:0 0 15px #38bdf833}#controls{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.divider{width:1px;height:24px;background:rgba(255,255,255,.1);margin:0 4px}button{background:rgba(56,189,248,.1);color:var(--primary-color);border:1px solid rgba(56,189,248,.4);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);padding:6px 12px;border-radius:8px;cursor:pointer;font-weight:700;font-size:.75rem;letter-spacing:.02em;display:flex;align-items:center;gap:6px;white-space:nowrap}button:hover{background:rgba(56,189,248,.25);border-color:#38bdf8cc;transform:translateY(-1px);box-shadow:0 0 15px #38bdf866;transition:background .2s ease,border-color .2s ease,transform .2s ease,box-shadow .2s ease;color:#fff}button:active{transform:translateY(0)}button.btn-primary{background:linear-gradient(135deg,var(--primary-color),var(--primary-hover));color:#fff;border:none;padding:7px 14px;box-shadow:0 4px 15px #38bdf84d}button.btn-primary:hover{background:linear-gradient(135deg,var(--primary-hover),#38bdf8);box-shadow:0 6px 20px #38bdf880;transform:translateY(-1px);border-color:transparent}button.btn-secondary{background:rgba(255,255,255,.05);color:#e2e8f0;border:1px solid rgba(255,255,255,.1)}button.btn-secondary:hover{background:rgba(255,255,255,.1);border-color:#fff3;box-shadow:0 4px 12px #ffffff0d;color:#fff}button.btn-nav{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;padding:4px 10px;text-align:left}button.btn-nav .year{font-size:.75rem;font-weight:800}button.btn-nav .desc{font-size:.6rem;font-weight:500;color:#94a3b8;text-transform:uppercase;letter-spacing:.05em}button.btn-nav:hover .desc{color:#e2e8f0;transition:color .3s}#main-content{display:flex;flex:1;overflow:hidden;position:relative;background:transparent}#toc-sidebar{width:220px;background-color:var(--sidebar-bg);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-right:var(--glass-border);padding:24px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.15) transparent;z-index:5}#toc-sidebar.hidden{transform:translate(-100%);width:0;padding:24px 0;overflow:hidden;opacity:0}#toc-sidebar h2{font-size:.8rem;margin-top:0;margin-bottom:16px;text-transform:uppercase;letter-spacing:.15em;font-weight:800;color:#64748b}#toc-list{list-style:none;padding:0;margin:0}#toc-list li{margin-bottom:6px}#toc-list a{color:#cbd5e1;text-decoration:none;font-size:.85rem;font-weight:600;display:block;padding:8px 12px;border-radius:8px;border:1px solid transparent}#toc-list a:hover{background-color:#38bdf81a;color:var(--primary-color);border-color:#38bdf833;padding-left:16px;box-shadow:inset 3px 0 0 var(--primary-color);transition:all .3s}#document-container{flex:1;overflow-x:auto;overflow-y:hidden;padding:0;scroll-behavior:smooth;display:flex;align-items:center;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.2) rgba(0,0,0,.2)}#document-container::-webkit-scrollbar{height:8px}#document-container::-webkit-scrollbar-track{background:rgba(0,0,0,.2);border-radius:4px}#document-container::-webkit-scrollbar-thumb{background:rgba(255,255,255,.2);border-radius:4px}#document-container::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.4)}#document-content{display:flex;flex-direction:row;gap:90px;position:relative;height:90%;padding-left:100px;padding-right:100px;align-items:center}#document-content:before{content:"";position:absolute;top:50%;left:0;right:0;height:2px;background:linear-gradient(90deg,rgba(56,189,248,.5),rgba(192,132,252,.5));box-shadow:0 0 15px #38bdf899;transform:translateY(-50%);z-index:1}.timeline-card{background-color:var(--card-bg);backdrop-filter:blur(25px);-webkit-backdrop-filter:blur(25px);border:1px solid rgba(255,255,255,.1);border-top:1px solid rgba(255,255,255,.2);border-left:1px solid rgba(255,255,255,.15);border-radius:24px;padding:16px 20px;box-shadow:var(--card-shadow),inset 0 0 20px #ffffff05;display:flex;flex-direction:column;position:relative;z-index:2;height:85%;max-height:520px;min-height:320px;width:320px;box-sizing:border-box;flex-shrink:0;justify-content:flex-start}.virtual-layout .timeline-card{left:var(--x-pos);transform:translateY(-50%)}.browser-layout .timeline-card{transform:none}.timeline-card-inner{display:flex;flex-direction:column;flex:1;overflow:hidden;height:100%}.timeline-card:hover{box-shadow:0 30px 60px -15px #000c,0 0 30px #38bdf826,inset 0 0 20px #ffffff0d;border-color:#38bdf866;transition:box-shadow .3s ease,border-color .3s ease,background-color .3s ease,transform .3s ease}.virtual-layout .timeline-card:hover{transform:translateY(-50%) scale(1.02)}.browser-layout .timeline-card:hover{transform:scale(1.02)}.timeline-card.card-active,.timeline-card:focus{box-shadow:0 0 35px var(--primary-color),inset 0 0 25px #38bdf833!important;border-color:var(--primary-color)!important;transform:scale(1.02);outline:2px solid var(--primary-color);outline-offset:4px}.virtual-layout .timeline-card.card-active,.virtual-layout .timeline-card:focus{transform:translateY(-50%) scale(1.02)}.timeline-card:before{content:"";position:absolute;top:50%;left:-33px;width:16px;height:16px;border-radius:50%;background-color:#0f172a;border:3px solid var(--primary-color);transform:translateY(-50%);box-shadow:0 0 15px #38bdf880,0 0 0 4px #0f172acc;z-index:3}.timeline-card:hover:before{transform:translate(3.2px) translateY(-50%);background-color:var(--primary-color);box-shadow:0 0 45px var(--primary-color),0 0 0 4px #0f172acc;transition:background-color .3s ease,box-shadow .3s ease,transform .3s ease}.timeline-card.tag-hardware:before{border-color:#38bdf8;box-shadow:0 0 15px #38bdf880,0 0 0 4px #0f172acc}.timeline-card.tag-hardware:hover:before{background-color:#38bdf8;box-shadow:0 0 45px #38bdf8,0 0 0 4px #0f172acc}.timeline-card.tag-software:before{border-color:#34d399;box-shadow:0 0 15px #34d39980,0 0 0 4px #0f172acc}.timeline-card.tag-software:hover:before{background-color:#34d399;box-shadow:0 0 45px #34d399,0 0 0 4px #0f172acc}.timeline-card.tag-consumer:before{border-color:#c084fc;box-shadow:0 0 15px #c084fc80,0 0 0 4px #0f172acc}.timeline-card.tag-consumer:hover:before{background-color:#c084fc;box-shadow:0 0 45px #c084fc,0 0 0 4px #0f172acc}.timeline-card.tag-networking:before{border-color:#fbbf24;box-shadow:0 0 15px #fbbf2480,0 0 0 4px #0f172acc}.timeline-card.tag-networking:hover:before{background-color:#fbbf24;box-shadow:0 0 45px #fbbf24,0 0 0 4px #0f172acc}.timeline-card.tag-milestone:before{border-color:#f87171;box-shadow:0 0 15px #f8717180,0 0 0 4px #0f172acc}.timeline-card.tag-milestone:hover:before{background-color:#f87171;box-shadow:0 0 45px #f87171,0 0 0 4px #0f172acc}.timeline-card.tag-gaming:before{border-color:#ec4899;box-shadow:0 0 15px #ec489980,0 0 0 4px #0f172acc}.timeline-card.tag-gaming:hover:before{background-color:#ec4899;box-shadow:0 0 45px #ec4899,0 0 0 4px #0f172acc}.timeline-card.tag-art:before{border-color:#f97316;box-shadow:0 0 15px #f9731680,0 0 0 4px #0f172acc}.timeline-card.tag-art:hover:before{background-color:#f97316;box-shadow:0 0 45px #f97316,0 0 0 4px #0f172acc}.timeline-card.tag-military:before{border-color:#64748b;box-shadow:0 0 15px #64748b80,0 0 0 4px #0f172acc}.timeline-card.tag-military:hover:before{background-color:#64748b;box-shadow:0 0 45px #64748b,0 0 0 4px #0f172acc}.timeline-card.card-header{background:linear-gradient(135deg,rgba(56,189,248,.1) 0%,rgba(192,132,252,.05) 100%);border-color:#38bdf84d;width:300px;justify-content:center;align-items:center;text-align:center;box-shadow:0 20px 40px #0006,inset 0 0 30px #38bdf80d}.timeline-card.card-header .card-date{display:none}.timeline-card.card-header .card-title{font-size:2rem;font-weight:800;margin:0;background:linear-gradient(to right,#38bdf8,#c084fc);-webkit-background-clip:text;-webkit-text-fill-color:transparent;text-shadow:0 0 20px rgba(56,189,248,.2)}.timeline-card.card-header .card-desc{font-size:.9rem;color:#94a3b8;margin-top:12px}.card-header{margin-bottom:12px}.card-date{font-size:.8rem;font-weight:800;color:var(--primary-color);text-transform:uppercase;letter-spacing:.1em;opacity:.9}.card-title{margin:8px 0 0;font-size:1.15rem;font-weight:800;line-height:1.4;color:#f8fafc;overflow-wrap:break-word;word-break:break-word;line-break:strict}.card-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}.tag{font-size:.65rem;padding:4px 10px;border-radius:20px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;border:1px solid transparent;overflow-wrap:break-word;word-break:break-word;line-break:strict}.tag:hover{filter:brightness(1.2);box-shadow:0 0 10px currentColor;transition:filter .3s ease,box-shadow .3s ease}.tag-hardware{background-color:var(--tag-hardware-bg);color:var(--tag-hardware-color);border-color:#38bdf84d}.tag-software{background-color:var(--tag-software-bg);color:var(--tag-software-color);border-color:#34d3994d}.tag-consumer{background-color:var(--tag-consumer-bg);color:var(--tag-consumer-color);border-color:#c084fc4d}.tag-networking{background-color:var(--tag-networking-bg);color:var(--tag-networking-color);border-color:#fbbf244d}.tag-milestone{background-color:var(--tag-milestone-bg);color:var(--tag-milestone-color);border-color:#f871714d}.tag-gaming{background-color:var(--tag-gaming-bg);color:var(--tag-gaming-color);border-color:#ec48994d}.tag-art{background-color:var(--tag-art-bg);color:var(--tag-art-color);border-color:#f973164d}.tag-military{background-color:var(--tag-military-bg);color:var(--tag-military-color);border-color:#64748b4d}.card-desc{font-size:.85rem;line-height:1.6;margin:0 0 16px;color:#cbd5e1;overflow-y:auto;flex-grow:1;padding-right:8px;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.15) transparent;overflow-wrap:break-word;word-break:break-word;line-break:strict}.card-desc::-webkit-scrollbar{width:4px}.card-desc::-webkit-scrollbar-track{background:transparent}.card-desc::-webkit-scrollbar-thumb{background:rgba(255,255,255,.15);border-radius:4px}.card-stats-summary{background:rgba(0,0,0,.2);padding:12px;border-radius:12px;font-size:.75rem;margin-bottom:12px;display:flex;flex-direction:column;gap:4px;border:1px solid rgba(255,255,255,.05);box-shadow:inset 0 2px 10px #0000004d}.card-stats-summary div{display:flex;justify-content:space-between;color:#94a3b8}.card-stats-summary div span:last-child{font-weight:700;color:#e2e8f0}.timeline-card.card-table{min-height:480px}.stats-table{width:100%;border-collapse:separate;border-spacing:0;font-size:.75rem;margin-top:12px;border-radius:12px;overflow:hidden;border:1px solid rgba(255,255,255,.1);background:rgba(0,0,0,.2)}.stats-table th,.stats-table td{padding:8px 12px;text-align:left}.stats-table th{background-color:#38bdf826;font-weight:800;color:#38bdf8;border-bottom:1px solid rgba(255,255,255,.1)}.stats-table tr:nth-child(2n){background-color:#ffffff05}.stats-table td{border-bottom:1px solid rgba(255,255,255,.05);color:#cbd5e1}.stats-table tr:last-child td{border-bottom:none}.timeline-card canvas{background-color:#0000004d;border-radius:12px;margin-top:auto;border:1px solid rgba(255,255,255,.08);max-height:140px;box-shadow:inset 0 2px 10px #00000080;padding:8px}.highlight{background:rgba(251,191,36,.25);color:#fcd34d;padding:2px 4px;border-radius:4px;border-bottom:2px solid #fbbf24;text-shadow:0 0 8px rgba(251,191,36,.5)}#mini-overview-container{height:250px;flex-shrink:0;border-top:2px solid rgba(56,189,248,.5);background:linear-gradient(180deg,rgba(15,23,42,.85) 0%,rgba(5,5,5,.98) 100%);backdrop-filter:blur(40px);-webkit-backdrop-filter:blur(40px);display:flex;flex-direction:column;position:relative;box-sizing:border-box;-webkit-user-select:none;user-select:none;padding:15px 80px;box-shadow:0 -20px 60px #000c,inset 0 2px 20px #38bdf826;z-index:50;overflow:visible}@media (prefers-color-scheme: dark){#mini-overview-container{background:linear-gradient(180deg,rgba(10,15,30,.9) 0%,rgba(0,0,0,.98) 100%);border-top:2px solid rgba(56,189,248,.3)}}.date-slider-row{height:40px;position:relative;display:flex;align-items:center;cursor:pointer;margin-bottom:8px;flex-shrink:0}.date-slider-track{position:absolute;top:50%;left:0;right:0;height:6px;background:rgba(255,255,255,.05);border-radius:3px;transform:translateY(-50%);box-shadow:inset 0 2px 5px #000c,0 0 15px #38bdf81a;border:1px solid rgba(255,255,255,.1)}@media (prefers-color-scheme: dark){.date-slider-track{background:rgba(0,0,0,.4);box-shadow:inset 0 2px 5px #000c,0 0 10px #38bdf826}}.tick-label{position:absolute;transform:translate(-50%);top:28px;font-size:11px;opacity:.8;font-weight:800;color:#94a3b8;letter-spacing:.1em;text-shadow:0 0 8px rgba(0,0,0,.8)}.tick-label:hover{color:#fff;opacity:1;text-shadow:0 0 15px #38bdf8,0 0 30px #c084fc;transform:translate(-50%) scale(1.1);transition:all .3s cubic-bezier(.2,.8,.2,1)}.active-slider-pill{position:absolute;top:50%;transform:translate(-50%,-50%);padding:4px 16px;background:linear-gradient(135deg,#38bdf8,#818cf8,#c084fc);color:#fff;font-size:12px;font-weight:900;border-radius:16px;box-shadow:0 0 25px #8b5cf6cc,inset 0 2px 4px #ffffff80;pointer-events:none;z-index:5;border:1px solid rgba(255,255,255,.4);text-shadow:0 1px 3px rgba(0,0,0,.6)}.computation-graph-row{flex:1;position:relative;min-height:0}.data-marker-row{height:60px;position:relative;flex-shrink:0}.graph-svg{width:100%;height:100%;overflow:visible}.cpu-line{fill:none;stroke:#00f0ff;stroke-width:2.5px;vector-effect:non-scaling-stroke;opacity:.9;filter:url(#glow) drop-shadow(0 0 8px rgba(0,240,255,.8))}.gpu-line{fill:none;stroke:#39ff14;stroke-width:2.5px;vector-effect:non-scaling-stroke;opacity:.9;filter:url(#glow) drop-shadow(0 0 8px rgba(57,255,20,.8))}.tpu-line{fill:none;stroke:#f0f;stroke-width:2.5px;vector-effect:non-scaling-stroke;opacity:.9;filter:url(#glow) drop-shadow(0 0 8px rgba(255,0,255,.8))}.decade-line{stroke:#ffffff26;stroke-width:1px;vector-effect:non-scaling-stroke;stroke-dasharray:2 4}.century-line{stroke:#fff6;stroke-width:2px;vector-effect:non-scaling-stroke;stroke-dasharray:4 4}.data-marker{position:absolute;width:4px;height:4px;border-radius:50%;transform:translate(-50%);z-index:10;cursor:pointer;border:1px solid rgba(255,255,255,.3)}.data-marker:hover,.data-marker.marker-hovered{transform:translate(-50%) translateY(-15px) scale(2.5);z-index:25;transition:all .3s cubic-bezier(.34,1.56,.64,1)}.marker-hardware{background:#38bdf8;box-shadow:0 0 12px #38bdf8}.marker-software{background:#34d399;box-shadow:0 0 12px #34d399}.marker-consumer{background:#c084fc;box-shadow:0 0 12px #c084fc}.marker-networking{background:#fbbf24;box-shadow:0 0 12px #fbbf24}.marker-milestone{background:#f87171;box-shadow:0 0 12px #f87171}.marker-art{background:#fb7185;box-shadow:0 0 12px #fb7185}.marker-military{background:#a3e635;box-shadow:0 0 12px #a3e635}.marker-gaming{background:#e879f9;box-shadow:0 0 12px #e879f9}.marker-politics{background:#60a5fa;box-shadow:0 0 12px #60a5fa}.marker-business{background:#2dd4bf;box-shadow:0 0 12px #2dd4bf}.marker-science{background:#818cf8;box-shadow:0 0 12px #818cf8}.marker-default{background:#f8fafc;box-shadow:0 0 12px #f8fafc}.marker-hardware:hover,.marker-hardware.marker-hovered{box-shadow:0 0 20px #38bdf8,0 0 40px #38bdf8,0 0 60px #38bdf8;background:#fff;border-color:#38bdf8;border-width:2px}.marker-software:hover,.marker-software.marker-hovered{box-shadow:0 0 20px #34d399,0 0 40px #34d399,0 0 60px #34d399;background:#fff;border-color:#34d399;border-width:2px}.marker-consumer:hover,.marker-consumer.marker-hovered{box-shadow:0 0 20px #c084fc,0 0 40px #c084fc,0 0 60px #c084fc;background:#fff;border-color:#c084fc;border-width:2px}.marker-networking:hover,.marker-networking.marker-hovered{box-shadow:0 0 20px #fbbf24,0 0 40px #fbbf24,0 0 60px #fbbf24;background:#fff;border-color:#fbbf24;border-width:2px}.marker-milestone:hover,.marker-milestone.marker-hovered{box-shadow:0 0 20px #f87171,0 0 40px #f87171,0 0 60px #f87171;background:#fff;border-color:#f87171;border-width:2px}.marker-art:hover,.marker-art.marker-hovered{box-shadow:0 0 20px #fb7185,0 0 40px #fb7185,0 0 60px #fb7185;background:#fff;border-color:#fb7185;border-width:2px}.marker-military:hover,.marker-military.marker-hovered{box-shadow:0 0 20px #a3e635,0 0 40px #a3e635,0 0 60px #a3e635;background:#fff;border-color:#a3e635;border-width:2px}.marker-gaming:hover,.marker-gaming.marker-hovered{box-shadow:0 0 20px #e879f9,0 0 40px #e879f9,0 0 60px #e879f9;background:#fff;border-color:#e879f9;border-width:2px}.marker-politics:hover,.marker-politics.marker-hovered{box-shadow:0 0 20px #60a5fa,0 0 40px #60a5fa,0 0 60px #60a5fa;background:#fff;border-color:#60a5fa;border-width:2px}.marker-business:hover,.marker-business.marker-hovered{box-shadow:0 0 20px #2dd4bf,0 0 40px #2dd4bf,0 0 60px #2dd4bf;background:#fff;border-color:#2dd4bf;border-width:2px}.marker-science:hover,.marker-science.marker-hovered{box-shadow:0 0 20px #818cf8,0 0 40px #818cf8,0 0 60px #818cf8;background:#fff;border-color:#818cf8;border-width:2px}.marker-default:hover,.marker-default.marker-hovered{box-shadow:0 0 20px #f8fafc,0 0 40px #f8fafc,0 0 60px #f8fafc;background:#fff;border-color:#f8fafc;border-width:2px}.graph-point{vector-effect:non-scaling-stroke;opacity:.7}.cpu-graph-point{fill:#00f0ff}.gpu-graph-point{fill:#39ff14}.tpu-graph-point{fill:#f0f}.hover-guide{stroke:var(--text-color);stroke-width:1px;vector-effect:non-scaling-stroke;opacity:.2;stroke-dasharray:4 2}.flops-data-dot{position:absolute;width:6px;height:6px;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;z-index:15}.hover-point{position:absolute;width:10px;height:10px;border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;z-index:20;border:2px solid #ffffff}@media (prefers-color-scheme: dark){.hover-point{border-color:#0f172a}}.cpu-point{background-color:#00f0ff;box-shadow:0 0 8px #00f0ff}.gpu-point{background-color:#39ff14;box-shadow:0 0 8px #39ff14}.tpu-point{background-color:#f0f;box-shadow:0 0 8px #f0f}.tooltip-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:2px}.cpu-dot{background:#00f0ff;box-shadow:0 0 6px #00f0ffcc}.gpu-dot{background:#39ff14;box-shadow:0 0 6px #39ff14cc}.tpu-dot{background:#ff00ff;box-shadow:0 0 6px #f0fc}.tooltip-row{display:flex;align-items:center;gap:6px;font-size:11px}.tooltip-label{font-weight:700;color:#94a3b8}.tooltip-val{font-weight:800;color:#f1f5f9}.data-hover-tooltip{position:absolute;bottom:50px;color:var(--text-color);padding:10px 14px;border-radius:12px;font-size:11px;z-index:1000;pointer-events:none;display:flex;flex-direction:column;gap:6px;white-space:nowrap;background:rgba(15,23,42,.85);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(255,255,255,.15);box-shadow:0 15px 30px #00000080,0 0 0 1px #ffffff0d,inset 0 0 20px #38bdf80d}.data-hover-tooltip:after{content:"";position:absolute;bottom:-6px;left:50%;transform:translate(-50%);border-width:6px 6px 0;border-style:solid;border-color:rgba(255,255,255,.15) transparent transparent transparent}.data-hover-tooltip .tooltip-header{font-weight:800;font-size:10px;color:var(--primary-color);text-transform:uppercase;letter-spacing:.1em}.data-hover-tooltip .tooltip-title{font-weight:700;font-size:12px;color:#f1f5f9}.glass-panel{background:rgba(255,255,255,.85);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,.5);box-shadow:0 10px 25px #0000001a,0 0 0 1px #0000000d}@media (prefers-color-scheme: dark){.glass-panel{background:rgba(15,23,42,.85);border:1px solid rgba(255,255,255,.1);box-shadow:0 10px 25px #0000004d,0 0 0 1px #ffffff0d}}.flops-hover-tooltip{position:absolute;bottom:100%;margin-bottom:8px;top:auto;color:var(--text-color);padding:8px 12px;border-radius:10px;font-size:11px;z-index:999;pointer-events:none;display:flex;flex-direction:column;gap:4px;white-space:nowrap;background:rgba(15,23,42,.85);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid rgba(56,189,248,.3);box-shadow:0 10px 25px #00000080,inset 0 0 15px #38bdf80d}.flops-hover-tooltip .tooltip-header{font-weight:800;font-size:11px;border-bottom:1px solid rgba(255,255,255,.15);padding-bottom:4px;margin-bottom:4px;letter-spacing:.05em;color:#f1f5f9}.flops-hover-tooltip .tooltip-line-cpu{color:#38bdf8;font-weight:700;text-shadow:0 0 8px rgba(56,189,248,.6)}.flops-hover-tooltip .tooltip-line-gpu{color:#34d399;font-weight:700;text-shadow:0 0 8px rgba(52,211,153,.6)}.flops-hover-tooltip .tooltip-line-tpu{color:#c084fc;font-weight:700;text-shadow:0 0 8px rgba(192,132,252,.6)}.lang-btn{background:transparent;border:1px solid rgba(255,255,255,.15);color:#64748b;padding:2px 8px;font-family:inherit;font-size:.75rem;font-weight:700;cursor:pointer;border-radius:6px;height:24px;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center}.lang-btn:hover{color:#fff;background:rgba(255,255,255,.05);border-color:#ffffff4d;transition:all .3s}.lang-btn.active{color:#000;background:var(--primary-color);border-color:var(--primary-color);box-shadow:0 0 10px #38bdf866}.search-input{background:transparent;border:none;color:#fff;font-family:inherit;font-size:.8rem;outline:none;width:180px;height:100%;padding:0}.card-desc a{color:var(--primary-color);text-decoration:none;font-weight:600;border-bottom:1px dashed rgba(56,189,248,.4);padding:0 2px;border-radius:2px}.card-desc a:hover{color:#fff;background:rgba(56,189,248,.15);border-bottom:1px solid var(--primary-color);text-shadow:0 0 8px rgba(56,189,248,.4);transition:all .25s cubic-bezier(.2,.8,.2,1)}#document-content.browser-layout .timeline-card{left:auto;transform:none;top:auto;position:relative}#document-content.browser-layout .timeline-card:hover{transform:translateY(-16px) scale(1.02)}.hover-window-band{fill:#38bdf81f;stroke:#38bdf84d;stroke-width:1px;vector-effect:non-scaling-stroke}.density-area-overall{pointer-events:none}.density-line-overall{pointer-events:none;vector-effect:non-scaling-stroke}.search-density-area{pointer-events:none}.search-density-line{pointer-events:none;vector-effect:non-scaling-stroke}.hover-density-area{pointer-events:none}.hover-density-line{pointer-events:none;vector-effect:non-scaling-stroke}.density-tooltip-row{margin-top:2px;padding-top:2px;border-top:1px solid rgba(255,255,255,.08)}.density-dot{background:#38bdf8;box-shadow:0 0 6px #38bdf8cc}.search-density-dot{background:#fbbf24;box-shadow:0 0 6px #fbbf24cc}.category-density-dot{border-radius:50%}.flops-dots-container,.data-markers-container,.density-graph-svg{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.density-graph-svg{z-index:8;overflow:visible}.tooltip-connector{pointer-events:none;vector-effect:non-scaling-stroke}@media (max-height: 680px),(max-width: 900px){#app-header{padding:6px 12px;gap:6px}#app-header h1{font-size:1.1rem}.header-title-section .subtitle{display:none}.header-actions{gap:6px}.action-group{height:30px;padding:0 10px;gap:6px}.group-label{font-size:.65rem}#filter-panel{gap:4px}span.filter-pill,.tag{padding:2px 8px;font-size:.6rem;margin-bottom:2px}.card-tags{margin-bottom:6px}#mini-overview-container{height:110px;padding:6px 30px}.date-slider-row{height:24px;margin-bottom:2px}.tick-label{top:14px;font-size:9px}.active-slider-pill{padding:2px 10px;font-size:10px}.data-marker-row{height:28px}.timeline-card{min-height:240px;padding:12px 16px}.card-title{font-size:1rem;margin:4px 0 0}.card-desc{font-size:.8rem;margin-top:8px}} diff --git a/suites-experimental/timeline/dist/assets/index.js b/suites-experimental/timeline/dist/assets/index.js new file mode 100644 index 000000000..83f80df62 --- /dev/null +++ b/suites-experimental/timeline/dist/assets/index.js @@ -0,0 +1,26 @@ +(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))p(c);new MutationObserver(c=>{for(const u of c)if(u.type==="childList")for(const o of u.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&p(o)}).observe(document,{childList:!0,subtree:!0});function s(c){const u={};return c.integrity&&(u.integrity=c.integrity),c.referrerPolicy&&(u.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?u.credentials="include":c.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function p(c){if(c.ep)return;c.ep=!0;const u=s(c);fetch(c.href,u)}})();if(typeof window<"u"){let t=1;const r=new Map;window.requestAnimationFrame=s=>{const p=t++,c=setTimeout(()=>{r.delete(p),s(performance.now())},0);return r.set(p,c),p},window.cancelAnimationFrame=s=>{const p=r.get(s);p!==void 0&&(clearTimeout(p),r.delete(s))}}typeof globalThis<"u"&&typeof window<"u"&&(globalThis.requestAnimationFrame=window.requestAnimationFrame,globalThis.cancelAnimationFrame=window.cancelAnimationFrame);function Fi(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var We,ri;function Se(){if(ri)return We;ri=1;function t(r,s,p,c,u,o){return{tag:r,key:s,attrs:p,children:c,text:u,dom:o,is:void 0,domSize:void 0,state:void 0,events:void 0,instance:void 0}}return t.normalize=function(r){return Array.isArray(r)?t("[",void 0,void 0,t.normalizeChildren(r),void 0,void 0):r==null||typeof r=="boolean"?null:typeof r=="object"?r:t("#",void 0,void 0,String(r),void 0,void 0)},t.normalizeChildren=function(r){for(var s=new Array(r.length),p=0,c=0;c0&&(c.className=p.join(" ")),Zi(c)?c=zi:Wi.set(c,u),Ii[t]={tag:s,attrs:c,is:c.is}}function ji(t,r){r.tag=t.tag;var s=r.attrs;if(s==null)return r.attrs=t.attrs,r.is=t.is,r;if(Qe.call(s,"class")&&(s.class!=null&&(s.className=s.class),s.class=null),t.attrs!==zi){var p=s.className;s=Object.assign({},t.attrs,s),t.attrs.className!=null&&(s.className=p!=null?String(t.attrs.className)+" "+String(p):t.attrs.className)}return t.tag==="input"&&Qe.call(s,"type")&&(s=Object.assign({type:s.type},s)),r.is=s.is,r.attrs=s,r}function Oi(t,r,...s){if(t==null||typeof t!="string"&&typeof t!="function"&&typeof t.view!="function")throw Error("The selector must be either a string or a component.");var p=Hi(r,s);return typeof t=="string"&&(p.children=Li.normalizeChildren(p.children),t!=="[")?ji(Ii[t]||qi(t),p):(p.attrs==null&&(p.attrs={}),p.tag=t,p)}var Pi=Oi,Ui=Se(),Vi=function(t){return t==null&&(t=""),Ui("<",void 0,void 0,t,void 0,void 0)},Ki=Se(),Xi=vi,Yi=function(t,...r){var s=Xi(t,r);return s.attrs==null&&(s.attrs={}),s.tag="[",s.children=Ki.normalizeChildren(s.children),s},ei=Pi;ei.trust=Vi;ei.fragment=Yi;var Qi=ei,Ne,ni;function Ei(){return ni||(ni=1,Ne=new WeakMap),Ne}var Ze,oi;function Di(){if(oi)return Ze;oi=1;var t=Ei();function*r(s){var p=s.dom,c=s.domSize,u=t.get(p);if(p!=null)do{var o=p.nextSibling;t.get(p)===u&&(yield p,c--),p=o}while(c)}return Ze=r,Ze}var Je=Se(),$i=Ei(),qe=Di(),si=Ai,et=function(){var t={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},r,s;function p(i){return i.ownerDocument}function c(i){return i.attrs&&i.attrs.xmlns||t[i.tag]}function u(i,e){if(i.state!==e)throw new Error("'vnode.state' must not be modified.")}function o(i){var e=i.state;try{return this.apply(e,arguments)}finally{u(i,e)}}function w(i){try{return p(i).activeElement}catch{return null}}function h(i,e,a,d,g,A,N){for(var L=a;L'+e.children+"",A=A.firstChild):A.innerHTML=e.children,e.dom=A.firstChild,e.domSize=A.childNodes.length;for(var N=p(i).createDocumentFragment(),L;L=A.firstChild;)N.appendChild(L);ne(i,N,d)}function k(i,e,a,d,g){var A=p(i).createDocumentFragment();if(e.children!=null){var N=e.children;h(A,N,0,N.length,a,null,d)}e.dom=A.firstChild,e.domSize=A.childNodes.length,ne(i,A,g)}function v(i,e,a,d,g){var A=e.tag,N=e.attrs,L=e.is;d=c(e)||d;var R=d?L?p(i).createElementNS(d,A,{is:L}):p(i).createElementNS(d,A):L?p(i).createElement(A,{is:L}):p(i).createElement(A);if(e.dom=R,N!=null&&He(e,N,d),ne(i,R,g),!Ee(e)&&e.children!=null){var Z=e.children;h(R,Z,0,Z.length,a,null,d),e.tag==="select"&&N!=null&&_e(e,N)}}function D(i,e){var a;if(typeof i.tag.view=="function"){if(i.state=Object.create(i.tag),a=i.state.view,a.$$reentrantLock$$!=null)return;a.$$reentrantLock$$=!0}else{if(i.state=void 0,a=i.tag,a.$$reentrantLock$$!=null)return;a.$$reentrantLock$$=!0,i.state=i.tag.prototype!=null&&typeof i.tag.prototype.view=="function"?new i.tag(i):i.tag(i)}if(le(i.state,i,e),i.attrs!=null&&le(i.attrs,i,e),i.instance=Je.normalize(o.call(i.state.view,i)),i.instance===i)throw Error("A view cannot return the vnode it received as argument");a.$$reentrantLock$$=null}function E(i,e,a,d,g){D(e,a),e.instance!=null?(I(i,e.instance,a,d,g),e.dom=e.instance.dom,e.domSize=e.instance.domSize):e.domSize=0}function m(i,e,a,d,g,A){if(!(e===a||e==null&&a==null))if(e==null||e.length===0)h(i,a,0,a.length,d,g,A);else if(a==null||a.length===0)Ae(i,e,0,e.length);else{var N=e[0]!=null&&e[0].key!=null,L=a[0]!=null&&a[0].key!=null,R=0,Z=0;if(!N)for(;Z=Z&&Y>=R&&(ee=e[ae],U=a[Y],ee.key===U.key);)ee!==U&&b(i,ee,U,d,g,A),U.dom!=null&&(g=U.dom),ae--,Y--;for(;ae>=Z&&Y>=R&&(re=e[Z],V=a[R],re.key===V.key);)Z++,R++,re!==V&&b(i,re,V,d,de(e,Z,g),A);for(;ae>=Z&&Y>=R&&!(R===Y||re.key!==U.key||ee.key!==V.key);)f=de(e,Z,g),se(i,ee,f),ee!==V&&b(i,ee,V,d,f,A),++R<=--Y&&se(i,re,g),re!==U&&b(i,re,U,d,g,A),U.dom!=null&&(g=U.dom),Z++,ae--,ee=e[ae],U=a[Y],re=e[Z],V=a[R];for(;ae>=Z&&Y>=R&&ee.key===U.key;)ee!==U&&b(i,ee,U,d,g,A),U.dom!=null&&(g=U.dom),ae--,Y--,ee=e[ae],U=a[Y];if(R>Y)Ae(i,e,Z,ae+1);else if(Z>ae)h(i,a,R,Y+1,d,g,A);else{var H=g,Q=Y-R+1,K=new Array(Q),ie=0,W=0,te=2147483647,ue=0,ke,ge;for(W=0;W=R;W--){ke==null&&(ke=z(e,Z,ae+1)),U=a[W];var we=ke[U.key];we!=null&&(te=we=R;W--)V=a[W],K[W-R]===-1?I(i,V,d,A,g):ge[ie]===W-R?ie--:se(i,V,g),V.dom!=null&&(g=a[W].dom);else for(W=Y;W>=R;W--)V=a[W],K[W-R]===-1&&I(i,V,d,A,g),V.dom!=null&&(g=a[W].dom)}}else{var ze=e.lengthze&&Ae(i,e,R,e.length),a.length>ze&&h(i,a,R,a.length,d,g,A)}}}function b(i,e,a,d,g,A){var N=e.tag,L=a.tag;if(N===L&&e.is===a.is){if(a.state=e.state,a.events=e.events,O(a,e))return;if(typeof N=="string")switch(a.attrs!=null&&me(a.attrs,a,d),N){case"#":n(e,a);break;case"<":S(i,e,a,A,g);break;case"[":C(i,e,a,d,g,A);break;default:T(e,a,d,A)}else B(i,e,a,d,g,A)}else fe(i,e),I(i,a,d,A,g)}function n(i,e){i.children.toString()!==e.children.toString()&&(i.dom.nodeValue=e.children),e.dom=i.dom}function S(i,e,a,d,g){e.children!==a.children?(Be(i,e),x(i,a,d,g)):(a.dom=e.dom,a.domSize=e.domSize)}function C(i,e,a,d,g,A){m(i,e.children,a.children,d,g,A);var N=0,L=a.children;if(a.dom=null,L!=null)for(var R=0;R>>1)+(d>>>1)+(a&d&1);i[e[L]]0&&(F[g]=e[a-1]),e[a]=g)}for(a=e.length,d=e[a-1];a-- >0;)e[a]=d,d=F[d];return F.length=0,e}function de(i,e,a){for(;e-1||i.is||e!=="href"&&e!=="list"&&e!=="form"&&e!=="width"&&e!=="height")&&e in i.dom}function X(i,e,a){if(e!==a)if(a==null)i.style="";else if(typeof a!="object")i.style=a;else if(e==null||typeof e!="object"){i.style="";for(var d in a){var g=a[d];g!=null&&(d.includes("-")?i.style.setProperty(d,String(g)):i.style[d]=String(g))}}else{for(var d in e)e[d]!=null&&a[d]==null&&(d.includes("-")?i.style.removeProperty(d):i.style[d]="");for(var d in a){var g=a[d];g!=null&&(g=String(g))!==String(e[d])&&(d.includes("-")?i.style.setProperty(d,g):i.style[d]=g)}}}function J(){this._=r}J.prototype=Object.create(null),J.prototype.handleEvent=function(i){var e=this["on"+i.type],a;typeof e=="function"?a=e.call(i.currentTarget,i):typeof e.handleEvent=="function"&&e.handleEvent(i);var d=this;d._!=null&&(i.redraw!==!1&&(0,d._)(),a!=null&&typeof a.then=="function"&&Promise.resolve(a).then(function(){d._!=null&&i.redraw!==!1&&(0,d._)()})),a===!1&&(i.preventDefault(),i.stopPropagation())};function $(i,e,a){if(i.events!=null){if(i.events._=r,i.events[e]===a)return;a!=null&&(typeof a=="function"||typeof a=="object")?(i.events[e]==null&&i.dom.addEventListener(e.slice(2),i.events,!1),i.events[e]=a):(i.events[e]!=null&&i.dom.removeEventListener(e.slice(2),i.events,!1),i.events[e]=void 0)}else a!=null&&(typeof a=="function"||typeof a=="object")&&(i.events=new J,i.dom.addEventListener(e.slice(2),i.events,!1),i.events[e]=a)}function le(i,e,a){typeof i.oninit=="function"&&o.call(i.oninit,e),typeof i.oncreate=="function"&&a.push(o.bind(i.oncreate,e))}function me(i,e,a){typeof i.onupdate=="function"&&a.push(o.bind(i.onupdate,e))}function O(i,e){do{if(i.attrs!=null&&typeof i.attrs.onbeforeupdate=="function"){var a=o.call(i.attrs.onbeforeupdate,i,e);if(a!==void 0&&!a)break}if(typeof i.tag!="string"&&typeof i.state.onbeforeupdate=="function"){var a=o.call(i.state.onbeforeupdate,i,e);if(a!==void 0&&!a)break}return!1}while(!1);return i.dom=e.dom,i.domSize=e.domSize,i.instance=e.instance,i.attrs=e.attrs,i.children=e.children,i.text=e.text,!0}var ce;return function(i,e,a){if(!i)throw new TypeError("DOM element being rendered to does not exist.");if(ce!=null&&i.contains(ce))throw new TypeError("Node is currently being rendered to and thus is locked.");var d=r,g=ce,A=[],N=w(i),L=i.namespaceURI;ce=i,r=typeof a=="function"?a:void 0,s={};try{i.vnodes==null&&(i.textContent=""),e=Je.normalizeChildren(Array.isArray(e)?e:[e]),m(i,i.vnodes,e,A,null,L==="http://www.w3.org/1999/xhtml"?void 0:L),i.vnodes=e,N!=null&&w(i)!==N&&typeof N.focus=="function"&&N.focus();for(var R=0;R=0&&(p.splice(M,2),M<=u&&(u-=2),t(I,[])),P!=null&&(p.push(I,P),t(I,li(P),w))}return{mount:h,redraw:w}},tt=Ci,ii=it(tt,typeof requestAnimationFrame<"u"?requestAnimationFrame:null,typeof console<"u"?console:null),je,di;function Mi(){return di||(di=1,je=function(t){if(Object.prototype.toString.call(t)!=="[object Object]")return"";var r=[];for(var s in t)p(s,t[s]);return r.join("&");function p(c,u){if(Array.isArray(u))for(var o=0;o=0&&(v+=r.slice(p,u)),P>=0&&(v+=(p<0?"?":"&")+I.slice(P,x));var D=t(h);return D&&(v+=(p<0&&P<0?"?":"&")+D),c>=0&&(v+=r.slice(c)),M>=0&&(v+=(c<0?"":"&")+I.slice(M)),v},Oe}var at=ti(),pi=$e,rt=function(t,r){function s(u){return new Promise(u)}function p(u,o){return new Promise(function(w,h){u=at(u,o.params);var I=o.method!=null?o.method.toUpperCase():"GET",P=o.body,M=(o.serialize==null||o.serialize===JSON.serialize)&&!(P instanceof t.FormData||P instanceof t.URLSearchParams),x=o.responseType||(typeof o.extract=="function"?"":"json"),k=new t.XMLHttpRequest,v=!1,D=!1,E=k,m,b=k.abort;k.abort=function(){v=!0,b.call(this)},k.open(I,u,o.async!==!1,typeof o.user=="string"?o.user:void 0,typeof o.password=="string"?o.password:void 0),M&&P!=null&&!c(o,"content-type")&&k.setRequestHeader("Content-Type","application/json; charset=utf-8"),typeof o.deserialize!="function"&&!c(o,"accept")&&k.setRequestHeader("Accept","application/json, text/*"),o.withCredentials&&(k.withCredentials=o.withCredentials),o.timeout&&(k.timeout=o.timeout),k.responseType=x;for(var n in o.headers)pi.call(o.headers,n)&&k.setRequestHeader(n,o.headers[n]);k.onreadystatechange=function(S){if(!v&&S.target.readyState===4)try{var C=S.target.status>=200&&S.target.status<300||S.target.status===304||/^file:\/\//i.test(u),T=S.target.response,B;if(x==="json"){if(!S.target.responseType&&typeof o.extract!="function")try{T=JSON.parse(S.target.responseText)}catch{T=null}}else(!x||x==="text")&&T==null&&(T=S.target.responseText);if(typeof o.extract=="function"?(T=o.extract(S.target,o),C=!0):typeof o.deserialize=="function"&&(T=o.deserialize(T)),C){if(typeof o.type=="function")if(Array.isArray(T))for(var z=0;z-1&&I.pop();for(var M=0;M` und `