@window-splitter/svelte 0.8.4
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/.storybook/main.ts +33 -0
- package/.storybook/preview.ts +14 -0
- package/.tshy/build.json +8 -0
- package/.tshy/commonjs.json +19 -0
- package/.tshy/esm.json +18 -0
- package/.turbo/turbo-build.log +6 -0
- package/CHANGELOG.md +20 -0
- package/README.md +58 -0
- package/dist/Panel.svelte +178 -0
- package/dist/Panel.svelte.d.ts +19 -0
- package/dist/Panel.svelte.d.ts.map +1 -0
- package/dist/PanelGroup.svelte +159 -0
- package/dist/PanelGroup.svelte.d.ts +18 -0
- package/dist/PanelGroup.svelte.d.ts.map +1 -0
- package/dist/PanelResizer.svelte +171 -0
- package/dist/PanelResizer.svelte.d.ts +8 -0
- package/dist/PanelResizer.svelte.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/eslint.config.js +24 -0
- package/package.json +92 -0
- package/src/SvelteWindowSplitter.test.svelte.ts +283 -0
- package/src/__snapshots__/SvelteWindowSplitter.test.svelte.ts.snap +56 -0
- package/src/__snapshots__/SvelteWindowSplitter.test.ts.snap +54 -0
- package/src/lib/Panel.svelte +178 -0
- package/src/lib/PanelGroup.svelte +159 -0
- package/src/lib/PanelResizer.svelte +171 -0
- package/src/lib/index.ts +3 -0
- package/src/stories/Autosave.svelte +52 -0
- package/src/stories/AutosaveCollapsible.svelte +65 -0
- package/src/stories/AutosaveCookie.svelte +63 -0
- package/src/stories/Collapsible.svelte +112 -0
- package/src/stories/Conditional.svelte +70 -0
- package/src/stories/DynamicConstraints.svelte +73 -0
- package/src/stories/Simple.svelte +48 -0
- package/src/stories/SvelteWindowSplitter.stories.svelte +468 -0
- package/src/stories/VerticalLayout.svelte +58 -0
- package/svelte.config.js +7 -0
- package/tsconfig.json +6 -0
- package/vite.config.js +7 -0
- package/vitest.config.js +19 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
<script module>
|
|
2
|
+
import { defineMeta } from "@storybook/addon-svelte-csf";
|
|
3
|
+
import PanelGroup from "../lib/PanelGroup.svelte";
|
|
4
|
+
import Panel from "../lib/Panel.svelte";
|
|
5
|
+
import PanelResizer from "../lib/PanelResizer.svelte";
|
|
6
|
+
import { spring } from "framer-motion";
|
|
7
|
+
import SimpleStory from "./Simple.svelte";
|
|
8
|
+
import VerticalLayoutStory from "./VerticalLayout.svelte";
|
|
9
|
+
import ConditionalStory from "./Conditional.svelte";
|
|
10
|
+
import DynamicConstraintsStory from "./DynamicConstraints.svelte";
|
|
11
|
+
import AutosaveStory from "./Autosave.svelte";
|
|
12
|
+
import AutosaveCollapsibleStory from "./AutosaveCollapsible.svelte";
|
|
13
|
+
import AutosaveCookieStory from "./AutosaveCookie.svelte";
|
|
14
|
+
import CollapsibleStory from "./Collapsible.svelte";
|
|
15
|
+
// More on how to set up stories at: https://storybook.js.org/docs/writing-stories
|
|
16
|
+
const { Story } = defineMeta({
|
|
17
|
+
title: "WindowSplitter/Svelte",
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const springFn = spring({
|
|
21
|
+
keyframes: [0, 1],
|
|
22
|
+
velocity: 1,
|
|
23
|
+
stiffness: 100,
|
|
24
|
+
damping: 10,
|
|
25
|
+
mass: 1.0,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
let isExpanded = $state(false);
|
|
29
|
+
const toggleExpanded = () => {
|
|
30
|
+
isExpanded = !isExpanded;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
let panel;
|
|
34
|
+
let group;
|
|
35
|
+
</script>
|
|
36
|
+
|
|
37
|
+
<Story name="Simple">
|
|
38
|
+
<SimpleStory />
|
|
39
|
+
</Story>
|
|
40
|
+
|
|
41
|
+
<Story name="Autosave">
|
|
42
|
+
<AutosaveStory />
|
|
43
|
+
</Story>
|
|
44
|
+
|
|
45
|
+
<Story name="AutosaveCookie">
|
|
46
|
+
<AutosaveCookieStory />
|
|
47
|
+
</Story>
|
|
48
|
+
|
|
49
|
+
<Story name="AutosaveCollapsible">
|
|
50
|
+
<AutosaveCollapsibleStory />
|
|
51
|
+
</Story>
|
|
52
|
+
|
|
53
|
+
<Story name="DynamicConstraints">
|
|
54
|
+
<DynamicConstraintsStory />
|
|
55
|
+
</Story>
|
|
56
|
+
|
|
57
|
+
<Story name="SimpleMin">
|
|
58
|
+
<PanelGroup class="panel-group">
|
|
59
|
+
<Panel min="100px" class="panel">1</Panel>
|
|
60
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
61
|
+
<Panel min="100px" class="panel">2</Panel>
|
|
62
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
63
|
+
<Panel min="100px" class="panel">3</Panel>
|
|
64
|
+
</PanelGroup>
|
|
65
|
+
</Story>
|
|
66
|
+
|
|
67
|
+
<Story name="SimpleMinMax">
|
|
68
|
+
<PanelGroup class="panel-group">
|
|
69
|
+
<Panel min="100px" max="200px" class="panel">1</Panel>
|
|
70
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
71
|
+
<Panel min="100px" class="panel">2</Panel>
|
|
72
|
+
<PanelResizer class="panel-resizer" size="20px" />
|
|
73
|
+
<Panel min="100px" class="panel">3</Panel>
|
|
74
|
+
</PanelGroup>
|
|
75
|
+
</Story>
|
|
76
|
+
|
|
77
|
+
<Story name="SimpleConstraints">
|
|
78
|
+
<PanelGroup class="panel-group">
|
|
79
|
+
<Panel min="100px" max="50%" class="panel">1</Panel>
|
|
80
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
81
|
+
<Panel class="panel">2</Panel>
|
|
82
|
+
</PanelGroup>
|
|
83
|
+
</Story>
|
|
84
|
+
|
|
85
|
+
<Story name="HorizontalLayout">
|
|
86
|
+
<PanelGroup orientation="horizontal" class="panel-group">
|
|
87
|
+
<Panel default="30%" min="20%" class="panel">left</Panel>
|
|
88
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
89
|
+
<Panel min="20%" class="panel">middle</Panel>
|
|
90
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
91
|
+
<Panel default="30%" min="20%" class="panel">right</Panel>
|
|
92
|
+
</PanelGroup>
|
|
93
|
+
</Story>
|
|
94
|
+
|
|
95
|
+
<Story name="VerticalLayout">
|
|
96
|
+
<VerticalLayoutStory />
|
|
97
|
+
</Story>
|
|
98
|
+
|
|
99
|
+
<Story name="VerticalLayout2">
|
|
100
|
+
<PanelGroup orientation="vertical" class="panel-group vertical-example-2">
|
|
101
|
+
<Panel default="200px" min="200px" class="panel">top</Panel>
|
|
102
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
103
|
+
<Panel
|
|
104
|
+
min="200px"
|
|
105
|
+
collapsedSize="60px"
|
|
106
|
+
defaultCollapsed
|
|
107
|
+
collapsible
|
|
108
|
+
class="panel"
|
|
109
|
+
>
|
|
110
|
+
middle
|
|
111
|
+
</Panel>
|
|
112
|
+
</PanelGroup>
|
|
113
|
+
</Story>
|
|
114
|
+
|
|
115
|
+
<Story name="NestedGroups">
|
|
116
|
+
<PanelGroup
|
|
117
|
+
orientation="horizontal"
|
|
118
|
+
class="panel-group nested-groups-example"
|
|
119
|
+
>
|
|
120
|
+
<Panel min="10%">1</Panel>
|
|
121
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
122
|
+
<Panel min="10%">
|
|
123
|
+
<PanelGroup orientation="vertical">
|
|
124
|
+
<Panel min="10%">2-1</Panel>
|
|
125
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
126
|
+
<Panel min="10%">
|
|
127
|
+
<PanelGroup orientation="horizontal">
|
|
128
|
+
<Panel min="20%">2-2-1</Panel>
|
|
129
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
130
|
+
<Panel min="20%">2-2-2</Panel>
|
|
131
|
+
</PanelGroup>
|
|
132
|
+
</Panel>
|
|
133
|
+
</PanelGroup>
|
|
134
|
+
</Panel>
|
|
135
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
136
|
+
<Panel min="10%">3</Panel>
|
|
137
|
+
</PanelGroup>
|
|
138
|
+
</Story>
|
|
139
|
+
|
|
140
|
+
<Story name="WithOverflow">
|
|
141
|
+
<PanelGroup class="panel-group with-overflow-example">
|
|
142
|
+
<Panel min="200px">
|
|
143
|
+
<div
|
|
144
|
+
style:overflow="auto"
|
|
145
|
+
style:padding="40px"
|
|
146
|
+
style:height="100%"
|
|
147
|
+
style:box-sizing="border-box"
|
|
148
|
+
>
|
|
149
|
+
<p>
|
|
150
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
|
|
151
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
152
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
153
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
154
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
155
|
+
tincidunt nisl nisl eu nisl.
|
|
156
|
+
</p>
|
|
157
|
+
<p>
|
|
158
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
159
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
160
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
161
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
162
|
+
tincidunt nisl nisl eu nisl.
|
|
163
|
+
</p>
|
|
164
|
+
<p>
|
|
165
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
166
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
167
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
168
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
169
|
+
tincidunt nisl nisl eu nisl.
|
|
170
|
+
</p>
|
|
171
|
+
<p>
|
|
172
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
173
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
174
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
175
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
176
|
+
tincidunt nisl nisl eu nisl.
|
|
177
|
+
</p>
|
|
178
|
+
<p>
|
|
179
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
180
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
181
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
182
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
183
|
+
tincidunt nisl nisl eu nisl.
|
|
184
|
+
</p>
|
|
185
|
+
</div>
|
|
186
|
+
</Panel>
|
|
187
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
188
|
+
<Panel min="200px">
|
|
189
|
+
<div
|
|
190
|
+
style:overflow="auto"
|
|
191
|
+
style:padding="40px"
|
|
192
|
+
style:height="100%"
|
|
193
|
+
style:box-sizing="border-box"
|
|
194
|
+
>
|
|
195
|
+
<p>
|
|
196
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec
|
|
197
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
198
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
199
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
200
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
201
|
+
tincidunt nisl nisl eu nisl.
|
|
202
|
+
</p>
|
|
203
|
+
<p>
|
|
204
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
205
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
206
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
207
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
208
|
+
tincidunt nisl nisl eu nisl.
|
|
209
|
+
</p>
|
|
210
|
+
<p>
|
|
211
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
212
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
213
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
214
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
215
|
+
tincidunt nisl nisl eu nisl.
|
|
216
|
+
</p>
|
|
217
|
+
<p>
|
|
218
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
219
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
220
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
221
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
222
|
+
tincidunt nisl nisl eu nisl.
|
|
223
|
+
</p>
|
|
224
|
+
<p>
|
|
225
|
+
Sed euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
226
|
+
tincidunt nisl nisl eu nisl. Sed euismod, nisl eget ultricies
|
|
227
|
+
ultrices, nunc nisi aliquam nisi, eu tincidunt nisl nisl eu nisl. Sed
|
|
228
|
+
euismod, nisl eget ultricies ultrices, nunc nisi aliquam nisi, eu
|
|
229
|
+
tincidunt nisl nisl eu nisl.
|
|
230
|
+
</p>
|
|
231
|
+
</div>
|
|
232
|
+
</Panel>
|
|
233
|
+
</PanelGroup>
|
|
234
|
+
</Story>
|
|
235
|
+
|
|
236
|
+
<Story name="Collapsible">
|
|
237
|
+
<CollapsibleStory />
|
|
238
|
+
</Story>
|
|
239
|
+
|
|
240
|
+
<Story name="CustomCollapseAnimation">
|
|
241
|
+
<PanelGroup class="panel-group">
|
|
242
|
+
<Panel
|
|
243
|
+
min="100px"
|
|
244
|
+
collapsible
|
|
245
|
+
collapsedSize="60px"
|
|
246
|
+
class="collapsible-example-panel-1 panel"
|
|
247
|
+
>
|
|
248
|
+
1
|
|
249
|
+
</Panel>
|
|
250
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
251
|
+
<Panel min="100px">2</Panel>
|
|
252
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
253
|
+
<Panel
|
|
254
|
+
min="100px"
|
|
255
|
+
collapsible
|
|
256
|
+
collapsedSize="60px"
|
|
257
|
+
class="collapsible-example-panel-2 panel"
|
|
258
|
+
defaultCollapsed
|
|
259
|
+
collapseAnimation={{
|
|
260
|
+
easing: (t) => springFn.next(t * 1000).value,
|
|
261
|
+
duration: 1000,
|
|
262
|
+
}}
|
|
263
|
+
>
|
|
264
|
+
3
|
|
265
|
+
</Panel>
|
|
266
|
+
</PanelGroup>
|
|
267
|
+
</Story>
|
|
268
|
+
|
|
269
|
+
<Story name="ImperativePanel">
|
|
270
|
+
<PanelGroup class="panel-group" bind:this={group}>
|
|
271
|
+
<Panel
|
|
272
|
+
class="panel"
|
|
273
|
+
bind:this={panel}
|
|
274
|
+
min="100px"
|
|
275
|
+
collapsible
|
|
276
|
+
collapsedSize="60px"
|
|
277
|
+
>
|
|
278
|
+
1
|
|
279
|
+
</Panel>
|
|
280
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
281
|
+
<Panel class="panel" min="100px">2</Panel>
|
|
282
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
283
|
+
<Panel
|
|
284
|
+
class="panel"
|
|
285
|
+
min="100px"
|
|
286
|
+
collapsible
|
|
287
|
+
collapsedSize="60px"
|
|
288
|
+
defaultCollapsed
|
|
289
|
+
>
|
|
290
|
+
3
|
|
291
|
+
</Panel>
|
|
292
|
+
</PanelGroup>
|
|
293
|
+
|
|
294
|
+
<div>
|
|
295
|
+
<button
|
|
296
|
+
type="button"
|
|
297
|
+
onclick={() => alert(`Sizes: ${group?.getPixelSizes()}`)}
|
|
298
|
+
>
|
|
299
|
+
Get pixel sizes
|
|
300
|
+
</button>
|
|
301
|
+
<button
|
|
302
|
+
type="button"
|
|
303
|
+
onclick={() => alert(`Sizes: ${group?.getPercentageSizes()}`)}
|
|
304
|
+
>
|
|
305
|
+
Get percent sizes
|
|
306
|
+
</button>
|
|
307
|
+
<button
|
|
308
|
+
type="button"
|
|
309
|
+
onclick={() => group?.setSizes(["200px", "10px", "50%", "10px", "150px"])}
|
|
310
|
+
>
|
|
311
|
+
Override sizes
|
|
312
|
+
</button>
|
|
313
|
+
</div>
|
|
314
|
+
|
|
315
|
+
<div>
|
|
316
|
+
<button type="button" onclick={() => panel?.collapse()}> Collapse </button>
|
|
317
|
+
<button
|
|
318
|
+
type="button"
|
|
319
|
+
onclick={() => alert(`Collapsed: ${panel?.isCollapsed()}`)}
|
|
320
|
+
>
|
|
321
|
+
Is Collapsed?
|
|
322
|
+
</button>
|
|
323
|
+
<button type="button" onclick={() => panel?.expand()}> Expand </button>
|
|
324
|
+
<button
|
|
325
|
+
type="button"
|
|
326
|
+
onclick={() => alert(`Expanded: ${panel?.isExpanded()}`)}
|
|
327
|
+
>
|
|
328
|
+
Is Expanded?
|
|
329
|
+
</button>
|
|
330
|
+
<button type="button" onclick={() => alert(`Id: ${panel?.getId()}`)}>
|
|
331
|
+
Get Id
|
|
332
|
+
</button>
|
|
333
|
+
<button
|
|
334
|
+
type="button"
|
|
335
|
+
onclick={() => alert(`Size: ${panel?.getPixelSize()}`)}
|
|
336
|
+
>
|
|
337
|
+
Get Pixel Size
|
|
338
|
+
</button>
|
|
339
|
+
<button
|
|
340
|
+
type="button"
|
|
341
|
+
onclick={() => alert(`Percentage: ${panel?.getPercentageSize()}`)}
|
|
342
|
+
>
|
|
343
|
+
Get Percentage Size
|
|
344
|
+
</button>
|
|
345
|
+
<button type="button" onclick={() => panel?.setSize("30px")}>
|
|
346
|
+
Set size to 100px
|
|
347
|
+
</button>
|
|
348
|
+
<button type="button" onclick={() => panel?.setSize("50%")}>
|
|
349
|
+
Set size to 50%
|
|
350
|
+
</button>
|
|
351
|
+
</div>
|
|
352
|
+
</Story>
|
|
353
|
+
|
|
354
|
+
<Story name="ConditionalPanel">
|
|
355
|
+
<ConditionalStory />
|
|
356
|
+
</Story>
|
|
357
|
+
|
|
358
|
+
<Story name="ConditionalPanelComplex">
|
|
359
|
+
<PanelGroup class="panel-group">
|
|
360
|
+
<Panel
|
|
361
|
+
class="panel"
|
|
362
|
+
id="panel-1"
|
|
363
|
+
min="100px"
|
|
364
|
+
collapsible
|
|
365
|
+
collapsedSize="60px"
|
|
366
|
+
>
|
|
367
|
+
<div>1</div>
|
|
368
|
+
</Panel>
|
|
369
|
+
<PanelResizer id="handle-1" class="panel-resizer" size="10px" />
|
|
370
|
+
<Panel class="panel" id="panel-2" min="100px">
|
|
371
|
+
<div>2</div>
|
|
372
|
+
</Panel>
|
|
373
|
+
<PanelResizer id="handle-2" class="panel-resizer" size="10px" />
|
|
374
|
+
<Panel class="panel" id="panel-3" min="100px">
|
|
375
|
+
<div>3</div>
|
|
376
|
+
</Panel>
|
|
377
|
+
{#if isExpanded}
|
|
378
|
+
<PanelResizer id="handle-3" class="panel-resizer" size="10px" />
|
|
379
|
+
<Panel class="panel" id="panel-4" min="100px">
|
|
380
|
+
expanded
|
|
381
|
+
<button type="button" onclick={toggleExpanded}>Close</button>
|
|
382
|
+
</Panel>
|
|
383
|
+
{/if}
|
|
384
|
+
<PanelResizer id="handle-4" class="panel-resizer" size="10px" />
|
|
385
|
+
<Panel
|
|
386
|
+
min="200px"
|
|
387
|
+
collapsible
|
|
388
|
+
collapsedSize="60px"
|
|
389
|
+
defaultCollapsed
|
|
390
|
+
class="panel"
|
|
391
|
+
id="panel-5"
|
|
392
|
+
>
|
|
393
|
+
<div>4</div>
|
|
394
|
+
</Panel>
|
|
395
|
+
</PanelGroup>
|
|
396
|
+
|
|
397
|
+
<button type="button" onclick={toggleExpanded}>Expand</button>
|
|
398
|
+
</Story>
|
|
399
|
+
|
|
400
|
+
<Story name="WithDefaultWidth">
|
|
401
|
+
<PanelGroup class="panel-group h-200">
|
|
402
|
+
<Panel class="panel">1</Panel>
|
|
403
|
+
<PanelResizer class="panel-resizer" size="3px" />
|
|
404
|
+
<Panel default="100px" min="100px" max="400px" class="panel">2</Panel>
|
|
405
|
+
</PanelGroup>
|
|
406
|
+
</Story>
|
|
407
|
+
|
|
408
|
+
<Story name="StaticAtRest">
|
|
409
|
+
<PanelGroup class="panel-group h-200">
|
|
410
|
+
<Panel min="100px" max="300px" class="panel" isStaticAtRest>1</Panel>
|
|
411
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
412
|
+
<Panel min="100px" class="panel">2</Panel>
|
|
413
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
414
|
+
<Panel min="100px" class="panel">3</Panel>
|
|
415
|
+
</PanelGroup>
|
|
416
|
+
</Story>
|
|
417
|
+
|
|
418
|
+
<style>
|
|
419
|
+
:global(.panel-group) {
|
|
420
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
421
|
+
background: rgba(0, 0, 0, 0.1);
|
|
422
|
+
border-radius: 12px;
|
|
423
|
+
box-sizing: border-box;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
:global(.panel) {
|
|
427
|
+
height: 100%;
|
|
428
|
+
width: 100%;
|
|
429
|
+
padding: 20px;
|
|
430
|
+
display: flex;
|
|
431
|
+
align-items: center;
|
|
432
|
+
justify-content: center;
|
|
433
|
+
overflow: hidden;
|
|
434
|
+
box-sizing: border-box;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
:global(.panel-resizer) {
|
|
438
|
+
background: red;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
:global(.h-200) {
|
|
442
|
+
height: 200px;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
:global(.vertical-example-2) {
|
|
446
|
+
height: calc(100vh - 100px);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
:global(.nested-groups-example) {
|
|
450
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
451
|
+
border-radius: 12px;
|
|
452
|
+
height: 400px;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
:global(.with-overflow-example) {
|
|
456
|
+
height: 400px;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
:global(.collapsible-example-panel-1) {
|
|
460
|
+
border: 10px solid green;
|
|
461
|
+
box-sizing: border-box;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
:global(.collapsible-example-panel-2) {
|
|
465
|
+
border: 10px solid blue;
|
|
466
|
+
box-sizing: border-box;
|
|
467
|
+
}
|
|
468
|
+
</style>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script module>
|
|
2
|
+
import PanelGroup from "../lib/PanelGroup.svelte";
|
|
3
|
+
import Panel from "../lib/Panel.svelte";
|
|
4
|
+
import PanelResizer from "../lib/PanelResizer.svelte";
|
|
5
|
+
|
|
6
|
+
let panelGroup;
|
|
7
|
+
|
|
8
|
+
/** @type {import("@window-splitter/interface").PanelGroupHandle} */
|
|
9
|
+
export const handle = {
|
|
10
|
+
getId: () => "panel-group",
|
|
11
|
+
getTemplate: () => panelGroup.getTemplate(),
|
|
12
|
+
getState: () => panelGroup.getState(),
|
|
13
|
+
getPixelSizes: () => panelGroup.getPixelSizes(),
|
|
14
|
+
getPercentageSizes: () => panelGroup.getPercentageSizes(),
|
|
15
|
+
setSizes: (sizes) => panelGroup.setSizes(sizes),
|
|
16
|
+
};
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<PanelGroup
|
|
20
|
+
bind:this={panelGroup}
|
|
21
|
+
orientation="vertical"
|
|
22
|
+
class="panel-group vertical-example"
|
|
23
|
+
>
|
|
24
|
+
<Panel default="30%" min="20%" class="panel">top</Panel>
|
|
25
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
26
|
+
<Panel min="20%" class="panel">middle</Panel>
|
|
27
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
28
|
+
<Panel default="30%" min="20%" class="panel">bottom</Panel>
|
|
29
|
+
</PanelGroup>
|
|
30
|
+
|
|
31
|
+
<style>
|
|
32
|
+
:global(.vertical-example) {
|
|
33
|
+
height: 322px;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
:global(.panel-group) {
|
|
37
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
38
|
+
background: rgba(0, 0, 0, 0.1);
|
|
39
|
+
border-radius: 12px;
|
|
40
|
+
box-sizing: border-box;
|
|
41
|
+
width: 500px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
:global(.panel) {
|
|
45
|
+
height: 100%;
|
|
46
|
+
width: 100%;
|
|
47
|
+
padding: 20px;
|
|
48
|
+
display: flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
justify-content: center;
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
box-sizing: border-box;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
:global(.panel-resizer) {
|
|
56
|
+
background: red;
|
|
57
|
+
}
|
|
58
|
+
</style>
|
package/svelte.config.js
ADDED
package/tsconfig.json
ADDED
package/vite.config.js
ADDED
package/vitest.config.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// vitest.config.ts
|
|
2
|
+
import { defineConfig } from "vitest/config";
|
|
3
|
+
import { svelte } from "@sveltejs/vite-plugin-svelte";
|
|
4
|
+
import { svelteTesting } from "@testing-library/svelte/vite";
|
|
5
|
+
|
|
6
|
+
export default defineConfig({
|
|
7
|
+
plugins: [svelte(), svelteTesting()],
|
|
8
|
+
test: {
|
|
9
|
+
include: ["src/**/*.test.svelte.ts"],
|
|
10
|
+
browser: {
|
|
11
|
+
enabled: true,
|
|
12
|
+
provider: "playwright",
|
|
13
|
+
instances: [{ browser: "chromium" }],
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
resolve: {
|
|
17
|
+
conditions: ["browser"],
|
|
18
|
+
},
|
|
19
|
+
});
|