Inter was flagged as the only AI tell in the audit. Space Grotesk
fits the pedal brand — mechanical, precise character with excellent
small-screen readability.
Changes:
- src/index.css: body font-family Inter → Space Grotesk
- src/App.jsx: Google Fonts import + body font-family + inline style
- src/GlobalSettings.jsx, GlobalEQ.jsx, ModelBrowser.jsx, FocusView.jsx:
inline fontFamily Inter → Space Grotesk
- index.html: added Google Fonts preconnect + Space Grotesk import
- docs/helix-stadium-mockup.html, docs/helix-stadium-concept.html: updated
font imports and font-family
- Removed auto-save-on-every-change (was silent, confusing)
- Added local draft state: changes accumulate until user clicks Save
- Added 'Unsaved' indicator when there are pending changes
- Added 'Save' button (amber, disabled when no changes)
- Added 'Discard' button to revert to last-saved state
- Shows '✓ Saved' green feedback for 2s after success
- Shows '✗ Save failed' on error
- Bulk-saves all changed settings in one POST /api/settings call
- Instantly routes master_volume/routing/audio_profile via dedicated endpoints
Client stores bank as b.number+1 (1-based) but the API expects
0-based bank numbers. Caused preset activation to load the wrong
empty preset (bank 1 instead of bank 0), so blocks never appeared.
- Undo/Redo in header bar: snapshot-based tracking for block adds, removes,
reorders, parameter changes, and model swaps. 50-level undo stack with
debounced param snapshots (400ms cooldown).
- Main Menu: slide-out sidebar from left with ☰ button in status bar.
Items: Save Preset, Bypass/Control, Global Settings, Global EQ, Tuner,
Wi-Fi / Bluetooth.
- Global Settings: full-screen overlay with grouped settings — Audio (Master
Volume, Input Pad, Impedance), MIDI (Channel, Clock, Thru), Display
(Brightness, Auto Dim, Screen Saver), Tempo (Tap Tempo, Division, Mute).
- Global EQ: 3-band shelving equalizer (Low 80Hz, Mid 800Hz, High 6.4kHz)
with large knobs, canvas-based frequency response graph, and reset button.
- New files: src/MainMenu.jsx, src/GlobalSettings.jsx, src/GlobalEQ.jsx
- Pipedal SVGs have no fill (default black) — added invert(0.95) brightness(2)
to render them white on dark backgrounds
- Status bar icons: brightness(0.7) was making them invisible on dark bg
- Fullscreen icon: replaced ic_drawer_2 (cabinet) with proper inline
Material-style expand SVG in amber
- Fixed layout for landscape mode: maxWidth 980px, preset sidebar on left
- Preset chips now call API.loadPreset() on click
- Bank up/down cycles through banks, loads first preset
- Global bypass wired to API.bypassToggle()
- Block toggle wired to API.toggleBlock()
- Slider changes commit to API.updateBlock() on drag end
- Presets loaded from API.listPresets() on mount
- Status bar shows real API state
- Capped block switches to 4 max so BYPASS and BANK are always visible
- Added LCD-style scribble strip display with dark background + border
- Added short abbreviated labels (GATE, OD, DST, etc.) in scribble strips
- Added proper BANK ▲/▼ navigation with bank letter (A-H)
- Added status LEDs on all block footswitches
- BlockChain.jsx: removed extra closing </div> that broke JSX parsing