Commit Graph
2417 Commits
Author SHA1 Message Date
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 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 c48d51d1b0 Merge branch 'feat/do-ux-mail-toolbar' into feat/do-ux-mail-fixes 2026-11-04 07:23:31 +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 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 0202803e77 fix: name system folders as the sidebar does in search result chips, the folder menu and the Spam banner 2026-11-04 06:53:17 +01:00
Linus Rath 4c5f3d8f29 feat: suggest senders of the mail on screen while typing a search 2026-11-04 06:43:05 +01:00
Linus Rath 2f108b08fa fix: show dates from earlier this year as day and month in mail lists and search results
The formatter cache test expected the numeric date for every older mail; earlier this year it now reads "Oct 24" unless a date order is picked in the region settings, so the test expects that for those dates.
2026-11-04 06:42:51 +01:00
Linus Rath e67705add0 fix: show in the message list when mail arrived, the order it is sorted in 2026-11-04 06:42:43 +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 c721c737b7 fix: list the all-accounts badge setting in settings search only with several accounts 2026-11-04 06:38:53 +01:00
Linus Rath f828b6dffe fix: show Not spam in Spam and Restore and Delete forever in Trash on the reader toolbar 2026-11-04 06:37:20 +01:00
Linus Rath e9931e28f8 fix: drop the reader toolbar's labels before its buttons and keep Reply, Forward, Archive, Delete and Move
The toolbar measure test counted only item width reads; a pass that fits now reads no item widths, so it counts the toolbar's own scrollWidth reads too.
2026-11-04 06:34:28 +01:00
Linus Rath 0823a531fa feat: search mail for selected text from the desktop app's right-click menu 2026-11-04 06:21:06 +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 9ce7ac8172 feat: show unread per account in the switcher and count every account on the app badge and tray
The default layout's switcher listed accounts without their unread, so an
existing test asserted that (account-switcher-mountain-view, 'unread-free');
it now expects each account's count. The idle-outside-Pro hook test now
uses one account, since a second connected account loads in every layout.
2026-11-04 06:06:37 +01:00
Linus Rath cd3005e036 fix: offer undo in the main window after archiving or deleting in a message window 2026-11-04 06:03:07 +01:00
Linus Rath ec4fd9c529 fix: keep mail shortcuts working after a click into an HTML message 2026-11-04 06:03:05 +01:00
Linus Rath c49c68ffbd Merge branch 'feat/desktop-offline' into feat/do-proxy-fixes 2026-11-04 04:12:23 +01:00
Linus Rath 8cd9d72558 Merge branch 'feat/desktop-offline' into feat/do-proxy-fixes 2026-11-04 03:55:52 +01:00
Linus Rath bce0c0b744 Merge branch 'feat/desktop-offline' into feat/do-keystore-fixes 2026-11-04 03:52:09 +01:00
Linus Rath 7443654459 Merge branch 'feat/do-package-fixes' into feat/desktop-offline 2026-11-04 03:43:04 +01:00
Linus Rath 92e6ee1bfa Merge branch 'feat/do-trust-fixes' into feat/desktop-offline 2026-11-04 03:43:04 +01:00
Linus Rath be8aba2ae7 Merge remote-tracking branch 'origin/main' into feat/desktop-offline
# Conflicts:
#	stores/auth-store.ts
2026-11-04 03:42:18 +01:00
Linus Rath d3308e7729 Merge branch 'feat/desktop-offline' into feat/do-keystore-fixes
# Conflicts:
#	lib/desktop/__tests__/policy-schema.test.ts
2026-11-04 03:31:22 +01:00
Linus Rath 2f846bb2da fix: list the browser sign-in budget as shared server state 2026-11-04 03:30:48 +01:00
Linus Rath 9b61b79d5c fix: sign only CMS signed attributes through api.keystore, and ask a user about a managed plugin's keystore
The shell now takes a message's signed attributes where it took a digest,
so a page can't get a login or TLS digest signed. A quiet option lets a
plugin answer from what's allowed, for anything the user didn't ask for.

An admin's install no longer covers the certificates on someone's own
computer: a managed plugin gets `keystore` when that person says yes, also
when an update adds it, and it's forgotten once everyone has signed out.

Changed test assertions: the fixture plugin needs a grant now, as managed
alone is no longer enough, and the bridge gets an options argument.
2026-11-04 03:23:45 +01:00
Linus Rath b1f26a93bf feat: let an organisation turn the system certificate store off by policy 2026-11-04 03:23:44 +01:00
Linus Rath 484ce34f5d Merge branch 'feat/do-browser-signin' into feat/desktop-offline 2026-11-04 03:19:32 +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 466fa7f974 fix: keep the desktop app's session secret and admin password out of its server's environment 2026-11-04 03:15:42 +01:00
Linus Rath a9e33ec2d6 fix: stop a page wiping another account's plugin secrets by naming it in the desktop app
A wipe by name took any username and server with no session behind it. It
now needs a sealed cookie the account got while it was signed in, since a
dropped account has no session cookie left. The old wipe test asserted that
a name alone was enough, which is the behaviour being removed.
2026-11-04 03:15:35 +01:00
Linus Rath 149d08d87b test: load the preview route once before its cases, so a slow import can't spill into them 2026-11-04 03:13:59 +01:00
Linus Rath f39cff2377 fix: call no relay from the worker in no-third-party mode, and handle several accounts in one push side by side 2026-11-04 03:13:59 +01:00
Linus Rath d8e2a4f42c fix: keep a waiting re-sync from undoing what another tab turned off, and note the relay on refresh 2026-11-04 03:13:59 +01:00
Linus Rath 9432345440 fix: keep a nothing-new notification from closing or replacing a real one 2026-11-04 03:13:59 +01:00
Linus Rath 8cb218ce3c fix: apply email notifications off and do not disturb per login, not to every login's mail 2026-11-04 03:13:59 +01:00
Linus Rath 248f9c261b fix: take down push for logins with no connection when signing out of everything 2026-11-04 03:13:59 +01:00
Linus Rath 9bc31b54ab fix: keep notifications generic after the browser closed when the organisation has idle limits 2026-11-04 03:13:59 +01:00
Linus Rath 6dbda4424e fix: stop a stuck push setup from holding up every tab and login 2026-11-04 03:13:58 +01:00
Linus Rath bc8653de8b fix: only replace a browser subscription on the relay's own answer, and move the other logins along 2026-11-04 03:13:58 +01:00
Linus Rath 226b9383ce fix: show a generic notification instead of guessing which login a push is for 2026-11-04 03:13:58 +01:00
Linus Rath f0617a61b1 fix: only treat a server subscription as this browser's when its device id matches 2026-11-04 03:13:58 +01:00
Linus Rath 6ffa0a3715 fix: show the real sender and subject for a push after the browser was closed 2026-11-04 03:13:57 +01:00
Linus Rath 5c62c57657 fix: replace a browser subscription the push service gave up on 2026-11-04 03:13:57 +01:00
Linus Rath a6ef818149 fix: end a login's push registration when it signs out, is removed or wiped 2026-11-04 03:13:57 +01:00
Linus Rath 8b4fb72357 fix: say in plain words why push could not be turned on or off 2026-11-04 03:13:57 +01:00
Linus Rath d520af51b2 fix: restore push when the browser replaces its subscription with no tab open 2026-11-04 03:13:56 +01:00