- FileUploader standardised to File[] with multiple prop
- Per-file sidebar: idle X → uploading spinner → success ✓ → error ! with hover retry
- Carousel preview with left/right navigation
- Parallel batch uploads via Promise.all with live per-file status
- Single-file path preserves existing spinner UX
- Partial failure: Retry Failed button re-uploads only errored files
- Thumbnails keyed by File reference (not index) so removals don't corrupt the map
- FileList normalised via Array.from to fix file-picker multi-select
- Catch block in batch utilities only marks uncompleted files as error