@hkdigital/lib-sveltekit 0.1.22 → 0.1.24
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/dist/classes/svelte/image/ImageScene.svelte.d.ts +54 -26
- package/dist/classes/svelte/image/ImageScene.svelte.js +208 -75
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.d.ts +5 -6
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +39 -55
- package/dist/components/area/HkArea.svelte.d.ts +0 -14
- package/dist/components/area/HkGridArea.svelte.d.ts +0 -22
- package/dist/components/buttons/button/Button.svelte.d.ts +0 -21
- package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +0 -9
- package/dist/components/buttons/button-text/TextButton.svelte.d.ts +0 -7
- package/dist/components/debug/debug-panel-design-scaling/DebugPanelDesignScaling.svelte.d.ts +0 -4
- package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +0 -13
- package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +0 -18
- package/dist/components/icons/HkIcon.svelte.d.ts +0 -12
- package/dist/components/icons/HkTabIcon.svelte.d.ts +0 -21
- package/dist/components/icons/SteezeIcon.svelte.d.ts +0 -12
- package/dist/components/inputs/text-input/TextInput.svelte.d.ts +0 -28
- package/dist/components/layout/grid-layers/GridLayers.svelte.d.ts +0 -23
- package/dist/components/panels/panel/Panel.svelte.d.ts +0 -13
- package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +0 -14
- package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +0 -14
- package/dist/components/tab-bar/HkTabBar.svelte.d.ts +0 -18
- package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +0 -19
- package/dist/design/tailwind-theme-extend.d.ts +4 -4
- package/dist/server/logger.d.ts +0 -1
- package/dist/widgets/button-group/ButtonGroup.svelte.d.ts +0 -20
- package/dist/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +0 -10
- package/dist/widgets/game-box/GameBox.svelte.d.ts +0 -41
- package/dist/widgets/hk-app-layout/HkAppLayout.svelte.d.ts +0 -11
- package/dist/widgets/image-box/ImageBox.svelte +4 -4
- package/dist/widgets/image-box/ImageBox.svelte.d.ts +1 -21
- package/dist/widgets/presenter/(broken) Presenter.state.svelte.js__ +613 -0
- package/dist/widgets/presenter/ImageSlide.svelte.d.ts +1 -5
- package/dist/widgets/presenter/Presenter.state.svelte.d.ts +3 -22
- package/dist/widgets/presenter/Presenter.state.svelte.js +156 -155
- package/dist/widgets/presenter/Presenter.svelte +23 -7
- package/dist/widgets/presenter/Presenter.svelte.d.ts +3 -12
- package/dist/widgets/presenter/Presenter.svelte__ +125 -0
- package/dist/widgets/virtual-viewport/VirtualViewport.svelte.d.ts +0 -22
- package/package.json +1 -1
- package/dist/classes/svelte/image/ImageScene.svelte.js__ +0 -253
- package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js--responsive-loading-fails-fix-tried__ +0 -184
@@ -1,3 +1,5 @@
|
|
1
|
+
import { tick } from 'svelte';
|
2
|
+
|
1
3
|
import { defineStateContext } from '../../util/svelte/state-context/index.js';
|
2
4
|
|
3
5
|
import { findFirst } from '../../util/array/index.js';
|
@@ -67,24 +69,25 @@ export class PresenterState {
|
|
67
69
|
/** @type {HkPromise[]} */
|
68
70
|
transitionPromises = $state.raw([]);
|
69
71
|
|
72
|
+
/** @type {HkPromise} */
|
73
|
+
slideLoadingPromise = null;
|
74
|
+
|
70
75
|
/** @type {boolean} */
|
71
76
|
isSlideLoading = $state(false);
|
72
77
|
|
73
78
|
/** @type {boolean} */
|
74
|
-
|
75
|
-
|
76
|
-
/** @type {number} Loading timeout in milliseconds (0 = disabled) */
|
77
|
-
loadingTimeout = $state(1000);
|
79
|
+
loadingSpinner = $state(false);
|
78
80
|
|
79
81
|
/** @type {boolean} */
|
80
82
|
busy = $derived.by(() => {
|
81
|
-
const { layerA, layerB } = this;
|
83
|
+
const { layerA, layerB, isSlideLoading } = this;
|
84
|
+
|
82
85
|
const layerAStable =
|
83
86
|
layerA.stageShow || layerA.stageAfter || layerA.stageIdle;
|
84
87
|
const layerBStable =
|
85
88
|
layerB.stageShow || layerB.stageAfter || layerB.stageIdle;
|
86
89
|
|
87
|
-
return !(layerAStable && layerBStable);
|
90
|
+
return !(layerAStable && layerBStable) || isSlideLoading;
|
88
91
|
});
|
89
92
|
|
90
93
|
/** @type {string} */
|
@@ -98,21 +101,26 @@ export class PresenterState {
|
|
98
101
|
*/
|
99
102
|
constructor() {
|
100
103
|
this.#setupStageTransitions();
|
101
|
-
this.#setupTransitionTracking();
|
102
|
-
this.#setupLoadingTransitions();
|
103
|
-
}
|
104
104
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
105
|
+
let timeout;
|
106
|
+
|
107
|
+
$effect((slideLoadingPromise) => {
|
108
|
+
if (this.isSlideLoading) {
|
109
|
+
// Enable spinner after a short delay
|
110
|
+
clearTimeout(timeout);
|
111
|
+
setTimeout(() => {
|
112
|
+
untrack(() => {
|
113
|
+
if (this.isSlideLoading) {
|
114
|
+
this.loadingSpinner = true;
|
115
|
+
} else {
|
116
|
+
this.loadingSpinner = false;
|
117
|
+
}
|
118
|
+
});
|
119
|
+
}, 500);
|
120
|
+
} else {
|
121
|
+
this.loadingSpinner = false;
|
122
|
+
}
|
123
|
+
});
|
116
124
|
}
|
117
125
|
|
118
126
|
/**
|
@@ -155,59 +163,27 @@ export class PresenterState {
|
|
155
163
|
return updatedLayer;
|
156
164
|
}
|
157
165
|
|
158
|
-
/**
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
#setupTransitionTracking() {
|
163
|
-
|
164
|
-
|
166
|
+
// /**
|
167
|
+
// * Set up reactivity for tracking transition promises
|
168
|
+
// * This handles the completion of animations and layer swapping
|
169
|
+
// */
|
170
|
+
// #setupTransitionTracking() {
|
171
|
+
// $effect(() => {
|
172
|
+
// const promises = this.transitionPromises;
|
165
173
|
|
166
|
-
|
167
|
-
|
174
|
+
// if (promises.length > 0) {
|
175
|
+
// const nextSlide = this.#getSlide(this.nextLayerLabel);
|
168
176
|
|
169
|
-
|
170
|
-
|
171
|
-
|
177
|
+
// if (!nextSlide) {
|
178
|
+
// return;
|
179
|
+
// }
|
172
180
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
}
|
179
|
-
|
180
|
-
/**
|
181
|
-
* Set up reactivity to start transitions after component loading is complete
|
182
|
-
*/
|
183
|
-
#setupLoadingTransitions() {
|
184
|
-
$effect(() => {
|
185
|
-
// Only start transitions when loading is complete and we have a next slide
|
186
|
-
if (!this.isSlideLoading && this.#getSlide(this.nextLayerLabel)) {
|
187
|
-
const currentSlide = this.#getSlide(this.currentLayerLabel);
|
188
|
-
const nextSlide = this.#getSlide(this.nextLayerLabel);
|
189
|
-
|
190
|
-
// Prepare the next layer for its entrance transition
|
191
|
-
this.#updateLayer(this.nextLayerLabel, {
|
192
|
-
z: Z_FRONT,
|
193
|
-
visible: true,
|
194
|
-
stageBeforeIn: true,
|
195
|
-
transitions: nextSlide?.intro ?? []
|
196
|
-
});
|
197
|
-
|
198
|
-
// Prepare the current layer for its exit transition
|
199
|
-
this.#updateLayer(this.currentLayerLabel, {
|
200
|
-
z: Z_BACK,
|
201
|
-
visible: true,
|
202
|
-
stageBeforeOut: true,
|
203
|
-
transitions: currentSlide?.outro ?? []
|
204
|
-
});
|
205
|
-
|
206
|
-
// Start transitions
|
207
|
-
this.#applyTransitions();
|
208
|
-
}
|
209
|
-
});
|
210
|
-
}
|
181
|
+
// untrack(() => {
|
182
|
+
// this.#executeTransition(promises);
|
183
|
+
// });
|
184
|
+
// }
|
185
|
+
// });
|
186
|
+
// }
|
211
187
|
|
212
188
|
/**
|
213
189
|
* Execute the transition by waiting for all promises and then
|
@@ -217,6 +193,8 @@ export class PresenterState {
|
|
217
193
|
*/
|
218
194
|
async #executeTransition(promises) {
|
219
195
|
try {
|
196
|
+
// console.debug('executeTransition');
|
197
|
+
|
220
198
|
await Promise.allSettled(promises);
|
221
199
|
|
222
200
|
untrack(() => {
|
@@ -265,48 +243,6 @@ export class PresenterState {
|
|
265
243
|
}
|
266
244
|
}
|
267
245
|
|
268
|
-
/**
|
269
|
-
* Mark the slide as loaded, which triggers transitions to begin
|
270
|
-
*/
|
271
|
-
finishSlideLoading() {
|
272
|
-
this.isSlideLoading = false;
|
273
|
-
}
|
274
|
-
|
275
|
-
/**
|
276
|
-
* Returns a controller object for managing manual loading
|
277
|
-
* Components can use this to signal when they're done loading
|
278
|
-
* or to cancel and go back to the previous slide
|
279
|
-
*
|
280
|
-
* @returns {LoadController} Object with loaded() and cancel() methods
|
281
|
-
*/
|
282
|
-
getLoadingController() {
|
283
|
-
// Mark that the controller was requested
|
284
|
-
this.controllerRequested = true;
|
285
|
-
|
286
|
-
return {
|
287
|
-
/**
|
288
|
-
* Call when component has finished loading
|
289
|
-
*/
|
290
|
-
loaded: () => {
|
291
|
-
this.finishSlideLoading();
|
292
|
-
},
|
293
|
-
|
294
|
-
/**
|
295
|
-
* Call to cancel loading and return to previous slide
|
296
|
-
*/
|
297
|
-
cancel: () => {
|
298
|
-
// Return to previous slide if available
|
299
|
-
const currentSlideName = this.currentSlideName;
|
300
|
-
if (currentSlideName) {
|
301
|
-
this.gotoSlide(currentSlideName);
|
302
|
-
} else if (this.slides.length > 0) {
|
303
|
-
// Fallback to first slide if no current slide
|
304
|
-
this.gotoSlide(this.slides[0].name);
|
305
|
-
}
|
306
|
-
}
|
307
|
-
};
|
308
|
-
}
|
309
|
-
|
310
246
|
/**
|
311
247
|
* Configure the presentation
|
312
248
|
*
|
@@ -369,57 +305,79 @@ export class PresenterState {
|
|
369
305
|
throw new Error('Transition in progress');
|
370
306
|
}
|
371
307
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
308
|
+
this.slideLoadingPromise = null;
|
309
|
+
|
310
|
+
// Get a presenter reference to pass to the slide
|
311
|
+
const presenterRef = this.#getPresenterRef();
|
312
|
+
|
313
|
+
// Create a copy of the slide to avoid mutating the original
|
314
|
+
const slideWithProps = {
|
315
|
+
...slide,
|
316
|
+
data: {
|
317
|
+
...slide.data,
|
318
|
+
props: {
|
319
|
+
...(slide.data.props || {}),
|
320
|
+
getLoadingController: () => {
|
321
|
+
this.isSlideLoading = true;
|
322
|
+
this.slideLoadingPromise = new HkPromise(() => {});
|
323
|
+
|
324
|
+
return this.#getLoadingController();
|
325
|
+
// this.slideLoadingPromise should be a HkPromise now
|
326
|
+
// console.log('slideLoadingPromise', this.slideLoadingPromise);
|
327
|
+
},
|
328
|
+
presenter: presenterRef // Add presenter reference to props
|
393
329
|
}
|
394
|
-
}
|
330
|
+
}
|
331
|
+
};
|
395
332
|
|
396
|
-
|
397
|
-
this.#updateSlide(this.nextLayerLabel, slideWithExtras);
|
333
|
+
// console.debug('Checkpoint 1');
|
398
334
|
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
// No component to load, so finish loading immediately
|
415
|
-
this.finishSlideLoading();
|
335
|
+
// Add next slide to next layer
|
336
|
+
this.#updateSlide(this.nextLayerLabel, slideWithProps);
|
337
|
+
|
338
|
+
// console.debug('Checkpoint 2');
|
339
|
+
|
340
|
+
await tick();
|
341
|
+
|
342
|
+
// console.debug('Checkpoint 3');
|
343
|
+
|
344
|
+
if (this.slideLoadingPromise) {
|
345
|
+
// console.debug('Waiting for slide to load');
|
346
|
+
// @ts-ignore
|
347
|
+
await this.slideLoadingPromise;
|
348
|
+
this.isSlideLoading = false;
|
349
|
+
// console.debug('Done waiting for slide loading');
|
416
350
|
}
|
417
351
|
|
418
|
-
|
352
|
+
const currentSlide = this.#getSlide(this.currentLayerLabel);
|
353
|
+
const nextSlide = this.#getSlide(this.nextLayerLabel);
|
354
|
+
|
355
|
+
// console.debug('Checkpoint 4');
|
356
|
+
|
357
|
+
// Make next layer visible, move to front, and prepare for
|
358
|
+
// transition in
|
419
359
|
this.#updateLayer(this.nextLayerLabel, {
|
420
360
|
z: Z_FRONT,
|
421
|
-
visible: true
|
361
|
+
visible: true,
|
362
|
+
stageBeforeIn: true,
|
363
|
+
transitions: nextSlide?.intro ?? []
|
422
364
|
});
|
365
|
+
|
366
|
+
// Move current layer to back, keep visible, and prepare for
|
367
|
+
// transition out
|
368
|
+
this.#updateLayer(this.currentLayerLabel, {
|
369
|
+
z: Z_BACK,
|
370
|
+
visible: true,
|
371
|
+
stageBeforeOut: true,
|
372
|
+
transitions: currentSlide?.outro ?? []
|
373
|
+
});
|
374
|
+
|
375
|
+
// console.debug('Checkpoint 5');
|
376
|
+
|
377
|
+
// Start transitions
|
378
|
+
this.#applyTransitions();
|
379
|
+
|
380
|
+
await this.#executeTransition(this.transitionPromises);
|
423
381
|
}
|
424
382
|
|
425
383
|
/**
|
@@ -545,6 +503,49 @@ export class PresenterState {
|
|
545
503
|
|
546
504
|
throw new Error(`Missing slide [${label}]`);
|
547
505
|
}
|
506
|
+
|
507
|
+
/**
|
508
|
+
* Returns a simplified presenter reference with essential methods
|
509
|
+
* for slide components to use
|
510
|
+
*
|
511
|
+
* @returns {PresenterRef} A reference object with presenter methods
|
512
|
+
*/
|
513
|
+
#getPresenterRef() {
|
514
|
+
return {
|
515
|
+
gotoSlide: (name) => this.gotoSlide(name),
|
516
|
+
getCurrentSlideName: () => this.currentSlideName
|
517
|
+
};
|
518
|
+
}
|
519
|
+
|
520
|
+
/**
|
521
|
+
* Returns a controller object for managing manual loading
|
522
|
+
* Components can use this to signal when they're done loading
|
523
|
+
* or to cancel and go back to the previous slide
|
524
|
+
*
|
525
|
+
* @returns {LoadController}
|
526
|
+
* Object with loaded() and cancel() methods
|
527
|
+
*/
|
528
|
+
#getLoadingController() {
|
529
|
+
// console.debug('getLoadingController was called');
|
530
|
+
|
531
|
+
return {
|
532
|
+
/**
|
533
|
+
* Call when component has finished loading
|
534
|
+
*/
|
535
|
+
loaded: () => {
|
536
|
+
// console.debug('Slide said loading has completed');
|
537
|
+
this.slideLoadingPromise?.tryResolve();
|
538
|
+
},
|
539
|
+
|
540
|
+
/**
|
541
|
+
* Call to cancel loading and return to previous slide
|
542
|
+
*/
|
543
|
+
cancel: () => {
|
544
|
+
// console.debug('Slide said loading has cancelled');
|
545
|
+
this.slideLoadingPromise?.tryReject();
|
546
|
+
}
|
547
|
+
};
|
548
|
+
}
|
548
549
|
}
|
549
550
|
|
550
551
|
/* -------------------------------------- Export create & get state functions */
|
@@ -3,7 +3,8 @@
|
|
3
3
|
|
4
4
|
import { GridLayers } from '../../components/layout/index.js';
|
5
5
|
|
6
|
-
import {
|
6
|
+
import { PresenterState } from './Presenter.state.svelte.js';
|
7
|
+
import { getPresenterState } from './index.js';
|
7
8
|
import { cssBefore, cssDuring } from './util.js';
|
8
9
|
|
9
10
|
/* ------------------------------------------------------------------ Props */
|
@@ -23,7 +24,9 @@
|
|
23
24
|
* autostart?: boolean,
|
24
25
|
* startSlide?: string,
|
25
26
|
* instanceKey?: Symbol | string,
|
26
|
-
*
|
27
|
+
* presenter?: import('./Presenter.state.svelte.js').PresenterState,
|
28
|
+
* layoutSnippet: import('svelte').Snippet<[Slide|null, Layer]>,
|
29
|
+
* loadingSnippet?: import('svelte').Snippet,
|
27
30
|
* }}
|
28
31
|
*/
|
29
32
|
let {
|
@@ -38,13 +41,20 @@
|
|
38
41
|
// State
|
39
42
|
instanceKey,
|
40
43
|
|
44
|
+
presenter = $bindable(new PresenterState()),
|
45
|
+
|
41
46
|
// Snippets
|
42
|
-
layoutSnippet
|
47
|
+
layoutSnippet,
|
48
|
+
loadingSnippet
|
43
49
|
} = $props();
|
44
50
|
|
45
|
-
|
51
|
+
// > Create presenter state object and register using setContext
|
52
|
+
|
53
|
+
// FIXME: Using getPresenterState to force creation of presenter outside
|
54
|
+
// the component. Otherwise transitions doe not work somehow..
|
55
|
+
presenter = getPresenterState(instanceKey);
|
46
56
|
|
47
|
-
|
57
|
+
// > State
|
48
58
|
|
49
59
|
$effect.pre(() => {
|
50
60
|
// Configure presenter with slides if provided
|
@@ -107,7 +117,7 @@
|
|
107
117
|
inert={presenter.busy}
|
108
118
|
class="justify-self-stretch self-stretch overflow-hidden"
|
109
119
|
>
|
110
|
-
<div class={classesA} style={stylesA}>
|
120
|
+
<div class="{classesA} h-full w-full" style={stylesA}>
|
111
121
|
{@render layoutSnippet(presenter.slideA, presenter.layerA)}
|
112
122
|
</div>
|
113
123
|
</div>
|
@@ -118,8 +128,14 @@
|
|
118
128
|
inert={presenter.busy}
|
119
129
|
class="justify-self-stretch self-stretch overflow-hidden"
|
120
130
|
>
|
121
|
-
<div class={classesB} style={stylesB}>
|
131
|
+
<div class="{classesB} h-full w-full" style={stylesB}>
|
122
132
|
{@render layoutSnippet(presenter.slideB, presenter.layerB)}
|
123
133
|
</div>
|
124
134
|
</div>
|
135
|
+
|
136
|
+
{#if loadingSnippet && presenter.loadingSpinner}
|
137
|
+
<div class="h-full w-full" style="z-index:20;">
|
138
|
+
{@render loadingSnippet()}
|
139
|
+
</div>
|
140
|
+
{/if}
|
125
141
|
</GridLayers>
|
@@ -1,20 +1,11 @@
|
|
1
1
|
export default Presenter;
|
2
|
-
type Presenter = {
|
3
|
-
$on?(type: string, callback: (e: any) => void): () => void;
|
4
|
-
$set?(props: Partial<{
|
5
|
-
classes?: string;
|
6
|
-
slides?: Slide[];
|
7
|
-
autostart?: boolean;
|
8
|
-
startSlide?: string;
|
9
|
-
instanceKey?: string | Symbol;
|
10
|
-
layoutSnippet: Snippet<[Slide, Layer]>;
|
11
|
-
}>): void;
|
12
|
-
};
|
13
2
|
declare const Presenter: import("svelte").Component<{
|
14
3
|
classes?: string;
|
15
4
|
slides?: import("./typedef.js").Slide[];
|
16
5
|
autostart?: boolean;
|
17
6
|
startSlide?: string;
|
18
7
|
instanceKey?: Symbol | string;
|
8
|
+
presenter?: import("./Presenter.state.svelte.js").PresenterState;
|
19
9
|
layoutSnippet: import("svelte").Snippet<[import("./typedef.js").Slide | null, import("./typedef.js").Layer]>;
|
20
|
-
|
10
|
+
loadingSnippet?: import("svelte").Snippet;
|
11
|
+
}, {}, "presenter">;
|
@@ -0,0 +1,125 @@
|
|
1
|
+
<script>
|
2
|
+
/* ---------------------------------------------------------------- Imports */
|
3
|
+
|
4
|
+
import { GridLayers } from '$lib/components/layout/index.js';
|
5
|
+
|
6
|
+
import { createOrGetPresenterState } from './index.js';
|
7
|
+
import { cssBefore, cssDuring } from './util.js';
|
8
|
+
|
9
|
+
/* ------------------------------------------------------------------ Props */
|
10
|
+
|
11
|
+
/**
|
12
|
+
* @typedef {import("./typedef.js").Slide} Slide
|
13
|
+
*/
|
14
|
+
|
15
|
+
/**
|
16
|
+
* @typedef {import("./typedef.js").Layer} Layer
|
17
|
+
*/
|
18
|
+
|
19
|
+
/**
|
20
|
+
* @type {{
|
21
|
+
* classes?: string,
|
22
|
+
* slides?: import("./typedef.js").Slide[],
|
23
|
+
* autostart?: boolean,
|
24
|
+
* startSlide?: string,
|
25
|
+
* instanceKey?: Symbol | string,
|
26
|
+
* layoutSnippet: import('svelte').Snippet<[Slide|null, Layer]>
|
27
|
+
* }}
|
28
|
+
*/
|
29
|
+
let {
|
30
|
+
// > Style
|
31
|
+
classes,
|
32
|
+
|
33
|
+
// > Functional
|
34
|
+
slides,
|
35
|
+
autostart = false,
|
36
|
+
startSlide,
|
37
|
+
|
38
|
+
// State
|
39
|
+
instanceKey,
|
40
|
+
|
41
|
+
// Snippets
|
42
|
+
layoutSnippet
|
43
|
+
} = $props();
|
44
|
+
|
45
|
+
/* ------------------------------------------------------------------ State */
|
46
|
+
|
47
|
+
const presenter = createOrGetPresenterState(instanceKey);
|
48
|
+
|
49
|
+
$effect.pre(() => {
|
50
|
+
// Configure presenter with slides if provided
|
51
|
+
presenter.configure({ slides, autostart, startSlide });
|
52
|
+
});
|
53
|
+
|
54
|
+
let classesA = $state('');
|
55
|
+
let classesB = $state('');
|
56
|
+
|
57
|
+
let stylesA = $state('');
|
58
|
+
let stylesB = $state('');
|
59
|
+
|
60
|
+
//> Apply stage classes and styles
|
61
|
+
|
62
|
+
$effect(() => {
|
63
|
+
// > layerA
|
64
|
+
|
65
|
+
const { stageBeforeIn, stageIn, stageBeforeOut, stageOut, transitions } =
|
66
|
+
presenter.layerA;
|
67
|
+
|
68
|
+
if (transitions && transitions.length) {
|
69
|
+
if (stageBeforeIn || stageBeforeOut) {
|
70
|
+
({ style: stylesA, classes: classesA } = cssBefore(transitions));
|
71
|
+
} else if (stageIn || stageOut) {
|
72
|
+
setTimeout(() => {
|
73
|
+
({ style: stylesA, classes: classesA } = cssDuring(transitions));
|
74
|
+
});
|
75
|
+
}
|
76
|
+
} else {
|
77
|
+
stylesA = '';
|
78
|
+
classesA = '';
|
79
|
+
}
|
80
|
+
});
|
81
|
+
|
82
|
+
$effect(() => {
|
83
|
+
// > layerB
|
84
|
+
|
85
|
+
const { stageBeforeIn, stageIn, stageBeforeOut, stageOut, transitions } =
|
86
|
+
presenter.layerB;
|
87
|
+
|
88
|
+
if (transitions) {
|
89
|
+
if (stageBeforeIn || stageBeforeOut) {
|
90
|
+
({ style: stylesB, classes: classesB } = cssBefore(transitions));
|
91
|
+
} else if (stageIn || stageOut) {
|
92
|
+
setTimeout(() => {
|
93
|
+
({ style: stylesB, classes: classesB } = cssDuring(transitions));
|
94
|
+
});
|
95
|
+
}
|
96
|
+
} else {
|
97
|
+
stylesB = '';
|
98
|
+
classesB = '';
|
99
|
+
}
|
100
|
+
});
|
101
|
+
</script>
|
102
|
+
|
103
|
+
<GridLayers data-component="presenter" {classes}>
|
104
|
+
<div
|
105
|
+
style:z-index={presenter.layerA.z}
|
106
|
+
style:visibility={presenter.layerA.visible ? 'visible' : 'hidden'}
|
107
|
+
inert={presenter.busy}
|
108
|
+
class="justify-self-stretch self-stretch overflow-hidden"
|
109
|
+
>
|
110
|
+
<div class={classesA} style={stylesA}>
|
111
|
+
{@render layoutSnippet(presenter.slideA, presenter.layerA)}
|
112
|
+
</div>
|
113
|
+
</div>
|
114
|
+
|
115
|
+
<div
|
116
|
+
style:z-index={presenter.layerB.z}
|
117
|
+
style:visibility={presenter.layerB.visible ? 'visible' : 'hidden'}
|
118
|
+
inert={presenter.busy}
|
119
|
+
class="justify-self-stretch self-stretch overflow-hidden"
|
120
|
+
>
|
121
|
+
<div class={classesB} style={stylesB}>
|
122
|
+
{@render layoutSnippet(presenter.slideB, presenter.layerB)}
|
123
|
+
</div>
|
124
|
+
</div>
|
125
|
+
</GridLayers>
|
@@ -1,26 +1,4 @@
|
|
1
1
|
export default VirtualViewport;
|
2
|
-
type VirtualViewport = {
|
3
|
-
$on?(type: string, callback: (e: any) => void): () => void;
|
4
|
-
$set?(props: Partial<{
|
5
|
-
[attr: string]: any;
|
6
|
-
base?: string;
|
7
|
-
bg?: string;
|
8
|
-
classes?: string;
|
9
|
-
width?: string;
|
10
|
-
height?: string;
|
11
|
-
overflow?: string;
|
12
|
-
designWidth?: number;
|
13
|
-
designHeight?: number;
|
14
|
-
scaleViewport?: number;
|
15
|
-
scaleW?: number;
|
16
|
-
scaleH?: number;
|
17
|
-
scaleUI?: number;
|
18
|
-
scaleTextBase?: number;
|
19
|
-
scaleTextHeading?: number;
|
20
|
-
scaleTextUI?: number;
|
21
|
-
children?: Snippet<[]>;
|
22
|
-
}>): void;
|
23
|
-
};
|
24
2
|
declare const VirtualViewport: import("svelte").Component<{
|
25
3
|
[attr: string]: any;
|
26
4
|
base?: string;
|