Skip to content

Commit ecb7f4f

Browse files
authored
fix: add 3-way horizontal split variant and fix file manager overflow in split view (#796)
Adds a "3-Way (H)" layout option (2 top + 1 bottom) alongside the existing "3-Way (V)" (1 left + 2 right). Fixes file manager content overflowing its split pane by adding min-h-0 to nested flex containers that were missing it.
1 parent 5971bcf commit ecb7f4f

5 files changed

Lines changed: 48 additions & 3 deletions

File tree

src/types/ui-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ export type SplitMode =
272272
| "none"
273273
| "2-way"
274274
| "3-way"
275+
| "3-way-horizontal"
275276
| "4-way"
276277
| "5-way"
277278
| "6-way";

src/ui/features/file-manager/FileManager.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2551,7 +2551,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) {
25512551
return (
25522552
<div className="h-full flex flex-col bg-background relative overflow-hidden isolate">
25532553
<div
2554-
className="h-full w-full flex flex-col"
2554+
className="h-full w-full flex flex-col min-h-0"
25552555
style={{
25562556
visibility: isConnectionLogExpanded ? "hidden" : "visible",
25572557
}}
@@ -2855,7 +2855,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) {
28552855
: "hidden md:flex",
28562856
)}
28572857
>
2858-
<div className="flex-1 flex flex-col overflow-hidden border border-border bg-card">
2858+
<div className="flex-1 flex flex-col overflow-hidden min-h-0 border border-border bg-card">
28592859
<FileManagerSidebar
28602860
currentHost={currentHost}
28612861
currentPath={currentPath}

src/ui/lib/theme.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ export const FOLDER_COLORS = [
9898
export const SPLIT_MODES: { id: SplitMode; label: string }[] = [
9999
{ id: "none", label: "None" },
100100
{ id: "2-way", label: "2-Way" },
101-
{ id: "3-way", label: "3-Way" },
101+
{ id: "3-way", label: "3-Way (V)" },
102+
{ id: "3-way-horizontal", label: "3-Way (H)" },
102103
{ id: "4-way", label: "4-Way" },
103104
{ id: "5-way", label: "5-Way" },
104105
{ id: "6-way", label: "6-Way" },
@@ -108,6 +109,7 @@ export const PANE_COUNTS: Record<SplitMode, number> = {
108109
none: 0,
109110
"2-way": 2,
110111
"3-way": 3,
112+
"3-way-horizontal": 3,
111113
"4-way": 4,
112114
"5-way": 5,
113115
"6-way": 6,
@@ -117,6 +119,7 @@ export const PANE_LAYOUTS: Record<SplitMode, string> = {
117119
none: "",
118120
"2-way": "grid-cols-2 grid-rows-1",
119121
"3-way": "grid-cols-2 grid-rows-2",
122+
"3-way-horizontal": "grid-cols-2 grid-rows-2",
120123
"4-way": "grid-cols-2 grid-rows-2",
121124
"5-way": "grid-cols-3 grid-rows-2",
122125
"6-way": "grid-cols-3 grid-rows-2",

src/ui/shell/SplitView.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ function defaultSizes(mode: SplitMode): {
1919
return { rowSizes: [100], rowColSizes: [[50, 50]] };
2020
case "3-way":
2121
return { rowSizes: [50, 50], rowColSizes: [[50, 50], [100]] };
22+
case "3-way-horizontal":
23+
return { rowSizes: [50, 50], rowColSizes: [[50, 50], [100]] };
2224
case "4-way":
2325
return {
2426
rowSizes: [50, 50],
@@ -444,6 +446,36 @@ export function SplitView({
444446
</div>
445447
)}
446448

449+
{splitMode === "3-way-horizontal" && (
450+
<div className="flex flex-col w-full h-full min-h-0">
451+
<div
452+
className="flex min-h-0 overflow-hidden"
453+
style={{ height: `${rowSizes[0]}%` }}
454+
>
455+
<div
456+
className="min-w-0 min-h-0 overflow-hidden"
457+
style={{ width: `${rowColSizes[0][0]}%` }}
458+
>
459+
{pane(0)}
460+
</div>
461+
<ColDivider
462+
onMouseDown={(e) => onColDivider(e, 0, 0)}
463+
onTouchStart={(e) => onColDividerTouch(e, 0, 0)}
464+
/>
465+
<div className="flex-1 min-w-0 min-h-0 overflow-hidden">
466+
{pane(1)}
467+
</div>
468+
</div>
469+
<RowDivider
470+
onMouseDown={(e) => onRowDivider(e, 0)}
471+
onTouchStart={(e) => onRowDividerTouch(e, 0)}
472+
/>
473+
<div className="flex-1 min-h-0 overflow-hidden">
474+
{pane(2)}
475+
</div>
476+
</div>
477+
)}
478+
447479
{splitMode === "4-way" && (
448480
<div className="flex flex-col w-full h-full min-h-0">
449481
<Row rowIdx={0} paneIndices={[0, 1]} />

src/ui/sidebar/SplitScreenPanel.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ const LAYOUT_PREVIEWS: Record<SplitMode, React.ReactNode> = {
2424
</div>
2525
</div>
2626
),
27+
"3-way-horizontal": (
28+
<div className="flex flex-col gap-0.5 size-full">
29+
<div className="flex gap-0.5 flex-1">
30+
<div className="flex-1 border-2 border-current" />
31+
<div className="flex-1 border-2 border-current" />
32+
</div>
33+
<div className="flex-1 border-2 border-current" />
34+
</div>
35+
),
2736
"4-way": (
2837
<div className="grid grid-cols-2 grid-rows-2 gap-0.5 size-full">
2938
<div className="border-2 border-current" />

0 commit comments

Comments
 (0)