feat: rewrite line brush — thick lines, per-gesture alpha, scroll sizing, color cycling
- Scanline capsule fill for thick lines in graph.mjs (O(height) lineh calls, no Set/plot overhead)
- Line brush: freehand default, scroll wheel adjusts thickness with beep + URL/HUD update
- Middle-click cycles through palette colors (red→orange→yellow→green→cyan→blue→purple→white→gray→black)
- [ / ] keys adjust opacity per-gesture (draw opaque, scale alpha at bake time)
- Brush preview circle on hover shows size + color at low alpha
- Per-stroke undo: addUndoPainting after every bake in nopaint act handler
- Fix shift-pan sticking: guard panning start against key repeat
- HUD label: colon params colored (gray colons, yellow values), no leading space
- HUD scrub: share text/color → cyan, edit block columns fly in from right
- VSCode extension title updates on net.rewrite via url:updated postMessage
- nopaint.cancelStroke() API to prevent painting from non-drawing mouse buttons
- Local dev upload fallback: presigned-url returns /local-upload/ when S3 creds missing
- local-upload.mjs Netlify Function + netlify.toml redirect for dev uploads
- bios: new URL() with location.origin base for relative presigned URLs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>