david
669d3abe27
feat: collapsible section and libraries, compact card layout
...
- Sample Library section now collapsible via header click
- Library cards collapsible via header click (toggle icon ▾)
- Collapse All button to batch-collapse all libraries
- Compact sample cards: 28px height, 10px font, 70px min grid column
- Tighter spacing throughout (8px lib gap, 4px sample grid gap)
- Play icon removed from cards (card itself is clickable)
2026-06-22 02:52:24 -07:00
david
7124b16fc1
docs: update AGENTS.md and README for new features, add JS tests
...
Docs:
- AGENTS.md: updated toolchain section with js-lint/js-test tasks,
expanded web/ui/ directory listing, added event delegation and
Web Audio API to key patterns, updated testing section
- README: marked issue #9 (Audio Preview Player) as done
- .gitignore: added akai-fetch.test and cover.out
Tests:
- Moved groupWavs and cleanName to util.js (pure functions)
- Added 10 new JS tests: 6 groupWavs, 4 cleanName
- Total JS tests: 29 (up from 19)
2026-06-22 02:46:34 -07:00
david
e0bad5e5ac
feat: card-based Sample Library layout with grouping
...
Redesigned WAV Browser as a structured Sample Library with card layout:
- WAVs grouped by library (ISO name) and program (volume name)
- Library cards with collapsible headers showing program/sample counts
- Program sections within each library
- Sample cards in a compact grid with play-on-click
Updated playWav to show a clean sample name in the player bar,
hide the player when playback ends, and use sample-card selectors
for active-state highlighting.
Clean display names (underscores → spaces, stripped .wav extensions)
2026-06-22 02:35:55 -07:00
david
b5650c53ba
test: add JS test framework using Node built-in test runner
...
Extracted pure utility functions (esc, sanitize, formatBytes, formatTime)
into web/ui/util.js with CommonJS export for Node testing compatibility.
Added 19 tests across 4 suites using node:test + node:assert (zero deps).
- util.js: browser-compatible utility functions
- util.test.js: 19 tests (5 esc, 3 sanitize, 6 formatBytes, 5 formatTime)
- package.json: 'test' script → node --test util.test.js
- mise.toml: js-test task
- app.js: removed duplicate helper functions (now in util.js)
- index.html: load util.js before app.js
2026-06-22 02:23:24 -07:00
david
d7a17eb054
fix: show extract API errors in UI instead of false 'Extraction complete'
...
doExtract() only checked data.message, so JSON responses with
error key (e.g. 'no ISO files found') would show green success.
Now checks data.error first and displays it in red.
2026-06-22 01:10:40 -07:00
david
b69e1d81ab
debug: add console logging to browseWavs and playWav
2026-06-22 00:42:18 -07:00
david
4f03524668
chore: add JS/ESLint toolchain, refactor onclick to event delegation
...
- Add ESLint config for web/ui (flat config, golangci-lint-compatible)
- Add js-lint task to mise.toml (npm run lint in web/ui)
- Add ESLint check to check-toolchain.sh
- Add .golangci.yml for golangci-lint v2 with correct exclusions
- Refactor app.js: replace inline onclick with data-action + event delegation
- Add null checks and HTTP status checks to browseWavs
- Add web/ui/node_modules/ to .gitignore
2026-06-22 00:10:49 -07:00
david
f716902580
fix: handle null data in browseWavs, add HTTP status check
...
Avoid 'Cannot read properties of null (reading error)' when server
returns null or non-JSON. Also check resp.ok before parsing JSON.
2026-06-22 00:02:32 -07:00
david
cf53912a33
feat: Audio Preview Player — browse and play WAV samples via Web Audio API
...
Issue: #9
Backend:
- GET /api/list-wavs?dir=<path> — lists .wav files in a directory
- GET /wavs/<file> — static file serving from ./output/wavs
Web UI:
- WAV Browser section with path input + Browse button
- AudioContext-based playback (zero deps) — progress bar, time display
- WAV file grid with Play buttons, active item highlighting
Tests:
- 3 new tests for handleListWavs (wav files, empty dir, nonexistent dir)
- Fix TestFindAkaiutil: add t.Chdir(tmp) so relative path lookups don't
accidentally find the repo's third_party/akaiutil/akaiutil binary
2026-06-22 00:01:15 -07:00
david
f195ba5a5c
ui: move search results below download/extract controls
...
Search bar stays at top as the "command center".
Download queue and extract controls follow.
Results render at the bottom — the main scrolling area.
2026-06-21 22:35:18 -07:00
david
e2dbb66525
feat: web UI + HTTP server + Electron shell
...
- serve.go: embedded web UI (embed.FS), REST API endpoints for
search, list, download (SSE progress), and WAV extraction
- main.go: added serve subcommand and flag registration
- web/ui: vanilla JS frontend with search cards, download queue,
extract controls; dark theme, zero dependencies
- electron/: Electron wrapper that spawns fetch serve as sidecar,
reads port from stdout, creates BrowserWindow; electron-builder
config for macOS .app bundle with akaiutil + script as resources
Refs #1 , #9
2026-06-21 19:46:30 -07:00