Commit Graph
2500 Commits
Author SHA1 Message Date
Linus Rath 2cb70d475e Merge branch 'feat/do-ux-pim-contact' into feat/do-ux-pim-fixes 2026-11-04 11:09:24 +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 409c7110c0 feat: mark unanswered invitations in the calendar grid and answer them from it 2026-11-04 10:57:13 +01:00
Linus Rath 7c7800c639 fix: write the week title and other date ranges the way each language does 2026-11-04 10:55:56 +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 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 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 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 dfed23e382 fix: keep developer tools off when the forced policy value can't be read 2026-11-04 09:06:38 +01:00
Linus Rath dcb505aac1 fix: find calendar subscriptions and mail app server settings in settings search 2026-11-04 08:46:34 +01:00
Linus Rath d70c7201fa fix: find the contact list section in settings search
The 2fa and two-factor search tests now expect the row's new name, Two-step sign-in, since the security row was renamed.
2026-11-04 08:45:24 +01:00
Linus Rath b732acbcdb fix: give every settings row its own name 2026-11-04 08:45:23 +01:00
Linus Rath 3841bdd630 Merge branch 'feat/do-drop-overlay' into feat/desktop-offline
# Conflicts:
#	desktop-policies/de-DE/Bulwark.adml
#	desktop-policies/en-US/Bulwark.adml
2026-11-04 08:37:26 +01:00
Linus Rath 91b237330e Merge branch 'feat/desktop-offline' into feat/do-ux-settings-fixes
# Conflicts:
#	components/settings/desktop-os-settings.tsx
#	components/settings/notification-settings.tsx
#	components/settings/protocol-handler-settings.tsx
2026-11-04 08:35:53 +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 d0c86a4fce Merge branch 'feat/do-uxs-folders' into feat/do-ux-settings-fixes 2026-11-04 08:34:58 +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 e45c66c755 Merge branch 'feat/do-uxs-vacation' into feat/do-ux-settings-fixes 2026-11-04 08:33:14 +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 16273e447f feat: put user features and settings with the organisation pages under Users and let features apply to one domain or group
The admin skeleton test and the outgoing-hosts path test now expect the
sidebar heading "Users" and the page "Features and settings": the
Organisation group was renamed and User policy moved into it.
2026-11-04 08:22:41 +01:00
Linus Rath 2429556b93 feat: show every signed-in account's calendars together
With two accounts signed in, Calendar showed only the active one's
calendars. Now, as in the Pro interface, the sidebar lists each
account's calendars under its name, each with its own checkbox, ticked
by default, and the grid shows the ticked ones together. Creating,
editing, moving, deleting and answering an event of the other account
go through that account; tasks of all accounts are listed and change in
their own account.

- a calendar one account sees as shared and the other owns shows once
- a load or push that names one account keeps the merged list
- an event made in the other account's calendar no longer takes the id
  of the active account's event with the same raw id
- a change to an event the store no longer holds still goes to the
  account its id names
2026-11-04 08:08:21 +01:00
Linus Rath bc955be104 feat: offer to apply a new filter rule to the inbox and drop developer words from the rule editor
- After a new rule is saved in Settings > Filters, a notice offers
  "Apply to N existing messages in Inbox" when the rule would change
  mail already there (the same check and batch actions as rules made
  from a message).
- "Stop processing" is no longer an action. The checkbox "Don't apply
  later rules" does it; an old rule with the action opens with it
  folded into the checkbox, and what came after the stop (which never
  ran) is dropped.
- "matches regex" and the raw Sieve editor show only with advanced
  settings on (the editor stays for a script only it can change).
- "Match all conditions" / "Match any condition", no capitals.
- The folder picker names folders as the sidebar does, indented, and
  leaves out Drafts, Sent and Scheduled unless the rule already uses one.

The regex test now turns on advanced settings first, and the focus
tests open the raw editor with advanced settings on, since both are
advanced now.
2026-11-04 08:08:16 +01:00
Linus Rath e403478a05 fix: show the default calendar and contacts by plain names, hide CalDAV addresses until asked and translate the previews
The CalDAV fallback test now clicks "Use in other apps" first, because the
address is no longer shown on every calendar row.
2026-11-04 08:05:31 +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
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 de09da137b Merge branch 'feat/do-menu-winctl' into feat/do-menu-fixes 2026-11-04 07:50:16 +01:00
Linus Rath 7ce57bedfd fix: show offline sync progress once and say plainly what backup and reply settings do 2026-11-04 07:38:00 +01:00
Linus Rath b082ce582e feat: put offline, privacy and about on settings pages of their own and widen the settings search
Offline sat in the middle of Backup & reset, privacy settings were spread
over Reading, Composing and Message list, and the version card took room
from the page list in the sidebar's footer. The search matched letters
inside words ("lock" found Time format and Send Checks) and knew no other
words for a setting ("offline", "autoreply", "logout" found nothing).

- Offline is a page in the top group: Keep mail on this device, what is
  kept, Remove everything from this device, and the Outbox as its own
  section. Old `/settings/backup/offline` links and the offline notice
  land there.
- Privacy holds remote images and trusted senders, read receipts, sender
  pictures from the web, the desktop app's usage info and crash reports,
  and a link to the push relay on Notifications. Reading, Composing and
  Message list keep a link row; old links to those sections land on
  Privacy.
- About is the last page and holds the version card; the footer keeps the
  Advanced switch.
- The search matches whole words and word starts (substrings only in
  Chinese, Japanese and Thai), and each row can carry synonyms in the
  user's language. A page matches by its name and keywords or when one of
  its rows has every word. Account gets a Sign out row so "logout" leads
  somewhere.
- The index test now also fails when a page draws a section the index
  doesn't know, and a new test fails on two indexed rows with the same
  name. Tests that rendered remote content and sender pictures on Reading
  and Message list render Privacy instead, since that's where the rows are.
2026-11-04 07:37:25 +01:00
Linus Rath 1c26d9040f Merge branch 'feat/do-ux-desktop-fixes' into feat/desktop-offline 2026-11-04 07:31:33 +01:00
Linus Rath b3c9d99df7 fix: make the General and Notifications settings say what they do
The usability pass of 2026-11-04 found the General and Notifications
pages hard to read, and the desktop app showing browser-only rows.

- Time zone: a searchable list by city and offset, common zones
  first, with today's city names (Kolkata, Kyiv, Ho Chi Minh City).
  The stored value stays the IANA id the runtime knows.
- First day of the week: "First day of the week in calendars".
- Desktop app: no browser link handlers (the app has its own "Default
  mail app" row), no usage info on General (it moves to Privacy),
  time zone and app lock texts without the browser and tabs.
- Taskbar flashing and quiet hours move to Notifications.
- "Windows" is now "App windows".
- Notifications: "Sound for new mail", "Sound for reminders", a
  "Sound" section with a "Tone" row, "Notifications when Bulwark is
  closed" with "Turn on for this device", a short badge description.
- Link handlers: "Open email links in Bulwark" with "Use Bulwark for
  email links", no "Technically" sentence.
- App lock: "The PIN stays on this device.", the protection text
  behind "What does this protect?", "1 hour" and "4 hours", one line
  in the PIN dialog instead of repeating its title.
- Usage info names "the app's version numbers", as the desktop's
  first run does, instead of the Node version.

Test changes: the telemetry wording test looked for "Node version",
which the text no longer names; the search-anchor test now fills in
{appName} before comparing, as the search index does, because row
labels name the app.
2026-11-04 07:30:54 +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 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 b8646eefc4 Merge branch 'feat/desktop-offline' into feat/do-menu-fixes 2026-11-04 07:11:07 +01:00
Linus Rath 021712d55e Merge branch 'feat/do-menu-pos' into feat/do-menu-fixes 2026-11-04 07:09:17 +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 2fcb7cd544 fix: print an invitation with its date, time, place and organiser 2026-11-04 07:05:31 +01:00
Linus Rath 5c3a12f91c feat: use the plain wording for everyone and drop the plain language switch
The plain-language test asserted that the normal strings show while the switch is off and that changing the switch swaps them live. With no switch left, it now asserts the plain strings show from the first render and through a language change.
2026-11-04 07:04:42 +01:00
Linus Rath e29a6553e6 fix: keep notices and the offline bar clear of the window's controls, give each a close, and put a pane's close first where it would sit beside the window's 2026-11-04 07:02:53 +01:00