@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,63 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import PanelGroup from "../lib/PanelGroup.svelte";
|
|
3
|
+
import Panel from "../lib/Panel.svelte";
|
|
4
|
+
import PanelResizer from "../lib/PanelResizer.svelte";
|
|
5
|
+
|
|
6
|
+
const { snapshot, handle } = $props();
|
|
7
|
+
|
|
8
|
+
let panelGroup;
|
|
9
|
+
|
|
10
|
+
/** @type {import("@window-splitter/interface").PanelGroupHandle} */
|
|
11
|
+
handle.current = {
|
|
12
|
+
getId: () => "panel-group",
|
|
13
|
+
getTemplate: () => panelGroup.getTemplate(),
|
|
14
|
+
getState: () => panelGroup.getState(),
|
|
15
|
+
getPixelSizes: () => panelGroup.getPixelSizes(),
|
|
16
|
+
getPercentageSizes: () => panelGroup.getPercentageSizes(),
|
|
17
|
+
setSizes: (sizes) => panelGroup.setSizes(sizes),
|
|
18
|
+
};
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<PanelGroup
|
|
22
|
+
bind:this={panelGroup}
|
|
23
|
+
class="panel-group h-200 w-502"
|
|
24
|
+
autosaveId="autosave-cookie-svelte"
|
|
25
|
+
autosaveStrategy="cookie"
|
|
26
|
+
{snapshot}
|
|
27
|
+
>
|
|
28
|
+
<Panel id="1" class="panel">Panel 1</Panel>
|
|
29
|
+
<PanelResizer id="resizer" class="panel-resizer" size="10px" />
|
|
30
|
+
<Panel id="2" class="panel">Panel 2</Panel>
|
|
31
|
+
</PanelGroup>
|
|
32
|
+
|
|
33
|
+
<style>
|
|
34
|
+
:global(.h-200) {
|
|
35
|
+
height: 200px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
:global(.w-502) {
|
|
39
|
+
width: 502px !important;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
:global(.panel-group) {
|
|
43
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
44
|
+
background: rgba(0, 0, 0, 0.1);
|
|
45
|
+
border-radius: 12px;
|
|
46
|
+
box-sizing: border-box;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
:global(.panel) {
|
|
50
|
+
height: 100%;
|
|
51
|
+
width: 100%;
|
|
52
|
+
padding: 20px;
|
|
53
|
+
display: flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
justify-content: center;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
box-sizing: border-box;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:global(.panel-resizer) {
|
|
61
|
+
background: red;
|
|
62
|
+
}
|
|
63
|
+
</style>
|
|
@@ -0,0 +1,112 @@
|
|
|
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
|
+
/** @type {import("@window-splitter/interface").PanelGroupHandle} */
|
|
7
|
+
let panelGroup;
|
|
8
|
+
/** @type {import("@window-splitter/interface").PanelHandle} */
|
|
9
|
+
let leftHandleRef;
|
|
10
|
+
/** @type {import("@window-splitter/interface").PanelHandle} */
|
|
11
|
+
let rightHandleRef;
|
|
12
|
+
|
|
13
|
+
/** @type {import("@window-splitter/interface").PanelGroupHandle} */
|
|
14
|
+
export const handle = {
|
|
15
|
+
getId: () => "panel-group",
|
|
16
|
+
getTemplate: () => panelGroup.getTemplate(),
|
|
17
|
+
getState: () => panelGroup.getState(),
|
|
18
|
+
getPixelSizes: () => panelGroup.getPixelSizes(),
|
|
19
|
+
getPercentageSizes: () => panelGroup.getPercentageSizes(),
|
|
20
|
+
setSizes: (sizes) => panelGroup.setSizes(sizes),
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/** @type {import("@window-splitter/interface").PanelHandle} */
|
|
24
|
+
export const leftHandle = {
|
|
25
|
+
collapse: () => leftHandleRef.collapse(),
|
|
26
|
+
isCollapsed: () => leftHandleRef.isCollapsed(),
|
|
27
|
+
expand: () => leftHandleRef.expand(),
|
|
28
|
+
isExpanded: () => leftHandleRef.isExpanded(),
|
|
29
|
+
getId: () => leftHandleRef.getId(),
|
|
30
|
+
getPixelSize: () => leftHandleRef.getPixelSize(),
|
|
31
|
+
getPercentageSize: () => leftHandleRef.getPercentageSize(),
|
|
32
|
+
setSize: (size) => leftHandleRef.setSize(size),
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** @type {import("@window-splitter/interface").PanelHandle} */
|
|
36
|
+
export const rightHandle = {
|
|
37
|
+
collapse: () => rightHandleRef.collapse(),
|
|
38
|
+
isCollapsed: () => rightHandleRef.isCollapsed(),
|
|
39
|
+
expand: () => rightHandleRef.expand(),
|
|
40
|
+
isExpanded: () => rightHandleRef.isExpanded(),
|
|
41
|
+
getId: () => rightHandleRef.getId(),
|
|
42
|
+
getPixelSize: () => rightHandleRef.getPixelSize(),
|
|
43
|
+
getPercentageSize: () => rightHandleRef.getPercentageSize(),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
let collapsed = $state(true);
|
|
47
|
+
const onCollapseChange = (newCollapsed) => {
|
|
48
|
+
collapsed = newCollapsed;
|
|
49
|
+
};
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<PanelGroup bind:this={panelGroup} class="panel-group">
|
|
53
|
+
<Panel
|
|
54
|
+
bind:this={leftHandleRef}
|
|
55
|
+
class="collapsible-example-panel-1 panel"
|
|
56
|
+
min="100px"
|
|
57
|
+
collapsible
|
|
58
|
+
collapsedSize="60px"
|
|
59
|
+
collapseAnimation={{ easing: "bounce", duration: 1000 }}
|
|
60
|
+
onCollapseChange={(isCollapsed) => {
|
|
61
|
+
// eslint-disable-next-line no-console
|
|
62
|
+
console.log("COLLAPSE PASSIVE", isCollapsed);
|
|
63
|
+
}}
|
|
64
|
+
>
|
|
65
|
+
1
|
|
66
|
+
</Panel>
|
|
67
|
+
<PanelResizer class="panel-resizer" id="resizer-1" size="10px" />
|
|
68
|
+
<Panel min="100px">2</Panel>
|
|
69
|
+
<PanelResizer class="panel-resizer" id="resizer-2" size="10px" />
|
|
70
|
+
<Panel
|
|
71
|
+
bind:this={rightHandleRef}
|
|
72
|
+
class="collapsible-example-panel-2 panel"
|
|
73
|
+
min="100px"
|
|
74
|
+
collapsible
|
|
75
|
+
collapsedSize="60px"
|
|
76
|
+
collapseAnimation={{ easing: "bounce", duration: 1000 }}
|
|
77
|
+
{collapsed}
|
|
78
|
+
{onCollapseChange}
|
|
79
|
+
>
|
|
80
|
+
3
|
|
81
|
+
</Panel>
|
|
82
|
+
</PanelGroup>
|
|
83
|
+
|
|
84
|
+
<style>
|
|
85
|
+
:global(.collapsible-example-panel-1) {
|
|
86
|
+
border: 10px solid green;
|
|
87
|
+
box-sizing: border-box;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
:global(.panel-group) {
|
|
91
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
92
|
+
background: rgba(0, 0, 0, 0.1);
|
|
93
|
+
border-radius: 12px;
|
|
94
|
+
box-sizing: border-box;
|
|
95
|
+
width: 500px;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
:global(.panel) {
|
|
99
|
+
height: 100%;
|
|
100
|
+
width: 100%;
|
|
101
|
+
padding: 20px;
|
|
102
|
+
display: flex;
|
|
103
|
+
align-items: center;
|
|
104
|
+
justify-content: center;
|
|
105
|
+
overflow: hidden;
|
|
106
|
+
box-sizing: border-box;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
:global(.panel-resizer) {
|
|
110
|
+
background: red;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
|
|
18
|
+
let isExpanded = $state(false);
|
|
19
|
+
const toggleExpanded = () => {
|
|
20
|
+
isExpanded = !isExpanded;
|
|
21
|
+
};
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<PanelGroup bind:this={panelGroup} class="panel-group">
|
|
25
|
+
<Panel
|
|
26
|
+
id="panel-1"
|
|
27
|
+
min="100px"
|
|
28
|
+
collapsible
|
|
29
|
+
collapsedSize="60px"
|
|
30
|
+
class="panel"
|
|
31
|
+
>
|
|
32
|
+
1
|
|
33
|
+
</Panel>
|
|
34
|
+
<PanelResizer id="handle-1" class="panel-resizer" size="10px" />
|
|
35
|
+
<Panel id="panel-2" min="100px" class="panel">2</Panel>
|
|
36
|
+
|
|
37
|
+
{#if isExpanded}
|
|
38
|
+
<PanelResizer id="handle-2" class="panel-resizer" size="10px" />
|
|
39
|
+
<Panel id="panel-3" min="100px" class="panel">
|
|
40
|
+
3
|
|
41
|
+
<button type="button" onclick={toggleExpanded}>Close</button>
|
|
42
|
+
</Panel>
|
|
43
|
+
{/if}
|
|
44
|
+
</PanelGroup>
|
|
45
|
+
<button type="button" onclick={toggleExpanded}>Expand</button>
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
:global(.panel-group) {
|
|
49
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
50
|
+
background: rgba(0, 0, 0, 0.1);
|
|
51
|
+
border-radius: 12px;
|
|
52
|
+
box-sizing: border-box;
|
|
53
|
+
width: 500px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:global(.panel) {
|
|
57
|
+
height: 100%;
|
|
58
|
+
width: 100%;
|
|
59
|
+
padding: 20px;
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
justify-content: center;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
box-sizing: border-box;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
:global(.panel-resizer) {
|
|
68
|
+
background: red;
|
|
69
|
+
}
|
|
70
|
+
</style>
|
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
|
|
18
|
+
let dynamicConstraints = $state(false);
|
|
19
|
+
const toggleDynamicConstraints = () => {
|
|
20
|
+
dynamicConstraints = !dynamicConstraints;
|
|
21
|
+
};
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<PanelGroup class="panel-group dynamic-constraints" bind:this={panelGroup}>
|
|
25
|
+
<Panel
|
|
26
|
+
default="100px"
|
|
27
|
+
min={dynamicConstraints ? "200px" : "100px"}
|
|
28
|
+
class="panel"
|
|
29
|
+
>
|
|
30
|
+
Panel 1
|
|
31
|
+
</Panel>
|
|
32
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
33
|
+
<Panel min="100px" class="panel">Panel 2</Panel>
|
|
34
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
35
|
+
<Panel
|
|
36
|
+
min={dynamicConstraints ? "100px" : "400px"}
|
|
37
|
+
max={dynamicConstraints ? "300px" : "700px"}
|
|
38
|
+
class="panel"
|
|
39
|
+
>
|
|
40
|
+
Panel 3
|
|
41
|
+
</Panel>
|
|
42
|
+
</PanelGroup>
|
|
43
|
+
<button type="button" onclick={toggleDynamicConstraints}>
|
|
44
|
+
Toggle Custom
|
|
45
|
+
</button>
|
|
46
|
+
|
|
47
|
+
<style>
|
|
48
|
+
:global(.dynamic-constraints) {
|
|
49
|
+
width: 1000px !important;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
:global(.panel-group) {
|
|
53
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
54
|
+
background: rgba(0, 0, 0, 0.1);
|
|
55
|
+
border-radius: 12px;
|
|
56
|
+
box-sizing: border-box;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
:global(.panel) {
|
|
60
|
+
height: 100%;
|
|
61
|
+
width: 100%;
|
|
62
|
+
padding: 20px;
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: center;
|
|
65
|
+
justify-content: center;
|
|
66
|
+
overflow: hidden;
|
|
67
|
+
box-sizing: border-box;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
:global(.panel-resizer) {
|
|
71
|
+
background: red;
|
|
72
|
+
}
|
|
73
|
+
</style>
|
|
@@ -0,0 +1,48 @@
|
|
|
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 bind:this={panelGroup} class="panel-group">
|
|
20
|
+
<Panel class="panel">Panel 1</Panel>
|
|
21
|
+
<PanelResizer class="panel-resizer" size="10px" />
|
|
22
|
+
<Panel class="panel" min="100px">Panel 2</Panel>
|
|
23
|
+
</PanelGroup>
|
|
24
|
+
|
|
25
|
+
<style>
|
|
26
|
+
:global(.panel-group) {
|
|
27
|
+
border: 1px solid rgba(0, 0, 0, 0.3);
|
|
28
|
+
background: rgba(0, 0, 0, 0.1);
|
|
29
|
+
border-radius: 12px;
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
width: 500px;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
:global(.panel) {
|
|
35
|
+
height: 100%;
|
|
36
|
+
width: 100%;
|
|
37
|
+
padding: 20px;
|
|
38
|
+
display: flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
justify-content: center;
|
|
41
|
+
overflow: hidden;
|
|
42
|
+
box-sizing: border-box;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:global(.panel-resizer) {
|
|
46
|
+
background: red;
|
|
47
|
+
}
|
|
48
|
+
</style>
|