fix(dj): detect stale /media mount on unplug + rebuild notepat help panel
Two related notepat/native fixes:
1. USB hotplug regression — plug in, unplug, re-plug would stop
detecting the music USB. Root cause: mountMusic() only checked
`st_dev` to decide "already mounted", but when a USB is physically
yanked /media stays as a stale mount point (st_dev still differs
from root), so mountMusic() kept returning true forever. The JS
hot-plug loop in notepat sim() then thought USB was still
connected and never re-scanned.
Fix: parse /proc/mounts to find the actual device backing /media,
verify the device file still exists (S_ISBLK + stat) AND opendir
succeeds. If either check fails (stale mount from a yanked USB),
umount2(MNT_DETACH) lazily before falling through to the normal
mount loop. This lets re-plugs mount fresh.
2. Meta-held help panel rewrite. Previous panel had several issues:
- Bindings were stale (space listed as "kick drum" but is now the
reverse loop pedal; F1-F4 listed as "Fn+F1" etc but the media-
key aliases were removed so they're direct)
- Fixed 280px width wasted screen on wider displays
- 24 single-column rows bled off the bottom on small screens
- Two flat colors for key + desc gave no visual grouping
New panel:
- Categories: NOTES, DRUMS, WAVE, DECK, HOLD, TEMPO, SAMPLE, FX,
SYSTEM — each in a distinct color (cyan, orange, magenta, green,
yellow, amber, pink, teal, gray) applied to both the category
header and the key-column text
- Auto 1/2/3 columns based on available width (COL_W = 172 px)
- Panel height auto-fits content AND hard-clamps to screen height
so it never bleeds off the bottom; overflow rows get clipped
rather than pushed off-screen
- Key colors brightened in dark mode, darkened in light mode for
legibility on both themes
- Footer hint always positioned inside the panel
- All bindings updated to reflect current code state