selectFolder() kicked off its background syncFolder() fetch fire-and-forget with no loading flag, so opening a per-account folder with no cached messages yet flashed "No messages to display" for the whole IMAP fetch instead of a spinner. Adds isSyncingFolder, a StateFlow set for the duration of that sync (mirroring isRefreshing) and cleared via try/finally regardless of outcome. A private latestFolderSelection token guards the clear so a stale sync from a folder no longer selected can't hide the spinner for whichever folder is actually selected now. MailboxScreen's non-paged empty branch now holds NoMessagesState back while isSyncingFolder is true, showing a CircularProgressIndicator instead — mirroring how the unified-inbox paged branch already gates on loadState.refresh. Closes #149 Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>