Skip to content

v0.3.4 - #429

Merged
hkdb merged 29 commits into
mainfrom
v0.3.4-dev
Sep 18, 2026
Merged

v0.3.4#429
hkdb merged 29 commits into
mainfrom
v0.3.4-dev

Conversation

@hkdb

@hkdb hkdb commented Sep 18, 2026

Copy link
Copy Markdown
Owner
  • Added default CC
  • Added default BCC - #341
  • Added default reply-to - #404
  • Added merge identical messages in thread - #222
  • Relabeled spellcheck dictionary English to English (US)
  • Added spellcheck dictionary: English (UK) - #417
  • Added spellcheck dictionary: Dutch
  • Added dot and glow dot optional accents for unread messages
  • Added window size persistence - #217
  • Added mini calendar for easier navigation - #368
  • Added Empty Spam button for spam folder - #239
  • New app icon with full hicolor size set + scalable SVG - #395 (Special thanks to @gianlucamazza) - #99
  • Fixed post delete ghost messages on message list
  • Fixed thread sender and preview in message list - #169
  • Fixed comma display name - #398
  • Fixed composer draft format detection - #420
  • Block save all attachments if flatpak - #384
  • Calendar color render adjustments to alleviate #406
  • Fixed Microsoft calendar attachments handling - #370
  • Fixed Contacts pagination - #278
  • Fixed M365 contacts - sync all folders - #278
  • Fixed M365 calendar - kill the silent-zero paths - #278
  • Fixed draft edit logic - #392

hkdb and others added 29 commits August 6, 2026 07:04
Composer.svelte binds a svelte:window keydown handler that closed the
composer on bare Escape with no check for what was on screen. Two
user-visible symptoms:

  - Escape on the save-draft prompt did nothing. bits-ui closed the
    dialog, then this handler immediately re-opened it.
  - A guarded modal over the composer (settings, folder picker) was
    dismissed together with the composer underneath it, popping the
    save-draft prompt.

Fix is to bail when a modal layer already consumed the key:

    if (e.defaultPrevented) return
    if (isDialogGuardActive()) return
    handleClose()

bits-ui's escape layer listens on `document` and calls preventDefault()
without stopping propagation, so the event still reaches this
window-level handler — but defaultPrevented persists across listeners
in the same dispatch. That covers every bits-ui layer (dialog,
alertdialog, dropdown, context menu) whether or not it registers the
dialog guard, including layers that deliberately ignore Escape: bits-ui
preventDefaults those too, and the composer shouldn't close under a
modal that is refusing to.

Note a DOM check for [role=dialog] does not work here, which is what I
tried first. A microtask checkpoint runs between listener callbacks, so
Svelte has already flushed the dialog out of the DOM by the time this
handler runs and the query finds nothing.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
- Fixed Contacts pagination
- Fixed M365 contacts - sync all folders
- Fixed M365 calendar - kill the silent-zero paths
@hkdb
hkdb merged commit f3fa7f7 into main Sep 18, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants