Skip to content

Commit 0796644

Browse files
committed
Account for Flex gap when calculating pointer-move delta %
1 parent 533015d commit 0796644

File tree

4 files changed

+39
-10
lines changed

4 files changed

+39
-10
lines changed

integrations/vite/tests/pointer-interactions.spec.tsx

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,9 @@ test.describe("pointer interactions", () => {
150150
});
151151

152152
await expect(page.getByText('"onLayoutCount": 2')).toBeVisible();
153-
await expect(page.getByText('"left": 84')).toBeVisible();
153+
await expect(page.getByText('"left": 87')).toBeVisible();
154154
await expect(page.getByText('"center": 5')).toBeVisible();
155-
await expect(page.getByText('"right": 11')).toBeVisible();
155+
await expect(page.getByText('"right": 8')).toBeVisible();
156156

157157
await page.mouse.move(x - 500, y);
158158

@@ -169,4 +169,26 @@ test.describe("pointer interactions", () => {
169169
await expect(page.getByText('"center": 33')).toBeVisible();
170170
await expect(page.getByText('"right": 33')).toBeVisible();
171171
});
172+
173+
test("drag should measure delta using the available group size (minus flex gap)", async ({
174+
page
175+
}) => {
176+
await goToUrl(
177+
page,
178+
<Group className="gap-20">
179+
<Panel defaultSize="10%" id="left" minSize="5%" />
180+
<Separator />
181+
<Panel id="right" minSize="5%" />
182+
</Group>
183+
);
184+
185+
await expect(page.getByText('"onLayoutCount": 1')).toBeVisible();
186+
await expect(page.getByText('"left": 10')).toBeVisible();
187+
188+
await resizeHelper(page, ["left", "right"], 800, 0);
189+
190+
// The new layout would be ~91% and 9% if not for flex-gap
191+
await expect(page.getByText('"onLayoutCount": 2')).toBeVisible();
192+
await expect(page.getByText('"left": 95')).toBeVisible();
193+
});
172194
});

integrations/vite/tests/utils/serializer/types.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,21 @@ export type Config = {
66
};
77

88
export type GroupJson = {
9-
type: "Group";
109
children: (PanelJson | SeparatorJson)[];
10+
className?: string;
1111
props: object;
12+
type: "Group";
1213
};
1314

1415
export type PanelJson = {
1516
children?: GroupJson | undefined;
16-
type: "Panel";
17+
className?: string;
1718
props: object;
19+
type: "Panel";
1820
};
1921

2022
export type SeparatorJson = {
21-
type: "Separator";
23+
className?: string;
2224
props: object;
25+
type: "Separator";
2326
};

lib/global/dom/calculateHitRegions.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { sortByElementOffset } from "../../components/group/sortByElementOffset"
22
import type { RegisteredGroup } from "../../components/group/types";
33
import type { RegisteredPanel } from "../../components/panel/types";
44
import type { RegisteredSeparator } from "../../components/separator/types";
5+
import { calculateAvailableGroupSize } from "./calculateAvailableGroupSize";
56

67
type PanelsTuple = [panel: RegisteredPanel, panel: RegisteredPanel];
78

89
export type HitRegion = {
910
group: RegisteredGroup;
11+
groupSize: number;
1012
panels: PanelsTuple;
1113
rect: DOMRect;
1214
separator: RegisteredSeparator | undefined;
@@ -46,6 +48,7 @@ export function calculateHitRegions(group: RegisteredGroup) {
4648

4749
hitRegions.push({
4850
group,
51+
groupSize: calculateAvailableGroupSize({ group }),
4952
panels: [prevPanel, panelData],
5053
separator: prevSeparator,
5154
rect:

lib/global/utils/updateActiveHitRegion.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,17 @@ export function updateActiveHitRegions({
3434
// Note that HitRegions are frozen once a drag has started
3535
// Modify the Group layouts for all matching HitRegions though
3636
hitRegions.forEach((current) => {
37-
const { disableCursor, element, orientation, panels } = current.group;
37+
const { group, groupSize } = current;
38+
const { disableCursor, orientation, panels } = group;
3839

3940
let deltaAsPercentage = 0;
4041
if (pointerDownAtPoint) {
4142
if (orientation === "horizontal") {
4243
deltaAsPercentage =
43-
((event.clientX - pointerDownAtPoint.x) / element.offsetWidth) * 100;
44+
((event.clientX - pointerDownAtPoint.x) / groupSize) * 100;
4445
} else {
4546
deltaAsPercentage =
46-
((event.clientY - pointerDownAtPoint.y) / element.offsetHeight) * 100;
47+
((event.clientY - pointerDownAtPoint.y) / groupSize) * 100;
4748
}
4849
} else {
4950
if (orientation === "horizontal") {
@@ -53,13 +54,13 @@ export function updateActiveHitRegions({
5354
}
5455
}
5556

56-
const initialLayout = initialLayoutMap.get(current.group);
57+
const initialLayout = initialLayoutMap.get(group);
5758

5859
const {
5960
derivedPanelConstraints,
6061
layout: prevLayout,
6162
separatorToPanels
62-
} = mountedGroups.get(current.group) ?? {};
63+
} = mountedGroups.get(group) ?? {};
6364
if (
6465
derivedPanelConstraints &&
6566
initialLayout &&

0 commit comments

Comments
 (0)