Skip to content

feat: auto-match sidebar background to Ghostty terminal theme#2254

Closed
christi4nity wants to merge 2 commits intomanaflow-ai:mainfrom
christi4nity:feat/sidebar-theme-match
Closed

feat: auto-match sidebar background to Ghostty terminal theme#2254
christi4nity wants to merge 2 commits intomanaflow-ai:mainfrom
christi4nity:feat/sidebar-theme-match

Conversation

@christi4nity
Copy link
Copy Markdown

@christi4nity christi4nity commented Mar 27, 2026

Summary

  • Adds a Sidebar Theme setting ("Match Ghostty" / "Custom") under Sidebar Appearance in Settings
  • When set to "Match Ghostty" (default for new installs), the sidebar reads GhosttyBackgroundTheme.currentColor() directly and renders a solid color via a CALayer-backed NSView — bypassing the glass material that distorts theme colors
  • Tracks live theme changes via .ghosttyDefaultBackgroundDidChange and .ghosttyConfigDidReload notifications
  • Existing users with customized sidebar appearance are auto-detected as "Custom" mode via SidebarThemeSettings.inferredMode() so their settings are preserved on upgrade
  • Localized in English and Japanese

Test plan

  • Fresh install: sidebar matches terminal Ghostty theme out of the box
  • Change Ghostty theme at runtime — sidebar updates to match
  • Explicit sidebar-background in Ghostty config still works
  • Switching to "Custom" in Settings restores user tint/material controls
  • Existing users with customized sidebar aren't affected (inferred as Custom)
  • Unit tests pass (xcodebuild -scheme cmux-unit)

🤖 Generated with Claude Code


Summary by cubic

Adds a “Sidebar Theme” setting that lets the sidebar auto-match the Ghostty terminal background for accurate colors and live updates. New installs default to “Match Ghostty”; existing customized sidebars stay unchanged.

  • New Features
    • Sidebar Theme setting: “Match Ghostty” (default for new installs) or “Custom”.
    • When matching, renders a CALayer-backed solid color that mirrors Ghostty’s background and updates on theme/config changes.
    • Modes are mutually exclusive: no tint overlay in Match Ghostty; explicit sidebar-background applies only in Match Ghostty, while Custom ignores it and restores tint/material controls.
    • Existing customized setups are inferred as Custom to preserve settings; localized in English and Japanese.

Written for commit 00b7834. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added a sidebar theme setting in Settings to choose between following the app's current background or using a custom tint.
  • Bug Fixes

    • Sidebar now reliably shows a solid tint when window materials are disabled and refreshes promptly when external theme/config changes.
  • Tests

    • Expanded test coverage for sidebar theme behaviors and persistence.

Add a "Sidebar Theme" setting (Match Ghostty / Custom) that controls
whether the sidebar follows the terminal's Ghostty background or uses
custom tint settings.

When set to "Match Ghostty" (the default for new installs), SidebarBackdrop
reads GhosttyBackgroundTheme.currentColor() directly and renders a solid
color via a CALayer-backed NSView, bypassing the glass material that
distorts theme colors. Live theme changes are tracked through
.ghosttyDefaultBackgroundDidChange and .ghosttyConfigDidReload
notifications.

Existing users who have customized their sidebar appearance are
automatically inferred as "Custom" mode via SidebarThemeSettings so
their settings are preserved on upgrade.
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 27, 2026

@christi4nity is attempting to deploy a commit to the Manaflow Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 27, 2026

📝 Walkthrough

Walkthrough

Adds a sidebar theme selection that persists a mode (match Ghostty or custom), derives sidebar colors from GhosttyConfig or user tint, renders solid-color backgrounds when needed, and adds localization, settings UI, app init, and tests for the new behavior. Notification hooks invalidate cached Ghostty data.

Changes

Cohort / File(s) Summary
Localization Strings
Resources/Localizable.xcstrings
Added four new localization keys for sidebar theme settings and subtitle: settings.sidebarAppearance.theme, .theme.custom, .theme.matchGhostty, .theme.subtitle.
Theme Logic & Sidebar Rendering
Sources/ContentView.swift
Added SidebarThemeOption and SidebarThemeSettings; SidebarBackdrop now persists sidebarTheme, loads GhosttyConfig, computes tint/background paths, renders SidebarSolidColorBackground for solid-tint cases, keeps material rendering for material-enabled cases, and listens to Ghostty notifications to invalidate cache.
App Init & Settings UI
Sources/cmuxApp.swift
Initialize/persist sidebar theme on startup, expose @AppStorage sidebarTheme in debug/settings views, add Settings picker for Sidebar Theme, include theme in debug config payload and reset-all logic.
Tests
cmuxTests/GhosttyConfigTests.swift
Expanded test to assert multiple sidebar-related UserDefaults keys remain unchanged when no config; added SidebarThemeSettingsTests for inferred mode and ensure-stored-mode persistence behavior.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant SettingsView as Settings View
    participant AppStorage as `@AppStorage`
    participant SidebarBackdrop
    participant GhosttyConfig
    participant Renderer as Sidebar Renderer

    User->>SettingsView: Select sidebar theme
    SettingsView->>AppStorage: Write sidebarTheme
    AppStorage->>SidebarBackdrop: State update

    SidebarBackdrop->>SidebarBackdrop: Resolve selectedSidebarTheme
    alt matchGhostty
        SidebarBackdrop->>GhosttyConfig: Load config (cached)
        GhosttyConfig-->>SidebarBackdrop: backgroundColor, opacity
        SidebarBackdrop->>SidebarBackdrop: Compute tint/background
    else custom
        SidebarBackdrop->>SidebarBackdrop: Use user tint & opacity
    end

    SidebarBackdrop->>Renderer: Render (SidebarSolidColorBackground or material)
    Renderer-->>User: Display updated sidebar

    Note over SidebarBackdrop,GhosttyConfig: Ghostty notifications -> invalidate cache -> SidebarBackdrop refresh
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐰 I hopped into code with glee,
Picked themes of Ghostty or custom dye,
Tints that follow or colors free,
Sidebar sings beneath the sky,
Hope this patch makes pixels fly ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main feature: adding auto-match capability for sidebar background to match Ghostty terminal theme.
Description check ✅ Passed The description covers Summary and Testing sections well, with detailed explanations and a comprehensive test plan. Demo video link is missing but not critical.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

No issues found across 4 files

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 27, 2026

Greptile Summary

This PR adds a Sidebar Theme setting that lets the sidebar automatically match the Ghostty terminal's current background colour, bypassing the glass material layer that distorts theme colours. New installs default to "Match Ghostty" mode; existing users with customised sidebar appearance are auto-detected as "Custom" so their settings are preserved.\n\n- P1 – tint overlay defeats the colour match: In "Match Ghostty" mode the code unconditionally layers customTintColor (defaults to #000000 at 18% opacity) on top of baseColor. Every fresh install sees a sidebar 18% darker than the terminal. The overlay should be skipped unless selectedSidebarTheme == .custom.\n- refreshGeneration is mutated in .onReceive handlers but never read in body; adding let _ = refreshGeneration in body makes the re-render dependency explicit.\n- The SidebarSolidColorBackground docstring references a "display link callback" that was never implemented — the actual mechanism is DispatchQueue.main.async in viewDidMoveToWindow.\n- SidebarThemeSettingsTests is well-structured with isolated UserDefaults suites and covers key migration paths.

Confidence Score: 4/5

The P1 tint overlay bug prevents Match Ghostty from producing an exact colour match for all default users and should be fixed before merging.

One P1 logic bug: Match Ghostty mode unconditionally overlays the 18% black custom tint over GhosttyBackgroundTheme.currentColor(), defeating the feature's stated goal. All other changes are clean and additive. Score becomes 5 once the tint overlay is gated to Custom mode only.

Sources/ContentView.swift — the if let baseColor rendering branch inside SidebarBackdrop.body

Important Files Changed

Filename Overview
Sources/ContentView.swift Core rendering changes: adds SidebarThemeSettings, SidebarSolidColorBackground, and rewires SidebarBackdrop; contains a P1 bug where the default 18%-opacity black tint is still applied in Match Ghostty mode.
Sources/cmuxApp.swift Calls ensureStoredMode on launch and adds sidebarTheme to settings picker and debug payload — additive and correct.
Resources/Localizable.xcstrings Adds EN/JA localisations for four new sidebar theme strings; accurate and consistent with existing key naming.
cmuxTests/GhosttyConfigTests.swift Extends sidebar config tests and adds four SidebarThemeSettingsTests with isolated UserDefaults suites covering inferred mode and migration paths.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[SidebarBackdrop.body] --> B{selectedSidebarTheme}
    B -->|matchGhostty| C{hasExplicitSidebarBackground?}
    B -->|custom| D[baseColor = nil, materialOption = user pref]
    C -->|yes| D
    C -->|no| E[baseColor = GhosttyBackgroundTheme.currentColor]
    E --> F{if let baseColor}
    F -->|yes| G[Render SidebarSolidColorBackground baseColor]
    G --> H{tintColor.alpha > 0.0001?}
    H -->|yes — P1: always true at default 0.18| I[Overlay tintColor on baseColor]
    H -->|no| J[Done]
    I --> J
    D --> K{materialOption?.material?}
    K -->|some| L{useWindowLevelGlass?}
    L -->|no| M[SidebarVisualEffectBackground + tint]
    L -->|yes| N[Fully transparent]
    K -->|nil| O[SidebarSolidColorBackground tintColor]
Loading

Reviews (1): Last reviewed commit: "feat: auto-match sidebar background to G..." | Re-trigger Greptile

Comment on lines +13793 to +13797
if let baseColor {
SidebarSolidColorBackground(color: baseColor)
if tintColor.alphaComponent > 0.0001 {
SidebarSolidColorBackground(color: tintColor)
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 "Match Ghostty" mode still applies the user's tint on top of the background

In the if let baseColor branch (active when selectedSidebarTheme == .matchGhostty and there is no explicit sidebar-background key), tintColor falls through to customTintColor, which defaults to #000000 at 18% opacity (SidebarTintDefaults.opacity = 0.18). This overlay is unconditionally rendered whenever tintColor.alphaComponent > 0.0001 — which is always true for any fresh install.

The result is that the sidebar is always 18% darker than the actual Ghostty terminal background, so "Match Ghostty" does not produce a pixel-accurate match for new users.

The tint overlay should be gated on selectedSidebarTheme == .custom:

if let baseColor {
    SidebarSolidColorBackground(color: baseColor)
    if selectedSidebarTheme == .custom, tintColor.alphaComponent > 0.0001 {
        SidebarSolidColorBackground(color: tintColor)
    }
} else if let material = materialOption?.material {

@AppStorage("sidebarCornerRadius") private var sidebarCornerRadius = 0.0
@AppStorage("sidebarBlurOpacity") private var sidebarBlurOpacity = 1.0
@Environment(\.colorScheme) private var colorScheme
@State private var refreshGeneration = 0
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 refreshGeneration is never read in body

refreshGeneration is incremented in both .onReceive handlers to force a re-render when the Ghostty background changes, but it is never accessed inside the body computed property. Today this still triggers a re-render because any @State mutation invalidates a SwiftUI view regardless of body access, but the intent is entirely implicit.

Add let _ = refreshGeneration at the top of body to make the re-render dependency explicit and linter-clean.

Comment on lines +13836 to +13838
/// Renders a solid color using the same compositing path as the terminal's
/// CAMetalLayer (bgra8Unorm / sRGB blending). Uses a display link callback
/// to re-apply layer.backgroundColor after makeViewHierarchyTransparent
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 Docstring mentions a display link that does not exist

The doc comment says "Uses a display link callback to re-apply layer.backgroundColor…" but the implementation uses DispatchQueue.main.async inside viewDidMoveToWindow, not a display link.

Suggested change
/// Renders a solid color using the same compositing path as the terminal's
/// CAMetalLayer (bgra8Unorm / sRGB blending). Uses a display link callback
/// to re-apply layer.backgroundColor after makeViewHierarchyTransparent
/// Renders a solid color using the same compositing path as the terminal's
/// CAMetalLayer (bgra8Unorm / sRGB blending). Uses `viewDidMoveToWindow` with a
/// deferred main-queue dispatch to re-apply `layer.backgroundColor` after
/// `makeViewHierarchyTransparent` clears it on transparent windows.
private struct SidebarSolidColorBackground: NSViewRepresentable {

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
Sources/cmuxApp.swift (2)

5629-5698: ⚠️ Potential issue | 🟠 Major

Reset All Settings still leaves stale custom sidebar appearance behind.

Line 5694 resets the mode and tint keys, but sidebarMaterial, sidebarBlendMode, sidebarState, sidebarBlurOpacity, sidebarCornerRadius, and sidebarPreset survive. If the user later switches back to Custom, the old appearance comes back instead of a clean reset.

🧹 Possible fix
         sidebarTheme = SidebarThemeSettings.defaultMode.rawValue
         sidebarTintHex = SidebarTintDefaults.hex
         sidebarTintHexLight = nil
         sidebarTintHexDark = nil
         sidebarTintOpacity = SidebarTintDefaults.opacity
+        defaults.removeObject(forKey: "sidebarPreset")
+        defaults.removeObject(forKey: "sidebarMaterial")
+        defaults.removeObject(forKey: "sidebarBlendMode")
+        defaults.removeObject(forKey: "sidebarState")
+        defaults.removeObject(forKey: "sidebarBlurOpacity")
+        defaults.removeObject(forKey: "sidebarCornerRadius")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/cmuxApp.swift` around lines 5629 - 5698, The resetAllSettings()
routine doesn't clear several custom sidebar appearance properties so old custom
values reappear; update resetAllSettings() to explicitly reset sidebarMaterial,
sidebarBlendMode, sidebarState, sidebarBlurOpacity, sidebarCornerRadius, and
sidebarPreset to their respective defaults (or remove their UserDefaults keys)
alongside the existing sidebarTheme/sidebarTint resets so a switch back to
"Custom" starts from a clean state; locate these symbols in cmuxApp.swift and
set them to SidebarAppearanceSettings.default... (or call the appropriate
SidebarAppearanceSettings.reset/remove methods) within resetAllSettings().

4920-5008: ⚠️ Potential issue | 🟡 Minor

Disable the custom sidebar controls when the theme is not Custom.

With Match Ghostty selected, the Light/Dark Tint, Tint Opacity, and Reset rows still look editable even though the sidebar ignores them. That makes the setting read as broken, and the same no-op UX now exists in SidebarDebugView on fresh installs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/cmuxApp.swift` around lines 4920 - 5008, The Light/Dark tint
controls, Tint Opacity slider and Reset button should be disabled when the
sidebar theme is not Custom; wrap or mark the ColorPicker HStacks, the Slider
HStack, and the Reset Button with .disabled(sidebarTheme !=
SidebarThemeOption.custom.rawValue) (or compare to SidebarThemeOption.custom if
sidebarTheme is the enum) so the UI reflects they are inert; update the blocks
containing settingsSidebarTintLightBinding, settingsSidebarTintDarkBinding,
sidebarTintOpacity, and the Reset button that sets
sidebarTintHexLight/sidebarTintHexDark to nil to use that same .disabled(...)
condition (also consider graying via .opacity if desired) and mirror this
behavior in SidebarDebugView if it renders the same controls.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Sources/ContentView.swift`:
- Around line 13752-13787: The sidebar tint/background selection is not
enforcing mutual exclusivity between selectedSidebarTheme (.matchGhostty vs
.custom): update the logic around resolvedCustomHex/customTintColor,
explicitSidebarBackground/hasExplicitSidebarBackground, tintColor, baseColor and
materialOption so that when selectedSidebarTheme == .matchGhostty you always use
GhosttyBackgroundTheme/current explicitSidebarBackground (ignore customTintColor
and saved sidebarTintOpacity/sidebarMaterial), and when selectedSidebarTheme ==
.custom you always use customTintColor and saved sidebarMaterial (ignore
ghosttyConfig.sidebarBackground); concretely, change the guard in the tintColor
closure to also check selectedSidebarTheme != .matchGhostty, ensure
hasExplicitSidebarBackground is computed to be false when selectedSidebarTheme
== .custom, and make baseColor/materialOption branches respect
selectedSidebarTheme so the two modes cannot fall back to the other.
- Around line 13829-13832: The .onReceive subscriber for
NotificationCenter.default.publisher(for: .ghosttyConfigDidReload) should
explicitly receive on the main runloop to ensure safe `@State` mutation; update
the chain that currently calls GhosttyConfig.invalidateLoadCache() and
refreshGeneration &+= 1 so that the publisher is scheduled with .receive(on:
RunLoop.main) (before the .onReceive) or otherwise ensure the handler runs on
the main thread when processing .ghosttyConfigDidReload notifications.

---

Outside diff comments:
In `@Sources/cmuxApp.swift`:
- Around line 5629-5698: The resetAllSettings() routine doesn't clear several
custom sidebar appearance properties so old custom values reappear; update
resetAllSettings() to explicitly reset sidebarMaterial, sidebarBlendMode,
sidebarState, sidebarBlurOpacity, sidebarCornerRadius, and sidebarPreset to
their respective defaults (or remove their UserDefaults keys) alongside the
existing sidebarTheme/sidebarTint resets so a switch back to "Custom" starts
from a clean state; locate these symbols in cmuxApp.swift and set them to
SidebarAppearanceSettings.default... (or call the appropriate
SidebarAppearanceSettings.reset/remove methods) within resetAllSettings().
- Around line 4920-5008: The Light/Dark tint controls, Tint Opacity slider and
Reset button should be disabled when the sidebar theme is not Custom; wrap or
mark the ColorPicker HStacks, the Slider HStack, and the Reset Button with
.disabled(sidebarTheme != SidebarThemeOption.custom.rawValue) (or compare to
SidebarThemeOption.custom if sidebarTheme is the enum) so the UI reflects they
are inert; update the blocks containing settingsSidebarTintLightBinding,
settingsSidebarTintDarkBinding, sidebarTintOpacity, and the Reset button that
sets sidebarTintHexLight/sidebarTintHexDark to nil to use that same
.disabled(...) condition (also consider graying via .opacity if desired) and
mirror this behavior in SidebarDebugView if it renders the same controls.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3cf81274-fc4a-4863-928f-04bd12ac4478

📥 Commits

Reviewing files that changed from the base of the PR and between 1f4fc47 and e5ba979.

📒 Files selected for processing (4)
  • Resources/Localizable.xcstrings
  • Sources/ContentView.swift
  • Sources/cmuxApp.swift
  • cmuxTests/GhosttyConfigTests.swift

- Make Match Ghostty / Custom modes mutually exclusive: tint overlay
  no longer applies in Match Ghostty mode, and explicit sidebar-background
  config is ignored in Custom mode
- Add explicit refreshGeneration read in body for linter clarity
- Add .receive(on: RunLoop.main) to ghosttyConfigDidReload subscriber
- Fix stale docstring referencing display link
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
Sources/ContentView.swift (1)

13773-13789: ⚠️ Potential issue | 🟠 Major

Keep matchGhostty independent from saved custom material/tint state.

When explicitSidebarBackground is present, this path still falls back to sidebarTintOpacity and sidebarMaterial. That means switching back from Custom to Match Ghostty can keep old glass/tint behavior alive and distort the Ghostty-provided sidebar-background instead of rendering the Ghostty-controlled solid color.

Suggested fix
-        let hasExplicitSidebarBackground = ghosttyConfig.rawSidebarBackground != nil && explicitSidebarBackground != nil
-        let tintColor: NSColor = {
-            guard usesGhosttyTheme else { return customTintColor }
-            guard let explicitSidebarBackground else { return .clear }
-            let resolvedOpacity = ghosttyConfig.sidebarTintOpacity ?? sidebarTintOpacity
-            return explicitSidebarBackground.withAlphaComponent(resolvedOpacity)
-        }()
-        let baseColor: NSColor? =
-            hasExplicitSidebarBackground || selectedSidebarTheme == .custom
-            ? nil
-            : GhosttyBackgroundTheme.currentColor()
-        let materialOption: SidebarMaterialOption? = {
-            if hasExplicitSidebarBackground || selectedSidebarTheme == .custom {
-                return SidebarMaterialOption(rawValue: sidebarMaterial)
-            }
-            return SidebarMaterialOption.none
-        }()
+        let tintColor: NSColor = usesGhosttyTheme ? .clear : customTintColor
+        let baseColor: NSColor? = {
+            guard usesGhosttyTheme else { return nil }
+            if let explicitSidebarBackground {
+                let opacity = ghosttyConfig.sidebarTintOpacity ?? explicitSidebarBackground.alphaComponent
+                return explicitSidebarBackground.withAlphaComponent(opacity)
+            }
+            return GhosttyBackgroundTheme.currentColor()
+        }()
+        let materialOption: SidebarMaterialOption? =
+            usesGhosttyTheme ? .none : SidebarMaterialOption(rawValue: sidebarMaterial)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Sources/ContentView.swift` around lines 13773 - 13789, When usesGhosttyTheme
is true, don't fall back to saved custom state—change the tint and material
logic so ghosttyConfig controls opacity and material exclusively: in the
tintColor closure (usesGhosttyTheme branch) stop using sidebarTintOpacity as a
fallback and use ghosttyConfig.sidebarTintOpacity (or a sensible default like
1.0) instead of sidebarTintOpacity, and in the materialOption closure ensure
that when usesGhosttyTheme is true you return .none (ignore sidebarMaterial) so
saved SidebarMaterialOption(rawValue: sidebarMaterial) is not applied; update
references to usesGhosttyTheme, ghosttyConfig.sidebarTintOpacity,
explicitSidebarBackground, sidebarTintOpacity, sidebarMaterial, and
SidebarMaterialOption to implement this.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@Sources/ContentView.swift`:
- Around line 13773-13789: When usesGhosttyTheme is true, don't fall back to
saved custom state—change the tint and material logic so ghosttyConfig controls
opacity and material exclusively: in the tintColor closure (usesGhosttyTheme
branch) stop using sidebarTintOpacity as a fallback and use
ghosttyConfig.sidebarTintOpacity (or a sensible default like 1.0) instead of
sidebarTintOpacity, and in the materialOption closure ensure that when
usesGhosttyTheme is true you return .none (ignore sidebarMaterial) so saved
SidebarMaterialOption(rawValue: sidebarMaterial) is not applied; update
references to usesGhosttyTheme, ghosttyConfig.sidebarTintOpacity,
explicitSidebarBackground, sidebarTintOpacity, sidebarMaterial, and
SidebarMaterialOption to implement this.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 37ef38e3-3d1a-469b-8487-0af0de3f1236

📥 Commits

Reviewing files that changed from the base of the PR and between e5ba979 and 00b7834.

📒 Files selected for processing (1)
  • Sources/ContentView.swift

@christi4nity
Copy link
Copy Markdown
Author

Superseded by #2293 — the team shipped their own implementation. Nice to see the same feature land! 🎉

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