Two complete UX features. 1. Streamer list is now drag-and-drop reorderable. The order is persisted via the existing config.streamers save path, so it survives a restart. The dragstart-then-click race that would normally fire selectStreamer when the drag is released is suppressed via a 50ms post-dragend window. 2. VOD cards each get a top-left checkbox. Selecting >=1 card opens a sticky action bar above the grid with "+ Queue" and "Clear" buttons. Bulk-add iterates the selected URLs and calls addToQueue for each, with a single per-batch toast summarizing the outcome. Selection is cleared on streamer switch (per-streamer mental model) but not persisted across reloads (stale selection across restarts is more confusing than helpful). Implementation notes: - Click-on-checkbox is handled by a single delegated listener on vodGrid (initVodGridSelectionDelegation), not per-card inline handlers. The card .selected class is toggled in place to avoid re-rendering the entire grid on every check. - Streamer items are rebuilt from createElement so the existing `event.stopPropagation(); removeStreamer(...)` inline pattern is replaced with a real listener; defends against unusual characters in streamer names even though Cycle 4 added the 4-25-char alphanumeric regex. - styles.css: position: relative on .vod-card for the absolute- positioned checkbox; .selected ring highlight; .dragging opacity for streamer drag. - DE / EN locale strings for the bulk-bar; setText / updateBar hook into applyLanguageToStaticUI so the bar count updates on language switch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| build | ||
| docs | ||
| scripts | ||
| src | ||
| .gitignore | ||
| eslint.config.mjs | ||
| package-lock.json | ||
| package.json | ||
| README_AI_RELEASE.md | ||
| tsconfig.json | ||