✨ Added
- Global .torrent drag-and-drop — drop
.torrentfiles anywhere in the app to open the Add Download modal with files pre-loaded, not just from the Downloads view. Visual overlay guides the drop - FileInfoModal loading spinner — shows a spinner while fetching item detail data (raw fields, trackers) instead of blank sections
- EmptyState loading spinner — all table views (Downloads, Uploads, History, Shared) now show a spinner alongside loading messages instead of plain text
🐛 Fixed
- Setup wizard auth blocking — fixed a bug where enabling authentication during first-run setup would fail with "Cannot enable authentication without an admin account", because the admin-account guard ran before the admin user was created by the migration step
♻️ Improved
- Move operation timeouts — timeout now scales with file size (assumes ~25 MB/s for 5200 RPM HDD under concurrent I/O, with 50% margin + 30s overhead, rounded to 30s intervals) instead of a fixed 2-minute limit
- Move operation logging — deduplicated failure logs from 3 redundant messages down to 1 with full context (file name, error cause, timeout duration)
- Unified native move naming — renamed
executeQBittorrentNativeMovetoexecuteNativeMoveand made all log messages use the actual client type (qBittorrent, Deluge, or Transmission) dynamically - Unified LoadingSpinner — replaced all 17 instances of the CSS
.loaderclass with theLoadingSpinnerReact component and removed the custom CSS rule/keyframes
Full Changelog: v3.4.0...v3.4.1