react-resizable-panels 0.0.51 → 0.0.52
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.
- package/CHANGELOG.md +4 -0
- package/README.md +15 -14
- package/dist/declarations/src/Panel.d.ts +1 -0
- package/dist/declarations/src/types.d.ts +2 -1
- package/dist/react-resizable-panels.cjs.js +70 -41
- package/dist/react-resizable-panels.cjs.js.map +1 -0
- package/dist/react-resizable-panels.development.cjs.js +70 -41
- package/dist/react-resizable-panels.development.esm.js +70 -41
- package/dist/react-resizable-panels.esm.js +70 -41
- package/dist/react-resizable-panels.esm.js.map +1 -0
- package/package.json +1 -1
- package/src/Panel.ts +5 -0
- package/src/PanelGroup.ts +47 -35
- package/src/types.ts +2 -1
- package/src/utils/group.ts +20 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.0.52
|
|
4
|
+
* [162](https://github.com/bvaughn/react-resizable-panels/issues/162): Add `Panel.collapsedSize` property to allow panels to be collapsed to custom, non-0 sizes
|
|
5
|
+
* [161](https://github.com/bvaughn/react-resizable-panels/pull/161): Bug fix: `onResize` should be called for the initial `Panel` size regardless of the `onLayout` prop
|
|
6
|
+
|
|
3
7
|
## 0.0.51
|
|
4
8
|
* [154](https://github.com/bvaughn/react-resizable-panels/issues/154): `onResize` and `onCollapse` props are called in response to `PanelGroup.setLayout`
|
|
5
9
|
* [123](https://github.com/bvaughn/react-resizable-panels/issues/123): `onResize` called when number of panels in a group change due to conditional rendering
|
package/README.md
CHANGED
|
@@ -49,20 +49,21 @@ import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
|
|
|
49
49
|
| `setLayout(panelSizes: number[])` | Resize panel group to the specified _panelSizes_ (`[1 - 100, ...]`).
|
|
50
50
|
|
|
51
51
|
### `Panel`
|
|
52
|
-
| prop
|
|
53
|
-
|
|
|
54
|
-
| `children`
|
|
55
|
-
| `className`
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
52
|
+
| prop | type | description
|
|
53
|
+
| :-------------- | :------------------------------ | :---
|
|
54
|
+
| `children` | `ReactNode` | Arbitrary React element(s)
|
|
55
|
+
| `className` | `?string` | Class name to attach to root element
|
|
56
|
+
| `collapsedSize` | `?number=0` | Panel should collapse to this size
|
|
57
|
+
| `collapsible` | `?boolean=false` | Panel should collapse when resized beyond its `minSize`
|
|
58
|
+
| `defaultSize` | `?number` | Initial size of panel (numeric value between 1-100)
|
|
59
|
+
| `id` | `?string` | Panel id (unique within group); falls back to `useId` when not provided
|
|
60
|
+
| `maxSize` | `?number = 100` | Maximum allowable size of panel (numeric value between 1-100); defaults to `100`
|
|
61
|
+
| `minSize` | `?number = 10` | Minimum allowable size of panel (numeric value between 1-100); defaults to `10`
|
|
62
|
+
| `onCollapse` | `?(collapsed: boolean) => void` | Called when panel is collapsed; `collapsed` boolean parameter reflecting the new state
|
|
63
|
+
| `onResize` | `?(size: number) => void` | Called when panel is resized; `size` parameter is a numeric value between 1-100. <sup>1</sup>
|
|
64
|
+
| `order` | `?number` | Order of panel within group; required for groups with conditionally rendered panels
|
|
65
|
+
| `style` | `?CSSProperties` | CSS style to attach to root element
|
|
66
|
+
| `tagName` | `?string = "div"` | HTML element tag name for root element
|
|
66
67
|
|
|
67
68
|
<sup>1</sup>: If any `Panel` has an `onResize` callback, the `order` prop should be provided for all `Panel`s.
|
|
68
69
|
|
|
@@ -6,7 +6,7 @@ export type PanelGroupStorage = {
|
|
|
6
6
|
};
|
|
7
7
|
export type PanelGroupOnLayout = (sizes: number[]) => void;
|
|
8
8
|
export type PanelOnCollapse = (collapsed: boolean) => void;
|
|
9
|
-
export type PanelOnResize = (size: number) => void;
|
|
9
|
+
export type PanelOnResize = (size: number, prevSize: number) => void;
|
|
10
10
|
export type PanelResizeHandleOnDragging = (isDragging: boolean) => void;
|
|
11
11
|
export type PanelCallbackRef = RefObject<{
|
|
12
12
|
onCollapse: PanelOnCollapse | null;
|
|
@@ -15,6 +15,7 @@ export type PanelCallbackRef = RefObject<{
|
|
|
15
15
|
export type PanelData = {
|
|
16
16
|
current: {
|
|
17
17
|
callbacksRef: PanelCallbackRef;
|
|
18
|
+
collapsedSize: number;
|
|
18
19
|
collapsible: boolean;
|
|
19
20
|
defaultSize: number | null;
|
|
20
21
|
id: string;
|
|
@@ -69,6 +69,7 @@ PanelGroupContext.displayName = "PanelGroupContext";
|
|
|
69
69
|
function PanelWithForwardedRef({
|
|
70
70
|
children = null,
|
|
71
71
|
className: classNameFromProps = "",
|
|
72
|
+
collapsedSize = 0,
|
|
72
73
|
collapsible = false,
|
|
73
74
|
defaultSize = null,
|
|
74
75
|
forwardedRef,
|
|
@@ -126,6 +127,7 @@ function PanelWithForwardedRef({
|
|
|
126
127
|
});
|
|
127
128
|
const panelDataRef = useRef({
|
|
128
129
|
callbacksRef,
|
|
130
|
+
collapsedSize,
|
|
129
131
|
collapsible,
|
|
130
132
|
defaultSize,
|
|
131
133
|
id: panelId,
|
|
@@ -136,6 +138,7 @@ function PanelWithForwardedRef({
|
|
|
136
138
|
useIsomorphicLayoutEffect(() => {
|
|
137
139
|
committedValuesRef.current.size = parseSizeFromStyle(style);
|
|
138
140
|
panelDataRef.current.callbacksRef = callbacksRef;
|
|
141
|
+
panelDataRef.current.collapsedSize = collapsedSize;
|
|
139
142
|
panelDataRef.current.collapsible = collapsible;
|
|
140
143
|
panelDataRef.current.defaultSize = defaultSize;
|
|
141
144
|
panelDataRef.current.id = panelId;
|
|
@@ -285,6 +288,7 @@ function callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap) {
|
|
|
285
288
|
sizes.forEach((size, index) => {
|
|
286
289
|
const {
|
|
287
290
|
callbacksRef,
|
|
291
|
+
collapsedSize,
|
|
288
292
|
collapsible,
|
|
289
293
|
id
|
|
290
294
|
} = panelsArray[index].current;
|
|
@@ -296,14 +300,12 @@ function callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap) {
|
|
|
296
300
|
onResize
|
|
297
301
|
} = callbacksRef.current;
|
|
298
302
|
if (onResize) {
|
|
299
|
-
onResize(size);
|
|
303
|
+
onResize(size, lastNotifiedSize);
|
|
300
304
|
}
|
|
301
305
|
if (collapsible && onCollapse) {
|
|
302
|
-
|
|
303
|
-
// and initial size of undefined (when mounting)
|
|
304
|
-
if (!lastNotifiedSize && size !== 0) {
|
|
306
|
+
if ((lastNotifiedSize == null || lastNotifiedSize === collapsedSize) && size !== collapsedSize) {
|
|
305
307
|
onCollapse(false);
|
|
306
|
-
} else if (lastNotifiedSize !==
|
|
308
|
+
} else if (lastNotifiedSize !== collapsedSize && size === collapsedSize) {
|
|
307
309
|
onCollapse(true);
|
|
308
310
|
}
|
|
309
311
|
}
|
|
@@ -395,11 +397,17 @@ function panelsMapToSortedArray(panels) {
|
|
|
395
397
|
}
|
|
396
398
|
function safeResizePanel(panel, delta, prevSize, event) {
|
|
397
399
|
const nextSizeUnsafe = prevSize + delta;
|
|
398
|
-
|
|
399
|
-
|
|
400
|
+
const {
|
|
401
|
+
collapsedSize,
|
|
402
|
+
collapsible,
|
|
403
|
+
maxSize,
|
|
404
|
+
minSize
|
|
405
|
+
} = panel.current;
|
|
406
|
+
if (collapsible) {
|
|
407
|
+
if (prevSize > collapsedSize) {
|
|
400
408
|
// Mimic VS COde behavior; collapse a panel if it's smaller than half of its min-size
|
|
401
|
-
if (nextSizeUnsafe <=
|
|
402
|
-
return
|
|
409
|
+
if (nextSizeUnsafe <= minSize / 2 + collapsedSize) {
|
|
410
|
+
return collapsedSize;
|
|
403
411
|
}
|
|
404
412
|
} else {
|
|
405
413
|
const isKeyboardEvent = event?.type?.startsWith("key");
|
|
@@ -407,13 +415,13 @@ function safeResizePanel(panel, delta, prevSize, event) {
|
|
|
407
415
|
// Keyboard events should expand a collapsed panel to the min size,
|
|
408
416
|
// but mouse events should wait until the panel has reached its min size
|
|
409
417
|
// to avoid a visual flickering when dragging between collapsed and min size.
|
|
410
|
-
if (nextSizeUnsafe <
|
|
411
|
-
return
|
|
418
|
+
if (nextSizeUnsafe < minSize) {
|
|
419
|
+
return collapsedSize;
|
|
412
420
|
}
|
|
413
421
|
}
|
|
414
422
|
}
|
|
415
423
|
}
|
|
416
|
-
const nextSize = Math.min(
|
|
424
|
+
const nextSize = Math.min(maxSize, Math.max(minSize, nextSizeUnsafe));
|
|
417
425
|
return nextSize;
|
|
418
426
|
}
|
|
419
427
|
|
|
@@ -869,8 +877,8 @@ function PanelGroupWithForwardedRef({
|
|
|
869
877
|
} = committedValuesRef.current;
|
|
870
878
|
const panelIdToLastNotifiedSizeMap = panelIdToLastNotifiedSizeMapRef.current;
|
|
871
879
|
const panelsArray = panelsMapToSortedArray(panels);
|
|
872
|
-
callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap);
|
|
873
880
|
setSizes(sizes);
|
|
881
|
+
callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap);
|
|
874
882
|
}
|
|
875
883
|
}), []);
|
|
876
884
|
useIsomorphicLayoutEffect(() => {
|
|
@@ -892,25 +900,25 @@ function PanelGroupWithForwardedRef({
|
|
|
892
900
|
const {
|
|
893
901
|
onLayout
|
|
894
902
|
} = callbacksRef.current;
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
} = committedValuesRef.current;
|
|
903
|
+
const {
|
|
904
|
+
panels,
|
|
905
|
+
sizes
|
|
906
|
+
} = committedValuesRef.current;
|
|
900
907
|
|
|
901
|
-
|
|
902
|
-
|
|
908
|
+
// Don't commit layout until all panels have registered and re-rendered with their actual sizes.
|
|
909
|
+
if (sizes.length > 0) {
|
|
910
|
+
if (onLayout) {
|
|
903
911
|
onLayout(sizes);
|
|
904
|
-
const panelIdToLastNotifiedSizeMap = panelIdToLastNotifiedSizeMapRef.current;
|
|
905
|
-
|
|
906
|
-
// When possible, we notify before the next render so that rendering work can be batched together.
|
|
907
|
-
// Some cases are difficult to detect though,
|
|
908
|
-
// for example– panels that are conditionally rendered can affect the size of neighboring panels.
|
|
909
|
-
// In this case, the best we can do is notify on commit.
|
|
910
|
-
// The callPanelCallbacks() uses its own memoization to avoid notifying panels twice in these cases.
|
|
911
|
-
const panelsArray = panelsMapToSortedArray(panels);
|
|
912
|
-
callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap);
|
|
913
912
|
}
|
|
913
|
+
const panelIdToLastNotifiedSizeMap = panelIdToLastNotifiedSizeMapRef.current;
|
|
914
|
+
|
|
915
|
+
// When possible, we notify before the next render so that rendering work can be batched together.
|
|
916
|
+
// Some cases are difficult to detect though,
|
|
917
|
+
// for example– panels that are conditionally rendered can affect the size of neighboring panels.
|
|
918
|
+
// In this case, the best we can do is notify on commit.
|
|
919
|
+
// The callPanelCallbacks() uses its own memoization to avoid notifying panels twice in these cases.
|
|
920
|
+
const panelsArray = panelsMapToSortedArray(panels);
|
|
921
|
+
callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap);
|
|
914
922
|
}
|
|
915
923
|
}, [sizes]);
|
|
916
924
|
|
|
@@ -1075,10 +1083,11 @@ function PanelGroupWithForwardedRef({
|
|
|
1075
1083
|
}
|
|
1076
1084
|
if (sizesChanged) {
|
|
1077
1085
|
const panelIdToLastNotifiedSizeMap = panelIdToLastNotifiedSizeMapRef.current;
|
|
1086
|
+
setSizes(nextSizes);
|
|
1078
1087
|
|
|
1079
1088
|
// If resize change handlers have been declared, this is the time to call them.
|
|
1089
|
+
// Trigger user callbacks after updating state, so that user code can override the sizes.
|
|
1080
1090
|
callPanelCallbacks(panelsArray, nextSizes, panelIdToLastNotifiedSizeMap);
|
|
1081
|
-
setSizes(nextSizes);
|
|
1082
1091
|
}
|
|
1083
1092
|
prevDeltaRef.current = delta;
|
|
1084
1093
|
};
|
|
@@ -1100,7 +1109,14 @@ function PanelGroupWithForwardedRef({
|
|
|
1100
1109
|
sizes: prevSizes
|
|
1101
1110
|
} = committedValuesRef.current;
|
|
1102
1111
|
const panel = panels.get(id);
|
|
1103
|
-
if (panel == null
|
|
1112
|
+
if (panel == null) {
|
|
1113
|
+
return;
|
|
1114
|
+
}
|
|
1115
|
+
const {
|
|
1116
|
+
collapsedSize,
|
|
1117
|
+
collapsible
|
|
1118
|
+
} = panel.current;
|
|
1119
|
+
if (!collapsible) {
|
|
1104
1120
|
return;
|
|
1105
1121
|
}
|
|
1106
1122
|
const panelsArray = panelsMapToSortedArray(panels);
|
|
@@ -1109,7 +1125,7 @@ function PanelGroupWithForwardedRef({
|
|
|
1109
1125
|
return;
|
|
1110
1126
|
}
|
|
1111
1127
|
const currentSize = prevSizes[index];
|
|
1112
|
-
if (currentSize ===
|
|
1128
|
+
if (currentSize === collapsedSize) {
|
|
1113
1129
|
// Panel is already collapsed.
|
|
1114
1130
|
return;
|
|
1115
1131
|
}
|
|
@@ -1119,14 +1135,15 @@ function PanelGroupWithForwardedRef({
|
|
|
1119
1135
|
return;
|
|
1120
1136
|
}
|
|
1121
1137
|
const isLastPanel = index === panelsArray.length - 1;
|
|
1122
|
-
const delta = isLastPanel ? currentSize :
|
|
1138
|
+
const delta = isLastPanel ? currentSize : collapsedSize - currentSize;
|
|
1123
1139
|
const nextSizes = adjustByDelta(null, panels, idBefore, idAfter, delta, prevSizes, panelSizeBeforeCollapse.current, null);
|
|
1124
1140
|
if (prevSizes !== nextSizes) {
|
|
1125
1141
|
const panelIdToLastNotifiedSizeMap = panelIdToLastNotifiedSizeMapRef.current;
|
|
1142
|
+
setSizes(nextSizes);
|
|
1126
1143
|
|
|
1127
1144
|
// If resize change handlers have been declared, this is the time to call them.
|
|
1145
|
+
// Trigger user callbacks after updating state, so that user code can override the sizes.
|
|
1128
1146
|
callPanelCallbacks(panelsArray, nextSizes, panelIdToLastNotifiedSizeMap);
|
|
1129
|
-
setSizes(nextSizes);
|
|
1130
1147
|
}
|
|
1131
1148
|
}, []);
|
|
1132
1149
|
const expandPanel = useCallback(id => {
|
|
@@ -1138,7 +1155,11 @@ function PanelGroupWithForwardedRef({
|
|
|
1138
1155
|
if (panel == null) {
|
|
1139
1156
|
return;
|
|
1140
1157
|
}
|
|
1141
|
-
const
|
|
1158
|
+
const {
|
|
1159
|
+
collapsedSize,
|
|
1160
|
+
minSize
|
|
1161
|
+
} = panel.current;
|
|
1162
|
+
const sizeBeforeCollapse = panelSizeBeforeCollapse.current.get(id) || minSize;
|
|
1142
1163
|
if (!sizeBeforeCollapse) {
|
|
1143
1164
|
return;
|
|
1144
1165
|
}
|
|
@@ -1148,7 +1169,7 @@ function PanelGroupWithForwardedRef({
|
|
|
1148
1169
|
return;
|
|
1149
1170
|
}
|
|
1150
1171
|
const currentSize = prevSizes[index];
|
|
1151
|
-
if (currentSize !==
|
|
1172
|
+
if (currentSize !== collapsedSize) {
|
|
1152
1173
|
// Panel is already expanded.
|
|
1153
1174
|
return;
|
|
1154
1175
|
}
|
|
@@ -1157,14 +1178,15 @@ function PanelGroupWithForwardedRef({
|
|
|
1157
1178
|
return;
|
|
1158
1179
|
}
|
|
1159
1180
|
const isLastPanel = index === panelsArray.length - 1;
|
|
1160
|
-
const delta = isLastPanel ?
|
|
1181
|
+
const delta = isLastPanel ? collapsedSize - sizeBeforeCollapse : sizeBeforeCollapse;
|
|
1161
1182
|
const nextSizes = adjustByDelta(null, panels, idBefore, idAfter, delta, prevSizes, panelSizeBeforeCollapse.current, null);
|
|
1162
1183
|
if (prevSizes !== nextSizes) {
|
|
1163
1184
|
const panelIdToLastNotifiedSizeMap = panelIdToLastNotifiedSizeMapRef.current;
|
|
1185
|
+
setSizes(nextSizes);
|
|
1164
1186
|
|
|
1165
1187
|
// If resize change handlers have been declared, this is the time to call them.
|
|
1188
|
+
// Trigger user callbacks after updating state, so that user code can override the sizes.
|
|
1166
1189
|
callPanelCallbacks(panelsArray, nextSizes, panelIdToLastNotifiedSizeMap);
|
|
1167
|
-
setSizes(nextSizes);
|
|
1168
1190
|
}
|
|
1169
1191
|
}, []);
|
|
1170
1192
|
const resizePanel = useCallback((id, nextSize) => {
|
|
@@ -1176,6 +1198,12 @@ function PanelGroupWithForwardedRef({
|
|
|
1176
1198
|
if (panel == null) {
|
|
1177
1199
|
return;
|
|
1178
1200
|
}
|
|
1201
|
+
const {
|
|
1202
|
+
collapsedSize,
|
|
1203
|
+
collapsible,
|
|
1204
|
+
maxSize,
|
|
1205
|
+
minSize
|
|
1206
|
+
} = panel.current;
|
|
1179
1207
|
const panelsArray = panelsMapToSortedArray(panels);
|
|
1180
1208
|
const index = panelsArray.indexOf(panel);
|
|
1181
1209
|
if (index < 0) {
|
|
@@ -1185,8 +1213,8 @@ function PanelGroupWithForwardedRef({
|
|
|
1185
1213
|
if (currentSize === nextSize) {
|
|
1186
1214
|
return;
|
|
1187
1215
|
}
|
|
1188
|
-
if (
|
|
1189
|
-
nextSize = Math.min(
|
|
1216
|
+
if (collapsible && nextSize === collapsedSize) ; else {
|
|
1217
|
+
nextSize = Math.min(maxSize, Math.max(minSize, nextSize));
|
|
1190
1218
|
}
|
|
1191
1219
|
const [idBefore, idAfter] = getBeforeAndAfterIds(id, panelsArray);
|
|
1192
1220
|
if (idBefore == null || idAfter == null) {
|
|
@@ -1197,10 +1225,11 @@ function PanelGroupWithForwardedRef({
|
|
|
1197
1225
|
const nextSizes = adjustByDelta(null, panels, idBefore, idAfter, delta, prevSizes, panelSizeBeforeCollapse.current, null);
|
|
1198
1226
|
if (prevSizes !== nextSizes) {
|
|
1199
1227
|
const panelIdToLastNotifiedSizeMap = panelIdToLastNotifiedSizeMapRef.current;
|
|
1228
|
+
setSizes(nextSizes);
|
|
1200
1229
|
|
|
1201
1230
|
// If resize change handlers have been declared, this is the time to call them.
|
|
1231
|
+
// Trigger user callbacks after updating state, so that user code can override the sizes.
|
|
1202
1232
|
callPanelCallbacks(panelsArray, nextSizes, panelIdToLastNotifiedSizeMap);
|
|
1203
|
-
setSizes(nextSizes);
|
|
1204
1233
|
}
|
|
1205
1234
|
}, []);
|
|
1206
1235
|
const context = useMemo(() => ({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"mappings":"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","sources":["packages/react-resizable-panels/src/index.ts","packages/react-resizable-panels/src/Panel.ts","packages/react-resizable-panels/src/hooks/useIsomorphicEffect.ts","packages/react-resizable-panels/src/vendor/react.ts","packages/react-resizable-panels/src/hooks/useUniqueId.ts","packages/react-resizable-panels/src/PanelContexts.ts","packages/react-resizable-panels/src/PanelGroup.ts","packages/react-resizable-panels/src/env-conditions/production.ts","packages/react-resizable-panels/src/hooks/useWindowSplitterBehavior.ts","packages/react-resizable-panels/src/constants.ts","packages/react-resizable-panels/src/utils/group.ts","packages/react-resizable-panels/src/utils/assert.ts","packages/react-resizable-panels/src/utils/arrays.ts","packages/react-resizable-panels/src/utils/coordinates.ts","packages/react-resizable-panels/src/utils/cursor.ts","packages/react-resizable-panels/src/utils/debounce.ts","packages/react-resizable-panels/src/utils/serialization.ts","packages/react-resizable-panels/src/utils/ssr.ts","packages/react-resizable-panels/src/PanelResizeHandle.ts"],"sourcesContent":["import { Panel } from \"./Panel\";\nimport { PanelGroup } from \"./PanelGroup\";\nimport { PanelResizeHandle } from \"./PanelResizeHandle\";\n\nimport type { ImperativePanelHandle, PanelProps } from \"./Panel\";\nimport type { ImperativePanelGroupHandle, PanelGroupProps } from \"./PanelGroup\";\nimport type { PanelResizeHandleProps } from \"./PanelResizeHandle\";\nimport type {\n PanelGroupOnLayout,\n PanelGroupStorage,\n PanelOnCollapse,\n PanelOnResize,\n PanelResizeHandleOnDragging,\n} from \"./types\";\n\nexport {\n // TypeScript types\n ImperativePanelGroupHandle,\n ImperativePanelHandle,\n Panel,\n PanelOnCollapse,\n PanelOnResize,\n PanelGroup,\n PanelGroupOnLayout,\n PanelGroupProps,\n PanelGroupStorage,\n PanelProps,\n PanelResizeHandle,\n PanelResizeHandleOnDragging,\n PanelResizeHandleProps,\n};\n","import useIsomorphicLayoutEffect from \"./hooks/useIsomorphicEffect\";\nimport useUniqueId from \"./hooks/useUniqueId\";\nimport {\n createElement,\n CSSProperties,\n ElementType,\n ForwardedRef,\n forwardRef,\n ReactNode,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"./vendor/react\";\n\nimport { PanelGroupContext } from \"./PanelContexts\";\nimport {\n PanelCallbackRef,\n PanelData,\n PanelOnCollapse,\n PanelOnResize,\n} from \"./types\";\n\nexport type PanelProps = {\n children?: ReactNode;\n className?: string;\n collapsedSize?: number;\n collapsible?: boolean;\n defaultSize?: number | null;\n id?: string | null;\n maxSize?: number;\n minSize?: number;\n onCollapse?: PanelOnCollapse | null;\n onResize?: PanelOnResize | null;\n order?: number | null;\n style?: CSSProperties;\n tagName?: ElementType;\n};\n\nexport type ImperativePanelHandle = {\n collapse: () => void;\n expand: () => void;\n getCollapsed(): boolean;\n getSize(): number;\n resize: (percentage: number) => void;\n};\n\nfunction PanelWithForwardedRef({\n children = null,\n className: classNameFromProps = \"\",\n collapsedSize = 0,\n collapsible = false,\n defaultSize = null,\n forwardedRef,\n id: idFromProps = null,\n maxSize = 100,\n minSize = 10,\n onCollapse = null,\n onResize = null,\n order = null,\n style: styleFromProps = {},\n tagName: Type = \"div\",\n}: PanelProps & {\n forwardedRef: ForwardedRef<ImperativePanelHandle>;\n}) {\n const context = useContext(PanelGroupContext);\n if (context === null) {\n throw Error(\n `Panel components must be rendered within a PanelGroup container`\n );\n }\n\n const panelId = useUniqueId(idFromProps);\n\n const {\n collapsePanel,\n expandPanel,\n getPanelStyle,\n registerPanel,\n resizePanel,\n unregisterPanel,\n } = context;\n\n // Use a ref to guard against users passing inline props\n const callbacksRef = useRef<{\n onCollapse: PanelOnCollapse | null;\n onResize: PanelOnResize | null;\n }>({ onCollapse, onResize });\n useEffect(() => {\n callbacksRef.current.onCollapse = onCollapse;\n callbacksRef.current.onResize = onResize;\n });\n\n // Basic props validation\n if (minSize < 0 || minSize > 100) {\n throw Error(`Panel minSize must be between 0 and 100, but was ${minSize}`);\n } else if (maxSize < 0 || maxSize > 100) {\n throw Error(`Panel maxSize must be between 0 and 100, but was ${maxSize}`);\n } else {\n if (defaultSize !== null) {\n if (defaultSize < 0 || defaultSize > 100) {\n throw Error(\n `Panel defaultSize must be between 0 and 100, but was ${defaultSize}`\n );\n } else if (minSize > defaultSize && !collapsible) {\n console.error(\n `Panel minSize ${minSize} cannot be greater than defaultSize ${defaultSize}`\n );\n\n defaultSize = minSize;\n }\n }\n }\n\n const style = getPanelStyle(panelId, defaultSize);\n\n const committedValuesRef = useRef<{\n size: number;\n }>({\n size: parseSizeFromStyle(style),\n });\n const panelDataRef = useRef<{\n callbacksRef: PanelCallbackRef;\n collapsedSize: number;\n collapsible: boolean;\n defaultSize: number | null;\n id: string;\n maxSize: number;\n minSize: number;\n order: number | null;\n }>({\n callbacksRef,\n collapsedSize,\n collapsible,\n defaultSize,\n id: panelId,\n maxSize,\n minSize,\n order,\n });\n useIsomorphicLayoutEffect(() => {\n committedValuesRef.current.size = parseSizeFromStyle(style);\n\n panelDataRef.current.callbacksRef = callbacksRef;\n panelDataRef.current.collapsedSize = collapsedSize;\n panelDataRef.current.collapsible = collapsible;\n panelDataRef.current.defaultSize = defaultSize;\n panelDataRef.current.id = panelId;\n panelDataRef.current.maxSize = maxSize;\n panelDataRef.current.minSize = minSize;\n panelDataRef.current.order = order;\n });\n\n useIsomorphicLayoutEffect(() => {\n registerPanel(panelId, panelDataRef as PanelData);\n\n return () => {\n unregisterPanel(panelId);\n };\n }, [order, panelId, registerPanel, unregisterPanel]);\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n collapse: () => collapsePanel(panelId),\n expand: () => expandPanel(panelId),\n getCollapsed() {\n return committedValuesRef.current.size === 0;\n },\n getSize() {\n return committedValuesRef.current.size;\n },\n resize: (percentage: number) => resizePanel(panelId, percentage),\n }),\n [collapsePanel, expandPanel, panelId, resizePanel]\n );\n\n return createElement(Type, {\n children,\n className: classNameFromProps,\n \"data-panel\": \"\",\n \"data-panel-collapsible\": collapsible || undefined,\n \"data-panel-id\": panelId,\n \"data-panel-size\": parseFloat(\"\" + style.flexGrow).toFixed(1),\n id: `data-panel-id-${panelId}`,\n style: {\n ...style,\n ...styleFromProps,\n },\n });\n}\n\nexport const Panel = forwardRef<ImperativePanelHandle, PanelProps>(\n (props: PanelProps, ref: ForwardedRef<ImperativePanelHandle>) =>\n createElement(PanelWithForwardedRef, { ...props, forwardedRef: ref })\n);\n\n// Workaround for Parcel scope hoisting (which renames objects/functions).\n// Casting to :any is required to avoid corrupting the generated TypeScript types.\n// See github.com/parcel-bundler/parcel/issues/8724\n(PanelWithForwardedRef as any).displayName = \"Panel\";\n(Panel as any).displayName = \"forwardRef(Panel)\";\n\n// HACK\nfunction parseSizeFromStyle(style: CSSProperties): number {\n const { flexGrow } = style;\n if (typeof flexGrow === \"string\") {\n return parseFloat(flexGrow);\n } else {\n return flexGrow as number;\n }\n}\n","import { useLayoutEffect } from \"../vendor/react\";\n\nconst canUseEffectHooks = !!(\n typeof window !== \"undefined\" &&\n typeof window.document !== \"undefined\" &&\n typeof window.document.createElement !== \"undefined\"\n);\n\nconst useIsomorphicLayoutEffect = canUseEffectHooks\n ? useLayoutEffect\n : () => {};\n\nexport default useIsomorphicLayoutEffect;\n","// This module exists to work around Webpack issue https://github.com/webpack/webpack/issues/14814\n// and limitations with ParcelJS parsing of the useId workaround (used below).\n// For the time being, all react-resizable-panels must import \"react\" with the \"* as React\" syntax.\n// To avoid mistakes, we use the ESLint \"no-restricted-imports\" to prevent \"react\" imports except in this file.\n// See https://github.com/bvaughn/react-resizable-panels/issues/118\n\n// eslint-disable-next-line no-restricted-imports\nimport * as React from \"react\";\n\n// eslint-disable-next-line no-restricted-imports\nimport type {\n CSSProperties,\n ElementType,\n ForwardedRef,\n MouseEvent,\n ReactNode,\n RefObject,\n TouchEvent,\n} from \"react\";\n\nconst {\n createElement,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} = React;\n\n// `toString()` prevents bundlers from trying to `import { useId } from 'react'`\nconst useId = (React as any)[\"useId\".toString()] as () => string;\n\nexport {\n createElement,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n};\n\nexport type {\n CSSProperties,\n ElementType,\n ForwardedRef,\n MouseEvent,\n ReactNode,\n RefObject,\n TouchEvent,\n};\n","import { useId, useRef } from \"../vendor/react\";\n\nconst wrappedUseId: () => string | null =\n typeof useId === \"function\" ? useId : (): null => null;\n\nlet counter = 0;\n\nexport default function useUniqueId(\n idFromParams: string | null = null\n): string {\n const idFromUseId = wrappedUseId();\n\n const idRef = useRef<string | null>(idFromParams || idFromUseId || null);\n if (idRef.current === null) {\n idRef.current = \"\" + counter++;\n }\n\n return idRef.current;\n}\n","import { CSSProperties, createContext } from \"./vendor/react\";\n\nimport { PanelData, ResizeEvent, ResizeHandler } from \"./types\";\n\nexport const PanelGroupContext = createContext<{\n activeHandleId: string | null;\n collapsePanel: (id: string) => void;\n direction: \"horizontal\" | \"vertical\";\n expandPanel: (id: string) => void;\n getPanelStyle: (id: string, defaultSize: number | null) => CSSProperties;\n groupId: string;\n registerPanel: (id: string, panel: PanelData) => void;\n registerResizeHandle: (id: string) => ResizeHandler;\n resizePanel: (id: string, percentage: number) => void;\n startDragging: (id: string, event: ResizeEvent) => void;\n stopDragging: () => void;\n unregisterPanel: (id: string) => void;\n} | null>(null);\n\n// Workaround for Parcel scope hoisting (which renames objects/functions).\n// Casting to :any is required to avoid corrupting the generated TypeScript types.\n// See github.com/parcel-bundler/parcel/issues/8724\n(PanelGroupContext as any).displayName = \"PanelGroupContext\";\n","import { isDevelopment } from \"#is-development\";\nimport {\n createElement,\n CSSProperties,\n ElementType,\n ForwardedRef,\n forwardRef,\n ReactNode,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"./vendor/react\";\n\nimport useIsomorphicLayoutEffect from \"./hooks/useIsomorphicEffect\";\nimport useUniqueId from \"./hooks/useUniqueId\";\nimport { useWindowSplitterPanelGroupBehavior } from \"./hooks/useWindowSplitterBehavior\";\nimport { PanelGroupContext } from \"./PanelContexts\";\nimport {\n Direction,\n PanelData,\n PanelGroupOnLayout,\n PanelGroupStorage,\n ResizeEvent,\n} from \"./types\";\nimport { areEqual } from \"./utils/arrays\";\nimport { assert } from \"./utils/assert\";\nimport {\n getDragOffset,\n getMovement,\n isMouseEvent,\n isTouchEvent,\n} from \"./utils/coordinates\";\nimport { resetGlobalCursorStyle, setGlobalCursorStyle } from \"./utils/cursor\";\nimport debounce from \"./utils/debounce\";\nimport {\n adjustByDelta,\n callPanelCallbacks,\n getBeforeAndAfterIds,\n getFlexGrow,\n getPanelGroup,\n getResizeHandle,\n getResizeHandlePanelIds,\n panelsMapToSortedArray,\n} from \"./utils/group\";\nimport { loadPanelLayout, savePanelGroupLayout } from \"./utils/serialization\";\nimport { isServerRendering } from \"./utils/ssr\";\n\nconst debounceMap: {\n [key: string]: (\n autoSaveId: string,\n panels: PanelData[],\n sizes: number[],\n storage: PanelGroupStorage\n ) => void;\n} = {};\n\n// PanelGroup might be rendering in a server-side environment where localStorage is not available\n// or on a browser with cookies/storage disabled.\n// In either case, this function avoids accessing localStorage until needed,\n// and avoids throwing user-visible errors.\nfunction initializeDefaultStorage(storageObject: PanelGroupStorage) {\n try {\n if (typeof localStorage !== \"undefined\") {\n // Bypass this check for future calls\n storageObject.getItem = (name: string) => {\n return localStorage.getItem(name);\n };\n storageObject.setItem = (name: string, value: string) => {\n localStorage.setItem(name, value);\n };\n } else {\n throw new Error(\"localStorage not supported in this environment\");\n }\n } catch (error) {\n console.error(error);\n\n storageObject.getItem = () => null;\n storageObject.setItem = () => {};\n }\n}\n\nconst defaultStorage: PanelGroupStorage = {\n getItem: (name: string) => {\n initializeDefaultStorage(defaultStorage);\n return defaultStorage.getItem(name);\n },\n setItem: (name: string, value: string) => {\n initializeDefaultStorage(defaultStorage);\n defaultStorage.setItem(name, value);\n },\n};\n\nexport type CommittedValues = {\n direction: Direction;\n panels: Map<string, PanelData>;\n sizes: number[];\n};\n\nexport type PanelDataMap = Map<string, PanelData>;\n\n// Initial drag state serves a few purposes:\n// * dragOffset:\n// Resize is calculated by the distance between the current pointer event and the resize handle being \"dragged\"\n// This value accounts for the initial offset when the touch/click starts, so the handle doesn't appear to \"jump\"\n// * dragHandleRect, sizes:\n// When resizing is done via mouse/touch event– some initial state is stored\n// so that any panels that contract will also expand if drag direction is reversed.\nexport type InitialDragState = {\n dragHandleRect: DOMRect;\n dragOffset: number;\n sizes: number[];\n};\n\n// TODO\n// Within an active drag, remember original positions to refine more easily on expand.\n// Look at what the Chrome devtools Sources does.\n\nexport type PanelGroupProps = {\n autoSaveId?: string;\n children?: ReactNode;\n className?: string;\n direction: Direction;\n disablePointerEventsDuringResize?: boolean;\n id?: string | null;\n onLayout?: PanelGroupOnLayout;\n storage?: PanelGroupStorage;\n style?: CSSProperties;\n tagName?: ElementType;\n};\n\nexport type ImperativePanelGroupHandle = {\n getLayout: () => number[];\n setLayout: (panelSizes: number[]) => void;\n};\n\nfunction PanelGroupWithForwardedRef({\n autoSaveId,\n children = null,\n className: classNameFromProps = \"\",\n direction,\n disablePointerEventsDuringResize = false,\n forwardedRef,\n id: idFromProps = null,\n onLayout,\n storage = defaultStorage,\n style: styleFromProps = {},\n tagName: Type = \"div\",\n}: PanelGroupProps & {\n forwardedRef: ForwardedRef<ImperativePanelGroupHandle>;\n}) {\n const groupId = useUniqueId(idFromProps);\n\n const [activeHandleId, setActiveHandleId] = useState<string | null>(null);\n const [panels, setPanels] = useState<PanelDataMap>(new Map());\n\n // When resizing is done via mouse/touch event–\n // We store the initial Panel sizes in this ref, and apply move deltas to them instead of to the current sizes.\n // This has the benefit of causing force-collapsed panels to spring back open if drag is reversed.\n const initialDragStateRef = useRef<InitialDragState | null>(null);\n\n // Use a ref to guard against users passing inline props\n const callbacksRef = useRef<{\n onLayout: PanelGroupOnLayout | undefined;\n }>({ onLayout });\n useEffect(() => {\n callbacksRef.current.onLayout = onLayout;\n });\n\n const panelIdToLastNotifiedSizeMapRef = useRef<Record<string, number>>({});\n\n // 0-1 values representing the relative size of each panel.\n const [sizes, setSizes] = useState<number[]>([]);\n\n // Used to support imperative collapse/expand API.\n const panelSizeBeforeCollapse = useRef<Map<string, number>>(new Map());\n\n const prevDeltaRef = useRef<number>(0);\n\n // Store committed values to avoid unnecessarily re-running memoization/effects functions.\n const committedValuesRef = useRef<CommittedValues>({\n direction,\n panels,\n sizes,\n });\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n getLayout: () => {\n const { sizes } = committedValuesRef.current;\n return sizes;\n },\n setLayout: (sizes: number[]) => {\n const total = sizes.reduce(\n (accumulated, current) => accumulated + current,\n 0\n );\n\n assert(total === 100, \"Panel sizes must add up to 100%\");\n\n const { panels } = committedValuesRef.current;\n const panelIdToLastNotifiedSizeMap =\n panelIdToLastNotifiedSizeMapRef.current;\n const panelsArray = panelsMapToSortedArray(panels);\n\n setSizes(sizes);\n\n callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap);\n },\n }),\n []\n );\n\n useIsomorphicLayoutEffect(() => {\n committedValuesRef.current.direction = direction;\n committedValuesRef.current.panels = panels;\n committedValuesRef.current.sizes = sizes;\n });\n\n useWindowSplitterPanelGroupBehavior({\n committedValuesRef,\n groupId,\n panels,\n setSizes,\n sizes,\n panelSizeBeforeCollapse,\n });\n\n // Notify external code when sizes have changed.\n useEffect(() => {\n const { onLayout } = callbacksRef.current!;\n const { panels, sizes } = committedValuesRef.current;\n\n // Don't commit layout until all panels have registered and re-rendered with their actual sizes.\n if (sizes.length > 0) {\n if (onLayout) {\n onLayout(sizes);\n }\n\n const panelIdToLastNotifiedSizeMap =\n panelIdToLastNotifiedSizeMapRef.current;\n\n // When possible, we notify before the next render so that rendering work can be batched together.\n // Some cases are difficult to detect though,\n // for example– panels that are conditionally rendered can affect the size of neighboring panels.\n // In this case, the best we can do is notify on commit.\n // The callPanelCallbacks() uses its own memoization to avoid notifying panels twice in these cases.\n const panelsArray = panelsMapToSortedArray(panels);\n callPanelCallbacks(panelsArray, sizes, panelIdToLastNotifiedSizeMap);\n }\n }, [sizes]);\n\n // Once all panels have registered themselves,\n // Compute the initial sizes based on default weights.\n // This assumes that panels register during initial mount (no conditional rendering)!\n useIsomorphicLayoutEffect(() => {\n const sizes = committedValuesRef.current.sizes;\n if (sizes.length === panels.size) {\n // Only compute (or restore) default sizes once per panel configuration.\n return;\n }\n\n // If this panel has been configured to persist sizing information,\n // default size should be restored from local storage if possible.\n let defaultSizes: number[] | null = null;\n if (autoSaveId) {\n const panelsArray = panelsMapToSortedArray(panels);\n defaultSizes = loadPanelLayout(autoSaveId, panelsArray, storage);\n }\n\n if (defaultSizes != null) {\n setSizes(defaultSizes);\n } else {\n const panelsArray = panelsMapToSortedArray(panels);\n\n let panelsWithNullDefaultSize = 0;\n let totalDefaultSize = 0;\n let totalMinSize = 0;\n\n // TODO\n // Implicit default size calculations below do not account for inferred min/max size values.\n // e.g. if Panel A has a maxSize of 40 then Panels A and B can't both have an implicit default size of 50.\n // For now, these logic edge cases are left to the user to handle via props.\n\n panelsArray.forEach((panel) => {\n totalMinSize += panel.current.minSize;\n\n if (panel.current.defaultSize === null) {\n panelsWithNullDefaultSize++;\n } else {\n totalDefaultSize += panel.current.defaultSize;\n }\n });\n\n if (totalDefaultSize > 100) {\n throw new Error(`Default panel sizes cannot exceed 100%`);\n } else if (\n panelsArray.length > 1 &&\n panelsWithNullDefaultSize === 0 &&\n totalDefaultSize !== 100\n ) {\n throw new Error(`Invalid default sizes specified for panels`);\n } else if (totalMinSize > 100) {\n throw new Error(`Minimum panel sizes cannot exceed 100%`);\n }\n\n setSizes(\n panelsArray.map((panel) => {\n if (panel.current.defaultSize === null) {\n return (100 - totalDefaultSize) / panelsWithNullDefaultSize;\n }\n\n return panel.current.defaultSize;\n })\n );\n }\n }, [autoSaveId, panels, storage]);\n\n useEffect(() => {\n // If this panel has been configured to persist sizing information, save sizes to local storage.\n if (autoSaveId) {\n if (sizes.length === 0 || sizes.length !== panels.size) {\n return;\n }\n\n const panelsArray = panelsMapToSortedArray(panels);\n\n // Limit the frequency of localStorage updates.\n if (!debounceMap[autoSaveId]) {\n debounceMap[autoSaveId] = debounce(savePanelGroupLayout, 100);\n }\n debounceMap[autoSaveId](autoSaveId, panelsArray, sizes, storage);\n }\n }, [autoSaveId, panels, sizes, storage]);\n\n const getPanelStyle = useCallback(\n (id: string, defaultSize: number | null): CSSProperties => {\n const { panels } = committedValuesRef.current;\n\n // Before mounting, Panels will not yet have registered themselves.\n // This includes server rendering.\n // At this point the best we can do is render everything with the same size.\n if (panels.size === 0) {\n if (isDevelopment) {\n if (isServerRendering() && defaultSize == null) {\n console.warn(\n `WARNING: Panel defaultSize prop recommended to avoid layout shift after server rendering`\n );\n }\n }\n\n return {\n flexBasis: 0,\n flexGrow: defaultSize != null ? defaultSize : undefined,\n flexShrink: 1,\n\n // Without this, Panel sizes may be unintentionally overridden by their content.\n overflow: \"hidden\",\n };\n }\n\n const flexGrow = getFlexGrow(panels, id, sizes);\n\n return {\n flexBasis: 0,\n flexGrow,\n flexShrink: 1,\n\n // Without this, Panel sizes may be unintentionally overridden by their content.\n overflow: \"hidden\",\n\n // Disable pointer events inside of a panel during resize.\n // This avoid edge cases like nested iframes.\n pointerEvents:\n disablePointerEventsDuringResize && activeHandleId !== null\n ? \"none\"\n : undefined,\n };\n },\n [activeHandleId, disablePointerEventsDuringResize, sizes]\n );\n\n const registerPanel = useCallback((id: string, panelRef: PanelData) => {\n setPanels((prevPanels) => {\n if (prevPanels.has(id)) {\n return prevPanels;\n }\n\n const nextPanels = new Map(prevPanels);\n nextPanels.set(id, panelRef);\n\n return nextPanels;\n });\n }, []);\n\n const registerResizeHandle = useCallback(\n (handleId: string) => {\n const resizeHandler = (event: ResizeEvent) => {\n event.preventDefault();\n\n const {\n direction,\n panels,\n sizes: prevSizes,\n } = committedValuesRef.current;\n\n const panelsArray = panelsMapToSortedArray(panels);\n\n const [idBefore, idAfter] = getResizeHandlePanelIds(\n groupId,\n handleId,\n panelsArray\n );\n if (idBefore == null || idAfter == null) {\n return;\n }\n\n let movement = getMovement(\n event,\n groupId,\n handleId,\n panelsArray,\n direction,\n prevSizes,\n initialDragStateRef.current\n );\n if (movement === 0) {\n return;\n }\n\n const groupElement = getPanelGroup(groupId)!;\n const rect = groupElement.getBoundingClientRect();\n const isHorizontal = direction === \"horizontal\";\n\n // Support RTL layouts\n if (document.dir === \"rtl\" && isHorizontal) {\n movement = -movement;\n }\n\n const size = isHorizontal ? rect.width : rect.height;\n const delta = (movement / size) * 100;\n\n const nextSizes = adjustByDelta(\n event,\n panels,\n idBefore,\n idAfter,\n delta,\n prevSizes,\n panelSizeBeforeCollapse.current,\n initialDragStateRef.current\n );\n\n const sizesChanged = !areEqual(prevSizes, nextSizes);\n\n // Don't update cursor for resizes triggered by keyboard interactions.\n if (isMouseEvent(event) || isTouchEvent(event)) {\n // Watch for multiple subsequent deltas; this might occur for tiny cursor movements.\n // In this case, Panel sizes might not change–\n // but updating cursor in this scenario would cause a flicker.\n if (prevDeltaRef.current != delta) {\n if (!sizesChanged) {\n // If the pointer has moved too far to resize the panel any further,\n // update the cursor style for a visual clue.\n // This mimics VS Code behavior.\n\n if (isHorizontal) {\n setGlobalCursorStyle(\n movement < 0 ? \"horizontal-min\" : \"horizontal-max\"\n );\n } else {\n setGlobalCursorStyle(\n movement < 0 ? \"vertical-min\" : \"vertical-max\"\n );\n }\n } else {\n // Reset the cursor style to the the normal resize cursor.\n setGlobalCursorStyle(isHorizontal ? \"horizontal\" : \"vertical\");\n }\n }\n }\n\n if (sizesChanged) {\n const panelIdToLastNotifiedSizeMap =\n panelIdToLastNotifiedSizeMapRef.current;\n\n setSizes(nextSizes);\n\n // If resize change handlers have been declared, this is the time to call them.\n // Trigger user callbacks after updating state, so that user code can override the sizes.\n callPanelCallbacks(\n panelsArray,\n nextSizes,\n panelIdToLastNotifiedSizeMap\n );\n }\n\n prevDeltaRef.current = delta;\n };\n\n return resizeHandler;\n },\n [groupId]\n );\n\n const unregisterPanel = useCallback((id: string) => {\n setPanels((prevPanels) => {\n if (!prevPanels.has(id)) {\n return prevPanels;\n }\n\n const nextPanels = new Map(prevPanels);\n nextPanels.delete(id);\n\n return nextPanels;\n });\n }, []);\n\n const collapsePanel = useCallback((id: string) => {\n const { panels, sizes: prevSizes } = committedValuesRef.current;\n\n const panel = panels.get(id);\n if (panel == null) {\n return;\n }\n\n const { collapsedSize, collapsible } = panel.current;\n if (!collapsible) {\n return;\n }\n\n const panelsArray = panelsMapToSortedArray(panels);\n\n const index = panelsArray.indexOf(panel);\n if (index < 0) {\n return;\n }\n\n const currentSize = prevSizes[index];\n if (currentSize === collapsedSize) {\n // Panel is already collapsed.\n return;\n }\n\n panelSizeBeforeCollapse.current.set(id, currentSize);\n\n const [idBefore, idAfter] = getBeforeAndAfterIds(id, panelsArray);\n if (idBefore == null || idAfter == null) {\n return;\n }\n\n const isLastPanel = index === panelsArray.length - 1;\n const delta = isLastPanel ? currentSize : collapsedSize - currentSize;\n\n const nextSizes = adjustByDelta(\n null,\n panels,\n idBefore,\n idAfter,\n delta,\n prevSizes,\n panelSizeBeforeCollapse.current,\n null\n );\n if (prevSizes !== nextSizes) {\n const panelIdToLastNotifiedSizeMap =\n panelIdToLastNotifiedSizeMapRef.current;\n\n setSizes(nextSizes);\n\n // If resize change handlers have been declared, this is the time to call them.\n // Trigger user callbacks after updating state, so that user code can override the sizes.\n callPanelCallbacks(panelsArray, nextSizes, panelIdToLastNotifiedSizeMap);\n }\n }, []);\n\n const expandPanel = useCallback((id: string) => {\n const { panels, sizes: prevSizes } = committedValuesRef.current;\n\n const panel = panels.get(id);\n if (panel == null) {\n return;\n }\n\n const { collapsedSize, minSize } = panel.current;\n\n const sizeBeforeCollapse =\n panelSizeBeforeCollapse.current.get(id) || minSize;\n if (!sizeBeforeCollapse) {\n return;\n }\n\n const panelsArray = panelsMapToSortedArray(panels);\n\n const index = panelsArray.indexOf(panel);\n if (index < 0) {\n return;\n }\n\n const currentSize = prevSizes[index];\n if (currentSize !== collapsedSize) {\n // Panel is already expanded.\n return;\n }\n\n const [idBefore, idAfter] = getBeforeAndAfterIds(id, panelsArray);\n if (idBefore == null || idAfter == null) {\n return;\n }\n\n const isLastPanel = index === panelsArray.length - 1;\n const delta = isLastPanel\n ? collapsedSize - sizeBeforeCollapse\n : sizeBeforeCollapse;\n\n const nextSizes = adjustByDelta(\n null,\n panels,\n idBefore,\n idAfter,\n delta,\n prevSizes,\n panelSizeBeforeCollapse.current,\n null\n );\n if (prevSizes !== nextSizes) {\n const panelIdToLastNotifiedSizeMap =\n panelIdToLastNotifiedSizeMapRef.current;\n\n setSizes(nextSizes);\n\n // If resize change handlers have been declared, this is the time to call them.\n // Trigger user callbacks after updating state, so that user code can override the sizes.\n callPanelCallbacks(panelsArray, nextSizes, panelIdToLastNotifiedSizeMap);\n }\n }, []);\n\n const resizePanel = useCallback((id: string, nextSize: number) => {\n const { panels, sizes: prevSizes } = committedValuesRef.current;\n\n const panel = panels.get(id);\n if (panel == null) {\n return;\n }\n\n const { collapsedSize, collapsible, maxSize, minSize } = panel.current;\n\n const panelsArray = panelsMapToSortedArray(panels);\n\n const index = panelsArray.indexOf(panel);\n if (index < 0) {\n return;\n }\n\n const currentSize = prevSizes[index];\n if (currentSize === nextSize) {\n return;\n }\n\n if (collapsible && nextSize === collapsedSize) {\n // This is a valid resize state.\n } else {\n nextSize = Math.min(maxSize, Math.max(minSize, nextSize));\n }\n\n const [idBefore, idAfter] = getBeforeAndAfterIds(id, panelsArray);\n if (idBefore == null || idAfter == null) {\n return;\n }\n\n const isLastPanel = index === panelsArray.length - 1;\n const delta = isLastPanel ? currentSize - nextSize : nextSize - currentSize;\n\n const nextSizes = adjustByDelta(\n null,\n panels,\n idBefore,\n idAfter,\n delta,\n prevSizes,\n panelSizeBeforeCollapse.current,\n null\n );\n if (prevSizes !== nextSizes) {\n const panelIdToLastNotifiedSizeMap =\n panelIdToLastNotifiedSizeMapRef.current;\n\n setSizes(nextSizes);\n\n // If resize change handlers have been declared, this is the time to call them.\n // Trigger user callbacks after updating state, so that user code can override the sizes.\n callPanelCallbacks(panelsArray, nextSizes, panelIdToLastNotifiedSizeMap);\n }\n }, []);\n\n const context = useMemo(\n () => ({\n activeHandleId,\n collapsePanel,\n direction,\n expandPanel,\n getPanelStyle,\n groupId,\n registerPanel,\n registerResizeHandle,\n resizePanel,\n startDragging: (id: string, event: ResizeEvent) => {\n setActiveHandleId(id);\n\n if (isMouseEvent(event) || isTouchEvent(event)) {\n const handleElement = getResizeHandle(id)!;\n\n initialDragStateRef.current = {\n dragHandleRect: handleElement.getBoundingClientRect(),\n dragOffset: getDragOffset(event, id, direction),\n sizes: committedValuesRef.current.sizes,\n };\n }\n },\n stopDragging: () => {\n resetGlobalCursorStyle();\n setActiveHandleId(null);\n\n initialDragStateRef.current = null;\n },\n unregisterPanel,\n }),\n [\n activeHandleId,\n collapsePanel,\n direction,\n expandPanel,\n getPanelStyle,\n groupId,\n registerPanel,\n registerResizeHandle,\n resizePanel,\n unregisterPanel,\n ]\n );\n\n const style: CSSProperties = {\n display: \"flex\",\n flexDirection: direction === \"horizontal\" ? \"row\" : \"column\",\n height: \"100%\",\n overflow: \"hidden\",\n width: \"100%\",\n };\n\n return createElement(PanelGroupContext.Provider, {\n children: createElement(Type, {\n children,\n className: classNameFromProps,\n \"data-panel-group\": \"\",\n \"data-panel-group-direction\": direction,\n \"data-panel-group-id\": groupId,\n style: { ...style, ...styleFromProps },\n }),\n value: context,\n });\n}\n\nexport const PanelGroup = forwardRef<\n ImperativePanelGroupHandle,\n PanelGroupProps\n>((props: PanelGroupProps, ref: ForwardedRef<ImperativePanelGroupHandle>) =>\n createElement(PanelGroupWithForwardedRef, { ...props, forwardedRef: ref })\n);\n\n// Workaround for Parcel scope hoisting (which renames objects/functions).\n// Casting to :any is required to avoid corrupting the generated TypeScript types.\n// See github.com/parcel-bundler/parcel/issues/8724\n(PanelGroupWithForwardedRef as any).displayName = \"PanelGroup\";\n(PanelGroup as any).displayName = \"forwardRef(PanelGroup)\";\n","export const isDevelopment = false;\n","import { RefObject, useEffect } from \"../vendor/react\";\nimport { PRECISION } from \"../constants\";\n\nimport { CommittedValues, PanelDataMap } from \"../PanelGroup\";\nimport { ResizeHandler } from \"../types\";\nimport {\n adjustByDelta,\n getPanel,\n getPanelGroup,\n getResizeHandle,\n getResizeHandleIndex,\n getResizeHandlePanelIds,\n getResizeHandles,\n getResizeHandlesForGroup,\n getFlexGrow,\n panelsMapToSortedArray,\n} from \"../utils/group\";\nimport { assert } from \"../utils/assert\";\n\n// https://www.w3.org/WAI/ARIA/apg/patterns/windowsplitter/\n\nexport function useWindowSplitterPanelGroupBehavior({\n committedValuesRef,\n groupId,\n panels,\n setSizes,\n sizes,\n panelSizeBeforeCollapse,\n}: {\n committedValuesRef: RefObject<CommittedValues>;\n groupId: string;\n panels: PanelDataMap;\n setSizes: (sizes: number[]) => void;\n sizes: number[];\n panelSizeBeforeCollapse: RefObject<Map<string, number>>;\n}): void {\n useEffect(() => {\n const { direction, panels } = committedValuesRef.current!;\n\n const groupElement = getPanelGroup(groupId)!;\n const { height, width } = groupElement.getBoundingClientRect();\n\n const handles = getResizeHandlesForGroup(groupId);\n const cleanupFunctions = handles.map((handle) => {\n const handleId = handle.getAttribute(\"data-panel-resize-handle-id\")!;\n const panelsArray = panelsMapToSortedArray(panels);\n\n const [idBefore, idAfter] = getResizeHandlePanelIds(\n groupId,\n handleId,\n panelsArray\n );\n if (idBefore == null || idAfter == null) {\n return () => {};\n }\n\n let minSize = 0;\n let maxSize = 100;\n let totalMinSize = 0;\n let totalMaxSize = 0;\n\n // A panel's effective min/max sizes also need to account for other panel's sizes.\n panelsArray.forEach((panelData) => {\n if (panelData.current.id === idBefore) {\n maxSize = panelData.current.maxSize;\n minSize = panelData.current.minSize;\n } else {\n totalMinSize += panelData.current.minSize;\n totalMaxSize += panelData.current.maxSize;\n }\n });\n\n const ariaValueMax = Math.min(maxSize, 100 - totalMinSize);\n const ariaValueMin = Math.max(\n minSize,\n (panelsArray.length - 1) * 100 - totalMaxSize\n );\n\n const flexGrow = getFlexGrow(panels, idBefore, sizes);\n\n handle.setAttribute(\"aria-valuemax\", \"\" + Math.round(ariaValueMax));\n handle.setAttribute(\"aria-valuemin\", \"\" + Math.round(ariaValueMin));\n handle.setAttribute(\"aria-valuenow\", \"\" + Math.round(parseInt(flexGrow)));\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.defaultPrevented) {\n return;\n }\n\n switch (event.key) {\n case \"Enter\": {\n event.preventDefault();\n\n const index = panelsArray.findIndex(\n (panel) => panel.current.id === idBefore\n );\n if (index >= 0) {\n const panelData = panelsArray[index];\n const size = sizes[index];\n if (size != null) {\n let delta = 0;\n if (\n size.toPrecision(PRECISION) <=\n panelData.current.minSize.toPrecision(PRECISION)\n ) {\n delta = direction === \"horizontal\" ? width : height;\n } else {\n delta = -(direction === \"horizontal\" ? width : height);\n }\n\n const nextSizes = adjustByDelta(\n event,\n panels,\n idBefore,\n idAfter,\n delta,\n sizes,\n panelSizeBeforeCollapse.current!,\n null\n );\n if (sizes !== nextSizes) {\n setSizes(nextSizes);\n }\n }\n }\n break;\n }\n }\n };\n\n handle.addEventListener(\"keydown\", onKeyDown);\n\n const panelBefore = getPanel(idBefore);\n if (panelBefore != null) {\n handle.setAttribute(\"aria-controls\", panelBefore.id);\n }\n\n return () => {\n handle.removeAttribute(\"aria-valuemax\");\n handle.removeAttribute(\"aria-valuemin\");\n handle.removeAttribute(\"aria-valuenow\");\n\n handle.removeEventListener(\"keydown\", onKeyDown);\n\n if (panelBefore != null) {\n handle.removeAttribute(\"aria-controls\");\n }\n };\n });\n\n return () => {\n cleanupFunctions.forEach((cleanupFunction) => cleanupFunction());\n };\n }, [\n committedValuesRef,\n groupId,\n panels,\n panelSizeBeforeCollapse,\n setSizes,\n sizes,\n ]);\n}\n\nexport function useWindowSplitterResizeHandlerBehavior({\n disabled,\n handleId,\n resizeHandler,\n}: {\n disabled: boolean;\n handleId: string;\n resizeHandler: ResizeHandler | null;\n}): void {\n useEffect(() => {\n if (disabled || resizeHandler == null) {\n return;\n }\n\n const handleElement = getResizeHandle(handleId);\n if (handleElement == null) {\n return;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.defaultPrevented) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n case \"ArrowLeft\":\n case \"ArrowRight\":\n case \"ArrowUp\":\n case \"End\":\n case \"Home\": {\n event.preventDefault();\n\n resizeHandler(event);\n break;\n }\n case \"F6\": {\n event.preventDefault();\n\n const handles = getResizeHandles();\n const index = getResizeHandleIndex(handleId);\n\n assert(index !== null);\n\n const nextIndex = event.shiftKey\n ? index > 0\n ? index - 1\n : handles.length - 1\n : index + 1 < handles.length\n ? index + 1\n : 0;\n\n const nextHandle = handles[nextIndex] as HTMLDivElement;\n nextHandle.focus();\n\n break;\n }\n }\n };\n\n handleElement.addEventListener(\"keydown\", onKeyDown);\n return () => {\n handleElement.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [disabled, handleId, resizeHandler]);\n}\n","export const PRECISION = 10;\n","import { InitialDragState } from \"../PanelGroup\";\nimport { PRECISION } from \"../constants\";\nimport { PanelData, ResizeEvent } from \"../types\";\n\nexport function adjustByDelta(\n event: ResizeEvent | null,\n panels: Map<string, PanelData>,\n idBefore: string,\n idAfter: string,\n delta: number,\n prevSizes: number[],\n panelSizeBeforeCollapse: Map<string, number>,\n initialDragState: InitialDragState | null\n): number[] {\n const { sizes: initialSizes } = initialDragState || {};\n\n // If we're resizing by mouse or touch, use the initial sizes as a base.\n // This has the benefit of causing force-collapsed panels to spring back open if drag is reversed.\n const baseSizes = initialSizes || prevSizes;\n\n if (delta === 0) {\n return baseSizes;\n }\n\n const panelsArray = panelsMapToSortedArray(panels);\n\n const nextSizes = baseSizes.concat();\n\n let deltaApplied = 0;\n\n // A resizing panel affects the panels before or after it.\n //\n // A negative delta means the panel immediately after the resizer should grow/expand by decreasing its offset.\n // Other panels may also need to shrink/contract (and shift) to make room, depending on the min weights.\n //\n // A positive delta means the panel immediately before the resizer should \"expand\".\n // This is accomplished by shrinking/contracting (and shifting) one or more of the panels after the resizer.\n\n // Max-bounds check the panel being expanded first.\n {\n const pivotId = delta < 0 ? idAfter : idBefore;\n const index = panelsArray.findIndex(\n (panel) => panel.current.id === pivotId\n );\n const panel = panelsArray[index];\n const baseSize = baseSizes[index];\n\n const nextSize = safeResizePanel(panel, Math.abs(delta), baseSize, event);\n if (baseSize === nextSize) {\n // If there's no room for the pivot panel to grow, we can ignore this drag update.\n return baseSizes;\n } else {\n if (nextSize === 0 && baseSize > 0) {\n panelSizeBeforeCollapse.set(pivotId, baseSize);\n }\n\n delta = delta < 0 ? baseSize - nextSize : nextSize - baseSize;\n }\n }\n\n let pivotId = delta < 0 ? idBefore : idAfter;\n let index = panelsArray.findIndex((panel) => panel.current.id === pivotId);\n while (true) {\n const panel = panelsArray[index];\n const baseSize = baseSizes[index];\n\n const deltaRemaining = Math.abs(delta) - Math.abs(deltaApplied);\n\n const nextSize = safeResizePanel(\n panel,\n 0 - deltaRemaining,\n baseSize,\n event\n );\n if (baseSize !== nextSize) {\n if (nextSize === 0 && baseSize > 0) {\n panelSizeBeforeCollapse.set(panel.current.id, baseSize);\n }\n\n deltaApplied += baseSize - nextSize;\n\n nextSizes[index] = nextSize;\n\n if (\n deltaApplied\n .toPrecision(PRECISION)\n .localeCompare(Math.abs(delta).toPrecision(PRECISION), undefined, {\n numeric: true,\n }) >= 0\n ) {\n break;\n }\n }\n\n if (delta < 0) {\n if (--index < 0) {\n break;\n }\n } else {\n if (++index >= panelsArray.length) {\n break;\n }\n }\n }\n\n // If we were unable to resize any of the panels panels, return the previous state.\n // This will essentially bailout and ignore the \"mousemove\" event.\n if (deltaApplied === 0) {\n return baseSizes;\n }\n\n // Adjust the pivot panel before, but only by the amount that surrounding panels were able to shrink/contract.\n pivotId = delta < 0 ? idAfter : idBefore;\n index = panelsArray.findIndex((panel) => panel.current.id === pivotId);\n nextSizes[index] = baseSizes[index] + deltaApplied;\n\n return nextSizes;\n}\n\nexport function callPanelCallbacks(\n panelsArray: PanelData[],\n sizes: number[],\n panelIdToLastNotifiedSizeMap: Record<string, number>\n) {\n sizes.forEach((size, index) => {\n const { callbacksRef, collapsedSize, collapsible, id } =\n panelsArray[index].current;\n\n const lastNotifiedSize = panelIdToLastNotifiedSizeMap[id];\n if (lastNotifiedSize !== size) {\n panelIdToLastNotifiedSizeMap[id] = size;\n\n const { onCollapse, onResize } = callbacksRef.current!;\n\n if (onResize) {\n onResize(size, lastNotifiedSize);\n }\n\n if (collapsible && onCollapse) {\n if (\n (lastNotifiedSize == null || lastNotifiedSize === collapsedSize) &&\n size !== collapsedSize\n ) {\n onCollapse(false);\n } else if (\n lastNotifiedSize !== collapsedSize &&\n size === collapsedSize\n ) {\n onCollapse(true);\n }\n }\n }\n });\n}\n\nexport function getBeforeAndAfterIds(\n id: string,\n panelsArray: PanelData[]\n): [idBefore: string | null, idAFter: string | null] {\n if (panelsArray.length < 2) {\n return [null, null];\n }\n\n const index = panelsArray.findIndex((panel) => panel.current.id === id);\n if (index < 0) {\n return [null, null];\n }\n\n const isLastPanel = index === panelsArray.length - 1;\n const idBefore = isLastPanel ? panelsArray[index - 1].current.id : id;\n const idAfter = isLastPanel ? id : panelsArray[index + 1].current.id;\n\n return [idBefore, idAfter];\n}\n\n// This method returns a number between 1 and 100 representing\n// the % of the group's overall space this panel should occupy.\nexport function getFlexGrow(\n panels: Map<string, PanelData>,\n id: string,\n sizes: number[]\n): string {\n if (panels.size === 1) {\n return \"100\";\n }\n\n const panelsArray = panelsMapToSortedArray(panels);\n\n const index = panelsArray.findIndex((panel) => panel.current.id === id);\n const size = sizes[index];\n if (size == null) {\n return \"0\";\n }\n\n return size.toPrecision(PRECISION);\n}\n\nexport function getPanel(id: string): HTMLDivElement | null {\n const element = document.querySelector(`[data-panel-id=\"${id}\"]`);\n if (element) {\n return element as HTMLDivElement;\n }\n return null;\n}\n\nexport function getPanelGroup(id: string): HTMLDivElement | null {\n const element = document.querySelector(`[data-panel-group-id=\"${id}\"]`);\n if (element) {\n return element as HTMLDivElement;\n }\n return null;\n}\n\nexport function getResizeHandle(id: string): HTMLDivElement | null {\n const element = document.querySelector(\n `[data-panel-resize-handle-id=\"${id}\"]`\n );\n if (element) {\n return element as HTMLDivElement;\n }\n return null;\n}\n\nexport function getResizeHandleIndex(id: string): number | null {\n const handles = getResizeHandles();\n const index = handles.findIndex(\n (handle) => handle.getAttribute(\"data-panel-resize-handle-id\") === id\n );\n return index ?? null;\n}\n\nexport function getResizeHandles(): HTMLDivElement[] {\n return Array.from(document.querySelectorAll(`[data-panel-resize-handle-id]`));\n}\n\nexport function getResizeHandlesForGroup(groupId: string): HTMLDivElement[] {\n return Array.from(\n document.querySelectorAll(\n `[data-panel-resize-handle-id][data-panel-group-id=\"${groupId}\"]`\n )\n );\n}\n\nexport function getResizeHandlePanelIds(\n groupId: string,\n handleId: string,\n panelsArray: PanelData[]\n): [idBefore: string | null, idAfter: string | null] {\n const handle = getResizeHandle(handleId);\n const handles = getResizeHandlesForGroup(groupId);\n const index = handle ? handles.indexOf(handle) : -1;\n\n const idBefore: string | null = panelsArray[index]?.current?.id ?? null;\n const idAfter: string | null = panelsArray[index + 1]?.current?.id ?? null;\n\n return [idBefore, idAfter];\n}\n\nexport function panelsMapToSortedArray(\n panels: Map<string, PanelData>\n): PanelData[] {\n return Array.from(panels.values()).sort((panelA, panelB) => {\n const orderA = panelA.current.order;\n const orderB = panelB.current.order;\n if (orderA == null && orderB == null) {\n return 0;\n } else if (orderA == null) {\n return -1;\n } else if (orderB == null) {\n return 1;\n } else {\n return orderA - orderB;\n }\n });\n}\n\nfunction safeResizePanel(\n panel: PanelData,\n delta: number,\n prevSize: number,\n event: ResizeEvent | null\n): number {\n const nextSizeUnsafe = prevSize + delta;\n\n const { collapsedSize, collapsible, maxSize, minSize } = panel.current;\n\n if (collapsible) {\n if (prevSize > collapsedSize) {\n // Mimic VS COde behavior; collapse a panel if it's smaller than half of its min-size\n if (nextSizeUnsafe <= minSize / 2 + collapsedSize) {\n return collapsedSize;\n }\n } else {\n const isKeyboardEvent = event?.type?.startsWith(\"key\");\n if (!isKeyboardEvent) {\n // Keyboard events should expand a collapsed panel to the min size,\n // but mouse events should wait until the panel has reached its min size\n // to avoid a visual flickering when dragging between collapsed and min size.\n if (nextSizeUnsafe < minSize) {\n return collapsedSize;\n }\n }\n }\n }\n\n const nextSize = Math.min(maxSize, Math.max(minSize, nextSizeUnsafe));\n\n return nextSize;\n}\n","export function assert(\n expectedCondition: boolean,\n message: string = \"Assertion failed!\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","export function areEqual(arrayA: any[], arrayB: any[]): boolean {\n if (arrayA.length !== arrayB.length) {\n return false;\n }\n\n for (let index = 0; index < arrayA.length; index++) {\n if (arrayA[index] !== arrayB[index]) {\n return false;\n }\n }\n\n return true;\n}\n","import { PRECISION } from \"../constants\";\nimport { InitialDragState } from \"../PanelGroup\";\nimport { Direction, PanelData, ResizeEvent } from \"../types\";\nimport {\n getPanelGroup,\n getResizeHandle,\n getResizeHandlePanelIds,\n} from \"./group\";\n\nexport type Coordinates = {\n movement: number;\n offset: number;\n};\n\nexport type Size = {\n height: number;\n width: number;\n};\n\nexport function getDragOffset(\n event: ResizeEvent,\n handleId: string,\n direction: Direction,\n initialOffset: number = 0,\n initialHandleElementRect: DOMRect | null = null\n): number {\n const isHorizontal = direction === \"horizontal\";\n\n let pointerOffset = 0;\n if (isMouseEvent(event)) {\n pointerOffset = isHorizontal ? event.clientX : event.clientY;\n } else if (isTouchEvent(event)) {\n const firstTouch = event.touches[0];\n pointerOffset = isHorizontal ? firstTouch.screenX : firstTouch.screenY;\n } else {\n return 0;\n }\n\n const handleElement = getResizeHandle(handleId)!;\n const rect =\n initialHandleElementRect || handleElement.getBoundingClientRect();\n const elementOffset = isHorizontal ? rect.left : rect.top;\n\n return pointerOffset - elementOffset - initialOffset;\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX\nexport function getMovement(\n event: ResizeEvent,\n groupId: string,\n handleId: string,\n panelsArray: PanelData[],\n direction: Direction,\n prevSizes: number[],\n initialDragState: InitialDragState | null\n): number {\n const {\n dragOffset = 0,\n dragHandleRect,\n sizes: initialSizes,\n } = initialDragState || {};\n\n // If we're resizing by mouse or touch, use the initial sizes as a base.\n // This has the benefit of causing force-collapsed panels to spring back open if drag is reversed.\n const baseSizes = initialSizes || prevSizes;\n\n if (isKeyDown(event)) {\n const isHorizontal = direction === \"horizontal\";\n\n const groupElement = getPanelGroup(groupId)!;\n const rect = groupElement.getBoundingClientRect();\n const groupSizeInPixels = isHorizontal ? rect.width : rect.height;\n\n const denominator = event.shiftKey ? 10 : 100;\n const delta = groupSizeInPixels / denominator;\n\n let movement = 0;\n switch (event.key) {\n case \"ArrowDown\":\n movement = isHorizontal ? 0 : delta;\n break;\n case \"ArrowLeft\":\n movement = isHorizontal ? -delta : 0;\n break;\n case \"ArrowRight\":\n movement = isHorizontal ? delta : 0;\n break;\n case \"ArrowUp\":\n movement = isHorizontal ? 0 : -delta;\n break;\n case \"End\":\n movement = groupSizeInPixels;\n break;\n case \"Home\":\n movement = -groupSizeInPixels;\n break;\n }\n\n // If the Panel being resized is collapsible,\n // we need to special case resizing around the minSize boundary.\n // If contracting, Panels should shrink to their minSize and then snap to fully collapsed.\n // If expanding from collapsed, they should snap back to their minSize.\n const [idBefore, idAfter] = getResizeHandlePanelIds(\n groupId,\n handleId,\n panelsArray\n );\n const targetPanelId = movement < 0 ? idBefore : idAfter;\n const targetPanelIndex = panelsArray.findIndex(\n (panel) => panel.current.id === targetPanelId\n );\n const targetPanel = panelsArray[targetPanelIndex];\n if (targetPanel.current.collapsible) {\n const baseSize = baseSizes[targetPanelIndex];\n if (\n baseSize === 0 ||\n baseSize.toPrecision(PRECISION) ===\n targetPanel.current.minSize.toPrecision(PRECISION)\n ) {\n movement =\n movement < 0\n ? -targetPanel.current.minSize * groupSizeInPixels\n : targetPanel.current.minSize * groupSizeInPixels;\n }\n }\n\n return movement;\n } else {\n return getDragOffset(\n event,\n handleId,\n direction,\n dragOffset,\n dragHandleRect\n );\n }\n}\n\nexport function isKeyDown(event: ResizeEvent): event is KeyboardEvent {\n return event.type === \"keydown\";\n}\n\nexport function isMouseEvent(event: ResizeEvent): event is MouseEvent {\n return event.type.startsWith(\"mouse\");\n}\n\nexport function isTouchEvent(event: ResizeEvent): event is TouchEvent {\n return event.type.startsWith(\"touch\");\n}\n","type CursorState =\n | \"horizontal\"\n | \"horizontal-max\"\n | \"horizontal-min\"\n | \"vertical\"\n | \"vertical-max\"\n | \"vertical-min\";\n\nlet currentState: CursorState | null = null;\nlet element: HTMLStyleElement | null = null;\n\nexport function getCursorStyle(state: CursorState): string {\n switch (state) {\n case \"horizontal\":\n return \"ew-resize\";\n case \"horizontal-max\":\n return \"w-resize\";\n case \"horizontal-min\":\n return \"e-resize\";\n case \"vertical\":\n return \"ns-resize\";\n case \"vertical-max\":\n return \"n-resize\";\n case \"vertical-min\":\n return \"s-resize\";\n }\n}\n\nexport function resetGlobalCursorStyle() {\n if (element !== null) {\n document.head.removeChild(element);\n\n currentState = null;\n element = null;\n }\n}\n\nexport function setGlobalCursorStyle(state: CursorState) {\n if (currentState === state) {\n return;\n }\n\n currentState = state;\n\n const style = getCursorStyle(state);\n\n if (element === null) {\n element = document.createElement(\"style\");\n\n document.head.appendChild(element);\n }\n\n element.innerHTML = `*{cursor: ${style}!important;}`;\n}\n","export default function debounce<T extends Function>(\n callback: T,\n durationMs: number = 10\n) {\n let timeoutId: NodeJS.Timeout | null = null;\n\n let callable = (...args: any) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n callback(...args);\n }, durationMs);\n };\n\n return callable as unknown as T;\n}\n","import { PanelData, PanelGroupStorage } from \"../types\";\n\ntype SerializedPanelGroupState = { [panelIds: string]: number[] };\n\n// Note that Panel ids might be user-provided (stable) or useId generated (non-deterministic)\n// so they should not be used as part of the serialization key.\n// Using an attribute like minSize instead should work well enough.\n// Pre-sorting by minSize allows remembering layouts even if panels are re-ordered/dragged.\nfunction getSerializationKey(panels: PanelData[]): string {\n return panels\n .map((panel) => {\n const { minSize, order } = panel.current;\n return order ? `${order}:${minSize}` : `${minSize}`;\n })\n .sort((a, b) => a.localeCompare(b))\n .join(\",\");\n}\n\nfunction loadSerializedPanelGroupState(\n autoSaveId: string,\n storage: PanelGroupStorage\n): SerializedPanelGroupState | null {\n try {\n const serialized = storage.getItem(`PanelGroup:sizes:${autoSaveId}`);\n if (serialized) {\n const parsed = JSON.parse(serialized);\n if (typeof parsed === \"object\" && parsed != null) {\n return parsed;\n }\n }\n } catch (error) {}\n\n return null;\n}\n\nexport function loadPanelLayout(\n autoSaveId: string,\n panels: PanelData[],\n storage: PanelGroupStorage\n): number[] | null {\n const state = loadSerializedPanelGroupState(autoSaveId, storage);\n if (state) {\n const key = getSerializationKey(panels);\n return state[key] ?? null;\n }\n\n return null;\n}\n\nexport function savePanelGroupLayout(\n autoSaveId: string,\n panels: PanelData[],\n sizes: number[],\n storage: PanelGroupStorage\n): void {\n const key = getSerializationKey(panels);\n const state = loadSerializedPanelGroupState(autoSaveId, storage) || {};\n state[key] = sizes;\n\n try {\n storage.setItem(`PanelGroup:sizes:${autoSaveId}`, JSON.stringify(state));\n } catch (error) {\n console.error(error);\n }\n}\n","export function isServerRendering(): boolean {\n try {\n return typeof window === undefined;\n } catch (error) {}\n\n return true;\n}\n","import {\n createElement,\n CSSProperties,\n ElementType,\n MouseEvent as ReactMouseEvent,\n ReactNode,\n TouchEvent,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"./vendor/react\";\nimport useUniqueId from \"./hooks/useUniqueId\";\n\nimport { useWindowSplitterResizeHandlerBehavior } from \"./hooks/useWindowSplitterBehavior\";\nimport { PanelGroupContext } from \"./PanelContexts\";\nimport type {\n ResizeHandler,\n ResizeEvent,\n PanelResizeHandleOnDragging,\n} from \"./types\";\nimport { getCursorStyle } from \"./utils/cursor\";\n\nexport type PanelResizeHandleProps = {\n children?: ReactNode;\n className?: string;\n disabled?: boolean;\n id?: string | null;\n onDragging?: PanelResizeHandleOnDragging;\n style?: CSSProperties;\n tagName?: ElementType;\n};\n\nexport function PanelResizeHandle({\n children = null,\n className: classNameFromProps = \"\",\n disabled = false,\n id: idFromProps = null,\n onDragging,\n style: styleFromProps = {},\n tagName: Type = \"div\",\n}: PanelResizeHandleProps) {\n const divElementRef = useRef<HTMLDivElement>(null);\n\n // Use a ref to guard against users passing inline props\n const callbacksRef = useRef<{\n onDragging: PanelResizeHandleOnDragging | undefined;\n }>({ onDragging });\n useEffect(() => {\n callbacksRef.current.onDragging = onDragging;\n });\n\n const panelGroupContext = useContext(PanelGroupContext);\n if (panelGroupContext === null) {\n throw Error(\n `PanelResizeHandle components must be rendered within a PanelGroup container`\n );\n }\n\n const {\n activeHandleId,\n direction,\n groupId,\n registerResizeHandle,\n startDragging,\n stopDragging,\n } = panelGroupContext;\n\n const resizeHandleId = useUniqueId(idFromProps);\n const isDragging = activeHandleId === resizeHandleId;\n\n const [isFocused, setIsFocused] = useState(false);\n\n const [resizeHandler, setResizeHandler] = useState<ResizeHandler | null>(\n null\n );\n\n const stopDraggingAndBlur = useCallback(() => {\n // Clicking on the drag handle shouldn't leave it focused;\n // That would cause the PanelGroup to think it was still active.\n const div = divElementRef.current!;\n div.blur();\n\n stopDragging();\n\n const { onDragging } = callbacksRef.current;\n if (onDragging) {\n onDragging(false);\n }\n }, [stopDragging]);\n\n useEffect(() => {\n if (disabled) {\n setResizeHandler(null);\n } else {\n const resizeHandler = registerResizeHandle(resizeHandleId);\n setResizeHandler(() => resizeHandler);\n }\n }, [disabled, resizeHandleId, registerResizeHandle]);\n\n useEffect(() => {\n if (disabled || resizeHandler == null || !isDragging) {\n return;\n }\n\n const onMove = (event: ResizeEvent) => {\n resizeHandler(event);\n };\n\n const onMouseLeave = (event: MouseEvent) => {\n resizeHandler(event);\n };\n\n const divElement = divElementRef.current!;\n const targetDocument = divElement.ownerDocument;\n\n targetDocument.body.addEventListener(\"contextmenu\", stopDraggingAndBlur);\n targetDocument.body.addEventListener(\"mousemove\", onMove);\n targetDocument.body.addEventListener(\"touchmove\", onMove);\n targetDocument.body.addEventListener(\"mouseleave\", onMouseLeave);\n window.addEventListener(\"mouseup\", stopDraggingAndBlur);\n window.addEventListener(\"touchend\", stopDraggingAndBlur);\n\n return () => {\n targetDocument.body.removeEventListener(\n \"contextmenu\",\n stopDraggingAndBlur\n );\n targetDocument.body.removeEventListener(\"mousemove\", onMove);\n targetDocument.body.removeEventListener(\"touchmove\", onMove);\n targetDocument.body.removeEventListener(\"mouseleave\", onMouseLeave);\n window.removeEventListener(\"mouseup\", stopDraggingAndBlur);\n window.removeEventListener(\"touchend\", stopDraggingAndBlur);\n };\n }, [direction, disabled, isDragging, resizeHandler, stopDraggingAndBlur]);\n\n useWindowSplitterResizeHandlerBehavior({\n disabled,\n handleId: resizeHandleId,\n resizeHandler,\n });\n\n const style: CSSProperties = {\n cursor: getCursorStyle(direction),\n touchAction: \"none\",\n userSelect: \"none\",\n };\n\n return createElement(Type, {\n children,\n className: classNameFromProps,\n \"data-resize-handle-active\": isDragging\n ? \"pointer\"\n : isFocused\n ? \"keyboard\"\n : undefined,\n \"data-panel-group-direction\": direction,\n \"data-panel-group-id\": groupId,\n \"data-panel-resize-handle-enabled\": !disabled,\n \"data-panel-resize-handle-id\": resizeHandleId,\n onBlur: () => setIsFocused(false),\n onFocus: () => setIsFocused(true),\n onMouseDown: (event: ReactMouseEvent) => {\n startDragging(resizeHandleId, event.nativeEvent);\n\n const { onDragging } = callbacksRef.current!;\n if (onDragging) {\n onDragging(true);\n }\n },\n onMouseUp: stopDraggingAndBlur,\n onTouchCancel: stopDraggingAndBlur,\n onTouchEnd: stopDraggingAndBlur,\n onTouchStart: (event: TouchEvent) => {\n startDragging(resizeHandleId, event.nativeEvent);\n\n const { onDragging } = callbacksRef.current!;\n if (onDragging) {\n onDragging(true);\n }\n },\n ref: divElementRef,\n role: \"separator\",\n style: {\n ...style,\n ...styleFromProps,\n },\n tabIndex: 0,\n });\n}\n\n// Workaround for Parcel scope hoisting (which renames objects/functions).\n// Casting to :any is required to avoid corrupting the generated TypeScript types.\n// See github.com/parcel-bundler/parcel/issues/8724\n(PanelResizeHandle as any).displayName = \"PanelResizeHandle\";\n"],"names":[],"version":3,"file":"react-resizable-panels.cjs.js.map","sourceRoot":"../../../"}
|