Build experience themes and overhaul Settings window UX - #286
Open
Yankj wants to merge 25 commits into
Open
Conversation
Owner
|
@Yankj 提供一些视觉效果截图?不然无法判断 |
Author
|
@erha19 补充了哈。 |
Owner
|
@Yankj 非常感谢你的提交,当前还存在部分冲突麻烦解决一下,同时针对你的提交,合并后我会进行一轮视觉优化后再进行版本发布 ~ |
Author
|
@erha19 感谢提醒,冲突已经解决并推送。 这次将 PR 分支同步到了最新
验证结果:
也感谢后续继续帮忙做视觉优化~ |
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.
Why
Using the Settings window in daily work exposed two connected problems.
First, the window did not behave like a current macOS Settings window:
Second, the original theme work was still closer to a collection of local visual/audio presets than a reusable experience architecture. Confirmation actions and new feedback moments could drift between views, PingIsland native and macOS styling were easy to conflate, and Pixel did not yet have a complete visual + interaction + sound reference implementation.
Visual review of the first Pixel reference renders also caught a compositing issue: the pixel grid was attached as a root overlay, so it rendered above labels, icons, cards, previews, and controls. Game Boy Olive compounded that issue by using closely related olive tones for both surfaces and foreground content, flattening the hierarchy and making the whole screen look green-tinted.
These concerns share the Settings presentation boundary, so this PR now integrates the complete history of #285 and supersedes its standalone scope. Keeping them together lets the native window shell be fixed once while each experience theme owns only the content it should actually customize.
What changed
1. Native Settings window and responsive navigation
isMovableByWindowBackground.@StateObjectmodel instead of rebuilding it on every switch.2. Shared native shell, theme-specific Settings content
The window shell is common to every theme: titlebar, traffic lights, dragging, resizing, full screen, shadows, and safe content placement stay in AppKit.
Inside that shell:
The icon model deliberately keeps PingIsland's original filled symbols separate from the macOS outline symbols so one theme can no longer silently overwrite another.
Pixel texture is now composed inside each surface background rather than above the Settings hierarchy. Cards and controls therefore remain visually above the grid. The same correction is applied to the notch and detached Island surfaces so the layering contract is consistent across presentations.
Game Boy Olive keeps its deep handheld-green surfaces and classic yellow-green accent, while primary and secondary foregrounds use accessibility-adjusted light tones. This preserves the palette identity while restoring readable contrast and clear surface/content hierarchy.
3. Experience theme architecture
IslandExperienceThemecontract covering Visual, Interaction, Motion, lifecycle Sound, and auxiliary Sound tokens.ExperienceThemeRegistryand inject the active definition through the SwiftUI environment.standardas the persisted compatibility identifier and make PingIsland native the fresh-install/invalid-value fallback.4. Semantic feedback and clearer confirmation actions
AppSoundFeedbackEvent; feature code names what happened instead of selecting a filename.5. Documentation and extension boundary
主题与提示音).See
docs/experience-themes.mdfor the contributor guide.Visual verification
These screenshots were rendered from the final Settings implementation in an AppKit-hosted Xcode test window and exported from the passing
.xcresult. The two Pixel renders were refreshed after moving the grid below content; Game Boy Olive also includes the contrast-adjusted foreground palette.Verification
git diff --checkis clean.swiftc -parsepassed for all changed app sources.plutil -lintand contain matching keys.PingIslandTests, Release app build, ad-hoc signing, DMG, and ZIP all passed. Packaging explicitly buildsarm64 x86_64with macOS 14.0 as the deployment target..xcresultexport, and screenshot upload all passed.Test package
Download the Universal unsigned DMG + ZIP artifact from the successful GitHub run:
The artifact is ad-hoc signed and intended for local testing. On first launch, macOS may require right-click → Open. It contains both Intel (
x86_64) and Apple Silicon (arm64) slices.