@window-splitter/react 0.8.0

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 (81) hide show
  1. package/.storybook/main.ts +17 -0
  2. package/.storybook/preview.ts +14 -0
  3. package/.tshy/build.json +8 -0
  4. package/.tshy/commonjs.json +19 -0
  5. package/.tshy/esm.json +18 -0
  6. package/.turbo/turbo-build.log +5 -0
  7. package/.turbo/turbo-lint.log +5 -0
  8. package/CHANGELOG.md +606 -0
  9. package/README.md +53 -0
  10. package/dist/commonjs/ReactWindowSplitter.d.ts +19 -0
  11. package/dist/commonjs/ReactWindowSplitter.d.ts.map +1 -0
  12. package/dist/commonjs/ReactWindowSplitter.js +558 -0
  13. package/dist/commonjs/ReactWindowSplitter.js.map +1 -0
  14. package/dist/commonjs/ReactWindowSplitter.stories.d.ts +47 -0
  15. package/dist/commonjs/ReactWindowSplitter.stories.d.ts.map +1 -0
  16. package/dist/commonjs/ReactWindowSplitter.stories.js +330 -0
  17. package/dist/commonjs/ReactWindowSplitter.stories.js.map +1 -0
  18. package/dist/commonjs/ReactWindowSplitter.test.d.ts +2 -0
  19. package/dist/commonjs/ReactWindowSplitter.test.d.ts.map +1 -0
  20. package/dist/commonjs/ReactWindowSplitter.test.js +219 -0
  21. package/dist/commonjs/ReactWindowSplitter.test.js.map +1 -0
  22. package/dist/commonjs/bundle.size.d.ts +2 -0
  23. package/dist/commonjs/bundle.size.d.ts.map +1 -0
  24. package/dist/commonjs/bundle.size.js +29 -0
  25. package/dist/commonjs/bundle.size.js.map +1 -0
  26. package/dist/commonjs/index.d.ts +3 -0
  27. package/dist/commonjs/index.d.ts.map +1 -0
  28. package/dist/commonjs/index.js +18 -0
  29. package/dist/commonjs/index.js.map +1 -0
  30. package/dist/commonjs/package.json +3 -0
  31. package/dist/commonjs/useIndexedChildren.d.ts +8 -0
  32. package/dist/commonjs/useIndexedChildren.d.ts.map +1 -0
  33. package/dist/commonjs/useIndexedChildren.js +81 -0
  34. package/dist/commonjs/useIndexedChildren.js.map +1 -0
  35. package/dist/commonjs/useMove.d.ts +8 -0
  36. package/dist/commonjs/useMove.d.ts.map +1 -0
  37. package/dist/commonjs/useMove.js +19 -0
  38. package/dist/commonjs/useMove.js.map +1 -0
  39. package/dist/esm/ReactWindowSplitter.d.ts +19 -0
  40. package/dist/esm/ReactWindowSplitter.d.ts.map +1 -0
  41. package/dist/esm/ReactWindowSplitter.js +532 -0
  42. package/dist/esm/ReactWindowSplitter.js.map +1 -0
  43. package/dist/esm/ReactWindowSplitter.stories.d.ts +47 -0
  44. package/dist/esm/ReactWindowSplitter.stories.d.ts.map +1 -0
  45. package/dist/esm/ReactWindowSplitter.stories.js +286 -0
  46. package/dist/esm/ReactWindowSplitter.stories.js.map +1 -0
  47. package/dist/esm/ReactWindowSplitter.test.d.ts +2 -0
  48. package/dist/esm/ReactWindowSplitter.test.d.ts.map +1 -0
  49. package/dist/esm/ReactWindowSplitter.test.js +191 -0
  50. package/dist/esm/ReactWindowSplitter.test.js.map +1 -0
  51. package/dist/esm/bundle.size.d.ts +2 -0
  52. package/dist/esm/bundle.size.d.ts.map +1 -0
  53. package/dist/esm/bundle.size.js +4 -0
  54. package/dist/esm/bundle.size.js.map +1 -0
  55. package/dist/esm/index.d.ts +3 -0
  56. package/dist/esm/index.d.ts.map +1 -0
  57. package/dist/esm/index.js +2 -0
  58. package/dist/esm/index.js.map +1 -0
  59. package/dist/esm/package.json +3 -0
  60. package/dist/esm/useIndexedChildren.d.ts +8 -0
  61. package/dist/esm/useIndexedChildren.d.ts.map +1 -0
  62. package/dist/esm/useIndexedChildren.js +54 -0
  63. package/dist/esm/useIndexedChildren.js.map +1 -0
  64. package/dist/esm/useMove.d.ts +8 -0
  65. package/dist/esm/useMove.d.ts.map +1 -0
  66. package/dist/esm/useMove.js +16 -0
  67. package/dist/esm/useMove.js.map +1 -0
  68. package/eslint.config.js +3 -0
  69. package/package.json +108 -0
  70. package/rsbuild.config.js +25 -0
  71. package/src/ReactWindowSplitter.stories.tsx +705 -0
  72. package/src/ReactWindowSplitter.test.tsx +384 -0
  73. package/src/ReactWindowSplitter.tsx +884 -0
  74. package/src/__snapshots__/ReactWindowSplitter.test.tsx.snap +58 -0
  75. package/src/bundle.size.ts +4 -0
  76. package/src/index.ts +2 -0
  77. package/src/useIndexedChildren.tsx +79 -0
  78. package/src/useMove.ts +22 -0
  79. package/tsconfig.json +6 -0
  80. package/vitest.config.ts +20 -0
  81. package/vitest.setup.ts +7 -0
@@ -0,0 +1,705 @@
1
+ import React, { useMemo } from "react";
2
+ import { spring } from "framer-motion";
3
+ import {
4
+ PanelGroup,
5
+ PanelGroupProps,
6
+ Panel,
7
+ PanelProps,
8
+ PanelResizer,
9
+ PanelResizerProps,
10
+ } from "./ReactWindowSplitter.js";
11
+ import { PanelGroupHandle, PanelHandle } from "@window-splitter/interface";
12
+
13
+ export default {
14
+ title: "Components/React",
15
+ };
16
+
17
+ function StyledPanelGroup(props: PanelGroupProps) {
18
+ return (
19
+ <PanelGroup
20
+ {...props}
21
+ style={{
22
+ border: "1px solid rgba(0, 0, 0, 0.3)",
23
+ background: "rgba(0, 0, 0, 0.1)",
24
+ borderRadius: 12,
25
+ boxSizing: "border-box",
26
+ ...props.style,
27
+ }}
28
+ />
29
+ );
30
+ }
31
+
32
+ function StyledPanel({ children, ...props }: PanelProps) {
33
+ return (
34
+ <Panel
35
+ style={{
36
+ overflow: "hidden",
37
+ }}
38
+ {...props}
39
+ >
40
+ <div
41
+ style={{
42
+ height: "100%",
43
+ width: "100%",
44
+ padding: 20,
45
+ display: "flex",
46
+ alignItems: "center",
47
+ justifyContent: "center",
48
+ overflow: "hidden",
49
+ boxSizing: "border-box",
50
+ }}
51
+ >
52
+ {children}
53
+ </div>
54
+ </Panel>
55
+ );
56
+ }
57
+
58
+ function StyledResizer(props: PanelResizerProps) {
59
+ return <PanelResizer size="10px" style={{ background: "red" }} {...props} />;
60
+ }
61
+
62
+ export function Simple({ handle }: { handle?: React.Ref<PanelGroupHandle> }) {
63
+ return (
64
+ <StyledPanelGroup handle={handle} style={{ height: 200 }}>
65
+ <StyledPanel>Panel 1</StyledPanel>
66
+ <StyledResizer />
67
+ <StyledPanel min="100px">Panel 2</StyledPanel>
68
+ </StyledPanelGroup>
69
+ );
70
+ }
71
+
72
+ export function Autosave({ handle }: { handle?: React.Ref<PanelGroupHandle> }) {
73
+ return (
74
+ <StyledPanelGroup handle={handle} autosaveId="autosave-example">
75
+ <StyledPanel id="1">Panel 1</StyledPanel>
76
+ <StyledResizer id="resizer" />
77
+ <StyledPanel id="2">Panel 2</StyledPanel>
78
+ </StyledPanelGroup>
79
+ );
80
+ }
81
+
82
+ export function AutosaveCollapsible({
83
+ handle,
84
+ onCollapseChange = console.log,
85
+ }: {
86
+ handle?: React.Ref<PanelGroupHandle>;
87
+ onCollapseChange?: (c: boolean) => void;
88
+ }) {
89
+ return (
90
+ <StyledPanelGroup handle={handle} autosaveId="autosave-example-2">
91
+ <StyledPanel
92
+ id="1"
93
+ collapsible
94
+ collapsedSize="100px"
95
+ min="140px"
96
+ onCollapseChange={onCollapseChange}
97
+ >
98
+ Collapsible
99
+ </StyledPanel>
100
+ <StyledResizer id="resizer" />
101
+ <StyledPanel id="2">Panel 2</StyledPanel>
102
+ </StyledPanelGroup>
103
+ );
104
+ }
105
+
106
+ export function DynamicConstraints({
107
+ handle,
108
+ }: {
109
+ handle?: React.Ref<PanelGroupHandle>;
110
+ }) {
111
+ const [customOn, setCustomOn] = React.useState(false);
112
+
113
+ return (
114
+ <>
115
+ <StyledPanelGroup handle={handle}>
116
+ <StyledPanel
117
+ default="100px"
118
+ {...(customOn ? { min: "200px" } : { min: "100px" })}
119
+ >
120
+ <div>Panel 1</div>
121
+ </StyledPanel>
122
+ <StyledResizer />
123
+ <StyledPanel min="100px">
124
+ <div>Panel 2</div>
125
+ </StyledPanel>
126
+ <StyledResizer />
127
+ <StyledPanel
128
+ {...(customOn ? { min: "100px" } : { min: "400px" })}
129
+ {...(customOn ? { max: "300px" } : { max: "700px" })}
130
+ >
131
+ <div>Panel 3</div>
132
+ </StyledPanel>
133
+ </StyledPanelGroup>
134
+ <button type="button" onClick={() => setCustomOn(!customOn)}>
135
+ Toggle Custom
136
+ </button>
137
+ </>
138
+ );
139
+ }
140
+
141
+ export function SimpleMin() {
142
+ return (
143
+ <StyledPanelGroup>
144
+ <StyledPanel min="100px">
145
+ <div>Panel 1</div>
146
+ </StyledPanel>
147
+ <StyledResizer />
148
+ <StyledPanel min="100px">
149
+ <div>Panel 2</div>
150
+ </StyledPanel>
151
+ <StyledResizer />
152
+ <StyledPanel min="100px">
153
+ <div>Panel 3</div>
154
+ </StyledPanel>
155
+ </StyledPanelGroup>
156
+ );
157
+ }
158
+
159
+ export function SimpleMinMax() {
160
+ return (
161
+ <StyledPanelGroup>
162
+ <StyledPanel min="100px" max="200px">
163
+ <div>Panel 1</div>
164
+ </StyledPanel>
165
+ <StyledResizer />
166
+ <StyledPanel min="100px">
167
+ <div>Panel 2</div>
168
+ </StyledPanel>
169
+ <StyledResizer size="20px" />
170
+ <StyledPanel min="100px">
171
+ <div>Panel 3</div>
172
+ </StyledPanel>
173
+ </StyledPanelGroup>
174
+ );
175
+ }
176
+
177
+ export function SimpleConstraints() {
178
+ return (
179
+ <StyledPanelGroup>
180
+ <StyledPanel min="100px" max="50%">
181
+ <div>Panel 1</div>
182
+ </StyledPanel>
183
+ <StyledResizer />
184
+ <StyledPanel>
185
+ <div>Panel 2</div>
186
+ </StyledPanel>
187
+ </StyledPanelGroup>
188
+ );
189
+ }
190
+
191
+ export function HorizontalLayout() {
192
+ return (
193
+ <StyledPanelGroup orientation="horizontal">
194
+ <StyledPanel default="30%" min="20%">
195
+ left
196
+ </StyledPanel>
197
+ <StyledResizer />
198
+ <StyledPanel min="20%">middle</StyledPanel>
199
+ <StyledResizer />
200
+ <StyledPanel default="30%" min="20%">
201
+ right
202
+ </StyledPanel>
203
+ </StyledPanelGroup>
204
+ );
205
+ }
206
+
207
+ export function VerticalLayout({
208
+ handle,
209
+ }: {
210
+ handle?: React.Ref<PanelGroupHandle>;
211
+ }) {
212
+ return (
213
+ <StyledPanelGroup
214
+ handle={handle}
215
+ orientation="vertical"
216
+ style={{ height: 322 }}
217
+ >
218
+ <StyledPanel default="30%" min="20%">
219
+ top
220
+ </StyledPanel>
221
+ <StyledResizer />
222
+ <StyledPanel min="20%">middle</StyledPanel>
223
+ <StyledResizer />
224
+ <StyledPanel default="30%" min="20%">
225
+ bottom
226
+ </StyledPanel>
227
+ </StyledPanelGroup>
228
+ );
229
+ }
230
+
231
+ export function VerticalLayout2({
232
+ handle,
233
+ }: {
234
+ handle?: React.Ref<PanelGroupHandle>;
235
+ }) {
236
+ return (
237
+ <StyledPanelGroup
238
+ handle={handle}
239
+ orientation="vertical"
240
+ style={{ height: "calc(100vh - 100px)" }}
241
+ >
242
+ <StyledPanel default="200px" min="200px">
243
+ top
244
+ </StyledPanel>
245
+ <StyledResizer />
246
+ <StyledPanel
247
+ min="200px"
248
+ collapsedSize="60px"
249
+ defaultCollapsed
250
+ collapsible
251
+ >
252
+ middle
253
+ </StyledPanel>
254
+ </StyledPanelGroup>
255
+ );
256
+ }
257
+
258
+ export function NestedGroups() {
259
+ return (
260
+ <PanelGroup
261
+ orientation="horizontal"
262
+ style={{
263
+ border: "1px solid rgba(0, 0, 0, 0.3)",
264
+ borderRadius: 12,
265
+ height: 400,
266
+ }}
267
+ >
268
+ <Panel min="10%">left</Panel>
269
+ <StyledResizer />
270
+ <Panel min="10%">
271
+ <PanelGroup orientation="vertical">
272
+ <Panel min="10%">top</Panel>
273
+ <StyledResizer />
274
+ <Panel min="10%">
275
+ <PanelGroup orientation="horizontal">
276
+ <Panel min="20%">left</Panel>
277
+ <StyledResizer />
278
+ <Panel min="20%">right</Panel>
279
+ </PanelGroup>
280
+ </Panel>
281
+ </PanelGroup>
282
+ </Panel>
283
+ <StyledResizer />
284
+ <Panel min="10%">right</Panel>
285
+ </PanelGroup>
286
+ );
287
+ }
288
+
289
+ export function WithOverflow() {
290
+ return (
291
+ <StyledPanelGroup style={{ height: 400 }}>
292
+ <Panel min="200px">
293
+ <div
294
+ style={{
295
+ overflow: "auto",
296
+ padding: 40,
297
+ height: "100%",
298
+ boxSizing: "border-box",
299
+ }}
300
+ >
301
+ <p>
302
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
303
+ euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
304
+ tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
305
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
306
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
307
+ eu tincidunt nisl nisl eu nisl.
308
+ </p>
309
+ <p>
310
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
311
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
312
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
313
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
314
+ eu tincidunt nisl nisl eu nisl.
315
+ </p>
316
+ <p>
317
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
318
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
319
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
320
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
321
+ eu tincidunt nisl nisl eu nisl.
322
+ </p>
323
+ <p>
324
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
325
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
326
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
327
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
328
+ eu tincidunt nisl nisl eu nisl.
329
+ </p>
330
+ <p>
331
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
332
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
333
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
334
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
335
+ eu tincidunt nisl nisl eu nisl.
336
+ </p>
337
+ </div>
338
+ </Panel>
339
+ <StyledResizer />
340
+ <Panel min="200px">
341
+ <div
342
+ style={{
343
+ overflow: "auto",
344
+ padding: 40,
345
+ height: "100%",
346
+ boxSizing: "border-box",
347
+ }}
348
+ >
349
+ <p>
350
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
351
+ euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
352
+ tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
353
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
354
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
355
+ eu tincidunt nisl nisl eu nisl.
356
+ </p>
357
+ <p>
358
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
359
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
360
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
361
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
362
+ eu tincidunt nisl nisl eu nisl.
363
+ </p>
364
+ <p>
365
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
366
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
367
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
368
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
369
+ eu tincidunt nisl nisl eu nisl.
370
+ </p>
371
+ <p>
372
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
373
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
374
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
375
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
376
+ eu tincidunt nisl nisl eu nisl.
377
+ </p>
378
+ <p>
379
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
380
+ eu tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
381
+ ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl.
382
+ Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi,
383
+ eu tincidunt nisl nisl eu nisl.
384
+ </p>
385
+ </div>
386
+ </Panel>
387
+ </StyledPanelGroup>
388
+ );
389
+ }
390
+
391
+ export function Collapsible({
392
+ leftPanelHandle,
393
+ rightPanelHandle,
394
+ handle,
395
+ }: {
396
+ leftPanelHandle?: React.Ref<PanelHandle>;
397
+ handle?: React.Ref<PanelGroupHandle>;
398
+ rightPanelHandle?: React.Ref<PanelHandle>;
399
+ }) {
400
+ const [collapsed, setCollapsed] = React.useState(true);
401
+
402
+ return (
403
+ <StyledPanelGroup handle={handle}>
404
+ <StyledPanel
405
+ handle={leftPanelHandle}
406
+ min="100px"
407
+ collapsible
408
+ collapsedSize="60px"
409
+ style={{ border: "10px solid green", boxSizing: "border-box" }}
410
+ onCollapseChange={(isCollapsed) => {
411
+ console.log("COLLAPSE PASSIVE", isCollapsed);
412
+ }}
413
+ >
414
+ <div>1</div>
415
+ </StyledPanel>
416
+ <StyledResizer />
417
+ <StyledPanel min="100px">
418
+ <div>2</div>
419
+ </StyledPanel>
420
+ <StyledResizer id="resizer-2" />
421
+ <StyledPanel
422
+ handle={rightPanelHandle}
423
+ min="100px"
424
+ collapsible
425
+ collapsedSize="60px"
426
+ defaultCollapsed
427
+ collapseAnimation={{ easing: "bounce", duration: 1000 }}
428
+ style={{ border: "10px solid blue", boxSizing: "border-box" }}
429
+ collapsed={collapsed}
430
+ onCollapseChange={(isCollapsed) => {
431
+ console.log("COLLAPSE CONTROLLED", isCollapsed);
432
+ setCollapsed(isCollapsed);
433
+ }}
434
+ >
435
+ <div>3</div>
436
+ </StyledPanel>
437
+ </StyledPanelGroup>
438
+ );
439
+ }
440
+
441
+ export function CustomCollapseAnimation() {
442
+ const springFn = useMemo(() => {
443
+ return spring({
444
+ keyframes: [0, 1],
445
+ velocity: 1,
446
+ stiffness: 100,
447
+ damping: 10,
448
+ mass: 1.0,
449
+ });
450
+ }, []);
451
+
452
+ return (
453
+ <StyledPanelGroup>
454
+ <StyledPanel
455
+ min="100px"
456
+ collapsible
457
+ collapsedSize="60px"
458
+ style={{ border: "10px solid green", boxSizing: "border-box" }}
459
+ >
460
+ 1
461
+ </StyledPanel>
462
+ <StyledResizer />
463
+ <StyledPanel min="100px">2</StyledPanel>
464
+ <StyledResizer />
465
+ <StyledPanel
466
+ style={{ border: "10px solid blue", boxSizing: "border-box" }}
467
+ min="100px"
468
+ collapsible
469
+ collapsedSize="60px"
470
+ defaultCollapsed
471
+ collapseAnimation={{
472
+ easing: (t) => springFn.next(t * 1000).value,
473
+ duration: 1000,
474
+ }}
475
+ >
476
+ 3
477
+ </StyledPanel>
478
+ </StyledPanelGroup>
479
+ );
480
+ }
481
+
482
+ export function ImperativePanel() {
483
+ const groupRef = React.useRef<PanelGroupHandle>(null);
484
+ const panelRef = React.useRef<PanelHandle>(null);
485
+
486
+ return (
487
+ <>
488
+ <StyledPanelGroup handle={groupRef}>
489
+ <StyledPanel
490
+ handle={panelRef}
491
+ min="100px"
492
+ collapsible
493
+ collapsedSize="60px"
494
+ >
495
+ 1
496
+ </StyledPanel>
497
+ <StyledResizer />
498
+ <StyledPanel min="100px">2</StyledPanel>
499
+ <StyledResizer />
500
+ <StyledPanel
501
+ min="100px"
502
+ collapsible
503
+ collapsedSize="60px"
504
+ defaultCollapsed
505
+ >
506
+ 3
507
+ </StyledPanel>
508
+ </StyledPanelGroup>
509
+
510
+ <div>
511
+ <button
512
+ type="button"
513
+ onClick={() => alert(`Sizes: ${groupRef.current?.getPixelSizes()}`)}
514
+ >
515
+ Get pixel sizes
516
+ </button>
517
+ <button
518
+ type="button"
519
+ onClick={() =>
520
+ alert(`Sizes: ${groupRef.current?.getPercentageSizes()}`)
521
+ }
522
+ >
523
+ Get percent sizes
524
+ </button>
525
+ <button
526
+ type="button"
527
+ onClick={() =>
528
+ groupRef.current?.setSizes([
529
+ "200px",
530
+ "10px",
531
+ "50%",
532
+ "10px",
533
+ "150px",
534
+ ])
535
+ }
536
+ >
537
+ Override sizes
538
+ </button>
539
+ </div>
540
+
541
+ <div>
542
+ <button type="button" onClick={() => panelRef.current?.collapse()}>
543
+ Collapse
544
+ </button>
545
+ <button
546
+ type="button"
547
+ onClick={() => alert(`Collapsed: ${panelRef.current?.isCollapsed()}`)}
548
+ >
549
+ Is Collapsed?
550
+ </button>
551
+ <button type="button" onClick={() => panelRef.current?.expand()}>
552
+ Expand
553
+ </button>
554
+ <button
555
+ type="button"
556
+ onClick={() => alert(`Expanded: ${panelRef.current?.isExpanded()}`)}
557
+ >
558
+ Is Expanded?
559
+ </button>
560
+ <button
561
+ type="button"
562
+ onClick={() => alert(`Id: ${panelRef.current?.getId()}`)}
563
+ >
564
+ Get Id
565
+ </button>
566
+ <button
567
+ type="button"
568
+ onClick={() => alert(`Size: ${panelRef.current?.getPixelSize()}`)}
569
+ >
570
+ Get Pixel Size
571
+ </button>
572
+ <button
573
+ type="button"
574
+ onClick={() =>
575
+ alert(`Percentage: ${panelRef.current?.getPercentageSize()}`)
576
+ }
577
+ >
578
+ Get Percentage Size
579
+ </button>
580
+ <button type="button" onClick={() => panelRef.current?.setSize("30px")}>
581
+ Set size to 100px
582
+ </button>
583
+ <button type="button" onClick={() => panelRef.current?.setSize("50%")}>
584
+ Set size to 50%
585
+ </button>
586
+ </div>
587
+ </>
588
+ );
589
+ }
590
+
591
+ export function ConditionalPanel({
592
+ handle,
593
+ }: {
594
+ handle?: React.Ref<PanelGroupHandle>;
595
+ }) {
596
+ const [isExpanded, setIsExpanded] = React.useState(false);
597
+
598
+ return (
599
+ <React.StrictMode>
600
+ <StyledPanelGroup handle={handle}>
601
+ <StyledPanel id="panel-1" min="100px" collapsible collapsedSize="60px">
602
+ <div>1</div>
603
+ </StyledPanel>
604
+ <StyledResizer id="handle-1" />
605
+ <StyledPanel id="panel-2" min="100px">
606
+ <div>2</div>
607
+ </StyledPanel>
608
+ {isExpanded && (
609
+ <>
610
+ <StyledResizer id="handle-2" />
611
+ <StyledPanel id="panel-3" min="100px">
612
+ 3
613
+ <button type="button" onClick={() => setIsExpanded(false)}>
614
+ Close
615
+ </button>
616
+ </StyledPanel>
617
+ </>
618
+ )}
619
+ </StyledPanelGroup>
620
+ <button type="button" onClick={() => setIsExpanded(true)}>
621
+ Expand
622
+ </button>
623
+ </React.StrictMode>
624
+ );
625
+ }
626
+
627
+ export function ConditionalPanelComplex() {
628
+ const [isExpanded, setIsExpanded] = React.useState(false);
629
+
630
+ return (
631
+ <React.StrictMode>
632
+ <StyledPanelGroup>
633
+ <StyledPanel id="panel-1" min="100px" collapsible collapsedSize="60px">
634
+ <div>1</div>
635
+ </StyledPanel>
636
+ <StyledResizer id="handle-1" />
637
+ <StyledPanel id="panel-2" min="100px">
638
+ <div>2</div>
639
+ </StyledPanel>
640
+ <StyledResizer id="handle-2" />
641
+ <StyledPanel id="panel-3" min="100px">
642
+ <div>3</div>
643
+ </StyledPanel>
644
+ {isExpanded && (
645
+ <>
646
+ <StyledResizer id="handle-3" />
647
+ <StyledPanel id="panel-4" min="100px">
648
+ expanded
649
+ <button type="button" onClick={() => setIsExpanded(false)}>
650
+ Close
651
+ </button>
652
+ </StyledPanel>
653
+ </>
654
+ )}
655
+ <StyledResizer id="handle-4" />
656
+ <StyledPanel
657
+ min="200px"
658
+ collapsible
659
+ collapsedSize="60px"
660
+ defaultCollapsed
661
+ id="panel-5"
662
+ >
663
+ <div>4</div>
664
+ </StyledPanel>
665
+ </StyledPanelGroup>
666
+ <button type="button" onClick={() => setIsExpanded(true)}>
667
+ Expand
668
+ </button>
669
+ </React.StrictMode>
670
+ );
671
+ }
672
+
673
+ export function WithDefaultWidth() {
674
+ return (
675
+ <PanelGroup style={{ height: "400px" }}>
676
+ <Panel style={{ backgroundColor: "#333366" }} />
677
+ <PanelResizer size="3px" />
678
+ {/* I expected the right panel to be 100px wide */}
679
+ <Panel
680
+ default="100px"
681
+ min="100px"
682
+ max="400px"
683
+ style={{ backgroundColor: "#ff3366" }}
684
+ />
685
+ </PanelGroup>
686
+ );
687
+ }
688
+
689
+ export function StaticAtRest({
690
+ handle,
691
+ }: {
692
+ handle?: React.Ref<PanelGroupHandle>;
693
+ }) {
694
+ return (
695
+ <StyledPanelGroup handle={handle} style={{ height: 200 }}>
696
+ <StyledPanel min="100px" max="300px" isStaticAtRest>
697
+ Panel 1
698
+ </StyledPanel>
699
+ <StyledResizer />
700
+ <StyledPanel min="100px">Panel 2</StyledPanel>
701
+ <StyledResizer />
702
+ <StyledPanel min="100px">Panel 3</StyledPanel>
703
+ </StyledPanelGroup>
704
+ );
705
+ }