26 Commits

Author SHA1 Message Date
shawn 87ee14e4e5 v2 audit: contrast, dark-glow, layout, palette, sizing fixes
All fixes from impeccable browser audit:
- Removed/reduced 18 dark-glow box-shadows (AI tells)
- Fixed contrast: muted text, badge-blue, badge-amber, kebab opacity
- Removed cyan neon palette (#60C0D0 → #5090A0, #60A0E0 → #6080B0)
- Changed layout transitions from width to transform (jank-free)
- Bumped tiny text sizes (9px→10px, 10px→11px)
- Fixed cramped padding on preset chips
2026-06-14 18:50:23 -04:00
shawn 3dcf31f600 fix: btn-icon touch targets to 44px WCGA minimum
- CSS classes: index.css (28→44px base, 24→44px mobile), App.jsx (36→44px base, 24→44px narrow)
- 19 inline btn-icon buttons in App.jsx: param view toggle, CapturesScreen/Presets close, sidebar toggle, undo/redo, status bar nav (captures/presets/tuner/fullscreen/menu), overlay closes, global bypass toggle, block bypass toggle, Scan/ON buttons, add block close
- Footswitch mode SM/PR buttons: height 20→44px, minWidth 34→44px
- FocusView.jsx: param −/+ buttons 34→44px, close button 34→44px
- GlobalSettings.jsx: param −/+ buttons 26→44px, close button 34→44px
- border-radius bumped from 7→8px (base), 5→8px (index.css) for proportion
2026-06-14 18:37:58 -04:00
shawn a5a01fda02 add theme.js — shared design tokens module referenced by App.jsx 2026-06-14 17:29:19 -04:00
shawn 0af8ed05b0 add responsive breakpoints: sidebar collapse, status bar compact, matchMedia listeners (#audit-P2) 2026-06-14 17:27:22 -04:00
shawn f42fa1d28c fix: replace Inter with Space Grotesk (#audit-P3)
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
2026-06-14 17:26:03 -04:00
shawn db644cec6f add prefers-reduced-motion support (#audit-P2)
The transform: scale(.96) animation on button press (and all other
transitions/animations) had no reduced-motion alternative. Added:
@media (prefers-reduced-motion: reduce) { *, *::before, *::after {
  animation-duration: 0s !important;
  animation-iteration-count: 1 !important;
  transition-duration: 0s !important;
}}

Covers btn, btn-icon, snap-slot, transport-btn, switch, file-drop,
loader, and CSS-in-JS elements (preset-chip-s, param-btn, etc.).
2026-06-14 17:25:06 -04:00
shawn cca4aed380 fix: GlobalSettings — add Save/Discard button pattern with visible feedback
- 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
2026-06-14 13:43:47 -04:00
shawn 2402e649a2 fix: bank indexing off-by-one — subtract 1 when sending bank to API
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.
2026-06-14 13:19:51 -04:00
shawn f0771ff7a5 fix: wire all settings to backend — master_volume/routing use dedicated endpoints, all others persist via POST /api/settings to config.yaml 2026-06-14 12:44:52 -04:00
shawn 277625f90c fix: GlobalSettings loads current state from API on mount, add Routing & Audio Interface sections, wire onRoutingChange 2026-06-14 12:39:06 -04:00
shawn b24cfab15f fix: hamburger menu sidebar slide-in animation targets sidebarRef instead of backdropRef 2026-06-14 12:29:28 -04:00
shawn ec562c4071 fix: add nam_amp to BLOCK_DISPLAY_NAMES and BLOCK_COLORS for server preset chain loading 2026-06-14 00:21:13 -04:00
shawn e0f6940081 fix: audio profile API call includes 'stable' profile with rate/period overrides 2026-06-14 00:17:07 -04:00
shawn 87d719bbfb Merge branch 'feat-undo-menu-settings' 2026-06-14 00:16:09 -04:00
shawn 9b0c23fe36 fix: bank indexing (+1), audio profile settings (sample rate + buffer size), preset names match tone3000 2026-06-14 00:16:05 -04:00
shawn a3f6b83297 fix: classic rock bank 1 presets, remove Y-split default mock blocks 2026-06-14 00:02:01 -04:00
shawn c7f148341d feat: Undo/Redo + Main Menu + Global Settings + Global EQ
- 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
2026-06-12 19:54:53 -04:00
shawn a4f7d791bc docs: Helix Stadium feature parity audit — full gap analysis vs manual Rev D v1.3 2026-06-12 19:53:43 -04:00
shawn 376249172f feat: Model Browser — block library with category filter tabs, search, favorites, NAM/IR models 2026-06-12 19:51:19 -04:00
shawn f67e6bd8c7 fix: black SVG icons now render white — invert(1) filter; proper fullscreen icon
- 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
2026-06-12 19:35:46 -04:00
shawn 62c373b989 feat: pipedal SVG icons in block tiles + nav bar
- Replace emoji getBlockIcon() with <BlockIcon> component rendering SVG icons
- 38 fx_*.svg icons from pipedal mapped to block types (distortion, delay, reverb, mod, etc.)
- Split/merge tiles now use fx_split_a.svg / fx_mixer.svg
- Status bar: ic_bank.svg, ic_presets.svg, fx_analyzer.svg, ic_drawer_2.svg
- Extracted reusable CSS design system to index.css (badge, snap-grid, slide-panel, etc.)
- SnapshotPanel and component reference extracted to docs/
- 270KB JS build, SVG icons served from /ui/img/
2026-06-12 19:29:50 -04:00
shawn bd6771e203 feat: Visual tuner with mute — Tuner.jsx, pipeline pitch detection, status bar toggle 2026-06-12 19:22:10 -04:00
shawn 91228cb284 PEDAL-UI: Footswitch modes (stomp/preset) + mode selector in status bar + SVG fx icons from pipedal project 2026-06-12 19:20:39 -04:00
shawn 64f1086343 PEDAL-UI: Landscape layout + functional preset loading + bank navigation + API integration
- 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
2026-06-12 18:51:15 -04:00
shawn 027494db2c fix: footswitch bar always shows BYPASS, BANK, scribble strips
- 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
2026-06-12 18:05:09 -04:00
shawn b832ae06a3 PEDAL-UI: Helix Stadium-style redesign — block chain, big touch sliders, footswitch bar with scribble strips 2026-06-12 18:03:27 -04:00