Commit Graph
973 Commits
Author SHA1 Message Date
Linus Rath f44bef7071 fix: stop the high-risk badge running under the switch in the plugin list on small phones 2026-11-03 05:19:51 +01:00
Linus Rath 1c4781e620 fix: give the update and manage buttons their own line in the marketplace installed list on phones 2026-11-03 05:19:50 +01:00
Linus Rath 7394006ce1 fix: keep the marketplace search readable when the toolbar runs out of room 2026-11-03 05:16:37 +01:00
Linus Rath a1662dfaf3 fix: keep the login page's theme button clear of the card on small and landscape phones 2026-11-03 05:15:53 +01:00
Linus Rath 5ce2a591ad fix: show dark logos on a dark surface in branding and bring a preview back after a URL that failed 2026-11-03 05:11:29 +01:00
Linus Rath e3bd9aa6c5 fix: keep marketplace dialogs on screen on phones instead of pushed off the edge 2026-11-03 05:05:38 +01:00
Linus Rath 03e7cd86f1 fix: print only the open message on Ctrl+P, without plugin panels or the app around it 2026-11-03 03:30:33 +01:00
Linus Rath d82f677b9b fix: stop the admin overview offering an older version as an update 2026-11-03 03:27:33 +01:00
Linus Rath 27e84b3c93 fix: show the app name and plugin name in a marketplace plugin's permissions 2026-11-02 23:33:57 +01:00
Linus Rath 6990abff45 fix: keep the proofreading forced-colours rules after the main forced-colours block #1397 2026-11-02 22:03:06 +01:00
Linus Rath 72117c8a71 Merge branch 'main' into feat/proofreading
# Conflicts:
#	components/admin/admin-shell.tsx
2026-11-02 21:27:17 +01:00
Linus Rath 42d1143df1 fix: mark the plugin proxy's no-third-party refusal as the proxy's own error 2026-11-02 20:57:56 +01:00
Linus Rath 6055dac1cb fix: keep proofreading text from plugins that shouldn't get it, and work it by keyboard #1397
A security and an accessibility review of the proofreading hook found
gaps, fixed here.

What leaves the browser:
- A checker gets a name for each composer of its own, not the composer's
  id, so it can't reach the message through the other api.composer calls
  after proofreading stops.
- Checking pauses while a plugin that can sign or encrypt is turned on but
  still starting, and while the policy couldn't be fetched (the built-in
  defaults could undo an admin's lock).
- No plugin can hold up turning proofreading off (onBeforeSettingChange).
- Suggestions can't carry zero-width, bidi or line-separator characters;
  messages lose bidi overrides; a flood of annotations is cut off early.
- The notices name the plugin as installed, not a label it chose, and say
  that text written before signing or encryption was turned on may
  already have been checked.
- A checker registered during start-up no longer fails its first check.

Keyboard and screen readers:
- Escape in the issue panel closes the panel, not the message.
- Underlines carry aria-invalid, as the browser's own markers do.
- The focus goes somewhere sensible when a button or an issue goes away,
  Tab past the popup's edges goes back to the text, and the shortcuts work
  in the popup and the panel.
- Ctrl+' and Ctrl+; follow the character typed, so other layouts keep
  their own keys (Ctrl+S on Dvorak), with Ä and Ö on German keyboards.
- The popup is described by its message, sits inside a modal composer,
  fits narrow screens, and the panel fits a phone.
2026-11-02 20:26:21 +01:00
Linus Rath 0c8ca9ceff fix: close the calendar column rule the merge left open 2026-11-02 20:13:27 +01:00
Linus Rath 0bacfb389e Merge branch 'feat/boot-skeleton-mail' into feat/boot-skeleton
# Conflicts:
#	app/boot-skeleton.css
#	lib/boot-skeleton/boot-script.ts
2026-11-02 20:01:22 +01:00
Linus Rath 3db7b745d0 Merge branch 'feat/boot-skeleton-calendar' into feat/boot-skeleton
# Conflicts:
#	app/boot-skeleton.css
#	components/boot-skeleton/shell.tsx
2026-11-02 19:51:39 +01:00
Linus Rath 5fc65b47cc feat: let admins require or turn off proofreading per group and plugin #1397 2026-11-02 19:46:01 +01:00
Linus Rath e47eceb242 feat: draw the calendar toolbar's own words and task list in its skeleton 2026-11-02 19:42:52 +01:00
Linus Rath 90044b9d5a perf: draw the mail skeleton's rows with less markup 2026-11-02 19:42:40 +01:00
Linus Rath 56678fd499 Merge branch 'feat/boot-skeleton-auth' into feat/boot-skeleton
# Conflicts:
#	components/boot-skeleton/shell.tsx
2026-11-02 19:42:04 +01:00
Linus Rath 1d90e6f638 fix: keep skeleton placeholders visible on sidebars in dark mode 2026-11-02 19:40:30 +01:00
Linus Rath a6572a9d47 test: check the sign-in callback shows the mail skeleton while it completes 2026-11-01 20:05:21 +01:00
Linus Rath d2205b9c09 Merge branch 'feat/boot-skeleton-cfa' into feat/boot-skeleton
# Conflicts:
#	app/boot-skeleton.css
2026-11-01 19:59:52 +01:00
Linus Rath 63e62865d6 Merge branch 'feat/boot-skeleton-settings' into feat/boot-skeleton
# Conflicts:
#	app/boot-skeleton.css
2026-11-01 19:59:39 +01:00
Linus Rath c06b4b5e28 feat: show the calendar's grid while the app loads 2026-11-01 19:48:20 +01:00
Linus Rath b6ca61f8a7 feat: draw the new-contact form while the app loads on /contacts/new 2026-11-01 19:47:19 +01:00
Linus Rath e113411300 feat: match the settings skeleton's section row to the open page 2026-11-01 19:46:59 +01:00
Linus Rath 13a5667577 fix: show the admin sign-in logo for the theme from the first paint 2026-11-01 19:42:51 +01:00
Linus Rath 1e8f64f36e feat: show the mail skeleton while a mailto link opens 2026-11-01 19:40:21 +01:00
Linus Rath d37624a314 feat: underline spelling and grammar issues from checker plugins #1397 2026-11-01 19:39:37 +01:00
Linus Rath 57c1d5d472 feat: show the contacts, files and plugin page shapes while the app loads 2026-11-01 19:36:09 +01:00
Linus Rath e1cfc1d726 test: check the sign-in, admin and setup skeletons stand in for their spinners 2026-11-01 19:33:39 +01:00
Linus Rath afe3fca08a feat: draw the mail page's folders, list and reader while the app loads 2026-11-01 19:33:35 +01:00
Linus Rath 7efae37645 fix: mark the active Pro tab and draw the stored tab count in the skeleton 2026-11-01 19:27:43 +01:00
Linus Rath f5bcc8d47d feat: show the sign-in, admin and setup pages' shape while they load 2026-11-01 19:25:13 +01:00
Linus Rath 5166cd0a5a feat: show the settings page's shape while the app loads 2026-11-01 19:24:13 +01:00
Linus Rath 3ba57f2b41 feat: keep the Pro skeleton up until the Pro workspace is ready 2026-11-01 19:24:00 +01:00
Linus Rath 4ea0292d78 feat: draw the Pro workspace's tabs and panes while the app loads 2026-11-01 19:24:00 +01:00
Linus Rath 441371554b feat: draw the rail's add app button in the page skeleton 2026-11-01 18:48:01 +01:00
Linus Rath 8d790b29fd feat: show the page's skeleton on Lite pages while their language loads 2026-11-01 18:41:58 +01:00
Linus Rath 943276696b feat: paint the saved theme, density and layout before the app loads 2026-11-01 18:41:58 +01:00
Linus Rath 4b60fcc1e6 fix: make the offline outbox never send twice, never lose mail silently and never skip a plugin #523
The review of offline mode found ways to send a message twice, to lose
unsent mail without a word, and to send mail without its signing,
encryption or check plugin. This fixes them and the smaller findings:

- each outbox message is taken for sending in one database transaction
  under a Web Lock per account; only a failure before the submission
  request (SendNotStartedError from the client) puts it back, any other
  one marks it "may have gone out"; read-backs after the submission no
  longer fail a send; a send of a closed tab turns uncertain after a minute
- every sign-out the user didn't confirm names the deleted messages on
  the sign-in page, or in a toast when another account stays signed in
- nothing is queued while an enabled plugin isn't running (after a start
  without the network none can); the composer says why
- the outbox waits for a fresh policy and holds messages the rules have
  since made stricter (a required label, a required send check)
- another tab switching offline mode off sticks: only switching it on
  may create the database
- only attachments of kept messages are kept, filed with their message,
  deleted with it and under the cap between syncs; file names and types
  are sealed; folders that went away leave the scope, and a folder that
  couldn't be asked keeps its mail without holding the others back
- a group scope that forbids offline mode waits until the account's
  groups are known; one server down no longer holds another's mail
- an offline start only when the server is really unreachable, and the
  real sign-in follows by itself once it answers
- the service worker files pages and chunks under the build that served
  them, and the shell list of another build isn't kept under this one
- a raw send counts as the composer's only from the plugin running its
  takeover, for that identity
- errors and refusals are in all languages; the banner tells "offline"
  from "server can't be reached"; outbox buttons name their message;
  changes and messages go in the order they were made
2026-11-01 14:19:54 +01:00
Linus Rath 52188f54d6 Merge branch 'feat/enterprise-pack' into feat/enterprise-pack-f 2026-11-01 13:50:22 +01:00
Linus Rath e9b235bab2 Merge branch 'main' into feat/enterprise-pack
# Conflicts:
#	components/admin/admin-shell.tsx
#	lib/admin/outgoing-hosts-registry.ts
#	lib/admin/reachable-hosts.ts
#	scripts/lite/build.mjs
#	stores/policy-store.ts
2026-11-01 13:46:59 +01:00
Linus Rath eb26219b3c feat: send telemetry error counts within a minute when an admin turns on instant mode 2026-11-01 12:55:58 +01:00
Linus Rath db5ac82f53 feat: keep recent mail on this device and send mail written offline #523
Settings > Backup & reset gets "Keep mail on this device", off until the
user turns it on in this browser. While it is on:

- the JMAP client hands the server's answers to an encrypted cache in
  IndexedDB (AES-GCM, non-extractable key) and answers from it when the
  network is gone: the folder list, the last 30 days of the Inbox and of
  the folders the user opened, bodies and attachments, at most 250 MB,
  oldest out first; a background sync keeps it current
- read, flag, tags and moves made offline are queued and sent in order
  when the server answers again; deleting for good and emptying a folder
  are refused offline
- the composer, quick reply and the S/MIME and PGP plugins' sends that
  complete the composer's go to an outbox once every step up to the
  transport ran (checks, label, signature, plugin send checks); only the
  finished send waits, with files attached offline
- the service worker keeps this build's app shell, so the app also
  starts offline from the kept session and the last policy
- a full sign-out, the idle sign-out and signing one account out delete
  it, a sign-out the user starts asks first when mail is unsent, and the
  login page names what an automatic sign-out deleted; a policy fetch
  that forbids it (devices.noOffline) wipes that account

Not in Lite.
2026-11-01 11:46:11 +01:00
Linus Rath 91be465cbc feat: version the service worker by build and offer a reload after a deploy 2026-11-01 11:13:31 +01:00
Linus Rath 0401352e6e Merge branch 'feat/enterprise-pack-d'
# Conflicts:
#	components/email/thread-conversation-view.tsx
#	lib/admin/outgoing-hosts-registry.ts
2026-11-01 10:48:21 +01:00
Linus Rath 6b3a220d44 fix: let only a server the admin typed through with no third-party traffic 2026-11-01 10:06:00 +01:00
Linus Rath 6e931a731c fix: keep the server-side device policies on when a login's session or the policy can't be read 2026-11-01 09:44:03 +01:00