react-resizable-panels 2.1.6 → 2.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/react-resizable-panels.browser.cjs.js +7 -7
  2. package/dist/react-resizable-panels.browser.development.cjs.js +7 -7
  3. package/dist/react-resizable-panels.browser.development.esm.js +7 -7
  4. package/dist/react-resizable-panels.browser.esm.js +7 -7
  5. package/dist/react-resizable-panels.cjs.js +7 -7
  6. package/dist/react-resizable-panels.development.cjs.js +7 -7
  7. package/dist/react-resizable-panels.development.esm.js +7 -7
  8. package/dist/react-resizable-panels.development.node.cjs.js +7 -7
  9. package/dist/react-resizable-panels.development.node.esm.js +7 -7
  10. package/dist/react-resizable-panels.esm.js +7 -7
  11. package/dist/react-resizable-panels.node.cjs.js +7 -7
  12. package/dist/react-resizable-panels.node.esm.js +7 -7
  13. package/package.json +7 -1
  14. package/.eslintrc.cjs +0 -27
  15. package/CHANGELOG.md +0 -574
  16. package/jest.config.js +0 -10
  17. package/src/Panel.test.tsx +0 -1084
  18. package/src/Panel.ts +0 -259
  19. package/src/PanelGroup.test.tsx +0 -443
  20. package/src/PanelGroup.ts +0 -999
  21. package/src/PanelGroupContext.ts +0 -42
  22. package/src/PanelResizeHandle.test.tsx +0 -367
  23. package/src/PanelResizeHandle.ts +0 -246
  24. package/src/PanelResizeHandleRegistry.ts +0 -336
  25. package/src/constants.ts +0 -1
  26. package/src/env-conditions/browser.ts +0 -1
  27. package/src/env-conditions/development.ts +0 -1
  28. package/src/env-conditions/node.ts +0 -1
  29. package/src/env-conditions/production.ts +0 -1
  30. package/src/env-conditions/unknown.ts +0 -1
  31. package/src/hooks/useForceUpdate.ts +0 -7
  32. package/src/hooks/useIsomorphicEffect.ts +0 -8
  33. package/src/hooks/useUniqueId.ts +0 -19
  34. package/src/hooks/useWindowSplitterBehavior.ts +0 -90
  35. package/src/hooks/useWindowSplitterPanelGroupBehavior.ts +0 -201
  36. package/src/index.ts +0 -77
  37. package/src/types.ts +0 -5
  38. package/src/utils/adjustLayoutByDelta.test.ts +0 -2061
  39. package/src/utils/adjustLayoutByDelta.ts +0 -308
  40. package/src/utils/arrays.ts +0 -13
  41. package/src/utils/assert.ts +0 -10
  42. package/src/utils/calculateAriaValues.test.ts +0 -106
  43. package/src/utils/calculateAriaValues.ts +0 -45
  44. package/src/utils/calculateDeltaPercentage.ts +0 -63
  45. package/src/utils/calculateDragOffsetPercentage.ts +0 -40
  46. package/src/utils/calculateUnsafeDefaultLayout.test.ts +0 -87
  47. package/src/utils/calculateUnsafeDefaultLayout.ts +0 -50
  48. package/src/utils/callPanelCallbacks.ts +0 -49
  49. package/src/utils/compareLayouts.test.ts +0 -9
  50. package/src/utils/compareLayouts.ts +0 -12
  51. package/src/utils/computePanelFlexBoxStyle.test.ts +0 -123
  52. package/src/utils/computePanelFlexBoxStyle.ts +0 -50
  53. package/src/utils/csp.ts +0 -9
  54. package/src/utils/cursor.ts +0 -103
  55. package/src/utils/debounce.ts +0 -18
  56. package/src/utils/determinePivotIndices.ts +0 -15
  57. package/src/utils/dom/getPanelElement.ts +0 -10
  58. package/src/utils/dom/getPanelElementsForGroup.ts +0 -8
  59. package/src/utils/dom/getPanelGroupElement.ts +0 -21
  60. package/src/utils/dom/getResizeHandleElement.ts +0 -10
  61. package/src/utils/dom/getResizeHandleElementIndex.ts +0 -13
  62. package/src/utils/dom/getResizeHandleElementsForGroup.ts +0 -10
  63. package/src/utils/dom/getResizeHandlePanelIds.ts +0 -19
  64. package/src/utils/events/getResizeEventCoordinates.ts +0 -23
  65. package/src/utils/events/getResizeEventCursorPosition.ts +0 -14
  66. package/src/utils/events/index.ts +0 -13
  67. package/src/utils/getInputType.ts +0 -5
  68. package/src/utils/initializeDefaultStorage.ts +0 -26
  69. package/src/utils/numbers/fuzzyCompareNumbers.test.ts +0 -16
  70. package/src/utils/numbers/fuzzyCompareNumbers.ts +0 -21
  71. package/src/utils/numbers/fuzzyLayoutsEqual.ts +0 -22
  72. package/src/utils/numbers/fuzzyNumbersEqual.ts +0 -9
  73. package/src/utils/rects/getIntersectingRectangle.test.ts +0 -198
  74. package/src/utils/rects/getIntersectingRectangle.ts +0 -28
  75. package/src/utils/rects/intersects.test.ts +0 -197
  76. package/src/utils/rects/intersects.ts +0 -23
  77. package/src/utils/rects/types.ts +0 -6
  78. package/src/utils/resizePanel.test.ts +0 -59
  79. package/src/utils/resizePanel.ts +0 -47
  80. package/src/utils/serialization.ts +0 -87
  81. package/src/utils/test-utils.ts +0 -205
  82. package/src/utils/validatePanelConstraints.test.ts +0 -143
  83. package/src/utils/validatePanelConstraints.ts +0 -69
  84. package/src/utils/validatePanelGroupLayout.test.ts +0 -148
  85. package/src/utils/validatePanelGroupLayout.ts +0 -95
  86. package/src/vendor/react.ts +0 -73
  87. package/src/vendor/stacking-order.ts +0 -139
@@ -1,42 +0,0 @@
1
- import { PanelConstraints, PanelData } from "./Panel";
2
- import { CSSProperties, createContext } from "./vendor/react";
3
-
4
- // The "contextmenu" event is not supported as a PointerEvent in all browsers yet, so MouseEvent still need to be handled
5
- export type ResizeEvent = KeyboardEvent | PointerEvent | MouseEvent;
6
- export type ResizeHandler = (event: ResizeEvent) => void;
7
-
8
- export type DragState = {
9
- dragHandleId: string;
10
- dragHandleRect: DOMRect;
11
- initialCursorPosition: number;
12
- initialLayout: number[];
13
- };
14
-
15
- export type TPanelGroupContext = {
16
- collapsePanel: (panelData: PanelData) => void;
17
- direction: "horizontal" | "vertical";
18
- dragState: DragState | null;
19
- expandPanel: (panelData: PanelData, minSizeOverride?: number) => void;
20
- getPanelSize: (panelData: PanelData) => number;
21
- getPanelStyle: (
22
- panelData: PanelData,
23
- defaultSize: number | undefined
24
- ) => CSSProperties;
25
- groupId: string;
26
- isPanelCollapsed: (panelData: PanelData) => boolean;
27
- isPanelExpanded: (panelData: PanelData) => boolean;
28
- reevaluatePanelConstraints: (
29
- panelData: PanelData,
30
- prevConstraints: PanelConstraints
31
- ) => void;
32
- registerPanel: (panelData: PanelData) => void;
33
- registerResizeHandle: (dragHandleId: string) => ResizeHandler;
34
- resizePanel: (panelData: PanelData, size: number) => void;
35
- startDragging: (dragHandleId: string, event: ResizeEvent) => void;
36
- stopDragging: () => void;
37
- unregisterPanel: (panelData: PanelData) => void;
38
- panelGroupElement: ParentNode | null;
39
- };
40
- export const PanelGroupContext = createContext<TPanelGroupContext | null>(null);
41
-
42
- PanelGroupContext.displayName = "PanelGroupContext";
@@ -1,367 +0,0 @@
1
- import { Root, createRoot } from "react-dom/client";
2
- import { act } from "react-dom/test-utils";
3
- import {
4
- Panel,
5
- PanelGroup,
6
- PanelResizeHandle,
7
- type PanelResizeHandleProps,
8
- } from ".";
9
- import { assert } from "./utils/assert";
10
- import * as cursorUtils from "./utils/cursor";
11
- import { getResizeHandleElement } from "./utils/dom/getResizeHandleElement";
12
- import {
13
- dispatchPointerEvent,
14
- mockBoundingClientRect,
15
- verifyAttribute,
16
- } from "./utils/test-utils";
17
-
18
- jest.mock("./utils/cursor", () => ({
19
- getCursorStyle: jest.fn(),
20
- resetGlobalCursorStyle: jest.fn(),
21
- setGlobalCursorStyle: jest.fn(),
22
- }));
23
-
24
- describe("PanelResizeHandle", () => {
25
- let expectedWarnings: string[] = [];
26
- let root: Root;
27
- let container: HTMLElement;
28
-
29
- beforeEach(() => {
30
- // @ts-expect-error
31
- global.IS_REACT_ACT_ENVIRONMENT = true;
32
- container = document.createElement("div");
33
- document.body.appendChild(container);
34
-
35
- expectedWarnings = [];
36
- root = createRoot(container);
37
-
38
- jest.spyOn(console, "warn").mockImplementation((actualMessage: string) => {
39
- const match = expectedWarnings.findIndex((expectedMessage) => {
40
- return actualMessage.includes(expectedMessage);
41
- });
42
-
43
- if (match >= 0) {
44
- expectedWarnings.splice(match, 1);
45
- return;
46
- }
47
-
48
- throw Error(`Unexpected warning: ${actualMessage}`);
49
- });
50
- });
51
-
52
- afterEach(() => {
53
- jest.clearAllMocks();
54
- jest.resetModules();
55
-
56
- act(() => {
57
- root.unmount();
58
- });
59
-
60
- expect(expectedWarnings).toHaveLength(0);
61
- });
62
-
63
- it("should support ...rest attributes", () => {
64
- act(() => {
65
- root.render(
66
- <PanelGroup direction="horizontal">
67
- <Panel />
68
- <PanelResizeHandle
69
- data-test-name="foo"
70
- id="handle"
71
- tabIndex={123}
72
- title="bar"
73
- />
74
- <Panel />
75
- </PanelGroup>
76
- );
77
- });
78
-
79
- const element = getResizeHandleElement("handle", container);
80
- assert(element, "");
81
- expect(element.tabIndex).toBe(123);
82
- expect(element.getAttribute("data-test-name")).toBe("foo");
83
- expect(element.title).toBe("bar");
84
- });
85
-
86
- function setupMockedGroup({
87
- leftProps = {},
88
- rightProps = {},
89
- }: {
90
- leftProps?: Partial<PanelResizeHandleProps>;
91
- rightProps?: Partial<PanelResizeHandleProps>;
92
- } = {}) {
93
- act(() => {
94
- root.render(
95
- <PanelGroup direction="horizontal" id="test-group">
96
- <Panel />
97
- <PanelResizeHandle id="handle-left" tabIndex={1} {...leftProps} />
98
- <Panel />
99
- <PanelResizeHandle id="handle-right" tabIndex={2} {...rightProps} />
100
- <Panel />
101
- </PanelGroup>
102
- );
103
- });
104
-
105
- const leftElement = getResizeHandleElement("handle-left", container);
106
- const rightElement = getResizeHandleElement("handle-right", container);
107
-
108
- assert(leftElement, "");
109
- assert(rightElement, "");
110
-
111
- // JSDom doesn't properly handle bounding rects
112
- mockBoundingClientRect(leftElement, {
113
- x: 50,
114
- y: 0,
115
- height: 50,
116
- width: 2,
117
- });
118
- mockBoundingClientRect(rightElement, {
119
- x: 100,
120
- y: 0,
121
- height: 50,
122
- width: 2,
123
- });
124
-
125
- return {
126
- leftElement,
127
- rightElement,
128
- };
129
- }
130
-
131
- describe("callbacks", () => {
132
- describe("onDragging", () => {
133
- it("should fire when dragging starts/stops", () => {
134
- const onDragging = jest.fn();
135
-
136
- const { leftElement } = setupMockedGroup({
137
- leftProps: { onDragging },
138
- });
139
-
140
- act(() => {
141
- dispatchPointerEvent("pointermove", leftElement);
142
- });
143
- expect(onDragging).not.toHaveBeenCalled();
144
-
145
- act(() => {
146
- dispatchPointerEvent("pointerdown", leftElement);
147
- });
148
- expect(onDragging).toHaveBeenCalledTimes(1);
149
- expect(onDragging).toHaveBeenCalledWith(true);
150
-
151
- act(() => {
152
- dispatchPointerEvent("pointerup", leftElement);
153
- });
154
- expect(onDragging).toHaveBeenCalledTimes(2);
155
- expect(onDragging).toHaveBeenCalledWith(false);
156
- });
157
-
158
- it("should only fire for the handle that has been dragged", () => {
159
- const onDraggingLeft = jest.fn();
160
- const onDraggingRight = jest.fn();
161
-
162
- const { leftElement } = setupMockedGroup({
163
- leftProps: { onDragging: onDraggingLeft },
164
- rightProps: { onDragging: onDraggingRight },
165
- });
166
-
167
- act(() => {
168
- dispatchPointerEvent("pointermove", leftElement);
169
- });
170
- expect(onDraggingLeft).not.toHaveBeenCalled();
171
- expect(onDraggingRight).not.toHaveBeenCalled();
172
-
173
- act(() => {
174
- dispatchPointerEvent("pointerdown", leftElement);
175
- });
176
- expect(onDraggingLeft).toHaveBeenCalledTimes(1);
177
- expect(onDraggingLeft).toHaveBeenCalledWith(true);
178
- expect(onDraggingRight).not.toHaveBeenCalled();
179
-
180
- act(() => {
181
- dispatchPointerEvent("pointerup", leftElement);
182
- });
183
- expect(onDraggingLeft).toHaveBeenCalledTimes(2);
184
- expect(onDraggingLeft).toHaveBeenCalledWith(false);
185
- expect(onDraggingRight).not.toHaveBeenCalled();
186
- });
187
- });
188
- });
189
-
190
- describe("data attributes", () => {
191
- it("should initialize with the correct props based attributes", () => {
192
- const { leftElement, rightElement } = setupMockedGroup();
193
-
194
- verifyAttribute(leftElement, "data-panel-group-id", "test-group");
195
- verifyAttribute(leftElement, "data-resize-handle", "");
196
- verifyAttribute(leftElement, "data-panel-group-direction", "horizontal");
197
- verifyAttribute(leftElement, "data-panel-resize-handle-enabled", "true");
198
- verifyAttribute(
199
- leftElement,
200
- "data-panel-resize-handle-id",
201
- "handle-left"
202
- );
203
-
204
- verifyAttribute(rightElement, "data-panel-group-id", "test-group");
205
- verifyAttribute(rightElement, "data-resize-handle", "");
206
- verifyAttribute(rightElement, "data-panel-group-direction", "horizontal");
207
- verifyAttribute(rightElement, "data-panel-resize-handle-enabled", "true");
208
- verifyAttribute(
209
- rightElement,
210
- "data-panel-resize-handle-id",
211
- "handle-right"
212
- );
213
- });
214
-
215
- it("should update data-resize-handle-active and data-resize-handle-state when dragging starts/stops", () => {
216
- const { leftElement, rightElement } = setupMockedGroup();
217
- verifyAttribute(leftElement, "data-resize-handle-active", null);
218
- verifyAttribute(rightElement, "data-resize-handle-active", null);
219
- verifyAttribute(leftElement, "data-resize-handle-state", "inactive");
220
- verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
221
-
222
- act(() => {
223
- dispatchPointerEvent("pointermove", leftElement);
224
- });
225
- verifyAttribute(leftElement, "data-resize-handle-active", null);
226
- verifyAttribute(rightElement, "data-resize-handle-active", null);
227
- verifyAttribute(leftElement, "data-resize-handle-state", "hover");
228
- verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
229
-
230
- act(() => {
231
- dispatchPointerEvent("pointerdown", leftElement);
232
- });
233
- verifyAttribute(leftElement, "data-resize-handle-active", "pointer");
234
- verifyAttribute(rightElement, "data-resize-handle-active", null);
235
- verifyAttribute(leftElement, "data-resize-handle-state", "drag");
236
- verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
237
-
238
- act(() => {
239
- dispatchPointerEvent("pointermove", leftElement);
240
- });
241
- verifyAttribute(leftElement, "data-resize-handle-active", "pointer");
242
- verifyAttribute(rightElement, "data-resize-handle-active", null);
243
- verifyAttribute(leftElement, "data-resize-handle-state", "drag");
244
- verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
245
-
246
- act(() => {
247
- dispatchPointerEvent("pointerup", leftElement);
248
- });
249
- verifyAttribute(leftElement, "data-resize-handle-active", null);
250
- verifyAttribute(rightElement, "data-resize-handle-active", null);
251
- verifyAttribute(leftElement, "data-resize-handle-state", "hover");
252
- verifyAttribute(rightElement, "data-resize-handle-state", "inactive");
253
-
254
- act(() => {
255
- dispatchPointerEvent("pointermove", rightElement);
256
- });
257
- verifyAttribute(leftElement, "data-resize-handle-active", null);
258
- verifyAttribute(rightElement, "data-resize-handle-active", null);
259
- verifyAttribute(leftElement, "data-resize-handle-state", "inactive");
260
- verifyAttribute(rightElement, "data-resize-handle-state", "hover");
261
- });
262
-
263
- it("should update data-resize-handle-active when focused", () => {
264
- const { leftElement, rightElement } = setupMockedGroup();
265
- verifyAttribute(leftElement, "data-resize-handle-active", null);
266
- verifyAttribute(rightElement, "data-resize-handle-active", null);
267
-
268
- act(() => {
269
- leftElement.focus();
270
- });
271
- expect(document.activeElement).toBe(leftElement);
272
- verifyAttribute(leftElement, "data-resize-handle-active", "keyboard");
273
- verifyAttribute(rightElement, "data-resize-handle-active", null);
274
-
275
- act(() => {
276
- leftElement.blur();
277
- });
278
- expect(document.activeElement).not.toBe(leftElement);
279
- verifyAttribute(leftElement, "data-resize-handle-active", null);
280
- verifyAttribute(rightElement, "data-resize-handle-active", null);
281
- });
282
- });
283
-
284
- describe("a11y", () => {
285
- it("should pass explicit id prop to DOM", () => {
286
- act(() => {
287
- root.render(
288
- <PanelGroup direction="horizontal">
289
- <Panel />
290
- <PanelResizeHandle id="explicit-id" />
291
- <Panel />
292
- </PanelGroup>
293
- );
294
- });
295
-
296
- const element = container.querySelector("[data-resize-handle]");
297
-
298
- expect(element).not.toBeNull();
299
- expect(element?.getAttribute("id")).toBe("explicit-id");
300
- });
301
-
302
- it("should not pass auto-generated id prop to DOM", () => {
303
- act(() => {
304
- root.render(
305
- <PanelGroup direction="horizontal">
306
- <Panel />
307
- <PanelResizeHandle />
308
- <Panel />
309
- </PanelGroup>
310
- );
311
- });
312
-
313
- const element = container.querySelector("[data-resize-handle]");
314
-
315
- expect(element).not.toBeNull();
316
- expect(element?.getAttribute("id")).toBeNull();
317
- });
318
- });
319
-
320
- it("resets the global cursor style on unmount", () => {
321
- const onDraggingLeft = jest.fn();
322
-
323
- const { leftElement } = setupMockedGroup({
324
- leftProps: { onDragging: onDraggingLeft },
325
- rightProps: {},
326
- });
327
-
328
- act(() => {
329
- dispatchPointerEvent("pointermove", leftElement);
330
- });
331
-
332
- act(() => {
333
- dispatchPointerEvent("pointerdown", leftElement);
334
- });
335
- expect(onDraggingLeft).toHaveBeenCalledTimes(1);
336
- expect(onDraggingLeft).toHaveBeenCalledWith(true);
337
-
338
- expect(cursorUtils.resetGlobalCursorStyle).not.toHaveBeenCalled();
339
- expect(cursorUtils.setGlobalCursorStyle).toHaveBeenCalled();
340
-
341
- onDraggingLeft.mockReset();
342
-
343
- act(() => {
344
- dispatchPointerEvent("pointermove", leftElement);
345
- });
346
- expect(onDraggingLeft).not.toHaveBeenCalled();
347
-
348
- act(() => {
349
- dispatchPointerEvent("pointerup", leftElement);
350
- });
351
- expect(onDraggingLeft).toHaveBeenCalledTimes(1);
352
- expect(onDraggingLeft).toHaveBeenCalledWith(false);
353
-
354
- onDraggingLeft.mockReset();
355
-
356
- act(() => {
357
- dispatchPointerEvent("pointermove", leftElement);
358
- });
359
- expect(onDraggingLeft).not.toHaveBeenCalled();
360
-
361
- act(() => {
362
- root.unmount();
363
- });
364
-
365
- expect(cursorUtils.resetGlobalCursorStyle).toHaveBeenCalled();
366
- });
367
- });
@@ -1,246 +0,0 @@
1
- import useIsomorphicLayoutEffect from "./hooks/useIsomorphicEffect";
2
- import useUniqueId from "./hooks/useUniqueId";
3
- import { useWindowSplitterResizeHandlerBehavior } from "./hooks/useWindowSplitterBehavior";
4
- import {
5
- PanelGroupContext,
6
- ResizeEvent,
7
- ResizeHandler,
8
- } from "./PanelGroupContext";
9
- import {
10
- PointerHitAreaMargins,
11
- registerResizeHandle,
12
- ResizeHandlerAction,
13
- } from "./PanelResizeHandleRegistry";
14
- import { assert } from "./utils/assert";
15
- import {
16
- createElement,
17
- CSSProperties,
18
- HTMLAttributes,
19
- PropsWithChildren,
20
- ReactElement,
21
- useContext,
22
- useEffect,
23
- useRef,
24
- useState,
25
- } from "./vendor/react";
26
-
27
- export type PanelResizeHandleOnDragging = (isDragging: boolean) => void;
28
- export type ResizeHandlerState = "drag" | "hover" | "inactive";
29
-
30
- export type PanelResizeHandleProps = Omit<
31
- HTMLAttributes<keyof HTMLElementTagNameMap>,
32
- "id" | "onBlur" | "onFocus"
33
- > &
34
- PropsWithChildren<{
35
- className?: string;
36
- disabled?: boolean;
37
- hitAreaMargins?: PointerHitAreaMargins;
38
- id?: string | null;
39
- onBlur?: () => void;
40
- onDragging?: PanelResizeHandleOnDragging;
41
- onFocus?: () => void;
42
- style?: CSSProperties;
43
- tabIndex?: number;
44
- tagName?: keyof HTMLElementTagNameMap;
45
- }>;
46
-
47
- export function PanelResizeHandle({
48
- children = null,
49
- className: classNameFromProps = "",
50
- disabled = false,
51
- hitAreaMargins,
52
- id: idFromProps,
53
- onBlur,
54
- onDragging,
55
- onFocus,
56
- style: styleFromProps = {},
57
- tabIndex = 0,
58
- tagName: Type = "div",
59
- ...rest
60
- }: PanelResizeHandleProps): ReactElement {
61
- const elementRef = useRef<HTMLElement>(null);
62
-
63
- // Use a ref to guard against users passing inline props
64
- const callbacksRef = useRef<{
65
- onDragging: PanelResizeHandleOnDragging | undefined;
66
- }>({ onDragging });
67
- useEffect(() => {
68
- callbacksRef.current.onDragging = onDragging;
69
- });
70
-
71
- const panelGroupContext = useContext(PanelGroupContext);
72
- if (panelGroupContext === null) {
73
- throw Error(
74
- `PanelResizeHandle components must be rendered within a PanelGroup container`
75
- );
76
- }
77
-
78
- const {
79
- direction,
80
- groupId,
81
- registerResizeHandle: registerResizeHandleWithParentGroup,
82
- startDragging,
83
- stopDragging,
84
- panelGroupElement,
85
- } = panelGroupContext;
86
-
87
- const resizeHandleId = useUniqueId(idFromProps);
88
-
89
- const [state, setState] = useState<ResizeHandlerState>("inactive");
90
-
91
- const [isFocused, setIsFocused] = useState(false);
92
-
93
- const [resizeHandler, setResizeHandler] = useState<ResizeHandler | null>(
94
- null
95
- );
96
-
97
- const committedValuesRef = useRef<{
98
- state: ResizeHandlerState;
99
- }>({
100
- state,
101
- });
102
-
103
- useIsomorphicLayoutEffect(() => {
104
- committedValuesRef.current.state = state;
105
- });
106
-
107
- useEffect(() => {
108
- if (disabled) {
109
- setResizeHandler(null);
110
- } else {
111
- const resizeHandler = registerResizeHandleWithParentGroup(resizeHandleId);
112
- setResizeHandler(() => resizeHandler);
113
- }
114
- }, [disabled, resizeHandleId, registerResizeHandleWithParentGroup]);
115
-
116
- // Extract hit area margins before passing them to the effect's dependency array
117
- // so that inline object values won't trigger re-renders
118
- const coarseHitAreaMargins = hitAreaMargins?.coarse ?? 15;
119
- const fineHitAreaMargins = hitAreaMargins?.fine ?? 5;
120
-
121
- useEffect(() => {
122
- if (disabled || resizeHandler == null) {
123
- return;
124
- }
125
-
126
- const element = elementRef.current;
127
- assert(element, "Element ref not attached");
128
-
129
- const setResizeHandlerState = (
130
- action: ResizeHandlerAction,
131
- isActive: boolean,
132
- event: ResizeEvent | null
133
- ) => {
134
- if (isActive) {
135
- switch (action) {
136
- case "down": {
137
- setState("drag");
138
-
139
- assert(event, 'Expected event to be defined for "down" action');
140
-
141
- startDragging(resizeHandleId, event);
142
-
143
- const { onDragging } = callbacksRef.current;
144
- if (onDragging) {
145
- onDragging(true);
146
- }
147
- break;
148
- }
149
- case "move": {
150
- const { state } = committedValuesRef.current;
151
-
152
- if (state !== "drag") {
153
- setState("hover");
154
- }
155
-
156
- assert(event, 'Expected event to be defined for "move" action');
157
-
158
- resizeHandler(event);
159
- break;
160
- }
161
- case "up": {
162
- setState("hover");
163
-
164
- stopDragging();
165
-
166
- const { onDragging } = callbacksRef.current;
167
- if (onDragging) {
168
- onDragging(false);
169
- }
170
- break;
171
- }
172
- }
173
- } else {
174
- setState("inactive");
175
- }
176
- };
177
-
178
- return registerResizeHandle(
179
- resizeHandleId,
180
- element,
181
- direction,
182
- {
183
- coarse: coarseHitAreaMargins,
184
- fine: fineHitAreaMargins,
185
- },
186
- setResizeHandlerState
187
- );
188
- }, [
189
- coarseHitAreaMargins,
190
- direction,
191
- disabled,
192
- fineHitAreaMargins,
193
- registerResizeHandleWithParentGroup,
194
- resizeHandleId,
195
- resizeHandler,
196
- startDragging,
197
- stopDragging,
198
- ]);
199
-
200
- useWindowSplitterResizeHandlerBehavior({
201
- disabled,
202
- handleId: resizeHandleId,
203
- resizeHandler,
204
- panelGroupElement,
205
- });
206
-
207
- const style: CSSProperties = {
208
- touchAction: "none",
209
- userSelect: "none",
210
- };
211
-
212
- return createElement(Type, {
213
- ...rest,
214
-
215
- children,
216
- className: classNameFromProps,
217
- id: idFromProps,
218
- onBlur: () => {
219
- setIsFocused(false);
220
- onBlur?.();
221
- },
222
- onFocus: () => {
223
- setIsFocused(true);
224
- onFocus?.();
225
- },
226
- ref: elementRef,
227
- role: "separator",
228
- style: {
229
- ...style,
230
- ...styleFromProps,
231
- },
232
- tabIndex,
233
-
234
- // CSS selectors
235
- "data-panel-group-direction": direction,
236
- "data-panel-group-id": groupId,
237
- "data-resize-handle": "",
238
- "data-resize-handle-active":
239
- state === "drag" ? "pointer" : isFocused ? "keyboard" : undefined,
240
- "data-resize-handle-state": state,
241
- "data-panel-resize-handle-enabled": !disabled,
242
- "data-panel-resize-handle-id": resizeHandleId,
243
- });
244
- }
245
-
246
- PanelResizeHandle.displayName = "PanelResizeHandle";