Add sidebar blur effect with withinWindow blending - #9
Conversation
- Add NSVisualEffectView-based blur backdrop for sidebar - Support withinWindow blending mode to blur terminal content behind sidebar - Auto-switch to overlay layout when withinWindow mode is selected - Add sidebar debug panel with material, blending, tint, and opacity controls - Add preset options (HUD Glass, Popover Glass, etc.) - Default to HUD Glass preset with withinWindow blur
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b35a70cb14
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| // Overlay mode: terminal extends full width, sidebar on top | ||
| // This allows withinWindow blur to see the terminal content | ||
| ZStack(alignment: .leading) { | ||
| terminalContent | ||
| .padding(.leading, sidebarState.isVisible ? sidebarWidth : 0) | ||
| if sidebarState.isVisible { |
There was a problem hiding this comment.
Remove leading padding so withinWindow blur can see terminal
In withinWindow mode the comment says the terminal should extend full width so the blur samples terminal content, but terminalContent is padded by sidebarWidth, which shifts the terminal content to the right and leaves the sidebar area empty/transparent. This means the blur layer will not show terminal text behind the sidebar (it will blur the window background instead), so the new withinWindow mode doesn’t deliver its intended effect. This is visible whenever sidebarBlendMode is .withinWindow and the sidebar is visible.
Useful? React with 👍 / 👎.
Show close button only on hover instead of when active/multi-selected. Remove the hover background color from tabs for cleaner appearance.
- Add reloadConfiguration() methods for app-wide and per-surface reload - Handle GHOSTTY_ACTION_RELOAD_CONFIG action from Ghostty - Add ghosttyConfigDidReload notification for views to react - TerminalSplitTreeView reloads GhosttyConfig on notification - Add openConfigurationInTextEdit() helper - Fix activeMainWindow() to correctly find main window
- Add customTitle and isPinned properties to Tab - Separate process title from custom title with applyProcessTitle() - Add setCustomTitle()/clearCustomTitle() for user-defined tab names - Add togglePin()/setPinned() with automatic reordering - Pinned tabs stay at the top, new tabs insert after pinned section - moveTabToTop/moveTabsToTop respect pinned tab ordering
- CLI: Parse --panel <id|index> option for new-split - Controller: Resolve panel argument to split specific surface - Return new panel UUID on successful split creation
- Use AnchorNSView with layout callback for reliable positioning - Force layout before showing popover to ensure current geometry - Convert anchor bounds to window content view coordinates - Add fallback positioning near top-left when anchor unavailable - Fix button hit testing with explicit frame and contentShape
Use osascript to gracefully quit by bundle ID before pkill fallback. Add more robust pkill patterns to catch instances from any DerivedData path.
- Add WindowGlassEffect for window-level NSGlassEffectView (macOS 26+) - Add SidebarBackdrop with configurable material, blend mode, tint, and opacity - Add Sidebar Debug panel (Debug menu) for live adjustment of sidebar appearance - Add Background Debug panel for window glass tint settings - Support both behindWindow and withinWindow blur modes - Live tint updates without requiring window reload
Move ${{ steps.version.outputs.version }} from direct run: block
interpolation to env: block in update-homebrew.yml Download DMG step.
Resolves code scanning alert manaflow-ai#9.
* Add sidebar blur effect with withinWindow blending - Add NSVisualEffectView-based blur backdrop for sidebar - Support withinWindow blending mode to blur terminal content behind sidebar - Auto-switch to overlay layout when withinWindow mode is selected - Add sidebar debug panel with material, blending, tint, and opacity controls - Add preset options (HUD Glass, Popover Glass, etc.) - Default to HUD Glass preset with withinWindow blur * Simplify tab close button visibility and remove hover background Show close button only on hover instead of when active/multi-selected. Remove the hover background color from tabs for cleaner appearance. * Add config reload support with notification system - Add reloadConfiguration() methods for app-wide and per-surface reload - Handle GHOSTTY_ACTION_RELOAD_CONFIG action from Ghostty - Add ghosttyConfigDidReload notification for views to react - TerminalSplitTreeView reloads GhosttyConfig on notification - Add openConfigurationInTextEdit() helper - Fix activeMainWindow() to correctly find main window * Add custom tab titles and pinned tabs support - Add customTitle and isPinned properties to Tab - Separate process title from custom title with applyProcessTitle() - Add setCustomTitle()/clearCustomTitle() for user-defined tab names - Add togglePin()/setPinned() with automatic reordering - Pinned tabs stay at the top, new tabs insert after pinned section - moveTabToTop/moveTabsToTop respect pinned tab ordering * Add --panel option to new-split command - CLI: Parse --panel <id|index> option for new-split - Controller: Resolve panel argument to split specific surface - Return new panel UUID on successful split creation * Fix notifications popover positioning with layout-aware anchor - Use AnchorNSView with layout callback for reliable positioning - Force layout before showing popover to ensure current geometry - Convert anchor bounds to window content view coordinates - Add fallback positioning near top-left when anchor unavailable - Fix button hit testing with explicit frame and contentShape * Improve app termination in reload script Use osascript to gracefully quit by bundle ID before pkill fallback. Add more robust pkill patterns to catch instances from any DerivedData path. * Add sidebar blur effect with live-adjustable glass settings - Add WindowGlassEffect for window-level NSGlassEffectView (macOS 26+) - Add SidebarBackdrop with configurable material, blend mode, tint, and opacity - Add Sidebar Debug panel (Debug menu) for live adjustment of sidebar appearance - Add Background Debug panel for window glass tint settings - Support both behindWindow and withinWindow blur modes - Live tint updates without requiring window reload * Align titlebar text to left edge of content area
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…low-ai#1, manaflow-ai#4, manaflow-ai#8, manaflow-ai#9, manaflow-ai#10, manaflow-ai#12, manaflow-ai#14) Several linked defects in the mirror sizing transaction: - manaflow-ai#1: applyAssignedGrids re-pinned a stale grid during a WINDOW live-resize (or interactive geometry drag), painting past the shrinking pane. The divider-drag early return does not cover a window resize, so gate the stale re-pin on the same suppression the view path uses. - manaflow-ai#8: under zoom the visible tree is the single zoomed leaf, so hidden but live base panes were unpinned and rendered on a stale grid. Pin each pane from the visible tree or the base tree; clear only panes in neither. - manaflow-ai#9: the pin-grow repaint went through the attach-only redraw kick (armed only at .enter), so late-granted cells stayed blank mid-session. Extract the shrink/restore SIGWINCH body into forceRedrawKick(windowIds:) and call it directly on a pin grow. - manaflow-ai#10: the stale-repin else-if and gridParityMismatch tested only the under direction, so an over-render (rendered > assigned) was an invisible no-op. Compare with != on both axes; reapplyAssignedGrid clamps either way. - manaflow-ai#12: gridParityMismatch read only the ledger, which goes stale because a same-size re-apply returns early before reporting. Read the surface's live grid first, falling back to the ledger. - manaflow-ai#4: the parked-container consumer clamped an oversized parked reading to the bound and banked it, overwriting a correct size. Reject it (as the sibling oversized consumer does) and keep the last good container. - manaflow-ai#14: rearmIfOutputMissedPlan gated on the plain isVisibleForSizing, which goes stale-true when a hidden tab's view is dismantled; gate on isEffectivelyVisibleForSizing so an offscreen mirror cannot spin re-arms. Tests: parkedHiddenReadingOverTheBoundIsRejectedNotClamped (manaflow-ai#4), gridParityFlagsAnOverRenderedPane (manaflow-ai#10, manaflow-ai#12), and the reworked grid-lag test now pins that an offscreen mirror does not re-arm (manaflow-ai#14).
Documents the fork's Hebrew work: right-to-left rendering and the direction toggle, bidi-aware cursor placement, UAX manaflow-ai#9 glyph mirroring, direction-aware arrow keys, the twelve selectable Hebrew faces, and Cmd+Z undo. Records the constraints too - the uniform-advance normalisation the faces need, and what Cmd+Z can and cannot undo.
Two constructs in today's #8567 never satisfy the Swift compiler (seen on Swift 6.3.3 / Xcode 26.5): the worktree identity fields were declared 'let ... = nil', which excludes them from the memberwise initializer the creation path calls with real values (extra arguments at #8/#9), and the rollback guard compared an optional filesystem-identity tuple against a non-optional one, which tuples do not support. Make the fields plain memberwise 'let's (the only production call site provides them; the spawn-args test now passes nil explicitly) and unwrap the current identity before comparing. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Summary
Test plan