Skip to content

Branding and ux improvements#71

Open
graeme wants to merge 16 commits into
swift-test-scriptfrom
branding-and-ux-improvements
Open

Branding and ux improvements#71
graeme wants to merge 16 commits into
swift-test-scriptfrom
branding-and-ux-improvements

Conversation

@graeme

@graeme graeme commented Jun 18, 2026

Copy link
Copy Markdown
Collaborator

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

  • Renamed the app and project folder BrewHomebrew, updated the app name and related references (README.md, schemes, pre-commit hook path).
  • Added a new app icon set (icon_16icon_1024) and a Mark imageset (SVG) used in the sidebar.
  • Fixed sidebar images so the new mark renders correctly.

Sidebar & window UX

  • Reworked sidebar layout, background colour, and the divider line.
  • Switched lists to the inset style for a more native macOS feel.
  • Extracted navigation into a SidebarItem enum (Homebrew/Views/SidebarItem.swift) driving titles and selection.
  • Set a sensible minimum window size.

Keyboard navigation & focus

  • Arrow-key navigation within Installed / Upgrades / Discover lists.
  • Keyboard navigation of the sidebar via SidebarCommands (⌘1–⌘5 to jump between sections).
  • ⌘F focuses search via SearchCommands and a searchPresented focused value.
  • Focus moves to the list automatically once content has loaded; added 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

  • xcodebuild build (covers BrewUILint) succeeds.
  • swift test --filter DiscoverViewModelTests passes.
  • Manual: verified app launches as "Homebrew" with the new icon/mark, sidebar styling renders correctly, and keyboard navigation works (arrows in lists, ⌘1–⌘5 sidebar, ⌘F search, focus-on-load).

PR checklist

  • Have you followed this repository's contribution and workflow guidance?
  • Have you explained what changed and why this should land now?
  • Have you run relevant local checks for the changed scope?
  • Are changes scoped and free of unrelated modifications?

  • AI was used to generate or assist with generating this PR.
  • [x ] If yes, describe exactly how AI was used and what manual verification was performed.
    • AI gave guidance on parts of the implementation and drafted this description. Manual verification: built and ran the app locally, confirmed branding and all keyboard-navigation behaviours by hand.

Follow-ups (optional)

None.

graeme and others added 15 commits June 18, 2026 22:58
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>
@graeme graeme requested review from MikeMcQuaid and Copilot June 18, 2026 13:09
@graeme graeme changed the base branch from main to swift-test-script June 18, 2026 13:10

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 to sh.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 BrewHomebrew.
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 update selectedIssueID (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 thread Homebrew/Views/SidebarItem.swift Outdated
Comment on lines +98 to +101
List(selection: Binding(
get: { viewModel.selectedPackageID },
set: { viewModel.setSelection($0) },
)) {

@MikeMcQuaid MikeMcQuaid left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
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.

3 participants