Spaces:
Running
Running
Upload 5 files
Browse files- app.js +33 -13
- data.json +11 -11
- index.html +26 -0
- styles.css +70 -7
app.js
CHANGED
|
@@ -200,6 +200,33 @@ function filteredModels() {
|
|
| 200 |
.sort((a, b) => compareScores(a, b, state.sortMetric, state.sortDirection));
|
| 201 |
}
|
| 202 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 203 |
function renderTable() {
|
| 204 |
const category = currentCategory();
|
| 205 |
const metric = currentMetric();
|
|
@@ -207,6 +234,7 @@ function renderTable() {
|
|
| 207 |
const rankMap = buildRankMap(state.sortMetric);
|
| 208 |
const arrow = state.sortDirection === "desc" ? "↓" : "↑";
|
| 209 |
const preferredDirection = metric.direction === "higher" ? "Higher is better" : "Lower is better";
|
|
|
|
| 210 |
const isDiagnostics = state.track === "diagnostics";
|
| 211 |
|
| 212 |
elements.tablePanel.classList.toggle("is-diagnostics", isDiagnostics);
|
|
@@ -215,17 +243,9 @@ function renderTable() {
|
|
| 215 |
elements.categoryDescription.textContent = category.description;
|
| 216 |
elements.rankingLabel.innerHTML = `
|
| 217 |
Ranked by <strong>${escapeHtml(metric.name)}</strong>
|
| 218 |
-
<span>${preferredDirection}</span>
|
| 219 |
`;
|
| 220 |
-
elements.contextCopy.innerHTML =
|
| 221 |
-
? `
|
| 222 |
-
<p><strong>Diagnostic status.</strong> These four adjusted diagnostics are reported separately from the 32 core metrics. They complement—rather than replace—PVRL, PARL, and HDF, and they are not combined into an overall score.</p>
|
| 223 |
-
<p>SA-PVRL and SA-PARL assign the 30-second cap to unachieved targets. CA-HDF-A and CA-HDF-L normalize conditional HDF to [0,1] and assign zero when the required source state was not established.</p>
|
| 224 |
-
`
|
| 225 |
-
: `
|
| 226 |
-
<p><strong>Reading the ranks.</strong> Click any metric header to rank by that metric. Published three-decimal ties use competition ranking (for example, 1, 1, 3). PVRL and PARL are conditional on successful target achievement and should be read with PVUAR and PAUAR.</p>
|
| 227 |
-
<p>HDF is evaluated only when its required source state was established. NBC, FPS, and TTFC are unavailable for PixVerse R1, HappyOyster, and Odyssey-2 because their web interfaces do not expose the required traces.</p>
|
| 228 |
-
`;
|
| 229 |
|
| 230 |
const metricHeaders = category.metrics.map((metricKey) => {
|
| 231 |
const item = state.data.metrics[metricKey];
|
|
@@ -233,9 +253,10 @@ function renderTable() {
|
|
| 233 |
const ariaSort = active
|
| 234 |
? (state.sortDirection === "desc" ? "descending" : "ascending")
|
| 235 |
: "none";
|
|
|
|
| 236 |
return `
|
| 237 |
<th scope="col" aria-sort="${ariaSort}" class="metric-column ${active ? "is-sorted" : ""}">
|
| 238 |
-
<button type="button" data-sort="${escapeHtml(metricKey)}" title="
|
| 239 |
<span>${escapeHtml(item.abbr)}</span>
|
| 240 |
<i aria-hidden="true">${active ? arrow : "↕"}</i>
|
| 241 |
<small>${item.direction === "higher" ? "higher" : "lower"}</small>
|
|
@@ -359,8 +380,7 @@ function renderMetricGuide() {
|
|
| 359 |
<h3>${escapeHtml(metric.name)}</h3>
|
| 360 |
<p>${escapeHtml(metric.description)}</p>
|
| 361 |
<dl>
|
| 362 |
-
<div><dt>
|
| 363 |
-
<div><dt>Evaluator</dt><dd>${escapeHtml(metric.evaluator)}</dd></div>
|
| 364 |
</dl>
|
| 365 |
</article>
|
| 366 |
`;
|
|
|
|
| 200 |
.sort((a, b) => compareScores(a, b, state.sortMetric, state.sortDirection));
|
| 201 |
}
|
| 202 |
|
| 203 |
+
function contextForCategory(categoryId) {
|
| 204 |
+
const ranking = `
|
| 205 |
+
<p><strong>Ranking.</strong> Ranks use published three-decimal scores; ties use competition ranking (for example, 1, 1, 3). Select a metric to show the best values first, or click its active table header to reverse the display order.</p>
|
| 206 |
+
`;
|
| 207 |
+
const notes = {
|
| 208 |
+
streaming: `
|
| 209 |
+
<p><strong>Availability.</strong> NBC, FPS, and TTFC are unavailable for PixVerse R1, HappyOyster, and Odyssey-2 because their web interfaces do not expose model-native boundaries or reliable generation-time traces.</p>
|
| 210 |
+
`,
|
| 211 |
+
adherence: `
|
| 212 |
+
<p><strong>Endpoint drift.</strong> VID and AID are absolute changes between the first and last 30-second intervals; lower values indicate better stability.</p>
|
| 213 |
+
`,
|
| 214 |
+
stability: `
|
| 215 |
+
<p><strong>Reading drift.</strong> The six drift metrics favor lower endpoint change, while subject and background consistency favor higher values.</p>
|
| 216 |
+
`,
|
| 217 |
+
response: `
|
| 218 |
+
<p><strong>Conditional latency.</strong> PVRL and PARL are measured only for achieved targets and should be read together with PVUAR and PAUAR.</p>
|
| 219 |
+
`,
|
| 220 |
+
state: `
|
| 221 |
+
<p><strong>Conditional coverage.</strong> HDF is evaluated only when the required source state was established.</p>
|
| 222 |
+
`,
|
| 223 |
+
adjusted: `
|
| 224 |
+
<p><strong>Diagnostic status.</strong> These four adjusted diagnostics are separate from the 32 core metrics. SA-PVRL and SA-PARL assign the 30-second cap to unachieved targets; CA-HDF-A and CA-HDF-L assign zero when the required source state was not established.</p>
|
| 225 |
+
`
|
| 226 |
+
};
|
| 227 |
+
return `${ranking}${notes[categoryId] || ""}`;
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
function renderTable() {
|
| 231 |
const category = currentCategory();
|
| 232 |
const metric = currentMetric();
|
|
|
|
| 234 |
const rankMap = buildRankMap(state.sortMetric);
|
| 235 |
const arrow = state.sortDirection === "desc" ? "↓" : "↑";
|
| 236 |
const preferredDirection = metric.direction === "higher" ? "Higher is better" : "Lower is better";
|
| 237 |
+
const displayOrder = state.sortDirection === directionFor(metric) ? "Best to worst" : "Worst to best";
|
| 238 |
const isDiagnostics = state.track === "diagnostics";
|
| 239 |
|
| 240 |
elements.tablePanel.classList.toggle("is-diagnostics", isDiagnostics);
|
|
|
|
| 243 |
elements.categoryDescription.textContent = category.description;
|
| 244 |
elements.rankingLabel.innerHTML = `
|
| 245 |
Ranked by <strong>${escapeHtml(metric.name)}</strong>
|
| 246 |
+
<span>${preferredDirection} · ${displayOrder}</span>
|
| 247 |
`;
|
| 248 |
+
elements.contextCopy.innerHTML = contextForCategory(category.id);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 249 |
|
| 250 |
const metricHeaders = category.metrics.map((metricKey) => {
|
| 251 |
const item = state.data.metrics[metricKey];
|
|
|
|
| 253 |
const ariaSort = active
|
| 254 |
? (state.sortDirection === "desc" ? "descending" : "ascending")
|
| 255 |
: "none";
|
| 256 |
+
const title = active ? `Reverse ${item.name} order` : `Rank by ${item.name}`;
|
| 257 |
return `
|
| 258 |
<th scope="col" aria-sort="${ariaSort}" class="metric-column ${active ? "is-sorted" : ""}">
|
| 259 |
+
<button type="button" data-sort="${escapeHtml(metricKey)}" title="${escapeHtml(title)}">
|
| 260 |
<span>${escapeHtml(item.abbr)}</span>
|
| 261 |
<i aria-hidden="true">${active ? arrow : "↕"}</i>
|
| 262 |
<small>${item.direction === "higher" ? "higher" : "lower"}</small>
|
|
|
|
| 380 |
<h3>${escapeHtml(metric.name)}</h3>
|
| 381 |
<p>${escapeHtml(metric.description)}</p>
|
| 382 |
<dl>
|
| 383 |
+
<div><dt>Reported as</dt><dd>${escapeHtml(metric.range)}${metric.unit ? ` · ${escapeHtml(metric.unit)}` : ""}</dd></div>
|
|
|
|
| 384 |
</dl>
|
| 385 |
</article>
|
| 386 |
`;
|
data.json
CHANGED
|
@@ -129,7 +129,7 @@
|
|
| 129 |
"abbr": "PQ",
|
| 130 |
"name": "Production Quality",
|
| 131 |
"direction": "higher",
|
| 132 |
-
"range": "Original
|
| 133 |
"unit": "",
|
| 134 |
"evaluator": "Audiobox Aesthetics",
|
| 135 |
"description": "Perceptual and production fidelity of the generated audio."
|
|
@@ -228,7 +228,7 @@
|
|
| 228 |
"abbr": "VA-D",
|
| 229 |
"name": "Visual Aesthetics Drift",
|
| 230 |
"direction": "lower",
|
| 231 |
-
"range": "VA
|
| 232 |
"unit": "",
|
| 233 |
"evaluator": "LAION Aesthetic Predictor",
|
| 234 |
"description": "Absolute change in visual aesthetics between the first and last intervals."
|
|
@@ -237,7 +237,7 @@
|
|
| 237 |
"abbr": "VQ-D",
|
| 238 |
"name": "Visual Quality Drift",
|
| 239 |
"direction": "lower",
|
| 240 |
-
"range": "VQ
|
| 241 |
"unit": "",
|
| 242 |
"evaluator": "Gemini 3.1 Pro",
|
| 243 |
"description": "Absolute change in visual quality between the first and last intervals."
|
|
@@ -246,7 +246,7 @@
|
|
| 246 |
"abbr": "PQ-D",
|
| 247 |
"name": "Production Quality Drift",
|
| 248 |
"direction": "lower",
|
| 249 |
-
"range": "PQ
|
| 250 |
"unit": "",
|
| 251 |
"evaluator": "Audiobox Aesthetics",
|
| 252 |
"description": "Absolute change in production quality between the first and last intervals."
|
|
@@ -255,7 +255,7 @@
|
|
| 255 |
"abbr": "AQ-D",
|
| 256 |
"name": "Audio Quality Drift",
|
| 257 |
"direction": "lower",
|
| 258 |
-
"range": "AQ
|
| 259 |
"unit": "",
|
| 260 |
"evaluator": "Gemini 3.1 Pro",
|
| 261 |
"description": "Absolute change in audio quality between the first and last intervals."
|
|
@@ -264,7 +264,7 @@
|
|
| 264 |
"abbr": "SC",
|
| 265 |
"name": "Subject Consistency",
|
| 266 |
"direction": "higher",
|
| 267 |
-
"range": "Original
|
| 268 |
"unit": "",
|
| 269 |
"evaluator": "VBench-Long protocol",
|
| 270 |
"description": "Temporal consistency of subject appearance over the generated sequence."
|
|
@@ -273,7 +273,7 @@
|
|
| 273 |
"abbr": "BC",
|
| 274 |
"name": "Background Consistency",
|
| 275 |
"direction": "higher",
|
| 276 |
-
"range": "Original
|
| 277 |
"unit": "",
|
| 278 |
"evaluator": "VBench-Long protocol",
|
| 279 |
"description": "Temporal consistency of background scenes over the generated sequence."
|
|
@@ -282,7 +282,7 @@
|
|
| 282 |
"abbr": "AVAlign-D",
|
| 283 |
"name": "Audio-Video Alignment Drift",
|
| 284 |
"direction": "lower",
|
| 285 |
-
"range": "AVAlign
|
| 286 |
"unit": "",
|
| 287 |
"evaluator": "ImageBind",
|
| 288 |
"description": "Absolute change in audio-video semantic correspondence between the first and last intervals."
|
|
@@ -291,7 +291,7 @@
|
|
| 291 |
"abbr": "AVSync-D",
|
| 292 |
"name": "Audio-Video Synchronization Drift",
|
| 293 |
"direction": "lower",
|
| 294 |
-
"range": "AVSync
|
| 295 |
"unit": "s",
|
| 296 |
"evaluator": "Synchformer",
|
| 297 |
"description": "Absolute change in audio-video synchronization offset between the first and last intervals."
|
|
@@ -354,7 +354,7 @@
|
|
| 354 |
"abbr": "PVRL",
|
| 355 |
"name": "Prompt-Based Visual Response Latency",
|
| 356 |
"direction": "lower",
|
| 357 |
-
"range": "Media
|
| 358 |
"unit": "s",
|
| 359 |
"evaluator": "Media-time measurement",
|
| 360 |
"description": "Conditional latency to the first clear realization of an achieved visual target."
|
|
@@ -363,7 +363,7 @@
|
|
| 363 |
"abbr": "PARL",
|
| 364 |
"name": "Prompt-Based Audio Response Latency",
|
| 365 |
"direction": "lower",
|
| 366 |
-
"range": "Media
|
| 367 |
"unit": "s",
|
| 368 |
"evaluator": "Media-time measurement",
|
| 369 |
"description": "Conditional latency to the first clear realization of an achieved audio target."
|
|
|
|
| 129 |
"abbr": "PQ",
|
| 130 |
"name": "Production Quality",
|
| 131 |
"direction": "higher",
|
| 132 |
+
"range": "Original score",
|
| 133 |
"unit": "",
|
| 134 |
"evaluator": "Audiobox Aesthetics",
|
| 135 |
"description": "Perceptual and production fidelity of the generated audio."
|
|
|
|
| 228 |
"abbr": "VA-D",
|
| 229 |
"name": "Visual Aesthetics Drift",
|
| 230 |
"direction": "lower",
|
| 231 |
+
"range": "Absolute VA change",
|
| 232 |
"unit": "",
|
| 233 |
"evaluator": "LAION Aesthetic Predictor",
|
| 234 |
"description": "Absolute change in visual aesthetics between the first and last intervals."
|
|
|
|
| 237 |
"abbr": "VQ-D",
|
| 238 |
"name": "Visual Quality Drift",
|
| 239 |
"direction": "lower",
|
| 240 |
+
"range": "Absolute VQ change",
|
| 241 |
"unit": "",
|
| 242 |
"evaluator": "Gemini 3.1 Pro",
|
| 243 |
"description": "Absolute change in visual quality between the first and last intervals."
|
|
|
|
| 246 |
"abbr": "PQ-D",
|
| 247 |
"name": "Production Quality Drift",
|
| 248 |
"direction": "lower",
|
| 249 |
+
"range": "Absolute PQ change",
|
| 250 |
"unit": "",
|
| 251 |
"evaluator": "Audiobox Aesthetics",
|
| 252 |
"description": "Absolute change in production quality between the first and last intervals."
|
|
|
|
| 255 |
"abbr": "AQ-D",
|
| 256 |
"name": "Audio Quality Drift",
|
| 257 |
"direction": "lower",
|
| 258 |
+
"range": "Absolute AQ change",
|
| 259 |
"unit": "",
|
| 260 |
"evaluator": "Gemini 3.1 Pro",
|
| 261 |
"description": "Absolute change in audio quality between the first and last intervals."
|
|
|
|
| 264 |
"abbr": "SC",
|
| 265 |
"name": "Subject Consistency",
|
| 266 |
"direction": "higher",
|
| 267 |
+
"range": "Original score",
|
| 268 |
"unit": "",
|
| 269 |
"evaluator": "VBench-Long protocol",
|
| 270 |
"description": "Temporal consistency of subject appearance over the generated sequence."
|
|
|
|
| 273 |
"abbr": "BC",
|
| 274 |
"name": "Background Consistency",
|
| 275 |
"direction": "higher",
|
| 276 |
+
"range": "Original score",
|
| 277 |
"unit": "",
|
| 278 |
"evaluator": "VBench-Long protocol",
|
| 279 |
"description": "Temporal consistency of background scenes over the generated sequence."
|
|
|
|
| 282 |
"abbr": "AVAlign-D",
|
| 283 |
"name": "Audio-Video Alignment Drift",
|
| 284 |
"direction": "lower",
|
| 285 |
+
"range": "Absolute AVAlign change",
|
| 286 |
"unit": "",
|
| 287 |
"evaluator": "ImageBind",
|
| 288 |
"description": "Absolute change in audio-video semantic correspondence between the first and last intervals."
|
|
|
|
| 291 |
"abbr": "AVSync-D",
|
| 292 |
"name": "Audio-Video Synchronization Drift",
|
| 293 |
"direction": "lower",
|
| 294 |
+
"range": "Absolute AVSync change",
|
| 295 |
"unit": "s",
|
| 296 |
"evaluator": "Synchformer",
|
| 297 |
"description": "Absolute change in audio-video synchronization offset between the first and last intervals."
|
|
|
|
| 354 |
"abbr": "PVRL",
|
| 355 |
"name": "Prompt-Based Visual Response Latency",
|
| 356 |
"direction": "lower",
|
| 357 |
+
"range": "Media-time latency",
|
| 358 |
"unit": "s",
|
| 359 |
"evaluator": "Media-time measurement",
|
| 360 |
"description": "Conditional latency to the first clear realization of an achieved visual target."
|
|
|
|
| 363 |
"abbr": "PARL",
|
| 364 |
"name": "Prompt-Based Audio Response Latency",
|
| 365 |
"direction": "lower",
|
| 366 |
+
"range": "Media-time latency",
|
| 367 |
"unit": "s",
|
| 368 |
"evaluator": "Media-time measurement",
|
| 369 |
"description": "Conditional latency to the first clear realization of an achieved audio target."
|
index.html
CHANGED
|
@@ -237,6 +237,32 @@
|
|
| 237 |
</div>
|
| 238 |
</section>
|
| 239 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 240 |
</main>
|
| 241 |
|
| 242 |
<footer>
|
|
|
|
| 237 |
</div>
|
| 238 |
</section>
|
| 239 |
|
| 240 |
+
<section class="section protocol-section">
|
| 241 |
+
<div class="shell">
|
| 242 |
+
<div class="section-heading">
|
| 243 |
+
<p class="kicker">How to read StreamAV-Bench</p>
|
| 244 |
+
<h2>Performance is a profile, not a single number.</h2>
|
| 245 |
+
</div>
|
| 246 |
+
<div class="protocol-grid">
|
| 247 |
+
<article>
|
| 248 |
+
<span>01</span>
|
| 249 |
+
<h3>Choose the evaluation track</h3>
|
| 250 |
+
<p>Use Progressive for fixed-prompt long-horizon behavior and Interactive for runtime response, retention, and reuse.</p>
|
| 251 |
+
</article>
|
| 252 |
+
<article>
|
| 253 |
+
<span>02</span>
|
| 254 |
+
<h3>Read score and drift together</h3>
|
| 255 |
+
<p>High quality or fulfillment can coexist with temporal drift. Read absolute scores alongside their drift counterparts.</p>
|
| 256 |
+
</article>
|
| 257 |
+
<article>
|
| 258 |
+
<span>03</span>
|
| 259 |
+
<h3>Read success rate with latency</h3>
|
| 260 |
+
<p>Low conditional latency does not guarantee reliable updates. Read response latency together with achievement rate.</p>
|
| 261 |
+
</article>
|
| 262 |
+
</div>
|
| 263 |
+
</div>
|
| 264 |
+
</section>
|
| 265 |
+
|
| 266 |
</main>
|
| 267 |
|
| 268 |
<footer>
|
styles.css
CHANGED
|
@@ -1001,7 +1001,7 @@ thead th.metric-column {
|
|
| 1001 |
grid-column: 1 / -1;
|
| 1002 |
margin-top: 2px;
|
| 1003 |
color: var(--ink-soft);
|
| 1004 |
-
font-size:
|
| 1005 |
letter-spacing: 0.07em;
|
| 1006 |
text-transform: uppercase;
|
| 1007 |
}
|
|
@@ -1166,7 +1166,7 @@ thead .model-heading {
|
|
| 1166 |
.score-cell small {
|
| 1167 |
margin-left: 2px;
|
| 1168 |
color: var(--ink-soft);
|
| 1169 |
-
font-size:
|
| 1170 |
}
|
| 1171 |
|
| 1172 |
.score-cell.is-sorted {
|
|
@@ -1315,7 +1315,7 @@ thead .model-heading {
|
|
| 1315 |
}
|
| 1316 |
|
| 1317 |
.metric-card {
|
| 1318 |
-
min-height:
|
| 1319 |
padding: 22px;
|
| 1320 |
color: var(--ink);
|
| 1321 |
background: var(--white);
|
|
@@ -1338,7 +1338,7 @@ thead .model-heading {
|
|
| 1338 |
align-items: center;
|
| 1339 |
justify-content: space-between;
|
| 1340 |
width: 100%;
|
| 1341 |
-
margin-bottom:
|
| 1342 |
padding: 0;
|
| 1343 |
background: transparent;
|
| 1344 |
border: 0;
|
|
@@ -1386,8 +1386,8 @@ thead .model-heading {
|
|
| 1386 |
}
|
| 1387 |
|
| 1388 |
.metric-card > p {
|
| 1389 |
-
min-height:
|
| 1390 |
-
margin-bottom:
|
| 1391 |
color: var(--ink-soft);
|
| 1392 |
font-size: 14px;
|
| 1393 |
}
|
|
@@ -1396,7 +1396,7 @@ thead .model-heading {
|
|
| 1396 |
display: grid;
|
| 1397 |
gap: 7px;
|
| 1398 |
margin: 0;
|
| 1399 |
-
padding-top:
|
| 1400 |
border-top: 1px solid var(--line);
|
| 1401 |
}
|
| 1402 |
|
|
@@ -1421,6 +1421,52 @@ thead .model-heading {
|
|
| 1421 |
text-align: right;
|
| 1422 |
}
|
| 1423 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1424 |
.is-disabled {
|
| 1425 |
cursor: default;
|
| 1426 |
opacity: 0.56;
|
|
@@ -1574,6 +1620,18 @@ footer {
|
|
| 1574 |
grid-column: 1 / -1;
|
| 1575 |
}
|
| 1576 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1577 |
.footer-inner {
|
| 1578 |
grid-template-columns: 1fr;
|
| 1579 |
justify-items: center;
|
|
@@ -1758,6 +1816,11 @@ footer {
|
|
| 1758 |
min-height: auto;
|
| 1759 |
}
|
| 1760 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1761 |
}
|
| 1762 |
|
| 1763 |
@media (prefers-reduced-motion: reduce) {
|
|
|
|
| 1001 |
grid-column: 1 / -1;
|
| 1002 |
margin-top: 2px;
|
| 1003 |
color: var(--ink-soft);
|
| 1004 |
+
font-size: 10px;
|
| 1005 |
letter-spacing: 0.07em;
|
| 1006 |
text-transform: uppercase;
|
| 1007 |
}
|
|
|
|
| 1166 |
.score-cell small {
|
| 1167 |
margin-left: 2px;
|
| 1168 |
color: var(--ink-soft);
|
| 1169 |
+
font-size: 10px;
|
| 1170 |
}
|
| 1171 |
|
| 1172 |
.score-cell.is-sorted {
|
|
|
|
| 1315 |
}
|
| 1316 |
|
| 1317 |
.metric-card {
|
| 1318 |
+
min-height: 230px;
|
| 1319 |
padding: 22px;
|
| 1320 |
color: var(--ink);
|
| 1321 |
background: var(--white);
|
|
|
|
| 1338 |
align-items: center;
|
| 1339 |
justify-content: space-between;
|
| 1340 |
width: 100%;
|
| 1341 |
+
margin-bottom: 22px;
|
| 1342 |
padding: 0;
|
| 1343 |
background: transparent;
|
| 1344 |
border: 0;
|
|
|
|
| 1386 |
}
|
| 1387 |
|
| 1388 |
.metric-card > p {
|
| 1389 |
+
min-height: 58px;
|
| 1390 |
+
margin-bottom: 16px;
|
| 1391 |
color: var(--ink-soft);
|
| 1392 |
font-size: 14px;
|
| 1393 |
}
|
|
|
|
| 1396 |
display: grid;
|
| 1397 |
gap: 7px;
|
| 1398 |
margin: 0;
|
| 1399 |
+
padding-top: 12px;
|
| 1400 |
border-top: 1px solid var(--line);
|
| 1401 |
}
|
| 1402 |
|
|
|
|
| 1421 |
text-align: right;
|
| 1422 |
}
|
| 1423 |
|
| 1424 |
+
.protocol-section {
|
| 1425 |
+
background: var(--paper-deep);
|
| 1426 |
+
}
|
| 1427 |
+
|
| 1428 |
+
.protocol-grid {
|
| 1429 |
+
display: grid;
|
| 1430 |
+
grid-template-columns: repeat(3, 1fr);
|
| 1431 |
+
gap: 16px;
|
| 1432 |
+
}
|
| 1433 |
+
|
| 1434 |
+
.protocol-grid article {
|
| 1435 |
+
min-height: 280px;
|
| 1436 |
+
padding: 28px;
|
| 1437 |
+
background: var(--white);
|
| 1438 |
+
border: 1px solid var(--line);
|
| 1439 |
+
border-radius: 20px;
|
| 1440 |
+
}
|
| 1441 |
+
|
| 1442 |
+
.protocol-grid article:nth-child(2) {
|
| 1443 |
+
background: var(--green-soft);
|
| 1444 |
+
}
|
| 1445 |
+
|
| 1446 |
+
.protocol-grid article:nth-child(3) {
|
| 1447 |
+
background: var(--blue-soft);
|
| 1448 |
+
}
|
| 1449 |
+
|
| 1450 |
+
.protocol-grid article > span {
|
| 1451 |
+
display: block;
|
| 1452 |
+
margin-bottom: 70px;
|
| 1453 |
+
color: var(--coral);
|
| 1454 |
+
font-family: var(--serif);
|
| 1455 |
+
font-size: 24px;
|
| 1456 |
+
}
|
| 1457 |
+
|
| 1458 |
+
.protocol-grid h3 {
|
| 1459 |
+
margin-bottom: 10px;
|
| 1460 |
+
font-size: 22px;
|
| 1461 |
+
letter-spacing: -0.03em;
|
| 1462 |
+
}
|
| 1463 |
+
|
| 1464 |
+
.protocol-grid p {
|
| 1465 |
+
margin: 0;
|
| 1466 |
+
color: var(--ink-soft);
|
| 1467 |
+
font-size: 15px;
|
| 1468 |
+
}
|
| 1469 |
+
|
| 1470 |
.is-disabled {
|
| 1471 |
cursor: default;
|
| 1472 |
opacity: 0.56;
|
|
|
|
| 1620 |
grid-column: 1 / -1;
|
| 1621 |
}
|
| 1622 |
|
| 1623 |
+
.protocol-grid {
|
| 1624 |
+
grid-template-columns: 1fr;
|
| 1625 |
+
}
|
| 1626 |
+
|
| 1627 |
+
.protocol-grid article {
|
| 1628 |
+
min-height: 220px;
|
| 1629 |
+
}
|
| 1630 |
+
|
| 1631 |
+
.protocol-grid article > span {
|
| 1632 |
+
margin-bottom: 45px;
|
| 1633 |
+
}
|
| 1634 |
+
|
| 1635 |
.footer-inner {
|
| 1636 |
grid-template-columns: 1fr;
|
| 1637 |
justify-items: center;
|
|
|
|
| 1816 |
min-height: auto;
|
| 1817 |
}
|
| 1818 |
|
| 1819 |
+
.protocol-grid article {
|
| 1820 |
+
min-height: 200px;
|
| 1821 |
+
padding: 23px;
|
| 1822 |
+
}
|
| 1823 |
+
|
| 1824 |
}
|
| 1825 |
|
| 1826 |
@media (prefers-reduced-motion: reduce) {
|