Commit Graph
1535 Commits
Author SHA1 Message Date
Linus Rath 6975f96a4b Merge branch 'feat/desktop-offline' into feat/do-ux-p2-mail-fix
# Conflicts:
#	components/email/email-viewer.tsx
#	components/email/thread-conversation-view.tsx
#	components/mail/mail-app.tsx
#	components/ui/toast.tsx
#	lib/keyboard-shortcuts/mail.ts
#	lib/window-controls-overlay.ts
2026-11-04 13:37:49 +01:00
Linus Rath 0f2fa7bafe Merge branch 'feat/do-ux-p2-compose-fix' into feat/desktop-offline 2026-11-04 13:28:56 +01:00
Linus Rath 816e4dc24e fix: measure the window controls again after a resize, so the desktop toolbar keeps its buttons at 800 px 2026-11-04 13:22:00 +01:00
Linus Rath 063d9c9c47 fix: drop the scheduled mark from a reply in the conversation once it has gone out 2026-11-04 13:10:38 +01:00
Linus Rath 0b16295b45 Merge branch 'feat/desktop-offline' into feat/do-ux-p2-desktop-fix 2026-11-04 13:07:35 +01:00
Linus Rath 19034489a6 Merge branch 'feat/desktop-offline' into feat/do-ux-p2-mail-fix 2026-11-04 12:57:11 +01:00
Linus Rath c657c4c5ba fix: keep unfolded messages readable when the conversation is read again after a send 2026-11-04 12:55:41 +01:00
Linus Rath 07b6cae9e8 fix: call the unread count the taskbar icon's in the desktop app, and write "Not sent:" with a colon 2026-11-04 12:50:52 +01:00
Linus Rath efd5b70d53 Merge branch 'feat/desktop-offline' into feat/do-ux-p2-compose-fix 2026-11-04 12:41:13 +01:00
Linus Rath 90e959a092 fix: show a sent reply in the open conversation at once, keep it out of Sent and Scheduled during Undo, and bring an undone reply back where it was written 2026-11-04 12:35:50 +01:00
Linus Rath 5e34dc59ab fix: name keys in the app's language in menus, hints and the shortcut help (Strg, Umschalt, Entf in German) 2026-11-04 12:09:08 +01:00
Linus Rath a2edb10e93 docs: list Ctrl+F for Forward in the desktop app's shortcut help 2026-11-04 12:04:15 +01:00
Linus Rath e93e0419b8 Merge branch 'feat/do-ux-p2-mail-desk' into feat/do-ux-p2-mail-fix 2026-11-04 11:58:31 +01:00
Linus Rath 712236867e Merge branch 'feat/do-ux-p2-mail-folders' into feat/do-ux-p2-mail-fix
# Conflicts:
#	components/email/email-viewer.tsx
2026-11-04 11:57:23 +01:00
Linus Rath e9e5a43391 fix: say when a message needs a connection in a browser that keeps no mail offline 2026-11-04 11:51:47 +01:00
Linus Rath e7cef5ba1c feat: open a draft in the composer on click, and Reply resumes the reply already drafted 2026-11-04 11:44:53 +01:00
Linus Rath c2f80e2d29 fix: count every account's unread mail in the rail's Mail badge and the tab title, as the favicon does 2026-11-04 11:42:22 +01:00
Linus Rath 1ccbddad50 fix: list folders in Move menus in the sidebar's order and leave out Sent
The Move list tests no longer expect Sent as a target or in the recent
folders, and the target count drops by one with it.
2026-11-04 11:33:53 +01:00
Linus Rath 9ae258cc74 fix: count conversations in batch toasts and say "Archived" after archiving in a message window
The moved-undo and popout-host tests expected "Email archived" from a
message window; the main window says "Archived", and now so does the
window.
2026-11-04 11:32:03 +01:00
Linus Rath 0a09fec123 fix: offer Empty Trash and Empty Spam only there, with the message count, and drop folder actions that can't apply
The folder menu tests no longer expect "Empty folder" on a folder of
your own: emptying is offered on Trash and Spam only now. The Mountain
View list test expects the entry to read "Empty Trash".
2026-11-04 11:30:11 +01:00
Linus Rath 814945a445 fix: say Restore and Delete forever in Trash and stop offering Report spam there
The reader toolbar tests now find the quick reply box by either
placeholder: since the box names its recipients ("quick_reply_to"), the
old placeholder assertion failed and the Spam test passed vacuously.
2026-11-04 11:19:45 +01:00
Linus Rath 3f4a1365f8 fix: keep the window's buttons clear of the app's after a maximise, restore, snap or resize 2026-11-04 11:11:36 +01:00
Linus Rath a415db9bac Merge branch 'feat/desktop-offline' into feat/do-ux-pim-fixes
# Conflicts:
#	stores/settings-store.ts
2026-11-04 11:10:15 +01:00
Linus Rath c08e9e56fb Merge branch 'feat/do-ux-pim-files' into feat/do-ux-pim-fixes 2026-11-04 11:09:45 +01:00
Linus Rath d59a896558 fix: show the same Reply all and Delete keys in tooltips, menus and help
The desktop shortcut test expected the help's old "R / a" for Reply
all; it now lists "Shift + R", the key the menus show.
2026-11-04 11:09:29 +01:00
Linus Rath e25d3e1e56 fix: keep a contact's address as stored when other fields change, and lay addresses out by country 2026-11-04 11:06:40 +01:00
Linus Rath 811212a944 fix: show the date for mail older than six days instead of a weekday that reads as today 2026-11-04 11:03:21 +01:00
Linus Rath e5dc1dd247 feat: ask Replace, Keep both or Skip when an upload's name exists in Files
An upload over a name that is taken in the target folder used to add
"name (1)" without a word. Every upload path (picker, drag and drop, the
drop overlay, folder upload) now asks per name, with "Do this for all n
conflicts" when there are several:
- Replace gives the existing node the new blob, so it keeps its id,
  shares and links; for a folder it merges into the existing one and
  replaces files of the same name.
- Keep both numbers the new one, as before.
- Skip leaves it out; Cancel stops the whole upload.

Also in Files:
- A file with no preview and no office editor opens a pane with its
  icon, size and Download instead of downloading at once, and in the
  desktop app also Open in default app (the attachment Edit path). The
  item menu gets Open for such files, and Open in default app in the
  desktop app.
- Enter opens the row Tab put the focus on.
- After sharing with someone new, a toast offers Send a message, which
  opens the composer to them with a link to the file.
- The empty folder's buttons read Upload files... and New folder..., as
  the menus do.
2026-11-04 11:01:25 +01:00
Linus Rath d783981373 Merge branch 'feat/desktop-offline' into feat/do-ux-pim-fixes
The settings pass hid each calendar's CalDAV address behind "Use in
other apps"; pim-26 lists the address once per account. The list now
waits behind one "Use in other apps" button, and the wording test
clicks the new Edit… button instead of the old pencil.
2026-11-04 10:09:03 +01:00
Linus Rath a1673dd77a Merge branch 'feat/desktop-offline' into feat/do-ux-compose-fixes 2026-11-04 09:59:11 +01:00
Linus Rath a2559713e9 test: compare the plugin kit's text area with the signature editor it now copies 2026-11-04 09:55:40 +01:00
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 aa62855759 Merge branch 'feat/do-ux-settings-fixes' into feat/desktop-offline
# Conflicts:
#	components/layout/__tests__/account-switcher-mountain-view.test.tsx
#	components/layout/account-switcher.tsx
#	components/settings/accessibility-settings.tsx
#	components/settings/reading-settings.tsx
2026-11-04 09:44:51 +01:00
Linus Rath 3134205260 fix: show an invitation's date once, its zone only when it differs, and the answer once given
Changed assertions: the schedule tests in calendar-invitation.test now
expect Intl's range format ("Tue, Oct 20, 16:00 – 16:25") with the
event's own times after it when its zone's clock differs, instead of
the repeated date and "GMT+2". The banner test's next-intl mock gets
useLocale.
2026-11-04 09:35:37 +01:00
Linus Rath f607f48bf2 fix: keep events in their own time zone and ask for the time first in the event form
Saving an event wrote it in the user's zone, so a title change moved a
New York meeting to Europe/Berlin. The form now shows and saves the
times on the event's own clock, with a time zone field ("Time zone: New
York", or a "Time zone" link when it is yours), and the popover shows
"10:00–11:00 New York (16:00–17:00 your time)". The form asks for the
date and time right after the title and for the description last.
Participant answers read in plain words ("Not answered yet"), the
untitled preview is translated, and the quick editor grows to fit long
calendar names.

Changed assertions: rsvp-buttons.test expects the plain status key, and
event-modal-organizer.test expects an unchanged save to keep the event's
New York zone instead of rewriting it into the user's.
2026-11-04 09:35:22 +01:00
Linus Rath 4a764150b2 Merge branch 'feat/desktop-offline' into feat/do-ux-settings-fixes 2026-11-04 09:22:44 +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 a0dca05585 test: keep single letters out of the composer's shortcut list 2026-11-04 09:13:46 +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 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 b732acbcdb fix: give every settings row its own name 2026-11-04 08:45:23 +01:00
Linus Rath 217e04bb31 Merge branch 'feat/do-uxs-wording' into feat/do-ux-settings-fixes 2026-11-04 08:35:00 +01:00
Linus Rath ceaa81cd9e Merge branch 'feat/do-uxs-plugins' into feat/do-ux-settings-fixes 2026-11-04 08:34:57 +01:00
Linus Rath e2236ea476 Merge branch 'feat/do-uxs-general' into feat/do-ux-settings-fixes
# Conflicts:
#	components/settings/__tests__/settings-search-anchors.test.tsx
#	components/settings/accessibility-settings.tsx
#	lib/settings-search.ts
2026-11-04 08:34:25 +01:00
Linus Rath adbab2e4aa Merge branch 'feat/do-uxs-structure' into feat/do-ux-settings-fixes
# Conflicts:
#	lib/settings-search.ts
2026-11-04 08:33:26 +01:00
Linus Rath dc16e2c2da fix: correct admin wording about Stalwart setup, templates, cookie SameSite and when users get a change 2026-11-04 08:23:30 +01:00
Linus Rath e0f19bc6f1 feat: list the server settings for other mail apps and keep rare app password options behind More options 2026-11-04 08:05:31 +01:00
Linus Rath 93f573f750 feat: put the plugins switch first, ask to turn it on after an install and keep user uploads off by default
The installPlugin translations test now allows uploads first: user
uploads are off by default, and it tests the manifest's locales.
2026-11-04 08:05:30 +01:00
Linus Rath 19e5ca5077 fix: list the tasks of task-only lists and turn tasks on by default
The tasks view filtered tasks by the grid's calendar selection, which
never holds a task-only list such as "To-do". Those tasks never showed
while the sidebar counted them, and a task moved into To-do vanished on
save. The tasks view now has its own task lists in the sidebar, ticked
by default, and the grid's selection is left alone.

- tasks are on by default; an "off" the user never chose turns on, one
  they chose stays
- new tasks go to the first task-only list
- "Add a task…" reads a date at the end of the title (tomorrow, Friday,
  12.11.) into the due date and shows it as a chip first
- the task status says "Not started" and "In progress"

filterTasksForList now takes the unticked task lists instead of the
selected calendars, so task-plugin-surfaces passes the unticked list and
task-list-dates no longer passes selectedCalendarIds.
2026-11-04 08:02:27 +01:00
Linus Rath ce34617147 feat: turn plugins an admin installs on for every user, who can turn them off
The #1327 store test now serves its optional plugin with defaultOn false:
it checks that every plugin is listed when IndexedDB fails, and a plugin
the admin didn't force is on by default now.
2026-11-04 08:01:38 +01:00