Phase 1: scaffold + metronome engine + R1

Svelte 5 + Vite static SPA with absolute base and History-API path routing.
Core lookahead-scheduler metronome (no drift), AudioContext unlock-on-gesture,
synthesized 3-voice clicks, rAF-synced beat highlight. StrumGrid renderer and
R1 wired end-to-end with variants, BPM/variant persistence, query overrides,
and keyboard shortcuts (space, arrow up/down). Dark amp-light theme tokens.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-22 00:13:44 +02:00
commit a77a515351
25 changed files with 3858 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
<script lang="ts">
import { getDrill } from '../drills'
import NotFound from './NotFound.svelte'
import StrumView from '../components/views/StrumView.svelte'
interface Props {
code: string
params: URLSearchParams
}
let { code, params }: Props = $props()
let drill = $derived(getDrill(code))
</script>
{#if !drill}
<NotFound {code} />
{:else if drill.kind === 'strum'}
{#key drill.code}
<StrumView {drill} {params} />
{/key}
{:else}
<NotFound {code} />
{/if}