animot-presenter 0.5.18 → 0.5.20
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/AnimotPresenter.svelte +201 -21
- package/dist/cdn/animot-presenter.css +1 -1
- package/dist/cdn/animot-presenter.esm.js +5445 -5060
- package/dist/cdn/animot-presenter.min.js +9 -9
- package/dist/engine/container-layout.d.ts +12 -0
- package/dist/engine/container-layout.js +108 -0
- package/dist/engine/utils.d.ts +11 -0
- package/dist/engine/utils.js +14 -7
- package/dist/renderers/Container.svelte +30 -0
- package/dist/renderers/Container.svelte.d.ts +7 -0
- package/dist/renderers/ProgressBar.svelte +422 -0
- package/dist/renderers/ProgressBar.svelte.d.ts +10 -0
- package/dist/types.d.ts +103 -2
- package/package.json +1 -1
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
import ConfettiEffect from './effects/ConfettiEffect.svelte';
|
|
8
8
|
import CounterRenderer from './renderers/CounterRenderer.svelte';
|
|
9
9
|
import ChartRenderer from './renderers/ChartRenderer.svelte';
|
|
10
|
+
import ProgressBar from './renderers/ProgressBar.svelte';
|
|
11
|
+
import Container from './renderers/Container.svelte';
|
|
10
12
|
import IconRenderer from './renderers/IconRenderer.svelte';
|
|
11
13
|
import FlowMarkers from './FlowMarkers.svelte';
|
|
12
14
|
import { traceSvgPaths } from './utils/trace-svg-paths';
|
|
@@ -16,11 +18,11 @@
|
|
|
16
18
|
import { cameraTransform, defaultCamera, parallaxOffset } from './utils/camera';
|
|
17
19
|
import { parseEmbedUrl } from './utils/video-embed';
|
|
18
20
|
import EmbedPlayer from './EmbedPlayer.svelte';
|
|
19
|
-
import { easeInOutCubic, getEasingFn, getBackgroundStyle, hashFraction, getFloatAnimName, computeFloatAmp, computeFloatSpeed } from './engine/utils';
|
|
21
|
+
import { easeInOutCubic, getEasingFn, getBackgroundStyle, gradientShapeToCss, hashFraction, getFloatAnimName, computeFloatAmp, computeFloatSpeed } from './engine/utils';
|
|
20
22
|
import type {
|
|
21
23
|
AnimotProject, AnimotPresenterProps, CanvasElement, CodeElement, TextElement,
|
|
22
24
|
ArrowElement, ImageElement, VideoElement, ShapeElement, CounterElement, ChartElement, IconElement,
|
|
23
|
-
SvgElement, MotionPathElement, PathPoint,
|
|
25
|
+
SvgElement, MotionPathElement, ProgressElement, ContainerElement, PathPoint,
|
|
24
26
|
Slide, CodeAnimationMode, AnimatableProperty
|
|
25
27
|
} from './types';
|
|
26
28
|
import './styles/presenter.css';
|
|
@@ -53,6 +55,92 @@
|
|
|
53
55
|
if (motionPathLoopAbort) { motionPathLoopAbort.abort(); motionPathLoopAbort = null; }
|
|
54
56
|
}
|
|
55
57
|
|
|
58
|
+
// Keyframe schedule loop — independent from motion-path / morph engines.
|
|
59
|
+
let keyframeLoopAbort: AbortController | null = null;
|
|
60
|
+
let keyframeOverrides = $state<Map<string, Record<string, any>>>(new Map());
|
|
61
|
+
function cancelKeyframeLoops() {
|
|
62
|
+
if (keyframeLoopAbort) { keyframeLoopAbort.abort(); keyframeLoopAbort = null; }
|
|
63
|
+
}
|
|
64
|
+
function setKeyframeOverride(elementId: string, prop: string, value: any) {
|
|
65
|
+
const cur = keyframeOverrides.get(elementId) ?? {};
|
|
66
|
+
keyframeOverrides.set(elementId, { ...cur, [prop]: value });
|
|
67
|
+
keyframeOverrides = new Map(keyframeOverrides);
|
|
68
|
+
}
|
|
69
|
+
function easingForTween(name: string | undefined): string {
|
|
70
|
+
// Animotion tween easing accepts strings; pass-through with default.
|
|
71
|
+
switch (name) {
|
|
72
|
+
case 'linear': case 'ease-in': case 'ease-out': case 'ease-in-out': return name;
|
|
73
|
+
case 'spring': return 'ease-out';
|
|
74
|
+
case 'ease': default: return 'ease-out';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function animateKeyframes(slide: Slide) {
|
|
78
|
+
cancelKeyframeLoops();
|
|
79
|
+
keyframeLoopAbort = new AbortController();
|
|
80
|
+
const signal = keyframeLoopAbort.signal;
|
|
81
|
+
if (keyframeOverrides.size > 0) keyframeOverrides = new Map();
|
|
82
|
+
for (const element of slide.canvas.elements) {
|
|
83
|
+
if (!element.keyframes || element.keyframes.length === 0) continue;
|
|
84
|
+
const animated = animatedElements.get(element.id) as any;
|
|
85
|
+
if (!animated) continue;
|
|
86
|
+
const sorted = [...element.keyframes].sort((a, b) => a.time - b.time);
|
|
87
|
+
const first = sorted[0];
|
|
88
|
+
|
|
89
|
+
// Snap to KF1 instantly so the slide-displayed pose IS the start.
|
|
90
|
+
if (first.position) { animated.x?.to(first.position.x, { duration: 0 }); animated.y?.to(first.position.y, { duration: 0 }); }
|
|
91
|
+
if (first.size) { animated.width?.to(first.size.width, { duration: 0 }); animated.height?.to(first.size.height, { duration: 0 }); }
|
|
92
|
+
if (first.rotation !== undefined) animated.rotation?.to(first.rotation, { duration: 0 });
|
|
93
|
+
if (first.opacity !== undefined) animated.opacity?.to(first.opacity, { duration: 0 });
|
|
94
|
+
if (first.skewX !== undefined) animated.skewX?.to(first.skewX, { duration: 0 });
|
|
95
|
+
if (first.skewY !== undefined) animated.skewY?.to(first.skewY, { duration: 0 });
|
|
96
|
+
if (first.tiltX !== undefined) animated.tiltX?.to(first.tiltX, { duration: 0 });
|
|
97
|
+
if (first.tiltY !== undefined) animated.tiltY?.to(first.tiltY, { duration: 0 });
|
|
98
|
+
if (first.borderRadius !== undefined) animated.borderRadius?.to(first.borderRadius, { duration: 0 });
|
|
99
|
+
if (first.fontSize !== undefined) animated.fontSize?.to(first.fontSize, { duration: 0 });
|
|
100
|
+
if (first.fillColor !== undefined) animated.fillColor?.to(first.fillColor, { duration: 0 });
|
|
101
|
+
if (first.strokeColor !== undefined) animated.strokeColor?.to(first.strokeColor, { duration: 0 });
|
|
102
|
+
if (first.strokeWidth !== undefined) animated.strokeWidth?.to(first.strokeWidth, { duration: 0 });
|
|
103
|
+
if (first.blur !== undefined) animated.blur?.to(first.blur, { duration: 0 });
|
|
104
|
+
if (first.brightness !== undefined) animated.brightness?.to(first.brightness, { duration: 0 });
|
|
105
|
+
if (first.contrast !== undefined) animated.contrast?.to(first.contrast, { duration: 0 });
|
|
106
|
+
if (first.saturate !== undefined) animated.saturate?.to(first.saturate, { duration: 0 });
|
|
107
|
+
if (first.grayscale !== undefined) animated.grayscale?.to(first.grayscale, { duration: 0 });
|
|
108
|
+
if (first.backgroundColor !== undefined) setKeyframeOverride(element.id, 'backgroundColor', first.backgroundColor);
|
|
109
|
+
if (first.color !== undefined) setKeyframeOverride(element.id, 'color', first.color);
|
|
110
|
+
|
|
111
|
+
for (const kf of sorted.slice(1)) {
|
|
112
|
+
const delay = Math.max(0, kf.time);
|
|
113
|
+
setTimeout(() => {
|
|
114
|
+
if (signal.aborted) return;
|
|
115
|
+
const easing = easingForTween(kf.easing);
|
|
116
|
+
const idx = sorted.indexOf(kf);
|
|
117
|
+
const prevTime = idx === 0 ? 0 : sorted[idx - 1].time;
|
|
118
|
+
const span = Math.max(50, kf.time - prevTime);
|
|
119
|
+
if (kf.position) { animated.x?.to(kf.position.x, { duration: span, easing }); animated.y?.to(kf.position.y, { duration: span, easing }); }
|
|
120
|
+
if (kf.size) { animated.width?.to(kf.size.width, { duration: span, easing }); animated.height?.to(kf.size.height, { duration: span, easing }); }
|
|
121
|
+
if (kf.rotation !== undefined) animated.rotation?.to(kf.rotation, { duration: span, easing });
|
|
122
|
+
if (kf.opacity !== undefined) animated.opacity?.to(kf.opacity, { duration: span, easing });
|
|
123
|
+
if (kf.skewX !== undefined) animated.skewX?.to(kf.skewX, { duration: span, easing });
|
|
124
|
+
if (kf.skewY !== undefined) animated.skewY?.to(kf.skewY, { duration: span, easing });
|
|
125
|
+
if (kf.tiltX !== undefined) animated.tiltX?.to(kf.tiltX, { duration: span, easing });
|
|
126
|
+
if (kf.tiltY !== undefined) animated.tiltY?.to(kf.tiltY, { duration: span, easing });
|
|
127
|
+
if (kf.borderRadius !== undefined) animated.borderRadius?.to(kf.borderRadius, { duration: span, easing });
|
|
128
|
+
if (kf.fontSize !== undefined) animated.fontSize?.to(kf.fontSize, { duration: span, easing });
|
|
129
|
+
if (kf.fillColor !== undefined) animated.fillColor?.to(kf.fillColor, { duration: span, easing });
|
|
130
|
+
if (kf.strokeColor !== undefined) animated.strokeColor?.to(kf.strokeColor, { duration: span, easing });
|
|
131
|
+
if (kf.strokeWidth !== undefined) animated.strokeWidth?.to(kf.strokeWidth, { duration: span, easing });
|
|
132
|
+
if (kf.blur !== undefined) animated.blur?.to(kf.blur, { duration: span, easing });
|
|
133
|
+
if (kf.brightness !== undefined) animated.brightness?.to(kf.brightness, { duration: span, easing });
|
|
134
|
+
if (kf.contrast !== undefined) animated.contrast?.to(kf.contrast, { duration: span, easing });
|
|
135
|
+
if (kf.saturate !== undefined) animated.saturate?.to(kf.saturate, { duration: span, easing });
|
|
136
|
+
if (kf.grayscale !== undefined) animated.grayscale?.to(kf.grayscale, { duration: span, easing });
|
|
137
|
+
if (kf.backgroundColor !== undefined) setKeyframeOverride(element.id, 'backgroundColor', kf.backgroundColor);
|
|
138
|
+
if (kf.color !== undefined) setKeyframeOverride(element.id, 'color', kf.color);
|
|
139
|
+
}, delay);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
56
144
|
// --- Motion Path Utilities ---
|
|
57
145
|
function buildPresenterPathD(points: PathPoint[], closed: boolean): string {
|
|
58
146
|
if (points.length < 2) return '';
|
|
@@ -179,6 +267,7 @@
|
|
|
179
267
|
// Snapshot of charts on the OUTGOING slide so the renderer can tween
|
|
180
268
|
// data values into the new slide. Updated alongside previousCodeContent.
|
|
181
269
|
let previousChartContent = $state<Map<string, ChartElement>>(new Map());
|
|
270
|
+
let previousProgressContent = $state<Map<string, ProgressElement>>(new Map());
|
|
182
271
|
let codeMorphState = $state<Map<string, {oldCode: string, newCode: string, mode: CodeAnimationMode, speed: number, highlightColor: string}>>(new Map());
|
|
183
272
|
let textTypewriterState = $state<Map<string, {fullText: string, displayedChars: number, isAnimating: boolean}>>(new Map());
|
|
184
273
|
let typewriterIntervals = new Map<string, ReturnType<typeof setInterval>>();
|
|
@@ -261,8 +350,67 @@
|
|
|
261
350
|
return elements.map(e => e.id);
|
|
262
351
|
});
|
|
263
352
|
|
|
264
|
-
|
|
265
|
-
|
|
353
|
+
/**
|
|
354
|
+
* Resolve an element's pose on a slide, taking per-element keyframes
|
|
355
|
+
* into account. Keyframes turn the element's "effective state" into
|
|
356
|
+
* something time-dependent — `pose='enter'` returns the FIRST keyframe's
|
|
357
|
+
* state (used as morph TARGET / initial-tween-seed), `pose='exit'` the
|
|
358
|
+
* LAST keyframe's (used as morph SOURCE on slide leave).
|
|
359
|
+
*/
|
|
360
|
+
function getElementInSlide(slide: Slide | null, elementId: string, pose: 'enter' | 'exit' = 'enter'): CanvasElement | undefined {
|
|
361
|
+
const el = slide?.canvas.elements.find(el => el.id === elementId);
|
|
362
|
+
if (!el) return el;
|
|
363
|
+
if (!el.keyframes || el.keyframes.length === 0) return el;
|
|
364
|
+
const sorted = [...el.keyframes].sort((a, b) => a.time - b.time);
|
|
365
|
+
const k = pose === 'exit' ? sorted[sorted.length - 1] : sorted[0];
|
|
366
|
+
const out: any = { ...el };
|
|
367
|
+
if (k.position) out.position = k.position;
|
|
368
|
+
if (k.size) out.size = k.size;
|
|
369
|
+
if (k.rotation !== undefined) out.rotation = k.rotation;
|
|
370
|
+
if (k.opacity !== undefined) out.opacity = k.opacity;
|
|
371
|
+
if (k.skewX !== undefined) out.skewX = k.skewX;
|
|
372
|
+
if (k.skewY !== undefined) out.skewY = k.skewY;
|
|
373
|
+
if (k.tiltX !== undefined) out.tiltX = k.tiltX;
|
|
374
|
+
if (k.tiltY !== undefined) out.tiltY = k.tiltY;
|
|
375
|
+
if (k.borderRadius !== undefined) out.borderRadius = k.borderRadius;
|
|
376
|
+
if (k.fontSize !== undefined) out.fontSize = k.fontSize;
|
|
377
|
+
if (k.fillColor !== undefined) out.fillColor = k.fillColor;
|
|
378
|
+
if (k.strokeColor !== undefined) out.strokeColor = k.strokeColor;
|
|
379
|
+
if (k.strokeWidth !== undefined) out.strokeWidth = k.strokeWidth;
|
|
380
|
+
if (k.blur !== undefined) out.blur = k.blur;
|
|
381
|
+
if (k.brightness !== undefined) out.brightness = k.brightness;
|
|
382
|
+
if (k.contrast !== undefined) out.contrast = k.contrast;
|
|
383
|
+
if (k.saturate !== undefined) out.saturate = k.saturate;
|
|
384
|
+
if (k.grayscale !== undefined) out.grayscale = k.grayscale;
|
|
385
|
+
return out as CanvasElement;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Overlay the current LIVE tween values for properties that the renderer
|
|
390
|
+
* reads directly from element data. Lets per-element keyframes drive
|
|
391
|
+
* borderRadius / fontSize / shape colors / stroke width / CSS filters
|
|
392
|
+
* at render time, plus non-tweened overrides (backgroundColor, color).
|
|
393
|
+
*/
|
|
394
|
+
function liveProps<T extends CanvasElement>(element: T): T {
|
|
395
|
+
const a = animatedElements.get(element.id);
|
|
396
|
+
const overrides = keyframeOverrides.get(element.id);
|
|
397
|
+
if (!a && !overrides) return element;
|
|
398
|
+
const e = element as any;
|
|
399
|
+
const out: any = { ...element };
|
|
400
|
+
if (a) {
|
|
401
|
+
if ((a as any).borderRadius && e.borderRadius !== undefined) out.borderRadius = (a as any).borderRadius.current;
|
|
402
|
+
if ((a as any).fontSize && e.fontSize !== undefined) out.fontSize = (a as any).fontSize.current;
|
|
403
|
+
if ((a as any).fillColor && e.fillColor !== undefined) out.fillColor = (a as any).fillColor.current;
|
|
404
|
+
if ((a as any).strokeColor && e.strokeColor !== undefined) out.strokeColor = (a as any).strokeColor.current;
|
|
405
|
+
if ((a as any).strokeWidth && e.strokeWidth !== undefined) out.strokeWidth = (a as any).strokeWidth.current;
|
|
406
|
+
if ((a as any).blur && e.blur !== undefined) out.blur = (a as any).blur.current;
|
|
407
|
+
if ((a as any).brightness && e.brightness !== undefined) out.brightness = (a as any).brightness.current;
|
|
408
|
+
if ((a as any).contrast && e.contrast !== undefined) out.contrast = (a as any).contrast.current;
|
|
409
|
+
if ((a as any).saturate && e.saturate !== undefined) out.saturate = (a as any).saturate.current;
|
|
410
|
+
if ((a as any).grayscale && e.grayscale !== undefined) out.grayscale = (a as any).grayscale.current;
|
|
411
|
+
}
|
|
412
|
+
if (overrides) Object.assign(out, overrides);
|
|
413
|
+
return out as T;
|
|
266
414
|
}
|
|
267
415
|
|
|
268
416
|
// Typewriter
|
|
@@ -495,6 +643,7 @@
|
|
|
495
643
|
isTransitioning = true;
|
|
496
644
|
clearAllTypewriterAnimations();
|
|
497
645
|
cancelMotionPathLoops();
|
|
646
|
+
cancelKeyframeLoops();
|
|
498
647
|
const firstSlide = slides[0];
|
|
499
648
|
if (!firstSlide) { isTransitioning = false; return; }
|
|
500
649
|
|
|
@@ -554,6 +703,7 @@
|
|
|
554
703
|
codeMorphState = new Map();
|
|
555
704
|
previousCodeContent = newPreviousCodeContent;
|
|
556
705
|
previousChartContent = new Map();
|
|
706
|
+
previousProgressContent = new Map();
|
|
557
707
|
shapeMorphStates = new Map();
|
|
558
708
|
elementContent = new Map(elementContent);
|
|
559
709
|
currentSlideIndex = 0;
|
|
@@ -572,6 +722,7 @@
|
|
|
572
722
|
}
|
|
573
723
|
}
|
|
574
724
|
|
|
725
|
+
animateKeyframes(firstSlide);
|
|
575
726
|
animateMotionPaths(firstSlide);
|
|
576
727
|
onslidechange?.(0, slides.length);
|
|
577
728
|
}
|
|
@@ -585,6 +736,7 @@
|
|
|
585
736
|
const targetSlide = slides[targetIndex];
|
|
586
737
|
clearAllTypewriterAnimations();
|
|
587
738
|
cancelMotionPathLoops();
|
|
739
|
+
cancelKeyframeLoops();
|
|
588
740
|
// Manual arrow nav and the autoplay timer are both forms of "user
|
|
589
741
|
// is moving forward in the deck" — both should swap narration to
|
|
590
742
|
// the new slide. The pause button is what stops audio. Without
|
|
@@ -603,6 +755,7 @@
|
|
|
603
755
|
const newCodeMorphState = new Map(codeMorphState);
|
|
604
756
|
const newPreviousCodeContent = new Map(previousCodeContent);
|
|
605
757
|
const newPreviousChartContent = new Map(previousChartContent);
|
|
758
|
+
const newPreviousProgressContent = new Map(previousProgressContent);
|
|
606
759
|
for (const elementId of allElementIds) {
|
|
607
760
|
const targetEl = getElementInSlide(targetSlide, elementId);
|
|
608
761
|
const animated = animatedElements.get(elementId);
|
|
@@ -619,6 +772,12 @@
|
|
|
619
772
|
newPreviousChartContent.set(elementId, JSON.parse(JSON.stringify(outgoing)));
|
|
620
773
|
}
|
|
621
774
|
}
|
|
775
|
+
if (targetEl.type === 'progress') {
|
|
776
|
+
const outgoing = elementContent.get(elementId);
|
|
777
|
+
if (outgoing && outgoing.type === 'progress') {
|
|
778
|
+
newPreviousProgressContent.set(elementId, JSON.parse(JSON.stringify(outgoing)));
|
|
779
|
+
}
|
|
780
|
+
}
|
|
622
781
|
newElementContent.set(elementId, JSON.parse(JSON.stringify(targetEl)));
|
|
623
782
|
if (animated) {
|
|
624
783
|
animated.x.to(targetEl.position.x, { duration: 0 }); animated.y.to(targetEl.position.y, { duration: 0 });
|
|
@@ -660,6 +819,7 @@
|
|
|
660
819
|
codeMorphState = newCodeMorphState;
|
|
661
820
|
previousCodeContent = newPreviousCodeContent;
|
|
662
821
|
previousChartContent = newPreviousChartContent;
|
|
822
|
+
previousProgressContent = newPreviousProgressContent;
|
|
663
823
|
elementContent = newElementContent;
|
|
664
824
|
animatedElements = new Map(animatedElements);
|
|
665
825
|
currentSlideIndex = targetIndex;
|
|
@@ -673,6 +833,7 @@
|
|
|
673
833
|
transitionClass = `transition-${transition.type}-in`;
|
|
674
834
|
await new Promise(r => setTimeout(r, duration * 0.6));
|
|
675
835
|
transitionClass = '';
|
|
836
|
+
animateKeyframes(targetSlide);
|
|
676
837
|
animateMotionPaths(targetSlide);
|
|
677
838
|
isTransitioning = false;
|
|
678
839
|
onslidechange?.(targetIndex, slides.length);
|
|
@@ -683,7 +844,9 @@
|
|
|
683
844
|
// Per-element morphing (transition type = 'none')
|
|
684
845
|
const animations: Promise<void>[] = [];
|
|
685
846
|
for (const elementId of allElementIds) {
|
|
686
|
-
|
|
847
|
+
// FROM-sync: use the EXIT pose (last keyframe) so morph starts
|
|
848
|
+
// from where the keyframe loop left the element on screen.
|
|
849
|
+
const currentEl = getElementInSlide(currentSlide, elementId, 'exit');
|
|
687
850
|
const animated = animatedElements.get(elementId);
|
|
688
851
|
if (!animated) continue;
|
|
689
852
|
if (currentEl) {
|
|
@@ -727,18 +890,25 @@
|
|
|
727
890
|
previousChartContent.set(elementId, JSON.parse(JSON.stringify(outgoing)));
|
|
728
891
|
}
|
|
729
892
|
}
|
|
893
|
+
if (targetEl.type === 'progress') {
|
|
894
|
+
const outgoing = elementContent.get(elementId);
|
|
895
|
+
if (outgoing && outgoing.type === 'progress') {
|
|
896
|
+
previousProgressContent.set(elementId, JSON.parse(JSON.stringify(outgoing)));
|
|
897
|
+
}
|
|
898
|
+
}
|
|
730
899
|
elementContent.set(elementId, JSON.parse(JSON.stringify(targetEl)));
|
|
731
900
|
}
|
|
732
901
|
}
|
|
733
902
|
elementContent = new Map(elementContent);
|
|
903
|
+
previousProgressContent = new Map(previousProgressContent);
|
|
734
904
|
previousChartContent = new Map(previousChartContent);
|
|
735
905
|
|
|
736
906
|
interface AnimationTask { elementId: string; order: number; delay: number; elementDuration: number; run: () => Promise<void>[]; }
|
|
737
907
|
const animationTasks: AnimationTask[] = [];
|
|
738
908
|
|
|
739
909
|
for (const elementId of allElementIds) {
|
|
740
|
-
const currentEl = getElementInSlide(currentSlide, elementId);
|
|
741
|
-
const targetEl = getElementInSlide(targetSlide, elementId);
|
|
910
|
+
const currentEl = getElementInSlide(currentSlide, elementId, 'exit');
|
|
911
|
+
const targetEl = getElementInSlide(targetSlide, elementId, 'enter');
|
|
742
912
|
const animated = animatedElements.get(elementId);
|
|
743
913
|
if (!animated) continue;
|
|
744
914
|
const animConfig = targetEl?.animationConfig || currentEl?.animationConfig;
|
|
@@ -981,6 +1151,7 @@
|
|
|
981
1151
|
const animated = animatedElements.get(elementId);
|
|
982
1152
|
if (!onSlide && animated) { animated.opacity.to(0, { duration: 0 }); }
|
|
983
1153
|
}
|
|
1154
|
+
animateKeyframes(slides[targetIndex]);
|
|
984
1155
|
animateMotionPaths(slides[targetIndex]);
|
|
985
1156
|
onslidechange?.(targetIndex, slides.length);
|
|
986
1157
|
if (targetIndex === slides.length - 1 && !loop) oncomplete?.();
|
|
@@ -1149,7 +1320,7 @@
|
|
|
1149
1320
|
initAllAnimatedElements();
|
|
1150
1321
|
await loadCodeHighlights();
|
|
1151
1322
|
loading = false;
|
|
1152
|
-
if (currentSlide) setTimeout(() => animateMotionPaths(currentSlide!), 300);
|
|
1323
|
+
if (currentSlide) setTimeout(() => { animateKeyframes(currentSlide!); animateMotionPaths(currentSlide!); }, 300);
|
|
1153
1324
|
// Narration starts via the play-state effect below — not on
|
|
1154
1325
|
// mount. That way the user's click on Play is the gesture
|
|
1155
1326
|
// that unlocks audio, and a paused deck stays silent.
|
|
@@ -1281,7 +1452,7 @@
|
|
|
1281
1452
|
use:decorations={{ config: element.decorations, slideDuration: currentSlide?.duration, shape: element.type === 'shape' ? { type: (element as any).shapeType, borderRadius: (element as any).borderRadius } : undefined, key: `${currentSlideIndex}-${JSON.stringify(element.decorations ?? null)}-${element.type === 'shape' ? (element as any).shapeType + ':' + ((element as any).borderRadius ?? 0) : ''}` }}
|
|
1282
1453
|
>
|
|
1283
1454
|
{#if element.type === 'code'}
|
|
1284
|
-
{@const codeEl = element as CodeElement}
|
|
1455
|
+
{@const codeEl = liveProps(element) as CodeElement}
|
|
1285
1456
|
{@const morphState = codeMorphState.get(codeEl.id)}
|
|
1286
1457
|
<div class="animot-code-block" class:transparent-bg={codeEl.transparentBackground} style:font-size="{codeEl.fontSize}px" style:font-weight={codeEl.fontWeight || 400} style:padding="{codeEl.padding}px" style:border-radius="{animated.borderRadius.current}px" style:background={codeEl.bgColor ?? '#0d1117'}>
|
|
1287
1458
|
{#if codeEl.showHeader}
|
|
@@ -1338,7 +1509,7 @@
|
|
|
1338
1509
|
</div>
|
|
1339
1510
|
</div>
|
|
1340
1511
|
{:else if element.type === 'text'}
|
|
1341
|
-
{@const textEl = element as TextElement}
|
|
1512
|
+
{@const textEl = liveProps(element) as TextElement}
|
|
1342
1513
|
{@const animFontSize = animated.fontSize?.current ?? textEl.fontSize}
|
|
1343
1514
|
{@const typewriterState = textTypewriterState.get(element.id)}
|
|
1344
1515
|
{@const displayText = typewriterState?.isAnimating ? typewriterState.fullText.slice(0, typewriterState.displayedChars) : textEl.content}
|
|
@@ -1351,13 +1522,13 @@
|
|
|
1351
1522
|
style:font-family="'{textEl.fontFamily}', sans-serif"
|
|
1352
1523
|
style:font-style={textEl.fontStyle ?? 'normal'}
|
|
1353
1524
|
style:text-decoration={textEl.textDecoration ?? 'none'}
|
|
1354
|
-
style:color={textEl.backgroundImage ? 'transparent' : (textEl.hollow && textEl.textStroke?.enabled ? 'transparent' : textEl.color)}
|
|
1355
|
-
style:background-color={textEl.backgroundImage ? 'transparent' : textEl.backgroundColor}
|
|
1356
|
-
style:background-image={textEl.backgroundImage ? `url(${textEl.backgroundImage})` : 'none'}
|
|
1357
|
-
style:background-size={textEl.backgroundImage ? `${textEl.backgroundScale ?? 100}%` : 'cover'}
|
|
1358
|
-
style:background-position={textEl.backgroundImage ? `${textEl.backgroundPositionX ?? 50}% ${textEl.backgroundPositionY ?? 50}%` : 'center'}
|
|
1359
|
-
style:-webkit-background-clip={textEl.backgroundImage ? 'text' : 'border-box'}
|
|
1360
|
-
style:background-clip={textEl.backgroundImage ? 'text' : 'border-box'}
|
|
1525
|
+
style:color={(textEl.gradient || textEl.backgroundImage) ? 'transparent' : (textEl.hollow && textEl.textStroke?.enabled ? 'transparent' : textEl.color)}
|
|
1526
|
+
style:background-color={(textEl.gradient || textEl.backgroundImage) ? 'transparent' : textEl.backgroundColor}
|
|
1527
|
+
style:background-image={textEl.gradient ? gradientShapeToCss(textEl.gradient) : textEl.backgroundImage ? `url(${textEl.backgroundImage})` : 'none'}
|
|
1528
|
+
style:background-size={textEl.backgroundImage && !textEl.gradient ? `${textEl.backgroundScale ?? 100}%` : 'cover'}
|
|
1529
|
+
style:background-position={textEl.backgroundImage && !textEl.gradient ? `${textEl.backgroundPositionX ?? 50}% ${textEl.backgroundPositionY ?? 50}%` : 'center'}
|
|
1530
|
+
style:-webkit-background-clip={(textEl.gradient || textEl.backgroundImage) ? 'text' : 'border-box'}
|
|
1531
|
+
style:background-clip={(textEl.gradient || textEl.backgroundImage) ? 'text' : 'border-box'}
|
|
1361
1532
|
style:padding="{textEl.padding}px"
|
|
1362
1533
|
style:border-radius="{textEl.borderRadius}px"
|
|
1363
1534
|
style:text-align={textEl.textAlign}
|
|
@@ -1369,7 +1540,7 @@
|
|
|
1369
1540
|
{#if !isActionTextMode}{displayText}{#if typewriterState?.isAnimating}<span class="animot-typewriter-cursor">|</span>{/if}{/if}
|
|
1370
1541
|
</div>
|
|
1371
1542
|
{:else if element.type === 'arrow'}
|
|
1372
|
-
{@const arrowEl = element as ArrowElement}
|
|
1543
|
+
{@const arrowEl = liveProps(element) as ArrowElement}
|
|
1373
1544
|
{@const cp = arrowEl.controlPoints || []}
|
|
1374
1545
|
{@const pathD = cp.length === 0 ? `M ${arrowEl.startPoint.x} ${arrowEl.startPoint.y} L ${arrowEl.endPoint.x} ${arrowEl.endPoint.y}` : cp.length === 1 ? `M ${arrowEl.startPoint.x} ${arrowEl.startPoint.y} Q ${cp[0].x} ${cp[0].y} ${arrowEl.endPoint.x} ${arrowEl.endPoint.y}` : cp.length === 2 ? `M ${arrowEl.startPoint.x} ${arrowEl.startPoint.y} C ${cp[0].x} ${cp[0].y} ${cp[1].x} ${cp[1].y} ${arrowEl.endPoint.x} ${arrowEl.endPoint.y}` : buildCatmullRomPath(arrowEl.startPoint, cp, arrowEl.endPoint)}
|
|
1375
1546
|
{@const lastCp = cp.length > 0 ? cp[cp.length - 1] : arrowEl.startPoint}
|
|
@@ -1392,11 +1563,11 @@
|
|
|
1392
1563
|
{/if}
|
|
1393
1564
|
</svg>
|
|
1394
1565
|
{:else if element.type === 'image'}
|
|
1395
|
-
{@const imgEl = element as ImageElement}
|
|
1566
|
+
{@const imgEl = liveProps(element) as ImageElement}
|
|
1396
1567
|
{@const clipPath = imgEl.clipMask?.enabled ? (imgEl.clipMask.shapeType === 'circle' ? 'circle(50% at 50% 50%)' : imgEl.clipMask.shapeType === 'ellipse' ? 'ellipse(50% 50% at 50% 50%)' : imgEl.clipMask.shapeType === 'triangle' ? 'polygon(50% 0%, 0% 100%, 100% 100%)' : imgEl.clipMask.shapeType === 'star' ? 'polygon(50% 0%, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%)' : imgEl.clipMask.shapeType === 'hexagon' ? 'polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%)' : (imgEl.clipMask.borderRadius ?? 0) > 0 ? `inset(0 round ${imgEl.clipMask.borderRadius}px)` : 'none') : 'none'}
|
|
1397
1568
|
<img class="animot-image-element" src={imgEl.src} alt="" style:object-fit={imgEl.objectFit} style:border-radius="{imgEl.clipMask?.enabled ? 0 : imgEl.borderRadius}px" style:clip-path={clipPath} style:background-color={imgEl.backgroundColor ?? 'transparent'} />
|
|
1398
1569
|
{:else if element.type === 'video'}
|
|
1399
|
-
{@const videoEl = element as VideoElement}
|
|
1570
|
+
{@const videoEl = liveProps(element) as VideoElement}
|
|
1400
1571
|
{@const videoEmbed = parseEmbedUrl(videoEl.src)}
|
|
1401
1572
|
{#if videoEmbed}
|
|
1402
1573
|
<div class="animot-video-element animot-embed-wrap" style:border-radius="{videoEl.borderRadius}px" style:opacity={videoEl.opacity}>
|
|
@@ -1406,7 +1577,7 @@
|
|
|
1406
1577
|
<video class="animot-video-element" src={videoEl.src} poster={videoEl.posterImage} autoplay={videoEl.autoplay} loop={videoEl.loop} muted={videoEl.muted} controls={!!videoEl.showControls} playsinline preload="auto" style:object-fit={videoEl.objectFit} style:border-radius="{videoEl.borderRadius}px" style:opacity={videoEl.opacity}></video>
|
|
1407
1578
|
{/if}
|
|
1408
1579
|
{:else if element.type === 'shape'}
|
|
1409
|
-
{@const shapeEl = element as ShapeElement}
|
|
1580
|
+
{@const shapeEl = liveProps(element) as ShapeElement}
|
|
1410
1581
|
{@const animFill = animated.fillColor?.current ?? shapeEl.fillColor}
|
|
1411
1582
|
{@const animStroke = animated.strokeColor?.current ?? shapeEl.strokeColor}
|
|
1412
1583
|
{@const animStrokeWidth = animated.strokeWidth?.current ?? shapeEl.strokeWidth}
|
|
@@ -1433,6 +1604,15 @@
|
|
|
1433
1604
|
slideId={currentSlide?.id ?? ''}
|
|
1434
1605
|
previousElement={previousChartContent.get(element.id) ?? null}
|
|
1435
1606
|
/>
|
|
1607
|
+
{:else if element.type === 'progress'}
|
|
1608
|
+
<ProgressBar
|
|
1609
|
+
element={element as ProgressElement}
|
|
1610
|
+
isPresenting={true}
|
|
1611
|
+
slideId={currentSlide?.id ?? ''}
|
|
1612
|
+
previousElement={previousProgressContent.get(element.id) ?? null}
|
|
1613
|
+
/>
|
|
1614
|
+
{:else if element.type === 'container'}
|
|
1615
|
+
<Container element={element as ContainerElement} />
|
|
1436
1616
|
{:else if element.type === 'icon'}
|
|
1437
1617
|
<IconRenderer element={element as IconElement} />
|
|
1438
1618
|
{:else if element.type === 'svg'}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.code-morph.svelte-1hmk0l{width:100%;height:100%;margin:0;padding:0;background:transparent;font-family:var(--font-mono, "JetBrains Mono", monospace);font-size:inherit;line-height:1.6;white-space:pre-wrap;word-wrap:break-word;color:#e6edf3;box-sizing:border-box;overflow:visible}.code-morph.svelte-1hmk0l pre{margin:0;padding:16px;background:transparent!important;font-family:var(--font-mono);font-size:inherit;line-height:1.6;overflow:visible}.code-morph.svelte-1hmk0l code{font-family:inherit;font-size:inherit;font-weight:inherit}.code-morph.svelte-1hmk0l .line-number{display:inline-block;width:2.5em;margin-right:1em;text-align:right;color:#6e7681;-webkit-user-select:none;user-select:none;opacity:.6}.code-morph.svelte-1hmk0l .word-highlight{background:var(--highlight-color, #facc15);color:#000;border-radius:3px;padding:1px 3px;margin:0 -3px;-webkit-box-decoration-break:clone;box-decoration-break:clone;animation:svelte-1hmk0l-fadeHighlight var(--duration, 1s) ease-out forwards}@keyframes svelte-1hmk0l-fadeHighlight{0%{background:var(--highlight-color, #facc15);color:#000}70%{background:var(--highlight-color, #facc15);color:#000}to{background:transparent;color:inherit}}.counter.svelte-1er5jjj{width:100%;height:100%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;overflow:hidden;white-space:nowrap}.animot-chart.svelte-1mq2d7j{width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box;overflow:hidden}.animot-chart-title.svelte-1mq2d7j{font-weight:600;text-align:center;margin-bottom:8px}.animot-chart-content.svelte-1mq2d7j{flex:1;min-height:0;display:flex;flex-direction:column}.animot-chart-content.svelte-1mq2d7j svg:where(.svelte-1mq2d7j){width:100%;flex:1;min-height:0}.animot-bar-chart.svelte-1mq2d7j,.animot-line-chart.svelte-1mq2d7j{overflow:visible}.animot-series-legend.svelte-1mq2d7j{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;padding:6px 0 0;font-size:.85em}.animot-legend-item.svelte-1mq2d7j{display:inline-flex;align-items:center;gap:5px}.animot-swatch.svelte-1mq2d7j{width:10px;height:10px;border-radius:2px;display:inline-block}.icon-element.svelte-2ld65o{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.icon-element.svelte-2ld65o svg{width:100%;height:100%}.flow-markers.svelte-15cxp1m{pointer-events:none}.embed-player.svelte-1u59mvz{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.embed-frame.svelte-1u59mvz{width:100%;height:100%;display:block;border:0}.embed-frame.passthrough.svelte-1u59mvz{pointer-events:none}.custom-controls.svelte-1u59mvz{position:absolute;left:8px;right:8px;bottom:8px;display:flex;align-items:center;gap:10px;padding:6px 10px;background:#0009;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border-radius:8px;opacity:0;transition:opacity .2s}.embed-player.svelte-1u59mvz:hover .custom-controls:where(.svelte-1u59mvz),.custom-controls.svelte-1u59mvz:focus-within{opacity:1}.ctrl-btn.svelte-1u59mvz{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:0;border-radius:4px;color:#fff;cursor:pointer}.ctrl-btn.svelte-1u59mvz:hover{background:#ffffff26}.ctrl-btn.svelte-1u59mvz svg:where(.svelte-1u59mvz){width:16px;height:16px}.scrub.svelte-1u59mvz{flex:1;accent-color:#6366f1}.time.svelte-1u59mvz{font-size:11px;color:#ffffffd9;font-variant-numeric:tabular-nums;min-width:80px;text-align:right}@keyframes float-vertical{0%,to{translate:0 0}50%{translate:0 calc(-1 * var(--float-amp, 10px))}}@keyframes float-horizontal{0%,to{translate:0 0}50%{translate:var(--float-amp, 10px) 0}}@keyframes float-both-0{0%{translate:0 0}15%{translate:calc(.8 * var(--float-amp, 10px)) calc(-.6 * var(--float-amp, 10px))}35%{translate:calc(-.4 * var(--float-amp, 10px)) calc(-1 * var(--float-amp, 10px))}55%{translate:calc(-.9 * var(--float-amp, 10px)) calc(.3 * var(--float-amp, 10px))}75%{translate:calc(.3 * var(--float-amp, 10px)) calc(.7 * var(--float-amp, 10px))}to{translate:0 0}}@keyframes float-both-1{0%{translate:0 0}20%{translate:calc(-.7 * var(--float-amp, 10px)) calc(-.8 * var(--float-amp, 10px))}40%{translate:calc(.5 * var(--float-amp, 10px)) calc(-.3 * var(--float-amp, 10px))}60%{translate:calc(.9 * var(--float-amp, 10px)) calc(.6 * var(--float-amp, 10px))}80%{translate:calc(-.4 * var(--float-amp, 10px)) calc(.9 * var(--float-amp, 10px))}to{translate:0 0}}@keyframes float-both-2{0%{translate:0 0}12%{translate:calc(.6 * var(--float-amp, 10px)) calc(.5 * var(--float-amp, 10px))}30%{translate:calc(1 * var(--float-amp, 10px)) calc(-.4 * var(--float-amp, 10px))}50%{translate:calc(-.3 * var(--float-amp, 10px)) calc(-.9 * var(--float-amp, 10px))}70%{translate:calc(-.8 * var(--float-amp, 10px)) calc(.2 * var(--float-amp, 10px))}88%{translate:calc(.2 * var(--float-amp, 10px)) calc(.8 * var(--float-amp, 10px))}to{translate:0 0}}@keyframes float-both-3{0%{translate:0 0}17%{translate:calc(-.9 * var(--float-amp, 10px)) calc(.4 * var(--float-amp, 10px))}33%{translate:calc(-.5 * var(--float-amp, 10px)) calc(-.7 * var(--float-amp, 10px))}50%{translate:calc(.7 * var(--float-amp, 10px)) calc(-.9 * var(--float-amp, 10px))}67%{translate:calc(.9 * var(--float-amp, 10px)) calc(.5 * var(--float-amp, 10px))}83%{translate:calc(-.2 * var(--float-amp, 10px)) calc(.8 * var(--float-amp, 10px))}to{translate:0 0}}.animot-svg-element.icon-anim-draw path,.animot-svg-element.icon-anim-draw circle,.animot-svg-element.icon-anim-draw rect,.animot-svg-element.icon-anim-draw line,.animot-svg-element.icon-anim-draw polyline,.animot-svg-element.icon-anim-draw polygon,.animot-svg-element.icon-anim-draw ellipse{stroke-dashoffset:var(--path-len, 1000);animation:animot-svg-draw var(--icon-anim-duration, .8s) ease-out forwards}.animot-svg-element.icon-anim-undraw path,.animot-svg-element.icon-anim-undraw circle,.animot-svg-element.icon-anim-undraw rect,.animot-svg-element.icon-anim-undraw line,.animot-svg-element.icon-anim-undraw polyline,.animot-svg-element.icon-anim-undraw polygon,.animot-svg-element.icon-anim-undraw ellipse{stroke-dashoffset:0;animation:animot-svg-undraw var(--icon-anim-duration, .8s) ease-out forwards}.animot-svg-element.icon-anim-draw-undraw path,.animot-svg-element.icon-anim-draw-undraw circle,.animot-svg-element.icon-anim-draw-undraw rect,.animot-svg-element.icon-anim-draw-undraw line,.animot-svg-element.icon-anim-draw-undraw polyline,.animot-svg-element.icon-anim-draw-undraw polygon,.animot-svg-element.icon-anim-draw-undraw ellipse{stroke-dashoffset:var(--path-len, 1000);animation:animot-svg-draw-undraw var(--icon-anim-duration, .8s) ease-out forwards}.animot-svg-element.icon-anim-loop path,.animot-svg-element.icon-anim-loop circle,.animot-svg-element.icon-anim-loop rect,.animot-svg-element.icon-anim-loop line,.animot-svg-element.icon-anim-loop polyline,.animot-svg-element.icon-anim-loop polygon,.animot-svg-element.icon-anim-loop ellipse{animation-iteration-count:infinite!important}.animot-svg-element.icon-anim-reverse path,.animot-svg-element.icon-anim-reverse circle,.animot-svg-element.icon-anim-reverse rect,.animot-svg-element.icon-anim-reverse line,.animot-svg-element.icon-anim-reverse polyline,.animot-svg-element.icon-anim-reverse polygon,.animot-svg-element.icon-anim-reverse ellipse{animation-direction:reverse!important}@keyframes animot-svg-draw{to{stroke-dashoffset:0}}@keyframes animot-svg-undraw{0%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}@keyframes animot-svg-draw-undraw{0%{stroke-dashoffset:var(--path-len, 1000)}50%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}.animot-presenter.svelte-16ocdv9 *{margin:0;padding:0;box-sizing:border-box}.animot-presenter.svelte-16ocdv9{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden;background:transparent;line-height:normal;font-size:16px;font-weight:400;font-style:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;text-indent:0;text-align:left;color:inherit}.animot-canvas-wrapper.svelte-16ocdv9{display:flex;align-items:center;justify-content:center}.animot-canvas.svelte-16ocdv9{position:relative;overflow:hidden}.animot-element.svelte-16ocdv9{position:absolute;box-sizing:border-box;will-change:transform,opacity,left,top,width,height;isolation:isolate}.animot-element.floating.svelte-16ocdv9{animation-duration:var(--float-speed, 3s);animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-delay:var(--float-delay, 0s)}.animot-code-block.svelte-16ocdv9{width:100%;height:100%;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 8px 32px #0006;margin:0;box-sizing:border-box}.animot-code-block.transparent-bg.svelte-16ocdv9{background:transparent!important;box-shadow:none}.animot-code-block.transparent-bg.svelte-16ocdv9 .animot-code-header:where(.svelte-16ocdv9){background:transparent;border-bottom-color:#ffffff0f}.animot-code-header.svelte-16ocdv9{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#0003;border-bottom:1px solid rgba(255,255,255,.06);flex-shrink:0;min-height:40px}.animot-window-controls.svelte-16ocdv9{display:flex;gap:8px;align-items:center;flex-shrink:0}.macos.svelte-16ocdv9 .animot-control:where(.svelte-16ocdv9){width:12px;height:12px;border-radius:50%;display:block}.macos.svelte-16ocdv9 .animot-control.close:where(.svelte-16ocdv9){background:#ff5f57}.macos.svelte-16ocdv9 .animot-control.minimize:where(.svelte-16ocdv9){background:#febc2e}.macos.svelte-16ocdv9 .animot-control.maximize:where(.svelte-16ocdv9){background:#28c840}.windows.svelte-16ocdv9 .animot-window-controls:where(.svelte-16ocdv9){order:99;margin-left:auto;gap:0}.windows.svelte-16ocdv9 .animot-control:where(.svelte-16ocdv9){display:flex;align-items:center;justify-content:center;width:28px;height:24px;border-radius:4px;color:#ffffff73}.animot-filename-tab.svelte-16ocdv9{display:flex;align-items:center;gap:6px;background:#ffffff0f;border:1px solid rgba(255,255,255,.08);border-radius:6px;padding:4px 10px;max-width:220px;color:#fff6}.animot-file-icon.svelte-16ocdv9{flex-shrink:0}.animot-filename.svelte-16ocdv9{color:#ffffff8c;font-size:12px;line-height:18px}.animot-copy-code-btn.svelte-16ocdv9{display:flex;align-items:center;gap:5px;height:28px;padding:0 8px;margin-left:auto;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#fff6;cursor:pointer;opacity:0;transition:opacity .2s,background .15s,color .15s;flex-shrink:0;font-size:12px;font-family:inherit;white-space:nowrap}.animot-copy-code-btn.svelte-16ocdv9:hover{background:#ffffff1f;color:#fffc}.animot-copy-code-btn.svelte-16ocdv9 svg:where(.svelte-16ocdv9){width:14px;height:14px;flex-shrink:0}.animot-copy-code-btn.svelte-16ocdv9 .animot-check-icon:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.svelte-16ocdv9 .animot-copied-label:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-copy-icon:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-copy-label:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-check-icon:where(.svelte-16ocdv9){display:block;color:#4ade80}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-copied-label:where(.svelte-16ocdv9){display:inline;color:#4ade80}.animot-copy-code-btn.animot-floating.svelte-16ocdv9{position:absolute;top:8px;right:8px;z-index:2}.animot-code-block.svelte-16ocdv9:hover .animot-copy-code-btn:where(.svelte-16ocdv9){opacity:1}.animot-code-content.svelte-16ocdv9{flex:1;overflow:hidden;position:relative}.animot-highlighted-code.svelte-16ocdv9{width:100%;height:100%}.animot-code-content.svelte-16ocdv9 pre,.animot-highlighted-code.svelte-16ocdv9 pre{margin:0;padding:16px;background:transparent!important;line-height:1.6;font-size:inherit;overflow:visible}.animot-highlighted-code.svelte-16ocdv9 code{font-family:inherit;font-size:inherit;font-weight:inherit}.animot-highlighted-code.svelte-16ocdv9 .line-number{display:inline-block;width:2.5em;margin-right:1em;text-align:right;color:#6e7681;-webkit-user-select:none;user-select:none;opacity:.6}.animot-text-element.svelte-16ocdv9{width:100%;height:100%;display:flex;align-items:center;white-space:pre-wrap;word-wrap:break-word}.animot-typewriter-cursor.svelte-16ocdv9{animation:svelte-16ocdv9-animot-blink .7s infinite;font-weight:100}@keyframes svelte-16ocdv9-animot-blink{0%,50%{opacity:1}51%,to{opacity:0}}.animot-arrow-element.svelte-16ocdv9{width:100%;height:100%}.arrow-animate-draw.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9){stroke-dashoffset:var(--path-len, 1000);animation:svelte-16ocdv9-animot-arrow-draw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-undraw.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9){stroke-dashoffset:0;animation:svelte-16ocdv9-animot-arrow-undraw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-draw-undraw.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9){stroke-dashoffset:var(--path-len, 1000);animation:svelte-16ocdv9-animot-arrow-draw-undraw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-head-styled-draw.svelte-16ocdv9{opacity:0;animation:svelte-16ocdv9-animot-arrow-head-appear var(--arrow-anim-duration, .5s) ease-out forwards;animation-delay:calc(var(--arrow-anim-duration, .5s) * .7)}.arrow-animate-draw.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9){opacity:0;animation:svelte-16ocdv9-animot-arrow-head-appear var(--arrow-anim-duration, .5s) ease-out forwards;animation-delay:calc(var(--arrow-anim-duration, .5s) * .7)}.arrow-animate-undraw.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9),.arrow-head-undraw.svelte-16ocdv9{opacity:1;animation:svelte-16ocdv9-animot-arrow-head-disappear var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-draw-undraw.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9),.arrow-head-draw-undraw.svelte-16ocdv9{opacity:0;animation:svelte-16ocdv9-animot-arrow-head-draw-undraw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-grow.svelte-16ocdv9{transform-origin:left center;animation:svelte-16ocdv9-animot-arrow-grow var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-anim-loop.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9),.arrow-anim-loop.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9){animation-iteration-count:infinite!important}.arrow-anim-reverse.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9),.arrow-anim-reverse.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9){animation-direction:reverse!important}@keyframes svelte-16ocdv9-animot-arrow-draw{to{stroke-dashoffset:0}}@keyframes svelte-16ocdv9-animot-arrow-undraw{0%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}@keyframes svelte-16ocdv9-animot-arrow-draw-undraw{0%{stroke-dashoffset:var(--path-len, 1000)}50%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}@keyframes svelte-16ocdv9-animot-arrow-head-appear{0%{opacity:0}to{opacity:1}}@keyframes svelte-16ocdv9-animot-arrow-head-disappear{0%{opacity:1}70%{opacity:1}to{opacity:0}}@keyframes svelte-16ocdv9-animot-arrow-head-draw-undraw{0%{opacity:0}35%{opacity:1}65%{opacity:1}to{opacity:0}}@keyframes svelte-16ocdv9-animot-arrow-grow{0%{transform:scaleX(0);opacity:0}to{transform:scaleX(1);opacity:1}}.animot-image-element.svelte-16ocdv9{width:100%;height:100%;display:block}.animot-video-element.svelte-16ocdv9{width:100%;height:100%;display:block;background:#000}.animot-video-element.animot-embed-frame.svelte-16ocdv9{border:0;background:transparent}.animot-video-element.animot-embed-wrap.svelte-16ocdv9{overflow:hidden;background:#000}.animot-cinema-camera.svelte-16ocdv9{position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:0 0}.animot-cinema-camera.active.svelte-16ocdv9{transition:transform var(--cinema-transition-duration, .8s) cubic-bezier(.65,0,.35,1)}.animot-cinema-camera.active.svelte-16ocdv9 .animot-element:where(.svelte-16ocdv9){transition:translate var(--cinema-transition-duration, .8s) cubic-bezier(.65,0,.35,1)}.animot-shape-element.svelte-16ocdv9{width:100%;height:100%;display:block;overflow:visible}.animot-canvas.svelte-16ocdv9{--transition-duration: .5s;transition:transform calc(var(--transition-duration) * .4) ease,opacity calc(var(--transition-duration) * .4) ease}.animot-canvas.transition-fade-out.svelte-16ocdv9{opacity:0}.animot-canvas.transition-fade-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-fadeIn calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-left-out.forward.svelte-16ocdv9{transform:translate(-100%);opacity:0}.animot-canvas.transition-slide-left-in.forward.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromRight calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-left-out.backward.svelte-16ocdv9{transform:translate(100%);opacity:0}.animot-canvas.transition-slide-left-in.backward.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromLeft calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-right-out.forward.svelte-16ocdv9{transform:translate(100%);opacity:0}.animot-canvas.transition-slide-right-in.forward.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromLeft calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-up-out.svelte-16ocdv9{transform:translateY(-100%);opacity:0}.animot-canvas.transition-slide-up-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromBottom calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-down-out.svelte-16ocdv9{transform:translateY(100%);opacity:0}.animot-canvas.transition-slide-down-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromTop calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-zoom-in-out.svelte-16ocdv9{transform:scale(.5);opacity:0}.animot-canvas.transition-zoom-in-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-zoomIn calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-zoom-out-out.svelte-16ocdv9{transform:scale(1.5);opacity:0}.animot-canvas.transition-zoom-out-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-zoomOut calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-flip-out.svelte-16ocdv9{transform:perspective(1000px) rotateY(90deg);opacity:0}.animot-canvas.transition-flip-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-flipIn calc(var(--transition-duration) * .6) ease forwards}@keyframes svelte-16ocdv9-animot-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromRight{0%{transform:translate(100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromLeft{0%{transform:translate(-100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromBottom{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromTop{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes svelte-16ocdv9-animot-zoomIn{0%{transform:scale(.5);opacity:0}to{transform:scale(1);opacity:1}}@keyframes svelte-16ocdv9-animot-zoomOut{0%{transform:scale(1.5);opacity:0}to{transform:scale(1);opacity:1}}@keyframes svelte-16ocdv9-animot-flipIn{0%{transform:perspective(1000px) rotateY(-90deg);opacity:0}to{transform:perspective(1000px) rotateY(0);opacity:1}}.animot-canvas.transition-flip-x-out.svelte-16ocdv9{transform:perspective(1000px) rotateX(90deg);opacity:0}.animot-canvas.transition-flip-x-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-flipXIn calc(var(--transition-duration) * .6) ease forwards}@keyframes svelte-16ocdv9-animot-flipXIn{0%{transform:perspective(1000px) rotateX(-90deg);opacity:0}to{transform:perspective(1000px) rotateX(0);opacity:1}}.animot-canvas.transition-flip-y-out.svelte-16ocdv9{transform:perspective(1000px) rotateY(90deg);opacity:0}.animot-canvas.transition-flip-y-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-flipYIn calc(var(--transition-duration) * .6) ease forwards}@keyframes svelte-16ocdv9-animot-flipYIn{0%{transform:perspective(1000px) rotateY(-90deg);opacity:0}to{transform:perspective(1000px) rotateY(0);opacity:1}}.animot-svg-element.svelte-16ocdv9{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.animot-svg-element.svelte-16ocdv9 svg{width:100%;height:100%}.animot-controls.svelte-16ocdv9{position:absolute;bottom:12px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:8px;padding:8px 16px;background:#000000b3;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:10px;opacity:0;transition:opacity .3s ease .15s;z-index:100}.animot-presenter.svelte-16ocdv9:hover .animot-controls:where(.svelte-16ocdv9),.animot-menu-visible.svelte-16ocdv9 .animot-controls:where(.svelte-16ocdv9){opacity:1;transition-delay:0s}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9){display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;border:none;cursor:pointer;background:#ffffff1a;color:#fff;transition:background .2s}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9):hover:not(:disabled){background:#fff3}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9):disabled{opacity:.3;cursor:not-allowed}.animot-controls.svelte-16ocdv9 button.active:where(.svelte-16ocdv9){background:#6366f199}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9) svg:where(.svelte-16ocdv9){width:16px;height:16px}.animot-slide-indicator.svelte-16ocdv9{font-size:12px;color:#fff;min-width:50px;text-align:center;font-family:system-ui,sans-serif}.animot-arrow.svelte-16ocdv9{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border-radius:50%;border:none;cursor:pointer;background:#00000080;color:#fff;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s .15s;z-index:100;padding:0;margin:0}.animot-presenter.svelte-16ocdv9:hover .animot-arrow:where(.svelte-16ocdv9){opacity:1;transition-delay:0s}.animot-presenter.svelte-16ocdv9:hover .animot-arrow:where(.svelte-16ocdv9):disabled{opacity:.3;cursor:not-allowed}.animot-arrow.svelte-16ocdv9:hover:not(:disabled){background:#000000b3}.animot-arrow.svelte-16ocdv9 svg:where(.svelte-16ocdv9){width:20px;height:20px}.animot-arrow-left.svelte-16ocdv9{left:8px}.animot-arrow-right.svelte-16ocdv9{right:8px}.animot-progress-bar.svelte-16ocdv9{position:absolute;bottom:0;left:0;right:0;height:3px;background:#ffffff1a;z-index:100;opacity:0;transition:opacity .3s .15s}.animot-presenter.svelte-16ocdv9:hover .animot-progress-bar:where(.svelte-16ocdv9){opacity:1;transition-delay:0s}.animot-progress-fill.svelte-16ocdv9{height:100%;background:linear-gradient(135deg,#7c3aed,#ec4899);transition:width .6s ease}.animot-loading.svelte-16ocdv9{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.animot-spinner.svelte-16ocdv9{width:32px;height:32px;border:3px solid rgba(255,255,255,.2);border-top-color:#7c3aed;border-radius:50%;animation:svelte-16ocdv9-animot-spin .8s linear infinite}@keyframes svelte-16ocdv9-animot-spin{to{transform:rotate(360deg)}}.animot-error.svelte-16ocdv9{color:#ef4444;padding:20px;text-align:center;font-family:system-ui,sans-serif}
|
|
1
|
+
.code-morph.svelte-1hmk0l{width:100%;height:100%;margin:0;padding:0;background:transparent;font-family:var(--font-mono, "JetBrains Mono", monospace);font-size:inherit;line-height:1.6;white-space:pre-wrap;word-wrap:break-word;color:#e6edf3;box-sizing:border-box;overflow:visible}.code-morph.svelte-1hmk0l pre{margin:0;padding:16px;background:transparent!important;font-family:var(--font-mono);font-size:inherit;line-height:1.6;overflow:visible}.code-morph.svelte-1hmk0l code{font-family:inherit;font-size:inherit;font-weight:inherit}.code-morph.svelte-1hmk0l .line-number{display:inline-block;width:2.5em;margin-right:1em;text-align:right;color:#6e7681;-webkit-user-select:none;user-select:none;opacity:.6}.code-morph.svelte-1hmk0l .word-highlight{background:var(--highlight-color, #facc15);color:#000;border-radius:3px;padding:1px 3px;margin:0 -3px;-webkit-box-decoration-break:clone;box-decoration-break:clone;animation:svelte-1hmk0l-fadeHighlight var(--duration, 1s) ease-out forwards}@keyframes svelte-1hmk0l-fadeHighlight{0%{background:var(--highlight-color, #facc15);color:#000}70%{background:var(--highlight-color, #facc15);color:#000}to{background:transparent;color:inherit}}.counter.svelte-1er5jjj{width:100%;height:100%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;overflow:hidden;white-space:nowrap}.animot-chart.svelte-1mq2d7j{width:100%;height:100%;display:flex;flex-direction:column;box-sizing:border-box;overflow:hidden}.animot-chart-title.svelte-1mq2d7j{font-weight:600;text-align:center;margin-bottom:8px}.animot-chart-content.svelte-1mq2d7j{flex:1;min-height:0;display:flex;flex-direction:column}.animot-chart-content.svelte-1mq2d7j svg:where(.svelte-1mq2d7j){width:100%;flex:1;min-height:0}.animot-bar-chart.svelte-1mq2d7j,.animot-line-chart.svelte-1mq2d7j{overflow:visible}.animot-series-legend.svelte-1mq2d7j{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;padding:6px 0 0;font-size:.85em}.animot-legend-item.svelte-1mq2d7j{display:inline-flex;align-items:center;gap:5px}.animot-swatch.svelte-1mq2d7j{width:10px;height:10px;border-radius:2px;display:inline-block}.progress-element.svelte-10tny4e{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;position:relative;box-sizing:border-box}.bar-track.svelte-10tny4e,.ring-svg.svelte-10tny4e{flex-shrink:0}.progress-element.ring.svelte-10tny4e .ring-svg:where(.svelte-10tny4e){width:100%;height:100%;min-height:0;min-width:0}.bar-track.svelte-10tny4e{position:relative;overflow:hidden}.bar-fill.svelte-10tny4e{position:absolute;display:flex;align-items:center;justify-content:center;transition:width 0s,height 0s}.bar-stripe-clip.svelte-10tny4e{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden}.bar-stripe-tape.svelte-10tny4e{position:absolute;top:0;left:0;width:calc(100% + var(--stripe-cycle));height:100%;mask-image:var(--stripe-mask);-webkit-mask-image:var(--stripe-mask);mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat;animation:svelte-10tny4e-progress-stripe-x var(--stripe-speed) linear infinite;animation-direction:var(--stripe-direction);will-change:transform}.bar-stripe-tape.vertical.svelte-10tny4e{width:100%;height:calc(100% + var(--stripe-cycle));animation-name:svelte-10tny4e-progress-stripe-y}@keyframes svelte-10tny4e-progress-stripe-x{0%{transform:translate(0)}to{transform:translate(calc(-1 * var(--stripe-cycle)))}}@keyframes svelte-10tny4e-progress-stripe-y{0%{transform:translateY(0)}to{transform:translateY(calc(-1 * var(--stripe-cycle)))}}.ring-svg.svelte-10tny4e{width:100%;height:100%}.ring-spin.svelte-10tny4e{animation:svelte-10tny4e-progress-ring-spin 1.4s linear infinite;transform-origin:50% 50%}@keyframes svelte-10tny4e-progress-ring-spin{to{transform:rotate(360deg)}}.label.svelte-10tny4e{text-align:center;white-space:nowrap;pointer-events:none}.label.center.svelte-10tny4e{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.label.inside.svelte-10tny4e{padding:0 8px;flex-shrink:0}.label.inside-vertical.svelte-10tny4e{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-orientation:mixed;writing-mode:horizontal-tb}.animot-container-element.svelte-e5oeuv{box-sizing:border-box;pointer-events:none}.icon-element.svelte-2ld65o{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.icon-element.svelte-2ld65o svg{width:100%;height:100%}.flow-markers.svelte-15cxp1m{pointer-events:none}.embed-player.svelte-1u59mvz{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.embed-frame.svelte-1u59mvz{width:100%;height:100%;display:block;border:0}.embed-frame.passthrough.svelte-1u59mvz{pointer-events:none}.custom-controls.svelte-1u59mvz{position:absolute;left:8px;right:8px;bottom:8px;display:flex;align-items:center;gap:10px;padding:6px 10px;background:#0009;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);border-radius:8px;opacity:0;transition:opacity .2s}.embed-player.svelte-1u59mvz:hover .custom-controls:where(.svelte-1u59mvz),.custom-controls.svelte-1u59mvz:focus-within{opacity:1}.ctrl-btn.svelte-1u59mvz{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;background:transparent;border:0;border-radius:4px;color:#fff;cursor:pointer}.ctrl-btn.svelte-1u59mvz:hover{background:#ffffff26}.ctrl-btn.svelte-1u59mvz svg:where(.svelte-1u59mvz){width:16px;height:16px}.scrub.svelte-1u59mvz{flex:1;accent-color:#6366f1}.time.svelte-1u59mvz{font-size:11px;color:#ffffffd9;font-variant-numeric:tabular-nums;min-width:80px;text-align:right}@keyframes float-vertical{0%,to{translate:0 0}50%{translate:0 calc(-1 * var(--float-amp, 10px))}}@keyframes float-horizontal{0%,to{translate:0 0}50%{translate:var(--float-amp, 10px) 0}}@keyframes float-both-0{0%{translate:0 0}15%{translate:calc(.8 * var(--float-amp, 10px)) calc(-.6 * var(--float-amp, 10px))}35%{translate:calc(-.4 * var(--float-amp, 10px)) calc(-1 * var(--float-amp, 10px))}55%{translate:calc(-.9 * var(--float-amp, 10px)) calc(.3 * var(--float-amp, 10px))}75%{translate:calc(.3 * var(--float-amp, 10px)) calc(.7 * var(--float-amp, 10px))}to{translate:0 0}}@keyframes float-both-1{0%{translate:0 0}20%{translate:calc(-.7 * var(--float-amp, 10px)) calc(-.8 * var(--float-amp, 10px))}40%{translate:calc(.5 * var(--float-amp, 10px)) calc(-.3 * var(--float-amp, 10px))}60%{translate:calc(.9 * var(--float-amp, 10px)) calc(.6 * var(--float-amp, 10px))}80%{translate:calc(-.4 * var(--float-amp, 10px)) calc(.9 * var(--float-amp, 10px))}to{translate:0 0}}@keyframes float-both-2{0%{translate:0 0}12%{translate:calc(.6 * var(--float-amp, 10px)) calc(.5 * var(--float-amp, 10px))}30%{translate:calc(1 * var(--float-amp, 10px)) calc(-.4 * var(--float-amp, 10px))}50%{translate:calc(-.3 * var(--float-amp, 10px)) calc(-.9 * var(--float-amp, 10px))}70%{translate:calc(-.8 * var(--float-amp, 10px)) calc(.2 * var(--float-amp, 10px))}88%{translate:calc(.2 * var(--float-amp, 10px)) calc(.8 * var(--float-amp, 10px))}to{translate:0 0}}@keyframes float-both-3{0%{translate:0 0}17%{translate:calc(-.9 * var(--float-amp, 10px)) calc(.4 * var(--float-amp, 10px))}33%{translate:calc(-.5 * var(--float-amp, 10px)) calc(-.7 * var(--float-amp, 10px))}50%{translate:calc(.7 * var(--float-amp, 10px)) calc(-.9 * var(--float-amp, 10px))}67%{translate:calc(.9 * var(--float-amp, 10px)) calc(.5 * var(--float-amp, 10px))}83%{translate:calc(-.2 * var(--float-amp, 10px)) calc(.8 * var(--float-amp, 10px))}to{translate:0 0}}.animot-svg-element.icon-anim-draw path,.animot-svg-element.icon-anim-draw circle,.animot-svg-element.icon-anim-draw rect,.animot-svg-element.icon-anim-draw line,.animot-svg-element.icon-anim-draw polyline,.animot-svg-element.icon-anim-draw polygon,.animot-svg-element.icon-anim-draw ellipse{stroke-dashoffset:var(--path-len, 1000);animation:animot-svg-draw var(--icon-anim-duration, .8s) ease-out forwards}.animot-svg-element.icon-anim-undraw path,.animot-svg-element.icon-anim-undraw circle,.animot-svg-element.icon-anim-undraw rect,.animot-svg-element.icon-anim-undraw line,.animot-svg-element.icon-anim-undraw polyline,.animot-svg-element.icon-anim-undraw polygon,.animot-svg-element.icon-anim-undraw ellipse{stroke-dashoffset:0;animation:animot-svg-undraw var(--icon-anim-duration, .8s) ease-out forwards}.animot-svg-element.icon-anim-draw-undraw path,.animot-svg-element.icon-anim-draw-undraw circle,.animot-svg-element.icon-anim-draw-undraw rect,.animot-svg-element.icon-anim-draw-undraw line,.animot-svg-element.icon-anim-draw-undraw polyline,.animot-svg-element.icon-anim-draw-undraw polygon,.animot-svg-element.icon-anim-draw-undraw ellipse{stroke-dashoffset:var(--path-len, 1000);animation:animot-svg-draw-undraw var(--icon-anim-duration, .8s) ease-out forwards}.animot-svg-element.icon-anim-loop path,.animot-svg-element.icon-anim-loop circle,.animot-svg-element.icon-anim-loop rect,.animot-svg-element.icon-anim-loop line,.animot-svg-element.icon-anim-loop polyline,.animot-svg-element.icon-anim-loop polygon,.animot-svg-element.icon-anim-loop ellipse{animation-iteration-count:infinite!important}.animot-svg-element.icon-anim-reverse path,.animot-svg-element.icon-anim-reverse circle,.animot-svg-element.icon-anim-reverse rect,.animot-svg-element.icon-anim-reverse line,.animot-svg-element.icon-anim-reverse polyline,.animot-svg-element.icon-anim-reverse polygon,.animot-svg-element.icon-anim-reverse ellipse{animation-direction:reverse!important}@keyframes animot-svg-draw{to{stroke-dashoffset:0}}@keyframes animot-svg-undraw{0%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}@keyframes animot-svg-draw-undraw{0%{stroke-dashoffset:var(--path-len, 1000)}50%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}.animot-presenter.svelte-16ocdv9 *{margin:0;padding:0;box-sizing:border-box}.animot-presenter.svelte-16ocdv9{position:relative;width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden;background:transparent;line-height:normal;font-size:16px;font-weight:400;font-style:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;text-indent:0;text-align:left;color:inherit}.animot-canvas-wrapper.svelte-16ocdv9{display:flex;align-items:center;justify-content:center}.animot-canvas.svelte-16ocdv9{position:relative;overflow:hidden}.animot-element.svelte-16ocdv9{position:absolute;box-sizing:border-box;will-change:transform,opacity,left,top,width,height;isolation:isolate}.animot-element.floating.svelte-16ocdv9{animation-duration:var(--float-speed, 3s);animation-timing-function:ease-in-out;animation-iteration-count:infinite;animation-delay:var(--float-delay, 0s)}.animot-code-block.svelte-16ocdv9{width:100%;height:100%;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 8px 32px #0006;margin:0;box-sizing:border-box}.animot-code-block.transparent-bg.svelte-16ocdv9{background:transparent!important;box-shadow:none}.animot-code-block.transparent-bg.svelte-16ocdv9 .animot-code-header:where(.svelte-16ocdv9){background:transparent;border-bottom-color:#ffffff0f}.animot-code-header.svelte-16ocdv9{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#0003;border-bottom:1px solid rgba(255,255,255,.06);flex-shrink:0;min-height:40px}.animot-window-controls.svelte-16ocdv9{display:flex;gap:8px;align-items:center;flex-shrink:0}.macos.svelte-16ocdv9 .animot-control:where(.svelte-16ocdv9){width:12px;height:12px;border-radius:50%;display:block}.macos.svelte-16ocdv9 .animot-control.close:where(.svelte-16ocdv9){background:#ff5f57}.macos.svelte-16ocdv9 .animot-control.minimize:where(.svelte-16ocdv9){background:#febc2e}.macos.svelte-16ocdv9 .animot-control.maximize:where(.svelte-16ocdv9){background:#28c840}.windows.svelte-16ocdv9 .animot-window-controls:where(.svelte-16ocdv9){order:99;margin-left:auto;gap:0}.windows.svelte-16ocdv9 .animot-control:where(.svelte-16ocdv9){display:flex;align-items:center;justify-content:center;width:28px;height:24px;border-radius:4px;color:#ffffff73}.animot-filename-tab.svelte-16ocdv9{display:flex;align-items:center;gap:6px;background:#ffffff0f;border:1px solid rgba(255,255,255,.08);border-radius:6px;padding:4px 10px;max-width:220px;color:#fff6}.animot-file-icon.svelte-16ocdv9{flex-shrink:0}.animot-filename.svelte-16ocdv9{color:#ffffff8c;font-size:12px;line-height:18px}.animot-copy-code-btn.svelte-16ocdv9{display:flex;align-items:center;gap:5px;height:28px;padding:0 8px;margin-left:auto;background:#ffffff0f;border:1px solid rgba(255,255,255,.1);border-radius:6px;color:#fff6;cursor:pointer;opacity:0;transition:opacity .2s,background .15s,color .15s;flex-shrink:0;font-size:12px;font-family:inherit;white-space:nowrap}.animot-copy-code-btn.svelte-16ocdv9:hover{background:#ffffff1f;color:#fffc}.animot-copy-code-btn.svelte-16ocdv9 svg:where(.svelte-16ocdv9){width:14px;height:14px;flex-shrink:0}.animot-copy-code-btn.svelte-16ocdv9 .animot-check-icon:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.svelte-16ocdv9 .animot-copied-label:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-copy-icon:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-copy-label:where(.svelte-16ocdv9){display:none}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-check-icon:where(.svelte-16ocdv9){display:block;color:#4ade80}.animot-copy-code-btn.copied.svelte-16ocdv9 .animot-copied-label:where(.svelte-16ocdv9){display:inline;color:#4ade80}.animot-copy-code-btn.animot-floating.svelte-16ocdv9{position:absolute;top:8px;right:8px;z-index:2}.animot-code-block.svelte-16ocdv9:hover .animot-copy-code-btn:where(.svelte-16ocdv9){opacity:1}.animot-code-content.svelte-16ocdv9{flex:1;overflow:hidden;position:relative}.animot-highlighted-code.svelte-16ocdv9{width:100%;height:100%}.animot-code-content.svelte-16ocdv9 pre,.animot-highlighted-code.svelte-16ocdv9 pre{margin:0;padding:16px;background:transparent!important;line-height:1.6;font-size:inherit;overflow:visible}.animot-highlighted-code.svelte-16ocdv9 code{font-family:inherit;font-size:inherit;font-weight:inherit}.animot-highlighted-code.svelte-16ocdv9 .line-number{display:inline-block;width:2.5em;margin-right:1em;text-align:right;color:#6e7681;-webkit-user-select:none;user-select:none;opacity:.6}.animot-text-element.svelte-16ocdv9{width:100%;height:100%;display:flex;align-items:center;white-space:pre-wrap;word-wrap:break-word}.animot-typewriter-cursor.svelte-16ocdv9{animation:svelte-16ocdv9-animot-blink .7s infinite;font-weight:100}@keyframes svelte-16ocdv9-animot-blink{0%,50%{opacity:1}51%,to{opacity:0}}.animot-arrow-element.svelte-16ocdv9{width:100%;height:100%}.arrow-animate-draw.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9){stroke-dashoffset:var(--path-len, 1000);animation:svelte-16ocdv9-animot-arrow-draw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-undraw.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9){stroke-dashoffset:0;animation:svelte-16ocdv9-animot-arrow-undraw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-draw-undraw.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9){stroke-dashoffset:var(--path-len, 1000);animation:svelte-16ocdv9-animot-arrow-draw-undraw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-head-styled-draw.svelte-16ocdv9{opacity:0;animation:svelte-16ocdv9-animot-arrow-head-appear var(--arrow-anim-duration, .5s) ease-out forwards;animation-delay:calc(var(--arrow-anim-duration, .5s) * .7)}.arrow-animate-draw.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9){opacity:0;animation:svelte-16ocdv9-animot-arrow-head-appear var(--arrow-anim-duration, .5s) ease-out forwards;animation-delay:calc(var(--arrow-anim-duration, .5s) * .7)}.arrow-animate-undraw.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9),.arrow-head-undraw.svelte-16ocdv9{opacity:1;animation:svelte-16ocdv9-animot-arrow-head-disappear var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-draw-undraw.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9),.arrow-head-draw-undraw.svelte-16ocdv9{opacity:0;animation:svelte-16ocdv9-animot-arrow-head-draw-undraw var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-animate-grow.svelte-16ocdv9{transform-origin:left center;animation:svelte-16ocdv9-animot-arrow-grow var(--arrow-anim-duration, .5s) ease-out forwards}.arrow-anim-loop.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9),.arrow-anim-loop.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9){animation-iteration-count:infinite!important}.arrow-anim-reverse.svelte-16ocdv9 .arrow-path:where(.svelte-16ocdv9),.arrow-anim-reverse.svelte-16ocdv9 .arrow-head:where(.svelte-16ocdv9){animation-direction:reverse!important}@keyframes svelte-16ocdv9-animot-arrow-draw{to{stroke-dashoffset:0}}@keyframes svelte-16ocdv9-animot-arrow-undraw{0%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}@keyframes svelte-16ocdv9-animot-arrow-draw-undraw{0%{stroke-dashoffset:var(--path-len, 1000)}50%{stroke-dashoffset:0}to{stroke-dashoffset:var(--path-len, 1000)}}@keyframes svelte-16ocdv9-animot-arrow-head-appear{0%{opacity:0}to{opacity:1}}@keyframes svelte-16ocdv9-animot-arrow-head-disappear{0%{opacity:1}70%{opacity:1}to{opacity:0}}@keyframes svelte-16ocdv9-animot-arrow-head-draw-undraw{0%{opacity:0}35%{opacity:1}65%{opacity:1}to{opacity:0}}@keyframes svelte-16ocdv9-animot-arrow-grow{0%{transform:scaleX(0);opacity:0}to{transform:scaleX(1);opacity:1}}.animot-image-element.svelte-16ocdv9{width:100%;height:100%;display:block}.animot-video-element.svelte-16ocdv9{width:100%;height:100%;display:block;background:#000}.animot-video-element.animot-embed-frame.svelte-16ocdv9{border:0;background:transparent}.animot-video-element.animot-embed-wrap.svelte-16ocdv9{overflow:hidden;background:#000}.animot-cinema-camera.svelte-16ocdv9{position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:0 0}.animot-cinema-camera.active.svelte-16ocdv9{transition:transform var(--cinema-transition-duration, .8s) cubic-bezier(.65,0,.35,1)}.animot-cinema-camera.active.svelte-16ocdv9 .animot-element:where(.svelte-16ocdv9){transition:translate var(--cinema-transition-duration, .8s) cubic-bezier(.65,0,.35,1)}.animot-shape-element.svelte-16ocdv9{width:100%;height:100%;display:block;overflow:visible}.animot-canvas.svelte-16ocdv9{--transition-duration: .5s;transition:transform calc(var(--transition-duration) * .4) ease,opacity calc(var(--transition-duration) * .4) ease}.animot-canvas.transition-fade-out.svelte-16ocdv9{opacity:0}.animot-canvas.transition-fade-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-fadeIn calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-left-out.forward.svelte-16ocdv9{transform:translate(-100%);opacity:0}.animot-canvas.transition-slide-left-in.forward.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromRight calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-left-out.backward.svelte-16ocdv9{transform:translate(100%);opacity:0}.animot-canvas.transition-slide-left-in.backward.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromLeft calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-right-out.forward.svelte-16ocdv9{transform:translate(100%);opacity:0}.animot-canvas.transition-slide-right-in.forward.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromLeft calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-up-out.svelte-16ocdv9{transform:translateY(-100%);opacity:0}.animot-canvas.transition-slide-up-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromBottom calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-slide-down-out.svelte-16ocdv9{transform:translateY(100%);opacity:0}.animot-canvas.transition-slide-down-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-slideInFromTop calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-zoom-in-out.svelte-16ocdv9{transform:scale(.5);opacity:0}.animot-canvas.transition-zoom-in-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-zoomIn calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-zoom-out-out.svelte-16ocdv9{transform:scale(1.5);opacity:0}.animot-canvas.transition-zoom-out-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-zoomOut calc(var(--transition-duration) * .6) ease forwards}.animot-canvas.transition-flip-out.svelte-16ocdv9{transform:perspective(1000px) rotateY(90deg);opacity:0}.animot-canvas.transition-flip-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-flipIn calc(var(--transition-duration) * .6) ease forwards}@keyframes svelte-16ocdv9-animot-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromRight{0%{transform:translate(100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromLeft{0%{transform:translate(-100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromBottom{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes svelte-16ocdv9-animot-slideInFromTop{0%{transform:translateY(-100%);opacity:0}to{transform:translateY(0);opacity:1}}@keyframes svelte-16ocdv9-animot-zoomIn{0%{transform:scale(.5);opacity:0}to{transform:scale(1);opacity:1}}@keyframes svelte-16ocdv9-animot-zoomOut{0%{transform:scale(1.5);opacity:0}to{transform:scale(1);opacity:1}}@keyframes svelte-16ocdv9-animot-flipIn{0%{transform:perspective(1000px) rotateY(-90deg);opacity:0}to{transform:perspective(1000px) rotateY(0);opacity:1}}.animot-canvas.transition-flip-x-out.svelte-16ocdv9{transform:perspective(1000px) rotateX(90deg);opacity:0}.animot-canvas.transition-flip-x-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-flipXIn calc(var(--transition-duration) * .6) ease forwards}@keyframes svelte-16ocdv9-animot-flipXIn{0%{transform:perspective(1000px) rotateX(-90deg);opacity:0}to{transform:perspective(1000px) rotateX(0);opacity:1}}.animot-canvas.transition-flip-y-out.svelte-16ocdv9{transform:perspective(1000px) rotateY(90deg);opacity:0}.animot-canvas.transition-flip-y-in.svelte-16ocdv9{animation:svelte-16ocdv9-animot-flipYIn calc(var(--transition-duration) * .6) ease forwards}@keyframes svelte-16ocdv9-animot-flipYIn{0%{transform:perspective(1000px) rotateY(-90deg);opacity:0}to{transform:perspective(1000px) rotateY(0);opacity:1}}.animot-svg-element.svelte-16ocdv9{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.animot-svg-element.svelte-16ocdv9 svg{width:100%;height:100%}.animot-controls.svelte-16ocdv9{position:absolute;bottom:12px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:8px;padding:8px 16px;background:#000000b3;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:10px;opacity:0;transition:opacity .3s ease .15s;z-index:100}.animot-presenter.svelte-16ocdv9:hover .animot-controls:where(.svelte-16ocdv9),.animot-menu-visible.svelte-16ocdv9 .animot-controls:where(.svelte-16ocdv9){opacity:1;transition-delay:0s}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9){display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;border:none;cursor:pointer;background:#ffffff1a;color:#fff;transition:background .2s}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9):hover:not(:disabled){background:#fff3}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9):disabled{opacity:.3;cursor:not-allowed}.animot-controls.svelte-16ocdv9 button.active:where(.svelte-16ocdv9){background:#6366f199}.animot-controls.svelte-16ocdv9 button:where(.svelte-16ocdv9) svg:where(.svelte-16ocdv9){width:16px;height:16px}.animot-slide-indicator.svelte-16ocdv9{font-size:12px;color:#fff;min-width:50px;text-align:center;font-family:system-ui,sans-serif}.animot-arrow.svelte-16ocdv9{position:absolute;top:50%;transform:translateY(-50%);width:40px;height:40px;border-radius:50%;border:none;cursor:pointer;background:#00000080;color:#fff;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s .15s;z-index:100;padding:0;margin:0}.animot-presenter.svelte-16ocdv9:hover .animot-arrow:where(.svelte-16ocdv9){opacity:1;transition-delay:0s}.animot-presenter.svelte-16ocdv9:hover .animot-arrow:where(.svelte-16ocdv9):disabled{opacity:.3;cursor:not-allowed}.animot-arrow.svelte-16ocdv9:hover:not(:disabled){background:#000000b3}.animot-arrow.svelte-16ocdv9 svg:where(.svelte-16ocdv9){width:20px;height:20px}.animot-arrow-left.svelte-16ocdv9{left:8px}.animot-arrow-right.svelte-16ocdv9{right:8px}.animot-progress-bar.svelte-16ocdv9{position:absolute;bottom:0;left:0;right:0;height:3px;background:#ffffff1a;z-index:100;opacity:0;transition:opacity .3s .15s}.animot-presenter.svelte-16ocdv9:hover .animot-progress-bar:where(.svelte-16ocdv9){opacity:1;transition-delay:0s}.animot-progress-fill.svelte-16ocdv9{height:100%;background:linear-gradient(135deg,#7c3aed,#ec4899);transition:width .6s ease}.animot-loading.svelte-16ocdv9{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.animot-spinner.svelte-16ocdv9{width:32px;height:32px;border:3px solid rgba(255,255,255,.2);border-top-color:#7c3aed;border-radius:50%;animation:svelte-16ocdv9-animot-spin .8s linear infinite}@keyframes svelte-16ocdv9-animot-spin{to{transform:rotate(360deg)}}.animot-error.svelte-16ocdv9{color:#ef4444;padding:20px;text-align:center;font-family:system-ui,sans-serif}
|