multi script beta

This commit is contained in:
2026-09-12 18:23:56 -04:00
parent 30e59c900c
commit 85bcb05a7d
16 changed files with 1053 additions and 516 deletions
+45 -16
View File
@@ -28,12 +28,15 @@
match_seen_at: string | null;
updated_at: string;
}
interface Script { id: number; name: string; target_rel_path: string }
interface Version { id: number; version: number; sha256: string; size: number }
interface BetaScript {
id: number;
name: string;
target_rel_path: string;
version: { id: number; version: number; sha256: string } | null;
}
let beta = $state<BetaRow | null>(null);
let script = $state<Script | null>(null);
let version = $state<Version | null>(null);
let scripts = $state<BetaScript[]>([]);
let servers = $state<BetaServerRow[]>([]);
let loading = $state(true);
let flash = $state<string | null>(null);
@@ -46,13 +49,11 @@
if (!res.ok) { loading = false; return; }
const body = (await res.json()) as {
beta: BetaRow;
script: Script;
version: Version;
scripts: BetaScript[];
servers: BetaServerRow[];
};
beta = body.beta;
script = body.script;
version = body.version;
scripts = body.scripts;
servers = body.servers;
loading = false;
}
@@ -107,7 +108,7 @@
{#if loading}
<p class="empty">loading…</p>
{:else if !beta || !script || !version}
{:else if !beta}
<p class="empty">beta not found</p>
{:else}
<a class="back" href="/betas">← all betas</a>
@@ -115,11 +116,24 @@
<h1>Beta #{beta.id}</h1>
<span class="tag state-{beta.state}">{beta.state}</span>
</div>
<div class="sub">
<a href="/scripts/{script.id}">{script.name}</a>
<span class="mono">· {script.target_rel_path}</span>
<span class="mono">· v{version.version}</span>
</div>
<section class="panel">
<h2>Scripts · {scripts.length}</h2>
{#if scripts.length === 0}
<p class="empty">no scripts bundled in this beta</p>
{:else}
<div class="script-list">
{#each scripts as s (s.id)}
<div class="script-row">
<a class="s-name" href="/scripts/{s.id}">{s.name}</a>
<span class="s-target mono">{s.target_rel_path}</span>
<span class="s-ver mono">v{s.version?.version ?? '?'}</span>
<span class="s-sha mono">{s.version?.sha256.slice(0, 8) ?? ''}</span>
</div>
{/each}
</div>
{/if}
</section>
<section class="panel">
<h2>Options</h2>
@@ -193,10 +207,25 @@
.back:hover { color: var(--ink-100); }
.head-row { display: flex; align-items: center; gap: 12px; margin: 12px 0 4px; }
h1 { color: var(--cream); font-family: var(--font-display); font-size: var(--text-2xl); letter-spacing: 1.5px; margin: 0; }
.sub { color: var(--ink-500); font-size: var(--text-mono); margin-bottom: 24px; display: flex; gap: 8px; align-items: baseline; }
.sub a { color: var(--spark-500); text-decoration: none; }
.empty { color: var(--ink-500); font-family: var(--font-mono); font-size: var(--text-mono); }
.script-list { display: flex; flex-direction: column; gap: 6px; }
.script-row {
display: grid;
grid-template-columns: 220px 1fr 80px 100px;
gap: 14px;
padding: 10px 14px;
background: var(--bg-card);
border: 1px solid var(--border);
border-radius: var(--r-sm);
align-items: center;
font-size: var(--text-mono);
}
.s-name { color: var(--spark-500); text-decoration: none; font-weight: 600; font-family: var(--font-body); }
.s-name:hover { text-decoration: underline; }
.s-target { color: var(--ink-300); word-break: break-all; }
.s-ver, .s-sha { color: var(--ink-500); }
.panel { background: var(--bg-nav); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--pad-panel); margin-bottom: 20px; }
h2 { margin: 0 0 14px; font-family: var(--font-body); font-size: var(--text-xs); font-weight: 700; text-transform: uppercase; letter-spacing: 1.5px; color: var(--ink-300); }