@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,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>
@@ -0,0 +1,7 @@
1
+ import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
2
+
3
+ export default {
4
+ // Consult https://svelte.dev/docs#compile-time-svelte-preprocess
5
+ // for more information about preprocessors
6
+ preprocess: vitePreprocess(),
7
+ };
package/tsconfig.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "types": ["svelte"]
5
+ }
6
+ }
package/vite.config.js ADDED
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "vite";
2
+ import { svelte } from "@sveltejs/vite-plugin-svelte";
3
+
4
+ // https://vitejs.dev/config/
5
+ export default defineConfig({
6
+ plugins: [svelte()],
7
+ });
@@ -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
+ });