Skip to content

Polish Settings window chrome and category responsiveness - #285

Closed
Yankj wants to merge 7 commits into
erha19:mainfrom
Yankj:fix/settings-window-ux
Closed

Polish Settings window chrome and category responsiveness#285
Yankj wants to merge 7 commits into
erha19:mainfrom
Yankj:fix/settings-window-ux

Conversation

@Yankj

@Yankj Yankj commented Aug 26, 2026

Copy link
Copy Markdown

Why

During repeated use of Settings, I noticed several issues that made this high-frequency macOS surface feel slower and less native than the rest of the app:

  • Dragging the window did not respond immediately.
  • The custom/borderless chrome made the traffic lights, fullscreen behavior, window edge, and scrolling hierarchy diverge from standard macOS windows.
  • The sidebar used a visually heavy custom background, colored icon tiles, and two-line rows; the native window controls also felt detached from the navigation surface.
  • Switching between Display, Statistics, Sound, and other categories could appear unresponsive for 1–2 seconds because detail construction and synchronous refresh/scanning work competed with the selection frame.
  • Repeated category switches could redo the same work even when the underlying data had not changed.

These issues were especially noticeable because Settings is where users repeatedly compare options and expect immediate navigation feedback.

What changed

Native window chrome and sidebar

  • Restored a standard titled, closable, minimizable, resizable, fullscreen-capable AppKit window.
  • Kept the native close/minimize/zoom controls permanently in a unified titlebar instead of recreating or scrolling them with SwiftUI content.
  • Uses the system dark window appearance and semantic windowBackgroundColor, with a .sidebar material that follows active/inactive window state.
  • Keeps both the sidebar and detail content below the titlebar while allowing the sidebar material to visually continue behind the traffic lights.
  • Removed the window sidebar's fixed tint, gradient glow, border, and shadow.
  • Reworked navigation into compact, single-line source-list rows using outline SF Symbols, system accent selection, hover/pressed feedback, tooltips, and selected accessibility traits.
  • Kept the popover presentation's existing glass styling unchanged.

Responsive category switching

  • Decoupled immediate sidebar selection from detail presentation so the selected row paints before a large detail hierarchy is built.
  • Defers the detail swap by one display frame and disables layout animation for the swap.
  • Moves display usage loading and sound-pack discovery off the immediate click path.
  • Caches recent category refreshes and reuses the analytics view model so repeated switching does not restart unchanged work.
  • Cancels obsolete refresh/presentation tasks when users switch quickly or close Settings.

Regression coverage

  • Added AppKit window tests for native style masks, standard traffic lights, unified toolbar configuration, fullscreen behavior, semantic appearance, and stable content sizing.
  • Added Settings view-model tests for refresh caching.
  • Added UI regression coverage for repeated category switching and immediate selected-state feedback.
  • Updated the Labs icon expectation for the new outline symbol.

Validation

  • Local stable Prototype slice: 129 tests passed (IslandBridgeE2ETests and SocketServerTests are excluded, matching CI).
  • macOS 15 GitHub Actions: Prototype suite passed.
  • macOS 15 GitHub Actions: full PingIslandTests suite passed.
  • Universal Release package built for arm64 and x86_64.
  • Ad-hoc code signature, DMG/ZIP SHA-256 checksums, and manual Settings window visual smoke test verified.

@Yankj

Yankj commented Aug 26, 2026

Copy link
Copy Markdown
Author
50205058-d77c-42c3-b58f-fcbebc60efca

@Yankj

Yankj commented Aug 27, 2026

Copy link
Copy Markdown
Author

@Yankj Yankj closed this Aug 27, 2026
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.

1 participant