Skip to content

Match pane indicator strokes and the file path header to shared chrome metrics - #14982

Merged
teamleaderleo merged 5 commits into
mainfrom
consistent-chrome-metrics
Sep 27, 2026
Merged

teamleaderleo merged 5 commits into
mainfrom
consistent-chrome-metrics

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Sep 27, 2026 •

Copy link
Copy Markdown
Collaborator

Pane indicators drew at three widths: the active pane border at 2pt, the notification ring and focus flash at 2.5pt, and the Canvas focus border at 2pt. The attention ring overlays the active border along the same inset path, so its extra half point showed as a slightly fatter edge whenever both were visible. All four now use one 2pt stroke, PaneIndicatorMetrics.strokeWidth in CmuxFoundation, so the app and the Canvas package read the same value. PaneChromeSettings.activeBorderLineWidth is gone; the active border reads PanelOverlayRingMetrics.lineWidth like the rings do.

The file and Markdown preview path header was 30pt tall with a 16pt file icon and 13pt button glyphs, next to 28pt tab and sidebar bars. It now uses the same metrics as the right sidebar file explorer path header: RightSidebarChromeMetrics.secondaryBarHeight (28pt, grows with font magnification), a 14pt file icon, and 10pt glyphs in 20pt header buttons. The Revert, Save, Refresh, Share, typography and copy buttons all go through PanelHeaderIconGlyph, so they change together.

Verification: scripts/verify-local.py (Swift syntax, package groups, feature flags) passed. Nothing was built locally; CI compiles and runs the suites.

Left alone:

  • The focus pulse animation (FocusFlashPattern), owned by Calmer focus feedback: one short pulse, no flash while typing #14894. This PR only changes PanelOverlayRingMetrics.lineWidth, above that type.
  • Canvas pane title bar is 30pt with a 9pt corner radius (CanvasPaneTitleBarView.height, CanvasPaneView.cornerRadius). The Canvas card layout is its own design and lives in a package that can't see the app's chrome metrics.
  • The unfocused Canvas border stays 1pt; it's a separator, not an indicator.
  • Drop-target and pane-swap highlights (2pt, 8pt radius) are a different indicator family.
  • FileExternalOpenMenuStyle.header.buttonSize (18x18) is never read; the header style renders through PanelHeaderIconGlyph.

Changelog

Changed: The pane notification ring and focus flash draw at the same 2pt width as the active pane border, and the file and Markdown preview path header matches the 28pt bars around it with smaller icons

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


Summary by cubic

Unifies pane indicator strokes and the file path header with the app's shared chrome metrics.

The active pane border, notification ring, focus flash, and Canvas focus border now all draw at 2pt via CGFloat.paneIndicatorStrokeWidth in CmuxFoundation. The attention ring was 2.5pt and looked fatter where it overlapped the 2pt active border. PaneChromeSettings.activeBorderLineWidth is gone; the active border reads PanelOverlayRingMetrics.lineWidth.

The file and Markdown preview path header now uses the right sidebar path header metrics: a 28pt bar that grows with font magnification, a 14pt file icon, and 10pt glyphs in 20pt header buttons, replacing the previous 30pt bar, 16pt icon, and 13pt glyphs.

Left unchanged

  • Focus pulse animation (FocusFlashPattern) is owned by Calmer focus feedback: one short pulse, no flash while typing #14894.
  • The Canvas pane title bar keeps its 30pt height; it's a separate package design.
  • The unfocused Canvas border stays 1pt since it's a separator.
  • Drop-target and pane-swap highlights are a different indicator family.
  • FileExternalOpenMenuStyle.header.buttonSize is never read.

scripts/verify-local.py passed; CI compiles and runs the test suites.

Written for commit 2d6fefb. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • UI Improvements
    • Focused pane borders now use a consistent 2-point stroke, and panel overlay borders match.
    • File path headers and their icons use sizing and spacing consistent with the sidebar.

teamleaderleo and others added 2 commits September 27, 2026 07:46
…ome metrics

The active pane border, notification ring, focus flash and Canvas focus
border now share one 2pt stroke (PaneIndicatorMetrics.strokeWidth in
CmuxFoundation). The attention ring was 2.5pt and sat a quarter point
outside the 2pt active border it overlays.

The file and Markdown preview path header now uses the right sidebar path
header metrics: 28pt bar (grows with font magnification), 14pt file icon,
and 10pt glyphs in 20pt header buttons, instead of 30pt, 16pt and 13pt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: manaflow-ai/cmux/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: 92b7106c-fc9b-4032-bb7d-f53b921107cb

📥 Commits

Reviewing files that changed from the base of the PR and between ef8b037 and 2d6fefb.

📒 Files selected for processing (6)
  • Packages/macOS/CmuxCanvasUI/Sources/CmuxCanvasUI/CanvasPaneView.swift
  • Packages/macOS/CmuxFoundation/Sources/CmuxFoundation/CGFloat+PaneIndicator.swift
  • Sources/PaneChromeSettings.swift
  • Sources/Panels/Panel.swift
  • Sources/Panels/PanelContentView.swift
  • Sources/TmuxWorkspacePaneOverlayView.swift
💤 Files with no reviewable changes (1)
  • Sources/PaneChromeSettings.swift

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

Pane indicator borders and overlay rings now use a shared stroke-width value. Panel file path headers and icon glyphs now use shared chrome sizing metrics.

Changes

UI sizing updates

Layer / File(s) Summary
Shared pane indicator stroke width
Packages/macOS/CmuxFoundation/Sources/CmuxFoundation/CGFloat+PaneIndicator.swift, Packages/macOS/CmuxCanvasUI/Sources/CmuxCanvasUI/CanvasPaneView.swift, Sources/Panels/Panel.swift, Sources/TmuxWorkspacePaneOverlayView.swift, Sources/PaneChromeSettings.swift
A public stroke-width value of 2 replaces fixed widths in the focused pane border and overlay ring. The active border setting is removed, and the active pane border uses the overlay ring width.
Panel header sizing
Sources/Panels/PanelContentView.swift
The file path header uses shared metrics for icon frames, horizontal padding, and bar height. The header icon glyph uses shared icon and control sizes.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Merge Risk: ⚪ Minimal · up to 2d6fe

The pane indicators retain the intended stroke widths, and the panel headers match shared chrome sizing. No material user-facing regression was found; CI compilation remains the final validation.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 2d6fe

The shared sizing change does not appear to add an attacker-controlled entrypoint or alter access to files, services, or credentials. The remaining risk is limited by incomplete security-review coverage and the lack of a local build.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The independently reachable effect shown by the inspected callers is visual pane and header presentation; the new constant supplies no runtime input channel or authority.
🚥 Pre-merge checks | ✅ 24 | ❌ 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%. Docstring coverage is scoped to functions touched by this diff. Analyzed 3 functions across 5 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Cloud Persistent Session And Early Input ✅ Passed PASS: The authoritative diff changes only pane indicator stroke constants and file/path header metrics. It adds CGFloat.paneIndicatorStrokeWidth, updates PanelOverlayRingMetrics, Canvas border ren…
Cmux Swift Actor Isolation ✅ Passed The diff adds only an immutable CGFloat value constant and uses it from existing pane-indicator drawing code. CmuxFoundation has no MainActor default-isolation setting. The other changed declarati…
Cmux Swift Blocking Runtime ✅ Passed PASS: The PR changes stroke-width constants, imports, and view layout metrics only. The added Swift lines contain no semaphores, blocking waits, sleeps, delayed dispatch, polling, main-queue synchroni…
Cmux Browser Automation Off-Main ✅ Passed PASS — The pull request changes only pane and header chrome metrics in six files. It does not modify Sources/TerminalController.swift, ControlCommandExecutionPolicy.swift, browser socket commands,…
Cmux Expensive Synchronous Load ✅ Passed PASS: The reviewed diff changes only pane stroke constants, imports, and panel header layout metrics. No added or moved RestorableAgentSessionIndex.load(), agent store/hook access, transcript or JSO…
Cmux Cache Substitution Correctness ✅ Passed PASS: The PR changes only pane-indicator stroke constants and transient SwiftUI/AppKit chrome geometry. The diff adds CGFloat.paneIndicatorStrokeWidth, replaces hard-coded drawing widths, and uses `…
Cmux No Hacky Sleeps ✅ Passed PASS. The authoritative PR diff contains only six Swift files and no TypeScript, JavaScript, shell, or build/runtime script changes. The changed Swift lines only replace shared stroke and chrome metri…
Cmux Algorithmic Complexity ✅ Passed PASS — The PR changes only Swift UI metrics and shared constants across six files. The diff adds no scalable-collection loops, nested scans, per-target rescans, sorting/filtering in hot paths, in-memo…
Cmux Swift Concurrency ✅ Passed The PR changes only synchronous UI metrics and a public CGFloat constant. The patch adds no DispatchQueue, DispatchGroup, Task, completion-handler, or new Combine usage. Existing async/await and Obser…
Cmux Swift @Concurrent ✅ Passed The PR does not introduce or change any async function, nonisolated declaration, @concurrent annotation, Task call, or heavy async helper call site. The changes only replace stroke and view metr…
Cmux Swift Package Boundaries ✅ Passed The diff does not introduce or materially expand app-target domain logic. The new reusable stroke value is isolated in the existing CmuxFoundation SwiftPM target as `CGFloat.paneIndicatorStrokeWidth…
Cmux Swiftpm Lockfiles ✅ Passed PASS. The PR changes source files only. The authoritative diff has no Package.swift, Package.resolved, .gitignore, workflow, or Xcode project changes. CmuxCanvasUI already depended on the local CmuxFo…
Cmux Swift Logging ✅ Passed PASS: The PR changes only pane-border and header metrics across six Swift files. The authoritative diff adds no print, debugPrint, dump, NSLog, file/stdout logging, Logger, or sensitive-data…
Cmux User-Facing Error Privacy ✅ Passed PASS. The authoritative diff changes pane stroke widths and visual header metrics only. It adds no user-facing error, alert, command output, API error body, or recovery text, and introduces no vendor …
Cmux Full Internationalization ✅ Passed PASS. The authoritative diff changes only imports, stroke-width constants, and layout metrics. It does not add or materially change user-facing text, localization keys, string catalogs, web messages, …
Cmux Swiftui State Layout ✅ Passed PASS. The PR changes only stroke-width constants and SwiftUI layout metrics. The added lines introduce no ObservableObject, @Published, @StateObject, @EnvironmentObject, GeometryReader, lazy/list row …
Cmux Architecture Rethink ✅ Passed PASS. The PR makes a small metrics correction with a clear source of truth. It adds immutable CGFloat.paneIndicatorStrokeWidth in CmuxFoundation, routes PanelOverlayRingMetrics.lineWidth and the…
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PASS: The PR changes pane indicator metrics and panel header layout only. The authoritative diff adds no NSWindow, NSPanel, NSWindowController, SwiftUI Window, WindowGroup, window identifier, or close…
Cmux Source Artifacts ✅ Passed All six changed paths are intentional Swift source files under Sources/ or package Sources/ directories. The diff adds or updates pane metrics and UI code, and removes one source setting. No logs,…
Cmux No Test Or Debug Seam In Production Source ✅ Passed PASS. The pull request adds no test or debug seam in production source. The only new public member is CGFloat.paneIndicatorStrokeWidth, a production metric used by CanvasPaneView and `PanelOverlay…
Title check ✅ Passed The title clearly summarizes the two main changes: shared pane indicator strokes and alignment of the file path header with shared chrome metrics.
Description check ✅ Passed The description clearly explains the problem, resulting behavior, implementation scope, unchanged areas, verification status, and changelog entry. It does not include explicit Demo Video or Checklist …
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 2
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
🛠️ Fix failing CI checks 💡
  • Commit to this branch
  • Create a new PR

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.

@github-actions

Copy link
Copy Markdown
Contributor

All contributors have signed the CLA ✍️ ✅
Posted by the CLA Assistant Lite bot.

teamleaderleo and others added 3 commits September 27, 2026 08:06
The package conventions lint rejects all-static namespace enums.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 27, 2026 •

Copy link
Copy Markdown
Contributor

CI failure attribution

CI passes on 2d6fefbaf0 (run 36318102853 attempt 3).

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's.

@teamleaderleo
teamleaderleo merged commit e5af879 into main Sep 27, 2026
144 of 153 checks passed
@teamleaderleo
teamleaderleo deleted the consistent-chrome-metrics branch September 27, 2026 13:32
@github-actions

Copy link
Copy Markdown
Contributor

Merge receipt for 2d6fefbaf0: every check was green at merge (21 verified; 16 skipped by policy). Full suite runs on main after merge.

rustybret pushed a commit to rustybret/bmux that referenced this pull request Sep 27, 2026
82c26b3 ci: take the gui token in the app-host shard's restore, not at job start (manaflow-ai#15012)
3761671 iOS: fix stale team nightly floor expectation in What's New copy test (manaflow-ai#14917)
5e19a98 docs: focus custom sidebar tabs by surfaceId in the actions example (manaflow-ai#15002)
294ee6e sidebar: Strip inline Markdown from notification previews (manaflow-ai#12030)
ceb3030 Keep detached workspace process titles updateable (manaflow-ai#4947)
8be7364 test: kill hosted test shells before freeing their terminals (manaflow-ai#14957)
da291df cmux-tui: do not query the host terminal when the reply cannot be read (manaflow-ai#12419)
98767c8 ci: keep earlier reviewed CLA policies valid for branches behind main (manaflow-ai#15008)
7167b77 feat(custom-sidebars): fixedSize and reactive frame specs for JS sidebars (manaflow-ai#14845)
716bbb5 Fix notification hook descriptor inheritance (manaflow-ai#11649)
03b191d cmux-tui: pass the zig target on a native windows-gnu host (manaflow-ai#12416)
c9a6a0e docs: load the deep review protocol only when needed (manaflow-ai#15007)
e5af879 Match pane indicator strokes and the file path header to shared chrome metrics (manaflow-ai#14982)
0def9e1 Show one fixed subtitle for each Settings row and fix localized labels (manaflow-ai#14883)
1921636 ci: route picker-less macOS lanes to the owned minis for trusted events (manaflow-ai#14794)

# Conflicts:
#	.github/workflows/app-host-test-rerun.yml
#	.github/workflows/auth-refresh-tests.yml
#	.github/workflows/ci-health-report.yml
#	.github/workflows/ci-macos.yml
#	.github/workflows/ci-owned-pool-rescue.yml
#	.github/workflows/ci-repo-variables.yml
#	.github/workflows/cloud-command-deadlines.yml
#	.github/workflows/cloud-machine-tests.yml
#	.github/workflows/cloud-task-local-tests.yml
#	.github/workflows/cmux-tui.yml
#	.github/workflows/iroh-v2.yml
#	.github/workflows/relay-tls.yml
#	.github/workflows/reload-build.yml
#	.github/workflows/remote-daemon.yml
#	.github/workflows/resolve-dispatch-ref.yml
#	.github/workflows/terminal-hang-diagnostics.yml
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