chore(release): v0.11.0 - #21
Merged
Merged
Conversation
A modal backdrop could be left in `display: flex` while fully transparent, covering the whole window at z-index 2000. It swallowed every click and scroll while staying invisible, and because the close path had already detached its listeners, the user had no way to dismiss it — the app was unusable until restart. Reported on 0.10.0: no clicks on Open Folder, no file selection in the sidebar, no scrolling, while the native menu bar still worked. The backdrops were shown and hidden through deferred callbacks. WebKit suspends both animation frames and timers while a window is occluded, so neither the reveal nor the hide is guaranteed to run — leaving the layer displayed but never marked `visible`. Make interactivity follow opacity in CSS: an overlay without `.visible` is now click-through and hidden from the tab order and the accessibility tree. That is the load-bearing guarantee — it holds whatever the reason the layer got stuck, including a keyboard user reaching a destructive button inside an invisible dialog. Defence in depth on top of it: - reveal synchronously (forced reflow, then class) instead of from a frame callback, so a dialog opened on an occluded window is still visible and therefore dismissable; - track an open generation so a pending hide never acts on a backdrop a newer open has claimed, in both confirm-dialog and Preferences; - focus the trap immediately, since callers now reveal before trapping. Tests cover the two suspension modes that produce the field state: frames never delivered, and timers never delivered. Claude-Session: https://claude.ai/code/session_01NcJuB2iR4WEfuQVLpYqWi4
PR #22 landed without a changelog entry. Covers the new windows, the native Window menu, the arrangement commands, and the switch from broadcast to frontmost-window menu delivery. Claude-Session: https://claude.ai/code/session_01NcJuB2iR4WEfuQVLpYqWi4
The heading still carried the date the release branch was prepared. Claude-Session: https://claude.ai/code/session_01NcJuB2iR4WEfuQVLpYqWi4
nprudhomme
force-pushed
the
chore/release-0.11.0
branch
from
August 13, 2026 12:04
a604046 to
611f0f6
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Release branch for v0.11.0. Carries the version bump, the changelog, and a fix for a bug reported on 0.10.0 that made the app unusable.
The multi-window work (#22) is already on
mainand ships in this release — its changelog entries are added here, since that PR landed without them.Fixed — window becoming completely unresponsive
Reported on 0.10.0: no clicks on Open Folder, no file selection in the sidebar, no scrolling, while the native menu bar kept working.
A modal backdrop (
#confirm-backdrop,#prefs-backdrop) could be left indisplay: flexwhile fully transparent, covering the window atz-index: 2000. It swallowed every pointer event while staying invisible, and since the close path had already detached its listeners, there was no way to dismiss it — the app was unusable until restart.Both backdrops were shown and hidden through deferred callbacks. WebKit suspends animation frames and timers while a window is occluded, so neither the reveal nor the hide is guaranteed to run, leaving the layer displayed but never marked
visible.The fix makes interactivity follow opacity in CSS: an overlay without
.visibleis click-through and removed from the tab order and the accessibility tree. That is the load-bearing guarantee — it holds whatever the reason the layer got stuck, including a keyboard user reaching a destructive button inside a dialog they cannot see.Defence in depth on top of it:
Applied to all three full-screen overlays: modal backdrops, image lightbox and mermaid fullscreen.
Verification
npx tsc --noEmit, 314 tests (3 new, covering the two suspension modes that produce the observed state: frames never delivered, and timers never delivered),cargo build --releasecleanFollow-up
#23 tracks a related robustness issue found during the investigation: Tauri's CSP nonce can silently drop inline
style=attributes in packaged builds, which would leave those same backdrops displayed from launch. Not reproducible on macOS 26.6.1, and the CSS safety net above already neutralises the consequence.Type of Change
Checklist
https://claude.ai/code/session_01NcJuB2iR4WEfuQVLpYqWi4