@freestylejs/ani-core 1.0.0 → 1.1.0

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/index.cjs CHANGED
@@ -111,6 +111,76 @@ var BezierTimingFunction = class extends TimingFunction {
111
111
  }
112
112
  };
113
113
 
114
+ // src/timing/dynamic_spring.ts
115
+ var DynamicSpringTimingFunction = class extends TimingFunction {
116
+ constructor(opt) {
117
+ super();
118
+ this.opt = opt;
119
+ this.currentValue = 0;
120
+ this.currentVelocity = 0;
121
+ this.isInitialized = false;
122
+ }
123
+ init(startValue) {
124
+ this.currentValue = startValue;
125
+ this.currentVelocity = 0;
126
+ this.isInitialized = true;
127
+ }
128
+ getDerivatives(state, to) {
129
+ const { m, k, c } = this.opt;
130
+ const displacement = state.x - to;
131
+ const a2 = (-k * displacement - c * state.v) / m;
132
+ return { dx: state.v, dv: a2 };
133
+ }
134
+ step(_time, context) {
135
+ if (!this.isInitialized) {
136
+ this.init(context.from);
137
+ }
138
+ const { to, tolerance, dt } = context;
139
+ if (dt === 0) {
140
+ return {
141
+ value: this.currentValue,
142
+ endOfAnimation: false
143
+ // Or check for end state
144
+ };
145
+ }
146
+ const x = this.currentValue;
147
+ const v = this.currentVelocity;
148
+ const k1 = this.getDerivatives({ x, v }, to);
149
+ const k2State = {
150
+ x: x + k1.dx * (dt / 2),
151
+ v: v + k1.dv * (dt / 2)
152
+ };
153
+ const k2 = this.getDerivatives(k2State, to);
154
+ const k3State = {
155
+ x: x + k2.dx * (dt / 2),
156
+ v: v + k2.dv * (dt / 2)
157
+ };
158
+ const k3 = this.getDerivatives(k3State, to);
159
+ const k4State = {
160
+ x: x + k3.dx * dt,
161
+ v: v + k3.dv * dt
162
+ };
163
+ const k4 = this.getDerivatives(k4State, to);
164
+ const avgDx = 1 / 6 * (k1.dx + 2 * k2.dx + 2 * k3.dx + k4.dx);
165
+ const avgDv = 1 / 6 * (k1.dv + 2 * k2.dv + 2 * k3.dv + k4.dv);
166
+ this.currentValue = x + avgDx * dt;
167
+ this.currentVelocity = v + avgDv * dt;
168
+ const tol = tolerance ?? 1e-3;
169
+ const displacement = this.currentValue - to;
170
+ const isMoving = Math.abs(this.currentVelocity) > tol;
171
+ const isDisplaced = Math.abs(displacement) > tol;
172
+ const endOfAnimation = !isMoving && !isDisplaced;
173
+ if (endOfAnimation) {
174
+ this.currentValue = to;
175
+ this.currentVelocity = 0;
176
+ }
177
+ return {
178
+ value: this.currentValue,
179
+ endOfAnimation
180
+ };
181
+ }
182
+ };
183
+
114
184
  // src/timing/spring.ts
115
185
  var SpringTimingFunction = class extends TimingFunction {
116
186
  constructor(opt) {
@@ -181,16 +251,20 @@ var T = {
181
251
  * Creates a new Bezier timing function instance.
182
252
  *
183
253
  * @param {Bezier.BezierTimingFunctionOpt} opt - Options for configuring the Bezier curve.
184
- * A new instance of BezierTimingFunction.
185
254
  */
186
255
  bezier: (opt) => new BezierTimingFunction(opt),
187
256
  /**
188
257
  * Creates a new Spring timing function instance.
189
258
  *
190
- * @param {Spring.SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
191
- * A new instance of SpringTimingFunction.
259
+ * @param {SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
192
260
  */
193
261
  spring: (opt) => new SpringTimingFunction(opt),
262
+ /**
263
+ * Creates a new Dynamic Spring timing function instance.
264
+ *
265
+ * @param SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
266
+ */
267
+ dynamicSpring: (opt) => new DynamicSpringTimingFunction(opt),
194
268
  /**
195
269
  * Creates linear timing function instance.
196
270
  */
@@ -204,7 +278,7 @@ var SegmentNode = class extends AnimationNode {
204
278
  this.type = "SEGMENT";
205
279
  const nodeProps = {
206
280
  to: props.to,
207
- duration: props.duration ?? 0,
281
+ duration: props.duration,
208
282
  ...props.timing !== void 0 && { timing: props.timing }
209
283
  };
210
284
  this.props = nodeProps;
@@ -469,6 +543,7 @@ var Timeline = class {
469
543
  this.rootNode = rootNode;
470
544
  this._currentExecutionPlan = null;
471
545
  this._masterTime = 0;
546
+ this._delay = 0;
472
547
  this._status = "IDLE";
473
548
  this._currentConfig = null;
474
549
  this._state = [];
@@ -551,11 +626,18 @@ var Timeline = class {
551
626
  );
552
627
  const isRecordAni = this._propertyKeyMap !== null && keyMap !== null;
553
628
  let fromValues = [];
629
+ const timings = [];
630
+ const t = segment.node.props.timing;
631
+ const isRecordTiming = t && !(t instanceof TimingFunction);
554
632
  if (isRecordAni) {
555
633
  for (const key of keyMap.keys()) {
556
- fromValues.push(
557
- stateAtLastStartTime[this._propertyKeyMap.get(key)]
558
- );
634
+ const index = this._propertyKeyMap.get(key);
635
+ fromValues.push(stateAtLastStartTime[index]);
636
+ if (isRecordTiming) {
637
+ timings.push(
638
+ t[key]
639
+ );
640
+ }
559
641
  }
560
642
  } else {
561
643
  fromValues = stateAtLastStartTime;
@@ -566,7 +648,7 @@ var Timeline = class {
566
648
  from: fromValues,
567
649
  to: toValues,
568
650
  duration: segment.node.duration,
569
- timing: segment.node.props.timing
651
+ timing: isRecordAni && isRecordTiming ? timings : t
570
652
  };
571
653
  const segmentState = calculateSegmentState(
572
654
  localTime,
@@ -664,6 +746,9 @@ var Timeline = class {
664
746
  return;
665
747
  }
666
748
  this._currentConfig = config;
749
+ if (this._repeatCount === 0) {
750
+ this._delay = (this._currentConfig.delay ?? 0) * 1e-3;
751
+ }
667
752
  this._currentExecutionPlan = this._resolveExecutionPlan(
668
753
  config.keyframes,
669
754
  config.durations
@@ -674,7 +759,7 @@ var Timeline = class {
674
759
  this._initialState = values;
675
760
  this._status = "PLAYING";
676
761
  this._clock.subscribe(this);
677
- this.update(0);
762
+ this.notify();
678
763
  }
679
764
  pause() {
680
765
  this._status = "PAUSED";
@@ -689,6 +774,7 @@ var Timeline = class {
689
774
  this._status = "IDLE";
690
775
  this._currentConfig = null;
691
776
  this._masterTime = 0;
777
+ this._delay = 0;
692
778
  this._state = [];
693
779
  this._initialState = [];
694
780
  this._propertyKeyMap = null;
@@ -723,6 +809,15 @@ var Timeline = class {
723
809
  if (this._status !== "PLAYING") {
724
810
  return;
725
811
  }
812
+ if (this._delay > 0) {
813
+ this._delay -= dt;
814
+ if (this._delay < 0) {
815
+ dt = -this._delay;
816
+ this._delay = 0;
817
+ } else {
818
+ return;
819
+ }
820
+ }
726
821
  this._masterTime += dt;
727
822
  if (this._masterTime >= this.duration) {
728
823
  this._masterTime = this.duration;
@@ -986,3 +1081,4 @@ var a = {
986
1081
  stagger,
987
1082
  timeline
988
1083
  });
1084
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/ani/nodes/base.ts","../src/timing/function.ts","../src/timing/linear.ts","../src/timing/bezier.ts","../src/timing/dynamic_spring.ts","../src/timing/spring.ts","../src/timing/index.ts","../src/ani/nodes/segment.ts","../src/ani/nodes/composition.ts","../src/ani/nodes/delay.ts","../src/ani/nodes/loop.ts","../src/ani/nodes/parallel.ts","../src/ani/nodes/sequence.ts","../src/ani/nodes/stagger.ts","../src/loop/clock.ts","../src/utils/time/is_end.ts","../src/ani/engine.ts","../src/ani/timeline.ts","../src/ani/states.ts","../src/event/manager.ts","../src/style/create_sheet.ts"],"sourcesContent":["import {\n ani,\n createStates,\n delay,\n loop,\n parallel,\n sequence,\n stagger,\n timeline,\n} from './ani'\nimport { T } from './timing'\n\nexport * from './ani'\nexport * from './binding_api'\nexport * from './event'\nexport * from './loop'\nexport * from './style'\nexport * from './timing'\n\nexport const a = {\n timing: T,\n ani,\n createStates,\n delay,\n loop,\n parallel,\n sequence,\n stagger,\n timeline,\n} as const\n","import type { ExecutionPlan, Groupable } from '../timeline'\n\nexport type AnimationId = string\nexport type AnimationNodeType = string\nexport type AnimationDuration = number\n\n/**\n * Nodes in the animation tree\n */\nexport abstract class AnimationNode<G extends Groupable> {\n abstract readonly type: AnimationNodeType\n abstract readonly duration: AnimationDuration\n\n readonly id?: AnimationId\n\n constructor(id?: AnimationId) {\n if (id) {\n this.id = id\n }\n }\n\n /**\n * Constructs self node and its children into a flat execution plan.\n * @param plan Execution plans to which segments will be added.\n * @param startTime The absolute current start time for this node within the master timeline.\n */\n public abstract construct(plan: ExecutionPlan<G>, startTime: number): void\n}\n\nexport type ExtractAnimationNode<AnimeNode> = AnimeNode extends AnimationNode<\n infer Group\n>\n ? Group\n : never\n","export interface TimingFunctionContext {\n /**\n * delta t\n */\n dt: number\n /**\n * from value, initial position (`s(0)`)\n */\n from: number\n /**\n * to value, original position (`s(f)`)\n */\n to: number\n /**\n * animation duration, but it is not possible for specific functions\n */\n duration: number\n /**\n * animation end tolerance\n */\n tolerance?: number\n}\nexport abstract class TimingFunction {\n /**\n * Step function\n * @param time Current time\n * @param context Context for step calculation\n */\n public abstract step(\n time: number,\n context: TimingFunctionContext\n ): {\n value: number\n endOfAnimation: boolean\n }\n\n private static DEFAULT_TOLERANCE = 0.01 as const\n /**\n * Checks whether the animation has ended.\n *\n * @param time - The current time.\n * @param value - The computed value at the current time.\n * @param context - The animation context.\n * @returns {boolean} True if the animation is ended, false otherwise.\n */\n protected checkEnd(\n time: number,\n value: number,\n context: TimingFunctionContext,\n checkTimeOnly: boolean = true\n ): boolean {\n const tol =\n context.tolerance !== undefined\n ? context.tolerance\n : TimingFunction.DEFAULT_TOLERANCE\n const timeCondition = time >= context.duration\n const end = checkTimeOnly\n ? timeCondition\n : timeCondition && Math.abs(context.to - value) <= tol\n return end\n }\n}\n\nexport interface Coord {\n x: number\n y: number\n}\n","import { TimingFunction, type TimingFunctionContext } from './function'\n\nexport class LinearTimingFunction extends TimingFunction {\n public step(\n time: number,\n context: TimingFunctionContext\n ): { value: number; endOfAnimation: boolean } {\n const progress =\n context.duration === 0\n ? 1\n : Math.max(0, Math.min(time / context.duration, 1))\n\n const value = context.from + (context.to - context.from) * progress\n\n return { value, endOfAnimation: time >= context.duration }\n }\n}\n","/** biome-ignore-all lint/style/noMagicNumbers: <>*/\nimport {\n type Coord,\n TimingFunction,\n type TimingFunctionContext,\n} from './function'\n\nexport interface BezierTimingFunctionOpt {\n p2: Coord\n p3: Coord\n}\nexport class BezierTimingFunction extends TimingFunction {\n public constructor(public readonly opt: { p2: Coord; p3: Coord }) {\n super()\n }\n private readonly p1: Coord = {\n x: 0,\n y: 0,\n }\n private readonly p4: Coord = {\n x: 1,\n y: 1,\n }\n\n private _bezierFunction(t: number, duration?: number): number {\n const end: number = duration || this.p4.y\n return (\n (1 - t) ** 3 * this.p1.y +\n 3 * (1 - t) ** 2 * t * this.opt.p2.y +\n 3 * (1 - t) * t ** 2 * this.opt.p3.y +\n t ** 3 * end\n )\n }\n\n public step(\n time: number,\n context: TimingFunctionContext\n ): { value: number; endOfAnimation: boolean } {\n const f = this._bezierFunction(time, context.duration)\n return {\n value: f,\n endOfAnimation:\n (context.duration\n ? time >= context.duration\n : time >= this.p4.x) && f >= context.to,\n }\n }\n}\n","import { TimingFunction, type TimingFunctionContext } from './function'\n\nimport type { SpringTimingFunctionOpt } from './spring'\n\nexport class DynamicSpringTimingFunction extends TimingFunction {\n public constructor(public readonly opt: SpringTimingFunctionOpt) {\n super()\n }\n\n private currentValue: number = 0\n private currentVelocity: number = 0\n private isInitialized: boolean = false\n\n public init(startValue: number): void {\n this.currentValue = startValue\n this.currentVelocity = 0\n this.isInitialized = true\n }\n\n private getDerivatives(\n state: { x: number; v: number },\n to: number\n ): { dx: number; dv: number } {\n const { m, k, c } = this.opt\n const displacement = state.x - to\n\n const a = (-k * displacement - c * state.v) / m\n\n return { dx: state.v, dv: a }\n }\n\n public step(\n _time: number,\n context: TimingFunctionContext\n ): {\n value: number\n endOfAnimation: boolean\n } {\n if (!this.isInitialized) {\n this.init(context.from)\n }\n\n const { to, tolerance, dt } = context\n\n if (dt === 0) {\n return {\n value: this.currentValue,\n endOfAnimation: false, // Or check for end state\n }\n }\n\n const x = this.currentValue\n const v = this.currentVelocity\n\n // RK4\n // k1\n const k1 = this.getDerivatives({ x, v }, to)\n // k2\n const k2State = {\n x: x + k1.dx * (dt / 2),\n v: v + k1.dv * (dt / 2),\n }\n const k2 = this.getDerivatives(k2State, to)\n // k3\n const k3State = {\n x: x + k2.dx * (dt / 2),\n v: v + k2.dv * (dt / 2),\n }\n const k3 = this.getDerivatives(k3State, to)\n // k4\n const k4State = {\n x: x + k3.dx * dt,\n v: v + k3.dv * dt,\n }\n const k4 = this.getDerivatives(k4State, to)\n\n const avgDx = (1.0 / 6.0) * (k1.dx + 2 * k2.dx + 2 * k3.dx + k4.dx)\n const avgDv = (1.0 / 6.0) * (k1.dv + 2 * k2.dv + 2 * k3.dv + k4.dv)\n\n this.currentValue = x + avgDx * dt\n this.currentVelocity = v + avgDv * dt\n\n // Check for end of animation\n const tol = tolerance ?? 1e-3\n const displacement = this.currentValue - to\n const isMoving = Math.abs(this.currentVelocity) > tol\n const isDisplaced = Math.abs(displacement) > tol\n const endOfAnimation = !isMoving && !isDisplaced\n\n if (endOfAnimation) {\n // Snap to final value\n this.currentValue = to\n this.currentVelocity = 0\n }\n\n return {\n value: this.currentValue,\n endOfAnimation: endOfAnimation,\n }\n }\n}\n","import { TimingFunction, type TimingFunctionContext } from './function'\n\nexport interface SpringTimingFunctionOpt {\n /**\n * Mass constant.\n */\n m: number\n /**\n * Spring constant.\n */\n k: number\n /**\n * Damping constant.\n */\n c: number\n /**\n * End of spring animation threshold.\n * @default 1e-3\n */\n tolerance?: number\n}\nexport class SpringTimingFunction extends TimingFunction {\n public constructor(public readonly opt: SpringTimingFunctionOpt) {\n super()\n if (!this.opt.tolerance) {\n const DEFAULT_TOLERANCE = 1e-3 as const\n this.opt.tolerance = DEFAULT_TOLERANCE\n }\n }\n\n public step(\n time: number,\n context: TimingFunctionContext\n ): {\n value: number\n endOfAnimation: boolean\n } {\n // mass-spring-damper\n // ODE\n const m = this.opt.m\n const k = this.opt.k\n const c = this.opt.c\n const tolerance = this.opt.tolerance!\n\n // Initial D\n const d0 = context.from - context.to\n\n if (typeof d0 !== 'number') {\n throw new TypeError(\n 'Spring step function, needs initial displacement d(0) = context.start'\n )\n }\n\n const wN = Math.sqrt(k / m)\n const zetta = c / (2 * Math.sqrt(m * k))\n const Ms = 1000 as const\n\n if (zetta < 1) {\n // under-damped system\n const settlingTime = (-1 / (zetta * wN)) * Math.log(tolerance)\n const t = context?.duration\n ? (settlingTime / context.duration) * time\n : time\n\n const C1 = d0\n const C2 = (zetta / Math.sqrt(1 - zetta ** 2)) * d0\n const ode =\n Math.exp(-zetta * wN * t) *\n (C1 * Math.cos(wN * Math.sqrt(1 - zetta ** 2) * t) +\n C2 * Math.sin(wN * Math.sqrt(1 - zetta ** 2) * t)) +\n context.to\n\n return {\n value: ode,\n endOfAnimation: t >= settlingTime && ode >= context.to,\n }\n }\n\n if (zetta === 1) {\n // critically-damped system\n const settlingTime = (-1 / wN) * Math.log(tolerance)\n const t = context?.duration\n ? (settlingTime / context.duration) * time\n : time\n\n const C1 = d0\n const C2 = wN * d0\n const ode = (C1 + C2 * t) * Math.exp(-wN * t) + context.to\n\n return {\n value: ode,\n endOfAnimation:\n t >= settlingTime &&\n Math.abs(ode - context.to) <= context.to / Ms,\n }\n }\n\n if (zetta > 1) {\n // overdamped system\n const settlingTime = (-1 / (zetta * wN)) * Math.log(tolerance)\n const t = context?.duration\n ? (settlingTime / context.duration) * time\n : time\n\n const delta = Math.sqrt(zetta ** 2 - 1)\n const lambda1 = -zetta * wN + wN * delta\n const lambda2 = -zetta * wN - wN * delta\n\n const C2 = (-lambda1 * d0) / (lambda2 - lambda1)\n const C1 = d0 - C2\n\n // ODE solution\n const ode =\n C1 * Math.exp(lambda1 * t) +\n C2 * Math.exp(lambda2 * t) +\n context.to\n\n return {\n value: ode,\n endOfAnimation:\n t >= settlingTime &&\n Math.abs(ode - context.to) <= context.to / Ms,\n }\n }\n\n throw new Error('invalid system')\n }\n}\n","export * from './function'\nexport * from './linear'\n\nimport * as Bezier from './bezier'\nimport { DynamicSpringTimingFunction } from './dynamic_spring'\nimport { LinearTimingFunction } from './linear'\nimport { SpringTimingFunction, type SpringTimingFunctionOpt } from './spring'\n\n/**\n * Core timing functions\n */\nexport const T = {\n /**\n * Creates a new Bezier timing function instance.\n *\n * @param {Bezier.BezierTimingFunctionOpt} opt - Options for configuring the Bezier curve.\n */\n bezier: (opt: Bezier.BezierTimingFunctionOpt) =>\n new Bezier.BezierTimingFunction(opt),\n\n /**\n * Creates a new Spring timing function instance.\n *\n * @param {SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.\n */\n spring: (opt: SpringTimingFunctionOpt) => new SpringTimingFunction(opt),\n\n /**\n * Creates a new Dynamic Spring timing function instance.\n *\n * @param SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.\n */\n dynamicSpring: (opt: SpringTimingFunctionOpt) =>\n new DynamicSpringTimingFunction(opt),\n\n /**\n * Creates linear timing function instance.\n */\n linear: () => new LinearTimingFunction(),\n} as const\n","import type { SegmentTiming } from '../engine'\nimport type { ExecutionPlan, Groupable } from '../timeline'\nimport { type AnimationId, AnimationNode } from './base'\n\nexport interface SegmentNodeProps<G extends Groupable> {\n readonly to: G\n readonly duration: number\n readonly timing?: SegmentTiming<G>\n}\n\n/**\n * Leaf node in the animation tree\n */\nexport class SegmentNode<G extends Groupable> extends AnimationNode<G> {\n readonly type = 'SEGMENT'\n readonly props: SegmentNodeProps<G>\n\n constructor(props: SegmentNodeProps<G>, id?: AnimationId) {\n super(id)\n const nodeProps: SegmentNodeProps<G> = {\n to: props.to,\n duration: props.duration,\n ...(props.timing !== undefined && { timing: props.timing }),\n }\n this.props = nodeProps\n }\n\n public get duration(): number {\n return this.props.duration\n }\n\n public construct(plan: ExecutionPlan<G>, startTime: number): void {\n plan.push({\n node: this,\n startTime: startTime,\n endTime: startTime + this.duration,\n })\n }\n}\n\n/**\n * Factory function to create a ani SegmentNode.\n */\nexport function ani<G extends Groupable>(\n props: SegmentNodeProps<G>,\n id?: AnimationId\n): SegmentNode<G> {\n return new SegmentNode(props, id)\n}\n","import { LinearTimingFunction, type TimingFunction } from '~/timing'\nimport type { ExecutionPlan, Groupable } from '../timeline'\nimport {\n type AnimationId,\n AnimationNode,\n type ExtractAnimationNode,\n} from './base'\nimport { SegmentNode } from './segment'\n\nexport type CompositionChildren = readonly AnimationNode<Groupable>[]\nexport type CompositionPlan<Children extends CompositionChildren> =\n ExecutionPlan<ExtractAnimationNode<Children[number]>>\n\n/**\n * Composition animation\n */\nexport abstract class CompositionNode<\n const Children extends CompositionChildren,\n> extends AnimationNode<ExtractAnimationNode<Children[number]>> {\n /**\n * Composition children nodes.\n */\n public readonly children: Children\n\n constructor(children: Children, timing?: TimingFunction, id?: AnimationId) {\n super(id)\n\n const parentTiming: TimingFunction =\n timing ?? new LinearTimingFunction()\n\n const adjustTiming = <T extends CompositionChildren>(\n children: T\n ): T => {\n return children.map((child) => {\n if (\n child instanceof SegmentNode &&\n // child timing none >> override to parent\n child.props.timing === undefined &&\n timing\n ) {\n return new SegmentNode(\n {\n ...child.props,\n timing: parentTiming,\n },\n child.id\n )\n }\n\n if (child instanceof CompositionNode) {\n // @ts-ignore\n child.children = adjustTiming(child.children)\n return child\n }\n\n return child\n }) as unknown as T\n }\n\n const timingOverridingChildren = adjustTiming(children)\n this.children = timingOverridingChildren\n }\n}\n","import type { AnimationId } from './base'\nimport { SegmentNode } from './segment'\n\ntype PreserveRecord = Record<string, any>\n\n/**\n * Creates a pause in an animation sequence.\n * @param duration The duration of the delay in seconds.\n * @param id Optional ID for the node.\n */\nexport function delay(\n duration: number,\n id?: AnimationId\n): SegmentNode<PreserveRecord> {\n return new SegmentNode<PreserveRecord>({ to: {}, duration }, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { Groupable } from '../timeline'\nimport type { AnimationId, AnimationNode } from './base'\nimport { CompositionNode, type CompositionPlan } from './composition'\n\n/**\n * Composition node that repeats a child animation node a specified number of times.\n */\nexport class LoopNode<G extends Groupable> extends CompositionNode<\n readonly AnimationNode<G>[]\n> {\n readonly type = 'LOOP'\n readonly duration: number\n readonly count: number\n readonly child: AnimationNode<G>\n\n constructor(\n child: AnimationNode<G>,\n loopCount: number,\n timing?: TimingFunction,\n id?: AnimationId\n ) {\n super([child], timing, id)\n this.child = child\n this.count = loopCount\n this.duration = child.duration * loopCount\n }\n\n public construct(\n plan: CompositionPlan<readonly AnimationNode<G>[]>,\n startTime: number\n ): void {\n let currentTime = startTime\n for (let i = 0; i < this.count; i++) {\n this.child.construct(plan, currentTime)\n currentTime += this.child.duration\n }\n }\n}\n\n/**\n * Repeats a child animation node a specified number of times.\n * @param child The animation node to repeat.\n * @param loopCount The number of times to repeat the child node.\n * @param timing loop timing function.\n * @param id Optional ID for the node.\n */\nexport function loop<G extends Groupable>(\n child: AnimationNode<G>,\n loopCount: number,\n timing?: TimingFunction,\n id?: AnimationId\n): LoopNode<G> {\n return new LoopNode(child, loopCount, timing, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { Groupable, GroupableRecord } from '../timeline'\nimport type { AnimationId, AnimationNode } from './base'\nimport {\n type CompositionChildren,\n CompositionNode,\n type CompositionPlan,\n} from './composition'\nimport { SegmentNode } from './segment'\n\n/**\n * Composition node that runs all of its children at the same time.\n */\nexport class ParallelNode<\n const Children extends CompositionChildren,\n> extends CompositionNode<Children> {\n readonly type = 'PARALLEL'\n readonly duration: number\n\n constructor(children: Children, timing?: TimingFunction, id?: AnimationId) {\n // Handle object property conflicts\n const seenProperty = new Set<string>()\n const resolvedChildren: AnimationNode<Groupable>[] = []\n\n for (const child of [...children].reverse()) {\n if (child instanceof SegmentNode) {\n const segment = child as SegmentNode<Groupable>\n const propsTo = segment.props.to\n\n // record shape\n if (propsTo && !Array.isArray(propsTo)) {\n const propsToAnimate = Object.keys(propsTo)\n const finalConstructedTo: Record<string, number> = {}\n let handledCount = 0\n\n for (const propKey of propsToAnimate) {\n if (!seenProperty.has(propKey)) {\n finalConstructedTo[propKey] = (\n propsTo as Record<string, number>\n )[propKey]!\n seenProperty.add(propKey)\n handledCount++\n }\n }\n\n if (handledCount > 0) {\n const newSegment = new SegmentNode<Groupable>(\n {\n ...segment.props,\n to: finalConstructedTo as GroupableRecord,\n },\n segment.id\n )\n resolvedChildren.push(newSegment)\n }\n continue // Go to next child\n }\n }\n\n // Non-conflicts\n resolvedChildren.push(child)\n }\n\n resolvedChildren.reverse()\n\n super(resolvedChildren as unknown as Children, timing, id)\n\n this.duration = Math.max(0, ...children.map((child) => child.duration))\n }\n\n public construct(plan: CompositionPlan<Children>, startTime: number): void {\n for (const child of this.children) {\n child.construct(plan, startTime)\n }\n }\n}\n\n/**\n * Parallel composition animation\n */\nexport function parallel<const Children extends CompositionChildren>(\n children: Children,\n timing?: TimingFunction,\n id?: AnimationId\n): ParallelNode<Children> {\n return new ParallelNode(children, timing, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { AnimationId } from './base'\nimport {\n type CompositionChildren,\n CompositionNode,\n type CompositionPlan,\n} from './composition'\n\n/**\n * Composition node that runs its children one after another.\n */\nexport class SequenceNode<\n const Children extends CompositionChildren,\n> extends CompositionNode<Children> {\n readonly type = 'SEQUENCE'\n readonly duration: number\n\n constructor(children: Children, timing?: TimingFunction, id?: AnimationId) {\n super(children, timing, id)\n this.duration = children.reduce((sum, child) => sum + child.duration, 0)\n }\n\n public construct(plan: CompositionPlan<Children>, startTime: number): void {\n let currentTime = startTime\n for (const child of this.children) {\n child.construct(plan, currentTime)\n currentTime += child.duration\n }\n }\n}\n\n/**\n * Sequence composition animation\n */\nexport function sequence<const Children extends CompositionChildren>(\n children: Children,\n timing?: TimingFunction,\n id?: AnimationId\n): SequenceNode<Children> {\n return new SequenceNode(children, timing, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { AnimationId } from './base'\nimport {\n type CompositionChildren,\n CompositionNode,\n type CompositionPlan,\n} from './composition'\n\ninterface StaggerNodeProps {\n offset: number\n timing?: TimingFunction\n}\n/**\n * Composition node that runs its children with a fixed delay between each start time.\n */\nexport class StaggerNode<\n const Children extends CompositionChildren,\n> extends CompositionNode<Children> {\n readonly type = 'STAGGER'\n readonly duration: number\n readonly offset: number\n\n constructor(children: Children, props: StaggerNodeProps, id?: AnimationId) {\n super(children, props?.timing, id)\n\n this.offset = props.offset\n\n if (children.length === 0) {\n this.duration = 0\n } else {\n const lastChild = children[children.length - 1]!\n this.duration =\n (children.length - 1) * this.offset + lastChild.duration\n }\n }\n\n public construct(plan: CompositionPlan<Children>, startTime: number): void {\n let currentTime = startTime\n for (const child of this.children) {\n child.construct(plan, currentTime)\n currentTime += this.offset\n }\n }\n}\n\n/**\n * Stagger composition animation\n */\nexport function stagger<const Children extends CompositionChildren>(\n children: Children,\n props: StaggerNodeProps,\n id?: AnimationId\n): StaggerNode<Children> {\n return new StaggerNode(children, props, id)\n}\n","export interface Animatable {\n /**\n * Update animation based on dt\n * @param dt delta time\n */\n update(dt: number): void\n}\n\n/**\n * Animation clock interface, can be user-injected.\n */\nexport interface AnimationClockInterface {\n subscribe(animatable: Animatable): void\n unsubscribe(animatable: Animatable): void\n}\n\nexport class AnimationClock implements AnimationClockInterface {\n private subscribers: Set<Animatable> = new Set()\n private animationFrameId: number | null = null\n private lastTimestamp: number = 0\n private maxDeltaTime: number\n\n protected static clock: AnimationClock\n /**\n * Crete new clock(singleton)\n * @param maxDeltaTime default maxDt = 100ms\n * @returns clock\n */\n public static create(maxDeltaTime: number = 1 / 10): AnimationClock {\n AnimationClock.clock = new AnimationClock(maxDeltaTime)\n return AnimationClock.clock\n }\n private constructor(maxDeltaTime: number) {\n this.maxDeltaTime = maxDeltaTime\n }\n\n public subscribe(animatable: Animatable): void {\n this.subscribers.add(animatable)\n if (!this.animationFrameId) {\n this.start()\n }\n }\n\n public unsubscribe(animatable: Animatable): void {\n this.subscribers.delete(animatable)\n if (this.subscribers.size === 0) {\n this.stop()\n }\n }\n\n private start(): void {\n this.lastTimestamp = performance.now()\n this.animationFrameId = window.requestAnimationFrame(this.tick)\n }\n\n private stop(): void {\n if (this.animationFrameId) {\n window.cancelAnimationFrame(this.animationFrameId)\n this.animationFrameId = null\n }\n }\n\n private tick = (timestamp: number): void => {\n if (!this.animationFrameId) return\n\n const MS = 1000 as const\n let dt = (timestamp - this.lastTimestamp) / MS\n this.lastTimestamp = timestamp\n\n // prevent large jumps or negatives\n if (dt < 0) dt = 0\n if (dt > this.maxDeltaTime) {\n dt = this.maxDeltaTime\n }\n\n for (const subscriber of this.subscribers) {\n subscriber.update(dt)\n }\n\n this.animationFrameId = window.requestAnimationFrame(this.tick)\n }\n}\n","export function isEndOfAnimation(\n currentT: number,\n duration: number,\n tolerance: number = 1e-3\n): boolean {\n return currentT === duration || currentT - duration >= tolerance\n}\n","import type { TimingFunction } from '~/timing'\nimport { isEndOfAnimation } from '~/utils/time'\nimport type { Groupable, GroupableRecord } from './timeline'\n\nexport type AnimePrimitive = readonly number[]\n\nexport interface SegmentDefinition {\n from: AnimePrimitive\n to: AnimePrimitive\n duration: number\n timing: SegmentTiming\n}\n\nexport type SegmentTiming<G extends Groupable = Groupable> =\n G extends AnimePrimitive\n ? readonly TimingFunction[] | TimingFunction\n : G extends GroupableRecord\n ? Record<keyof G, TimingFunction> | TimingFunction\n : never\n\nexport interface SegmentState {\n values: AnimePrimitive\n isComplete: boolean\n}\n\n/**\n * Calculates the animated values for a single segment at a specific local time.\n *\n * @param localTime Time elapsed within this specific segment (from 0 to duration).\n * @param segmentDef Target segment def\n * @parma dt Delta time\n * @returns Calculated values and whether the segment is complete.\n */\nexport function calculateSegmentState(\n localTime: number,\n segmentDef: SegmentDefinition,\n dt: number = 0\n): SegmentState {\n const t = Math.max(0, Math.min(localTime, segmentDef.duration))\n\n const animeValues: Array<number> = []\n let allComplete = true\n\n const isMultipleTiming = Array.isArray(segmentDef.timing)\n\n if (\n isMultipleTiming &&\n (segmentDef.timing as Array<TimingFunction>).length !==\n segmentDef.from.length\n ) {\n throw new TypeError(\n `[calculateSegmentState] timing does not correctly set. It requires multiple timing for ${segmentDef.from}, but received ${segmentDef.timing}`\n )\n }\n\n for (let i = 0; i < segmentDef.from.length; i++) {\n const timingFunction: TimingFunction = isMultipleTiming\n ? (segmentDef.timing as TimingFunction[])[i]!\n : (segmentDef.timing as TimingFunction)\n\n const animeResponse = timingFunction.step(t, {\n dt: dt,\n from: segmentDef.from[i]!,\n to: segmentDef.to[i]!,\n duration: segmentDef.duration,\n })\n\n animeValues.push(animeResponse.value)\n if (!animeResponse.endOfAnimation) {\n allComplete = false\n }\n }\n\n return {\n values: animeValues,\n isComplete: allComplete || isEndOfAnimation(t, segmentDef.duration),\n }\n}\n","import {\n type Animatable,\n AnimationClock,\n type AnimationClockInterface,\n} from '~/loop'\nimport type { Resolver, StylesheetSupportedLiteral } from '~/style'\nimport { TimingFunction } from '~/timing'\nimport { isEndOfAnimation } from '~/utils/time'\nimport type {\n Prettify,\n UnionToIntersection,\n WithLiteral,\n WithLiteralRecord,\n} from '~/utils/types'\nimport {\n type AnimePrimitive,\n calculateSegmentState,\n type SegmentDefinition,\n} from './engine'\nimport { type AnimationNode, SegmentNode, type SegmentNodeProps } from './nodes'\n\n/**\n * Animatable target values\n */\nexport type Groupable = AnimePrimitive | GroupableRecord\n\nexport type GroupableRecordKey = WithLiteral<StylesheetSupportedLiteral>\n\nexport type GroupableRecord = WithLiteralRecord<\n GroupableRecordKey,\n AnimePrimitive[number]\n>\n\nexport type AniGroup<G extends Groupable> = Prettify<UnionToIntersection<G>>\n\nexport interface ExecutionSegment<G extends Groupable> {\n /**\n * Execution segment node\n */\n node: SegmentNode<G>\n /**\n * Animation start time\n */\n startTime: number\n /**\n * Animation end time\n */\n endTime: number\n}\n\nexport type ExecutionPlan<G extends Groupable> = Array<ExecutionSegment<G>>\n\ntype TimelineStatus = 'IDLE' | 'PLAYING' | 'PAUSED' | 'ENDED'\nexport type OnUpdateCallback<G extends Groupable> = (current: {\n state: AniGroup<G>\n status: TimelineStatus\n}) => void\n\ntype ShouldKeepSymbol = 'keep'\ntype Keyframe<G extends Groupable> = Array<G | ShouldKeepSymbol>\ntype Duration = Array<number | ShouldKeepSymbol>\n\nexport interface TimelineStartingConfig<G extends Groupable, Ctx = any> {\n /**\n * Starting dynamic value.\n */\n from: AniGroup<G>\n /**\n * Dynamic `from` values, if passed `keep` for specific index, keep original timeline config.\n */\n keyframes?: Keyframe<G>\n /**\n * Dynamic `duration` values, if passed `keep` for specific index, keep original timeline config.\n */\n durations?: Duration\n /**\n * Custom context definition during animation cycle.\n */\n context?: Ctx\n /**\n * Animation repeat count.\n *\n * - if `Infinity` goes infinity repeat\n */\n repeat?: number\n\n /**\n * Initial delay before animation starts.\n *\n * - unit = `MS`\n */\n delay?: number\n\n /**\n * Custom style property resolver.\n *\n * @example\n * ```ts\n * const timeline = a.timeline(...)\n * timeline.play({\n * propertyResolver: {\n * 'px': (pxValue) => { key: `top`, value: `${pxValue}px` }\n * }\n * })\n * ```\n */\n propertyResolver?: G extends AnimePrimitive ? never : Resolver<G>\n}\n\n/**\n * Public timeline controller\n */\nexport interface TimelineController<G extends Groupable, Ctx = any> {\n /**\n * Play timeline\n * @param config Timeline starting configuration\n * @param canBeIntercepted if `true`, will play animation again even if already PLAYING.\n */\n play(\n config: TimelineStartingConfig<G, Ctx>,\n canBeIntercepted?: boolean\n ): void\n /**\n * Pause timeline\n */\n pause(): void\n /**\n * Resume timeline\n */\n resume(): void\n /**\n * Seek to target time\n * @param time\n */\n seek(time: number): void\n /**\n * Reset timeline\n */\n reset(): void\n}\n\nexport class Timeline<G extends Groupable, Ctx = any>\n implements TimelineController<G, Ctx>, Animatable\n{\n public readonly duration: number\n\n private readonly _baseExecutionPlan: ExecutionPlan<G>\n private _currentExecutionPlan: ExecutionPlan<G> | null = null\n\n private readonly _clock: AnimationClockInterface\n\n private _masterTime = 0\n\n private _delay = 0\n\n private _status: TimelineStatus = 'IDLE'\n private _currentConfig: TimelineStartingConfig<G, Ctx> | null = null\n /**\n * Current animation running config.\n */\n public get currentConfig() {\n return this._currentConfig\n }\n\n private _state: AnimePrimitive = []\n private _initialState: AnimePrimitive = []\n\n private _repeatCount: number = 0\n\n private _propertyKeyMap: Map<string, number> | null = null\n private _segmentStartStates = new Map<number, AnimePrimitive>()\n\n private _onUpdateCallbacks = new Set<OnUpdateCallback<G>>()\n\n constructor(\n /**\n * Animation construction root node.\n */\n protected readonly rootNode: AnimationNode<G>,\n clock?: AnimationClockInterface\n ) {\n this.duration = rootNode.duration\n this._baseExecutionPlan = this._constructExecutionPlan(rootNode)\n\n // default clock\n this._clock = clock ?? AnimationClock.create()\n\n // binding\n this.play.bind(this)\n this.pause.bind(this)\n this.seek.bind(this)\n this.resume.bind(this)\n this.reset.bind(this)\n }\n\n /**\n * Resolves a Group (like {x, y}) into keys and values.\n */\n private _resolveGroup(group: G): {\n keyMap: Map<string, number> | null\n values: AnimePrimitive\n } {\n if (Array.isArray(group)) {\n return { keyMap: null, values: group }\n }\n const keyMap = new Map(Object.keys(group).map((key, i) => [key, i]))\n const values = Object.values(group) as AnimePrimitive\n return { keyMap, values }\n }\n\n /**\n * Resolves the internal state (a number array) back into Group.\n */\n private _resolveStateToGroup(state: AnimePrimitive): AniGroup<G> {\n if (!this._propertyKeyMap) {\n return state as unknown as AniGroup<G>\n }\n const group = {} as Record<string, number>\n\n let i = 0\n for (const key of this._propertyKeyMap.keys()) {\n group[key] = state[i]!\n i++\n }\n return group as AniGroup<G>\n }\n\n /**\n * Compile animation execution plan\n */\n private _constructExecutionPlan(\n rootNode: AnimationNode<G>\n ): ExecutionPlan<G> {\n const plan: ExecutionPlan<G> = []\n rootNode.construct(plan, 0)\n return plan\n }\n\n /**\n * Calculates the exact state of the animation at point.\n */\n private _calculateStateAtTime(\n targetTime: number,\n dt: number = 0\n ): AnimePrimitive {\n if (this._initialState.length === 0 || !this._currentExecutionPlan) {\n return []\n }\n\n const nextState: Array<number> = [...this._initialState]\n let stateAtLastStartTime: Array<number> = [...this._initialState]\n\n for (const segment of this._currentExecutionPlan) {\n // Only for activated animation segment\n if (targetTime < segment.startTime) {\n continue\n }\n\n if (!segment.node.props.timing) {\n throw new Error(\n `[Timeline] timing should be provided. Please specify timing using a.timing.(...). Check target segment: ${JSON.stringify(segment, null, 2)}.`,\n { cause: segment }\n )\n }\n\n // Use the state before this segment for \"from\" calculation\n stateAtLastStartTime = [...nextState]\n\n const { keyMap, values: toValues } = this._resolveGroup(\n segment.node.props.to\n )\n const isRecordAni: boolean =\n this._propertyKeyMap !== null && keyMap !== null\n\n // From value calculations\n let fromValues: Array<number> = []\n const timings: Array<TimingFunction> = []\n const t = segment.node.props.timing\n const isRecordTiming: boolean = t && !(t instanceof TimingFunction)\n\n if (isRecordAni) {\n for (const key of keyMap!.keys()) {\n const index = this._propertyKeyMap!.get(key)!\n fromValues.push(stateAtLastStartTime[index]!)\n if (isRecordTiming) {\n timings.push(\n (t as Record<string, TimingFunction>)[key]!\n )\n }\n }\n } else {\n fromValues = stateAtLastStartTime\n }\n\n let finalAnimeValues: AnimePrimitive = []\n\n const localTime = targetTime - segment.startTime\n\n const segmentDef: SegmentDefinition = {\n from: fromValues,\n to: toValues,\n duration: segment.node.duration,\n timing: isRecordAni && isRecordTiming ? timings : t,\n }\n\n const segmentState = calculateSegmentState(\n localTime,\n segmentDef,\n dt\n )\n\n if (segmentState.isComplete) {\n finalAnimeValues = toValues // End target\n } else {\n finalAnimeValues = segmentState.values // Calculated current target\n }\n\n // Update next state\n if (isRecordAni) {\n // Record ani\n let i = 0\n for (const key of keyMap!.keys()) {\n const stateIndex = this._propertyKeyMap!.get(key)!\n if (stateIndex === -1) {\n continue\n }\n nextState[stateIndex] = finalAnimeValues[i]!\n i++\n }\n } else {\n // Array ani\n for (let i = 0; i < finalAnimeValues.length; i++) {\n nextState[i] = finalAnimeValues[i]!\n }\n }\n }\n\n return nextState\n }\n\n private _resolveExecutionPlan(\n keyframes?: Keyframe<G>,\n durations?: Duration\n ): ExecutionPlan<G> {\n if (!keyframes && !durations) {\n return [...this._baseExecutionPlan]\n }\n\n const segmentNodes = this._baseExecutionPlan.filter(\n (segment) => segment.node.type === 'SEGMENT'\n )\n const segLength = segmentNodes.length\n\n if (keyframes && keyframes.length !== segLength) {\n throw new Error(\n `Timeline keyframe mismatch: Expected ${segLength} keyframes, but received ${keyframes.length}.`\n )\n }\n if (durations && durations.length !== segLength) {\n throw new Error(\n `Timeline keyframe mismatch: Expected ${segLength} durations, but received ${durations.length}.`\n )\n }\n\n const newPlan: ExecutionPlan<G> = []\n\n let keyframeIndex = 0\n\n // Create dynamic to keyframes based plans\n for (const segment of this._baseExecutionPlan) {\n if (segment.node.type === 'SEGMENT') {\n const dynamicTo = keyframes?.[keyframeIndex]\n const dynamicDuration = durations?.[keyframeIndex]\n\n const newSegmentProps: SegmentNodeProps<G> = {\n ...segment.node.props,\n\n // >> dynamic to\n ...(dynamicTo && {\n to:\n dynamicTo === 'keep'\n ? segment.node.props.to\n : dynamicTo,\n }),\n\n // >> dynamic duration\n ...(dynamicDuration && {\n duration:\n dynamicDuration === 'keep'\n ? segment.node.props.duration\n : dynamicDuration,\n }),\n }\n\n const newSegment = new SegmentNode(\n newSegmentProps,\n segment.node.id\n )\n newPlan.push({ ...segment, node: newSegment })\n keyframeIndex++\n } else {\n // non-segment nodes\n newPlan.push({ ...segment })\n }\n }\n\n return newPlan\n }\n\n private notify(): void {\n for (const subscriber of this._onUpdateCallbacks) {\n subscriber({\n state: this._resolveStateToGroup(this._state),\n status: this._status,\n })\n }\n }\n\n public play(\n config: TimelineStartingConfig<G, Ctx>,\n canBeIntercepted: boolean = true\n ): void {\n if (this._status === 'PLAYING' && !canBeIntercepted) {\n return\n }\n\n const isRepeating =\n this._currentConfig?.repeat && this._currentConfig?.repeat >= 1\n const savedRepeatCount = isRepeating ? this._repeatCount : 0\n\n // can be intercepted -> reset\n this.reset(false)\n // recover repeat count\n this._repeatCount = savedRepeatCount\n\n // repeat exceed -> reset repeat\n if (isRepeating && this._repeatCount >= config.repeat!) {\n this._repeatCount = 0\n return\n }\n\n // update current config\n this._currentConfig = config\n\n if (this._repeatCount === 0) {\n this._delay = (this._currentConfig.delay ?? 0) * 1e-3 // MS\n }\n\n this._currentExecutionPlan = this._resolveExecutionPlan(\n config.keyframes,\n config.durations\n )\n\n const { keyMap: keys, values } = this._resolveGroup(config.from as G)\n this._propertyKeyMap = keys\n this._state = values\n this._initialState = values\n\n this._status = 'PLAYING'\n this._clock.subscribe(this)\n this.notify()\n }\n\n public pause(): void {\n this._status = 'PAUSED'\n this._clock.unsubscribe(this)\n }\n\n public resume(): void {\n if (this._status !== 'PAUSED') return\n this._status = 'PLAYING'\n this._clock.subscribe(this)\n }\n\n public reset(notify: boolean = true): void {\n this._status = 'IDLE'\n\n this._currentConfig = null\n\n this._masterTime = 0\n this._delay = 0\n\n this._state = []\n this._initialState = []\n\n this._propertyKeyMap = null\n\n this._segmentStartStates.clear()\n this._currentExecutionPlan = null\n\n this._clock.unsubscribe(this)\n\n this._repeatCount = 0\n\n if (notify) {\n this.notify()\n }\n }\n\n public seek(targetTime: number): void {\n if (this._status === 'PLAYING' || this._status === 'ENDED') {\n this.pause()\n }\n const seekTime = Math.max(0, Math.min(targetTime, this.duration))\n\n this._masterTime = seekTime\n this._state = this._calculateStateAtTime(seekTime, 0)\n\n this.notify()\n }\n\n public getCurrentValue(): AniGroup<G> | null {\n if (this._state.length === 0) return null\n return this._resolveStateToGroup(this._state)\n }\n\n public onUpdate(callback: OnUpdateCallback<G>): () => void {\n this._onUpdateCallbacks.add(callback)\n return () => {\n this._onUpdateCallbacks.delete(callback)\n }\n }\n\n update(dt: number): void {\n if (this._status !== 'PLAYING') {\n return\n }\n\n if (this._delay > 0) {\n this._delay -= dt\n if (this._delay < 0) {\n dt = -this._delay\n this._delay = 0\n } else {\n return\n }\n }\n\n this._masterTime += dt\n if (this._masterTime >= this.duration) {\n this._masterTime = this.duration\n }\n\n this._state = this._calculateStateAtTime(this._masterTime, dt)\n this.notify()\n\n if (isEndOfAnimation(this._masterTime, this.duration)) {\n // repeat update\n this._repeatCount += 1\n\n if (!this._currentConfig) {\n throw new Error(\n `[Timeline] currentConfig can not be null when update(dt)`\n )\n }\n\n // no-repeat -> ended(don't have to reset)\n const noRepeat = (this._currentConfig.repeat ?? 0) === 0\n\n if (noRepeat) {\n this._status = 'ENDED'\n this._clock.unsubscribe(this)\n this.notify()\n } else {\n this.play(this._currentConfig)\n }\n }\n }\n}\n\nexport function timeline<G extends Groupable, Ctx = any>(\n rootNode: AnimationNode<G>,\n clock?: AnimationClockInterface\n): Timeline<G, Ctx> {\n return new Timeline<G, Ctx>(rootNode, clock)\n}\n","import type { AnimationClockInterface } from '~/loop'\nimport type { AnimationNode, ExtractAnimationNode } from './nodes'\nimport {\n type AniGroup,\n type Groupable,\n type Timeline,\n type TimelineStartingConfig,\n timeline,\n} from './timeline'\n\nexport type AnimationStateShape = Record<string, AnimationNode<Groupable>>\n\nexport type GetTimeline<State extends AnimationStateShape> = Timeline<\n ExtractAnimationNode<State[keyof State]>,\n any\n>\n\nexport interface StateController<AnimationStates extends AnimationStateShape> {\n /**\n * Get current timeline.\n */\n timeline: () => GetTimeline<AnimationStates>\n\n /**\n * Transition timeline animation into another state.\n * @param newState transition target.\n *\n * @param timelineConfig animation play config.\n * @param canBeIntercepted animation canBeIntercepted config.\n */\n transitionTo(\n newState: keyof AnimationStates,\n timelineConfig?: TimelineStartingConfig<\n ExtractAnimationNode<AnimationStates[keyof AnimationStates]>,\n any\n >,\n canBeIntercepted?: boolean\n ): void\n\n /**\n * Subscribe to timeline changes.\n * @param callback\n * @returns unsubscribe function\n */\n onTimelineChange(\n callback: (newTimeline: GetTimeline<AnimationStates>) => void\n ): () => void\n}\n\nexport interface StateProps<AnimationStates extends AnimationStateShape> {\n /**\n * Initial animation target state.\n */\n initial: keyof AnimationStates\n /**\n * Initial animation `from` value.\n */\n initialFrom: AniGroup<\n ExtractAnimationNode<AnimationStates[keyof AnimationStates]>\n >\n /**\n * Animating target states.\n */\n states: AnimationStates\n /**\n * Custom timeline clock\n */\n clock?: AnimationClockInterface\n}\n\n/**\n * Creates a state machine controller for managing animations.\n *\n * @param config - The configuration for the state machine.\n * @param clock - Optional custom animation clock.\n * @returns A controller for managing the animation states.\n */\nexport function createStates<AnimationStates extends AnimationStateShape>(\n config: StateProps<AnimationStates>\n): StateController<AnimationStates> {\n let State: keyof AnimationStates = config.initial\n let Timeline: Timeline<Groupable> = timeline(\n config.states[State]!,\n config.clock\n )\n\n const subs = new Set<(newTimeline: GetTimeline<AnimationStates>) => void>()\n const notify = (timeline: GetTimeline<AnimationStates>) => {\n for (const Sub of subs) {\n Sub(timeline)\n }\n }\n\n return {\n timeline: () => Timeline as unknown as GetTimeline<AnimationStates>,\n onTimelineChange(callback) {\n subs.add(callback)\n return () => subs.delete(callback)\n },\n transitionTo(newState, timelineConfig, canBeIntercepted) {\n // keep current timeline\n if (!config.states[newState] || State === newState) {\n return\n }\n\n // new timeline\n const from = (timelineConfig?.from ?? // 1. config\n Timeline.getCurrentValue() ?? // 2. last value\n config.initialFrom) as TimelineStartingConfig<Groupable>['from'] // 3. initial value\n\n State = newState\n Timeline = timeline(config.states[State]!, config.clock)\n notify(Timeline as unknown as GetTimeline<AnimationStates>)\n\n Timeline.play(\n {\n ...timelineConfig,\n from,\n },\n canBeIntercepted\n )\n },\n }\n}\n","import type { Capitalize, PartialRecord, WithPrefix } from '~/utils/types'\n\nexport type EventHandler<\n AnimationContext = any,\n EvtKeys extends EventKey = EventKey,\n> = (\n animationContext: AnimationContext,\n ev: HTMLElementEventMap[EvtKeys]\n) => any\n\nexport type EventHandlerRegistration<\n AnimationContext = any,\n Keys extends EventKey = EventKey,\n> = PartialRecord<\n WithPrefix<'on', Capitalize<Keys>>,\n EventHandler<AnimationContext, Keys>\n>\n\nexport type EventKey = keyof HTMLElementEventMap\nexport class EventManager<\n SupportedEventList extends readonly EventKey[] = EventKey[],\n AnimationContext = any,\n> {\n public constructor(public readonly supportedEvents: SupportedEventList) {}\n\n private _element: HTMLElement | null = null\n public get targetElement(): HTMLElement {\n if (!this._element) throw new Error('EventManger, bind element first')\n return this._element\n }\n\n private _animeGetter: (() => AnimationContext) | null = null\n public get animeGetter(): () => AnimationContext {\n if (!this._animeGetter)\n throw new Error('EventManager, animeGetter should be provided')\n return this._animeGetter\n }\n public setAnimeGetter = (animeGetter: () => AnimationContext) => {\n this._animeGetter = animeGetter\n }\n\n private eventMap: Map<\n string,\n (e: HTMLElementEventMap[SupportedEventList[number]]) => void\n > = new Map()\n\n private withAnimeValue = (\n listener: EventHandler<AnimationContext, SupportedEventList[number]>\n ): ((e: HTMLElementEventMap[SupportedEventList[number]]) => void) => {\n const withAnime = (\n e: HTMLElementEventMap[SupportedEventList[number]]\n ) => {\n listener(this.animeGetter(), e)\n }\n return withAnime\n }\n\n public add = <const EventName extends SupportedEventList[number]>(\n eventName: EventName,\n listener: EventHandler<AnimationContext, SupportedEventList[number]>,\n options?: boolean | AddEventListenerOptions\n ) => {\n const withAnime = this.withAnimeValue(listener)\n this.eventMap.set(eventName, withAnime)\n this.targetElement.addEventListener<EventName>(\n eventName,\n this.eventMap.get(eventName)!,\n options\n )\n }\n\n public cleanupOne = <const EventName extends SupportedEventList[number]>(\n eventName: EventName\n ): boolean => {\n const removeListener = this.eventMap.get(eventName)\n if (!removeListener) return false\n\n this.targetElement.removeEventListener(eventName, removeListener)\n return true\n }\n\n public cleanupAll = (): boolean => {\n const clearResponse: Array<boolean> = []\n for (const evtName of this.eventMap.keys()) {\n const res = this.cleanupOne(evtName as SupportedEventList[number])\n clearResponse.push(res)\n }\n return clearResponse.some((t) => t === false) === false\n }\n\n /**\n * get pure `{event_name}`\n * @param key onX`{event_name}`\n */\n public static getEvtKey(key: string): EventKey {\n const removed = key.substring(2, key.length)\n const Capitalized = `${removed[0]!.toLowerCase()}${removed.substring(1, key.length)}`\n return Capitalized as EventKey\n }\n\n public attach = (\n handlers: EventHandlerRegistration<\n AnimationContext,\n SupportedEventList[number]\n >\n ): void => {\n Object.entries(handlers).forEach(([eventKey, handler]) => {\n this.add(\n EventManager.getEvtKey(eventKey),\n handler as EventHandler<\n AnimationContext,\n SupportedEventList[number]\n >\n )\n })\n }\n\n public bind(element: HTMLElement): void {\n this._element = element\n }\n}\n","const TransformFunctionMap = {\n // deg\n rotate: { fn: 'rotate', unit: 'deg' },\n rotateX: { fn: 'rotateX', unit: 'deg' },\n rotateY: { fn: 'rotateY', unit: 'deg' },\n rotateZ: { fn: 'rotateZ', unit: 'deg' },\n skew: { fn: 'skew', unit: 'deg' },\n skewX: { fn: 'skewX', unit: 'deg' },\n skewY: { fn: 'skewY', unit: 'deg' },\n // px\n translate: { fn: 'translate', unit: 'px' },\n translateX: { fn: 'translateX', unit: 'px' },\n translateY: { fn: 'translateY', unit: 'px' },\n translateZ: { fn: 'translateZ', unit: 'px' },\n // unitless\n scale: { fn: 'scale' },\n scaleX: { fn: 'scaleX' },\n scaleY: { fn: 'scaleY' },\n scaleZ: { fn: 'scaleZ' },\n} as const satisfies Record<string, { fn: string; unit?: string }>\n\ntype TransformPropertiesLiteral = keyof typeof TransformFunctionMap\n\nconst TransformProperties = new Set(Object.keys(TransformFunctionMap))\n\ntype PxPropertiesLiteral =\n | 'width'\n | 'height'\n | 'margin'\n | 'marginTop'\n | 'marginBottom'\n | 'marginLeft'\n | 'marginRight'\n | 'padding'\n | 'paddingTop'\n | 'paddingBottom'\n | 'paddingLeft'\n | 'paddingRight'\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'borderWidth'\n | 'borderRadius'\n\nconst PxProperties = new Set([\n 'width',\n 'height',\n 'margin',\n 'marginTop',\n 'marginBottom',\n 'marginLeft',\n 'marginRight',\n 'padding',\n 'paddingTop',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingRight',\n 'top',\n 'left',\n 'right',\n 'bottom',\n 'borderWidth',\n 'borderRadius',\n])\n\ntype UnitlessPropertiesLiteral =\n | 'opacity'\n | 'zIndex'\n | 'lineHeight'\n | 'fontWeight'\n\nconst UnitlessProperties = new Set([\n 'opacity',\n 'zIndex',\n 'lineHeight',\n 'fontWeight',\n])\n\nexport type StylesheetSupportedLiteral =\n | TransformPropertiesLiteral\n | PxPropertiesLiteral\n | UnitlessPropertiesLiteral\n\nexport type Resolver<T> = {\n [Key in keyof T]?: (target: T[keyof T]) => {\n key: string\n value: string | number\n }\n}\n\ntype StylesheetValueTarget = Record<string, number>\n\nexport function createStyleSheet(\n animeStyleValue: StylesheetValueTarget,\n resolver?: Resolver<StylesheetValueTarget>\n): Record<string, any> {\n const styleAccumulator: Record<string, any> = {}\n const CssTransformParts: Array<string> = []\n\n for (const key in animeStyleValue) {\n if (!Object.hasOwn(animeStyleValue, key)) {\n continue\n }\n const value = animeStyleValue[key]\n\n if (typeof value !== 'number') {\n continue\n }\n\n // Custom Resolver\n const styleResolver = resolver?.[key]\n if (styleResolver) {\n const { key: resolvedKey, value: resolvedValue } =\n styleResolver(value)\n\n styleAccumulator[resolvedKey] = resolvedValue\n continue\n }\n\n // Transform\n if (TransformProperties.has(key)) {\n const res = TransformFunctionMap[key as TransformPropertiesLiteral]\n\n const transformPart =\n 'unit' in res\n ? `${res.fn}(${value}${res.unit})`\n : `${res.fn}(${value})`\n\n CssTransformParts.push(transformPart)\n continue\n }\n\n // PX\n if (PxProperties.has(key)) {\n styleAccumulator[key] = `${value}px`\n continue\n }\n\n // Unitless\n if (UnitlessProperties.has(key)) {\n styleAccumulator[key] = value\n continue\n }\n\n // Fallback\n styleAccumulator[key] = value\n }\n\n // Combine Transform Syntax\n if (CssTransformParts.length > 0) {\n styleAccumulator['transform'] = CssTransformParts.join(' ')\n }\n\n return styleAccumulator\n}\n"],"mappings":"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","names":["a","children","Timeline","timeline"]}
package/dist/index.d.cts CHANGED
@@ -105,6 +105,20 @@ declare class SpringTimingFunction extends TimingFunction {
105
105
  };
106
106
  }
107
107
 
108
+ declare class DynamicSpringTimingFunction extends TimingFunction {
109
+ readonly opt: SpringTimingFunctionOpt;
110
+ constructor(opt: SpringTimingFunctionOpt);
111
+ private currentValue;
112
+ private currentVelocity;
113
+ private isInitialized;
114
+ init(startValue: number): void;
115
+ private getDerivatives;
116
+ step(_time: number, context: TimingFunctionContext): {
117
+ value: number;
118
+ endOfAnimation: boolean;
119
+ };
120
+ }
121
+
108
122
  /**
109
123
  * Core timing functions
110
124
  */
@@ -113,16 +127,20 @@ declare const T: {
113
127
  * Creates a new Bezier timing function instance.
114
128
  *
115
129
  * @param {Bezier.BezierTimingFunctionOpt} opt - Options for configuring the Bezier curve.
116
- * A new instance of BezierTimingFunction.
117
130
  */
118
131
  readonly bezier: (opt: BezierTimingFunctionOpt) => BezierTimingFunction;
119
132
  /**
120
133
  * Creates a new Spring timing function instance.
121
134
  *
122
- * @param {Spring.SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
123
- * A new instance of SpringTimingFunction.
135
+ * @param {SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
124
136
  */
125
137
  readonly spring: (opt: SpringTimingFunctionOpt) => SpringTimingFunction;
138
+ /**
139
+ * Creates a new Dynamic Spring timing function instance.
140
+ *
141
+ * @param SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
142
+ */
143
+ readonly dynamicSpring: (opt: SpringTimingFunctionOpt) => DynamicSpringTimingFunction;
126
144
  /**
127
145
  * Creates linear timing function instance.
128
146
  */
@@ -251,7 +269,7 @@ type WithLiteralRecord<Literal extends string, Value> = {
251
269
  };
252
270
 
253
271
  type AnimePrimitive = readonly number[];
254
- type SegmentTiming = TimingFunction | readonly TimingFunction[];
272
+ type SegmentTiming<G extends Groupable = Groupable> = G extends AnimePrimitive ? readonly TimingFunction[] | TimingFunction : G extends GroupableRecord ? Record<keyof G, TimingFunction> | TimingFunction : never;
255
273
 
256
274
  /**
257
275
  * Animatable target values
@@ -306,6 +324,12 @@ interface TimelineStartingConfig<G extends Groupable, Ctx = any> {
306
324
  * - if `Infinity` goes infinity repeat
307
325
  */
308
326
  repeat?: number;
327
+ /**
328
+ * Initial delay before animation starts.
329
+ *
330
+ * - unit = `MS`
331
+ */
332
+ delay?: number;
309
333
  /**
310
334
  * Custom style property resolver.
311
335
  *
@@ -359,6 +383,7 @@ declare class Timeline<G extends Groupable, Ctx = any> implements TimelineContro
359
383
  private _currentExecutionPlan;
360
384
  private readonly _clock;
361
385
  private _masterTime;
386
+ private _delay;
362
387
  private _status;
363
388
  private _currentConfig;
364
389
  /**
@@ -440,8 +465,8 @@ declare abstract class CompositionNode<const Children extends CompositionChildre
440
465
 
441
466
  interface SegmentNodeProps<G extends Groupable> {
442
467
  readonly to: G;
443
- readonly duration?: number;
444
- readonly timing?: SegmentTiming;
468
+ readonly duration: number;
469
+ readonly timing?: SegmentTiming<G>;
445
470
  }
446
471
  /**
447
472
  * Leaf node in the animation tree
@@ -638,6 +663,7 @@ declare const a: {
638
663
  readonly timing: {
639
664
  readonly bezier: (opt: BezierTimingFunctionOpt) => BezierTimingFunction;
640
665
  readonly spring: (opt: SpringTimingFunctionOpt) => SpringTimingFunction;
666
+ readonly dynamicSpring: (opt: SpringTimingFunctionOpt) => DynamicSpringTimingFunction;
641
667
  readonly linear: () => LinearTimingFunction;
642
668
  };
643
669
  readonly ani: typeof ani;
package/dist/index.d.ts CHANGED
@@ -105,6 +105,20 @@ declare class SpringTimingFunction extends TimingFunction {
105
105
  };
106
106
  }
107
107
 
108
+ declare class DynamicSpringTimingFunction extends TimingFunction {
109
+ readonly opt: SpringTimingFunctionOpt;
110
+ constructor(opt: SpringTimingFunctionOpt);
111
+ private currentValue;
112
+ private currentVelocity;
113
+ private isInitialized;
114
+ init(startValue: number): void;
115
+ private getDerivatives;
116
+ step(_time: number, context: TimingFunctionContext): {
117
+ value: number;
118
+ endOfAnimation: boolean;
119
+ };
120
+ }
121
+
108
122
  /**
109
123
  * Core timing functions
110
124
  */
@@ -113,16 +127,20 @@ declare const T: {
113
127
  * Creates a new Bezier timing function instance.
114
128
  *
115
129
  * @param {Bezier.BezierTimingFunctionOpt} opt - Options for configuring the Bezier curve.
116
- * A new instance of BezierTimingFunction.
117
130
  */
118
131
  readonly bezier: (opt: BezierTimingFunctionOpt) => BezierTimingFunction;
119
132
  /**
120
133
  * Creates a new Spring timing function instance.
121
134
  *
122
- * @param {Spring.SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
123
- * A new instance of SpringTimingFunction.
135
+ * @param {SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
124
136
  */
125
137
  readonly spring: (opt: SpringTimingFunctionOpt) => SpringTimingFunction;
138
+ /**
139
+ * Creates a new Dynamic Spring timing function instance.
140
+ *
141
+ * @param SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
142
+ */
143
+ readonly dynamicSpring: (opt: SpringTimingFunctionOpt) => DynamicSpringTimingFunction;
126
144
  /**
127
145
  * Creates linear timing function instance.
128
146
  */
@@ -251,7 +269,7 @@ type WithLiteralRecord<Literal extends string, Value> = {
251
269
  };
252
270
 
253
271
  type AnimePrimitive = readonly number[];
254
- type SegmentTiming = TimingFunction | readonly TimingFunction[];
272
+ type SegmentTiming<G extends Groupable = Groupable> = G extends AnimePrimitive ? readonly TimingFunction[] | TimingFunction : G extends GroupableRecord ? Record<keyof G, TimingFunction> | TimingFunction : never;
255
273
 
256
274
  /**
257
275
  * Animatable target values
@@ -306,6 +324,12 @@ interface TimelineStartingConfig<G extends Groupable, Ctx = any> {
306
324
  * - if `Infinity` goes infinity repeat
307
325
  */
308
326
  repeat?: number;
327
+ /**
328
+ * Initial delay before animation starts.
329
+ *
330
+ * - unit = `MS`
331
+ */
332
+ delay?: number;
309
333
  /**
310
334
  * Custom style property resolver.
311
335
  *
@@ -359,6 +383,7 @@ declare class Timeline<G extends Groupable, Ctx = any> implements TimelineContro
359
383
  private _currentExecutionPlan;
360
384
  private readonly _clock;
361
385
  private _masterTime;
386
+ private _delay;
362
387
  private _status;
363
388
  private _currentConfig;
364
389
  /**
@@ -440,8 +465,8 @@ declare abstract class CompositionNode<const Children extends CompositionChildre
440
465
 
441
466
  interface SegmentNodeProps<G extends Groupable> {
442
467
  readonly to: G;
443
- readonly duration?: number;
444
- readonly timing?: SegmentTiming;
468
+ readonly duration: number;
469
+ readonly timing?: SegmentTiming<G>;
445
470
  }
446
471
  /**
447
472
  * Leaf node in the animation tree
@@ -638,6 +663,7 @@ declare const a: {
638
663
  readonly timing: {
639
664
  readonly bezier: (opt: BezierTimingFunctionOpt) => BezierTimingFunction;
640
665
  readonly spring: (opt: SpringTimingFunctionOpt) => SpringTimingFunction;
666
+ readonly dynamicSpring: (opt: SpringTimingFunctionOpt) => DynamicSpringTimingFunction;
641
667
  readonly linear: () => LinearTimingFunction;
642
668
  };
643
669
  readonly ani: typeof ani;
package/dist/index.js CHANGED
@@ -64,6 +64,76 @@ var BezierTimingFunction = class extends TimingFunction {
64
64
  }
65
65
  };
66
66
 
67
+ // src/timing/dynamic_spring.ts
68
+ var DynamicSpringTimingFunction = class extends TimingFunction {
69
+ constructor(opt) {
70
+ super();
71
+ this.opt = opt;
72
+ this.currentValue = 0;
73
+ this.currentVelocity = 0;
74
+ this.isInitialized = false;
75
+ }
76
+ init(startValue) {
77
+ this.currentValue = startValue;
78
+ this.currentVelocity = 0;
79
+ this.isInitialized = true;
80
+ }
81
+ getDerivatives(state, to) {
82
+ const { m, k, c } = this.opt;
83
+ const displacement = state.x - to;
84
+ const a2 = (-k * displacement - c * state.v) / m;
85
+ return { dx: state.v, dv: a2 };
86
+ }
87
+ step(_time, context) {
88
+ if (!this.isInitialized) {
89
+ this.init(context.from);
90
+ }
91
+ const { to, tolerance, dt } = context;
92
+ if (dt === 0) {
93
+ return {
94
+ value: this.currentValue,
95
+ endOfAnimation: false
96
+ // Or check for end state
97
+ };
98
+ }
99
+ const x = this.currentValue;
100
+ const v = this.currentVelocity;
101
+ const k1 = this.getDerivatives({ x, v }, to);
102
+ const k2State = {
103
+ x: x + k1.dx * (dt / 2),
104
+ v: v + k1.dv * (dt / 2)
105
+ };
106
+ const k2 = this.getDerivatives(k2State, to);
107
+ const k3State = {
108
+ x: x + k2.dx * (dt / 2),
109
+ v: v + k2.dv * (dt / 2)
110
+ };
111
+ const k3 = this.getDerivatives(k3State, to);
112
+ const k4State = {
113
+ x: x + k3.dx * dt,
114
+ v: v + k3.dv * dt
115
+ };
116
+ const k4 = this.getDerivatives(k4State, to);
117
+ const avgDx = 1 / 6 * (k1.dx + 2 * k2.dx + 2 * k3.dx + k4.dx);
118
+ const avgDv = 1 / 6 * (k1.dv + 2 * k2.dv + 2 * k3.dv + k4.dv);
119
+ this.currentValue = x + avgDx * dt;
120
+ this.currentVelocity = v + avgDv * dt;
121
+ const tol = tolerance ?? 1e-3;
122
+ const displacement = this.currentValue - to;
123
+ const isMoving = Math.abs(this.currentVelocity) > tol;
124
+ const isDisplaced = Math.abs(displacement) > tol;
125
+ const endOfAnimation = !isMoving && !isDisplaced;
126
+ if (endOfAnimation) {
127
+ this.currentValue = to;
128
+ this.currentVelocity = 0;
129
+ }
130
+ return {
131
+ value: this.currentValue,
132
+ endOfAnimation
133
+ };
134
+ }
135
+ };
136
+
67
137
  // src/timing/spring.ts
68
138
  var SpringTimingFunction = class extends TimingFunction {
69
139
  constructor(opt) {
@@ -134,16 +204,20 @@ var T = {
134
204
  * Creates a new Bezier timing function instance.
135
205
  *
136
206
  * @param {Bezier.BezierTimingFunctionOpt} opt - Options for configuring the Bezier curve.
137
- * A new instance of BezierTimingFunction.
138
207
  */
139
208
  bezier: (opt) => new BezierTimingFunction(opt),
140
209
  /**
141
210
  * Creates a new Spring timing function instance.
142
211
  *
143
- * @param {Spring.SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
144
- * A new instance of SpringTimingFunction.
212
+ * @param {SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
145
213
  */
146
214
  spring: (opt) => new SpringTimingFunction(opt),
215
+ /**
216
+ * Creates a new Dynamic Spring timing function instance.
217
+ *
218
+ * @param SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.
219
+ */
220
+ dynamicSpring: (opt) => new DynamicSpringTimingFunction(opt),
147
221
  /**
148
222
  * Creates linear timing function instance.
149
223
  */
@@ -157,7 +231,7 @@ var SegmentNode = class extends AnimationNode {
157
231
  this.type = "SEGMENT";
158
232
  const nodeProps = {
159
233
  to: props.to,
160
- duration: props.duration ?? 0,
234
+ duration: props.duration,
161
235
  ...props.timing !== void 0 && { timing: props.timing }
162
236
  };
163
237
  this.props = nodeProps;
@@ -422,6 +496,7 @@ var Timeline = class {
422
496
  this.rootNode = rootNode;
423
497
  this._currentExecutionPlan = null;
424
498
  this._masterTime = 0;
499
+ this._delay = 0;
425
500
  this._status = "IDLE";
426
501
  this._currentConfig = null;
427
502
  this._state = [];
@@ -504,11 +579,18 @@ var Timeline = class {
504
579
  );
505
580
  const isRecordAni = this._propertyKeyMap !== null && keyMap !== null;
506
581
  let fromValues = [];
582
+ const timings = [];
583
+ const t = segment.node.props.timing;
584
+ const isRecordTiming = t && !(t instanceof TimingFunction);
507
585
  if (isRecordAni) {
508
586
  for (const key of keyMap.keys()) {
509
- fromValues.push(
510
- stateAtLastStartTime[this._propertyKeyMap.get(key)]
511
- );
587
+ const index = this._propertyKeyMap.get(key);
588
+ fromValues.push(stateAtLastStartTime[index]);
589
+ if (isRecordTiming) {
590
+ timings.push(
591
+ t[key]
592
+ );
593
+ }
512
594
  }
513
595
  } else {
514
596
  fromValues = stateAtLastStartTime;
@@ -519,7 +601,7 @@ var Timeline = class {
519
601
  from: fromValues,
520
602
  to: toValues,
521
603
  duration: segment.node.duration,
522
- timing: segment.node.props.timing
604
+ timing: isRecordAni && isRecordTiming ? timings : t
523
605
  };
524
606
  const segmentState = calculateSegmentState(
525
607
  localTime,
@@ -617,6 +699,9 @@ var Timeline = class {
617
699
  return;
618
700
  }
619
701
  this._currentConfig = config;
702
+ if (this._repeatCount === 0) {
703
+ this._delay = (this._currentConfig.delay ?? 0) * 1e-3;
704
+ }
620
705
  this._currentExecutionPlan = this._resolveExecutionPlan(
621
706
  config.keyframes,
622
707
  config.durations
@@ -627,7 +712,7 @@ var Timeline = class {
627
712
  this._initialState = values;
628
713
  this._status = "PLAYING";
629
714
  this._clock.subscribe(this);
630
- this.update(0);
715
+ this.notify();
631
716
  }
632
717
  pause() {
633
718
  this._status = "PAUSED";
@@ -642,6 +727,7 @@ var Timeline = class {
642
727
  this._status = "IDLE";
643
728
  this._currentConfig = null;
644
729
  this._masterTime = 0;
730
+ this._delay = 0;
645
731
  this._state = [];
646
732
  this._initialState = [];
647
733
  this._propertyKeyMap = null;
@@ -676,6 +762,15 @@ var Timeline = class {
676
762
  if (this._status !== "PLAYING") {
677
763
  return;
678
764
  }
765
+ if (this._delay > 0) {
766
+ this._delay -= dt;
767
+ if (this._delay < 0) {
768
+ dt = -this._delay;
769
+ this._delay = 0;
770
+ } else {
771
+ return;
772
+ }
773
+ }
679
774
  this._masterTime += dt;
680
775
  if (this._masterTime >= this.duration) {
681
776
  this._masterTime = this.duration;
@@ -938,3 +1033,4 @@ export {
938
1033
  stagger,
939
1034
  timeline
940
1035
  };
1036
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ani/nodes/base.ts","../src/timing/function.ts","../src/timing/linear.ts","../src/timing/bezier.ts","../src/timing/dynamic_spring.ts","../src/timing/spring.ts","../src/timing/index.ts","../src/ani/nodes/segment.ts","../src/ani/nodes/composition.ts","../src/ani/nodes/delay.ts","../src/ani/nodes/loop.ts","../src/ani/nodes/parallel.ts","../src/ani/nodes/sequence.ts","../src/ani/nodes/stagger.ts","../src/loop/clock.ts","../src/utils/time/is_end.ts","../src/ani/engine.ts","../src/ani/timeline.ts","../src/ani/states.ts","../src/event/manager.ts","../src/style/create_sheet.ts","../src/index.ts"],"sourcesContent":["import type { ExecutionPlan, Groupable } from '../timeline'\n\nexport type AnimationId = string\nexport type AnimationNodeType = string\nexport type AnimationDuration = number\n\n/**\n * Nodes in the animation tree\n */\nexport abstract class AnimationNode<G extends Groupable> {\n abstract readonly type: AnimationNodeType\n abstract readonly duration: AnimationDuration\n\n readonly id?: AnimationId\n\n constructor(id?: AnimationId) {\n if (id) {\n this.id = id\n }\n }\n\n /**\n * Constructs self node and its children into a flat execution plan.\n * @param plan Execution plans to which segments will be added.\n * @param startTime The absolute current start time for this node within the master timeline.\n */\n public abstract construct(plan: ExecutionPlan<G>, startTime: number): void\n}\n\nexport type ExtractAnimationNode<AnimeNode> = AnimeNode extends AnimationNode<\n infer Group\n>\n ? Group\n : never\n","export interface TimingFunctionContext {\n /**\n * delta t\n */\n dt: number\n /**\n * from value, initial position (`s(0)`)\n */\n from: number\n /**\n * to value, original position (`s(f)`)\n */\n to: number\n /**\n * animation duration, but it is not possible for specific functions\n */\n duration: number\n /**\n * animation end tolerance\n */\n tolerance?: number\n}\nexport abstract class TimingFunction {\n /**\n * Step function\n * @param time Current time\n * @param context Context for step calculation\n */\n public abstract step(\n time: number,\n context: TimingFunctionContext\n ): {\n value: number\n endOfAnimation: boolean\n }\n\n private static DEFAULT_TOLERANCE = 0.01 as const\n /**\n * Checks whether the animation has ended.\n *\n * @param time - The current time.\n * @param value - The computed value at the current time.\n * @param context - The animation context.\n * @returns {boolean} True if the animation is ended, false otherwise.\n */\n protected checkEnd(\n time: number,\n value: number,\n context: TimingFunctionContext,\n checkTimeOnly: boolean = true\n ): boolean {\n const tol =\n context.tolerance !== undefined\n ? context.tolerance\n : TimingFunction.DEFAULT_TOLERANCE\n const timeCondition = time >= context.duration\n const end = checkTimeOnly\n ? timeCondition\n : timeCondition && Math.abs(context.to - value) <= tol\n return end\n }\n}\n\nexport interface Coord {\n x: number\n y: number\n}\n","import { TimingFunction, type TimingFunctionContext } from './function'\n\nexport class LinearTimingFunction extends TimingFunction {\n public step(\n time: number,\n context: TimingFunctionContext\n ): { value: number; endOfAnimation: boolean } {\n const progress =\n context.duration === 0\n ? 1\n : Math.max(0, Math.min(time / context.duration, 1))\n\n const value = context.from + (context.to - context.from) * progress\n\n return { value, endOfAnimation: time >= context.duration }\n }\n}\n","/** biome-ignore-all lint/style/noMagicNumbers: <>*/\nimport {\n type Coord,\n TimingFunction,\n type TimingFunctionContext,\n} from './function'\n\nexport interface BezierTimingFunctionOpt {\n p2: Coord\n p3: Coord\n}\nexport class BezierTimingFunction extends TimingFunction {\n public constructor(public readonly opt: { p2: Coord; p3: Coord }) {\n super()\n }\n private readonly p1: Coord = {\n x: 0,\n y: 0,\n }\n private readonly p4: Coord = {\n x: 1,\n y: 1,\n }\n\n private _bezierFunction(t: number, duration?: number): number {\n const end: number = duration || this.p4.y\n return (\n (1 - t) ** 3 * this.p1.y +\n 3 * (1 - t) ** 2 * t * this.opt.p2.y +\n 3 * (1 - t) * t ** 2 * this.opt.p3.y +\n t ** 3 * end\n )\n }\n\n public step(\n time: number,\n context: TimingFunctionContext\n ): { value: number; endOfAnimation: boolean } {\n const f = this._bezierFunction(time, context.duration)\n return {\n value: f,\n endOfAnimation:\n (context.duration\n ? time >= context.duration\n : time >= this.p4.x) && f >= context.to,\n }\n }\n}\n","import { TimingFunction, type TimingFunctionContext } from './function'\n\nimport type { SpringTimingFunctionOpt } from './spring'\n\nexport class DynamicSpringTimingFunction extends TimingFunction {\n public constructor(public readonly opt: SpringTimingFunctionOpt) {\n super()\n }\n\n private currentValue: number = 0\n private currentVelocity: number = 0\n private isInitialized: boolean = false\n\n public init(startValue: number): void {\n this.currentValue = startValue\n this.currentVelocity = 0\n this.isInitialized = true\n }\n\n private getDerivatives(\n state: { x: number; v: number },\n to: number\n ): { dx: number; dv: number } {\n const { m, k, c } = this.opt\n const displacement = state.x - to\n\n const a = (-k * displacement - c * state.v) / m\n\n return { dx: state.v, dv: a }\n }\n\n public step(\n _time: number,\n context: TimingFunctionContext\n ): {\n value: number\n endOfAnimation: boolean\n } {\n if (!this.isInitialized) {\n this.init(context.from)\n }\n\n const { to, tolerance, dt } = context\n\n if (dt === 0) {\n return {\n value: this.currentValue,\n endOfAnimation: false, // Or check for end state\n }\n }\n\n const x = this.currentValue\n const v = this.currentVelocity\n\n // RK4\n // k1\n const k1 = this.getDerivatives({ x, v }, to)\n // k2\n const k2State = {\n x: x + k1.dx * (dt / 2),\n v: v + k1.dv * (dt / 2),\n }\n const k2 = this.getDerivatives(k2State, to)\n // k3\n const k3State = {\n x: x + k2.dx * (dt / 2),\n v: v + k2.dv * (dt / 2),\n }\n const k3 = this.getDerivatives(k3State, to)\n // k4\n const k4State = {\n x: x + k3.dx * dt,\n v: v + k3.dv * dt,\n }\n const k4 = this.getDerivatives(k4State, to)\n\n const avgDx = (1.0 / 6.0) * (k1.dx + 2 * k2.dx + 2 * k3.dx + k4.dx)\n const avgDv = (1.0 / 6.0) * (k1.dv + 2 * k2.dv + 2 * k3.dv + k4.dv)\n\n this.currentValue = x + avgDx * dt\n this.currentVelocity = v + avgDv * dt\n\n // Check for end of animation\n const tol = tolerance ?? 1e-3\n const displacement = this.currentValue - to\n const isMoving = Math.abs(this.currentVelocity) > tol\n const isDisplaced = Math.abs(displacement) > tol\n const endOfAnimation = !isMoving && !isDisplaced\n\n if (endOfAnimation) {\n // Snap to final value\n this.currentValue = to\n this.currentVelocity = 0\n }\n\n return {\n value: this.currentValue,\n endOfAnimation: endOfAnimation,\n }\n }\n}\n","import { TimingFunction, type TimingFunctionContext } from './function'\n\nexport interface SpringTimingFunctionOpt {\n /**\n * Mass constant.\n */\n m: number\n /**\n * Spring constant.\n */\n k: number\n /**\n * Damping constant.\n */\n c: number\n /**\n * End of spring animation threshold.\n * @default 1e-3\n */\n tolerance?: number\n}\nexport class SpringTimingFunction extends TimingFunction {\n public constructor(public readonly opt: SpringTimingFunctionOpt) {\n super()\n if (!this.opt.tolerance) {\n const DEFAULT_TOLERANCE = 1e-3 as const\n this.opt.tolerance = DEFAULT_TOLERANCE\n }\n }\n\n public step(\n time: number,\n context: TimingFunctionContext\n ): {\n value: number\n endOfAnimation: boolean\n } {\n // mass-spring-damper\n // ODE\n const m = this.opt.m\n const k = this.opt.k\n const c = this.opt.c\n const tolerance = this.opt.tolerance!\n\n // Initial D\n const d0 = context.from - context.to\n\n if (typeof d0 !== 'number') {\n throw new TypeError(\n 'Spring step function, needs initial displacement d(0) = context.start'\n )\n }\n\n const wN = Math.sqrt(k / m)\n const zetta = c / (2 * Math.sqrt(m * k))\n const Ms = 1000 as const\n\n if (zetta < 1) {\n // under-damped system\n const settlingTime = (-1 / (zetta * wN)) * Math.log(tolerance)\n const t = context?.duration\n ? (settlingTime / context.duration) * time\n : time\n\n const C1 = d0\n const C2 = (zetta / Math.sqrt(1 - zetta ** 2)) * d0\n const ode =\n Math.exp(-zetta * wN * t) *\n (C1 * Math.cos(wN * Math.sqrt(1 - zetta ** 2) * t) +\n C2 * Math.sin(wN * Math.sqrt(1 - zetta ** 2) * t)) +\n context.to\n\n return {\n value: ode,\n endOfAnimation: t >= settlingTime && ode >= context.to,\n }\n }\n\n if (zetta === 1) {\n // critically-damped system\n const settlingTime = (-1 / wN) * Math.log(tolerance)\n const t = context?.duration\n ? (settlingTime / context.duration) * time\n : time\n\n const C1 = d0\n const C2 = wN * d0\n const ode = (C1 + C2 * t) * Math.exp(-wN * t) + context.to\n\n return {\n value: ode,\n endOfAnimation:\n t >= settlingTime &&\n Math.abs(ode - context.to) <= context.to / Ms,\n }\n }\n\n if (zetta > 1) {\n // overdamped system\n const settlingTime = (-1 / (zetta * wN)) * Math.log(tolerance)\n const t = context?.duration\n ? (settlingTime / context.duration) * time\n : time\n\n const delta = Math.sqrt(zetta ** 2 - 1)\n const lambda1 = -zetta * wN + wN * delta\n const lambda2 = -zetta * wN - wN * delta\n\n const C2 = (-lambda1 * d0) / (lambda2 - lambda1)\n const C1 = d0 - C2\n\n // ODE solution\n const ode =\n C1 * Math.exp(lambda1 * t) +\n C2 * Math.exp(lambda2 * t) +\n context.to\n\n return {\n value: ode,\n endOfAnimation:\n t >= settlingTime &&\n Math.abs(ode - context.to) <= context.to / Ms,\n }\n }\n\n throw new Error('invalid system')\n }\n}\n","export * from './function'\nexport * from './linear'\n\nimport * as Bezier from './bezier'\nimport { DynamicSpringTimingFunction } from './dynamic_spring'\nimport { LinearTimingFunction } from './linear'\nimport { SpringTimingFunction, type SpringTimingFunctionOpt } from './spring'\n\n/**\n * Core timing functions\n */\nexport const T = {\n /**\n * Creates a new Bezier timing function instance.\n *\n * @param {Bezier.BezierTimingFunctionOpt} opt - Options for configuring the Bezier curve.\n */\n bezier: (opt: Bezier.BezierTimingFunctionOpt) =>\n new Bezier.BezierTimingFunction(opt),\n\n /**\n * Creates a new Spring timing function instance.\n *\n * @param {SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.\n */\n spring: (opt: SpringTimingFunctionOpt) => new SpringTimingFunction(opt),\n\n /**\n * Creates a new Dynamic Spring timing function instance.\n *\n * @param SpringTimingFunctionOpt} opt - Options for configuring the Spring timing function.\n */\n dynamicSpring: (opt: SpringTimingFunctionOpt) =>\n new DynamicSpringTimingFunction(opt),\n\n /**\n * Creates linear timing function instance.\n */\n linear: () => new LinearTimingFunction(),\n} as const\n","import type { SegmentTiming } from '../engine'\nimport type { ExecutionPlan, Groupable } from '../timeline'\nimport { type AnimationId, AnimationNode } from './base'\n\nexport interface SegmentNodeProps<G extends Groupable> {\n readonly to: G\n readonly duration: number\n readonly timing?: SegmentTiming<G>\n}\n\n/**\n * Leaf node in the animation tree\n */\nexport class SegmentNode<G extends Groupable> extends AnimationNode<G> {\n readonly type = 'SEGMENT'\n readonly props: SegmentNodeProps<G>\n\n constructor(props: SegmentNodeProps<G>, id?: AnimationId) {\n super(id)\n const nodeProps: SegmentNodeProps<G> = {\n to: props.to,\n duration: props.duration,\n ...(props.timing !== undefined && { timing: props.timing }),\n }\n this.props = nodeProps\n }\n\n public get duration(): number {\n return this.props.duration\n }\n\n public construct(plan: ExecutionPlan<G>, startTime: number): void {\n plan.push({\n node: this,\n startTime: startTime,\n endTime: startTime + this.duration,\n })\n }\n}\n\n/**\n * Factory function to create a ani SegmentNode.\n */\nexport function ani<G extends Groupable>(\n props: SegmentNodeProps<G>,\n id?: AnimationId\n): SegmentNode<G> {\n return new SegmentNode(props, id)\n}\n","import { LinearTimingFunction, type TimingFunction } from '~/timing'\nimport type { ExecutionPlan, Groupable } from '../timeline'\nimport {\n type AnimationId,\n AnimationNode,\n type ExtractAnimationNode,\n} from './base'\nimport { SegmentNode } from './segment'\n\nexport type CompositionChildren = readonly AnimationNode<Groupable>[]\nexport type CompositionPlan<Children extends CompositionChildren> =\n ExecutionPlan<ExtractAnimationNode<Children[number]>>\n\n/**\n * Composition animation\n */\nexport abstract class CompositionNode<\n const Children extends CompositionChildren,\n> extends AnimationNode<ExtractAnimationNode<Children[number]>> {\n /**\n * Composition children nodes.\n */\n public readonly children: Children\n\n constructor(children: Children, timing?: TimingFunction, id?: AnimationId) {\n super(id)\n\n const parentTiming: TimingFunction =\n timing ?? new LinearTimingFunction()\n\n const adjustTiming = <T extends CompositionChildren>(\n children: T\n ): T => {\n return children.map((child) => {\n if (\n child instanceof SegmentNode &&\n // child timing none >> override to parent\n child.props.timing === undefined &&\n timing\n ) {\n return new SegmentNode(\n {\n ...child.props,\n timing: parentTiming,\n },\n child.id\n )\n }\n\n if (child instanceof CompositionNode) {\n // @ts-ignore\n child.children = adjustTiming(child.children)\n return child\n }\n\n return child\n }) as unknown as T\n }\n\n const timingOverridingChildren = adjustTiming(children)\n this.children = timingOverridingChildren\n }\n}\n","import type { AnimationId } from './base'\nimport { SegmentNode } from './segment'\n\ntype PreserveRecord = Record<string, any>\n\n/**\n * Creates a pause in an animation sequence.\n * @param duration The duration of the delay in seconds.\n * @param id Optional ID for the node.\n */\nexport function delay(\n duration: number,\n id?: AnimationId\n): SegmentNode<PreserveRecord> {\n return new SegmentNode<PreserveRecord>({ to: {}, duration }, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { Groupable } from '../timeline'\nimport type { AnimationId, AnimationNode } from './base'\nimport { CompositionNode, type CompositionPlan } from './composition'\n\n/**\n * Composition node that repeats a child animation node a specified number of times.\n */\nexport class LoopNode<G extends Groupable> extends CompositionNode<\n readonly AnimationNode<G>[]\n> {\n readonly type = 'LOOP'\n readonly duration: number\n readonly count: number\n readonly child: AnimationNode<G>\n\n constructor(\n child: AnimationNode<G>,\n loopCount: number,\n timing?: TimingFunction,\n id?: AnimationId\n ) {\n super([child], timing, id)\n this.child = child\n this.count = loopCount\n this.duration = child.duration * loopCount\n }\n\n public construct(\n plan: CompositionPlan<readonly AnimationNode<G>[]>,\n startTime: number\n ): void {\n let currentTime = startTime\n for (let i = 0; i < this.count; i++) {\n this.child.construct(plan, currentTime)\n currentTime += this.child.duration\n }\n }\n}\n\n/**\n * Repeats a child animation node a specified number of times.\n * @param child The animation node to repeat.\n * @param loopCount The number of times to repeat the child node.\n * @param timing loop timing function.\n * @param id Optional ID for the node.\n */\nexport function loop<G extends Groupable>(\n child: AnimationNode<G>,\n loopCount: number,\n timing?: TimingFunction,\n id?: AnimationId\n): LoopNode<G> {\n return new LoopNode(child, loopCount, timing, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { Groupable, GroupableRecord } from '../timeline'\nimport type { AnimationId, AnimationNode } from './base'\nimport {\n type CompositionChildren,\n CompositionNode,\n type CompositionPlan,\n} from './composition'\nimport { SegmentNode } from './segment'\n\n/**\n * Composition node that runs all of its children at the same time.\n */\nexport class ParallelNode<\n const Children extends CompositionChildren,\n> extends CompositionNode<Children> {\n readonly type = 'PARALLEL'\n readonly duration: number\n\n constructor(children: Children, timing?: TimingFunction, id?: AnimationId) {\n // Handle object property conflicts\n const seenProperty = new Set<string>()\n const resolvedChildren: AnimationNode<Groupable>[] = []\n\n for (const child of [...children].reverse()) {\n if (child instanceof SegmentNode) {\n const segment = child as SegmentNode<Groupable>\n const propsTo = segment.props.to\n\n // record shape\n if (propsTo && !Array.isArray(propsTo)) {\n const propsToAnimate = Object.keys(propsTo)\n const finalConstructedTo: Record<string, number> = {}\n let handledCount = 0\n\n for (const propKey of propsToAnimate) {\n if (!seenProperty.has(propKey)) {\n finalConstructedTo[propKey] = (\n propsTo as Record<string, number>\n )[propKey]!\n seenProperty.add(propKey)\n handledCount++\n }\n }\n\n if (handledCount > 0) {\n const newSegment = new SegmentNode<Groupable>(\n {\n ...segment.props,\n to: finalConstructedTo as GroupableRecord,\n },\n segment.id\n )\n resolvedChildren.push(newSegment)\n }\n continue // Go to next child\n }\n }\n\n // Non-conflicts\n resolvedChildren.push(child)\n }\n\n resolvedChildren.reverse()\n\n super(resolvedChildren as unknown as Children, timing, id)\n\n this.duration = Math.max(0, ...children.map((child) => child.duration))\n }\n\n public construct(plan: CompositionPlan<Children>, startTime: number): void {\n for (const child of this.children) {\n child.construct(plan, startTime)\n }\n }\n}\n\n/**\n * Parallel composition animation\n */\nexport function parallel<const Children extends CompositionChildren>(\n children: Children,\n timing?: TimingFunction,\n id?: AnimationId\n): ParallelNode<Children> {\n return new ParallelNode(children, timing, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { AnimationId } from './base'\nimport {\n type CompositionChildren,\n CompositionNode,\n type CompositionPlan,\n} from './composition'\n\n/**\n * Composition node that runs its children one after another.\n */\nexport class SequenceNode<\n const Children extends CompositionChildren,\n> extends CompositionNode<Children> {\n readonly type = 'SEQUENCE'\n readonly duration: number\n\n constructor(children: Children, timing?: TimingFunction, id?: AnimationId) {\n super(children, timing, id)\n this.duration = children.reduce((sum, child) => sum + child.duration, 0)\n }\n\n public construct(plan: CompositionPlan<Children>, startTime: number): void {\n let currentTime = startTime\n for (const child of this.children) {\n child.construct(plan, currentTime)\n currentTime += child.duration\n }\n }\n}\n\n/**\n * Sequence composition animation\n */\nexport function sequence<const Children extends CompositionChildren>(\n children: Children,\n timing?: TimingFunction,\n id?: AnimationId\n): SequenceNode<Children> {\n return new SequenceNode(children, timing, id)\n}\n","import type { TimingFunction } from '~/timing'\nimport type { AnimationId } from './base'\nimport {\n type CompositionChildren,\n CompositionNode,\n type CompositionPlan,\n} from './composition'\n\ninterface StaggerNodeProps {\n offset: number\n timing?: TimingFunction\n}\n/**\n * Composition node that runs its children with a fixed delay between each start time.\n */\nexport class StaggerNode<\n const Children extends CompositionChildren,\n> extends CompositionNode<Children> {\n readonly type = 'STAGGER'\n readonly duration: number\n readonly offset: number\n\n constructor(children: Children, props: StaggerNodeProps, id?: AnimationId) {\n super(children, props?.timing, id)\n\n this.offset = props.offset\n\n if (children.length === 0) {\n this.duration = 0\n } else {\n const lastChild = children[children.length - 1]!\n this.duration =\n (children.length - 1) * this.offset + lastChild.duration\n }\n }\n\n public construct(plan: CompositionPlan<Children>, startTime: number): void {\n let currentTime = startTime\n for (const child of this.children) {\n child.construct(plan, currentTime)\n currentTime += this.offset\n }\n }\n}\n\n/**\n * Stagger composition animation\n */\nexport function stagger<const Children extends CompositionChildren>(\n children: Children,\n props: StaggerNodeProps,\n id?: AnimationId\n): StaggerNode<Children> {\n return new StaggerNode(children, props, id)\n}\n","export interface Animatable {\n /**\n * Update animation based on dt\n * @param dt delta time\n */\n update(dt: number): void\n}\n\n/**\n * Animation clock interface, can be user-injected.\n */\nexport interface AnimationClockInterface {\n subscribe(animatable: Animatable): void\n unsubscribe(animatable: Animatable): void\n}\n\nexport class AnimationClock implements AnimationClockInterface {\n private subscribers: Set<Animatable> = new Set()\n private animationFrameId: number | null = null\n private lastTimestamp: number = 0\n private maxDeltaTime: number\n\n protected static clock: AnimationClock\n /**\n * Crete new clock(singleton)\n * @param maxDeltaTime default maxDt = 100ms\n * @returns clock\n */\n public static create(maxDeltaTime: number = 1 / 10): AnimationClock {\n AnimationClock.clock = new AnimationClock(maxDeltaTime)\n return AnimationClock.clock\n }\n private constructor(maxDeltaTime: number) {\n this.maxDeltaTime = maxDeltaTime\n }\n\n public subscribe(animatable: Animatable): void {\n this.subscribers.add(animatable)\n if (!this.animationFrameId) {\n this.start()\n }\n }\n\n public unsubscribe(animatable: Animatable): void {\n this.subscribers.delete(animatable)\n if (this.subscribers.size === 0) {\n this.stop()\n }\n }\n\n private start(): void {\n this.lastTimestamp = performance.now()\n this.animationFrameId = window.requestAnimationFrame(this.tick)\n }\n\n private stop(): void {\n if (this.animationFrameId) {\n window.cancelAnimationFrame(this.animationFrameId)\n this.animationFrameId = null\n }\n }\n\n private tick = (timestamp: number): void => {\n if (!this.animationFrameId) return\n\n const MS = 1000 as const\n let dt = (timestamp - this.lastTimestamp) / MS\n this.lastTimestamp = timestamp\n\n // prevent large jumps or negatives\n if (dt < 0) dt = 0\n if (dt > this.maxDeltaTime) {\n dt = this.maxDeltaTime\n }\n\n for (const subscriber of this.subscribers) {\n subscriber.update(dt)\n }\n\n this.animationFrameId = window.requestAnimationFrame(this.tick)\n }\n}\n","export function isEndOfAnimation(\n currentT: number,\n duration: number,\n tolerance: number = 1e-3\n): boolean {\n return currentT === duration || currentT - duration >= tolerance\n}\n","import type { TimingFunction } from '~/timing'\nimport { isEndOfAnimation } from '~/utils/time'\nimport type { Groupable, GroupableRecord } from './timeline'\n\nexport type AnimePrimitive = readonly number[]\n\nexport interface SegmentDefinition {\n from: AnimePrimitive\n to: AnimePrimitive\n duration: number\n timing: SegmentTiming\n}\n\nexport type SegmentTiming<G extends Groupable = Groupable> =\n G extends AnimePrimitive\n ? readonly TimingFunction[] | TimingFunction\n : G extends GroupableRecord\n ? Record<keyof G, TimingFunction> | TimingFunction\n : never\n\nexport interface SegmentState {\n values: AnimePrimitive\n isComplete: boolean\n}\n\n/**\n * Calculates the animated values for a single segment at a specific local time.\n *\n * @param localTime Time elapsed within this specific segment (from 0 to duration).\n * @param segmentDef Target segment def\n * @parma dt Delta time\n * @returns Calculated values and whether the segment is complete.\n */\nexport function calculateSegmentState(\n localTime: number,\n segmentDef: SegmentDefinition,\n dt: number = 0\n): SegmentState {\n const t = Math.max(0, Math.min(localTime, segmentDef.duration))\n\n const animeValues: Array<number> = []\n let allComplete = true\n\n const isMultipleTiming = Array.isArray(segmentDef.timing)\n\n if (\n isMultipleTiming &&\n (segmentDef.timing as Array<TimingFunction>).length !==\n segmentDef.from.length\n ) {\n throw new TypeError(\n `[calculateSegmentState] timing does not correctly set. It requires multiple timing for ${segmentDef.from}, but received ${segmentDef.timing}`\n )\n }\n\n for (let i = 0; i < segmentDef.from.length; i++) {\n const timingFunction: TimingFunction = isMultipleTiming\n ? (segmentDef.timing as TimingFunction[])[i]!\n : (segmentDef.timing as TimingFunction)\n\n const animeResponse = timingFunction.step(t, {\n dt: dt,\n from: segmentDef.from[i]!,\n to: segmentDef.to[i]!,\n duration: segmentDef.duration,\n })\n\n animeValues.push(animeResponse.value)\n if (!animeResponse.endOfAnimation) {\n allComplete = false\n }\n }\n\n return {\n values: animeValues,\n isComplete: allComplete || isEndOfAnimation(t, segmentDef.duration),\n }\n}\n","import {\n type Animatable,\n AnimationClock,\n type AnimationClockInterface,\n} from '~/loop'\nimport type { Resolver, StylesheetSupportedLiteral } from '~/style'\nimport { TimingFunction } from '~/timing'\nimport { isEndOfAnimation } from '~/utils/time'\nimport type {\n Prettify,\n UnionToIntersection,\n WithLiteral,\n WithLiteralRecord,\n} from '~/utils/types'\nimport {\n type AnimePrimitive,\n calculateSegmentState,\n type SegmentDefinition,\n} from './engine'\nimport { type AnimationNode, SegmentNode, type SegmentNodeProps } from './nodes'\n\n/**\n * Animatable target values\n */\nexport type Groupable = AnimePrimitive | GroupableRecord\n\nexport type GroupableRecordKey = WithLiteral<StylesheetSupportedLiteral>\n\nexport type GroupableRecord = WithLiteralRecord<\n GroupableRecordKey,\n AnimePrimitive[number]\n>\n\nexport type AniGroup<G extends Groupable> = Prettify<UnionToIntersection<G>>\n\nexport interface ExecutionSegment<G extends Groupable> {\n /**\n * Execution segment node\n */\n node: SegmentNode<G>\n /**\n * Animation start time\n */\n startTime: number\n /**\n * Animation end time\n */\n endTime: number\n}\n\nexport type ExecutionPlan<G extends Groupable> = Array<ExecutionSegment<G>>\n\ntype TimelineStatus = 'IDLE' | 'PLAYING' | 'PAUSED' | 'ENDED'\nexport type OnUpdateCallback<G extends Groupable> = (current: {\n state: AniGroup<G>\n status: TimelineStatus\n}) => void\n\ntype ShouldKeepSymbol = 'keep'\ntype Keyframe<G extends Groupable> = Array<G | ShouldKeepSymbol>\ntype Duration = Array<number | ShouldKeepSymbol>\n\nexport interface TimelineStartingConfig<G extends Groupable, Ctx = any> {\n /**\n * Starting dynamic value.\n */\n from: AniGroup<G>\n /**\n * Dynamic `from` values, if passed `keep` for specific index, keep original timeline config.\n */\n keyframes?: Keyframe<G>\n /**\n * Dynamic `duration` values, if passed `keep` for specific index, keep original timeline config.\n */\n durations?: Duration\n /**\n * Custom context definition during animation cycle.\n */\n context?: Ctx\n /**\n * Animation repeat count.\n *\n * - if `Infinity` goes infinity repeat\n */\n repeat?: number\n\n /**\n * Initial delay before animation starts.\n *\n * - unit = `MS`\n */\n delay?: number\n\n /**\n * Custom style property resolver.\n *\n * @example\n * ```ts\n * const timeline = a.timeline(...)\n * timeline.play({\n * propertyResolver: {\n * 'px': (pxValue) => { key: `top`, value: `${pxValue}px` }\n * }\n * })\n * ```\n */\n propertyResolver?: G extends AnimePrimitive ? never : Resolver<G>\n}\n\n/**\n * Public timeline controller\n */\nexport interface TimelineController<G extends Groupable, Ctx = any> {\n /**\n * Play timeline\n * @param config Timeline starting configuration\n * @param canBeIntercepted if `true`, will play animation again even if already PLAYING.\n */\n play(\n config: TimelineStartingConfig<G, Ctx>,\n canBeIntercepted?: boolean\n ): void\n /**\n * Pause timeline\n */\n pause(): void\n /**\n * Resume timeline\n */\n resume(): void\n /**\n * Seek to target time\n * @param time\n */\n seek(time: number): void\n /**\n * Reset timeline\n */\n reset(): void\n}\n\nexport class Timeline<G extends Groupable, Ctx = any>\n implements TimelineController<G, Ctx>, Animatable\n{\n public readonly duration: number\n\n private readonly _baseExecutionPlan: ExecutionPlan<G>\n private _currentExecutionPlan: ExecutionPlan<G> | null = null\n\n private readonly _clock: AnimationClockInterface\n\n private _masterTime = 0\n\n private _delay = 0\n\n private _status: TimelineStatus = 'IDLE'\n private _currentConfig: TimelineStartingConfig<G, Ctx> | null = null\n /**\n * Current animation running config.\n */\n public get currentConfig() {\n return this._currentConfig\n }\n\n private _state: AnimePrimitive = []\n private _initialState: AnimePrimitive = []\n\n private _repeatCount: number = 0\n\n private _propertyKeyMap: Map<string, number> | null = null\n private _segmentStartStates = new Map<number, AnimePrimitive>()\n\n private _onUpdateCallbacks = new Set<OnUpdateCallback<G>>()\n\n constructor(\n /**\n * Animation construction root node.\n */\n protected readonly rootNode: AnimationNode<G>,\n clock?: AnimationClockInterface\n ) {\n this.duration = rootNode.duration\n this._baseExecutionPlan = this._constructExecutionPlan(rootNode)\n\n // default clock\n this._clock = clock ?? AnimationClock.create()\n\n // binding\n this.play.bind(this)\n this.pause.bind(this)\n this.seek.bind(this)\n this.resume.bind(this)\n this.reset.bind(this)\n }\n\n /**\n * Resolves a Group (like {x, y}) into keys and values.\n */\n private _resolveGroup(group: G): {\n keyMap: Map<string, number> | null\n values: AnimePrimitive\n } {\n if (Array.isArray(group)) {\n return { keyMap: null, values: group }\n }\n const keyMap = new Map(Object.keys(group).map((key, i) => [key, i]))\n const values = Object.values(group) as AnimePrimitive\n return { keyMap, values }\n }\n\n /**\n * Resolves the internal state (a number array) back into Group.\n */\n private _resolveStateToGroup(state: AnimePrimitive): AniGroup<G> {\n if (!this._propertyKeyMap) {\n return state as unknown as AniGroup<G>\n }\n const group = {} as Record<string, number>\n\n let i = 0\n for (const key of this._propertyKeyMap.keys()) {\n group[key] = state[i]!\n i++\n }\n return group as AniGroup<G>\n }\n\n /**\n * Compile animation execution plan\n */\n private _constructExecutionPlan(\n rootNode: AnimationNode<G>\n ): ExecutionPlan<G> {\n const plan: ExecutionPlan<G> = []\n rootNode.construct(plan, 0)\n return plan\n }\n\n /**\n * Calculates the exact state of the animation at point.\n */\n private _calculateStateAtTime(\n targetTime: number,\n dt: number = 0\n ): AnimePrimitive {\n if (this._initialState.length === 0 || !this._currentExecutionPlan) {\n return []\n }\n\n const nextState: Array<number> = [...this._initialState]\n let stateAtLastStartTime: Array<number> = [...this._initialState]\n\n for (const segment of this._currentExecutionPlan) {\n // Only for activated animation segment\n if (targetTime < segment.startTime) {\n continue\n }\n\n if (!segment.node.props.timing) {\n throw new Error(\n `[Timeline] timing should be provided. Please specify timing using a.timing.(...). Check target segment: ${JSON.stringify(segment, null, 2)}.`,\n { cause: segment }\n )\n }\n\n // Use the state before this segment for \"from\" calculation\n stateAtLastStartTime = [...nextState]\n\n const { keyMap, values: toValues } = this._resolveGroup(\n segment.node.props.to\n )\n const isRecordAni: boolean =\n this._propertyKeyMap !== null && keyMap !== null\n\n // From value calculations\n let fromValues: Array<number> = []\n const timings: Array<TimingFunction> = []\n const t = segment.node.props.timing\n const isRecordTiming: boolean = t && !(t instanceof TimingFunction)\n\n if (isRecordAni) {\n for (const key of keyMap!.keys()) {\n const index = this._propertyKeyMap!.get(key)!\n fromValues.push(stateAtLastStartTime[index]!)\n if (isRecordTiming) {\n timings.push(\n (t as Record<string, TimingFunction>)[key]!\n )\n }\n }\n } else {\n fromValues = stateAtLastStartTime\n }\n\n let finalAnimeValues: AnimePrimitive = []\n\n const localTime = targetTime - segment.startTime\n\n const segmentDef: SegmentDefinition = {\n from: fromValues,\n to: toValues,\n duration: segment.node.duration,\n timing: isRecordAni && isRecordTiming ? timings : t,\n }\n\n const segmentState = calculateSegmentState(\n localTime,\n segmentDef,\n dt\n )\n\n if (segmentState.isComplete) {\n finalAnimeValues = toValues // End target\n } else {\n finalAnimeValues = segmentState.values // Calculated current target\n }\n\n // Update next state\n if (isRecordAni) {\n // Record ani\n let i = 0\n for (const key of keyMap!.keys()) {\n const stateIndex = this._propertyKeyMap!.get(key)!\n if (stateIndex === -1) {\n continue\n }\n nextState[stateIndex] = finalAnimeValues[i]!\n i++\n }\n } else {\n // Array ani\n for (let i = 0; i < finalAnimeValues.length; i++) {\n nextState[i] = finalAnimeValues[i]!\n }\n }\n }\n\n return nextState\n }\n\n private _resolveExecutionPlan(\n keyframes?: Keyframe<G>,\n durations?: Duration\n ): ExecutionPlan<G> {\n if (!keyframes && !durations) {\n return [...this._baseExecutionPlan]\n }\n\n const segmentNodes = this._baseExecutionPlan.filter(\n (segment) => segment.node.type === 'SEGMENT'\n )\n const segLength = segmentNodes.length\n\n if (keyframes && keyframes.length !== segLength) {\n throw new Error(\n `Timeline keyframe mismatch: Expected ${segLength} keyframes, but received ${keyframes.length}.`\n )\n }\n if (durations && durations.length !== segLength) {\n throw new Error(\n `Timeline keyframe mismatch: Expected ${segLength} durations, but received ${durations.length}.`\n )\n }\n\n const newPlan: ExecutionPlan<G> = []\n\n let keyframeIndex = 0\n\n // Create dynamic to keyframes based plans\n for (const segment of this._baseExecutionPlan) {\n if (segment.node.type === 'SEGMENT') {\n const dynamicTo = keyframes?.[keyframeIndex]\n const dynamicDuration = durations?.[keyframeIndex]\n\n const newSegmentProps: SegmentNodeProps<G> = {\n ...segment.node.props,\n\n // >> dynamic to\n ...(dynamicTo && {\n to:\n dynamicTo === 'keep'\n ? segment.node.props.to\n : dynamicTo,\n }),\n\n // >> dynamic duration\n ...(dynamicDuration && {\n duration:\n dynamicDuration === 'keep'\n ? segment.node.props.duration\n : dynamicDuration,\n }),\n }\n\n const newSegment = new SegmentNode(\n newSegmentProps,\n segment.node.id\n )\n newPlan.push({ ...segment, node: newSegment })\n keyframeIndex++\n } else {\n // non-segment nodes\n newPlan.push({ ...segment })\n }\n }\n\n return newPlan\n }\n\n private notify(): void {\n for (const subscriber of this._onUpdateCallbacks) {\n subscriber({\n state: this._resolveStateToGroup(this._state),\n status: this._status,\n })\n }\n }\n\n public play(\n config: TimelineStartingConfig<G, Ctx>,\n canBeIntercepted: boolean = true\n ): void {\n if (this._status === 'PLAYING' && !canBeIntercepted) {\n return\n }\n\n const isRepeating =\n this._currentConfig?.repeat && this._currentConfig?.repeat >= 1\n const savedRepeatCount = isRepeating ? this._repeatCount : 0\n\n // can be intercepted -> reset\n this.reset(false)\n // recover repeat count\n this._repeatCount = savedRepeatCount\n\n // repeat exceed -> reset repeat\n if (isRepeating && this._repeatCount >= config.repeat!) {\n this._repeatCount = 0\n return\n }\n\n // update current config\n this._currentConfig = config\n\n if (this._repeatCount === 0) {\n this._delay = (this._currentConfig.delay ?? 0) * 1e-3 // MS\n }\n\n this._currentExecutionPlan = this._resolveExecutionPlan(\n config.keyframes,\n config.durations\n )\n\n const { keyMap: keys, values } = this._resolveGroup(config.from as G)\n this._propertyKeyMap = keys\n this._state = values\n this._initialState = values\n\n this._status = 'PLAYING'\n this._clock.subscribe(this)\n this.notify()\n }\n\n public pause(): void {\n this._status = 'PAUSED'\n this._clock.unsubscribe(this)\n }\n\n public resume(): void {\n if (this._status !== 'PAUSED') return\n this._status = 'PLAYING'\n this._clock.subscribe(this)\n }\n\n public reset(notify: boolean = true): void {\n this._status = 'IDLE'\n\n this._currentConfig = null\n\n this._masterTime = 0\n this._delay = 0\n\n this._state = []\n this._initialState = []\n\n this._propertyKeyMap = null\n\n this._segmentStartStates.clear()\n this._currentExecutionPlan = null\n\n this._clock.unsubscribe(this)\n\n this._repeatCount = 0\n\n if (notify) {\n this.notify()\n }\n }\n\n public seek(targetTime: number): void {\n if (this._status === 'PLAYING' || this._status === 'ENDED') {\n this.pause()\n }\n const seekTime = Math.max(0, Math.min(targetTime, this.duration))\n\n this._masterTime = seekTime\n this._state = this._calculateStateAtTime(seekTime, 0)\n\n this.notify()\n }\n\n public getCurrentValue(): AniGroup<G> | null {\n if (this._state.length === 0) return null\n return this._resolveStateToGroup(this._state)\n }\n\n public onUpdate(callback: OnUpdateCallback<G>): () => void {\n this._onUpdateCallbacks.add(callback)\n return () => {\n this._onUpdateCallbacks.delete(callback)\n }\n }\n\n update(dt: number): void {\n if (this._status !== 'PLAYING') {\n return\n }\n\n if (this._delay > 0) {\n this._delay -= dt\n if (this._delay < 0) {\n dt = -this._delay\n this._delay = 0\n } else {\n return\n }\n }\n\n this._masterTime += dt\n if (this._masterTime >= this.duration) {\n this._masterTime = this.duration\n }\n\n this._state = this._calculateStateAtTime(this._masterTime, dt)\n this.notify()\n\n if (isEndOfAnimation(this._masterTime, this.duration)) {\n // repeat update\n this._repeatCount += 1\n\n if (!this._currentConfig) {\n throw new Error(\n `[Timeline] currentConfig can not be null when update(dt)`\n )\n }\n\n // no-repeat -> ended(don't have to reset)\n const noRepeat = (this._currentConfig.repeat ?? 0) === 0\n\n if (noRepeat) {\n this._status = 'ENDED'\n this._clock.unsubscribe(this)\n this.notify()\n } else {\n this.play(this._currentConfig)\n }\n }\n }\n}\n\nexport function timeline<G extends Groupable, Ctx = any>(\n rootNode: AnimationNode<G>,\n clock?: AnimationClockInterface\n): Timeline<G, Ctx> {\n return new Timeline<G, Ctx>(rootNode, clock)\n}\n","import type { AnimationClockInterface } from '~/loop'\nimport type { AnimationNode, ExtractAnimationNode } from './nodes'\nimport {\n type AniGroup,\n type Groupable,\n type Timeline,\n type TimelineStartingConfig,\n timeline,\n} from './timeline'\n\nexport type AnimationStateShape = Record<string, AnimationNode<Groupable>>\n\nexport type GetTimeline<State extends AnimationStateShape> = Timeline<\n ExtractAnimationNode<State[keyof State]>,\n any\n>\n\nexport interface StateController<AnimationStates extends AnimationStateShape> {\n /**\n * Get current timeline.\n */\n timeline: () => GetTimeline<AnimationStates>\n\n /**\n * Transition timeline animation into another state.\n * @param newState transition target.\n *\n * @param timelineConfig animation play config.\n * @param canBeIntercepted animation canBeIntercepted config.\n */\n transitionTo(\n newState: keyof AnimationStates,\n timelineConfig?: TimelineStartingConfig<\n ExtractAnimationNode<AnimationStates[keyof AnimationStates]>,\n any\n >,\n canBeIntercepted?: boolean\n ): void\n\n /**\n * Subscribe to timeline changes.\n * @param callback\n * @returns unsubscribe function\n */\n onTimelineChange(\n callback: (newTimeline: GetTimeline<AnimationStates>) => void\n ): () => void\n}\n\nexport interface StateProps<AnimationStates extends AnimationStateShape> {\n /**\n * Initial animation target state.\n */\n initial: keyof AnimationStates\n /**\n * Initial animation `from` value.\n */\n initialFrom: AniGroup<\n ExtractAnimationNode<AnimationStates[keyof AnimationStates]>\n >\n /**\n * Animating target states.\n */\n states: AnimationStates\n /**\n * Custom timeline clock\n */\n clock?: AnimationClockInterface\n}\n\n/**\n * Creates a state machine controller for managing animations.\n *\n * @param config - The configuration for the state machine.\n * @param clock - Optional custom animation clock.\n * @returns A controller for managing the animation states.\n */\nexport function createStates<AnimationStates extends AnimationStateShape>(\n config: StateProps<AnimationStates>\n): StateController<AnimationStates> {\n let State: keyof AnimationStates = config.initial\n let Timeline: Timeline<Groupable> = timeline(\n config.states[State]!,\n config.clock\n )\n\n const subs = new Set<(newTimeline: GetTimeline<AnimationStates>) => void>()\n const notify = (timeline: GetTimeline<AnimationStates>) => {\n for (const Sub of subs) {\n Sub(timeline)\n }\n }\n\n return {\n timeline: () => Timeline as unknown as GetTimeline<AnimationStates>,\n onTimelineChange(callback) {\n subs.add(callback)\n return () => subs.delete(callback)\n },\n transitionTo(newState, timelineConfig, canBeIntercepted) {\n // keep current timeline\n if (!config.states[newState] || State === newState) {\n return\n }\n\n // new timeline\n const from = (timelineConfig?.from ?? // 1. config\n Timeline.getCurrentValue() ?? // 2. last value\n config.initialFrom) as TimelineStartingConfig<Groupable>['from'] // 3. initial value\n\n State = newState\n Timeline = timeline(config.states[State]!, config.clock)\n notify(Timeline as unknown as GetTimeline<AnimationStates>)\n\n Timeline.play(\n {\n ...timelineConfig,\n from,\n },\n canBeIntercepted\n )\n },\n }\n}\n","import type { Capitalize, PartialRecord, WithPrefix } from '~/utils/types'\n\nexport type EventHandler<\n AnimationContext = any,\n EvtKeys extends EventKey = EventKey,\n> = (\n animationContext: AnimationContext,\n ev: HTMLElementEventMap[EvtKeys]\n) => any\n\nexport type EventHandlerRegistration<\n AnimationContext = any,\n Keys extends EventKey = EventKey,\n> = PartialRecord<\n WithPrefix<'on', Capitalize<Keys>>,\n EventHandler<AnimationContext, Keys>\n>\n\nexport type EventKey = keyof HTMLElementEventMap\nexport class EventManager<\n SupportedEventList extends readonly EventKey[] = EventKey[],\n AnimationContext = any,\n> {\n public constructor(public readonly supportedEvents: SupportedEventList) {}\n\n private _element: HTMLElement | null = null\n public get targetElement(): HTMLElement {\n if (!this._element) throw new Error('EventManger, bind element first')\n return this._element\n }\n\n private _animeGetter: (() => AnimationContext) | null = null\n public get animeGetter(): () => AnimationContext {\n if (!this._animeGetter)\n throw new Error('EventManager, animeGetter should be provided')\n return this._animeGetter\n }\n public setAnimeGetter = (animeGetter: () => AnimationContext) => {\n this._animeGetter = animeGetter\n }\n\n private eventMap: Map<\n string,\n (e: HTMLElementEventMap[SupportedEventList[number]]) => void\n > = new Map()\n\n private withAnimeValue = (\n listener: EventHandler<AnimationContext, SupportedEventList[number]>\n ): ((e: HTMLElementEventMap[SupportedEventList[number]]) => void) => {\n const withAnime = (\n e: HTMLElementEventMap[SupportedEventList[number]]\n ) => {\n listener(this.animeGetter(), e)\n }\n return withAnime\n }\n\n public add = <const EventName extends SupportedEventList[number]>(\n eventName: EventName,\n listener: EventHandler<AnimationContext, SupportedEventList[number]>,\n options?: boolean | AddEventListenerOptions\n ) => {\n const withAnime = this.withAnimeValue(listener)\n this.eventMap.set(eventName, withAnime)\n this.targetElement.addEventListener<EventName>(\n eventName,\n this.eventMap.get(eventName)!,\n options\n )\n }\n\n public cleanupOne = <const EventName extends SupportedEventList[number]>(\n eventName: EventName\n ): boolean => {\n const removeListener = this.eventMap.get(eventName)\n if (!removeListener) return false\n\n this.targetElement.removeEventListener(eventName, removeListener)\n return true\n }\n\n public cleanupAll = (): boolean => {\n const clearResponse: Array<boolean> = []\n for (const evtName of this.eventMap.keys()) {\n const res = this.cleanupOne(evtName as SupportedEventList[number])\n clearResponse.push(res)\n }\n return clearResponse.some((t) => t === false) === false\n }\n\n /**\n * get pure `{event_name}`\n * @param key onX`{event_name}`\n */\n public static getEvtKey(key: string): EventKey {\n const removed = key.substring(2, key.length)\n const Capitalized = `${removed[0]!.toLowerCase()}${removed.substring(1, key.length)}`\n return Capitalized as EventKey\n }\n\n public attach = (\n handlers: EventHandlerRegistration<\n AnimationContext,\n SupportedEventList[number]\n >\n ): void => {\n Object.entries(handlers).forEach(([eventKey, handler]) => {\n this.add(\n EventManager.getEvtKey(eventKey),\n handler as EventHandler<\n AnimationContext,\n SupportedEventList[number]\n >\n )\n })\n }\n\n public bind(element: HTMLElement): void {\n this._element = element\n }\n}\n","const TransformFunctionMap = {\n // deg\n rotate: { fn: 'rotate', unit: 'deg' },\n rotateX: { fn: 'rotateX', unit: 'deg' },\n rotateY: { fn: 'rotateY', unit: 'deg' },\n rotateZ: { fn: 'rotateZ', unit: 'deg' },\n skew: { fn: 'skew', unit: 'deg' },\n skewX: { fn: 'skewX', unit: 'deg' },\n skewY: { fn: 'skewY', unit: 'deg' },\n // px\n translate: { fn: 'translate', unit: 'px' },\n translateX: { fn: 'translateX', unit: 'px' },\n translateY: { fn: 'translateY', unit: 'px' },\n translateZ: { fn: 'translateZ', unit: 'px' },\n // unitless\n scale: { fn: 'scale' },\n scaleX: { fn: 'scaleX' },\n scaleY: { fn: 'scaleY' },\n scaleZ: { fn: 'scaleZ' },\n} as const satisfies Record<string, { fn: string; unit?: string }>\n\ntype TransformPropertiesLiteral = keyof typeof TransformFunctionMap\n\nconst TransformProperties = new Set(Object.keys(TransformFunctionMap))\n\ntype PxPropertiesLiteral =\n | 'width'\n | 'height'\n | 'margin'\n | 'marginTop'\n | 'marginBottom'\n | 'marginLeft'\n | 'marginRight'\n | 'padding'\n | 'paddingTop'\n | 'paddingBottom'\n | 'paddingLeft'\n | 'paddingRight'\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'borderWidth'\n | 'borderRadius'\n\nconst PxProperties = new Set([\n 'width',\n 'height',\n 'margin',\n 'marginTop',\n 'marginBottom',\n 'marginLeft',\n 'marginRight',\n 'padding',\n 'paddingTop',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingRight',\n 'top',\n 'left',\n 'right',\n 'bottom',\n 'borderWidth',\n 'borderRadius',\n])\n\ntype UnitlessPropertiesLiteral =\n | 'opacity'\n | 'zIndex'\n | 'lineHeight'\n | 'fontWeight'\n\nconst UnitlessProperties = new Set([\n 'opacity',\n 'zIndex',\n 'lineHeight',\n 'fontWeight',\n])\n\nexport type StylesheetSupportedLiteral =\n | TransformPropertiesLiteral\n | PxPropertiesLiteral\n | UnitlessPropertiesLiteral\n\nexport type Resolver<T> = {\n [Key in keyof T]?: (target: T[keyof T]) => {\n key: string\n value: string | number\n }\n}\n\ntype StylesheetValueTarget = Record<string, number>\n\nexport function createStyleSheet(\n animeStyleValue: StylesheetValueTarget,\n resolver?: Resolver<StylesheetValueTarget>\n): Record<string, any> {\n const styleAccumulator: Record<string, any> = {}\n const CssTransformParts: Array<string> = []\n\n for (const key in animeStyleValue) {\n if (!Object.hasOwn(animeStyleValue, key)) {\n continue\n }\n const value = animeStyleValue[key]\n\n if (typeof value !== 'number') {\n continue\n }\n\n // Custom Resolver\n const styleResolver = resolver?.[key]\n if (styleResolver) {\n const { key: resolvedKey, value: resolvedValue } =\n styleResolver(value)\n\n styleAccumulator[resolvedKey] = resolvedValue\n continue\n }\n\n // Transform\n if (TransformProperties.has(key)) {\n const res = TransformFunctionMap[key as TransformPropertiesLiteral]\n\n const transformPart =\n 'unit' in res\n ? `${res.fn}(${value}${res.unit})`\n : `${res.fn}(${value})`\n\n CssTransformParts.push(transformPart)\n continue\n }\n\n // PX\n if (PxProperties.has(key)) {\n styleAccumulator[key] = `${value}px`\n continue\n }\n\n // Unitless\n if (UnitlessProperties.has(key)) {\n styleAccumulator[key] = value\n continue\n }\n\n // Fallback\n styleAccumulator[key] = value\n }\n\n // Combine Transform Syntax\n if (CssTransformParts.length > 0) {\n styleAccumulator['transform'] = CssTransformParts.join(' ')\n }\n\n return styleAccumulator\n}\n","import {\n ani,\n createStates,\n delay,\n loop,\n parallel,\n sequence,\n stagger,\n timeline,\n} from './ani'\nimport { T } from './timing'\n\nexport * from './ani'\nexport * from './binding_api'\nexport * from './event'\nexport * from './loop'\nexport * from './style'\nexport * from './timing'\n\nexport const a = {\n timing: T,\n ani,\n createStates,\n delay,\n loop,\n parallel,\n sequence,\n stagger,\n timeline,\n} as const\n"],"mappings":"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","names":["a","children","Timeline","timeline"]}
package/package.json CHANGED
@@ -1,11 +1,14 @@
1
1
  {
2
2
  "name": "@freestylejs/ani-core",
3
3
  "author": "freestyle",
4
- "version": "1.0.0",
4
+ "version": "1.1.0",
5
5
  "description": "Core functionality for the Ani animation library.",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
- "keywords": [],
8
+ "keywords": [
9
+ "animation",
10
+ "core"
11
+ ],
9
12
  "sideEffects": false,
10
13
  "private": false,
11
14
  "publishConfig": {