@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.
Files changed (42) hide show
  1. package/.storybook/main.ts +33 -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 +6 -0
  7. package/CHANGELOG.md +20 -0
  8. package/README.md +58 -0
  9. package/dist/Panel.svelte +178 -0
  10. package/dist/Panel.svelte.d.ts +19 -0
  11. package/dist/Panel.svelte.d.ts.map +1 -0
  12. package/dist/PanelGroup.svelte +159 -0
  13. package/dist/PanelGroup.svelte.d.ts +18 -0
  14. package/dist/PanelGroup.svelte.d.ts.map +1 -0
  15. package/dist/PanelResizer.svelte +171 -0
  16. package/dist/PanelResizer.svelte.d.ts +8 -0
  17. package/dist/PanelResizer.svelte.d.ts.map +1 -0
  18. package/dist/index.d.ts +4 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +3 -0
  21. package/eslint.config.js +24 -0
  22. package/package.json +92 -0
  23. package/src/SvelteWindowSplitter.test.svelte.ts +283 -0
  24. package/src/__snapshots__/SvelteWindowSplitter.test.svelte.ts.snap +56 -0
  25. package/src/__snapshots__/SvelteWindowSplitter.test.ts.snap +54 -0
  26. package/src/lib/Panel.svelte +178 -0
  27. package/src/lib/PanelGroup.svelte +159 -0
  28. package/src/lib/PanelResizer.svelte +171 -0
  29. package/src/lib/index.ts +3 -0
  30. package/src/stories/Autosave.svelte +52 -0
  31. package/src/stories/AutosaveCollapsible.svelte +65 -0
  32. package/src/stories/AutosaveCookie.svelte +63 -0
  33. package/src/stories/Collapsible.svelte +112 -0
  34. package/src/stories/Conditional.svelte +70 -0
  35. package/src/stories/DynamicConstraints.svelte +73 -0
  36. package/src/stories/Simple.svelte +48 -0
  37. package/src/stories/SvelteWindowSplitter.stories.svelte +468 -0
  38. package/src/stories/VerticalLayout.svelte +58 -0
  39. package/svelte.config.js +7 -0
  40. package/tsconfig.json +6 -0
  41. package/vite.config.js +7 -0
  42. 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>