Commit Graph
1578 Commits
Author SHA1 Message Date
Linus Rath a591ae0683 refactor: merge language, default apps and the tour into a general page 2026-10-19 17:51:26 +02:00
Linus Rath 58f968a48c refactor: lead notifications with new mail, move the tab badge in and invitation parsing to calendar 2026-10-19 17:48:57 +02:00
Linus Rath d86aa1d12b refactor: group security into sign-in, other apps and devices, and encryption 2026-10-19 17:46:42 +02:00
Linus Rath b1fa88841d refactor: move identities, sub-addressing and multi-account options onto the account page 2026-10-19 17:44:11 +02:00
Linus Rath 5b1d056eef feat: split the message list out of reading and fold content and senders into it 2026-10-19 17:40:52 +02:00
Linus Rath 1025c1973d refactor: fold the layout and themes tabs into appearance as sections 2026-10-19 17:33:39 +02:00
Linus Rath 988416aa3d feat: add an advanced switch that hides power-user settings until turned on 2026-10-19 17:20:38 +02:00
Stefan Hildebrandt 04efcfc1f3 fix: save a group identity's drafts in the group account's Drafts (#1090)
Drafts were always created in the primary account, so a message composed as
a group identity sat in the member's own Drafts while its Sent copy (since the
previous commit) went to the group.

- createDraft takes { accountId, previousDraftAccountId }: the draft goes to
  the account that owns the From identity (resolveSendAccountId, now public
  and briefly caching the identity lists for autosave), and the replaced
  version is destroyed in the account it lives in.
- The composer tracks draftAccountId next to draftId (save, re-resolve of
  attachment blobs, send, discard, stashed state), since draft ids are only
  unique within one account.
- sendEmail destroys the sent draft in options.draftAccountId; discarding
  (inline and Pro tab) deletes it there, through the identity's login.
- Re-opening a draft from a group/shared Drafts folder (or a stamped
  aggregate row) keeps its account.
- resolveSendAccountId is optional on IJMAPClient; without it drafts stay in
  the primary account.
- Tests: client unit tests for draft placement / replacement / send cleanup,
  E2E spec 18 draft cases (autosave + send, discard).
2026-10-19 16:33:27 +02:00
VasilisNtovolos 7fefc128a1 fix: keep file previews open during Strict Mode replay 2026-10-19 16:08:56 +03:00
VasilisNtovolos a73ac09035 fix: route conversation blobs by originating message 2026-10-19 15:43:38 +03:00
Linus Rath 391ed6c018 Merge branch 'fix/security-audit-2026-10' 2026-10-19 12:58:50 +02:00
Tobias Genannt decaa07a5a fix(calendar): align month view day columns with the header
The day header in the calendar month view was rendered outside the vertical scroll container, causing each header column to divide the full container width (100%) while the day grid cells below divided the remaining width excluding the vertical scrollbar. On platforms with classic scrollbars, this caused an escalating misalignment between the header columns and the day cells.

Move the day header inside the scroll container as a sticky row (sticky top-0 z-50 bg-background), matching the pattern established in the week and day views, and account for the header height in row minimum height, scrollToFocus, and sampleVisibleMonth.
2026-10-19 12:42:20 +02:00
Linus Rath 62c6a3666a fix: keep the quote containment styles in the editor and out of the sent mail 2026-10-19 01:44:29 +02:00
Linus Rath 29b33eb46c fix: show attachment names without directional override characters 2026-10-19 01:32:30 +02:00
Linus Rath 0b01a2d066 fix: ask before handing a sign-in to the mobile app and only to its own callback link 2026-10-19 01:22:19 +02:00
Linus Rath ff98865f90 fix: keep a quoted original from painting over the composer with a fixed-position overlay 2026-10-19 01:15:39 +02:00
Linus Rath 0f1fc2bb5d fix: sanitise imported and synced HTML templates before the composer previews them 2026-10-19 01:15:39 +02:00
Linus Rath bf64f4d48a fix: leave oversized winmail.dat and embedded message parts as attachments instead of decoding them on open 2026-10-19 01:15:05 +02:00
Linus Rath c02aadd6a9 fix: preview HTML attachments as sanitised text in a locked frame instead of a same-origin blob document 2026-10-19 00:58:31 +02:00
Linus Rath 29cb6b7f61 fix: keep a crafted style attribute or read-receipt header from freezing the message view 2026-10-19 00:54:24 +02:00
Linus Rath aeb2aeda66 fix: stop a click on a mention chip from opening the mailto handler in Firefox 2026-10-19 00:47:05 +02:00
Linus Rath 38c983a886 fix: open the mention card on click and show on hover that the chip is clickable 2026-10-19 00:38:01 +02:00
Linus Rath 4c0017d0c1 feat: rework the demo around one persona with two accounts and a shared mailbox
The demo user becomes Nora Lindqvist, engineering lead at Meridian Labs,
in the week of a product launch. The fixtures tell one story across mail,
contacts, calendar, tasks and files, and exercise the features the
screenshots and the public demo should show:

- a second, mail-only login (her personal domain) and the shared Support
  mailbox delegated to the work account, so the account switcher, the
  shared section and the merged inbox have real content
- raw headers the way Stalwart writes them: the sender check fails on
  the phishing mail, newsletters carry a one-click unsubscribe, one mail
  asks for a read receipt, and spam scores show in the details
- an iMIP invitation with a served .ics, an event waiting for the answer
  on the calendar, and RSVP patches applied in the demo client
- @mentions as mailto links in a received mail, a verification code
  twelve minutes old, nested folders, named tags on the mail, contact
  groups, a scheduled message and tasks switched on
- every attachment and file backed by real bytes under public/demo,
  generated by `scripts/demo-assets/generate.mjs`; contact photos are
  bundled portraits instead of requests to randomuser.me
- folder counts computed from the mail instead of hand-kept numbers

Demo login seeds the tags, templates and merged-inbox settings once per
device and switches the cross-account gate on for the session; "Reset"
restores them. `bulwark-demo-simulate=off` in localStorage stops the
simulated incoming mail for screenshot runs.
2026-10-18 19:48:11 +02:00
Linus Rath eb18a13878 feat: show the contact card for @mentions in the composer and in received mail 2026-10-18 18:23:45 +02:00
Linus Rath bfe98b49a0 fix: act on the clicked row when another account has a message with the same id (GHSA-8x23-qw3w-mhrx) 2026-10-18 17:54:48 +02:00
Linus Rath fbae8acfb8 feat: turn @mentions into chips with a hover card 2026-10-18 17:52:11 +02:00
Linus Rath 0ac7bcb385 feat: show the message list as columns with one-line conversation rows #262 2026-10-18 17:37:21 +02:00
Linus Rath 8791fa5176 feat: offer contacts in @ mentions and add the picked one as a recipient 2026-10-18 16:36:28 +02:00
Linus Rath ea1d1e2870 fix: stop re-rendering every row when a search starts 2026-10-18 16:01:43 +02:00
Linus Rath 4fa22200e7 fix: keep vacation forwarding and plugin vetoes when a tag rename rewrites the filters #854 2026-10-18 15:03:20 +02:00
Linus Rath 45840e722a Merge pull request #854 from dev-hive-kazniisa/fix/keyword-rename-sieve-sync
fix: renaming a tag leaves filter rules tagging under the old id
2026-10-18 15:02:15 +02:00
Linus Rath eb100c6aac fix: draw the Estonian flag without a shared clip path id 2026-10-18 14:39:59 +02:00
Linus Rath 1e992e6c7f fix: check plugin dropdown messages before the host draws them 2026-10-18 14:39:59 +02:00
Linus Rath be06956398 test: cover the From pick when replying to another connected account 2026-10-18 14:39:59 +02:00
Linus Rath 811e175cd0 fix: tell today's mail by the time zone setting in the sender line #1259 2026-10-18 14:39:58 +02:00
Linus Rath 2f7873e756 test: update the inline image reply test for the current composer mocks 2026-10-18 14:39:07 +02:00
Linus Rath 402188a4d5 Merge pull request #1125 from guisea/fix/inline-attachments-reply-forward
fix(email-composer): normalize bracketed content-ids for inline reply/forward images
2026-10-18 14:38:13 +02:00
Linus Rath 1ff7db0827 Merge pull request #1254 from raudraido/feat/add-estonian-locale
feat: add Estonian (et) locale
2026-10-18 14:34:37 +02:00
Linus Rath 100da43991 Merge pull request #1247 from lucamzanon/feat/account-archive-passwords
feat: optionally keep mailbox passwords in the account list backup
2026-10-18 14:34:31 +02:00
Linus Rath 5aba2a92c5 Merge pull request #1251 from tobiasge/feat/plugin-ui-kit-combobox
feat(plugins): add Combobox component to UI kit with host floating dropdown portal
2026-10-18 14:34:26 +02:00
Linus Rath 7dd8e93949 Merge pull request #1270 from vixh/fix/multi-account-self-reply
fix: reply to a message from another connected account goes to that account
2026-10-18 14:34:22 +02:00
Linus Rath 58eff0e879 Merge pull request #1258 from HOLOEYE-JZ/feat/archive-feature-gate
feat: admin policy gate to turn off archiving #1257
2026-10-18 14:29:27 +02:00
Linus Rath 5411a9ef50 Merge pull request #1272 from Peterka35/fix/mark-as-read-delay-thread-expand
fix: mark shared conversations read on the owner account, and follow markAsReadDelay when expanding a conversation
2026-10-18 14:21:50 +02:00
Linus RathandFrench-Asgeir 7163a5dcc1 fix: translate contact field types and more French strings
Co-authored-by: French-Asgeir <109287366+French-Asgeir@users.noreply.github.com>
2026-10-18 14:19:07 +02:00
Linus Rath 8e7245b26c feat: let the theme policy set and lock the color mode #1280 2026-10-18 13:46:49 +02:00
Linus Rath 89001ededa fix: open the reader's Move, Tag and Rules flyouts on the side with room #1261 2026-10-18 13:46:48 +02:00
Peterka35 bbc3c2123e fix: follow markAsReadDelay when expanding a conversation or opening a Pro folder row
Expanding a conversation in the message list (row click, expand chevron,
or the `x` shortcut) and clicking a row in a Pro folder tab marked the
messages read straight away. They ignored "Mark as read: Never" and any
delay, which the reading pane and the conversation view follow.

Route them through one helper, scheduleAutoMarkAsRead: -1 never marks,
0 marks at once, any other value marks after that many milliseconds and
returns a cancel function.

- New store action autoMarkExpandedThreadAsRead keeps one pending timer
  per thread key. Collapsing the thread, or collapsing all threads, drops
  it. Both expansion paths (EmailList and the `x` handler in MailApp) use
  it.
- MailApp's handleEmailSelect drops the pending mark of every expanded
  thread other than the one the newly opened message belongs to, through
  cancelAutoMarkThreadAsRead. Moving on with `j`/`k` or a click no longer
  lets the delayed mark land on a conversation the user has left. The
  thread stays expanded.
- ProFolderTabBody schedules the row mark through the helper and drops a
  pending one when another row is opened or the tab unmounts.
2026-10-17 21:01:34 +02:00
Viktor Shulika MacBook Air M5andClaude Opus 5.5 76dbaf532a fix: reply to a message from another connected account goes to that account
With several accounts connected, the composer treated every account's
identities as "own" when deciding whether a message was self-sent (#703).
A message that account B sent to account A therefore looked self-sent
when replying from A, so the reply was addressed to the original To -
account A itself - and From was switched to B.

Self-sent now means "sent by the account holding the original":
buildReplyRecipients takes an optional selfSentEmails list (defaulting to
ownEmails, so single-account behaviour is unchanged), and the composer
passes the source account's identities there and to the From selection.
Reply-all still drops every connected account's addresses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 20:31:25 +02:00
Linus Rath 107d731af7 feat: remove a message from just the open folder when it is in several #615 2026-10-17 19:18:25 +02:00
Linus Rath 1ad1e31781 feat: set message priority in the composer #970 2026-10-17 19:18:23 +02:00