Toasts
Fire test toast
Triggers each kind with realistic content
{#each ([["success","S"],["error","E"],["info","I"],["download","D"]] as const) as [kind, label] (kind)}
addToast({ kind, title: kind === "success" ? "Library updated" : kind === "error" ? "Could not reach server" : kind === "info" ? "Already up to date" : "Download complete", body: kind === "success" ? "3 new chapters across 2 series" : kind === "error" ? "Connection refused on port 4567" : kind === "info" ? "No new chapters found" : "Berserk · Ch. 372 ready to read", })}>{label}
{/each}
Previews
Idle splash
Dismiss with any click or key
Show
Biometrics
Windows Hello
Available: {helloAvailable === null ? "…" : helloAvailable ? "yes" : "no"}
{helloBusy ? "…" : "Test"}
expOpen = !expOpen} aria-expanded={expOpen}>
Experimental
{#if expOpen}
3D tilt cards — hover to preview
{#each [{ title: "Berserk", sub: "Ch. 372", hue: "265" },{ title: "Vinland Saga", sub: "Ch. 208", hue: "200" },{ title: "Dungeon Meshi", sub: "Ch. 97", hue: "140" }] as card (card.title)}
{card.title}
{card.sub}
{/each}
{/if}
Runtime
Filter
{store.libraryFilter}
Folders
{store.categories.filter(c => c.id !== 0).map(c => c.name).join(", ") || "none"}
History
{store.history.length} entries
Cache
{perfSnapshot?.cacheEntries ?? "—"} entries
Toasts
{store.toasts.length} queued
Version
{appVersion} · {import.meta.env.MODE}
{#if perfSnapshot && perfSnapshot.cacheEntries > 0}
{perfSnapshot.cacheKeys.join(", ")}
Oldest: {fmtAge(perfSnapshot.oldestEntryMs)} · Newest: {fmtAge(perfSnapshot.newestEntryMs)}
{/if}
↺
Auth (UI Login)
Mode
{authStatus?.mode ?? "—"}
Session
{authStatus?.hasSession ? "present" : "none"}
Refresh token
{authStatus?.hasRefreshToken ? "present" : "none"}
Access expires in
{fmtCountdown(authStatus?.accessExpiresInMs ?? null)}
Refresh expires in
{fmtCountdown(authStatus?.refreshExpiresInMs ?? null)}
Refresh window
{authStatus?.shouldRefreshSoon ? "open" : "not yet"}
Refresh in-flight
{authStatus?.refreshInFlight ? "yes" : "no"}
Access expiry at: {fmtTime(authStatus?.accessExpiresAt ?? null)}
Refresh expiry at: {fmtTime(authStatus?.refreshExpiresAt ?? null)}
Skew window: {Math.round((authStatus?.skewMs ?? 0) / 1000)}s before expiry
Refresh
{authRefreshBusy ? "Refreshing…" : "Force refresh"}