You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Zero-T0-Teardown Sidebar Switching (InboxView): Keep displayPage bound to readyPage on Frame T0 (isTransitioning == true) while hiding the underlying MessageListView via .opacity(0) and presenting ProgressView overlay. Frame T0 no longer unmounts or diffs the previous 100-row NSTableView inside mouseDown.
Defer Uncached Table Swap Until REST Completion (InboxView): When switching to an uncached category, keep readyPage unchanged while the .loading overlay is shown until loadMessages returns, so clicking across uncached categories performs zero intermediate NSTableView teardowns or rebuilds.
Settle-Guarded & Scroll-Driven Incremental Row Mounting (MessageListView): Mount the initial 15-row viewport (< 3ms), expand immediately if the user scrolls near the bottom of mounted rows, and wait a 100ms settle interval before expanding off-screen rows in 20-row slices so rapid sidebar navigation only ever tears down 15 rows (< 2ms).
Deterministic Load Cancellation (GotifySessionController): Immediately reset a cancelled page load's .loading state on MessageStore before starting the next page load, preventing async Alamofire cancellation from racing with rapid A -> B -> A reselection.
Pre-Resolved Localization Bundles (Localized) & Static Icon Fallback (GotifyApplicationIcon): Retain "en" and "zh-Hans"Bundle instances as static constants and skip LazyImage (@StateObject FetchImage) when url == nil.