Scaffold.of() requires a descendant context of the Scaffold widget.
Using the State's build context (which is the Scaffold's parent) caused
an assertion failure when tapping the 'Open folders' button.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The default menu position is now bottom, rendering a BottomAppBar with
tooltip 'Open folders' instead of the AppBar's auto-generated 'Open
navigation menu' tooltip.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Move the folder navigation drawer trigger to the bottom by default,
matching the issue request. Add a user preferences DB table (schema v34)
and a settings screen so users can switch back to the top hamburger menu.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The sync health row displayed "Discrepancies found" but never showed
what the discrepancies were. Parse the stored JSON summary to show
totals (missing locally, missing on server, flag mismatches). Also
wrap the status text in Flexible so long messages are not clipped.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wrap the ActionChip in a Tooltip whose message is the resolved
unsubscribe URI, so a long-press (mobile) or hover (desktop) reveals
the URL before the user taps.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
HTML emails often use fixed-width tables (e.g. <table width="600">) that
exceed the WebView viewport, causing the right portion of the email to be
clipped with no way to scroll. Fix by injecting CSS that:
- Adds `overflow-x: hidden` to body so wide content does not escape the viewport
- Sets `max-width: 100%` on all elements (via `*`) to scale down wide containers
- Forces `table { width: 100%; }` so fixed-pixel-width email tables reflow to fit
- Adds `td/th { overflow-wrap/word-break }` for wrapping in table cells
- Adds `pre { white-space: pre-wrap; }` so pre-formatted text wraps instead of
stretching the page
Adds a regression test that asserts all four CSS rules are present in the
generated HTML.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
It is a Flutter UI helper (showDialog, showModalBottomSheet, BuildContext)
covered by widget/integration tests, not unit tests — consistent with the
other UI screens already in _excluded.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Extract resolveMailboxByRole() helper shared by both screens so archive
and mark-as-spam use identical dialog-based flows on single and batch actions
- Add Archive button to EmailDetailScreen app bar (was missing)
- Reorder single-mail actions to match batch toolbar: Reply, Forward,
Archive, Delete, Spam, Move, Snooze, Flag
- Move "Mark as unread" from standalone icon button to the popup submenu
- Update _markAsSpam in detail screen to use shared helper (shows
choose/create dialog instead of a bare snackbar when no junk folder)
- Update tests: fix broken snackbar assertion, add tests for Archive
button presence, archive dialog, and mark-as-unread in submenu
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>