Repository navigation
Design: dedicated Tray settings page and status menu grouping (#288, #290) - #296
Merged
Merged
Conversation
…290) Settings › Tray puts Enable Tray first, with a footer that says what closing the last window does in each state, then Showing and Hiding (menu-bar icon, drag reveal, the fixed ⌥⌘T, the Keep Open note) and Appearance (border colour with swatches). Rows under the switch are disabled and dimmed while Tray is off; their values are kept. The switch now goes through TrayController.setEnabled instead of a second @AppStorage binding. No idle timer. The status-item menu stays a plain NSMenu, regrouped as an app menu: Open Tray, Open Stow, Create Archive… | Settings… | Quit Stow. Adds zh-Hans for every new string and updates DESIGN.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Nov 6, 2026
skyswordw
commented
Nov 6, 2026
skyswordw
left a comment
Member
Author
There was a problem hiding this comment.
Functional integration review completed with no blocking findings. The Enable binding uses the authoritative Tray controller, subordinate settings preserve their values while disabled, reset/migration coverage passes, and native menu grouping keeps the existing routing and related-interaction scope. Claude Code owns the presentation/motion; this review covers behavior and integration.
Validated in the combined #295–#300 tree: 687 tests passed with zero failures/skips; 0/1,261 missing zh-Hans translations; generated plists unchanged. The original physical status-menu acceptance is still not established by model tests, so #290 remains open.
skyswordw
changed the base branch from
codex/tray-functional-followups
to
main
November 6, 2026 00:45
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.
Integrated validation
Merged into
mainin sequence #295–#300. Final main commit7c5393672d028f31bc76f83911a02e1407a53cf7has the same file tree as tested integration commit8fb4dda. Full local validation passed 687 tests in 102 suites with zero failures/skips, 0/1,261 missing zh-Hans strings, unchanged generated plists and clean diff checks. Bounded native CUA/AX draft creation and Search Clear/Close checks passed, including independent ZIP byte verification; this is not VoiceOver testing. See the review comment for scope and remaining native checks. Final main CI and the integrated #300 snapshot run supersede cancelled intermediate reruns.Claude Code's visual design for #288 (dedicated Tray settings page) and the grouping/copy review for #290 (status-item menu). Functional foundation: #295.
Ownership per AGENTS.md: this PR is presentation only (layout, hierarchy, copy, zh-Hans). Functional state, routing, lifecycle, tests and acceptance stay with Codex / Grok Bot in #295. This PR claims no functional or native-runtime acceptance.
#288 — Settings › Tray
The page follows the #162 grouped-form conventions and the Actions page's "master switch first" pattern:
Both say opening at login is set in Finder & Permissions (still a separate setting).
No idle timer or slider, per the user's decision in #286.
While Tray is off, sections 2–3 are disabled and their text goes tertiary. A grouped form greys a disabled switch but leaves its title at full strength, so without this the dependent rows didn't look inactive. Values are kept for when Tray is turned back on.
zh-Hans, Tray on with icon and drag reveal both off (shows the extra footer line):
Captured with
scripts/snapshot.sh settings <look> "" -StowSettingsPane tray -tray.enabled '<true|false/>' -tray.pinned '<false/>'(argument domain only; no real preferences changed). The Settings window isn't key in snapshot runs, so the switches show the inactive-window tint.#290 — status-item menu
Kept as a plain native
NSMenu; only the grouping changed, to match an app menu (what it opens, then Settings, then Quit on its own):I couldn't capture the open menu: this environment has no Screen Recording permission, and the snapshot harness can't pop up a status-item menu.
Functional contracts and behaviour changes
app.tray.setEnabled(_:)instead of a separate@AppStorage("tray.enabled")binding, and readsapp.tray.isEnabled. Same key, same effect (setEnabledwritesSettingsKeys.trayEnabled, thenapplySettings()), but the view no longer holds a second copy of the state. Reset This Page / Reset All still update it through the existingUserDefaultsobserver.SettingsKeys, the.traydeep link, migration, the menu actions and their validation are unchanged. Menu tracking still runs insidebeginRelatedInteraction/endRelatedInteraction.Tray borderand the old "When enabled, Tray stays available…" footer) were removed from the catalog.Resources/Localizable.xcstringsis shared with the sibling design PRs, so expect a trivial merge there.Checks
xcodebuild … build: passesxcodebuild … test: 685 tests in 102 suites passed. The first run hit the known "test runner hung before establishing connection" problem with derived data under ~/Downloads; I reran with-derivedDataPath ~/Library/Developer/Xcode/DerivedData/…scripts/check-localizations.sh zh-Hans: 0 of 1239 strings missingDESIGN.md: the Settings table now lists Tray under Interaction (it's no longer in General), the page count is now thirteen, a Tray-page bullet describes the hierarchy and the status menu, and the #282 note points to Settings › Tray.
🤖 Generated with Claude Code