133 lines
6.5 KiB
HTML
133 lines
6.5 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Verstack · Game archive</title>
|
|
<link rel="stylesheet" href="/style.css" />
|
|
<script src="/app.js" defer></script>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<div class="brand">
|
|
VERSTACK <small>GAME ANALYSIS LAB</small>
|
|
</div>
|
|
<nav>
|
|
<a href="#library">Library</a><a href="#import">Import</a
|
|
><a href="#jobs">Processing runs</a>
|
|
</nav>
|
|
</header>
|
|
<main>
|
|
<div id="notice" role="status" aria-live="polite">
|
|
Connecting to local archive…
|
|
</div>
|
|
<section id="library">
|
|
<div id="breadcrumbs" class="breadcrumbs" aria-label="Breadcrumb"></div><h1 id="library-title">Game library</h1>
|
|
<p id="library-subtitle" class="muted"></p>
|
|
<div class="metrics" id="metrics"></div>
|
|
<div id="game-home">
|
|
<div class="toolbar"><label>Search games <input id="filter" placeholder="Game name…" /></label><button id="refresh">Refresh</button></div>
|
|
<div id="games" class="game-grid"></div>
|
|
<p id="empty" class="empty">No games found. Import a release to start your library.</p>
|
|
</div>
|
|
<div id="version-list" class="panel" hidden>
|
|
<div class="panel-title">Imported versions</div>
|
|
<table><thead><tr><th>Version</th><th>Edition / generation</th><th>Release date</th><th>Job outputs</th><th>Artifacts</th><th>Compare</th></tr></thead><tbody id="snapshots"></tbody></table>
|
|
</div>
|
|
</section>
|
|
<section id="details" hidden>
|
|
<h2 id="detail-title">Version artifacts</h2>
|
|
<details class="provenance"><summary>Extraction notes and coverage</summary><p id="warnings" class="muted"></p></details>
|
|
<div class="panel">
|
|
<div class="panel-title">Artifact browser <button id="refresh-artifacts">Refresh</button></div>
|
|
<div class="toolbar artifact-filters">
|
|
<label>View <select id="media-kind"><option value="media">Media gallery</option><option value="image">Images</option><option value="video">Videos</option><option value="audio">Sounds</option><option value="all">All files</option><option value="file">Other files</option></select></label>
|
|
<label>Output <select id="source-filter"></select></label>
|
|
<label>Search <input id="asset-filter" placeholder="Filter paths…" /></label>
|
|
</div>
|
|
<div id="gallery" class="gallery"></div>
|
|
<div id="file-table" class="table-wrap" hidden><table><thead><tr><th>Path</th><th>Source</th><th>Size</th><th>Artifact identity</th><th>Actions</th></tr></thead><tbody id="assets"></tbody></table></div>
|
|
<div class="toolbar pagination"><span id="asset-status" role="status" aria-live="polite"></span><button id="asset-previous">Previous</button><button id="asset-next">Next</button></div>
|
|
</div>
|
|
<div id="preview-panel" class="panel" hidden>
|
|
<div class="panel-title"><span id="preview-title">Preview</span><button id="close-preview">Close preview</button></div><pre id="preview"></pre>
|
|
</div>
|
|
<details class="panel tools"><summary>Analysis tools · process, verify, and compare</summary>
|
|
<div class="toolbar"><label>Input <select id="process-source"></select></label><label>Plugin <select id="plugin"></select></label><button id="process" class="primary">Run plugin</button><button id="verify">Verify retained bytes</button></div>
|
|
</details>
|
|
</section>
|
|
<section id="comparison" hidden>
|
|
<h2 id="comparison-title">Snapshot comparison</h2>
|
|
<p id="comparison-note" class="muted"></p>
|
|
<div id="function-results" hidden>
|
|
<div class="toolbar">
|
|
<label>View <select id="function-view"><option value="unmatched_after">Unmatched target</option><option value="matches">Exact matches</option><option value="unmatched_before">Unmatched baseline</option></select></label>
|
|
<label>Filter <input id="function-filter" placeholder="Name or address" /></label>
|
|
<button id="save-comparison">Save report to archive</button>
|
|
</div>
|
|
<p id="function-summary"></p>
|
|
<div class="panel"><table><thead><tr><th>Baseline</th><th>Target</th><th>Evidence</th></tr></thead><tbody id="function-rows"></tbody></table></div>
|
|
<div class="toolbar"><button id="function-previous">Previous</button><span id="function-page"></span><button id="function-next">Next</button></div>
|
|
</div>
|
|
<pre id="diff"></pre>
|
|
</section>
|
|
<section id="import" hidden>
|
|
<h2>Import a release</h2>
|
|
<form id="import-form" class="panel">
|
|
<div class="panel-title">Original inputs</div>
|
|
<div class="form-grid">
|
|
<label
|
|
>Game / repository<input
|
|
name="repository"
|
|
required
|
|
placeholder="Jurassic Park" /></label
|
|
><label
|
|
>Release version<input
|
|
name="version"
|
|
required
|
|
placeholder="1.15.0" /></label
|
|
><label
|
|
>Edition<input name="edition" placeholder="Premium / LE" /></label
|
|
><label
|
|
>SPIKE generation<input
|
|
name="generation"
|
|
placeholder="Unknown" /></label
|
|
><label>Release date<input name="released_at" type="date" /></label
|
|
><label
|
|
>Server path<input
|
|
name="path"
|
|
placeholder="/srv/games/package.spk" /></label
|
|
><label>Or upload one file<input name="file" type="file" /></label>
|
|
</div>
|
|
<p id="roots" class="muted"></p>
|
|
<p class="muted">
|
|
Packages remain intact until a configured plugin extracts them.
|
|
Original filesystem inputs are retained.
|
|
</p>
|
|
<button type="submit" class="primary">Import & verify</button>
|
|
</form>
|
|
</section>
|
|
<section id="jobs" hidden>
|
|
<h2>Processing runs</h2>
|
|
<div class="panel">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Started</th>
|
|
<th>Operation</th>
|
|
<th>State / stage</th>
|
|
<th>Processed</th>
|
|
<th>Result</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="runs"></tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
<footer>
|
|
Local first · No external services · Working title: verstack
|
|
</footer>
|
|
</body>
|
|
</html>
|