Commit graph

87 commits

Author SHA1 Message Date
atani
2c330efb8a
feat: add Japanese localization with String Catalog (#819)
* Add i18n infrastructure with String Catalog and Japanese translations

Introduce String Catalog (.xcstrings) for localization support:
- Localizable.xcstrings: 195 UI string entries with en and ja translations
- InfoPlist.xcstrings: Info.plist strings (microphone usage, Finder menu items)
- project.pbxproj: add xcstrings to build phase and ja to knownRegions

* Replace hardcoded UI strings with String(localized:defaultValue:)

Migrate all user-facing strings across 11 source files to use
String(localized:defaultValue:) API (macOS 13+). Each string references
a key in Localizable.xcstrings, with the English text preserved as
defaultValue for fallback.

Files modified:
- KeyboardShortcutSettings: 28 shortcut labels
- SocketControlSettings: mode names and descriptions
- TabManager: placement labels, color names, close dialogs
- BrowserPanel/BrowserPanelView: error pages, context menus, tooltips
- UpdateViewModel/UpdatePopoverView/UpdatePill: update UI states
- NotificationsPage: notification panel labels
- SurfaceSearchOverlay: search bar placeholder and tooltips
- AppDelegate: menus, dialogs, command palette items

* Fix localization gaps from review feedback

Address review comments from CodeRabbit, Greptile, and Cubic Dev AI:
- Use interpolated String(localized:) instead of concatenation for
  version/progress strings in UpdateViewModel
- Localize remaining hardcoded strings in AppDelegate: window labels,
  rename dialog, status menu items, unread notification count
- Localize insecure HTTP alert body in BrowserPanel
- Add 12 new entries to Localizable.xcstrings with Japanese translations

* Fix String(localized:defaultValue:) keys to use StaticString

The localized: parameter requires StaticString when defaultValue: is
used. Move string interpolation from the key to defaultValue only,
and revert maxWidthText to plain strings since they are only used for
layout width calculation.

* Localize remaining UI strings across all source files

Add String(localized:defaultValue:) to all user-facing strings in:
- cmuxApp.swift: settings screen, menus, about panel, dialogs (~180 strings)
- ContentView.swift: command palette, sidebar context menu, dialogs (~200 strings)
- Workspace.swift: rename/move/close tab dialogs, tooltips (~20 strings)
- UpdateTitlebarAccessory.swift: titlebar tooltips, notifications popover (~10 strings)
- TerminalNotificationStore.swift: notification permission dialog (4 strings)
- CmuxWebView.swift: browser context menu items (2 strings)
- AppDelegate.swift: CLI install/uninstall alerts (6 strings)

Add 418 new entries to Localizable.xcstrings with Japanese translations.
Extract sidebar context menu into separate @ViewBuilder to fix Swift
type-checker timeout in large body.
Fix xcstrings format specifiers for interpolated strings (%lld, %@).

Total: 624 localization entries covering the full UI.

* Address review feedback: fix missing localizations and terminology

- Localize javaScriptDialogTitle URL branch in BrowserPanel
- Localize cantReach error message in BrowserPanel
- Localize close other tabs dialog message in TabManager
- Localize workspace accessibility label in ContentView
- Fix unread notification singular/plural (split into two keys)
- Fix insecure connection apostrophe inconsistency (unify to U+2019)
- Rename socketControl.fullOpen.description to socketControl.allowAll.description
- Remove dead code: renameTargetNoun function
- Fix terminology inconsistencies in xcstrings:
  - Unify "Developer Tools" to デベロッパツール
  - Unify "Jump to Latest Unread" phrasing
  - Unify "Flash Focused Panel" terminology
  - Fix dialog.enableNotifications.notNow translation

* fix: address remaining PR 819 review feedback

* fix: use a single localized key for close-other-tabs

* fix: avoid inflection markup in close-other-tabs message

* Address review feedback: localize tooltip, fix subtitle concat, unify keys

- Localize menubar tooltip unread count (hardcoded English -> localized)
- Replace subtitle string concatenation anti-pattern with single localized
  keys containing interpolation placeholders
- Unify workspace fallback key to workspace.displayName.fallback
- Remove unused workspace.defaultName key from xcstrings
- Add Japanese translations for new tooltip and subtitle keys
2026-03-04 14:58:28 -08:00
Lawrence Chen
5d463af122
Fix ghost terminal surface rebind after close (#808)
* Fix ghost terminal lifecycle rebind race

* Address review feedback on portal regression checks

* Address follow-up review feedback
2026-03-03 15:20:42 -08:00
Lawrence Chen
bc1b6fd9eb
Honor Ghostty background-opacity across all cmux chrome (#667)
* Honor Ghostty background-opacity across all cmux chrome

Parse background-opacity from Ghostty config and propagate it through
the entire chrome pipeline: bonsplit tab bar (via RRGGBBAA hex),
browser panel/omnibar, titlebar, empty panel, and window background.

Decouple glass effect from sidebar blend mode — bgGlassEnabled now
defaults to false so opacity works independently. Add
GhosttyBackgroundTheme helper for consistent color+opacity resolution
across all UI surfaces.

Fixes https://github.com/manaflow-ai/cmux/issues/263

* Titlebar and chrome opacity matches terminal background-opacity

Use CALayer-level opacity for the titlebar background instead of SwiftUI
Color alpha, matching the terminal's Metal compositing path. Account for
the double alpha stacking in the terminal area (Bonsplit container bg +
Ghostty renderer) so the titlebar visually matches.

Also fix opacity-only config changes not triggering titlebar refresh on
Cmd+Shift+, reload.
2026-03-01 03:48:46 -08:00
Lawrence Chen
f73887154d
Precompute panel ordering to reduce sidebar scroll lag (#661)
Sidebar body was calling sidebarOrderedPanelIds() multiple times per
render for branches, directories, and pull requests. Now computes it
once and passes through. Reduces redundant work during scroll frames.

Closes https://github.com/manaflow-ai/cmux/issues/655
2026-02-27 18:44:07 -08:00
Lawrence Chen
1392bd16d7 Revert "Use workspace color for notification ring and selection bar (#664)"
This reverts commit 4bfe95d125.
2026-02-27 18:24:51 -08:00
Lawrence Chen
4bfe95d125
Use workspace color for notification ring and selection bar (#664)
- Notification/focus flash uses workspace customColor (fallback: accent)
- Selection bar/indicator uses workspace customColor when set
- Flash color propagated through Panel.triggerFlash(color:) API
- Browser panel flash overlay uses workspace color
- Regression tests for flash color resolution

Fixes https://github.com/manaflow-ai/cmux/issues/557
2026-02-27 18:14:19 -08:00
Austin Wang
5c065bcf05
Merge pull request #646 from manaflow-ai/cmux/cmd-w-fails
Fix browser split behavior and prevent tagged app auto-close
2026-02-27 17:03:51 -08:00
austinpower1258
469f95d398 Fix split-button browser flow to seed terminal split 2026-02-27 11:42:18 -08:00
Lawrence Chen
978341b228
Add zoom/maximize focused pane in splits (#634)
Cmd+Shift+Enter toggles zoom on the focused pane, expanding it to fill
the workspace. Splitting or creating new tabs auto-unzooms. Zoom state
shown as icon in sidebar tab. Includes bonsplit zoom toggle support.

Closes https://github.com/manaflow-ai/cmux/issues/136
2026-02-27 01:50:56 -08:00
Lawrence Chen
dca8992901
Fix use-after-free in ghostty_surface_refresh after sleep/wake (#432) (#619)
Add nil guard in forceRefresh() to prevent dereferencing freed surface
pointer. Split else-if chains in Workspace.swift so
requestBackgroundSurfaceStartIfNeeded() runs if surface is freed during
the refresh call. Add regression test exercising the crash path.
2026-02-27 01:44:02 -08:00
austinpower1258
501e893fba Fix use-after-free in ghostty_surface_refresh after wake (#432)
Prevent crash (KERN_INVALID_ADDRESS at ghostty_surface_refresh) during
geometry reconcile after wake-from-sleep by adding proper lifetime
guards for freed surfaces:

- Re-read self.surface before each ghostty C call in forceRefresh()
  instead of using a stale captured local that can outlive the surface
- Nil out self.surface in deinit before scheduling the async free Task,
  so in-flight closures see nil and bail out
- Re-check surface validity in reconcileTerminalGeometryPass() after
  reconcileGeometryNow() which can trigger AppKit layout that frees
  surfaces

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:28:24 -08:00
Austin Wang
3cf1d2501f
Merge pull request #465 from manaflow-ai/cmux/terminal-persist-issue
Fix Cmd+W close for terminal+browser split (issue #464)
2026-02-24 21:59:37 -08:00
austinpower1258
17d8956789 Fix Cmd+W terminal close in terminal+browser split 2026-02-24 21:54:25 -08:00
Lawrence Chen
b84c0539c9 browser: reuse top-right pane for sidebar PR opens 2026-02-24 21:36:10 -08:00
Lawrence Chen
84d07931a5 sidebar: dedupe PR rows by normalized URL identity 2026-02-24 21:24:49 -08:00
Lawrence Chen
f28eb00b31 Merge remote-tracking branch 'origin/main' into feature/sidebar-pr-metadata
# Conflicts:
#	Sources/ContentView.swift
#	Sources/Workspace.swift
2026-02-24 20:49:29 -08:00
Lawrence Chen
513e9aa607 feat(sidebar): add markdown blocks, provider labels, and fine-grained toggles 2026-02-24 20:38:07 -08:00
Lawrence Chen
f2ecb4877b feat(sidebar): add generic metadata rows and commands 2026-02-24 20:19:38 -08:00
Austin Wang
32b17e8926
Merge pull request #451 from manaflow-ai/cmux/terminal-render-z-order
Fix terminal blanking after full-surface horizontal tab drop
2026-02-24 16:03:41 -08:00
Lawrence Chen
2877531ea2
Auto-focus omnibar when focusing blank browser surfaces (#448)
* Auto-focus omnibar when focusing blank browser surfaces

* Fix browser omnibar autofocus across pane and palette paths

* Fix Cmd+P switcher omnibar autofocus timing
2026-02-24 16:00:03 -08:00
austinpower1258
f33d65f986 Fix terminal blanking after full-surface tab drops 2026-02-24 16:00:00 -08:00
Lawrence Chen
e8477131c1 Merge origin/main into issue-143-session-persistence 2026-02-24 14:41:27 -08:00
Lawrence Chen
6505f0c504 Fix tab drag blank state and preserve non-custom titles across window drops 2026-02-24 14:36:12 -08:00
Lawrence Chen
6c6f363e4b Guard terminal onFocus from re-entrant focus loops 2026-02-24 14:35:10 -08:00
Lawrence Chen
06adb6228c Add drag transfer timing logs for bonsplit tabs 2026-02-24 14:35:10 -08:00
Lawrence Chen
bcd024d8f8 Keep focus on destination after cross-window surface move 2026-02-24 14:35:09 -08:00
Lawrence Chen
58376c3fbc Handle moving the last surface out of a window 2026-02-24 14:35:09 -08:00
Lawrence Chen
ce681bac67 Implement cross-window tab and workspace move UI 2026-02-24 14:35:09 -08:00
Lawrence Chen
06cd25ed52 Fix session restore routing and browser history persistence 2026-02-24 14:34:55 -08:00
austinpower1258
98cf07ce2a Stabilize terminal render recovery after split topology churn 2026-02-24 14:20:14 -08:00
Lawrence Chen
cd03073240 Fix tab drag blank state and preserve non-custom titles across window drops 2026-02-23 23:57:09 -08:00
Lawrence Chen
fb1802a54d Guard terminal onFocus from re-entrant focus loops 2026-02-23 20:20:55 -08:00
Lawrence Chen
a97e0edea8 Add drag transfer timing logs for bonsplit tabs 2026-02-23 20:05:12 -08:00
Lawrence Chen
a90e0a739e Keep focus on destination after cross-window surface move 2026-02-23 19:50:09 -08:00
Lawrence Chen
d8022db404 Handle moving the last surface out of a window 2026-02-23 19:48:54 -08:00
Lawrence Chen
b57087f796 Implement cross-window tab and workspace move UI 2026-02-23 19:48:54 -08:00
Lawrence Chen
78d1a43733 Persist workspace tab colors across session restore 2026-02-23 19:27:32 -08:00
Lawrence Chen
6eeca9c5da Merge remote-tracking branch 'origin/main' into pr-317-session-persistence
# Conflicts:
#	Sources/AppDelegate.swift
#	Sources/cmuxApp.swift
2026-02-23 14:58:16 -08:00
Austin Wang
6598a38fe3
Fix terminal zoom inheritance for new splits/surfaces/workspaces (#384)
* Fix terminal Cmd zoom routing for Ghostty focus descendants (#383)

* Inherit new terminal zoom from last terminal context

Prefer pane-selected terminal as Ghostty config inheritance source when creating splits/new terminals, then focused/fallback terminals. This preserves runtime zoom/font size when opening the next terminal.

* Fix terminal zoom inheritance across split/tab/workspace creation
2026-02-23 11:26:11 -08:00
Lawrence Chen
4fb5da373d
Merge pull request #345 from manaflow-ai/feat-theme-switch-frame-sync
Keep chrome/theme updates in lockstep on theme switch
2026-02-23 02:46:08 -08:00
Lawrence Chen
eb1f0bdd43 Unify theme refresh path across workspace and titlebar 2026-02-23 02:44:28 -08:00
Lawrence Chen
a3f3e20d72 Unify Cmd+Shift+H flash path across panel types 2026-02-23 02:31:22 -08:00
Lawrence Chen
8f68ddb947 Add filesystem logs for theme resolution flow 2026-02-23 00:14:10 -08:00
Lawrence Chen
e90b45f75e Match bonsplit chrome to Ghostty theme 2026-02-22 23:48:13 -08:00
Lawrence Chen
0e2ac79e06
Merge pull request #340 from manaflow-ai/feat-bonsplit-border-colors
Match bonsplit split/tab borders and remove active-tab bottom line
2026-02-22 20:13:12 -08:00
Lawrence Chen
d31cbb7123 Use gray separator borders and drop active-tab bottom border 2026-02-22 20:01:37 -08:00
Lawrence Chen
283b898307 Match bonsplit border styling to Ghostty split divider color 2026-02-22 19:57:46 -08:00
Lawrence Chen
6f44f17f33 Fix follow-up PR331 settings and split focus regressions 2026-02-22 19:55:06 -08:00
Lawrence Chen
0dbe95b797 Reassert non-focus split focus after delayed callbacks 2026-02-22 19:04:57 -08:00
Lawrence Chen
4ee6640e35 Preserve terminal focus for non-focus split opens 2026-02-22 18:50:01 -08:00