Commit Graph
980 Commits
Author SHA1 Message Date
Linus Rath f14fd9bbb9 fix: say when an admin page could not load instead of an endless skeleton or an empty list 2026-11-03 06:12:47 +01:00
Linus Rath 9415910977 fix: show the top of a marketplace extension after picking a version to preview from the table 2026-11-03 06:01:55 +01:00
Linus Rath 269e83690b fix: stop true and false breaking across lines in the effective policy table 2026-11-03 05:48:08 +01:00
Linus Rath 3ce7482f1c fix: keep long redirect addresses inside the OAuth setup dialog and space its first field from the text 2026-11-03 05:48:06 +01:00
Linus Rath a529d09860 fix: show what an audit entry changed instead of undefined or object placeholders, and filter by plugin and theme actions 2026-11-03 05:40:31 +01:00
Linus Rath 8332793e85 fix: draw the focus ring of plugin form fields inside the frame so all four sides show 2026-11-03 05:20:47 +01:00
Linus Rath 00af75f99d fix: wrap long addresses inside the plugin approval card 2026-11-03 05:19:52 +01:00
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