diff --git a/src/renderer/src/components/Terminal.tsx b/src/renderer/src/components/Terminal.tsx
index d0318cb99..72eb5b692 100644
--- a/src/renderer/src/components/Terminal.tsx
+++ b/src/renderer/src/components/Terminal.tsx
@@ -896,6 +896,7 @@ function Terminal(): React.JSX.Element | null {
layout={layout}
worktreeId={worktree.id}
focusedGroupId={activeGroupIdByWorktree[worktree.id]}
+ isWorktreeActive={isVisible}
/>
)
diff --git a/src/renderer/src/components/tab-group/TabGroupSplitLayout.test.ts b/src/renderer/src/components/tab-group/TabGroupSplitLayout.test.ts
new file mode 100644
index 000000000..077133f13
--- /dev/null
+++ b/src/renderer/src/components/tab-group/TabGroupSplitLayout.test.ts
@@ -0,0 +1,59 @@
+import { describe, expect, it, vi } from 'vitest'
+
+const setTabGroupSplitRatioMock = vi.fn()
+const useAppStoreMock = vi.fn(
+ (selector: (state: { setTabGroupSplitRatio: () => void }) => unknown) =>
+ selector({ setTabGroupSplitRatio: setTabGroupSplitRatioMock })
+)
+vi.mock('../../store', () => ({
+ useAppStore: (selector: (state: { setTabGroupSplitRatio: () => void }) => unknown) =>
+ useAppStoreMock(selector)
+}))
+
+vi.mock('./TabGroupPanel', () => ({
+ default: (props: unknown) => ({ __mock: 'TabGroupPanel', props })
+}))
+
+import TabGroupSplitLayout from './TabGroupSplitLayout'
+
+describe('TabGroupSplitLayout', () => {
+ function getLeafPanelProps(isWorktreeActive: boolean) {
+ const element = TabGroupSplitLayout({
+ layout: { type: 'leaf', groupId: 'group-1' },
+ worktreeId: 'wt-1',
+ focusedGroupId: 'group-1',
+ isWorktreeActive
+ })
+
+ const splitNodeElement = element.props.children
+ const tabGroupPanelElement = splitNodeElement.type(splitNodeElement.props)
+ return tabGroupPanelElement.props as {
+ groupId: string
+ worktreeId: string
+ isFocused: boolean
+ hasSplitGroups: boolean
+ }
+ }
+
+ it('does not mark an offscreen worktree group as focused', () => {
+ expect(getLeafPanelProps(false)).toEqual(
+ expect.objectContaining({
+ groupId: 'group-1',
+ worktreeId: 'wt-1',
+ isFocused: false,
+ hasSplitGroups: false
+ })
+ )
+ })
+
+ it('keeps the visible worktree focused group active', () => {
+ expect(getLeafPanelProps(true)).toEqual(
+ expect.objectContaining({
+ groupId: 'group-1',
+ worktreeId: 'wt-1',
+ isFocused: true,
+ hasSplitGroups: false
+ })
+ )
+ })
+})
diff --git a/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx b/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx
index f19ed4300..9245f9ea1 100644
--- a/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx
+++ b/src/renderer/src/components/tab-group/TabGroupSplitLayout.tsx
@@ -84,12 +84,14 @@ function SplitNode({
nodePath,
worktreeId,
focusedGroupId,
+ isWorktreeActive,
hasSplitGroups
}: {
node: TabGroupLayoutNode
nodePath: string
worktreeId: string
focusedGroupId?: string
+ isWorktreeActive: boolean
hasSplitGroups: boolean
}): React.JSX.Element {
const setTabGroupSplitRatio = useAppStore((state) => state.setTabGroupSplitRatio)
@@ -99,7 +101,11 @@ function SplitNode({