funnel-gfx-wc 0.1.83 → 0.1.85

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.
@@ -335,7 +335,7 @@ const actions = {
335
335
  };
336
336
 
337
337
  // WARNING: generated file...
338
- const TW_VERSION = '4.1.11';
338
+ const TW_VERSION = '4.1.12';
339
339
 
340
340
  const ColorPicker = props => {
341
341
  const { actions, state } = props;
@@ -428,14 +428,14 @@ const DataValues = props => {
428
428
 
429
429
  /**
430
430
  * anime.js - ESM
431
- * @version v4.1.2
431
+ * @version v4.1.3
432
432
  * @author Julian Garnier
433
433
  * @license MIT
434
434
  * @copyright (c) 2025 Julian Garnier
435
435
  * @see https://animejs.com
436
436
  */
437
437
 
438
- // Global types ///////////////////////////////////////////////////////////////
438
+ // Global types ////////////////////////////////////////////////////////////////
439
439
 
440
440
  /**
441
441
  * @typedef {Object} DefaultsParams
@@ -466,17 +466,18 @@ const DataValues = props => {
466
466
  /** @typedef {JSAnimation|Timeline} Renderable */
467
467
  /** @typedef {Timer|Renderable} Tickable */
468
468
  /** @typedef {Timer&JSAnimation&Timeline} CallbackArgument */
469
- /** @typedef {Animatable|Tickable|Draggable|ScrollObserver|TextSplitter|Scope} Revertible */
469
+ /** @typedef {Animatable|Tickable|WAAPIAnimation|Draggable|ScrollObserver|TextSplitter|Scope} Revertible */
470
470
 
471
- // Stagger types //////////////////////////////////////////////////////////////
471
+ // Stagger types ///////////////////////////////////////////////////////////////
472
472
 
473
473
  /**
474
+ * @template T
474
475
  * @callback StaggerFunction
475
476
  * @param {Target} [target]
476
477
  * @param {Number} [index]
477
478
  * @param {Number} [length]
478
479
  * @param {Timeline} [tl]
479
- * @return {Number|String}
480
+ * @return {T}
480
481
  */
481
482
 
482
483
  /**
@@ -486,13 +487,13 @@ const DataValues = props => {
486
487
  * @property {Boolean} [reversed]
487
488
  * @property {Array.<Number>} [grid]
488
489
  * @property {('x'|'y')} [axis]
489
- * @property {String|StaggerFunction} [use]
490
+ * @property {String|((target: Target, i: Number, length: Number) => Number)} [use]
490
491
  * @property {Number} [total]
491
492
  * @property {EasingParam} [ease]
492
493
  * @property {TweenModifier} [modifier]
493
494
  */
494
495
 
495
- // Eases types ////////////////////////////////////////////////////////////////
496
+ // Eases types /////////////////////////////////////////////////////////////////
496
497
 
497
498
  /**
498
499
  * @callback EasingFunction
@@ -520,7 +521,17 @@ const DataValues = props => {
520
521
  /** @typedef {Array.<TargetSelector>|TargetSelector} TargetsParam */
521
522
  /** @typedef {Array.<Target>} TargetsArray */
522
523
 
523
- // Callback types ////////////////////////////////////////////////////////////
524
+ // Spring types ////////////////////////////////////////////////////////////////
525
+
526
+ /**
527
+ * @typedef {Object} SpringParams
528
+ * @property {Number} [mass=1] - Mass, default 1
529
+ * @property {Number} [stiffness=100] - Stiffness, default 100
530
+ * @property {Number} [damping=10] - Damping, default 10
531
+ * @property {Number} [velocity=0] - Initial velocity, default 0
532
+ */
533
+
534
+ // Callback types //////////////////////////////////////////////////////////////
524
535
 
525
536
  /**
526
537
  * @template T
@@ -547,7 +558,7 @@ const DataValues = props => {
547
558
  * @property {Callback<T>} [onRender]
548
559
  */
549
560
 
550
- // Timer types ////////////////////////////////////////////////////////////////
561
+ // Timer types /////////////////////////////////////////////////////////////////
551
562
 
552
563
  /**
553
564
  * @typedef {Object} TimerOptions
@@ -569,7 +580,7 @@ const DataValues = props => {
569
580
  * @typedef {TimerOptions & TickableCallbacks<Timer>} TimerParams
570
581
  */
571
582
 
572
- // Tween types ////////////////////////////////////////////////////////////////
583
+ // Tween types /////////////////////////////////////////////////////////////////
573
584
 
574
585
  /**
575
586
  * @callback FunctionValue
@@ -640,7 +651,7 @@ const DataValues = props => {
640
651
  /** @typedef {WeakMap.<Target, TweenLookups>} TweenReplaceLookups */
641
652
  /** @typedef {Map.<Target, TweenLookups>} TweenAdditiveLookups */
642
653
 
643
- // Animation types ////////////////////////////////////////////////////////////
654
+ // JSAnimation types ///////////////////////////////////////////////////////////
644
655
 
645
656
  /**
646
657
  * @typedef {Number|String|FunctionValue} TweenParamValue
@@ -714,7 +725,36 @@ const DataValues = props => {
714
725
  * @typedef {Record<String, TweenOptions | Callback<JSAnimation> | TweenModifier | boolean | PercentageKeyframes | DurationKeyframes | ScrollObserver> & TimerOptions & AnimationOptions & TweenParamsOptions & TickableCallbacks<JSAnimation> & RenderableCallbacks<JSAnimation>} AnimationParams
715
726
  */
716
727
 
717
- // Timeline types /////////////////////////////////////////////////////////////
728
+ // Timeline types //////////////////////////////////////////////////////////////
729
+
730
+ /**
731
+ * Accepts:<br>
732
+ * - `Number` - Absolute position in milliseconds (e.g., `500` places element at exactly 500ms)<br>
733
+ * - `'+=Number'` - Addition: Position element X ms after the last element (e.g., `'+=100'`)<br>
734
+ * - `'-=Number'` - Subtraction: Position element X ms before the last element's end (e.g., `'-=100'`)<br>
735
+ * - `'*=Number'` - Multiplier: Position element at a fraction of the total duration (e.g., `'*=.5'` for halfway)<br>
736
+ * - `'<'` - Previous end: Position element at the end position of the previous element<br>
737
+ * - `'<<'` - Previous start: Position element at the start position of the previous element<br>
738
+ * - `'<<+=Number'` - Combined: Position element relative to previous element's start (e.g., `'<<+=250'`)<br>
739
+ * - `'label'` - Label: Position element at a named label position (e.g., `'My Label'`)
740
+ *
741
+ * @typedef {Number|`+=${Number}`|`-=${Number}`|`*=${Number}`|'<'|'<<'|`<<+=${Number}`|`<<-=${Number}`|String} TimelinePosition
742
+ */
743
+
744
+ /**
745
+ * Accepts:<br>
746
+ * - `Number` - Absolute position in milliseconds (e.g., `500` places animation at exactly 500ms)<br>
747
+ * - `'+=Number'` - Addition: Position animation X ms after the last animation (e.g., `'+=100'`)<br>
748
+ * - `'-=Number'` - Subtraction: Position animation X ms before the last animation's end (e.g., `'-=100'`)<br>
749
+ * - `'*=Number'` - Multiplier: Position animation at a fraction of the total duration (e.g., `'*=.5'` for halfway)<br>
750
+ * - `'<'` - Previous end: Position animation at the end position of the previous animation<br>
751
+ * - `'<<'` - Previous start: Position animation at the start position of the previous animation<br>
752
+ * - `'<<+=Number'` - Combined: Position animation relative to previous animation's start (e.g., `'<<+=250'`)<br>
753
+ * - `'label'` - Label: Position animation at a named label position (e.g., `'My Label'`)<br>
754
+ * - `stagger(String|Nummber)` - Stagger multi-elements animation positions (e.g., 10, 20, 30...)
755
+ *
756
+ * @typedef {TimelinePosition | StaggerFunction<Number|String>} TimelineAnimationPosition
757
+ */
718
758
 
719
759
  /**
720
760
  * @typedef {Object} TimelineOptions
@@ -726,7 +766,57 @@ const DataValues = props => {
726
766
  * @typedef {TimerOptions & TimelineOptions & TickableCallbacks<Timeline> & RenderableCallbacks<Timeline>} TimelineParams
727
767
  */
728
768
 
729
- // Animatable types ///////////////////////////////////////////////////////////
769
+ // WAAPIAnimation types ////////////////////////////////////////////////////////
770
+
771
+ /**
772
+ * @typedef {String|Number|Array<String>|Array<Number>} WAAPITweenValue
773
+ */
774
+
775
+ /**
776
+ * @callback WAAPIFunctionValue
777
+ * @param {DOMTarget} target - The animated target
778
+ * @param {Number} index - The target index
779
+ * @param {Number} length - The total number of animated targets
780
+ * @return {WAAPITweenValue}
781
+ */
782
+
783
+ /**
784
+ * @typedef {WAAPITweenValue|WAAPIFunctionValue|Array<String|Number|WAAPIFunctionValue>} WAAPIKeyframeValue
785
+ */
786
+
787
+ /**
788
+ * @typedef {(animation: WAAPIAnimation) => void} WAAPICallback
789
+ */
790
+
791
+ /**
792
+ * @typedef {Object} WAAPITweenOptions
793
+ * @property {WAAPIKeyframeValue} [to]
794
+ * @property {WAAPIKeyframeValue} [from]
795
+ * @property {Number|WAAPIFunctionValue} [duration]
796
+ * @property {Number|WAAPIFunctionValue} [delay]
797
+ * @property {EasingParam} [ease]
798
+ * @property {CompositeOperation} [composition]
799
+ */
800
+
801
+ /**
802
+ * @typedef {Object} WAAPIAnimationOptions
803
+ * @property {Number|Boolean} [loop]
804
+ * @property {Boolean} [Reversed]
805
+ * @property {Boolean} [Alternate]
806
+ * @property {Boolean|ScrollObserver} [autoplay]
807
+ * @property {Number} [playbackRate]
808
+ * @property {Number|WAAPIFunctionValue} [duration]
809
+ * @property {Number|WAAPIFunctionValue} [delay]
810
+ * @property {EasingParam} [ease]
811
+ * @property {CompositeOperation} [composition]
812
+ * @property {WAAPICallback} [onComplete]
813
+ */
814
+
815
+ /**
816
+ * @typedef {Record<String, WAAPIKeyframeValue | WAAPIAnimationOptions | Boolean | ScrollObserver | WAAPICallback | EasingParam | WAAPITweenOptions> & WAAPIAnimationOptions} WAAPIAnimationParams
817
+ */
818
+
819
+ // Animatable types ////////////////////////////////////////////////////////////
730
820
 
731
821
  /**
732
822
  * @callback AnimatablePropertySetter
@@ -762,7 +852,7 @@ const DataValues = props => {
762
852
  * @typedef {Record<String, TweenParamValue | EasingParam | TweenModifier | TweenComposition | AnimatablePropertyParamsOptions> & AnimatablePropertyParamsOptions} AnimatableParams
763
853
  */
764
854
 
765
- // Scope types ////////////////////////////////////////////////////////////////
855
+ // Scope types /////////////////////////////////////////////////////////////////
766
856
 
767
857
  /**
768
858
  * @typedef {Object} ReactRef
@@ -805,7 +895,52 @@ const DataValues = props => {
805
895
  * @return {ScopeCleanupCallback|void}
806
896
  */
807
897
 
808
- // Draggable types ////////////////////////////////////////////////////////////
898
+ // Scroll types ////////////////////////////////////////////////////////////////
899
+
900
+ /**
901
+ * @typedef {String|Number} ScrollThresholdValue
902
+ */
903
+
904
+ /**
905
+ * @typedef {Object} ScrollThresholdParam
906
+ * @property {ScrollThresholdValue} [target]
907
+ * @property {ScrollThresholdValue} [container]
908
+ */
909
+
910
+ /**
911
+ * @callback ScrollObserverAxisCallback
912
+ * @param {ScrollObserver} self
913
+ * @return {'x'|'y'}
914
+ */
915
+
916
+ /**
917
+ * @callback ScrollThresholdCallback
918
+ * @param {ScrollObserver} self
919
+ * @return {ScrollThresholdValue|ScrollThresholdParam}
920
+ */
921
+
922
+ /**
923
+ * @typedef {Object} ScrollObserverParams
924
+ * @property {Number|String} [id]
925
+ * @property {Boolean|Number|String|EasingParam} [sync]
926
+ * @property {TargetsParam} [container]
927
+ * @property {TargetsParam} [target]
928
+ * @property {'x'|'y'|ScrollObserverAxisCallback|((observer: ScrollObserver) => 'x'|'y'|ScrollObserverAxisCallback)} [axis]
929
+ * @property {ScrollThresholdValue|ScrollThresholdParam|ScrollThresholdCallback|((observer: ScrollObserver) => ScrollThresholdValue|ScrollThresholdParam|ScrollThresholdCallback)} [enter]
930
+ * @property {ScrollThresholdValue|ScrollThresholdParam|ScrollThresholdCallback|((observer: ScrollObserver) => ScrollThresholdValue|ScrollThresholdParam|ScrollThresholdCallback)} [leave]
931
+ * @property {Boolean|((observer: ScrollObserver) => Boolean)} [repeat]
932
+ * @property {Boolean} [debug]
933
+ * @property {Callback<ScrollObserver>} [onEnter]
934
+ * @property {Callback<ScrollObserver>} [onLeave]
935
+ * @property {Callback<ScrollObserver>} [onEnterForward]
936
+ * @property {Callback<ScrollObserver>} [onLeaveForward]
937
+ * @property {Callback<ScrollObserver>} [onEnterBackward]
938
+ * @property {Callback<ScrollObserver>} [onLeaveBackward]
939
+ * @property {Callback<ScrollObserver>} [onUpdate]
940
+ * @property {Callback<ScrollObserver>} [onSyncComplete]
941
+ */
942
+
943
+ // Draggable types /////////////////////////////////////////////////////////////
809
944
 
810
945
  /**
811
946
  * @typedef {Object} DraggableAxisParam
@@ -854,7 +989,7 @@ const DataValues = props => {
854
989
  * @property {Callback<Draggable>} [onAfterResize]
855
990
  */
856
991
 
857
- // Text types /////////////////////////////////////////////////////////////////
992
+ // Text types //////////////////////////////////////////////////////////////////
858
993
 
859
994
  /**
860
995
  * @typedef {Object} splitTemplateParams
@@ -883,7 +1018,7 @@ const DataValues = props => {
883
1018
  * @property {Boolean} [debug]
884
1019
  */
885
1020
 
886
- // SVG types //////////////////////////////////////////////////////////////////
1021
+ // SVG types ///////////////////////////////////////////////////////////////////
887
1022
 
888
1023
  /**
889
1024
  * @typedef {SVGGeometryElement & {
@@ -1043,13 +1178,13 @@ const globals = {
1043
1178
  defaults,
1044
1179
  /** @type {Number} */
1045
1180
  precision: 4,
1046
- /** @type {Number} */
1181
+ /** @type {Number} equals 1 in ms mode, 0.001 in s mode */
1047
1182
  timeScale: 1,
1048
1183
  /** @type {Number} */
1049
1184
  tickThreshold: 200,
1050
1185
  };
1051
1186
 
1052
- const globalVersions = { version: '4.1.2', engine: null };
1187
+ const globalVersions = { version: '4.1.3', engine: null };
1053
1188
 
1054
1189
  if (isBrowser) {
1055
1190
  if (!win.AnimeJS) win.AnimeJS = [];
@@ -1072,7 +1207,6 @@ const toLowerCase = str => str.replace(lowerCaseRgx, '$1-$2').toLowerCase();
1072
1207
  */
1073
1208
  const stringStartsWith = (str, sub) => str.indexOf(sub) === 0;
1074
1209
 
1075
- // Time
1076
1210
  // Note: Date.now is used instead of performance.now since it is precise enough for timings calculations, performs slightly faster and works in Node.js environement.
1077
1211
  const now = Date.now;
1078
1212
 
@@ -1774,9 +1908,10 @@ class Engine extends Clock {
1774
1908
  this.pauseOnDocumentHidden = true;
1775
1909
  /** @type {DefaultsParams} */
1776
1910
  this.defaults = defaults;
1777
- this.paused = isBrowser && doc.hidden ? true : false;
1911
+ // this.paused = isBrowser && doc.hidden ? true : false;
1912
+ this.paused = true;
1778
1913
  /** @type {Number|NodeJS.Immediate} */
1779
- this.reqId = null;
1914
+ this.reqId = 0;
1780
1915
  }
1781
1916
 
1782
1917
  update() {
@@ -1811,13 +1946,16 @@ class Engine extends Clock {
1811
1946
  }
1812
1947
 
1813
1948
  wake() {
1814
- if (this.useDefaultMainLoop && !this.reqId && !this.paused) {
1949
+ if (this.useDefaultMainLoop && !this.reqId) {
1950
+ // Imediatly request a tick to update engine._elapsedTime and get accurate offsetPosition calculation in timer.js
1951
+ this.requestTick(now());
1815
1952
  this.reqId = engineTickMethod(tickEngine);
1816
1953
  }
1817
1954
  return this;
1818
1955
  }
1819
1956
 
1820
1957
  pause() {
1958
+ if (!this.reqId) return;
1821
1959
  this.paused = true;
1822
1960
  return killEngine();
1823
1961
  }
@@ -1958,6 +2096,7 @@ function getNodeList(v) {
1958
2096
  */
1959
2097
  function parseTargets(targets) {
1960
2098
  if (isNil(targets)) return /** @type {TargetsArray} */([]);
2099
+ if (!isBrowser) return /** @type {JSTargetsArray} */(isArr(targets) && targets.flat(Infinity) || [targets]);
1961
2100
  if (isArr(targets)) {
1962
2101
  const flattened = targets.flat(Infinity);
1963
2102
  /** @type {TargetsArray} */
@@ -1998,7 +2137,6 @@ function parseTargets(targets) {
1998
2137
  }
1999
2138
  return parsed;
2000
2139
  }
2001
- if (!isBrowser) return /** @type {JSTargetsArray} */([targets]);
2002
2140
  const nodeList = getNodeList(targets);
2003
2141
  if (nodeList) return /** @type {DOMTargetsArray} */(Array.from(nodeList));
2004
2142
  return /** @type {TargetsArray} */([targets]);
@@ -2437,12 +2575,16 @@ const composeTween = (tween, siblings) => {
2437
2575
 
2438
2576
  const prevChangeStartTime = prevSibling._startTime;
2439
2577
  const prevTLOffset = prevAbsEndTime - (prevChangeStartTime + prevSibling._updateDuration);
2578
+ // Rounding is necessary here to minimize floating point errors when working in seconds
2579
+ const updatedPrevChangeDuration = round(absoluteUpdateStartTime - prevTLOffset - prevChangeStartTime, 12);
2440
2580
 
2441
- prevSibling._changeDuration = absoluteUpdateStartTime - prevTLOffset - prevChangeStartTime;
2442
- prevSibling._currentTime = prevSibling._changeDuration;
2581
+ prevSibling._changeDuration = updatedPrevChangeDuration;
2582
+ prevSibling._currentTime = updatedPrevChangeDuration;
2443
2583
  prevSibling._isOverlapped = 1;
2444
2584
 
2445
- if (prevSibling._changeDuration < minValue) {
2585
+ // Override the previous tween if its new _changeDuration is lower than minValue
2586
+ // TODO: See if it's even neceseeary to test against minValue, checking for 0 might be enough
2587
+ if (updatedPrevChangeDuration < minValue) {
2446
2588
  overrideTween(prevSibling);
2447
2589
  }
2448
2590
  }
@@ -2473,7 +2615,7 @@ const composeTween = (tween, siblings) => {
2473
2615
  prevParent.cancel();
2474
2616
  // Previously, calling .cancel() on a timeline child would affect the render order of other children
2475
2617
  // Worked around this by marking it as .completed and using .pause() for safe removal in the engine loop
2476
- // This is no longer needed since timeline tween composition is now handled separatly
2618
+ // This is no longer needed since timeline tween composition is now handled separately
2477
2619
  // Keeping this here for reference
2478
2620
  // prevParent.completed = true;
2479
2621
  // prevParent.pause();
@@ -2670,18 +2812,17 @@ class Timer extends Clock {
2670
2812
  /** @type {Number} */(timerLoop) < 0 ? Infinity :
2671
2813
  /** @type {Number} */(timerLoop) + 1;
2672
2814
 
2815
+
2673
2816
  let offsetPosition = 0;
2674
2817
 
2675
2818
  if (parent) {
2676
2819
  offsetPosition = parentPosition;
2677
2820
  } else {
2678
- let startTime = now();
2679
- // Make sure to tick the engine once if suspended to avoid big gaps with the following offsetPosition calculation
2680
- if (engine.paused) {
2681
- engine.requestTick(startTime);
2682
- startTime = engine._elapsedTime;
2683
- }
2684
- offsetPosition = startTime - engine._startTime;
2821
+ // Make sure to tick the engine once if not currently running to get up to date engine._elapsedTime
2822
+ // to avoid big gaps with the following offsetPosition calculation
2823
+ if (!engine.reqId) engine.requestTick(now());
2824
+ // Make sure to scale the offset position with globals.timeScale to properly handle seconds unit
2825
+ offsetPosition = (engine._elapsedTime - engine._startTime) * globals.timeScale;
2685
2826
  }
2686
2827
 
2687
2828
  // Timer's parameters
@@ -2882,6 +3023,9 @@ class Timer extends Clock {
2882
3023
  /** @return {this} */
2883
3024
  resetTime() {
2884
3025
  const timeScale = 1 / (this._speed * engine._speed);
3026
+ // TODO: See if we can safely use engine._elapsedTime here
3027
+ // if (!engine.reqId) engine.requestTick(now())
3028
+ // this._startTime = engine._elapsedTime - (this._currentTime + this._delay) * timeScale;
2885
3029
  this._startTime = now() - (this._currentTime + this._delay) * timeScale;
2886
3030
  return this;
2887
3031
  }
@@ -3080,10 +3224,10 @@ const binarySubdivide = (aX, mX1, mX2) => {
3080
3224
  };
3081
3225
 
3082
3226
  /**
3083
- * @param {Number} [mX1]
3084
- * @param {Number} [mY1]
3085
- * @param {Number} [mX2]
3086
- * @param {Number} [mY2]
3227
+ * @param {Number} [mX1] The x coordinate of the first point
3228
+ * @param {Number} [mY1] The y coordinate of the first point
3229
+ * @param {Number} [mX2] The x coordinate of the second point
3230
+ * @param {Number} [mY2] The y coordinate of the second point
3087
3231
  * @return {EasingFunction}
3088
3232
  */
3089
3233
 
@@ -3106,7 +3250,7 @@ const steps = (steps = 10, fromStart) => {
3106
3250
  /**
3107
3251
  * Without parameters, the linear function creates a non-eased transition.
3108
3252
  * Parameters, if used, creates a piecewise linear easing by interpolating linearly between the specified points.
3109
- * @param {...String|Number} [args] - Points
3253
+ * @param {...(String|Number)} args - Points
3110
3254
  * @return {EasingFunction}
3111
3255
  */
3112
3256
  const linear = (...args) => {
@@ -3753,7 +3897,8 @@ class JSAnimation extends Timer {
3753
3897
  const isFromToArray = isArr(tweenToValue);
3754
3898
  const isFromToValue = isFromToArray || (hasFromvalue && hasToValue);
3755
3899
  const tweenStartTime = prevTween ? lastTweenChangeEndTime + tweenDelay : tweenDelay;
3756
- const absoluteStartTime = absoluteOffsetTime + tweenStartTime;
3900
+ // Rounding is necessary here to minimize floating point errors when working in seconds
3901
+ const absoluteStartTime = round(absoluteOffsetTime + tweenStartTime, 12);
3757
3902
 
3758
3903
  // Force a onRender callback if the animation contains at least one from value and autoplay is set to false
3759
3904
  if (!shouldTriggerRender && (hasFromvalue || isFromToArray)) shouldTriggerRender = 1;
@@ -3881,7 +4026,7 @@ class JSAnimation extends Timer {
3881
4026
 
3882
4027
  // Tween factory
3883
4028
 
3884
- // Rounding is necessary here to minimize floating point errors
4029
+ // Rounding is necessary here to minimize floating point errors when working in seconds
3885
4030
  const tweenUpdateDuration = round(+tweenDuration || minValue, 12);
3886
4031
 
3887
4032
  /** @type {Tween} */
@@ -3930,7 +4075,7 @@ class JSAnimation extends Timer {
3930
4075
  if (isNaN(firstTweenChangeStartTime)) {
3931
4076
  firstTweenChangeStartTime = tween._startTime;
3932
4077
  }
3933
- // Rounding is necessary here to minimize floating point errors
4078
+ // Rounding is necessary here to minimize floating point errors when working in seconds
3934
4079
  lastTweenChangeEndTime = round(tweenStartTime + tweenUpdateDuration, 12);
3935
4080
  prevTween = tween;
3936
4081
  animationAnimationLength++;
@@ -4181,7 +4326,7 @@ const Eswat2Io = _props => {
4181
4326
  index.h(Fingerprint, { label: "eswat2" })));
4182
4327
  };
4183
4328
 
4184
- const shadowCss = "/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root,\n :host {\n --font-sans:\n ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji',\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n --spacing: 0.25rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --font-weight-bold: 700;\n }\n}\n@layer utilities {\n .absolute {\n position: absolute;\n }\n .relative {\n position: relative;\n }\n .top-8 {\n top: calc(var(--spacing) * 8);\n }\n .right-8 {\n right: calc(var(--spacing) * 8);\n }\n .mt-3 {\n margin-top: calc(var(--spacing) * 3);\n }\n .mt-5px {\n margin-top: 5px;\n }\n .mr-0 {\n margin-right: calc(var(--spacing) * 0);\n }\n .mr-10px {\n margin-right: 10px;\n }\n .mb-10px {\n margin-bottom: 10px;\n }\n .ml-0 {\n margin-left: calc(var(--spacing) * 0);\n }\n .ml-auto {\n margin-left: auto;\n }\n .flex {\n display: flex;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,)\n var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-center {\n align-items: center;\n }\n .border-solid {\n --tw-border-style: solid;\n border-style: solid;\n }\n .border-clrs-gray {\n border-color: var(--clrs-gray, #aaaaaa);\n }\n .border-clrs-slate {\n border-color: var(--clrs-slate, #708090);\n }\n .bg-clrs-blue {\n background-color: var(--clrs-blue, #0074d9);\n }\n .bg-clrs-red {\n background-color: var(--clrs-red, #ff4136);\n }\n .bg-clrs-silver {\n background-color: var(--clrs-silver, #dddddd);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .align-top {\n vertical-align: top;\n }\n .font-sans {\n font-family: var(--font-sans);\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .text-clrs-gray {\n color: var(--clrs-gray, #aaaaaa);\n }\n .text-clrs-navy {\n color: var(--clrs-navy, #001f3f);\n }\n .text-clrs-slate4 {\n color: var(--clrs-slate4, #4e5964);\n }\n .text-clrs-white {\n color: var(--clrs-white, #ffffff);\n }\n .italic {\n font-style: italic;\n }\n .shadow {\n --tw-shadow:\n 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)),\n 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow), var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .hover\\:text-clrs-navy {\n &:hover {\n @media (hover: hover) {\n color: var(--clrs-navy, #001f3f);\n }\n }\n }\n .active\\:bg-clrs-gray {\n &:active {\n background-color: var(--clrs-gray, #aaaaaa);\n }\n }\n .active\\:text-clrs-navy {\n &:active {\n color: var(--clrs-navy, #001f3f);\n }\n }\n}\n@layer components {\n .ds1-main {\n display: flex;\n flex-direction: column;\n padding: calc(var(--spacing) * 4);\n font-family: var(--font-sans);\n color: var(--clrs-navy, #001f3f);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n .ds1-button {\n display: flex;\n align-items: center;\n --tw-border-style: solid;\n border-style: solid;\n border-color: var(--clrs-slate, #708090);\n color: var(--clrs-white, #ffffff);\n &:active {\n background-color: var(--clrs-gray, #aaaaaa);\n }\n &:active {\n color: var(--clrs-navy, #001f3f);\n }\n }\n .funnel-gfx {\n --tw-border-style: solid;\n border-style: solid;\n border-color: var(--clrs-gray, #aaaaaa);\n background-color: var(--clrs-silver, #dddddd);\n stroke-width: 1;\n }\n}\n.data-button {\n border-radius: 5px;\n border-width: 1px;\n padding: 5px;\n margin: 0px;\n margin-right: 5px;\n cursor: pointer;\n}\n.funnel-gfx {\n width: calc(100% - 20px);\n height: 100%;\n padding: 10px;\n padding-bottom: 7px;\n border-radius: 10px;\n border-width: 1px;\n}\n";
4329
+ const shadowCss = "/*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */\n@layer properties;\n@layer theme, base, components, utilities;\n@layer theme {\n :root,\n :host {\n --font-sans:\n ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji',\n 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n --spacing: 0.25rem;\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --font-weight-bold: 700;\n }\n}\n@layer utilities {\n .absolute {\n position: absolute;\n }\n .relative {\n position: relative;\n }\n .top-8 {\n top: calc(var(--spacing) * 8);\n }\n .right-8 {\n right: calc(var(--spacing) * 8);\n }\n .mt-3 {\n margin-top: calc(var(--spacing) * 3);\n }\n .mt-5px {\n margin-top: 5px;\n }\n .mr-0 {\n margin-right: calc(var(--spacing) * 0);\n }\n .mr-10px {\n margin-right: 10px;\n }\n .mb-10px {\n margin-bottom: 10px;\n }\n .ml-0 {\n margin-left: calc(var(--spacing) * 0);\n }\n .ml-auto {\n margin-left: auto;\n }\n .flex {\n display: flex;\n }\n .transform {\n transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,)\n var(--tw-skew-x,) var(--tw-skew-y,);\n }\n .flex-col {\n flex-direction: column;\n }\n .flex-wrap {\n flex-wrap: wrap;\n }\n .items-center {\n align-items: center;\n }\n .border-solid {\n --tw-border-style: solid;\n border-style: solid;\n }\n .border-clrs-gray {\n border-color: var(--clrs-gray, #aaaaaa);\n }\n .border-clrs-slate {\n border-color: var(--clrs-slate, #708090);\n }\n .bg-clrs-blue {\n background-color: var(--clrs-blue, #0074d9);\n }\n .bg-clrs-red {\n background-color: var(--clrs-red, #ff4136);\n }\n .bg-clrs-silver {\n background-color: var(--clrs-silver, #dddddd);\n }\n .p-4 {\n padding: calc(var(--spacing) * 4);\n }\n .align-top {\n vertical-align: top;\n }\n .font-sans {\n font-family: var(--font-sans);\n }\n .text-xs {\n font-size: var(--text-xs);\n line-height: var(--tw-leading, var(--text-xs--line-height));\n }\n .font-bold {\n --tw-font-weight: var(--font-weight-bold);\n font-weight: var(--font-weight-bold);\n }\n .text-clrs-gray {\n color: var(--clrs-gray, #aaaaaa);\n }\n .text-clrs-navy {\n color: var(--clrs-navy, #001f3f);\n }\n .text-clrs-slate4 {\n color: var(--clrs-slate4, #4e5964);\n }\n .text-clrs-white {\n color: var(--clrs-white, #ffffff);\n }\n .italic {\n font-style: italic;\n }\n .shadow {\n --tw-shadow:\n 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)),\n 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));\n box-shadow:\n var(--tw-inset-shadow), var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n }\n .hover\\:text-clrs-navy {\n &:hover {\n @media (hover: hover) {\n color: var(--clrs-navy, #001f3f);\n }\n }\n }\n .active\\:bg-clrs-gray {\n &:active {\n background-color: var(--clrs-gray, #aaaaaa);\n }\n }\n .active\\:text-clrs-navy {\n &:active {\n color: var(--clrs-navy, #001f3f);\n }\n }\n}\n@layer components {\n .ds1-main {\n display: flex;\n flex-direction: column;\n padding: calc(var(--spacing) * 4);\n font-family: var(--font-sans);\n color: var(--clrs-navy, #001f3f);\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n .ds1-button {\n display: flex;\n align-items: center;\n --tw-border-style: solid;\n border-style: solid;\n border-color: var(--clrs-slate, #708090);\n color: var(--clrs-white, #ffffff);\n &:active {\n background-color: var(--clrs-gray, #aaaaaa);\n }\n &:active {\n color: var(--clrs-navy, #001f3f);\n }\n }\n .funnel-gfx {\n --tw-border-style: solid;\n border-style: solid;\n border-color: var(--clrs-gray, #aaaaaa);\n background-color: var(--clrs-silver, #dddddd);\n stroke-width: 1;\n }\n}\n.data-button {\n border-radius: 5px;\n border-width: 1px;\n padding: 5px;\n margin: 0px;\n margin-right: 5px;\n cursor: pointer;\n}\n.funnel-gfx {\n width: calc(100% - 20px);\n height: 100%;\n padding: 10px;\n padding-bottom: 7px;\n border-radius: 10px;\n border-width: 1px;\n}\n";
4185
4330
 
4186
4331
  const FunnelApp = class {
4187
4332
  constructor(hostRef) {
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
@@ -1,4 +1,4 @@
1
1
  // WARNING: generated file...
2
- const TW_VERSION = '4.1.11';
2
+ const TW_VERSION = '4.1.12';
3
3
  export { TW_VERSION };
4
4
  export default TW_VERSION;