Commit Graph
1639 Commits
Author SHA1 Message Date
Linus Rath ee17c0dbaf feat: undo marking read or unread, stars and tags from the toast or with Ctrl+Z 2026-10-29 17:53:47 +01:00
Linus Rath 4af4404962 feat: undo the last mail actions with Ctrl+Z or z, newest first 2026-10-29 17:53:46 +01:00
Linus Rath 8d2ebccf08 feat: keep undo toasts, errors and reminders as long as the notification duration says 2026-10-29 17:53:45 +01:00
Linus Rath be5e2dbc53 feat: hold toasts while focused and jump to the newest with Alt+Shift+N 2026-10-29 17:53:45 +01:00
Linus Rath e2fc2c750a feat: read toasts out to screen readers, errors assertively 2026-10-29 17:53:44 +01:00
Linus Rath 36d13b76bd feat: add app-wide live regions for screen reader announcements 2026-10-29 17:53:44 +01:00
Linus Rath 420bf8f9a4 feat: offer an accessible example message in the template picker 2026-10-29 17:53:44 +01:00
Linus Rath 53cb49d3ce feat: ask for alt text when an image goes into a message
Pasted and dropped images used to get the file name as alt text, and
there was no way to change it. Now a small dialog asks what the image
shows right after it is inserted, with a "Decorative image" option that
writes alt="". An image already in the text can be described from the
toolbar or from the ALT button on the selected image. The plain-text
part of an HTML mail writes described images as "[Image: ...]" and
leaves decorative ones out.

The formatting toolbar now also re-renders when only the selection
changes, so its pressed states and the image button follow the caret.
2026-10-29 17:53:43 +01:00
Linus Rath ee486077de fix: name the recipient fields and let the keyboard reach and remove chips 2026-10-29 17:53:38 +01:00
Linus Rath f23784a488 feat: open submenus, previews and the rail peek only on click when hover opening is off 2026-10-29 17:53:37 +01:00
Linus Rath dcc504fcfa feat: add landmarks, an h1 per app, skip links and F6 between panes 2026-10-29 17:53:35 +01:00
Linus Rath 13d697ddfb feat: turn off every single-key shortcut when the setting is off 2026-10-29 17:53:34 +01:00
Linus Rath 368acca121 fix: stop app shortcuts from acting behind open dialogs and menus 2026-10-29 17:53:33 +01:00
Linus Rath 4586c69e72 feat: open text size, contrast and motion from anywhere with Alt+Shift+A 2026-10-29 17:53:33 +01:00
Linus Rath 8008393e59 feat: add an Accessibility page to Settings
Settings get a page of their own for accessibility, with presets on top
(screen reader, low vision, dyslexia, focus, keyboard and motor, motion
and seizure safe, deaf and hard of hearing) that change several options
at once and can be undone, then the options by topic, and a reset.

Text size used to be a fixed 14/16/18px on the root, which threw away
the size people set in their browser. It is now a percentage of the
browser's size, from 87.5% to 200%. Motion, contrast and transparency
follow the system by default and can be overridden either way; the
old Animations switch becomes Reduce motion. The visual options are
applied before the first paint, so the page no longer flashes at the
wrong size.

- `lib/accessibility-settings.ts`: the new settings, their allowed
  values, and the code that writes them onto `<html>`
- `app/accessibility.css`: bundled fonts (Atkinson Hyperlegible Next,
  Lexend, OpenDyslexic), text spacing, a focus outline that survives
  Windows contrast themes, more-contrast colours on any theme, reduced
  transparency, a large pointer
- admins can preset every new option but lock only shortcuts, send
  confirmation and the notification duration; a lock on text size or
  another reading aid works as a default
- always-light mail and toolbar labels now sync, and imports drop
  values the page doesn't know
- font size and animations move off Appearance, the plain text font
  off Reading; everyday settings such as conversation view and undo
  send show on both their own page and Accessibility
2026-10-29 17:53:32 +01:00
Linus Rath 5eb6deb26c fix: show password and two-factor settings after a password and TOTP sign-in #1432 2026-10-29 15:50:56 +01:00
Linus Rath 2dbe5d0244 fix: show a shared calendar in the color the server gives it #1414 2026-10-29 14:35:22 +01:00
Linus Rath 828d0acc0b feat: offer this morning and this afternoon as schedule times while they are ahead #1390 2026-10-29 14:34:00 +01:00
Linus Rath 378b0e996c fix: keep the browser's sign-in dialog away from uploads after the access token expired #1396 2026-10-29 14:32:27 +01:00
Linus Rath e1b43c894f fix: stop warning about failed checks on an invitation that passes dmarc #1403 2026-10-29 14:20:44 +01:00
Linus Rath f8f2e93cd9 fix: count a dkim pass the receiver reports by header.i only #1420 2026-10-29 14:18:48 +01:00
Linus Rath 47ee263d76 Merge pull request #1419 from HOLOEYE-JZ/feat/plugin-search-results-pending
# Conflicts:
#	components/email/plugin-search-results.tsx
2026-10-29 14:11:34 +01:00
Linus Rath 8e533f090c Merge pull request #1418 from HOLOEYE-JZ/feat/plugin-search-result-marks 2026-10-29 14:11:11 +01:00
Linus Rath 2c1645ac2d Merge pull request #1427 from creyD/main 2026-10-29 14:10:38 +01:00
Linus Rath 764ee97692 test: bring the main test suite back to green after the vitest 5 upgrade and header rework 2026-10-29 14:07:40 +01:00
Linus Rath 5aa44a5bfe chore: update vitest to 5, jsdom to 30 and typescript to 6 2026-10-29 14:00:54 +01:00
Conrad ed84cd29c9 fix: read address headers in the Addresses form when a rule runs on existing messages #1424 2026-10-29 12:26:04 +01:00
Jacob Zeitz 03876158fe feat(plugins): hold the search results block's place while a plugin still searches
A plugin's results to a search came all at once after its handler answered,
with nothing before: the block then appeared above the message list and
pushed it down, under a pointer about to click a row. onProvideSearchResults
handlers that search elsewhere (a CRM's search by meaning) take seconds.

Each plugin's answer now shows as it comes, and the store keeps the plugins
still asked. One that has not answered after 300 ms gets the block at a fixed
height with placeholder rows under "Searching for more results…"; its
entries then fill that height, so the list moves once, with its own results.
A plugin that answers at once (one not searching for this query) shows
nothing.
2026-10-29 10:25:59 +01:00
Jacob ZeitzandClaude Opus 5.5 fa4db60032 feat(plugins): let a plugin search result's snippet mark what matched
An entry from onProvideSearchResults may wrap what matched in <mark>, as
SearchSnippet/get does, and the block above the message list highlights
it with the list's own SearchSnippetText. The host keeps the marks,
escapes everything else and cuts the snippet by its text, closing a mark
it cuts, so the snippet is still never rendered as HTML.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 10:03:27 +01:00
Linus Rath 63375f6870 Merge pull request #1410 from motofix/fix/1407-vcard-4-export
fix: export contacts as valid vCard 4.0 #1407
2026-10-29 00:13:30 +01:00
Linus Rath e3cd9546fc fix: stop Safari's login dialog in Lite on Stalwart when the access token expired #1396 2026-10-29 00:05:50 +01:00
Linus Rath f12a13e1fd feat: create documents in the formats the document editor can edit from New file #1393 2026-10-29 00:01:13 +01:00
Linus Rath 8b35962efb fix: show section labels in sentence case instead of all caps 2026-10-28 22:26:39 +01:00
Linus Rath 0d3916cfcc feat: add a light event colors setting that shows calendar events tinted with a color bar, as in Outlook 2026-10-28 21:50:47 +01:00
Linus Rath d5bf6b98c4 feat: print the calendar's month, week, day, agenda, tasks and single events 2026-10-28 21:08:20 +01:00
Linus Rath 2b24b4503f fix: load shared accounts' folders in batched, parallel requests #1409 2026-10-28 19:15:51 +01:00
Julien Béti a3fdd72763 fix: export contacts as valid vCard 4.0 #1407
The export declared VERSION:3.0 but wrote vCard 4.0 syntax, and wrote the JSContact phone feature \"mobile\" as TYPE=MOBILE, which is no vCard type, so importers dropped such numbers.

- Declare VERSION:4.0 and write 4.0 throughout: basic-format dates and timestamps, data: URIs for inline media, VALUE=text for a UID or RELATED that is no URI, geo: URIs, lines folded at 75 octets, CRLF after every line, and the webmail's own PRODID.
- Map "mobile" to CELL and back; MAIN-NUMBER and x- types are kept.
- Write N before FN: some importers ignore the name otherwise.
- The contact form stores mobile phones as "mobile" (RFC 9553) and still reads the "cell" it used to write.
2026-10-28 17:27:07 +01:00
Linus Rath 8108249a35 Merge pull request #1406 from HOLOEYE-JZ/feat/plugin-ui-navigate
# Conflicts:
#	app/(main)/[locale]/layout.tsx
2026-10-28 17:02:42 +01:00
Linus Rath 935f48c450 Merge pull request #1399 from lucamzanon/perf/tag-counts-keyword-get 2026-10-28 17:02:23 +01:00
Linus Rath fba04d2251 Merge pull request #1401 from lucamzanon/perf/keepalive-while-push-healthy 2026-10-28 17:02:23 +01:00
Linus Rath 3f71bbedee test: allow JMAP Metadata only in the Bulwark metadata adapter, now that Stalwart v1.0.0 implements it 2026-10-28 15:14:49 +01:00
Linus Rath 96797597c5 Merge branch 'main' into feat/org-features 2026-10-28 15:14:34 +01:00
Jacob Zeitz ba45d0f8b9 feat(plugins): api.ui.openPage moves the tab to one of the plugin's own pages 2026-10-28 13:50:12 +01:00
Linus Rath fdd00ac639 Merge branch 'ux/final-ccs' 2026-10-28 13:24:08 +01:00
Linus Rath 0c5ed0c606 fix: show the lite 404 page in the language of its address, right to left for arabic, hebrew and persian 2026-10-28 13:09:30 +01:00
Linus Rath a2877173a1 fix: drop the admin save bar when a field is put back to its saved value, empty included 2026-10-28 12:52:23 +01:00
Linus Rath 382b26f128 fix: ask before the rail or the mountain view top bar leaves an event or task with unsaved changes 2026-10-28 12:50:59 +01:00
Linus Rath 2bb63f648b fix: keep the phone conversation's reply buttons readable and count its messages with each language's plural forms 2026-10-28 12:46:18 +01:00
Linus Rath 8fb4e51dc5 fix: end mail menu items in an ellipsis only where they open a dialog, drop the key hint and say Report spam on the reader button in every language 2026-10-28 12:42:22 +01:00
Linus Rath 106d16e9f5 fix: keep the mail search placeholder short enough to show in full in every language 2026-10-28 12:37:26 +01:00