feat(jamguide): playable VoicingBrowser in chord modal + enlarged stations (task L-21)

ChordDetailModal Guitar/Piano tabs mount VoicingBrowser on top with
legacy grips/technique reference preserved below; Jam Guide enlarged
station view gains the browser on both instrument tabs; parse-null
never mounts a wrong-chord fallback. App.jsx untouched. Critic PASS
(SSR-verified both entry points; onFocusChord effects byte-untouched).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
vadimwit
2026-07-08 22:55:42 +01:00
parent f4e0ac67e0
commit 951d5440e1
2 changed files with 60 additions and 26 deletions
+9
View File
@@ -5,6 +5,7 @@ import { NOTES, CHORD_TYPES } from '../lib/theory'
import RoadmapTrack from './RoadmapTrack'
import ChordDiagram from './ChordDiagram'
import MiniPiano from './MiniPiano'
import VoicingBrowser from './VoicingBrowser'
import { pianoVoicingChain } from '../lib/piano'
// ─── JamGuide — the Roadmap bottom dock ───────────────────────────────────────
@@ -412,6 +413,14 @@ function RoadmapAssembly({
label={`${selected.label}${selected.rn ? ` · ${selected.rn}` : ''}`}
/>
)}
{/* Browse + audition every voicing of this station's chord (L-21).
Stations already carry {rootPc, quality} (L-11); the browser is
fully self-contained (D-21) and wraps dock-friendly. Purely
additive — the onFocusChord guide-tone contract above is
untouched (it keys off selectedStation, not this render). */}
<div className="w-full">
<VoicingBrowser rootPc={selected.rootPc} quality={selected.quality} />
</div>
<button
type="button"
onClick={() => onSelectStation(null)}