lllqaq's picture
Add VisPhyWorld static comparator Space
31443df verified
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>VisPhyWorld Comparator</title>
<link rel="icon" href="data:," />
<link rel="stylesheet" href="./static/style.css" />
</head>
<body>
<div class="page-shell">
<header class="hero">
<div class="hero-copy">
<div class="eyebrow">VisPhyWorld Demo</div>
<h1 class="title">Ground Truth vs Generated Video Comparator</h1>
<p class="subtitle">
Browse the `sub` split sample by sample. Keep the ground-truth video fixed and compare matching
generated videos across engines and models.
</p>
</div>
<div class="hero-actions">
<div class="source-toggle" role="radiogroup" aria-label="Asset source">
<button type="button" class="source-btn" id="source-local">Local</button>
<button type="button" class="source-btn" id="source-hub">Hugging Face</button>
</div>
<div class="hero-tool-row">
<button type="button" class="action-btn accent-outline" id="random-sample">Random sample</button>
<button type="button" class="action-btn accent-outline" id="copy-link">Copy link</button>
</div>
<div class="hero-note" id="source-note"></div>
</div>
</header>
<main class="layout">
<aside class="control-panel">
<section class="panel">
<div class="panel-label">Navigation</div>
<div class="nav-row">
<button class="nav-btn" id="prev-sample" title="Previous sample"></button>
<button class="nav-btn" id="next-sample" title="Next sample"></button>
<div class="counter" id="sample-counter">0/0</div>
</div>
<label class="field-label" for="sample-search">Search task</label>
<input id="sample-search" class="text-input" type="search" placeholder="task10021_014" />
<label class="field-label" for="sample-select">Task</label>
<select id="sample-select" class="sample-select" aria-label="Sample selector"></select>
</section>
<section class="panel">
<div class="panel-label">Sample Metadata</div>
<div class="chip-row" id="sample-meta"></div>
<div class="meta-list">
<div><span class="meta-key">Task</span><span class="meta-value" id="meta-task">-</span></div>
<div><span class="meta-key">Split</span><span class="meta-value" id="meta-split">-</span></div>
<div><span class="meta-key">Results</span><span class="meta-value" id="meta-results">-</span></div>
<div><span class="meta-key">Detection</span><span class="meta-value" id="meta-detection">-</span></div>
</div>
</section>
<section class="panel">
<div class="panel-label">Playback</div>
<div class="button-grid">
<button type="button" class="action-btn" id="sync-toggle">Sync: On</button>
<button type="button" class="action-btn" id="mute-toggle">Muted: On</button>
<button type="button" class="action-btn" id="play-all">Play all</button>
<button type="button" class="action-btn" id="pause-all">Pause all</button>
<button type="button" class="action-btn" id="restart-all">Restart</button>
</div>
<label class="field-label" for="playback-rate">Playback rate</label>
<select id="playback-rate" class="sample-select">
<option value="0.5">0.5x</option>
<option value="0.75">0.75x</option>
<option value="1" selected>1.0x</option>
<option value="1.25">1.25x</option>
<option value="1.5">1.5x</option>
</select>
</section>
<section class="panel">
<div class="panel-label">Filters</div>
<div class="filter-group">
<div class="field-label">Presets</div>
<div class="preset-grid" id="preset-bar"></div>
<button type="button" class="action-btn wide-btn" id="reset-filters">Reset filters</button>
</div>
<div class="filter-group">
<div class="field-label">Engines</div>
<div class="pill-row" id="engine-filters"></div>
</div>
<div class="filter-group">
<div class="field-label">Models</div>
<div class="pill-row" id="model-filters"></div>
</div>
</section>
</aside>
<section class="comparison-panel">
<section class="stage comparator-stage">
<div class="section-header">
<div>
<div class="eyebrow">Task Comparator</div>
<h2 class="section-title" id="comparison-title">Reference Video</h2>
</div>
<div class="header-side">
<div class="results-summary" id="results-summary">0 visible</div>
<div class="active-filter-summary" id="active-filter-summary">All engines · all models</div>
</div>
</div>
<div class="results-grid" id="results-grid">
<article class="video-card gt-card">
<div class="card-header">
<div class="badge-stack">
<span class="badge badge-gt">GT</span>
</div>
<span class="card-title" id="gt-title">Ground Truth</span>
<div class="card-subtitle">Reference video</div>
</div>
<video id="gt-video" controls playsinline preload="metadata"></video>
</article>
</div>
<div class="empty-state" id="empty-state" hidden>No generated videos match the current filters.</div>
</section>
</section>
</main>
<section class="footer-note">
<div>
This Space streams public assets directly from
<code>TIGER-Lab/VisPhyBench-Data</code> and <code>TIGER-Lab/VisPhyWorld-Sub-Generated-Videos</code>.
</div>
<div>
Shareable state is stored in the URL, including the current sample, filters, and playback options.
</div>
</section>
</div>
<script src="./static/app.js"></script>
</body>
</html>