Branding and ux improvements#71
Open
graeme wants to merge 16 commits into
Open
Conversation
Rename the Xcode app target, product, and project from Brew to Homebrew: - Brew.xcodeproj -> Homebrew.xcodeproj, and fix the file-system- synchronized group path (Brew -> Homebrew) so the app target picks up its sources again - Source folder Brew/ -> Homebrew/ - Update schemes, test plans, CI workflows, README, and bootstrap script - PRODUCT_BUNDLE_IDENTIFIER and pkgbuild identifier -> sh.brew.app The package and repository names are unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The BrewUILint step scanned 'Brew/', which no longer exists after the source folder was renamed to 'Homebrew/', so the hook errored on every commit. Point the whole-tree scan at 'Homebrew/'. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR rebrands the macOS app from “Brew” to “Homebrew” (project/app name, iconography, assets, and CI/scripts) and adds keyboard-driven navigation/focus behavior across the main sidebar and feature lists.
Changes:
- Renames the Xcode project/app references to
Homebrew, updates scripts/CI workflows, and changes the bundle/package identifier tosh.brew.app. - Introduces new visual branding assets (AppIcon set + “Mark” SVG) and updates sidebar styling/layout.
- Adds menu commands and focus plumbing intended to enable ⌘F search focus and arrow-key navigation in lists.
Reviewed changes
Copilot reviewed 33 out of 47 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| Tools/BrewUILint/Tests/BrewUILintTests/.swiftlint.yml | Disables length rules for BrewUILint test scaffolding. |
| Tests/BrewFeatureDiscoverTests/DiscoverViewModelTests.swift | Adds coverage for DiscoverViewModel.isListFocused and improves repo stub ergonomics. |
| Tests/.swiftlint.yml | Allows long test files/types by disabling file_length in Tests/. |
| Sources/BrewUIComponents/Theme/BrewSpacing.swift | Sets a new minimum supported window size constants. |
| Sources/BrewUIComponents/Commands/SearchCommands.swift | Adds ⌘F “Find” command via a focused scene binding. |
| Sources/BrewFeatureInstalled/Views/UpgradesPackagesView.swift | Converts to selectable list + search presentation binding + focus behavior. |
| Sources/BrewFeatureInstalled/Views/InstalledPackagesView.swift | Converts to selectable list + search presentation binding + focus behavior. |
| Sources/BrewFeatureDoctor/Views/DoctorView.swift | Adds selectable list behavior and attempts to focus list on load. |
| Sources/BrewFeatureDiscover/Views/DiscoverPackagesView.swift | Adds search presentation binding and attempts to focus list on trending load. |
| Sources/BrewFeatureDiscover/ViewModels/DiscoverViewModel.swift | Adds isListFocused derived state for focus decisions. |
| Sources/BrewCore/Support/LoadState.swift | Adds isLoaded convenience for load-state checks. |
| scripts/pre-commit | Updates BrewUILint scan path from Brew → Homebrew. |
| scripts/bootstrap | Updates bootstrap to resolve packages for Homebrew.xcodeproj and messaging. |
| README.md | Updates setup docs to reference Homebrew.xcodeproj. |
| Homebrew/Views/SidebarItem.swift | Adds SidebarItem model + SidebarCommands (⌘1–⌘5 navigation). |
| Homebrew/Views/MainSidebarView.swift | Reworks sidebar header/rows for new branding and styling. |
| Homebrew/Utilities/UserDefaultsDebug.swift | Adds DEBUG-only UserDefaults clearing utility. |
| Homebrew/Features/MainWindow/Views/MainWindowView.swift | Reorders split view composition and wires focused scene values. |
| Homebrew/Debug/DebugMenuCommands.swift | Adds a DEBUG-only “Debug” menu with “Clear UserDefaults”. |
| Homebrew/BrewApp.swift | Sets minimum window frame size and registers new command sets. |
| Homebrew/Assets.xcassets/Mark.imageset/Mark.svg | Adds new Homebrew “Mark” SVG asset. |
| Homebrew/Assets.xcassets/Mark.imageset/Contents.json | Registers “Mark” imageset in asset catalog. |
| Homebrew/Assets.xcassets/Contents.json | Adds asset catalog root Contents.json for new Homebrew target. |
| Homebrew/Assets.xcassets/AppIcon.appiconset/Contents.json | Adds new Homebrew app icon set mapping. |
| Homebrew/Assets.xcassets/AccentColor.colorset/Contents.json | Adds AccentColor colorset stub for new target. |
| Homebrew.xcodeproj/xcshareddata/xcschemes/Brew.xcscheme | Updates scheme references to Homebrew.app / Homebrew.xcodeproj. |
| Homebrew.xcodeproj/xcshareddata/xcschemes/Brew-Unit.xcscheme | Updates scheme references to Homebrew.app / Homebrew.xcodeproj. |
| Homebrew.xcodeproj/xcshareddata/xcschemes/Brew-UI.xcscheme | Updates scheme references to Homebrew.app / Homebrew.xcodeproj. |
| Homebrew.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved | Adds SwiftPM resolution under the renamed project workspace. |
| Homebrew.xcodeproj/project.xcworkspace/contents.xcworkspacedata | Adds workspace data for the renamed project. |
| Homebrew.xcodeproj/project.pbxproj | Renames target/product, updates bundle identifier, and points root group to Homebrew/. |
| BrewUITests/.swiftlint.yml | Disables file_length for UI tests. |
| BrewTests/.swiftlint.yml | Disables file_length for unit tests. |
| Brew/Assets.xcassets/AppIcon.appiconset/Contents.json | Removes old (Brew) app icon Contents.json mapping. |
| Brew-Unit.xctestplan | Updates test plan container path to Homebrew.xcodeproj. |
| Brew-UI.xctestplan | Updates test plan container path to Homebrew.xcodeproj. |
| .github/workflows/ui_smoke.yml | Updates workflow to build/test Homebrew.xcodeproj. |
| .github/workflows/release.yml | Updates archive project + pkg identifier to sh.brew.app. |
| .github/workflows/pr_build_test.yml | Updates paths and xcodebuild args to Homebrew.xcodeproj. |
| .ai/memory.md | Updates durable project note about new bundle/package identifier. |
Comments suppressed due to low confidence (2)
Sources/BrewFeatureDoctor/Views/DoctorView.swift:99
- The selectable
List(selection:)rows are not tagged with the selection value. Add.tag(item.id)so selection changes updateselectedIssueID(needed for keyboard navigation).
Homebrew/Views/MainSidebarView.swift:94 Text("\(emoji) \(title)")uses the localized-string-key initializer with interpolation, which can produce awkward localization keys and warnings. Since this is not a localization key, use a verbatim text initializer.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
76
to
+80
| .onAppear { | ||
| scrollToSelection(viewModel.activeSelectedPackageID, in: content, with: proxy) | ||
| Task { isFocused = viewModel.state.isLoaded } | ||
| } | ||
| .focused($isFocused) |
Comment on lines
+93
to
+102
| private func sectionContent(for packages: [InstalledBrewPackage]) -> some View { | ||
| ForEach(packages) { package in | ||
| listRow(for: package) | ||
| .id(package.id) | ||
| .contentShape(Rectangle()) | ||
| .listRowBackground( | ||
| viewModel.activeSelectedPackageID == package.id ? Color.brewBrandTint : Color.clear, | ||
| ) | ||
| } | ||
| } |
Comment on lines
108
to
+112
| .onAppear { | ||
| scrollToSelection(viewModel.activeSelectedPackageID, in: content, with: proxy) | ||
| Task { isFocused = viewModel.state.isLoaded } | ||
| } | ||
| .focused($isFocused) |
Comment on lines
+125
to
+134
| private func sectionContent(for packages: [InstalledBrewPackage]) -> some View { | ||
| ForEach(packages) { package in | ||
| listRow(for: package) | ||
| .id(package.id) | ||
| .contentShape(Rectangle()) | ||
| .listRowBackground( | ||
| viewModel.activeSelectedPackageID == package.id ? Color.brewBrandTint : Color.clear, | ||
| ) | ||
| } | ||
| } |
Comment on lines
+105
to
+109
| .onAppear { | ||
| Task { isFocused = viewModel.state.isLoaded } | ||
| } | ||
| .focused($isFocused) | ||
| .listStyle(.inset) |
Comment on lines
115
to
+121
| .onAppear { | ||
| scrollToSelection(viewModel.selectedPackageID, with: proxy) | ||
| Task { | ||
| isFocused = viewModel.trending.isLoaded && !viewModel.isSearching | ||
| } | ||
| } | ||
| .focused($isFocused) |
Comment on lines
+1
to
+5
| // | ||
| // SearchCommands.swift | ||
| // BrewKit | ||
| // | ||
| // |
Comment on lines
+98
to
+101
| List(selection: Binding( | ||
| get: { viewModel.selectedPackageID }, | ||
| set: { viewModel.setSelection($0) }, | ||
| )) { |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
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.
PR: Branding refresh and keyboard-driven navigation
Summary
Rebrands the app from "Brew" to "Homebrew" — new app icon, mark, and sidebar styling — and makes the main window fully keyboard navigable (arrow keys, sidebar shortcuts, ⌘F search focus).
Changes
Branding
Brew→Homebrew, updated the app name and related references (README.md, schemes, pre-commit hook path).icon_16–icon_1024) and aMarkimageset (SVG) used in the sidebar.Sidebar & window UX
SidebarItemenum (Homebrew/Views/SidebarItem.swift) driving titles and selection.Keyboard navigation & focus
SidebarCommands(⌘1–⌘5 to jump between sections).SearchCommandsand asearchPresentedfocused value.LoadState(BrewCore) to model loadable UI state.Why this split
Scoped to branding and UX so reviewers can evaluate the visual/interaction changes independently. The CI/test-tooling groundwork the branch builds on is intentionally not part of this description.
Testing
xcodebuildbuild (covers BrewUILint) succeeds.swift test --filter DiscoverViewModelTestspasses.PR checklist
Follow-ups (optional)
None.