Grets commited on
Commit
f468dc6
·
verified ·
1 Parent(s): d0ca1f1

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +205 -99
index.html CHANGED
@@ -1,137 +1,213 @@
1
  <!doctype html>
2
- <html lang="de">
3
  <head>
4
  <meta charset="utf-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>AVIP – Benchmark</title>
7
- <meta name="description" content="Do multimodal models actually use the sound in videos?" />
8
 
9
- <!-- Social Cards (optional, ohne Bild) -->
10
  <meta property="og:title" content="AVIP Benchmark" />
11
- <meta property="og:description" content="Do you hear it?" />
12
  <meta property="og:type" content="website" />
 
13
  <meta name="twitter:card" content="summary_large_image" />
14
 
 
15
  <style>
 
 
 
16
  :root{
17
- --bg:#0b0b0c;--surface:#111216;--text:#e9e9ee;--muted:#9aa0a6;--accent:#6ee7ff;--ring:rgba(110,231,255,.35)
 
 
18
  }
19
- @media (prefers-color-scheme: violet){
20
- :root{--bg:#fafafa;--surface:#fff;--text:#101114;--muted:#5f6368;--accent:#0078ff;--ring:rgba(0,120,255,.2)}
 
 
 
21
  }
22
- *{box-sizing:border-box}
23
- html,body{height:100%}
24
  body{
25
- margin:0;
26
- font:16px/1.6 system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;
27
- color:var(--text);
28
  background:
29
  radial-gradient(1200px 800px at 10% -5%, rgba(110,231,255,.08), transparent 40%),
30
  radial-gradient(900px 700px at 110% 10%, rgba(110,231,255,.06), transparent 40%),
31
  var(--bg);
32
  }
33
- .site-header{
34
- position:sticky;top:0;z-index:10;
35
- display:flex;align-items:center;gap:1rem;justify-content:space-between;
36
- padding:.8rem 1rem;border-bottom:1px solid rgba(255,255,255,.06);
37
  background:color-mix(in oklab, var(--surface), transparent 35%);
38
  backdrop-filter:saturate(1.2) blur(8px);
39
  }
40
- .logo{font-weight:700;letter-spacing:.2px;text-decoration:none;color:var(--text)}
41
- .logo span{color:var(--accent)}
42
- .site-nav{display:flex;gap:.75rem}
43
- .site-nav a{color:var(--text);text-decoration:none;padding:.4rem .6rem;border-radius:.5rem}
44
- .site-nav a:hover{outline:2px solid var(--ring);outline-offset:2px}
45
- .nav-toggle{display:none;background:transparent;border:1px solid rgba(255,255,255,.2);color:var(--text);border-radius:.5rem;padding:.4rem .6rem}
 
46
  @media (max-width: 720px){
47
- .nav-toggle{display:inline-block}
48
- .site-nav{position:absolute;right:1rem;top:3.4rem;flex-direction:column;padding:.6rem;background:var(--surface);border:1px solid rgba(255,255,255,.1);border-radius:.6rem;display:none}
49
- .site-nav.open{display:flex}
50
  }
51
- .hero{text-align:center;padding:6rem 1rem 4rem;max-width:920px;margin:0 auto}
52
- .hero h1{font-size:clamp(2rem,3.8vw,3rem);margin:0 0 .5rem}
53
- .hero p{margin:0 0 1.5rem;color:var(--muted)}
54
- .btn{display:inline-block;padding:.7rem 1rem;border-radius:.6rem;background:var(--accent);color:#06141b;text-decoration:none;font-weight:600}
55
- .section{padding:3rem 1rem;max-width:1000px;margin:0 auto}
56
- .features{display:grid;gap:.6rem;grid-template-columns:repeat(auto-fill,minmax(220px,1fr))}
57
- .features li{background:color-mix(in oklab, var(--surface), transparent 10%);border:1px solid rgba(255,255,255,.08);border-radius:.8rem;padding:.9rem}
58
- .table-wrap{overflow-x:auto;background:color-mix(in oklab, var(--surface), transparent 10%);border-radius:.8rem;border:1px solid rgba(255,255,255,.08)}
59
- .table-wrap table{width:100%;border-collapse:collapse}
60
- .table-wrap th,.table-wrap td{padding:.7rem .8rem;border-bottom:1px solid rgba(255,255,255,.06);text-align:left}
61
- .table-wrap th{font-weight:600}
62
- .muted{color:var(--muted)}
63
- .site-footer{padding:2rem 1rem 4rem;text-align:center;color:var(--muted)}
64
- code{background:rgba(127,127,127,.15);padding:.1rem .3rem;border-radius:.3rem}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  </style>
66
  </head>
67
  <body>
 
 
 
 
 
 
 
 
 
 
 
 
68
  <header class="site-header">
69
- <a href="#" class="logo">AVIP<span>Benchmark</span></a>
70
  <button class="nav-toggle" aria-expanded="false" aria-controls="site-nav">☰</button>
71
- <nav id="site-nav" class="site-nav" aria-label="Navigation">
72
  <a href="#home">Home</a>
73
- <a href="#features">Features</a>
74
  <a href="#leaderboard">Leaderboard</a>
75
- <!-- <a href="#podcast">Podcast</a>-->
76
- <a href="#kontakt">Contact</a>
77
  </nav>
78
  </header>
79
 
80
- <main>
81
- <section id="home" class="hero">
82
- <h1>Do you hear it?</h1>
83
- <p>Do multimodal models actually use audio when interpreting videos?</p>
84
- <a class="btn" href="#features">Let's find out</a>
 
 
 
85
  </section>
86
 
87
- <section id="features" class="section">
88
- <h2>Features?</h2>
 
89
  <ul class="features">
90
- <li>Sauberes Grund-Layout (Header, Navigation, Footer)</li>
91
- <li>Responsives Design &amp; Dark/Light via <code>prefers-color-scheme</code></li>
92
- <li>Beispiel-Leaderboard (ohne Backend)</li>
93
- <!-- <li>Podcast-Einbettung (HTML5-Audio)</li> <a -->
94
- <li>Ohne Build-Schritt – einfach hochladen</li>
95
  </ul>
 
 
 
 
 
 
 
 
96
  </section>
97
 
98
- <section id="leaderboard" class="section">
99
- <h2>Leaderboard</h2>
100
- <p class="muted">Performance and Accuracy of the tested models:</p>
101
  <div class="table-wrap">
102
- <table>
103
  <thead>
104
- <tr><th>Rank</th><th>Model</th><th>Accuracy</th><th>Performance</th><th>Last Update</th></tr>
 
 
 
 
 
105
  </thead>
106
- <tbody id="leaderboard-body"><!-- JS rendert hier --></tbody>
107
  </table>
108
  </div>
109
-
110
- <!-- Eingebettete Beispiel-Daten (funktioniert auch lokal ohne Server) -->
111
  <script id="leaderboard-data" type="application/json">{
112
  "rows": [
113
- {"rank": 1, "name": "Qwen", "score": 98, "updated": "2025-08-01"},
114
- {"rank": 2, "name": "Gemini Pro", "score": 92, "updated": "2025-07-28"},
115
- {"rank": 3, "name": "Gemini Flash w/o reasoning", "score": 89, "updated": "2025-07-20"},
116
- {"rank": 3, "name": "Gemini Flash w reasoning", "score": 89, "updated": "2025-07-20"}
117
-
118
  ]
119
  }</script>
120
  </section>
121
 
122
- <!-- <section id="podcast" class="section">
123
- <h2>Podcast</h2>
124
- <p class="muted">Datei einfügen: <code>assets/podcast.mp3</code> oder diesen Block löschen.</p>
125
- <audio controls preload="none">
126
- <source src="assets/podcast.mp3" type="audio/mpeg" />
127
- Dein Browser unterstützt das Audio-Element nicht.
128
- </audio>
129
- </section> -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
130
 
131
  <section id="contact" class="section">
132
  <h2>Contact</h2>
133
- <p>Questions? <a href="mailto: ">bramo.g@protonmail.com</a></p>
134
- <p class="muted"> https://huggingface.co/Grets/AVIP </p>
135
  </section>
136
  </main>
137
 
@@ -140,7 +216,7 @@
140
  </footer>
141
 
142
  <script>
143
- // Mobile-Navi
144
  const navToggle = document.querySelector('.nav-toggle');
145
  const nav = document.getElementById('site-nav');
146
  if (navToggle && nav) {
@@ -149,30 +225,60 @@
149
  navToggle.setAttribute('aria-expanded', String(open));
150
  });
151
  }
152
- // Jahr im Footer
153
  const y = document.getElementById('year');
154
  if (y) y.textContent = new Date().getFullYear();
155
 
156
- // Leaderboard-Rendering
157
- (function renderLeaderboard(){
158
  const el = document.getElementById('leaderboard-body');
159
- const dataEl = document.getElementById('leaderboard-data');
160
- if (!el || !dataEl) return;
 
161
  try {
162
- const data = JSON.parse(dataEl.textContent.trim());
163
- const rows = Array.isArray(data.rows) ? data.rows : [];
164
- rows.sort((a,b) => a.rank - b.rank);
165
- el.innerHTML = rows.map(r => `
166
- <tr>
167
- <td>${r.rank}</td>
168
- <td>${r.name}</td>
169
- <td>${r.score}</td>
170
- <td>${r.updated}</td>
171
- </tr>`).join('');
172
- } catch (e) {
173
- el.innerHTML = '<tr><td colspan="4">Fehler beim Laden der Daten.</td></tr>';
174
  }
 
 
 
 
 
 
 
 
175
  })();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  </script>
177
  </body>
178
- </html>
 
1
  <!doctype html>
2
+ <html lang="en">
3
  <head>
4
  <meta charset="utf-8" />
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>AVIP – Audio–Vision Interaction Probe (Benchmark)</title>
7
+ <meta name="description" content="AVIP is a lightweight benchmark to check whether multimodal models truly use audio in videos." />
8
 
9
+ <!-- Social cards (add your own image at assets/cover.jpg) -->
10
  <meta property="og:title" content="AVIP Benchmark" />
11
+ <meta property="og:description" content="Do multimodal models actually use audio in videos?" />
12
  <meta property="og:type" content="website" />
13
+ <meta property="og:image" content="assets/cover.jpg" />
14
  <meta name="twitter:card" content="summary_large_image" />
15
 
16
+ <link rel="icon" href="assets/favicon.png" />
17
  <style>
18
+ /* =====================
19
+ THEME & BASICS
20
+ ===================== */
21
  :root{
22
+ --bg:#0b0b0c; --surface:#111216; --text:#e9e9ee; --muted:#9aa0a6; --accent:#6ee7ff; --ring:rgba(110,231,255,.35);
23
+ --card: color-mix(in oklab, var(--surface), transparent 8%);
24
+ --border: 1px solid rgba(255,255,255,.08);
25
  }
26
+ @media (prefers-color-scheme: light){
27
+ :root{ --bg:#fafafa; --surface:#ffffff; --text:#101114; --muted:#5f6368; --accent:#0078ff; --ring:rgba(0,120,255,.2);
28
+ --card: color-mix(in oklab, var(--surface), transparent 4%);
29
+ --border: 1px solid rgba(0,0,0,.08);
30
+ }
31
  }
32
+ *,*::before,*::after{ box-sizing:border-box }
33
+ html,body{ height:100% }
34
  body{
35
+ margin:0; font:16px/1.6 system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif; color:var(--text);
 
 
36
  background:
37
  radial-gradient(1200px 800px at 10% -5%, rgba(110,231,255,.08), transparent 40%),
38
  radial-gradient(900px 700px at 110% 10%, rgba(110,231,255,.06), transparent 40%),
39
  var(--bg);
40
  }
41
+ .site-header{ position:sticky; top:0; z-index:20; display:flex; align-items:center; gap:1rem; justify-content:space-between;
42
+ padding:.8rem 1rem; border-bottom:var(--border);
 
 
43
  background:color-mix(in oklab, var(--surface), transparent 35%);
44
  backdrop-filter:saturate(1.2) blur(8px);
45
  }
46
+ .logo{ font-weight:800; letter-spacing:.2px; text-decoration:none; color:var(--text); display:flex; align-items:center; gap:.55rem }
47
+ .logo .dot{ width:.7rem; height:.7rem; border-radius:999px; background:var(--accent); box-shadow:0 0 16px var(--ring) }
48
+ .logo span{ color:var(--accent) }
49
+ .site-nav{ display:flex; gap:.75rem }
50
+ .site-nav a{ color:var(--text); text-decoration:none; padding:.4rem .6rem; border-radius:.5rem }
51
+ .site-nav a:hover{ outline:2px solid var(--ring); outline-offset:2px }
52
+ .nav-toggle{ display:none; background:transparent; border:1px solid rgba(255,255,255,.2); color:var(--text); border-radius:.5rem; padding:.4rem .6rem }
53
  @media (max-width: 720px){
54
+ .nav-toggle{ display:inline-block }
55
+ .site-nav{ position:absolute; right:1rem; top:3.4rem; flex-direction:column; padding:.6rem; background:var(--surface); border:var(--border); border-radius:.6rem; display:none }
56
+ .site-nav.open{ display:flex }
57
  }
58
+
59
+ .hero{ text-align:center; padding:4.5rem 1rem 2rem; max-width:1060px; margin:0 auto }
60
+ .hero h1{ font-size:clamp(2rem,3.6vw,3rem); margin:0 0 .5rem }
61
+ .hero p{ margin:0 0 1.5rem; color:var(--muted) }
62
+ .btn{ display:inline-block; padding:.72rem 1rem; border-radius:.6rem; background:var(--accent); color:#06141b; text-decoration:none; font-weight:700 }
63
+ .cover{ margin:1.2rem auto 0; max-width:980px; aspect-ratio: 16/9; border-radius:.8rem; overflow:hidden; border:var(--border); background:var(--card) }
64
+ .cover img{ width:100%; height:100%; object-fit:cover; display:block }
65
+
66
+ .section{ padding:2.6rem 1rem; max-width:1060px; margin:0 auto }
67
+ .section h2{ font-size:clamp(1.4rem,2.2vw,1.8rem); margin:0 0 .4rem }
68
+ .muted{ color:var(--muted) }
69
+
70
+ .features{ display:grid; gap:.8rem; grid-template-columns:repeat(auto-fill,minmax(230px,1fr)); margin:1rem 0 0 }
71
+ .card{ background:var(--card); border:var(--border); border-radius:.8rem; padding:1rem }
72
+
73
+ /* Leaderboard */
74
+ .table-wrap{ overflow-x:auto; background:var(--card); border-radius:.8rem; border:var(--border) }
75
+ table{ width:100%; border-collapse:collapse }
76
+ th,td{ padding:.7rem .8rem; border-bottom:1px solid rgba(255,255,255,.06); text-align:left }
77
+ th{ font-weight:700 }
78
+ .pill{ display:inline-block; padding:.2rem .5rem; border-radius:.5rem; background:rgba(110,231,255,.18); color:var(--text); font-size:.8rem }
79
+
80
+ /* Media showcase */
81
+ .media-grid{ display:grid; grid-template-columns:2fr 1fr; gap:1rem }
82
+ @media (max-width: 920px){ .media-grid{ grid-template-columns:1fr } }
83
+ figure{ margin:0 }
84
+ .media-card{ background:var(--card); border:var(--border); border-radius:.8rem; padding:.8rem }
85
+ video{ width:100%; max-height:520px; background:#000; border-radius:.6rem }
86
+ .toolbar{ display:flex; gap:.5rem; flex-wrap:wrap; margin:.6rem 0 }
87
+ .toolbar button{ background:transparent; color:var(--text); border:1px solid rgba(255,255,255,.25); padding:.38rem .6rem; border-radius:.5rem; cursor:pointer }
88
+ .toolbar button[aria-pressed="true"]{ outline:2px solid var(--ring) }
89
+
90
+ /* Footer */
91
+ .site-footer{ padding:2rem 1rem 4rem; text-align:center; color:var(--muted) }
92
+
93
+ /* A11y: reduce motion */
94
+ @media (prefers-reduced-motion: reduce){ *{ transition:none!important; animation:none!important } }
95
  </style>
96
  </head>
97
  <body>
98
+ <!--
99
+ ASSETS CHECKLIST (drop into your Space):
100
+ - assets/cover.jpg (hero title image)
101
+ - assets/sample_AV.mp4 (example clip – audio+video)
102
+ - assets/sample_A.mp4 (audio-only version)
103
+ - assets/sample_V.mp4 (video-only version)
104
+ - assets/sample_poster.jpg (poster frame for the video)
105
+ - assets/heatmap.png (overall heatmap graphic)
106
+ - assets/confusion.png (confusion matrix or similar)
107
+ - assets/favicon.png (16–64px)
108
+ -->
109
+
110
  <header class="site-header">
111
+ <a href="#home" class="logo" aria-label="AVIP Benchmark home"><span class="dot" aria-hidden="true"></span> AVIP<span>Benchmark</span></a>
112
  <button class="nav-toggle" aria-expanded="false" aria-controls="site-nav">☰</button>
113
+ <nav id="site-nav" class="site-nav" aria-label="Main navigation">
114
  <a href="#home">Home</a>
115
+ <a href="#about">About</a>
116
  <a href="#leaderboard">Leaderboard</a>
117
+ <a href="#media">Examples</a>
118
+ <a href="#contact">Contact</a>
119
  </nav>
120
  </header>
121
 
122
+ <main id="home">
123
+ <section class="hero" aria-labelledby="tagline">
124
+ <h1 id="tagline">Do you hear it?</h1>
125
+ <p>AVIP probes whether multimodal models actually use <strong>audio</strong> when interpreting videos.</p>
126
+ <a class="btn" href="#media">See examples</a>
127
+ <div class="cover" aria-hidden="true">
128
+ <img src="assets/cover.jpg" alt="Stylized collage of waveforms and video frames" loading="lazy" />
129
+ </div>
130
  </section>
131
 
132
+ <section id="about" class="section">
133
+ <h2>What is AVIP?</h2>
134
+ <p class="muted">A tiny, controlled benchmark with triplet videos per clip: <span class="pill">A</span> audio-only, <span class="pill">V</span> video-only, and <span class="pill">AV</span> audio+video. Tasks: <em>object</em>, <em>material</em>, <em>outcome</em>. We check top‑1 predictions vs. ground truth and look for cross‑modal gains.</p>
135
  <ul class="features">
136
+ <li class="card">📦 <strong>Minimal, reproducible clips</strong><br/>Short single‑impact scenes recorded in a controlled setup.</li>
137
+ <li class="card">🔊 <strong>Modality toggles</strong><br/>Each clip exists as A, V, and AV to test true audio usage.</li>
138
+ <li class="card">📈 <strong>Simple metrics</strong><br/>Top‑1 accuracy per task and an <em>AV − max(A,V)</em> cross‑modal gain.</li>
139
+ <li class="card">🧪 <strong>Probe‑style prompts</strong><br/>Strict label sets &amp; JSON outputs to avoid prompt drift.</li>
 
140
  </ul>
141
+ <details class="card" style="margin-top:1rem">
142
+ <summary><strong>Method (short)</strong></summary>
143
+ <ol>
144
+ <li>For each clip, run models on A, V, and AV variants with the same instruction‑style prompt.</li>
145
+ <li>Decode model outputs into <code>{object, material, outcome}</code> and compare against labels.</li>
146
+ <li>Compute accuracy per task and cross‑modal gain per clip and on average.</li>
147
+ </ol>
148
+ </details>
149
  </section>
150
 
151
+ <section id="leaderboard" class="section" aria-labelledby="lb-title">
152
+ <h2 id="lb-title">Leaderboard</h2>
153
+ <p class="muted">Replace or augment these rows by uploading <code>metrics_by_engine.json</code> or editing the inline JSON below.</p>
154
  <div class="table-wrap">
155
+ <table aria-describedby="lb-title">
156
  <thead>
157
+ <tr>
158
+ <th scope="col">Rank</th>
159
+ <th scope="col">Model</th>
160
+ <th scope="col">Accuracy*</th>
161
+ <th scope="col">Updated</th>
162
+ </tr>
163
  </thead>
164
+ <tbody id="leaderboard-body"><!-- rendered by JS --></tbody>
165
  </table>
166
  </div>
167
+ <p class="muted" style="margin:.6rem 0 0">* Single summary score (demo). For papers, report per‑task accuracy and cross‑modal gain.</p>
 
168
  <script id="leaderboard-data" type="application/json">{
169
  "rows": [
170
+ {"rank": 1, "name": "Qwen2.5‑Omni 7B", "score": 98, "updated": "2025-08-01"},
171
+ {"rank": 2, "name": "Gemini‑2.5 Pro (think)", "score": 92, "updated": "2025-07-28"},
172
+ {"rank": 3, "name": "Gemini‑2.5 Flash (no think)", "score": 89, "updated": "2025-07-20"},
173
+ {"rank": 3, "name": "Gemini‑2.5 Flash (think)", "score": 89, "updated": "2025-07-20"}
 
174
  ]
175
  }</script>
176
  </section>
177
 
178
+ <section id="media" class="section" aria-labelledby="ex-title">
179
+ <h2 id="ex-title">Example clip</h2>
180
+ <div class="media-grid">
181
+ <figure class="media-card">
182
+ <video id="sampleVideo" controls preload="metadata" playsinline poster="assets/sample_poster.jpg">
183
+ <source src="assets/sample_AV.mp4" type="video/mp4" />
184
+ Your browser doesn’t support HTML5 video.
185
+ </video>
186
+ <div class="toolbar" role="toolbar" aria-label="Version selector">
187
+ <button type="button" class="ver" data-src="assets/sample_A.mp4" aria-pressed="false" aria-label="Audio only (A)">A</button>
188
+ <button type="button" class="ver" data-src="assets/sample_V.mp4" aria-pressed="false" aria-label="Video only (V)">V</button>
189
+ <button type="button" class="ver" data-src="assets/sample_AV.mp4" aria-pressed="true" aria-label="Audio + Video (AV)">AV</button>
190
+ <span class="muted" id="verStatus" aria-live="polite" style="margin-left:.4rem">Now showing: AV</span>
191
+ </div>
192
+ <figcaption class="muted">Task labels (demo): <strong>object</strong>=<code>paperbox</code>, <strong>material</strong>=<code>cardboard</code>, <strong>outcome</strong>=<code>bounce</code></figcaption>
193
+ </figure>
194
+ <div class="media-card">
195
+ <figure>
196
+ <img src="assets/heatmap.png" alt="Overall performance heatmap (placeholder)" loading="lazy" style="width:100%; border-radius:.6rem" />
197
+ <figcaption class="muted">Overall heatmap (example). Replace with your exported figure.</figcaption>
198
+ </figure>
199
+ <figure style="margin-top:.8rem">
200
+ <img src="assets/confusion.png" alt="Confusion matrix (placeholder)" loading="lazy" style="width:100%; border-radius:.6rem" />
201
+ <figcaption class="muted">Confusion matrix (example).</figcaption>
202
+ </figure>
203
+ </div>
204
+ </div>
205
+ </section>
206
 
207
  <section id="contact" class="section">
208
  <h2>Contact</h2>
209
+ <p>Questions? <a href="mailto:bramo.g@protonmail.com">bramo.g@protonmail.com</a></p>
210
+ <p class="muted"><a href="https://huggingface.co/Grets/AVIP">huggingface.co/Grets/AVIP</a></p>
211
  </section>
212
  </main>
213
 
 
216
  </footer>
217
 
218
  <script>
219
+ // Mobile nav toggle
220
  const navToggle = document.querySelector('.nav-toggle');
221
  const nav = document.getElementById('site-nav');
222
  if (navToggle && nav) {
 
225
  navToggle.setAttribute('aria-expanded', String(open));
226
  });
227
  }
228
+ // Year in footer
229
  const y = document.getElementById('year');
230
  if (y) y.textContent = new Date().getFullYear();
231
 
232
+ // Leaderboard: try to fetch metrics_by_engine.json if present; else fall back to inline JSON
233
+ (async function renderLeaderboard(){
234
  const el = document.getElementById('leaderboard-body');
235
+ const inline = document.getElementById('leaderboard-data');
236
+ if (!el) return;
237
+ let rows;
238
  try {
239
+ const res = await fetch('metrics_by_engine.json', {cache:'no-store'});
240
+ if (res.ok) {
241
+ const metrics = await res.json();
242
+ // Expecting the AV summary per engine; create a toy score = avg of task accuracies if you provide them.
243
+ // This block is intentionally lightweight – adapt to your file format as needed.
244
+ if (metrics && metrics.leaderboard) {
245
+ rows = metrics.leaderboard;
246
+ }
247
+ }
248
+ } catch(e){ /* ignore and use inline */ }
249
+ if (!rows) {
250
+ try { rows = JSON.parse(inline.textContent.trim()).rows; } catch(e){ rows = []; }
251
  }
252
+ rows.sort((a,b) => a.rank - b.rank);
253
+ el.innerHTML = rows.map(r => `
254
+ <tr>
255
+ <td>${r.rank}</td>
256
+ <td>${r.name}</td>
257
+ <td>${r.score}</td>
258
+ <td>${r.updated}</td>
259
+ </tr>`).join('');
260
  })();
261
+
262
+ // Example video version toggles
263
+ const video = document.getElementById('sampleVideo');
264
+ const verButtons = document.querySelectorAll('.ver');
265
+ const verStatus = document.getElementById('verStatus');
266
+ verButtons.forEach(btn => {
267
+ btn.addEventListener('click', () => {
268
+ verButtons.forEach(b => b.setAttribute('aria-pressed','false'));
269
+ btn.setAttribute('aria-pressed','true');
270
+ const src = btn.getAttribute('data-src');
271
+ const label = btn.textContent.trim();
272
+ if (src && video) {
273
+ const wasPlaying = !video.paused && !video.ended;
274
+ video.pause();
275
+ video.querySelector('source').src = src;
276
+ video.load();
277
+ if (wasPlaying) video.play().catch(()=>{});
278
+ if (verStatus) verStatus.textContent = `Now showing: ${label}`;
279
+ }
280
+ });
281
+ });
282
  </script>
283
  </body>
284
+ </html>