Repository navigation
Add pane border color settings - #7239
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds configurable ChangesPane Border Color Feature
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related issues
Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (2 errors, 1 warning)
✅ Passed checks (22 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
fecd557 to
0de4281
Compare
Greptile SummaryThis PR adds
Confidence Score: 5/5Safe to merge; all new paths are well-guarded and localization is complete across all 20 supported locales. The parsing, notification, overlay-controller, and chrome-color pipelines are each independently correct. The geometry-refresh coalescing via Task { @mainactor } avoids races during divider drags. The multi-pane / canvas / sidebar-focus guards in shouldShowActivePaneBorder prevent the border from showing in unintended states, and hasRenderedState ensures a stale border is cleared when layout collapses. The previously-flagged missing translations have been resolved — all 20 locale files now carry matching entries. Tests cover catalog presence, hex normalization, JSON parsing, and the overlay model apply/clear cycle. No files require special attention. Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant JSON as cmux.json
participant Store as KeyboardShortcutSettingsFileStore
participant UD as UserDefaults
participant WCV as WorkspaceContentView
participant CV as ContentView
participant OC as WindowTmuxWorkspacePaneOverlayController
participant WS as Workspace (BonsplitDelegate)
JSON->>Store: parse paneBorderColor / activePaneBorderColor
Store->>UD: write normalized hex (or nil)
Store->>Store: "paneChromeDidChange = true"
Store->>WCV: PaneChromeSettings.didChangeNotification
WCV->>WCV: applyGhosttyChrome (divider color via bonsplitChromeColors)
Store->>CV: "@AppStorage(activePaneBorderColorKey) onChange"
CV->>OC: refreshTmuxWorkspacePaneWindowOverlay
OC->>OC: update(state:) — draw/clear border overlay
WS->>WS: splitTabBar(_:didChangeGeometry:)
WS->>CV: workspacePaneGeometryDidChange notification
CV->>OC: "scheduleGeometryRefresh { stateProvider }"
Note over OC: coalesces per main-actor turn
OC->>CV: stateProvider() on next turn
CV->>OC: update(state:) — realign border to new geometry
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant JSON as cmux.json
participant Store as KeyboardShortcutSettingsFileStore
participant UD as UserDefaults
participant WCV as WorkspaceContentView
participant CV as ContentView
participant OC as WindowTmuxWorkspacePaneOverlayController
participant WS as Workspace (BonsplitDelegate)
JSON->>Store: parse paneBorderColor / activePaneBorderColor
Store->>UD: write normalized hex (or nil)
Store->>Store: "paneChromeDidChange = true"
Store->>WCV: PaneChromeSettings.didChangeNotification
WCV->>WCV: applyGhosttyChrome (divider color via bonsplitChromeColors)
Store->>CV: "@AppStorage(activePaneBorderColorKey) onChange"
CV->>OC: refreshTmuxWorkspacePaneWindowOverlay
OC->>OC: update(state:) — draw/clear border overlay
WS->>WS: splitTabBar(_:didChangeGeometry:)
WS->>CV: workspacePaneGeometryDidChange notification
CV->>OC: "scheduleGeometryRefresh { stateProvider }"
Note over OC: coalesces per main-actor turn
OC->>CV: stateProvider() on next turn
CV->>OC: update(state:) — realign border to new geometry
Reviews (13): Last reviewed commit: "Update Swift file length budget after ma..." | Re-trigger Greptile |
| enum PaneChromeSettings { | ||
| static let paneBorderColorKey = "paneBorderColor" | ||
| static let activePaneBorderColorKey = "activePaneBorderColor" | ||
| static let defaultColorHex = "" | ||
| static let activeBorderLineWidth = 2.0 | ||
| static let didChangeNotification = Notification.Name("cmux.paneChromeSettingsDidChange") | ||
|
|
||
| static func paneBorderColorHex(defaults: UserDefaults = .standard) -> String? { | ||
| normalizedColorHex(defaults.string(forKey: Self.paneBorderColorKey)) | ||
| } | ||
|
|
||
| static func resolvedPaneBorderHex(configuredHex: String?, fallback: String) -> String { | ||
| normalizedColorHex(configuredHex) ?? fallback | ||
| } | ||
|
|
||
| static func notifyDidChange(notificationCenter: NotificationCenter = .default) { | ||
| notificationCenter.post(name: Self.didChangeNotification, object: nil) | ||
| } | ||
|
|
||
| private static func normalizedColorHex(_ rawValue: String?) -> String? { | ||
| guard let rawValue else { return nil } | ||
| return WorkspaceTabColorSettings.normalizedHex(rawValue) | ||
| } | ||
| } |
There was a problem hiding this comment.
New caseless enum used as a static-only namespace
PaneChromeSettings is a caseless enum whose entire API is static let/static func members — the same pattern the ambient-global-state rule flags. The color helper functions (paneBorderColorHex, resolvedPaneBorderHex, notifyDidChange, normalizedColorHex) are thin wrappers that delegate to WorkspaceTabColorSettings.normalizedHex and NotificationCenter; there is no reason they cannot live as methods or extensions on WorkspaceTabColorSettings or be owned by the settings store that already coordinates these keys. Introducing a second static namespace type in the same file duplicates the pattern rather than fixing it.
Rule Used: Flag new ambient global state in production Swift:... (source)
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Sources/DockSplitStore+Appearance.swift (1)
12-14: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick winDock panel borders need the pane-chrome observer
DockPanelViewalready reapplies chrome on.ghosttyConfigDidReload, but not onPaneChromeSettings.didChangeNotification. Add that observer sopaneBorderColorandactivePaneBorderColorchanges incmux.jsonupdate the Dock immediately instead of waiting for the next config reload.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/DockSplitStore`+Appearance.swift around lines 12 - 14, The Dock panel only reapplies appearance on .ghosttyConfigDidReload, so changes to pane border colors from PaneChromeSettings.didChangeNotification are missed until a full reload. Update the Dock panel observer setup in DockPanelView to also listen for PaneChromeSettings.didChangeNotification and call the existing applyGhosttyChrome(from:) path so paneBorderColor and activePaneBorderColor changes in cmux.json update immediately.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@Sources/DockSplitStore`+Appearance.swift:
- Around line 12-14: The Dock panel only reapplies appearance on
.ghosttyConfigDidReload, so changes to pane border colors from
PaneChromeSettings.didChangeNotification are missed until a full reload. Update
the Dock panel observer setup in DockPanelView to also listen for
PaneChromeSettings.didChangeNotification and call the existing
applyGhosttyChrome(from:) path so paneBorderColor and activePaneBorderColor
changes in cmux.json update immediately.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 6929c444-d395-472a-ab73-624d90b18935
⛔ Files ignored due to path filters (1)
.github/swift-file-length-budget.tsvis excluded by!**/*.tsv
📒 Files selected for processing (16)
Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/PaneChromeCatalogSection.swiftPackages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/SettingCatalog.swiftPackages/macOS/CmuxSettings/Tests/CmuxSettingsTests/SettingCatalogTests.swiftSources/CmuxSettingsJSONPathSupport.swiftSources/DockSplitStore+Appearance.swiftSources/KeyboardShortcutSettingsFileStore.swiftSources/Panels/PanelContentView.swiftSources/Workspace.swiftSources/WorkspaceContentView.swiftSources/WorkspaceTabColorSettings.swiftcmuxTests/GhosttyConfigTests.swiftcmuxTests/KeyboardShortcutModifierHoldHintsSettingsFileTests.swiftdocs/configuration.mdweb/data/cmux.schema.jsonweb/messages/en.jsonweb/messages/ja.json
f650270 to
bd2660d
Compare
c7a8b83 to
77baa27
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/PaneChromeCatalogSection.swift`:
- Around line 8-21: The pane border setting keys are duplicated as hardcoded
string literals in PaneChromeCatalogSection and the app-side PaneChromeSettings
constants, with no test guarding that they stay in sync. Add a lightweight
app-target test in cmuxTests that asserts the paneBorderColor and
activePaneBorderColor key constants match the expected literals, using
PaneChromeSettings.paneBorderColorKey and the active variant so any drift is
caught early. Keep the production definitions unchanged and pin the cross-module
contract with assertions instead of sharing the constant directly.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 866eaced-e270-4b16-ab97-f1719b2e5992
⛔ Files ignored due to path filters (1)
.github/swift-file-length-budget.tsvis excluded by!**/*.tsv
📒 Files selected for processing (26)
Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/PaneChromeCatalogSection.swiftPackages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/SettingCatalog.swiftPackages/macOS/CmuxSettings/Tests/CmuxSettingsTests/SettingCatalogTests.swiftPackages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swiftPackages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Scene/SettingsWindowScene.swiftPackages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/ResetSection.swiftSources/CmuxSettingsJSONPathSupport.swiftSources/ContentView.swiftSources/DockPanelView.swiftSources/DockSplitStore+Appearance.swiftSources/HostSettingsActions.swiftSources/KeyboardShortcutSettingsFileStore.swiftSources/PaneChromeSettings.swiftSources/TabManager.swiftSources/TmuxWorkspacePaneOverlayRenderState.swiftSources/TmuxWorkspacePaneOverlayView.swiftSources/Workspace.swiftSources/WorkspaceContentView.swiftcmux.xcodeproj/project.pbxprojcmuxTests/GhosttyConfigTests.swiftcmuxTests/KeyboardShortcutModifierHoldHintsSettingsFileTests.swiftcmuxTests/TmuxWorkspacePaneOverlayModelTests.swiftdocs/configuration.mdweb/data/cmux.schema.jsonweb/messages/en.jsonweb/messages/ja.json
| public struct PaneChromeCatalogSection: SettingCatalogSection { | ||
| /// Optional pane divider color for split workspaces. | ||
| public let paneBorderColorHex = DefaultsKey<String>( | ||
| id: "paneBorderColor", | ||
| defaultValue: "", | ||
| userDefaultsKey: "paneBorderColor" | ||
| ) | ||
|
|
||
| /// Optional focused pane border color for split workspaces. | ||
| public let activePaneBorderColorHex = DefaultsKey<String>( | ||
| id: "activePaneBorderColor", | ||
| defaultValue: "", | ||
| userDefaultsKey: "activePaneBorderColor" | ||
| ) |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win
Cross-module string-literal duplication has no drift guard.
"paneBorderColor"/"activePaneBorderColor" are hardcoded here (both id and userDefaultsKey) because this SwiftPM package can't import the app target's PaneChromeSettings.swift, which independently defines paneBorderColorKey/activePaneBorderColorKey as the same literals. This shows PaneChromeSettings.paneBorderColorHex resolves via PaneChromeSettings.resolvedPaneBorderHex using a configured paneBorderColorHex and a fallback, i.e. the two definitions must stay byte-identical for the feature to work, but nothing currently asserts that. If either side's literal changes independently, the setting will silently stop round-tripping through cmux.json/UserDefaults.
Consider adding a lightweight app-target test (in cmuxTests) asserting PaneChromeSettings.paneBorderColorKey == "paneBorderColor" (and the active variant) to pin both sides to the same contract, since the two modules can't share the constant directly.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/PaneChromeCatalogSection.swift`
around lines 8 - 21, The pane border setting keys are duplicated as hardcoded
string literals in PaneChromeCatalogSection and the app-side PaneChromeSettings
constants, with no test guarding that they stay in sync. Add a lightweight
app-target test in cmuxTests that asserts the paneBorderColor and
activePaneBorderColor key constants match the expected literals, using
PaneChromeSettings.paneBorderColorKey and the active variant so any drift is
caught early. Keep the production definitions unchanged and pin the cross-module
contract with assertions instead of sharing the constant directly.
77baa27 to
47121aa
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Sources/ContentView.swift (1)
1013-1173: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConsider extracting the new overlay-state/refresh helpers out of
ContentView.swift.This adds a self-contained cluster of ~160 lines (
tmuxWorkspacePaneWindowOverlayState,refreshTmuxWorkspacePaneWindowOverlay,shouldScheduleTmuxWorkspacePaneWindowOverlayGeometryRefresh,scheduleTmuxWorkspacePaneWindowOverlayGeometryRefresh) to an already very large file. The repo already extracts related logic into dedicated extension files (e.g.Sources/DockSplitStore+Appearance.swift,Sources/AppDelegate+DockSurfaceMove.swift); moving these methods into aContentView+TmuxOverlay.swiftextension would keep this file's growth in check without behavior change.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Sources/ContentView.swift` around lines 1013 - 1173, The new tmux overlay state/refresh logic is grouped inside ContentView.swift, which is making an already large file harder to maintain. Move tmuxWorkspacePaneWindowOverlayState, refreshTmuxWorkspacePaneWindowOverlay, shouldScheduleTmuxWorkspacePaneWindowOverlayGeometryRefresh, and scheduleTmuxWorkspacePaneWindowOverlayGeometryRefresh into a dedicated ContentView extension file such as ContentView+TmuxOverlay.swift, matching the repo’s existing pattern for extracted behavior, while keeping the same call sites and behavior intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Sources/ContentView.swift`:
- Around line 1013-1020: The active-pane-border gating rule is duplicated
between tmuxWorkspacePaneWindowOverlayState(for:) and
shouldScheduleTmuxWorkspacePaneWindowOverlayGeometryRefresh, so they can drift.
Extract the shared condition into a single private helper like
shouldShowActivePaneBorder(for:) (or compute it once and pass it through), and
use that helper in both places so the overlay render state and geometry-refresh
scheduling always agree.
---
Outside diff comments:
In `@Sources/ContentView.swift`:
- Around line 1013-1173: The new tmux overlay state/refresh logic is grouped
inside ContentView.swift, which is making an already large file harder to
maintain. Move tmuxWorkspacePaneWindowOverlayState,
refreshTmuxWorkspacePaneWindowOverlay,
shouldScheduleTmuxWorkspacePaneWindowOverlayGeometryRefresh, and
scheduleTmuxWorkspacePaneWindowOverlayGeometryRefresh into a dedicated
ContentView extension file such as ContentView+TmuxOverlay.swift, matching the
repo’s existing pattern for extracted behavior, while keeping the same call
sites and behavior intact.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4a972a4e-1a5b-4998-a1c2-62fe0625d301
⛔ Files ignored due to path filters (1)
.github/swift-file-length-budget.tsvis excluded by!**/*.tsv
📒 Files selected for processing (27)
Packages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/PaneChromeCatalogSection.swiftPackages/macOS/CmuxSettings/Sources/CmuxSettings/Keys/SettingCatalog.swiftPackages/macOS/CmuxSettings/Tests/CmuxSettingsTests/SettingCatalogTests.swiftPackages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swiftPackages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Scene/SettingsWindowScene.swiftPackages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/ResetSection.swiftSources/CmuxSettingsJSONPathSupport.swiftSources/ContentView.swiftSources/DockPanelView.swiftSources/DockSplitStore+Appearance.swiftSources/HostSettingsActions.swiftSources/KeyboardShortcutSettingsFileStore.swiftSources/PaneChromeSettings.swiftSources/TabManager.swiftSources/TmuxWorkspacePaneOverlayRenderState.swiftSources/TmuxWorkspacePaneOverlayView.swiftSources/WindowTmuxWorkspacePaneOverlayController.swiftSources/Workspace.swiftSources/WorkspaceContentView.swiftcmux.xcodeproj/project.pbxprojcmuxTests/GhosttyConfigTests.swiftcmuxTests/KeyboardShortcutModifierHoldHintsSettingsFileTests.swiftcmuxTests/TmuxWorkspacePaneOverlayModelTests.swiftdocs/configuration.mdweb/data/cmux.schema.jsonweb/messages/en.jsonweb/messages/ja.json
a1d9f88 to
99933e4
Compare
99933e4 to
1012bfe
Compare
…r-colors # Conflicts: # .github/swift-file-length-budget.tsv
Both-diverged merge: main advanced 21 commits on the original god-file structure while this branch dissolved those gods into packages. Resolved all 19 conflicts keeping the refactored structure and folding main's new features into their refactored homes: - #7239 pane-border colors (PaneChromeSettings.paneBorderColorHex, active pane border rect/hex in TmuxWorkspacePaneOverlayRenderState + overlay) - #7157 file-preview zoom (ShortcutContext.browserOrFilePreviewTextEditor, GlobalFontMagnification observer in FilePreviewTextEditor) - canvas-layout shortcut contexts (ShortcutContext.canvasLayout/ canvasLayoutOutsideFocusedContent + full shortcutContext routing) - #7155 cwd-inheritance rescue (resumedAgentPaneWorkingDirectoryRescue and restoredResumeSessionWorkingDirectories plumbing on Workspace) - #7259 Fork Conversation (delegated to agentForkCoordinator) - #7221/#6612 sidebar lazy-layout probes (value @Environment reads on TabItemView; hot path Equatable/.equatable() preserved) KeyboardShortcutActionContext.swift (renamed to KeyboardShortcutContext in the refactor) and Sources/TmuxWorkspacePaneOverlayRenderState.swift (moved to CmuxCore) resolved as modify/delete: main's edits ported into the refactored homes, app-target copies removed. pbxproj pruned of 6 package-moved files (TmuxOverlayExperiment*, WorkspaceTabColorEntry, WorkspacePlacement+Resolution, ExtensionSidebarWorkspaceRowView, TmuxWorkspacePaneOverlayRenderState) whose refs would dangle. 9 TODO(delta-merge) markers flag cross-package behavioral tweaks (#7155/ #6617 refinements, resume-rebind, one new palette contribution, overlay controller reconciliation) that live outside the conflicted files and are tracked for follow-up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fixes surfaced by compiling the both-diverged merge, all keeping HEAD's refactored package structure while preserving main's delta features: - CLI: drop spurious `import CmuxCommandPalette` (matches origin/main; the SSHPTYAttachReconnect* helpers are same-target). - pbxproj: prune package-moved/dangling app-target refs (PaneMemory engine family → CmuxPanes, TmuxOverlayExperiment*/WorkspaceTabColorEntry/ WorkspacePlacement+Resolution/ExtensionSidebarWorkspaceRowView → packages, GhosttyKeyModifiers/SidebarBonsplitWorkspaceRowDropModifier HEAD-deleted); re-wire Sources/TabManager+BrowserFocus.swift (lost its entry in the pbxproj union). - TabManager: dedup focusedBrowserPanel (keep TabManager.swift's compiled version; TabManager+BrowserFocus keeps the unique markdown/file-preview accessors + zoom helpers). - #7239 pane-border colors: add `paneBorderColorHex` param to the package BonsplitChromeColorResolver.bonsplitChromeColors/resolvedChromeColors + resolvedPaneBorderHex helper; thread the border through the app-target AppTmuxWorkspacePaneOverlayView call sites; SettingsFileParser parses the paneBorderColor/activePaneBorderColor keys. - WindowTmuxWorkspacePaneOverlayController: import CmuxCore, drop duplicate container-identifier decl (ContentView owns the module-level one). - Missing package imports on main-added app files: PaneChromeSettings (CmuxWorkspaces), KeyboardShortcutContext (CmuxAppKitSupportUI), DockSplitStore+SurfaceTransfer (CmuxWorkspaces), Workspace+/GhosttyNSView+ ForkConversationContextMenu (CMUXAgentLaunch). - #7259 Fork Conversation: add `settingsTitle` to package AgentConversationForkDestination; remap legacy AgentConversationForkDefaultSettings.current() → configuredDefault(). - #7157 file-preview zoom: remap FilePreviewInteraction.zoomStep → FilePreviewZoomInteraction.standard.step. - #7155 resume rebind: add SurfaceResumeBindingSnapshot.retargetingWorkingDirectory to the CmuxWorkspaces package (adapted to HEAD's TerminalStartupWorkingDirectoryPrefix). - FileExplorer open-selection shortcut: neutralized (TODO) — needs view-class state + lifecycle wiring re-add; recorded as follow-up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Closes #7234.
Summary
paneBorderColorandactivePaneBorderColorsupport incmux.jsonusing the existing 6-digit hex color normalization path.paneBorderColorto cmux/Bonsplit pane divider chrome and drawsactivePaneBorderColoras a focused-pane border in split workspaces.Notes
unfocusedPaneOpacityis intentionally deferred. The existing opacity model is Ghostty-terminal-specific; applying pane-wide opacity across all cmux panel types would need a broader design to avoid surprising browser/file/tool panels and accessibility regressions.Validation
./scripts/reload.sh --tag issue-7234-pane-border-colorspython3 scripts/swift_file_length_budget.pypython3 scripts/check-package-resolved-policy.pypython3 scripts/check-workspace-package-groups.py --checkpython3 -m json.tool web/data/cmux.schema.jsonpython3 -m json.tool web/messages/en.jsonpython3 -m json.tool web/messages/ja.jsondocs.configuration.schemaDescriptionscontainspaneBorderColorandactivePaneBorderColorinenandja.Need help on this PR? Tag
/codesmithwith what you need. Autofix is disabled.Summary by cubic
Adds configurable pane divider and active‑pane border colors via top‑level
paneBorderColorandactivePaneBorderColorincmux.json. Updates apply live in Workspace and Dock; the active border renders as a window overlay and works even if the tmux overlay experiment is off. Ghostty’s internal splits are unaffected.paneBorderColorandactivePaneBorderColor(6‑digit#RRGGBB;nullclears), parsed at the root with hex normalization; schema and docs updated with localized descriptions.paneBorderColorwith a safe fallback; applied to Bonsplit chrome in Workspace and Dock; views observePaneChromeSettings.didChangeNotificationand Settings “Reset All” triggers a full pane‑chrome refresh.activePaneBorderColor; shown only in multi‑pane splits, hidden when the sidebar has focus; refreshed on setting and layout changes; rendered via a dedicated window overlay controller that stays aligned during focus changes and divider drags viaworkspacePaneGeometryDidChange.null), color resolution, and overlay model behavior.Written for commit 67ee286. Summary will update on new commits.
Summary by CodeRabbit
paneBorderColorand optionalactivePaneBorderColorsettings to customize split-workspace pane divider and focused-pane border colors.