Commit Graph
383 Commits
Author SHA1 Message Date
Linus Rath 989385f4f6 Merge branch 'feat/desktop-offline' into feat/do-ux-compose-fixes
# Conflicts:
#	components/email/email-viewer.tsx
#	components/settings/accessibility-settings.tsx
#	lib/__tests__/settings-search.test.ts
#	lib/settings-search.ts
2026-11-04 09:54:25 +01:00
Linus Rath ceaceb7f2a Merge branch 'feat/desktop-offline' into feat/do-ux-compose-fixes
# Conflicts:
#	components/email/email-composer.tsx
#	components/email/email-viewer.tsx
#	locales/ar/common.json
#	locales/ca/common.json
#	locales/cs/common.json
#	locales/da/common.json
#	locales/de/common.json
#	locales/en/common.json
#	locales/es/common.json
#	locales/et/common.json
#	locales/fa/common.json
#	locales/fr/common.json
#	locales/he/common.json
#	locales/hu/common.json
#	locales/it/common.json
#	locales/ja/common.json
#	locales/ko/common.json
#	locales/lv/common.json
#	locales/mn/common.json
#	locales/nb/common.json
#	locales/nl/common.json
#	locales/pl/common.json
#	locales/pt/common.json
#	locales/ro/common.json
#	locales/ru/common.json
#	locales/sk/common.json
#	locales/th/common.json
#	locales/tr/common.json
#	locales/uk/common.json
#	locales/vi/common.json
#	locales/zh-TW/common.json
#	locales/zh/common.json
2026-11-04 09:20:50 +01:00
Linus Rath adbbfe8149 test: give the welcome banner mock the due hook the notice bar now reads 2026-11-04 09:18:32 +01:00
Linus Rath f1266889ed fix: list To and Cc in the header of a message forwarded from the reader 2026-11-04 09:15:42 +01:00
Linus Rath fcc9fc0cc0 Merge branch 'feat/desktop-offline' into feat/do-ux-mail-fixes
# Conflicts:
#	components/email/email-viewer.tsx
#	components/mail/mail-app.tsx
#	components/offline/offline-host.tsx
#	components/ui/welcome-banner.tsx
#	locales/ar/common.json
#	locales/ca/common.json
#	locales/cs/common.json
#	locales/da/common.json
#	locales/de/common.json
#	locales/en/common.json
#	locales/es/common.json
#	locales/et/common.json
#	locales/fa/common.json
#	locales/fr/common.json
#	locales/he/common.json
#	locales/hu/common.json
#	locales/it/common.json
#	locales/ja/common.json
#	locales/ko/common.json
#	locales/lv/common.json
#	locales/mn/common.json
#	locales/nb/common.json
#	locales/nl/common.json
#	locales/pl/common.json
#	locales/pt/common.json
#	locales/ro/common.json
#	locales/ru/common.json
#	locales/sk/common.json
#	locales/th/common.json
#	locales/tr/common.json
#	locales/uk/common.json
#	locales/vi/common.json
#	locales/zh-TW/common.json
#	locales/zh/common.json
2026-11-04 09:11:09 +01:00
Linus Rath 9df9505da0 test: look for the archive toast by its new wording in the undo reopen test 2026-11-04 09:09:18 +01:00
Linus Rath 044647ff34 fix: keep the desktop layout in a half-screen window and at 150 % zoom
A window snapped to half the screen (640-800 px) or a 1366x768 laptop
at 150 % (911 px) got the phone and tablet layout: bottom tab bar,
folders in a drawer, Settings as a phone list with a Back arrow. The
layout switched at the 64rem (1024 px) breakpoint.

Now the phone layout starts below 600 px. From 600 to 1024 px the app
is a compact desktop: app rail at the side, folder sidebar folded to
its icons (the existing collapsed state, opened per session with its
toggle), Settings with its two panes and a narrower page list. Below
840 px the split layout opens a message in the list's place, as the
focused layout does. This holds in the browser and the desktop app,
in the Pro shell (which now runs from 600 px) and under Mountain View.

- `hooks/use-media-query.ts`: classifyWidth, PHONE_BELOW 600,
  FULL_DESKTOP 1024; the tablet class (`isTablet`) is gone, the store
  has `isCompact` instead. Plugins still see "tablet" for it.
- `app/globals.css`: a `desk:` breakpoint at 37.5rem for the layout
  classes, and a `tap:` variant for 44px rows on phones and touch
  screens below 1024 px (was every window below 1024 px).
- Touch screens below 1024 px keep swiping list rows (was phones only).
- The boot skeletons, boot script, mail app, sidebar, reader, admin
  shell and calendar, contacts and files follow the new widths.

Tests changed with the behaviour: the tablet cases in pro-gate,
mail-app-mv-composer-move, mail-app-compose-handoff,
mail-app-thread-expand-mark-read, mobile-tour-end and
thread-list-item-columns now run on a phone or a compact desktop, as
those widths no longer exist as a tablet. mail-app-short-window-tab-bar
is replaced by mail-app-compact-layout: a phone on its side is a
compact desktop with the rail at the side, so the short-window tab bar
rule is gone. Class and media-query assertions follow desk:/tap: and
37.5rem; the 32px-text test uses 1100 px, since 1440 px at 32px is now
a compact desktop.
2026-11-04 09:07:06 +01:00
Linus Rath ad0b238e3d feat: open a reply under the message it answers, which stays readable above it 2026-11-04 08:32:05 +01:00
Linus Rath 7517b024ec fix: make Discard on the Continue draft bar delete the draft, with Undo, and reach it by keyboard 2026-11-04 08:23:01 +01:00
Linus Rath 2f31b435a2 Merge branch 'feat/desktop-offline' into feat/do-menu-fixes
# Conflicts:
#	components/desktop/desktop-host.tsx
2026-11-04 07:57:50 +01:00
Linus Rath 1e51ff6e69 Merge branch 'feat/do-ux-mail-conv' into feat/do-ux-mail-fixes
# Conflicts:
#	components/mail/mail-app.tsx
2026-11-04 07:24:19 +01:00
Linus Rath d2f1e4bcc9 Merge branch 'feat/do-ux-mail-keys' into feat/do-ux-mail-fixes 2026-11-04 07:23:33 +01:00
Linus Rath efa875ccc7 Merge branch 'feat/do-ux-mail-accounts' into feat/do-ux-mail-fixes
# Conflicts:
#	components/email/email-list.tsx
2026-11-04 07:23:30 +01:00
Linus Rath 5fbc9b1f47 feat: open a mail link from another program in a compose window of its own in the desktop app 2026-11-04 07:12:06 +01:00
Linus Rath a19bdefdc1 feat: open the next message after archive or delete when the list is beside the reader 2026-11-04 07:08:31 +01:00
Linus Rath fe8fff338e fix: let j and k go on from the last opened message after Escape 2026-11-04 07:02:23 +01:00
Linus Rath 0746679475 feat: reply with Ctrl+R, mark read with Ctrl+Q and search with Ctrl+E in the desktop app, as in Outlook 2026-11-04 07:00:38 +01:00
Linus Rath 8bfc7cf8e0 feat: show the whole conversation in the reading pane
The default layout showed only the newest message of a thread in the
reader and unfolded the rest as rows inside the list. The reader now
shows the conversation on every layout but a phone's, as Mountain View
does: older messages folded to one line each, unread ones unfolded, the
newest open. A conversation is one row in the list, with no chevron,
and `x` no longer unfolds it. "Show emails as individual messages"
keeps the single message.

Two existing tests changed their setup, not their assertions: the
attachment download tests in `blob-routing.test.tsx` turn threading off
so the conversation fetch doesn't take the requests they count, and the
`x` expansion tests now run on Mountain View on a tablet, the one place
where the list still unfolds a conversation.
2026-11-04 06:57:43 +01:00
Linus Rath 2859260a72 feat: add Move to the selection bar and use the empty reading pane for a selection and the first-run tips
The selection bar showed Archive, Delete and Tag, with Move only in its
more menu and both read buttons only on wide bars. The reading pane said
"No conversation selected" next to a selection, and the first-run tips
took a third of the list.

- The bar has Archive, Delete, Move, one read/unread button ("Mark as
  read" while anything selected is unread) and Tag, then the rest.
- With a selection the empty reading pane shows "5 conversations
  selected" and the same buttons.
- The first-run tips sit in the empty reading pane where it shows beside
  the list; phones and layouts without that pane keep them above the list.
- A bulk move's toast names the folder.
2026-11-04 06:51:13 +01:00
Linus Rath 295eb35671 fix: say a move, archive or delete once in its toast and drop the menu's ellipsis from the New folder dialog title
The delete Undo test looked for the "Email deleted" toast; a delete to Trash now says "Moved to Trash", so it looks for that one.
2026-11-04 06:44:45 +01:00
Linus Rath e634884d4e fix: count conversations and their messages above search results 2026-11-04 06:43:45 +01:00
Linus Rath 781013cc44 feat: close the composer as soon as Send is pressed and show Sending, then Sent with View 2026-11-04 06:41:51 +01:00
Linus Rath 4224149ab5 feat: move Compose to the top of the folder sidebar on desktop and keep one account switcher and one list menu
Two mail-app tests clicked the round Compose button on a desktop; their
mocked sidebar now draws the Compose button the real one has there.
2026-11-04 06:39:16 +01:00
Linus Rath 141748e1d6 fix: show first-start notices one at a time above the message list, each with a close button
The dictionary test now reads the notice queue instead of the toasts: the
question is no longer a toast.
2026-11-04 06:29:23 +01:00
Linus Rath 007b007302 feat: open the schedule dialog from Send's arrow and say when a scheduled message goes 2026-11-04 06:22:53 +01:00
Linus Rath acb827bf18 feat: add copy, write, add to contacts and find mail to the right-click on an address in a message 2026-11-04 06:21:03 +01:00
Linus Rath 5fc87eafbd Merge branch 'feat/do-menu-audit' into feat/do-menu-fixes
# Conflicts:
#	components/email/email-context-menu.tsx
#	components/mail/mail-app.tsx
2026-11-04 06:19:07 +01:00
Linus Rath 60a97303c2 fix: open the folder when its unread count is clicked, and search all folders again on a new search
Two sidebar tests asserted the old unread-count button (it filtered the
folder to unread without opening it, in a 24px target); they now check
that the count is plain text and opens the folder.
2026-11-04 06:17:05 +01:00
Linus Rath 6efa589448 Merge branch 'feat/do-menu-pos' into feat/do-menu-fixes 2026-11-04 06:12:08 +01:00
Linus Rath f92b7d942d fix: grey out folder and message actions that can't work offline or with nothing unread 2026-11-04 05:32:23 +01:00
Linus Rath 4d404929e2 fix: show the message's own folders in Move to, in mail-client order, with recents and a filter
The Move lists (message menu, reader Move button and its phone panel,
selection toolbar, Move dialog) now share one model in lib/move-menu.ts.
In the desktop app the native copy of the menu lost the shared accounts'
headers and every folder's nesting, so Inbox, Sent, Spam and Trash
showed once per account with nothing to tell them apart.

- Only the message's own account at the top; other accounts a move can
  reach are submenus under their names.
- System folders first (Inbox, Sent, Archive, Spam, Trash), then the
  user's folders by name; subfolders nest, as submenus natively.
- The open folder shows greyed instead of missing.
- A Recent group, a filter field on long lists, and "Choose folder…"
  for the dialog, which has the filter too.

Tests changed: the open folder is now shown disabled rather than left
out, the own account of a shared-mailbox message is a submenu, and the
selection toolbar's filter field has its own label.
2026-11-04 05:20:14 +01:00
Linus Rath 2525c27a7d fix: group the message menus and keep app-level items out of the reader's more menu
The reader's more menu no longer offers Star while the star sits by the
subject, so the tests that expected Star in the menu and the phone panel
now expect it gone. Import mail moved to the command palette (it stays in
the folder menu and Settings); Keyboard shortcuts stay behind ?, the rail
and Help.
2026-11-04 05:19:08 +01:00
Linus Rath 551b5ce4fa fix: name the account sign out leaves in the command palette, add star, hide dead key hints 2026-11-04 05:09:09 +01:00
Linus Rath cb9a5ac810 Merge branch 'feat/do-edit-attachments' into feat/desktop-offline 2026-11-04 03:16:35 +01:00
Linus Rath 81d6948240 Merge branch 'main' of https://github.com/bulwarkmail/webmail 2026-11-04 03:08:16 +01:00
Linus Rath 97c0bd633a Merge branch 'feat/desktop-offline' into feat/do-edit-attachments
# Conflicts:
#	lib/desktop/languages.ts
#	locales/ar/common.json
#	locales/ca/common.json
#	locales/cs/common.json
#	locales/da/common.json
#	locales/de/common.json
#	locales/en/common.json
#	locales/es/common.json
#	locales/et/common.json
#	locales/fa/common.json
#	locales/fr/common.json
#	locales/he/common.json
#	locales/hu/common.json
#	locales/it/common.json
#	locales/ja/common.json
#	locales/ko/common.json
#	locales/lv/common.json
#	locales/mn/common.json
#	locales/nb/common.json
#	locales/nl/common.json
#	locales/pl/common.json
#	locales/pt/common.json
#	locales/ro/common.json
#	locales/ru/common.json
#	locales/sk/common.json
#	locales/th/common.json
#	locales/tr/common.json
#	locales/uk/common.json
#	locales/vi/common.json
#	locales/zh-TW/common.json
#	locales/zh/common.json
2026-11-04 02:40:47 +01:00
Linus Rath d31d0af560 fix: say what an open program still holds, keep forwarded parts under their rules, and let main decide what a sent draft leaves 2026-11-04 02:36:48 +01:00
Linus Rath 71aaadef50 fix: run plugins' compose check in quick compose, keep a composer with one owner, and bring it back after a crash
The first version of quick compose skipped `onBeforeCompose`, a composer
moved back could end up open in both windows, a reply moved back under
Pro flagged the selected message, and a crashed pop-out came back blank.

- A new message in a pop-out runs `onBeforeCompose` with the same result
  as the main window: a plugin that stops it closes the window.
- The way back has two steps, so a pop-out that gave up can't leave a
  second owner. A handoff behind a plugin's gate makes it say busy.
- A Pro tab made from a composer moved back answers its own message.
- Each save writes `draft`, `account` and `owner` into the pop-out's
  address, which a reload after a crash starts from. What was typed since
  the last save, up to the 2 s autosave delay, is still lost.
- The recorder refuses keys that type a character on this keyboard, and
  what the shell refuses from a page, and says why.
2026-11-04 01:31:43 +01:00
Linus Rath 3da18cc2c0 feat: set the quick compose keys in the desktop settings and move a composer back into the main window 2026-11-03 23:25:10 +01:00
Linus Rath 7040a6a049 fix: reply and forward from the account holding the message in Pro tabs #1511 2026-11-03 22:06:21 +01:00
Linus Rath 529d334496 Merge branch 'fix/ui-bug-hunt' 2026-11-03 19:44:46 +01:00
Linus Rath deb73cc6e2 Merge branch 'feat/do-native-ui' into feat/desktop-offline 2026-11-03 18:28:49 +01:00
Linus Rath d09e400d04 fix: keep the tab bar on the mail list on a phone held sideways, hiding it only over what fills the window 2026-11-03 16:11:16 +01:00
Linus Rath f51d6ac9ac fix: let c compose from any Pro tab again except Calendar, whose c is New event 2026-11-03 15:55:06 +01:00
Linus Rath c1e0e5e340 fix: stop a Mountain View list cursor marking the row under it as read 2026-11-03 15:36:55 +01:00
Linus Rath 404d1acdc6 fix: stop an old message reopening by itself on a phone and keep a Mountain View cursor closed when the window narrows 2026-11-03 15:33:35 +01:00
Linus Rath cc9aa64eb7 fix: flag the mail a reply answers when it crosses between a Pro tab and the standard composer 2026-11-03 14:57:35 +01:00
Linus Rath fcfae58a70 fix: keep the open message when / focuses Mountain View's search field in the top bar 2026-11-03 14:47:08 +01:00
Linus Rath 0f799454e4 fix: keep text typed after a clean Mountain View composer move and ask before dropping handed-over edits 2026-11-03 14:42:41 +01:00
Linus Rath 4d244aad0a fix: stop mail keys acting on the hidden mail tab from other Pro tabs 2026-11-03 13:49:01 +01:00