diff --git a/src/features/terminal/components/terminal-tab-bar.tsx b/src/features/terminal/components/terminal-tab-bar.tsx
index 80047788d..681c2c287 100644
--- a/src/features/terminal/components/terminal-tab-bar.tsx
+++ b/src/features/terminal/components/terminal-tab-bar.tsx
@@ -51,6 +51,10 @@ import {
useTerminalStore,
} from "@/features/terminal/stores/terminal-store";
import type { Terminal } from "@/features/terminal/types/terminal";
+import {
+ getTerminalTabSidebarResizeSide,
+ getTerminalTabSidebarResizeWidth,
+} from "@/features/terminal/utils/terminal-tab-sidebar-resize";
import { getAllTerminalProfiles } from "@/features/terminal/utils/terminal-profiles";
import { Dropdown, MenuItemsList, type MenuItem } from "@/ui/dropdown";
import { Button } from "@/ui/button";
@@ -449,6 +453,7 @@ const TerminalTabBar = ({
orientation === "vertical" ? verticalListSortingStrategy : horizontalListSortingStrategy;
const pinnedTerminals = sortedTerminals.filter((terminal) => terminal.isPinned);
const regularTerminals = sortedTerminals.filter((terminal) => !terminal.isPinned);
+ const resizeHandleSide = getTerminalTabSidebarResizeSide(tabSidebarPosition);
const getDirectoryLabel = (directory?: string) => {
if (!directory) return "";
const normalized = directory.replace(/[\\/]+$/, "");
@@ -916,14 +921,24 @@ const TerminalTabBar = ({
{/* Resize handle for vertical sidebar */}
{orientation === "vertical" && (
{
e.preventDefault();
const startX = e.clientX;
const startWidth = tabSidebarWidth;
const onMouseMove = (ev: MouseEvent) => {
- setTabSidebarWidth(startWidth + (ev.clientX - startX));
+ setTabSidebarWidth(
+ getTerminalTabSidebarResizeWidth({
+ position: tabSidebarPosition,
+ startWidth,
+ startX,
+ currentX: ev.clientX,
+ }),
+ );
};
const onMouseUp = () => {
document.removeEventListener("mousemove", onMouseMove);
diff --git a/src/features/terminal/tests/terminal-tab-sidebar-resize.test.ts b/src/features/terminal/tests/terminal-tab-sidebar-resize.test.ts
new file mode 100644
index 000000000..32efb3fe6
--- /dev/null
+++ b/src/features/terminal/tests/terminal-tab-sidebar-resize.test.ts
@@ -0,0 +1,47 @@
+import { describe, expect, it } from "vite-plus/test";
+import {
+ getTerminalTabSidebarResizeSide,
+ getTerminalTabSidebarResizeWidth,
+} from "@/features/terminal/utils/terminal-tab-sidebar-resize";
+
+describe("terminal tab sidebar resize", () => {
+ it("resizes from the right edge when tabs are on the left", () => {
+ expect(getTerminalTabSidebarResizeSide("left")).toBe("right");
+ expect(
+ getTerminalTabSidebarResizeWidth({
+ position: "left",
+ startWidth: 180,
+ startX: 500,
+ currentX: 560,
+ }),
+ ).toBe(240);
+ expect(
+ getTerminalTabSidebarResizeWidth({
+ position: "left",
+ startWidth: 180,
+ startX: 500,
+ currentX: 440,
+ }),
+ ).toBe(120);
+ });
+
+ it("resizes from the left edge when tabs are on the right", () => {
+ expect(getTerminalTabSidebarResizeSide("right")).toBe("left");
+ expect(
+ getTerminalTabSidebarResizeWidth({
+ position: "right",
+ startWidth: 180,
+ startX: 500,
+ currentX: 440,
+ }),
+ ).toBe(240);
+ expect(
+ getTerminalTabSidebarResizeWidth({
+ position: "right",
+ startWidth: 180,
+ startX: 500,
+ currentX: 560,
+ }),
+ ).toBe(120);
+ });
+});
diff --git a/src/features/terminal/utils/terminal-tab-sidebar-resize.ts b/src/features/terminal/utils/terminal-tab-sidebar-resize.ts
new file mode 100644
index 000000000..e4ce1aac1
--- /dev/null
+++ b/src/features/terminal/utils/terminal-tab-sidebar-resize.ts
@@ -0,0 +1,22 @@
+import type { TerminalTabSidebarPosition } from "@/features/terminal/stores/terminal-store";
+
+export function getTerminalTabSidebarResizeSide(position: TerminalTabSidebarPosition) {
+ return position === "right" ? "left" : "right";
+}
+
+interface TerminalTabSidebarResizeWidthParams {
+ position: TerminalTabSidebarPosition;
+ startWidth: number;
+ startX: number;
+ currentX: number;
+}
+
+export function getTerminalTabSidebarResizeWidth({
+ position,
+ startWidth,
+ startX,
+ currentX,
+}: TerminalTabSidebarResizeWidthParams) {
+ const deltaX = position === "right" ? startX - currentX : currentX - startX;
+ return startWidth + deltaX;
+}