react-resizable-panels 2.1.5 → 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 (89) hide show
  1. package/dist/declarations/src/PanelGroup.d.ts +2 -0
  2. package/dist/react-resizable-panels.browser.cjs.js +16 -10
  3. package/dist/react-resizable-panels.browser.development.cjs.js +16 -10
  4. package/dist/react-resizable-panels.browser.development.esm.js +16 -10
  5. package/dist/react-resizable-panels.browser.esm.js +16 -10
  6. package/dist/react-resizable-panels.cjs.js +16 -10
  7. package/dist/react-resizable-panels.development.cjs.js +16 -10
  8. package/dist/react-resizable-panels.development.esm.js +16 -10
  9. package/dist/react-resizable-panels.development.node.cjs.js +16 -10
  10. package/dist/react-resizable-panels.development.node.esm.js +16 -10
  11. package/dist/react-resizable-panels.esm.js +16 -10
  12. package/dist/react-resizable-panels.node.cjs.js +16 -10
  13. package/dist/react-resizable-panels.node.esm.js +16 -10
  14. package/package.json +7 -1
  15. package/.eslintrc.cjs +0 -27
  16. package/CHANGELOG.md +0 -569
  17. package/jest.config.js +0 -10
  18. package/react-resizable-panels-2.1.5.tgz +0 -0
  19. package/src/Panel.test.tsx +0 -1084
  20. package/src/Panel.ts +0 -259
  21. package/src/PanelGroup.test.tsx +0 -443
  22. package/src/PanelGroup.ts +0 -985
  23. package/src/PanelGroupContext.ts +0 -42
  24. package/src/PanelResizeHandle.test.tsx +0 -367
  25. package/src/PanelResizeHandle.ts +0 -246
  26. package/src/PanelResizeHandleRegistry.ts +0 -336
  27. package/src/constants.ts +0 -1
  28. package/src/env-conditions/browser.ts +0 -1
  29. package/src/env-conditions/development.ts +0 -1
  30. package/src/env-conditions/node.ts +0 -1
  31. package/src/env-conditions/production.ts +0 -1
  32. package/src/env-conditions/unknown.ts +0 -1
  33. package/src/hooks/useForceUpdate.ts +0 -7
  34. package/src/hooks/useIsomorphicEffect.ts +0 -8
  35. package/src/hooks/useUniqueId.ts +0 -19
  36. package/src/hooks/useWindowSplitterBehavior.ts +0 -90
  37. package/src/hooks/useWindowSplitterPanelGroupBehavior.ts +0 -201
  38. package/src/index.ts +0 -77
  39. package/src/types.ts +0 -5
  40. package/src/utils/adjustLayoutByDelta.test.ts +0 -2061
  41. package/src/utils/adjustLayoutByDelta.ts +0 -308
  42. package/src/utils/arrays.ts +0 -13
  43. package/src/utils/assert.ts +0 -10
  44. package/src/utils/calculateAriaValues.test.ts +0 -106
  45. package/src/utils/calculateAriaValues.ts +0 -45
  46. package/src/utils/calculateDeltaPercentage.ts +0 -63
  47. package/src/utils/calculateDragOffsetPercentage.ts +0 -40
  48. package/src/utils/calculateUnsafeDefaultLayout.test.ts +0 -87
  49. package/src/utils/calculateUnsafeDefaultLayout.ts +0 -50
  50. package/src/utils/callPanelCallbacks.ts +0 -49
  51. package/src/utils/compareLayouts.test.ts +0 -9
  52. package/src/utils/compareLayouts.ts +0 -12
  53. package/src/utils/computePanelFlexBoxStyle.test.ts +0 -123
  54. package/src/utils/computePanelFlexBoxStyle.ts +0 -50
  55. package/src/utils/csp.ts +0 -9
  56. package/src/utils/cursor.ts +0 -103
  57. package/src/utils/debounce.ts +0 -18
  58. package/src/utils/determinePivotIndices.ts +0 -15
  59. package/src/utils/dom/getPanelElement.ts +0 -10
  60. package/src/utils/dom/getPanelElementsForGroup.ts +0 -8
  61. package/src/utils/dom/getPanelGroupElement.ts +0 -21
  62. package/src/utils/dom/getResizeHandleElement.ts +0 -10
  63. package/src/utils/dom/getResizeHandleElementIndex.ts +0 -13
  64. package/src/utils/dom/getResizeHandleElementsForGroup.ts +0 -10
  65. package/src/utils/dom/getResizeHandlePanelIds.ts +0 -19
  66. package/src/utils/events/getResizeEventCoordinates.ts +0 -23
  67. package/src/utils/events/getResizeEventCursorPosition.ts +0 -14
  68. package/src/utils/events/index.ts +0 -13
  69. package/src/utils/getInputType.ts +0 -5
  70. package/src/utils/initializeDefaultStorage.ts +0 -26
  71. package/src/utils/numbers/fuzzyCompareNumbers.test.ts +0 -16
  72. package/src/utils/numbers/fuzzyCompareNumbers.ts +0 -21
  73. package/src/utils/numbers/fuzzyLayoutsEqual.ts +0 -22
  74. package/src/utils/numbers/fuzzyNumbersEqual.ts +0 -9
  75. package/src/utils/rects/getIntersectingRectangle.test.ts +0 -198
  76. package/src/utils/rects/getIntersectingRectangle.ts +0 -28
  77. package/src/utils/rects/intersects.test.ts +0 -197
  78. package/src/utils/rects/intersects.ts +0 -23
  79. package/src/utils/rects/types.ts +0 -6
  80. package/src/utils/resizePanel.test.ts +0 -59
  81. package/src/utils/resizePanel.ts +0 -47
  82. package/src/utils/serialization.ts +0 -87
  83. package/src/utils/test-utils.ts +0 -205
  84. package/src/utils/validatePanelConstraints.test.ts +0 -143
  85. package/src/utils/validatePanelConstraints.ts +0 -69
  86. package/src/utils/validatePanelGroupLayout.test.ts +0 -148
  87. package/src/utils/validatePanelGroupLayout.ts +0 -95
  88. package/src/vendor/react.ts +0 -73
  89. 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";