Skip to content

Commit aa43a82

Browse files
committed
Fix pane layout divider direction styles
1 parent 194eb04 commit aa43a82

5 files changed

Lines changed: 101 additions & 7 deletions

File tree

packages/web/src/features/agent-panes/views/shared/pane-layout.test.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,32 @@ describe("PaneLayout", () => {
2525
document.body.classList.remove("is-resizing-panels");
2626
});
2727

28+
it("renders direction-specific divider classes", () => {
29+
const { container, rerender } = render(
30+
<PaneLayout splitId="split-a" direction="horizontal" ratio={0.5}>
31+
<div>left</div>
32+
<div>right</div>
33+
</PaneLayout>
34+
);
35+
36+
const horizontalDivider = container.querySelector('[role="separator"]');
37+
38+
expect(horizontalDivider).toHaveClass("pane-layout-divider", "pane-layout-horizontal-divider");
39+
expect(horizontalDivider).toHaveAttribute("aria-orientation", "vertical");
40+
41+
rerender(
42+
<PaneLayout splitId="split-b" direction="vertical" ratio={0.5}>
43+
<div>top</div>
44+
<div>bottom</div>
45+
</PaneLayout>
46+
);
47+
48+
const verticalDivider = container.querySelector('[role="separator"]');
49+
50+
expect(verticalDivider).toHaveClass("pane-layout-divider", "pane-layout-vertical-divider");
51+
expect(verticalDivider).toHaveAttribute("aria-orientation", "horizontal");
52+
});
53+
2854
it("resets the local ratio when the split identity changes", () => {
2955
mockContainerRect(1000);
3056

packages/web/src/features/agent-panes/views/shared/pane-layout.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ export const PaneLayout: FC<PaneLayoutProps> = ({
9292
direction === "horizontal"
9393
? { gridTemplateColumns: `${currentRatio * 100}% 0px ${(1 - currentRatio) * 100}%` }
9494
: { gridTemplateRows: `${currentRatio * 100}% 0px ${(1 - currentRatio) * 100}%` };
95+
const dividerClassName =
96+
direction === "horizontal"
97+
? "pane-layout-divider pane-layout-horizontal-divider"
98+
: "pane-layout-divider pane-layout-vertical-divider";
9599

96100
return (
97101
<div
@@ -101,7 +105,7 @@ export const PaneLayout: FC<PaneLayoutProps> = ({
101105
>
102106
<div className="pane-layout-child">{first}</div>
103107
<div
104-
className="pane-layout-divider"
108+
className={dividerClassName}
105109
onMouseDown={handleMouseDown}
106110
role="separator"
107111
aria-orientation={direction === "horizontal" ? "vertical" : "horizontal"}

packages/web/src/styles/components.css

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3155,16 +3155,17 @@ body.is-dragging-pane {
31553155
background: var(--border-focus);
31563156
}
31573157

3158-
.pane-layout-horizontal .pane-layout-divider {
3158+
.pane-layout-horizontal-divider {
31593159
cursor: col-resize;
31603160
width: 10px;
31613161
margin-left: -5px;
31623162
margin-right: -5px;
31633163
justify-self: center;
31643164
}
31653165

3166-
.pane-layout-vertical .pane-layout-divider {
3166+
.pane-layout-vertical-divider {
31673167
cursor: row-resize;
3168+
width: 100%;
31683169
height: 10px;
31693170
margin-top: -5px;
31703171
margin-bottom: -5px;
@@ -7416,6 +7417,15 @@ textarea.input {
74167417
background: linear-gradient(180deg, transparent, var(--state-info-bg), transparent);
74177418
}
74187419

7420+
.pane-layout-vertical-divider {
7421+
background: linear-gradient(
7422+
180deg,
7423+
transparent,
7424+
var(--component-mix-status-info-fg-24pct-transparent),
7425+
transparent
7426+
);
7427+
}
7428+
74197429
.pane-layout-divider::after {
74207430
content: "";
74217431
position: absolute;
@@ -7424,19 +7434,20 @@ textarea.input {
74247434
background: var(--component-mix-border-default-62pct-transparent);
74257435
}
74267436

7427-
.pane-layout-horizontal .pane-layout-divider::after {
7437+
.pane-layout-horizontal-divider::after {
74287438
top: 0;
74297439
bottom: 0;
74307440
left: 50%;
74317441
width: 1px;
74327442
transform: translateX(-50%);
74337443
}
74347444

7435-
.pane-layout-vertical .pane-layout-divider::after {
7445+
.pane-layout-vertical-divider::after {
74367446
left: 0;
74377447
right: 0;
74387448
top: 50%;
74397449
height: 1px;
7450+
background: var(--component-mix-border-default-78pct-status-info-fg-22pct);
74407451
transform: translateY(-50%);
74417452
}
74427453

packages/web/src/styles/components.theme.test.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,12 +1066,18 @@ describe("components.css theme-sensitive surfaces", () => {
10661066
);
10671067
const paneDividerHorizontalRules = getRuleBlocksFrom(
10681068
stylesheet,
1069-
".pane-layout-horizontal .pane-layout-divider"
1069+
".pane-layout-horizontal-divider"
10701070
).join("\n");
10711071
const paneDividerVerticalRules = getRuleBlocksFrom(
10721072
stylesheet,
1073-
".pane-layout-vertical .pane-layout-divider"
1073+
".pane-layout-vertical-divider"
10741074
).join("\n");
1075+
const hasLegacyPaneDividerHorizontalRule = hasRuleBlock(
1076+
".pane-layout-horizontal .pane-layout-divider"
1077+
);
1078+
const hasLegacyPaneDividerVerticalRule = hasRuleBlock(
1079+
".pane-layout-vertical .pane-layout-divider"
1080+
);
10751081
const bottomTerminalShellRules = getRuleBlocksFrom(
10761082
stylesheet,
10771083
".workspace-bottom-panel > .bottom-terminal"
@@ -1201,10 +1207,13 @@ describe("components.css theme-sensitive surfaces", () => {
12011207
expect(paneDividerHorizontalRules).toContain("margin-left: -5px");
12021208
expect(paneDividerHorizontalRules).toContain("margin-right: -5px");
12031209
expect(paneDividerHorizontalRules).not.toContain("background: transparent");
1210+
expect(paneDividerVerticalRules).toContain("width: 100%");
12041211
expect(paneDividerVerticalRules).toContain("height: 10px");
12051212
expect(paneDividerVerticalRules).toContain("margin-top: -5px");
12061213
expect(paneDividerVerticalRules).toContain("margin-bottom: -5px");
12071214
expect(paneDividerVerticalRules).not.toContain("background: transparent");
1215+
expect(hasLegacyPaneDividerHorizontalRule).toBe(false);
1216+
expect(hasLegacyPaneDividerVerticalRule).toBe(false);
12081217
expect(bottomPanel).toContain("padding: 0");
12091218
expect(bottomPanel).not.toContain("padding: 0 0 14px");
12101219
expect(bottomPanel).not.toContain("padding: 0 14px 14px");
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// @vitest-environment node
2+
import { readFileSync } from "node:fs";
3+
import { describe, expect, it } from "vitest";
4+
5+
const stylesheet = readFileSync(`${process.cwd()}/src/styles/components.css`, "utf8");
6+
7+
function getRuleBlocks(selector: string) {
8+
const blocks: string[] = [];
9+
const matcher = /([^{}]+)\{([^}]*)\}/g;
10+
const normalizedSelector = selector.replace(/\s+/g, " ").trim();
11+
let match: RegExpExecArray | null = null;
12+
13+
while ((match = matcher.exec(stylesheet)) !== null) {
14+
const selectors = match[1]
15+
.replace(/\/\*[\s\S]*?\*\//g, "")
16+
.split(",")
17+
.map((entry) => entry.replace(/\s+/g, " ").trim());
18+
19+
if (selectors.includes(normalizedSelector)) {
20+
blocks.push(match[2]);
21+
}
22+
}
23+
24+
if (blocks.length === 0) {
25+
throw new Error(`expected CSS rule for ${selector}`);
26+
}
27+
28+
return blocks;
29+
}
30+
31+
describe("pane-layout vertical divider styles", () => {
32+
it("keeps stacked pane dividers visible on shared workspace surfaces", () => {
33+
const divider = getRuleBlocks(".pane-layout-vertical-divider").join("\n");
34+
const dividerLine = getRuleBlocks(".pane-layout-vertical-divider::after").join("\n");
35+
36+
expect(divider).toContain("width: 100%");
37+
expect(divider).toContain("height: 10px");
38+
expect(divider).toContain("margin-top: -5px");
39+
expect(divider).toContain("margin-bottom: -5px");
40+
expect(divider).toContain("background: linear-gradient(");
41+
expect(divider).toContain("var(--component-mix-status-info-fg-24pct-transparent)");
42+
expect(dividerLine).toContain("var(--component-mix-border-default-78pct-status-info-fg-22pct)");
43+
});
44+
});

0 commit comments

Comments
 (0)