react-resizable-panels 0.0.55 → 0.0.56

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 (93) hide show
  1. package/.eslintrc.cjs +26 -0
  2. package/CHANGELOG.md +234 -90
  3. package/README.md +55 -49
  4. package/dist/declarations/src/Panel.d.ts +75 -20
  5. package/dist/declarations/src/PanelGroup.d.ts +29 -25
  6. package/dist/declarations/src/PanelResizeHandle.d.ts +1 -1
  7. package/dist/declarations/src/index.d.ts +5 -6
  8. package/dist/declarations/src/types.d.ts +3 -26
  9. package/dist/declarations/src/vendor/react.d.ts +4 -4
  10. package/dist/react-resizable-panels.browser.cjs.js +1241 -1035
  11. package/dist/react-resizable-panels.browser.cjs.mjs +1 -2
  12. package/dist/react-resizable-panels.browser.development.cjs.js +1367 -1081
  13. package/dist/react-resizable-panels.browser.development.cjs.mjs +1 -2
  14. package/dist/react-resizable-panels.browser.development.esm.js +1368 -1081
  15. package/dist/react-resizable-panels.browser.esm.js +1242 -1035
  16. package/dist/react-resizable-panels.cjs.js +1241 -1035
  17. package/dist/react-resizable-panels.cjs.js.map +1 -1
  18. package/dist/react-resizable-panels.cjs.mjs +1 -2
  19. package/dist/react-resizable-panels.development.cjs.js +1370 -1084
  20. package/dist/react-resizable-panels.development.cjs.mjs +1 -2
  21. package/dist/react-resizable-panels.development.esm.js +1371 -1084
  22. package/dist/react-resizable-panels.development.node.cjs.js +1151 -940
  23. package/dist/react-resizable-panels.development.node.cjs.mjs +1 -2
  24. package/dist/react-resizable-panels.development.node.esm.js +1152 -940
  25. package/dist/react-resizable-panels.esm.js +1242 -1035
  26. package/dist/react-resizable-panels.esm.js.map +1 -1
  27. package/dist/react-resizable-panels.node.cjs.js +1049 -912
  28. package/dist/react-resizable-panels.node.cjs.mjs +1 -2
  29. package/dist/react-resizable-panels.node.esm.js +1050 -912
  30. package/jest.config.js +10 -0
  31. package/package.json +3 -1
  32. package/src/Panel.test.tsx +308 -0
  33. package/src/Panel.ts +175 -123
  34. package/src/PanelGroup.test.tsx +210 -0
  35. package/src/PanelGroup.ts +730 -669
  36. package/src/PanelGroupContext.ts +33 -0
  37. package/src/PanelResizeHandle.ts +13 -8
  38. package/src/hooks/useUniqueId.ts +1 -1
  39. package/src/hooks/useWindowSplitterBehavior.ts +9 -164
  40. package/src/hooks/useWindowSplitterPanelGroupBehavior.ts +185 -0
  41. package/src/index.ts +19 -14
  42. package/src/types.ts +3 -30
  43. package/src/utils/adjustLayoutByDelta.test.ts +1808 -0
  44. package/src/utils/adjustLayoutByDelta.ts +211 -0
  45. package/src/utils/calculateAriaValues.test.ts +111 -0
  46. package/src/utils/calculateAriaValues.ts +67 -0
  47. package/src/utils/calculateDeltaPercentage.ts +68 -0
  48. package/src/utils/calculateDragOffsetPercentage.ts +30 -0
  49. package/src/utils/calculateUnsafeDefaultLayout.test.ts +92 -0
  50. package/src/utils/calculateUnsafeDefaultLayout.ts +55 -0
  51. package/src/utils/callPanelCallbacks.ts +81 -0
  52. package/src/utils/compareLayouts.test.ts +9 -0
  53. package/src/utils/compareLayouts.ts +12 -0
  54. package/src/utils/computePanelFlexBoxStyle.ts +44 -0
  55. package/src/utils/computePercentagePanelConstraints.test.ts +71 -0
  56. package/src/utils/computePercentagePanelConstraints.ts +56 -0
  57. package/src/utils/convertPercentageToPixels.test.ts +9 -0
  58. package/src/utils/convertPercentageToPixels.ts +6 -0
  59. package/src/utils/convertPixelConstraintsToPercentages.ts +55 -0
  60. package/src/utils/convertPixelsToPercentage.test.ts +9 -0
  61. package/src/utils/convertPixelsToPercentage.ts +6 -0
  62. package/src/utils/determinePivotIndices.ts +10 -0
  63. package/src/utils/dom/calculateAvailablePanelSizeInPixels.ts +29 -0
  64. package/src/utils/dom/getAvailableGroupSizePixels.ts +29 -0
  65. package/src/utils/dom/getPanelElement.ts +7 -0
  66. package/src/utils/dom/getPanelGroupElement.ts +7 -0
  67. package/src/utils/dom/getResizeHandleElement.ts +9 -0
  68. package/src/utils/dom/getResizeHandleElementIndex.ts +12 -0
  69. package/src/utils/dom/getResizeHandleElementsForGroup.ts +9 -0
  70. package/src/utils/dom/getResizeHandlePanelIds.ts +18 -0
  71. package/src/utils/events.ts +13 -0
  72. package/src/utils/getPercentageSizeFromMixedSizes.test.ts +47 -0
  73. package/src/utils/getPercentageSizeFromMixedSizes.ts +15 -0
  74. package/src/utils/getResizeEventCursorPosition.ts +19 -0
  75. package/src/utils/initializeDefaultStorage.ts +26 -0
  76. package/src/utils/numbers/fuzzyCompareNumbers.test.ts +16 -0
  77. package/src/utils/numbers/fuzzyCompareNumbers.ts +17 -0
  78. package/src/utils/numbers/fuzzyNumbersEqual.ts +9 -0
  79. package/src/utils/resizePanel.ts +41 -0
  80. package/src/utils/serialization.ts +9 -4
  81. package/src/utils/shouldMonitorPixelBasedConstraints.test.ts +23 -0
  82. package/src/utils/shouldMonitorPixelBasedConstraints.ts +13 -0
  83. package/src/utils/test-utils.ts +136 -0
  84. package/src/utils/validatePanelConstraints.test.ts +151 -0
  85. package/src/utils/validatePanelConstraints.ts +103 -0
  86. package/src/utils/validatePanelGroupLayout.test.ts +233 -0
  87. package/src/utils/validatePanelGroupLayout.ts +88 -0
  88. package/src/vendor/react.ts +4 -0
  89. package/.eslintrc.json +0 -22
  90. package/dist/declarations/src/utils/group.d.ts +0 -29
  91. package/src/PanelContexts.ts +0 -22
  92. package/src/utils/coordinates.ts +0 -149
  93. package/src/utils/group.ts +0 -614
@@ -0,0 +1,1808 @@
1
+ import { adjustLayoutByDelta } from "./adjustLayoutByDelta";
2
+
3
+ describe("adjustLayoutByDelta", () => {
4
+ it("[1++,2]", () => {
5
+ expect(
6
+ adjustLayoutByDelta({
7
+ delta: 1,
8
+ groupSizePixels: 100,
9
+ layout: [50, 50],
10
+ panelConstraints: [{}, {}],
11
+ pivotIndices: [0, 1],
12
+ trigger: "imperative-api",
13
+ })
14
+ ).toEqual([51, 49]);
15
+ });
16
+
17
+ it("[1++,2]", () => {
18
+ expect(
19
+ adjustLayoutByDelta({
20
+ delta: 25,
21
+ groupSizePixels: 100,
22
+ layout: [50, 50],
23
+ panelConstraints: [{}, {}],
24
+ pivotIndices: [0, 1],
25
+ trigger: "imperative-api",
26
+ })
27
+ ).toEqual([75, 25]);
28
+ expect(
29
+ adjustLayoutByDelta({
30
+ delta: 50,
31
+ groupSizePixels: 100,
32
+ layout: [50, 50],
33
+ panelConstraints: [{}, {}],
34
+ pivotIndices: [0, 1],
35
+ trigger: "imperative-api",
36
+ })
37
+ ).toEqual([100, 0]);
38
+ });
39
+
40
+ it("[1++,2]", () => {
41
+ expect(
42
+ adjustLayoutByDelta({
43
+ delta: 50,
44
+ groupSizePixels: 100,
45
+ layout: [50, 50],
46
+ panelConstraints: [
47
+ {
48
+ minSizePercentage: 20,
49
+ maxSizePercentage: 60,
50
+ },
51
+ {
52
+ minSizePercentage: 10,
53
+ maxSizePercentage: 90,
54
+ },
55
+ ],
56
+ pivotIndices: [0, 1],
57
+ trigger: "imperative-api",
58
+ })
59
+ ).toEqual([60, 40]);
60
+ });
61
+
62
+ it("[1++,2]", () => {
63
+ expect(
64
+ adjustLayoutByDelta({
65
+ delta: 25,
66
+ groupSizePixels: 100,
67
+ layout: [50, 50],
68
+ panelConstraints: [
69
+ {},
70
+ {
71
+ collapsedSizePercentage: 5,
72
+ collapsible: true,
73
+ minSizePercentage: 25,
74
+ },
75
+ ],
76
+ pivotIndices: [0, 1],
77
+ trigger: "imperative-api",
78
+ })
79
+ ).toEqual([75, 25]);
80
+ });
81
+
82
+ it("[1++,2]", () => {
83
+ expect(
84
+ adjustLayoutByDelta({
85
+ delta: 30,
86
+ groupSizePixels: 100,
87
+ layout: [50, 50],
88
+ panelConstraints: [
89
+ {},
90
+ {
91
+ collapsedSizePercentage: 5,
92
+ collapsible: true,
93
+ minSizePercentage: 25,
94
+ },
95
+ ],
96
+ pivotIndices: [0, 1],
97
+ trigger: "imperative-api",
98
+ })
99
+ ).toEqual([95, 5]);
100
+ });
101
+
102
+ // Edge case
103
+ // Expanding from a collapsed state to less than the min size via imperative API should do nothing
104
+ it("[1++,2]", () => {
105
+ expect(
106
+ adjustLayoutByDelta({
107
+ delta: 5,
108
+ groupSizePixels: NaN,
109
+ layout: [10, 90],
110
+ panelConstraints: [
111
+ {
112
+ collapsedSizePercentage: 10,
113
+ collapsible: true,
114
+ minSizePercentage: 25,
115
+ },
116
+ {},
117
+ ],
118
+ pivotIndices: [0, 1],
119
+ trigger: "imperative-api",
120
+ })
121
+ ).toEqual([10, 90]);
122
+ });
123
+
124
+ // Edge case
125
+ // Expanding from a collapsed state to less than the min size via keyboard should snap to min size
126
+ it("[1++,2]", () => {
127
+ expect(
128
+ adjustLayoutByDelta({
129
+ delta: 5,
130
+ groupSizePixels: NaN,
131
+ layout: [10, 90],
132
+ panelConstraints: [
133
+ {
134
+ collapsedSizePercentage: 10,
135
+ collapsible: true,
136
+ minSizePercentage: 25,
137
+ },
138
+ {},
139
+ ],
140
+ pivotIndices: [0, 1],
141
+ trigger: "keyboard",
142
+ })
143
+ ).toEqual([25, 75]);
144
+ });
145
+
146
+ // Edge case
147
+ // Expanding from a collapsed state to less than the min size via imperative API should do nothing
148
+ it("[1++,2]", () => {
149
+ // collapsed 4%, min size 6%, max size 15%
150
+ expect(
151
+ adjustLayoutByDelta({
152
+ delta: 1,
153
+ groupSizePixels: 1_000,
154
+ layout: [4, 96],
155
+ panelConstraints: [
156
+ {
157
+ collapsedSizePixels: 40,
158
+ collapsible: true,
159
+ defaultSizePixels: 150,
160
+ maxSizePixels: 150,
161
+ minSizePixels: 60,
162
+ },
163
+ {
164
+ minSizePercentage: 50,
165
+ },
166
+ ],
167
+ pivotIndices: [0, 1],
168
+ trigger: "imperative-api",
169
+ })
170
+ ).toEqual([4, 96]);
171
+ });
172
+
173
+ // Edge case
174
+ // Expanding from a collapsed state to less than the min size via keyboard should snap to min size
175
+ it("[1++,2]", () => {
176
+ // collapsed 4%, min size 6%, max size 15%
177
+ expect(
178
+ adjustLayoutByDelta({
179
+ delta: 1,
180
+ groupSizePixels: 1_000,
181
+ layout: [4, 96],
182
+ panelConstraints: [
183
+ {
184
+ collapsedSizePixels: 40,
185
+ collapsible: true,
186
+ defaultSizePixels: 150,
187
+ maxSizePixels: 150,
188
+ minSizePixels: 60,
189
+ },
190
+ {
191
+ minSizePercentage: 50,
192
+ },
193
+ ],
194
+ pivotIndices: [0, 1],
195
+ trigger: "keyboard",
196
+ })
197
+ ).toEqual([6, 94]);
198
+ });
199
+
200
+ // Edge case
201
+ // Expanding from a collapsed state to greater than the max size
202
+ it("[1++,2]", () => {
203
+ // collapsed 4%, min size 6%, max size 15%
204
+ expect(
205
+ adjustLayoutByDelta({
206
+ delta: 25,
207
+ groupSizePixels: 1_000,
208
+ layout: [4, 96],
209
+ panelConstraints: [
210
+ {
211
+ collapsedSizePixels: 40,
212
+ collapsible: true,
213
+ defaultSizePixels: 150,
214
+ maxSizePixels: 150,
215
+ minSizePixels: 60,
216
+ },
217
+ {
218
+ minSizePercentage: 50,
219
+ },
220
+ ],
221
+ pivotIndices: [0, 1],
222
+ trigger: "imperative-api",
223
+ })
224
+ ).toEqual([15, 85]);
225
+ });
226
+
227
+ // Edge case
228
+ // Expanding from a collapsed state mimicking an imperative API call
229
+ it("[1++,2]", () => {
230
+ expect(
231
+ adjustLayoutByDelta({
232
+ delta: 30,
233
+ groupSizePixels: 100,
234
+ layout: [5, 95],
235
+ panelConstraints: [
236
+ {
237
+ collapsedSizePixels: 5,
238
+ collapsible: true,
239
+ maxSizePixels: 50,
240
+ minSizePixels: 25,
241
+ },
242
+ {
243
+ minSizePercentage: 50,
244
+ },
245
+ ],
246
+ pivotIndices: [0, 1],
247
+ trigger: "imperative-api",
248
+ })
249
+ ).toEqual([35, 65]);
250
+ });
251
+
252
+ // Edge case
253
+ // Expanding from a collapsed state mimicking an keyboard event
254
+ it("[1++,2]", () => {
255
+ expect(
256
+ adjustLayoutByDelta({
257
+ delta: 30,
258
+ groupSizePixels: 100,
259
+ layout: [5, 95],
260
+ panelConstraints: [
261
+ {
262
+ collapsedSizePixels: 5,
263
+ collapsible: true,
264
+ maxSizePixels: 50,
265
+ minSizePixels: 25,
266
+ },
267
+ {
268
+ minSizePercentage: 50,
269
+ },
270
+ ],
271
+ pivotIndices: [0, 1],
272
+ trigger: "keyboard",
273
+ })
274
+ ).toEqual([35, 65]);
275
+ });
276
+
277
+ // Edge case
278
+ // Expanding from a collapsed state mimicking an keyboard event when there is no min size
279
+ it("[1++,2]", () => {
280
+ expect(
281
+ adjustLayoutByDelta({
282
+ delta: 30,
283
+ groupSizePixels: 100,
284
+ layout: [0, 100],
285
+ panelConstraints: [
286
+ {
287
+ collapsedSizePixels: 0,
288
+ collapsible: true,
289
+ maxSizePixels: 50,
290
+ minSizePixels: 0,
291
+ },
292
+ {},
293
+ ],
294
+ pivotIndices: [0, 1],
295
+ trigger: "keyboard",
296
+ })
297
+ ).toEqual([30, 70]);
298
+ });
299
+
300
+ it("[1--,2]", () => {
301
+ expect(
302
+ adjustLayoutByDelta({
303
+ delta: -1,
304
+ groupSizePixels: 100,
305
+ layout: [50, 50],
306
+ panelConstraints: [{}, {}],
307
+ pivotIndices: [0, 1],
308
+ trigger: "imperative-api",
309
+ })
310
+ ).toEqual([49, 51]);
311
+ });
312
+
313
+ it("[1--,2]", () => {
314
+ expect(
315
+ adjustLayoutByDelta({
316
+ delta: -25,
317
+ groupSizePixels: 100,
318
+ layout: [50, 50],
319
+ panelConstraints: [{}, {}],
320
+ pivotIndices: [0, 1],
321
+ trigger: "imperative-api",
322
+ })
323
+ ).toEqual([25, 75]);
324
+ });
325
+
326
+ it("[1--,2]", () => {
327
+ expect(
328
+ adjustLayoutByDelta({
329
+ delta: -50,
330
+ groupSizePixels: 100,
331
+ layout: [50, 50],
332
+ panelConstraints: [{}, {}],
333
+ pivotIndices: [0, 1],
334
+ trigger: "imperative-api",
335
+ })
336
+ ).toEqual([0, 100]);
337
+ });
338
+
339
+ it("[1--,2]", () => {
340
+ expect(
341
+ adjustLayoutByDelta({
342
+ delta: -50,
343
+ groupSizePixels: 100,
344
+ layout: [50, 50],
345
+ panelConstraints: [
346
+ {
347
+ minSizePercentage: 20,
348
+ maxSizePercentage: 60,
349
+ },
350
+ {
351
+ minSizePercentage: 10,
352
+ maxSizePercentage: 90,
353
+ },
354
+ ],
355
+ pivotIndices: [0, 1],
356
+ trigger: "imperative-api",
357
+ })
358
+ ).toEqual([20, 80]);
359
+ });
360
+
361
+ it("[1--,2]", () => {
362
+ expect(
363
+ adjustLayoutByDelta({
364
+ delta: -25,
365
+ groupSizePixels: 100,
366
+ layout: [50, 50],
367
+ panelConstraints: [
368
+ {
369
+ collapsedSizePercentage: 5,
370
+ collapsible: true,
371
+ minSizePercentage: 25,
372
+ },
373
+ {},
374
+ ],
375
+ pivotIndices: [0, 1],
376
+ trigger: "imperative-api",
377
+ })
378
+ ).toEqual([25, 75]);
379
+ });
380
+
381
+ it("[1--,2]", () => {
382
+ expect(
383
+ adjustLayoutByDelta({
384
+ delta: -30,
385
+ groupSizePixels: 100,
386
+ layout: [50, 50],
387
+ panelConstraints: [
388
+ {
389
+ collapsedSizePercentage: 5,
390
+ collapsible: true,
391
+ minSizePercentage: 25,
392
+ },
393
+ {},
394
+ ],
395
+ pivotIndices: [0, 1],
396
+ trigger: "imperative-api",
397
+ })
398
+ ).toEqual([5, 95]);
399
+ });
400
+
401
+ it("[1--,2]", () => {
402
+ // Edge case
403
+ // The second panel should prevent the first panel from collapsing
404
+ expect(
405
+ adjustLayoutByDelta({
406
+ delta: -30,
407
+ groupSizePixels: 100,
408
+ layout: [50, 50],
409
+ panelConstraints: [
410
+ {
411
+ collapsedSizePercentage: 5,
412
+ collapsible: true,
413
+ minSizePercentage: 25,
414
+ },
415
+ { maxSizePercentage: 80 },
416
+ ],
417
+ pivotIndices: [0, 1],
418
+ trigger: "imperative-api",
419
+ })
420
+ ).toEqual([25, 75]);
421
+ });
422
+
423
+ it("[1++,2,3]", () => {
424
+ expect(
425
+ adjustLayoutByDelta({
426
+ delta: 1,
427
+ groupSizePixels: 100,
428
+ layout: [25, 50, 25],
429
+ panelConstraints: [{}, {}, {}],
430
+ pivotIndices: [0, 1],
431
+ trigger: "imperative-api",
432
+ })
433
+ ).toEqual([26, 49, 25]);
434
+ });
435
+
436
+ it("[1++,2,3]", () => {
437
+ expect(
438
+ adjustLayoutByDelta({
439
+ delta: 25,
440
+ groupSizePixels: 100,
441
+ layout: [25, 50, 25],
442
+ panelConstraints: [{}, {}, {}],
443
+ pivotIndices: [0, 1],
444
+ trigger: "imperative-api",
445
+ })
446
+ ).toEqual([50, 25, 25]);
447
+ });
448
+
449
+ it("[1++,2,3]", () => {
450
+ expect(
451
+ adjustLayoutByDelta({
452
+ delta: 50,
453
+ groupSizePixels: 100,
454
+ layout: [25, 50, 25],
455
+ panelConstraints: [{}, {}, {}],
456
+ pivotIndices: [0, 1],
457
+ trigger: "imperative-api",
458
+ })
459
+ ).toEqual([75, 0, 25]);
460
+ });
461
+
462
+ it("[1++,2,3]", () => {
463
+ expect(
464
+ adjustLayoutByDelta({
465
+ delta: 75,
466
+ groupSizePixels: 100,
467
+ layout: [25, 50, 25],
468
+ panelConstraints: [{}, {}, {}],
469
+ pivotIndices: [0, 1],
470
+ trigger: "imperative-api",
471
+ })
472
+ ).toEqual([100, 0, 0]);
473
+ });
474
+
475
+ it("[1++,2,3]", () => {
476
+ expect(
477
+ adjustLayoutByDelta({
478
+ delta: 25,
479
+ groupSizePixels: 100,
480
+ layout: [25, 50, 25],
481
+ panelConstraints: [
482
+ { maxSizePercentage: 35 },
483
+ { minSizePercentage: 25 },
484
+ {},
485
+ ],
486
+ pivotIndices: [0, 1],
487
+ trigger: "imperative-api",
488
+ })
489
+ ).toEqual([35, 40, 25]);
490
+ });
491
+
492
+ it("[1++,2,3]", () => {
493
+ // Any further than the max size should stop the drag/keyboard resize
494
+ expect(
495
+ adjustLayoutByDelta({
496
+ delta: 25,
497
+ groupSizePixels: 100,
498
+ layout: [25, 50, 25],
499
+ panelConstraints: [
500
+ { maxSizePercentage: 35 },
501
+ { minSizePercentage: 25 },
502
+ {},
503
+ ],
504
+ pivotIndices: [0, 1],
505
+ trigger: "imperative-api",
506
+ })
507
+ ).toEqual([35, 40, 25]);
508
+ });
509
+
510
+ it("[1++,2,3]", () => {
511
+ expect(
512
+ adjustLayoutByDelta({
513
+ delta: 5,
514
+ groupSizePixels: 100,
515
+ layout: [25, 40, 35],
516
+ panelConstraints: [
517
+ {},
518
+ {
519
+ collapsedSizePercentage: 5,
520
+ collapsible: true,
521
+ minSizePercentage: 25,
522
+ },
523
+ { minSizePercentage: 25 },
524
+ ],
525
+ pivotIndices: [0, 1],
526
+ trigger: "imperative-api",
527
+ })
528
+ ).toEqual([30, 35, 35]);
529
+ });
530
+
531
+ it("[1++,2,3]", () => {
532
+ expect(
533
+ adjustLayoutByDelta({
534
+ delta: 26,
535
+ groupSizePixels: 100,
536
+ layout: [25, 40, 35],
537
+ panelConstraints: [
538
+ {},
539
+ {
540
+ collapsedSizePercentage: 5,
541
+ collapsible: true,
542
+ minSizePercentage: 25,
543
+ },
544
+ { minSizePercentage: 25 },
545
+ ],
546
+ pivotIndices: [0, 1],
547
+ trigger: "imperative-api",
548
+ })
549
+ ).toEqual([60, 5, 35]);
550
+ });
551
+
552
+ it("[1++,2,3]", () => {
553
+ expect(
554
+ adjustLayoutByDelta({
555
+ delta: 80,
556
+ groupSizePixels: 100,
557
+ layout: [25, 40, 35],
558
+ panelConstraints: [
559
+ {},
560
+ {
561
+ collapsedSizePercentage: 5,
562
+ collapsible: true,
563
+ minSizePercentage: 25,
564
+ },
565
+ { minSizePercentage: 25 },
566
+ ],
567
+ pivotIndices: [0, 1],
568
+ trigger: "imperative-api",
569
+ })
570
+ ).toEqual([70, 5, 25]);
571
+ });
572
+
573
+ it("[1--,2,3]", () => {
574
+ expect(
575
+ adjustLayoutByDelta({
576
+ delta: -1,
577
+ groupSizePixels: 100,
578
+ layout: [25, 50, 25],
579
+ panelConstraints: [{}, {}, {}],
580
+ pivotIndices: [0, 1],
581
+ trigger: "imperative-api",
582
+ })
583
+ ).toEqual([24, 51, 25]);
584
+ });
585
+
586
+ it("[1--,2,3]", () => {
587
+ expect(
588
+ adjustLayoutByDelta({
589
+ delta: -25,
590
+ groupSizePixels: 100,
591
+ layout: [25, 50, 25],
592
+ panelConstraints: [{}, {}, {}],
593
+ pivotIndices: [0, 1],
594
+ trigger: "imperative-api",
595
+ })
596
+ ).toEqual([0, 75, 25]);
597
+ });
598
+
599
+ it("[1--,2,3]", () => {
600
+ expect(
601
+ adjustLayoutByDelta({
602
+ delta: -1,
603
+ groupSizePixels: 100,
604
+ layout: [25, 50, 25],
605
+ panelConstraints: [{ minSizePercentage: 20 }, {}, {}],
606
+ pivotIndices: [0, 1],
607
+ trigger: "imperative-api",
608
+ })
609
+ ).toEqual([24, 51, 25]);
610
+ });
611
+
612
+ it("[1--,2,3]", () => {
613
+ expect(
614
+ adjustLayoutByDelta({
615
+ delta: -10,
616
+ groupSizePixels: 100,
617
+ layout: [25, 50, 25],
618
+ panelConstraints: [{ minSizePercentage: 20 }, {}, {}],
619
+ pivotIndices: [0, 1],
620
+ trigger: "imperative-api",
621
+ })
622
+ ).toEqual([20, 55, 25]);
623
+ });
624
+
625
+ it("[1--,2,3]", () => {
626
+ expect(
627
+ adjustLayoutByDelta({
628
+ delta: -5,
629
+ groupSizePixels: 100,
630
+ layout: [25, 50, 25],
631
+ panelConstraints: [
632
+ {
633
+ // Implied min size 10
634
+ },
635
+ { maxSizePercentage: 70 },
636
+ { maxSizePercentage: 20 },
637
+ ],
638
+ pivotIndices: [0, 1],
639
+ trigger: "imperative-api",
640
+ })
641
+ ).toEqual([20, 55, 25]);
642
+ });
643
+
644
+ it("[1--,2,3]", () => {
645
+ expect(
646
+ adjustLayoutByDelta({
647
+ delta: -20,
648
+ groupSizePixels: 100,
649
+ layout: [25, 50, 25],
650
+ panelConstraints: [
651
+ {
652
+ // Implied min size 10
653
+ },
654
+ { maxSizePercentage: 70 },
655
+ { maxSizePercentage: 20 },
656
+ ],
657
+ pivotIndices: [0, 1],
658
+ trigger: "imperative-api",
659
+ })
660
+ ).toEqual([10, 65, 25]);
661
+ });
662
+
663
+ it("[1--,2,3]", () => {
664
+ expect(
665
+ adjustLayoutByDelta({
666
+ delta: -10,
667
+ groupSizePixels: 100,
668
+ layout: [25, 50, 25],
669
+ panelConstraints: [
670
+ {
671
+ collapsedSizePercentage: 5,
672
+ collapsible: true,
673
+ minSizePixels: 15,
674
+ },
675
+ {},
676
+ {},
677
+ ],
678
+ pivotIndices: [0, 1],
679
+ trigger: "imperative-api",
680
+ })
681
+ ).toEqual([15, 60, 25]);
682
+ });
683
+
684
+ it("[1--,2,3]", () => {
685
+ expect(
686
+ adjustLayoutByDelta({
687
+ delta: -20,
688
+ groupSizePixels: 100,
689
+ layout: [25, 50, 25],
690
+ panelConstraints: [
691
+ {
692
+ collapsedSizePercentage: 5,
693
+ collapsible: true,
694
+ minSizePixels: 15,
695
+ },
696
+ {},
697
+ {},
698
+ ],
699
+ pivotIndices: [0, 1],
700
+ trigger: "imperative-api",
701
+ })
702
+ ).toEqual([5, 70, 25]);
703
+ });
704
+
705
+ it("[1--,2,3]", () => {
706
+ expect(
707
+ adjustLayoutByDelta({
708
+ delta: -20,
709
+ groupSizePixels: 100,
710
+ layout: [45, 50, 5],
711
+ panelConstraints: [
712
+ {},
713
+ {
714
+ maxSizePercentage: 50,
715
+ },
716
+ {
717
+ collapsedSizePercentage: 5,
718
+ collapsible: true,
719
+ minSizePixels: 15,
720
+ },
721
+ ],
722
+ pivotIndices: [0, 1],
723
+ trigger: "imperative-api",
724
+ })
725
+ ).toEqual([45, 50, 5]);
726
+ });
727
+
728
+ it("[1,2++,3]", () => {
729
+ expect(
730
+ adjustLayoutByDelta({
731
+ delta: -1,
732
+ groupSizePixels: 100,
733
+ layout: [25, 50, 25],
734
+ panelConstraints: [{}, {}, {}],
735
+ pivotIndices: [1, 2],
736
+ trigger: "imperative-api",
737
+ })
738
+ ).toEqual([25, 49, 26]);
739
+ });
740
+
741
+ it("[1,2++,3]", () => {
742
+ expect(
743
+ adjustLayoutByDelta({
744
+ delta: -25,
745
+ groupSizePixels: 100,
746
+ layout: [25, 50, 25],
747
+ panelConstraints: [{}, {}, {}],
748
+ pivotIndices: [1, 2],
749
+ trigger: "imperative-api",
750
+ })
751
+ ).toEqual([25, 25, 50]);
752
+ });
753
+
754
+ it("[1,2++,3]", () => {
755
+ expect(
756
+ adjustLayoutByDelta({
757
+ delta: -50,
758
+ groupSizePixels: 100,
759
+ layout: [25, 50, 25],
760
+ panelConstraints: [{}, {}, {}],
761
+ pivotIndices: [1, 2],
762
+ trigger: "imperative-api",
763
+ })
764
+ ).toEqual([25, 0, 75]);
765
+ });
766
+
767
+ it("[1,2++,3]", () => {
768
+ expect(
769
+ adjustLayoutByDelta({
770
+ delta: -75,
771
+ groupSizePixels: 100,
772
+ layout: [25, 50, 25],
773
+ panelConstraints: [{}, {}, {}],
774
+ pivotIndices: [1, 2],
775
+ trigger: "imperative-api",
776
+ })
777
+ ).toEqual([0, 0, 100]);
778
+ });
779
+
780
+ it("[1,2++,3]", () => {
781
+ expect(
782
+ adjustLayoutByDelta({
783
+ delta: 5,
784
+ groupSizePixels: 100,
785
+ layout: [25, 50, 25],
786
+ panelConstraints: [{}, {}, { minSizePercentage: 15 }],
787
+ pivotIndices: [1, 2],
788
+ trigger: "imperative-api",
789
+ })
790
+ ).toEqual([25, 55, 20]);
791
+ });
792
+
793
+ it("[1,2++,3]", () => {
794
+ expect(
795
+ adjustLayoutByDelta({
796
+ delta: 20,
797
+ groupSizePixels: 100,
798
+ layout: [25, 50, 25],
799
+ panelConstraints: [{}, {}, { minSizePercentage: 15 }],
800
+ pivotIndices: [1, 2],
801
+ trigger: "imperative-api",
802
+ })
803
+ ).toEqual([25, 60, 15]);
804
+ });
805
+
806
+ it("[1,2++,3]", () => {
807
+ expect(
808
+ adjustLayoutByDelta({
809
+ delta: 5,
810
+ groupSizePixels: 100,
811
+ layout: [25, 50, 25],
812
+ panelConstraints: [
813
+ {},
814
+ {},
815
+ { collapsible: true, minSizePercentage: 20 },
816
+ ],
817
+ pivotIndices: [1, 2],
818
+ trigger: "imperative-api",
819
+ })
820
+ ).toEqual([25, 55, 20]);
821
+ });
822
+
823
+ it("[1,2++,3]", () => {
824
+ expect(
825
+ adjustLayoutByDelta({
826
+ delta: 10,
827
+ groupSizePixels: 100,
828
+ layout: [25, 50, 25],
829
+ panelConstraints: [
830
+ {},
831
+ {},
832
+ { collapsible: true, minSizePercentage: 20 },
833
+ ],
834
+ pivotIndices: [1, 2],
835
+ trigger: "imperative-api",
836
+ })
837
+ ).toEqual([25, 75, 0]);
838
+ });
839
+
840
+ it("[1,2--,3]", () => {
841
+ expect(
842
+ adjustLayoutByDelta({
843
+ delta: 1,
844
+ groupSizePixels: 100,
845
+ layout: [25, 50, 25],
846
+ panelConstraints: [{}, {}, {}],
847
+ pivotIndices: [1, 2],
848
+ trigger: "imperative-api",
849
+ })
850
+ ).toEqual([25, 51, 24]);
851
+ });
852
+
853
+ it("[1,2--,3]", () => {
854
+ expect(
855
+ adjustLayoutByDelta({
856
+ delta: 25,
857
+ groupSizePixels: 100,
858
+ layout: [25, 50, 25],
859
+ panelConstraints: [{}, {}, {}],
860
+ pivotIndices: [1, 2],
861
+ trigger: "imperative-api",
862
+ })
863
+ ).toEqual([25, 75, 0]);
864
+ });
865
+
866
+ it("[1,2--,3]", () => {
867
+ expect(
868
+ adjustLayoutByDelta({
869
+ delta: -20,
870
+ groupSizePixels: 100,
871
+ layout: [25, 50, 25],
872
+ panelConstraints: [{}, { minSizePercentage: 40 }, {}],
873
+ pivotIndices: [1, 2],
874
+ trigger: "imperative-api",
875
+ })
876
+ ).toEqual([15, 40, 45]);
877
+ });
878
+
879
+ it("[1,2--,3]", () => {
880
+ expect(
881
+ adjustLayoutByDelta({
882
+ delta: -10,
883
+ groupSizePixels: 100,
884
+ layout: [25, 50, 25],
885
+ panelConstraints: [{}, {}, { maxSizePercentage: 30 }],
886
+ pivotIndices: [1, 2],
887
+ trigger: "imperative-api",
888
+ })
889
+ ).toEqual([25, 45, 30]);
890
+ });
891
+
892
+ it("[1,2--,3]", () => {
893
+ expect(
894
+ adjustLayoutByDelta({
895
+ delta: -35,
896
+ groupSizePixels: 100,
897
+ layout: [25, 50, 25],
898
+ panelConstraints: [
899
+ {},
900
+ {
901
+ collapsedSizePercentage: 5,
902
+ collapsible: true,
903
+ minSizePercentage: 20,
904
+ },
905
+ {},
906
+ ],
907
+ pivotIndices: [1, 2],
908
+ trigger: "imperative-api",
909
+ })
910
+ ).toEqual([25, 5, 70]);
911
+ });
912
+
913
+ it("[1,2--,3]", () => {
914
+ expect(
915
+ adjustLayoutByDelta({
916
+ delta: -60,
917
+ groupSizePixels: 100,
918
+ layout: [25, 50, 25],
919
+ panelConstraints: [
920
+ {
921
+ collapsedSizePercentage: 5,
922
+ collapsible: true,
923
+ minSizePercentage: 20,
924
+ },
925
+ {},
926
+ {},
927
+ ],
928
+ pivotIndices: [1, 2],
929
+ trigger: "imperative-api",
930
+ })
931
+ ).toEqual([5, 0, 95]);
932
+ });
933
+
934
+ it("[1++,2,3,4]", () => {
935
+ expect(
936
+ adjustLayoutByDelta({
937
+ delta: 1,
938
+ groupSizePixels: 100,
939
+ layout: [25, 25, 25, 25],
940
+ panelConstraints: [{}, {}, {}, {}],
941
+ pivotIndices: [0, 1],
942
+ trigger: "imperative-api",
943
+ })
944
+ ).toEqual([26, 24, 25, 25]);
945
+ });
946
+
947
+ it("[1++,2,3,4]", () => {
948
+ expect(
949
+ adjustLayoutByDelta({
950
+ delta: 25,
951
+ groupSizePixels: 100,
952
+ layout: [25, 25, 25, 25],
953
+ panelConstraints: [{}, {}, {}, {}],
954
+ pivotIndices: [0, 1],
955
+ trigger: "imperative-api",
956
+ })
957
+ ).toEqual([50, 0, 25, 25]);
958
+ });
959
+
960
+ it("[1++,2,3,4]", () => {
961
+ expect(
962
+ adjustLayoutByDelta({
963
+ delta: 50,
964
+ groupSizePixels: 100,
965
+ layout: [25, 25, 25, 25],
966
+ panelConstraints: [{}, {}, {}, {}],
967
+ pivotIndices: [0, 1],
968
+ trigger: "imperative-api",
969
+ })
970
+ ).toEqual([75, 0, 0, 25]);
971
+ });
972
+
973
+ it("[1++,2,3,4]", () => {
974
+ expect(
975
+ adjustLayoutByDelta({
976
+ delta: 75,
977
+ groupSizePixels: 100,
978
+ layout: [25, 25, 25, 25],
979
+ panelConstraints: [{}, {}, {}, {}],
980
+ pivotIndices: [0, 1],
981
+ trigger: "imperative-api",
982
+ })
983
+ ).toEqual([100, 0, 0, 0]);
984
+ });
985
+
986
+ it("[1++,2,3,4]", () => {
987
+ expect(
988
+ adjustLayoutByDelta({
989
+ delta: 25,
990
+ groupSizePixels: 100,
991
+ layout: [25, 25, 25, 25],
992
+ panelConstraints: [{ maxSizePercentage: 35 }, {}, {}, {}],
993
+ pivotIndices: [0, 1],
994
+ trigger: "imperative-api",
995
+ })
996
+ ).toEqual([35, 15, 25, 25]);
997
+ });
998
+
999
+ it("[1++,2,3,4]", () => {
1000
+ expect(
1001
+ adjustLayoutByDelta({
1002
+ delta: 100,
1003
+ groupSizePixels: 100,
1004
+ layout: [25, 25, 25, 25],
1005
+ panelConstraints: [
1006
+ {},
1007
+ { minSizePercentage: 10 },
1008
+ { minSizePercentage: 10 },
1009
+ { minSizePercentage: 10 },
1010
+ ],
1011
+ pivotIndices: [0, 1],
1012
+ trigger: "imperative-api",
1013
+ })
1014
+ ).toEqual([70, 10, 10, 10]);
1015
+ });
1016
+
1017
+ it("[1++,2,3,4]", () => {
1018
+ expect(
1019
+ adjustLayoutByDelta({
1020
+ delta: 10,
1021
+ groupSizePixels: 100,
1022
+ layout: [25, 25, 25, 25],
1023
+ panelConstraints: [
1024
+ {},
1025
+ {
1026
+ collapsedSizePercentage: 5,
1027
+ collapsible: true,
1028
+ minSizePercentage: 20,
1029
+ },
1030
+ {
1031
+ collapsedSizePercentage: 5,
1032
+ collapsible: true,
1033
+ minSizePercentage: 20,
1034
+ },
1035
+ {
1036
+ collapsedSizePercentage: 5,
1037
+ collapsible: true,
1038
+ minSizePercentage: 20,
1039
+ },
1040
+ ],
1041
+ pivotIndices: [0, 1],
1042
+ trigger: "imperative-api",
1043
+ })
1044
+ ).toEqual([45, 5, 25, 25]);
1045
+ });
1046
+
1047
+ it("[1++,2,3,4]", () => {
1048
+ expect(
1049
+ adjustLayoutByDelta({
1050
+ delta: 40,
1051
+ groupSizePixels: 100,
1052
+ layout: [25, 25, 25, 25],
1053
+ panelConstraints: [
1054
+ {},
1055
+ {
1056
+ collapsedSizePercentage: 5,
1057
+ collapsible: true,
1058
+ minSizePercentage: 20,
1059
+ },
1060
+ {
1061
+ collapsedSizePercentage: 5,
1062
+ collapsible: true,
1063
+ minSizePercentage: 20,
1064
+ },
1065
+ {
1066
+ collapsedSizePercentage: 5,
1067
+ collapsible: true,
1068
+ minSizePercentage: 20,
1069
+ },
1070
+ ],
1071
+ pivotIndices: [0, 1],
1072
+ trigger: "imperative-api",
1073
+ })
1074
+ ).toEqual([65, 5, 5, 25]);
1075
+ });
1076
+
1077
+ it("[1++,2,3,4]", () => {
1078
+ expect(
1079
+ adjustLayoutByDelta({
1080
+ delta: 100,
1081
+ groupSizePixels: 100,
1082
+ layout: [25, 25, 25, 25],
1083
+ panelConstraints: [
1084
+ {},
1085
+ {
1086
+ collapsedSizePercentage: 5,
1087
+ collapsible: true,
1088
+ minSizePercentage: 20,
1089
+ },
1090
+ {
1091
+ collapsedSizePercentage: 5,
1092
+ collapsible: true,
1093
+ minSizePercentage: 20,
1094
+ },
1095
+ {
1096
+ collapsedSizePercentage: 5,
1097
+ collapsible: true,
1098
+ minSizePercentage: 20,
1099
+ },
1100
+ ],
1101
+ pivotIndices: [0, 1],
1102
+ trigger: "imperative-api",
1103
+ })
1104
+ ).toEqual([85, 5, 5, 5]);
1105
+ });
1106
+
1107
+ it("[1--,2,3,4]", () => {
1108
+ expect(
1109
+ adjustLayoutByDelta({
1110
+ delta: -1,
1111
+ groupSizePixels: 100,
1112
+ layout: [25, 25, 25, 25],
1113
+ panelConstraints: [{}, {}, {}, {}],
1114
+ pivotIndices: [0, 1],
1115
+ trigger: "imperative-api",
1116
+ })
1117
+ ).toEqual([24, 26, 25, 25]);
1118
+ });
1119
+
1120
+ it("[1--,2,3,4]", () => {
1121
+ expect(
1122
+ adjustLayoutByDelta({
1123
+ delta: -25,
1124
+ groupSizePixels: 100,
1125
+ layout: [25, 25, 25, 25],
1126
+ panelConstraints: [{}, {}, {}, {}],
1127
+ pivotIndices: [0, 1],
1128
+ trigger: "imperative-api",
1129
+ })
1130
+ ).toEqual([0, 50, 25, 25]);
1131
+ });
1132
+
1133
+ it("[1--,2,3,4]", () => {
1134
+ expect(
1135
+ adjustLayoutByDelta({
1136
+ delta: -10,
1137
+ groupSizePixels: 100,
1138
+ layout: [25, 25, 25, 25],
1139
+ panelConstraints: [{ minSizePercentage: 20 }, {}, {}, {}],
1140
+ pivotIndices: [0, 1],
1141
+ trigger: "imperative-api",
1142
+ })
1143
+ ).toEqual([20, 30, 25, 25]);
1144
+ });
1145
+
1146
+ it("[1--,2,3,4]", () => {
1147
+ expect(
1148
+ adjustLayoutByDelta({
1149
+ delta: -25,
1150
+ groupSizePixels: 100,
1151
+ layout: [25, 25, 25, 25],
1152
+ panelConstraints: [{}, { maxSizePercentage: 35 }, {}, {}],
1153
+ pivotIndices: [0, 1],
1154
+ trigger: "imperative-api",
1155
+ })
1156
+ ).toEqual([15, 35, 25, 25]);
1157
+ });
1158
+
1159
+ it("[1--,2,3,4]", () => {
1160
+ expect(
1161
+ adjustLayoutByDelta({
1162
+ delta: -10,
1163
+ groupSizePixels: 100,
1164
+ layout: [25, 25, 25, 25],
1165
+ panelConstraints: [
1166
+ {
1167
+ collapsedSizePercentage: 5,
1168
+ collapsible: true,
1169
+ minSizePercentage: 20,
1170
+ },
1171
+ {},
1172
+ {},
1173
+ {},
1174
+ ],
1175
+ pivotIndices: [0, 1],
1176
+ trigger: "imperative-api",
1177
+ })
1178
+ ).toEqual([5, 45, 25, 25]);
1179
+ });
1180
+
1181
+ it("[1--,2,3,4]", () => {
1182
+ expect(
1183
+ adjustLayoutByDelta({
1184
+ delta: -10,
1185
+ groupSizePixels: 100,
1186
+ layout: [25, 25, 25, 25],
1187
+ panelConstraints: [
1188
+ {
1189
+ collapsedSizePercentage: 5,
1190
+ collapsible: true,
1191
+ minSizePercentage: 20,
1192
+ },
1193
+ { maxSizePercentage: 35 },
1194
+ {},
1195
+ {},
1196
+ ],
1197
+ pivotIndices: [0, 1],
1198
+ trigger: "imperative-api",
1199
+ })
1200
+ ).toEqual([5, 35, 35, 25]);
1201
+ });
1202
+
1203
+ it("[1--,2,3,4]", () => {
1204
+ // This might be controversial behavior;
1205
+ // Perhaps the 1st panel should collapse
1206
+ // rather than being blocked by the max size constraints of the 2nd panel
1207
+ // since the 3rd panel has room to grow still
1208
+ //
1209
+ // An alternate layout result might be: [5, 30, 40, 25]
1210
+ expect(
1211
+ adjustLayoutByDelta({
1212
+ delta: -10,
1213
+ groupSizePixels: 100,
1214
+ layout: [25, 25, 25, 25],
1215
+ panelConstraints: [
1216
+ {
1217
+ collapsedSizePercentage: 5,
1218
+ collapsible: true,
1219
+ minSizePercentage: 20,
1220
+ },
1221
+ { maxSizePercentage: 30 },
1222
+ {},
1223
+ {},
1224
+ ],
1225
+ pivotIndices: [0, 1],
1226
+ trigger: "imperative-api",
1227
+ })
1228
+ ).toEqual([20, 30, 25, 25]);
1229
+ });
1230
+
1231
+ it("[1--,2,3,4]", () => {
1232
+ // This might be controversial behavior;
1233
+ // Perhaps the 1st panel should collapse
1234
+ // rather than being blocked by the max size constraints of the 2nd panel
1235
+ // since the 3rd panel has room to grow still
1236
+ //
1237
+ // An alternate layout result might be: [5, 30, 35, 30]
1238
+ expect(
1239
+ adjustLayoutByDelta({
1240
+ delta: -10,
1241
+ groupSizePixels: 100,
1242
+ layout: [25, 25, 25, 25],
1243
+ panelConstraints: [
1244
+ {
1245
+ collapsedSizePercentage: 5,
1246
+ collapsible: true,
1247
+ minSizePercentage: 20,
1248
+ },
1249
+ { maxSizePercentage: 30 },
1250
+ { maxSizePercentage: 35 },
1251
+ {},
1252
+ ],
1253
+ pivotIndices: [0, 1],
1254
+ trigger: "imperative-api",
1255
+ })
1256
+ ).toEqual([20, 30, 25, 25]);
1257
+ });
1258
+
1259
+ it("[1--,2,3,4]", () => {
1260
+ expect(
1261
+ adjustLayoutByDelta({
1262
+ delta: -10,
1263
+ groupSizePixels: 100,
1264
+ layout: [25, 25, 25, 25],
1265
+ panelConstraints: [
1266
+ {
1267
+ collapsedSizePercentage: 5,
1268
+ collapsible: true,
1269
+ minSizePercentage: 20,
1270
+ },
1271
+ { maxSizePercentage: 35 },
1272
+ { maxSizePercentage: 35 },
1273
+ { maxSizePercentage: 35 },
1274
+ ],
1275
+ pivotIndices: [0, 1],
1276
+ trigger: "imperative-api",
1277
+ })
1278
+ ).toEqual([5, 35, 35, 25]);
1279
+ });
1280
+
1281
+ it("[1,2++,3,4]", () => {
1282
+ expect(
1283
+ adjustLayoutByDelta({
1284
+ delta: 10,
1285
+ groupSizePixels: 100,
1286
+ layout: [25, 25, 25, 25],
1287
+ panelConstraints: [{}, {}, {}, {}],
1288
+ pivotIndices: [1, 2],
1289
+ trigger: "imperative-api",
1290
+ })
1291
+ ).toEqual([25, 35, 15, 25]);
1292
+ });
1293
+
1294
+ it("[1,2++,3,4]", () => {
1295
+ expect(
1296
+ adjustLayoutByDelta({
1297
+ delta: 30,
1298
+ groupSizePixels: 100,
1299
+ layout: [25, 25, 25, 25],
1300
+ panelConstraints: [{}, {}, {}, {}],
1301
+ pivotIndices: [1, 2],
1302
+ trigger: "imperative-api",
1303
+ })
1304
+ ).toEqual([25, 55, 0, 20]);
1305
+ });
1306
+
1307
+ it("[1,2++,3,4]", () => {
1308
+ expect(
1309
+ adjustLayoutByDelta({
1310
+ delta: 50,
1311
+ groupSizePixels: 100,
1312
+ layout: [25, 25, 25, 25],
1313
+ panelConstraints: [{}, {}, {}, {}],
1314
+ pivotIndices: [1, 2],
1315
+ trigger: "imperative-api",
1316
+ })
1317
+ ).toEqual([25, 75, 0, 0]);
1318
+ });
1319
+
1320
+ it("[1,2++,3,4]", () => {
1321
+ expect(
1322
+ adjustLayoutByDelta({
1323
+ delta: 50,
1324
+ groupSizePixels: 100,
1325
+ layout: [25, 25, 25, 25],
1326
+ panelConstraints: [{}, { maxSizePercentage: 35 }, {}, {}],
1327
+ pivotIndices: [1, 2],
1328
+ trigger: "imperative-api",
1329
+ })
1330
+ ).toEqual([25, 35, 15, 25]);
1331
+ });
1332
+
1333
+ it("[1,2++,3,4]", () => {
1334
+ expect(
1335
+ adjustLayoutByDelta({
1336
+ delta: 50,
1337
+ groupSizePixels: 100,
1338
+ layout: [25, 25, 25, 25],
1339
+ panelConstraints: [{}, {}, { minSizePercentage: 20 }, {}],
1340
+ pivotIndices: [1, 2],
1341
+ trigger: "imperative-api",
1342
+ })
1343
+ ).toEqual([25, 55, 20, 0]);
1344
+ });
1345
+
1346
+ it("[1,2++,3,4]", () => {
1347
+ expect(
1348
+ adjustLayoutByDelta({
1349
+ delta: 10,
1350
+ groupSizePixels: 100,
1351
+ layout: [25, 25, 25, 25],
1352
+ panelConstraints: [
1353
+ {},
1354
+ {},
1355
+ {},
1356
+ {
1357
+ collapsedSizePercentage: 5,
1358
+ collapsible: true,
1359
+ minSizePercentage: 10,
1360
+ },
1361
+ ],
1362
+ pivotIndices: [1, 2],
1363
+ trigger: "imperative-api",
1364
+ })
1365
+ ).toEqual([25, 35, 15, 25]);
1366
+ });
1367
+
1368
+ it("[1,2++,3,4]", () => {
1369
+ expect(
1370
+ adjustLayoutByDelta({
1371
+ delta: 30,
1372
+ groupSizePixels: 100,
1373
+ layout: [25, 25, 25, 25],
1374
+ panelConstraints: [
1375
+ {},
1376
+ {},
1377
+ {
1378
+ collapsedSizePercentage: 5,
1379
+ collapsible: true,
1380
+ minSizePercentage: 10,
1381
+ },
1382
+ {},
1383
+ ],
1384
+ pivotIndices: [1, 2],
1385
+ trigger: "imperative-api",
1386
+ })
1387
+ ).toEqual([25, 55, 5, 15]);
1388
+ });
1389
+
1390
+ it("[1,2++,3,4]", () => {
1391
+ expect(
1392
+ adjustLayoutByDelta({
1393
+ delta: 50,
1394
+ groupSizePixels: 100,
1395
+ layout: [25, 25, 25, 25],
1396
+ panelConstraints: [
1397
+ {},
1398
+ {},
1399
+ {
1400
+ collapsedSizePercentage: 5,
1401
+ collapsible: true,
1402
+ minSizePercentage: 10,
1403
+ },
1404
+ { minSizePercentage: 10 },
1405
+ ],
1406
+ pivotIndices: [1, 2],
1407
+ trigger: "imperative-api",
1408
+ })
1409
+ ).toEqual([25, 60, 5, 10]);
1410
+ });
1411
+
1412
+ it("[1,2--,3,4]", () => {
1413
+ expect(
1414
+ adjustLayoutByDelta({
1415
+ delta: -25,
1416
+ groupSizePixels: 100,
1417
+ layout: [25, 25, 25, 25],
1418
+ panelConstraints: [{}, {}, {}, {}],
1419
+ pivotIndices: [1, 2],
1420
+ trigger: "imperative-api",
1421
+ })
1422
+ ).toEqual([25, 0, 50, 25]);
1423
+ });
1424
+
1425
+ it("[1,2--,3,4]", () => {
1426
+ expect(
1427
+ adjustLayoutByDelta({
1428
+ delta: -50,
1429
+ groupSizePixels: 100,
1430
+ layout: [25, 25, 25, 25],
1431
+ panelConstraints: [{}, {}, {}, {}],
1432
+ pivotIndices: [1, 2],
1433
+ trigger: "imperative-api",
1434
+ })
1435
+ ).toEqual([0, 0, 75, 25]);
1436
+ });
1437
+
1438
+ it("[1,2--,3,4]", () => {
1439
+ expect(
1440
+ adjustLayoutByDelta({
1441
+ delta: -50,
1442
+ groupSizePixels: 100,
1443
+ layout: [25, 25, 25, 25],
1444
+ panelConstraints: [{}, { minSizePercentage: 20 }, {}, {}],
1445
+ pivotIndices: [1, 2],
1446
+ trigger: "imperative-api",
1447
+ })
1448
+ ).toEqual([0, 20, 55, 25]);
1449
+ });
1450
+
1451
+ it("[1,2--,3,4]", () => {
1452
+ expect(
1453
+ adjustLayoutByDelta({
1454
+ delta: -50,
1455
+ groupSizePixels: 100,
1456
+ layout: [25, 25, 25, 25],
1457
+ panelConstraints: [{ minSizePercentage: 20 }, {}, {}, {}],
1458
+ pivotIndices: [1, 2],
1459
+ trigger: "imperative-api",
1460
+ })
1461
+ ).toEqual([20, 0, 55, 25]);
1462
+ });
1463
+
1464
+ it("[1,2--,3,4]", () => {
1465
+ expect(
1466
+ adjustLayoutByDelta({
1467
+ delta: -50,
1468
+ groupSizePixels: 100,
1469
+ layout: [25, 25, 25, 25],
1470
+ panelConstraints: [
1471
+ { minSizePercentage: 20 },
1472
+ { minSizePercentage: 20 },
1473
+ {},
1474
+ {},
1475
+ ],
1476
+ pivotIndices: [1, 2],
1477
+ trigger: "imperative-api",
1478
+ })
1479
+ ).toEqual([20, 20, 35, 25]);
1480
+ });
1481
+
1482
+ it("[1,2--,3,4]", () => {
1483
+ expect(
1484
+ adjustLayoutByDelta({
1485
+ delta: -5,
1486
+ groupSizePixels: 100,
1487
+ layout: [25, 25, 25, 25],
1488
+ panelConstraints: [
1489
+ {
1490
+ collapsedSizePercentage: 5,
1491
+ collapsible: true,
1492
+ minSizePercentage: 20,
1493
+ },
1494
+ {},
1495
+ {},
1496
+ {},
1497
+ ],
1498
+ pivotIndices: [1, 2],
1499
+ trigger: "imperative-api",
1500
+ })
1501
+ ).toEqual([25, 20, 30, 25]);
1502
+ });
1503
+
1504
+ it("[1,2--,3,4]", () => {
1505
+ expect(
1506
+ adjustLayoutByDelta({
1507
+ delta: -50,
1508
+ groupSizePixels: 100,
1509
+ layout: [25, 25, 25, 25],
1510
+ panelConstraints: [
1511
+ {
1512
+ collapsedSizePercentage: 5,
1513
+ collapsible: true,
1514
+ minSizePercentage: 20,
1515
+ },
1516
+ {},
1517
+ {},
1518
+ {},
1519
+ ],
1520
+ pivotIndices: [1, 2],
1521
+ trigger: "imperative-api",
1522
+ })
1523
+ ).toEqual([5, 0, 70, 25]);
1524
+ });
1525
+
1526
+ it("[1,2--,3,4]", () => {
1527
+ expect(
1528
+ adjustLayoutByDelta({
1529
+ delta: -50,
1530
+ groupSizePixels: 100,
1531
+ layout: [25, 25, 25, 25],
1532
+ panelConstraints: [
1533
+ {},
1534
+ {
1535
+ collapsedSizePercentage: 5,
1536
+ collapsible: true,
1537
+ minSizePercentage: 20,
1538
+ },
1539
+ {},
1540
+ {},
1541
+ ],
1542
+ pivotIndices: [1, 2],
1543
+ trigger: "imperative-api",
1544
+ })
1545
+ ).toEqual([0, 5, 70, 25]);
1546
+ });
1547
+
1548
+ it("[1,2,3++,4]", () => {
1549
+ expect(
1550
+ adjustLayoutByDelta({
1551
+ delta: 10,
1552
+ groupSizePixels: 100,
1553
+ layout: [25, 25, 25, 25],
1554
+ panelConstraints: [{}, {}, {}, {}],
1555
+ pivotIndices: [2, 3],
1556
+ trigger: "imperative-api",
1557
+ })
1558
+ ).toEqual([25, 25, 35, 15]);
1559
+ });
1560
+
1561
+ it("[1,2,3++,4]", () => {
1562
+ expect(
1563
+ adjustLayoutByDelta({
1564
+ delta: 30,
1565
+ groupSizePixels: 100,
1566
+ layout: [25, 25, 25, 25],
1567
+ panelConstraints: [{}, {}, {}, {}],
1568
+ pivotIndices: [2, 3],
1569
+ trigger: "imperative-api",
1570
+ })
1571
+ ).toEqual([25, 25, 50, 0]);
1572
+ });
1573
+
1574
+ it("[1,2,3++,4]", () => {
1575
+ expect(
1576
+ adjustLayoutByDelta({
1577
+ delta: 30,
1578
+ groupSizePixels: 100,
1579
+ layout: [25, 25, 25, 25],
1580
+ panelConstraints: [{}, {}, { maxSizePercentage: 40 }, {}],
1581
+ pivotIndices: [2, 3],
1582
+ trigger: "imperative-api",
1583
+ })
1584
+ ).toEqual([25, 25, 40, 10]);
1585
+ });
1586
+
1587
+ it("[1,2,3++,4]", () => {
1588
+ expect(
1589
+ adjustLayoutByDelta({
1590
+ delta: 30,
1591
+ groupSizePixels: 100,
1592
+ layout: [25, 25, 25, 25],
1593
+ panelConstraints: [{}, {}, {}, { minSizePercentage: 10 }],
1594
+ pivotIndices: [2, 3],
1595
+ trigger: "imperative-api",
1596
+ })
1597
+ ).toEqual([25, 25, 40, 10]);
1598
+ });
1599
+
1600
+ it("[1,2,3++,4]", () => {
1601
+ expect(
1602
+ adjustLayoutByDelta({
1603
+ delta: 5,
1604
+ groupSizePixels: 100,
1605
+ layout: [25, 25, 25, 25],
1606
+ panelConstraints: [
1607
+ {},
1608
+ {},
1609
+ {},
1610
+ {
1611
+ collapsedSizePercentage: 5,
1612
+ collapsible: true,
1613
+ minSizePercentage: 20,
1614
+ },
1615
+ ],
1616
+ pivotIndices: [2, 3],
1617
+ trigger: "imperative-api",
1618
+ })
1619
+ ).toEqual([25, 25, 30, 20]);
1620
+ });
1621
+
1622
+ it("[1,2,3++,4]", () => {
1623
+ expect(
1624
+ adjustLayoutByDelta({
1625
+ delta: 50,
1626
+ groupSizePixels: 100,
1627
+ layout: [25, 25, 25, 25],
1628
+ panelConstraints: [
1629
+ {},
1630
+ {},
1631
+ {},
1632
+ {
1633
+ collapsedSizePercentage: 5,
1634
+ collapsible: true,
1635
+ minSizePercentage: 20,
1636
+ },
1637
+ ],
1638
+ pivotIndices: [2, 3],
1639
+ trigger: "imperative-api",
1640
+ })
1641
+ ).toEqual([25, 25, 45, 5]);
1642
+ });
1643
+
1644
+ it("[1,2,3--,4]", () => {
1645
+ expect(
1646
+ adjustLayoutByDelta({
1647
+ delta: -10,
1648
+ groupSizePixels: 100,
1649
+ layout: [25, 25, 25, 25],
1650
+ panelConstraints: [{}, {}, {}, {}],
1651
+ pivotIndices: [2, 3],
1652
+ trigger: "imperative-api",
1653
+ })
1654
+ ).toEqual([25, 25, 15, 35]);
1655
+ });
1656
+
1657
+ it("[1,2,3--,4]", () => {
1658
+ expect(
1659
+ adjustLayoutByDelta({
1660
+ delta: -40,
1661
+ groupSizePixels: 100,
1662
+ layout: [25, 25, 25, 25],
1663
+ panelConstraints: [{}, {}, {}, {}],
1664
+ pivotIndices: [2, 3],
1665
+ trigger: "imperative-api",
1666
+ })
1667
+ ).toEqual([25, 10, 0, 65]);
1668
+ });
1669
+
1670
+ it("[1,2,3--,4]", () => {
1671
+ expect(
1672
+ adjustLayoutByDelta({
1673
+ delta: -100,
1674
+ groupSizePixels: 100,
1675
+ layout: [25, 25, 25, 25],
1676
+ panelConstraints: [{}, {}, {}, {}],
1677
+ pivotIndices: [2, 3],
1678
+ trigger: "imperative-api",
1679
+ })
1680
+ ).toEqual([0, 0, 0, 100]);
1681
+ });
1682
+
1683
+ it("[1,2,3--,4]", () => {
1684
+ expect(
1685
+ adjustLayoutByDelta({
1686
+ delta: -50,
1687
+ groupSizePixels: 100,
1688
+ layout: [25, 25, 25, 25],
1689
+ panelConstraints: [
1690
+ { minSizePercentage: 10 },
1691
+ { minSizePercentage: 10 },
1692
+ { minSizePercentage: 10 },
1693
+ {},
1694
+ ],
1695
+ pivotIndices: [2, 3],
1696
+ trigger: "imperative-api",
1697
+ })
1698
+ ).toEqual([10, 10, 10, 70]);
1699
+ });
1700
+
1701
+ it("[1,2,3--,4]", () => {
1702
+ expect(
1703
+ adjustLayoutByDelta({
1704
+ delta: -50,
1705
+ groupSizePixels: 100,
1706
+ layout: [25, 25, 25, 25],
1707
+ panelConstraints: [{}, {}, {}, { maxSizePercentage: 40 }],
1708
+ pivotIndices: [2, 3],
1709
+ trigger: "imperative-api",
1710
+ })
1711
+ ).toEqual([25, 25, 10, 40]);
1712
+ });
1713
+
1714
+ it("[1,2,3--,4]", () => {
1715
+ expect(
1716
+ adjustLayoutByDelta({
1717
+ delta: -50,
1718
+ groupSizePixels: 100,
1719
+ layout: [25, 25, 25, 25],
1720
+ panelConstraints: [{}, { minSizePercentage: 5 }, {}, {}],
1721
+ pivotIndices: [2, 3],
1722
+ trigger: "imperative-api",
1723
+ })
1724
+ ).toEqual([20, 5, 0, 75]);
1725
+ });
1726
+
1727
+ it("[1,2,3--,4]", () => {
1728
+ expect(
1729
+ adjustLayoutByDelta({
1730
+ delta: -100,
1731
+ groupSizePixels: 100,
1732
+ layout: [25, 25, 25, 25],
1733
+ panelConstraints: [
1734
+ {
1735
+ collapsedSizePercentage: 5,
1736
+ collapsible: true,
1737
+ minSizePercentage: 20,
1738
+ },
1739
+ {
1740
+ collapsedSizePercentage: 5,
1741
+ collapsible: true,
1742
+ minSizePercentage: 20,
1743
+ },
1744
+ {
1745
+ collapsedSizePercentage: 5,
1746
+ collapsible: true,
1747
+ minSizePercentage: 20,
1748
+ },
1749
+ {},
1750
+ ],
1751
+ pivotIndices: [2, 3],
1752
+ trigger: "imperative-api",
1753
+ })
1754
+ ).toEqual([5, 5, 5, 85]);
1755
+ });
1756
+
1757
+ it("[1,2,3--,4]", () => {
1758
+ expect(
1759
+ adjustLayoutByDelta({
1760
+ delta: -100,
1761
+ groupSizePixels: 100,
1762
+ layout: [25, 25, 25, 25],
1763
+ panelConstraints: [
1764
+ {
1765
+ minSizePercentage: 20,
1766
+ },
1767
+ {
1768
+ collapsedSizePercentage: 5,
1769
+ collapsible: true,
1770
+ minSizePercentage: 20,
1771
+ },
1772
+ {
1773
+ minSizePercentage: 20,
1774
+ },
1775
+ {},
1776
+ ],
1777
+ pivotIndices: [2, 3],
1778
+ trigger: "imperative-api",
1779
+ })
1780
+ ).toEqual([20, 5, 20, 55]);
1781
+ });
1782
+
1783
+ describe("invalid layouts", () => {
1784
+ it("should ignore changes that violate max or min size constraints", () => {
1785
+ expect(
1786
+ adjustLayoutByDelta({
1787
+ delta: 1,
1788
+ groupSizePixels: 100,
1789
+ layout: [50, 50],
1790
+ panelConstraints: [{ maxSizePercentage: 50 }, {}],
1791
+ pivotIndices: [0, 1],
1792
+ trigger: "imperative-api",
1793
+ })
1794
+ ).toEqual([50, 50]);
1795
+
1796
+ expect(
1797
+ adjustLayoutByDelta({
1798
+ delta: 1,
1799
+ groupSizePixels: 100,
1800
+ layout: [50, 50],
1801
+ panelConstraints: [{}, { minSizePercentage: 50 }],
1802
+ pivotIndices: [0, 1],
1803
+ trigger: "imperative-api",
1804
+ })
1805
+ ).toEqual([50, 50]);
1806
+ });
1807
+ });
1808
+ });