@flighthq/timeline 0.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.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/movieClip.d.ts +24 -0
- package/dist/movieClip.d.ts.map +1 -0
- package/dist/movieClip.js +123 -0
- package/dist/movieClip.js.map +1 -0
- package/dist/timeline.d.ts +23 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +211 -0
- package/dist/timeline.js.map +1 -0
- package/package.json +39 -0
- package/src/movieClip.test.ts +430 -0
- package/src/timeline.test.ts +505 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FrameScript, MovieClip, MovieClipData, MovieClipRuntime, MovieClipSignals, PartialNode, TimelineLabel, TimelineSource } from '@flighthq/types';
|
|
2
|
+
export declare function addMovieClipFrameScript(clip: MovieClip, frame: number | string, script: FrameScript): void;
|
|
3
|
+
export declare function createMovieClip(obj?: Readonly<PartialNode<MovieClip>>): MovieClip;
|
|
4
|
+
export declare function createMovieClipData(data?: Readonly<Partial<MovieClipData>>): MovieClipData;
|
|
5
|
+
export declare function createMovieClipRuntime(): MovieClipRuntime;
|
|
6
|
+
export declare function disposeMovieClipSignals(clip: MovieClip): void;
|
|
7
|
+
export declare function enableMovieClipSignals(clip: MovieClip): MovieClipSignals;
|
|
8
|
+
export declare function getMovieClipCurrentFrame(clip: MovieClip): number;
|
|
9
|
+
export declare function getMovieClipCurrentLabel(clip: MovieClip): TimelineLabel | null;
|
|
10
|
+
export declare function getMovieClipFrameScript(clip: MovieClip, frame: number | string): FrameScript | null;
|
|
11
|
+
export declare function getMovieClipRuntime(source: Readonly<MovieClip>): Readonly<MovieClipRuntime>;
|
|
12
|
+
export declare function getMovieClipSignals(clip: MovieClip): MovieClipSignals | null;
|
|
13
|
+
export declare function getMovieClipTotalFrames(clip: MovieClip): number;
|
|
14
|
+
export declare function gotoAndPlayMovieClip(clip: MovieClip, frame: number | string): void;
|
|
15
|
+
export declare function gotoAndStopMovieClip(clip: MovieClip, frame: number | string): void;
|
|
16
|
+
export declare function isMovieClipPlaying(clip: MovieClip): boolean;
|
|
17
|
+
export declare function nextFrameMovieClip(clip: MovieClip): void;
|
|
18
|
+
export declare function playMovieClip(clip: MovieClip): void;
|
|
19
|
+
export declare function prevFrameMovieClip(clip: MovieClip): void;
|
|
20
|
+
export declare function removeMovieClipFrameScript(clip: MovieClip, frame: number | string): void;
|
|
21
|
+
export declare function setMovieClipSource(clip: MovieClip, source: TimelineSource): void;
|
|
22
|
+
export declare function stopMovieClip(clip: MovieClip): void;
|
|
23
|
+
export declare function updateMovieClip(clip: MovieClip, deltaTime: number): void;
|
|
24
|
+
//# sourceMappingURL=movieClip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"movieClip.d.ts","sourceRoot":"","sources":["../src/movieClip.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EACf,MAAM,iBAAiB,CAAC;AAsBzB,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAG1G;AAED,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAEjF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,aAAa,CAI1F;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,CAIzD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAI7D;AAKD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAQxE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEhE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,IAAI,CAG9E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAGnG;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAE3F;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAG5E;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE/D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAGxD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAGnD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAGxD;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxF;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAShF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAGnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGxE"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { createDisplayObjectGeneric, createDisplayObjectRuntime, getDisplayObjectRuntime, } from '@flighthq/displayobject';
|
|
2
|
+
import { EntityRuntimeKey, MovieClipKind } from '@flighthq/types';
|
|
3
|
+
import { addTimelineFrameScript, createTimeline, disposeTimelineSignals, enableTimelineSignals, getTimelineCurrentLabel, getTimelineFrameScript, gotoAndPlayTimeline, gotoAndStopTimeline, nextFrameTimeline, playTimeline, prevFrameTimeline, removeTimelineFrameScript, stopTimeline, updateTimeline, } from './timeline';
|
|
4
|
+
// The MovieClip display node lives here, with its playback engine — a MovieClip is a DisplayObject whose
|
|
5
|
+
// content is driven by a timeline, so the node and the engine that constructs its frames are one feature.
|
|
6
|
+
export function addMovieClipFrameScript(clip, frame, script) {
|
|
7
|
+
if (clip.data.timeline === null)
|
|
8
|
+
return;
|
|
9
|
+
addTimelineFrameScript(clip.data.timeline, frame, script);
|
|
10
|
+
}
|
|
11
|
+
export function createMovieClip(obj) {
|
|
12
|
+
return createDisplayObjectGeneric(MovieClipKind, obj, createMovieClipData, createMovieClipRuntime);
|
|
13
|
+
}
|
|
14
|
+
export function createMovieClipData(data) {
|
|
15
|
+
return {
|
|
16
|
+
timeline: data?.timeline ?? null,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function createMovieClipRuntime() {
|
|
20
|
+
const out = createDisplayObjectRuntime();
|
|
21
|
+
out.movieClipSignals = null;
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
export function disposeMovieClipSignals(clip) {
|
|
25
|
+
const runtime = clip[EntityRuntimeKey];
|
|
26
|
+
if (clip.data.timeline !== null)
|
|
27
|
+
disposeTimelineSignals(clip.data.timeline);
|
|
28
|
+
runtime.movieClipSignals = null;
|
|
29
|
+
}
|
|
30
|
+
// Allocates a MovieClipSignals group on the clip and arms per-frame signal emission. Idempotent —
|
|
31
|
+
// returns the same group on subsequent calls. Also enables the underlying timeline signals so the
|
|
32
|
+
// clip's signals fire when the timeline advances.
|
|
33
|
+
export function enableMovieClipSignals(clip) {
|
|
34
|
+
const runtime = clip[EntityRuntimeKey];
|
|
35
|
+
if (runtime.movieClipSignals !== null)
|
|
36
|
+
return runtime.movieClipSignals;
|
|
37
|
+
// Ensure the timeline exists so signals can be armed even before setMovieClipSource is called.
|
|
38
|
+
if (clip.data.timeline === null)
|
|
39
|
+
clip.data.timeline = createTimeline();
|
|
40
|
+
const signals = enableTimelineSignals(clip.data.timeline);
|
|
41
|
+
runtime.movieClipSignals = signals;
|
|
42
|
+
return signals;
|
|
43
|
+
}
|
|
44
|
+
export function getMovieClipCurrentFrame(clip) {
|
|
45
|
+
return clip.data.timeline?.currentFrame ?? 1;
|
|
46
|
+
}
|
|
47
|
+
export function getMovieClipCurrentLabel(clip) {
|
|
48
|
+
if (clip.data.timeline === null)
|
|
49
|
+
return null;
|
|
50
|
+
return getTimelineCurrentLabel(clip.data.timeline);
|
|
51
|
+
}
|
|
52
|
+
export function getMovieClipFrameScript(clip, frame) {
|
|
53
|
+
if (clip.data.timeline === null)
|
|
54
|
+
return null;
|
|
55
|
+
return getTimelineFrameScript(clip.data.timeline, frame);
|
|
56
|
+
}
|
|
57
|
+
export function getMovieClipRuntime(source) {
|
|
58
|
+
return getDisplayObjectRuntime(source);
|
|
59
|
+
}
|
|
60
|
+
export function getMovieClipSignals(clip) {
|
|
61
|
+
const runtime = clip[EntityRuntimeKey];
|
|
62
|
+
return runtime.movieClipSignals;
|
|
63
|
+
}
|
|
64
|
+
export function getMovieClipTotalFrames(clip) {
|
|
65
|
+
return clip.data.timeline?.source?.totalFrames ?? 1;
|
|
66
|
+
}
|
|
67
|
+
export function gotoAndPlayMovieClip(clip, frame) {
|
|
68
|
+
if (clip.data.timeline === null)
|
|
69
|
+
return;
|
|
70
|
+
gotoAndPlayTimeline(clip.data.timeline, frame);
|
|
71
|
+
}
|
|
72
|
+
export function gotoAndStopMovieClip(clip, frame) {
|
|
73
|
+
if (clip.data.timeline === null)
|
|
74
|
+
return;
|
|
75
|
+
gotoAndStopTimeline(clip.data.timeline, frame);
|
|
76
|
+
}
|
|
77
|
+
export function isMovieClipPlaying(clip) {
|
|
78
|
+
return clip.data.timeline?.isPlaying ?? false;
|
|
79
|
+
}
|
|
80
|
+
export function nextFrameMovieClip(clip) {
|
|
81
|
+
if (clip.data.timeline === null)
|
|
82
|
+
return;
|
|
83
|
+
nextFrameTimeline(clip.data.timeline);
|
|
84
|
+
}
|
|
85
|
+
export function playMovieClip(clip) {
|
|
86
|
+
if (clip.data.timeline === null)
|
|
87
|
+
return;
|
|
88
|
+
playTimeline(clip.data.timeline);
|
|
89
|
+
}
|
|
90
|
+
export function prevFrameMovieClip(clip) {
|
|
91
|
+
if (clip.data.timeline === null)
|
|
92
|
+
return;
|
|
93
|
+
prevFrameTimeline(clip.data.timeline);
|
|
94
|
+
}
|
|
95
|
+
export function removeMovieClipFrameScript(clip, frame) {
|
|
96
|
+
if (clip.data.timeline === null)
|
|
97
|
+
return;
|
|
98
|
+
removeTimelineFrameScript(clip.data.timeline, frame);
|
|
99
|
+
}
|
|
100
|
+
// Binds a TimelineSource to `clip`: gives it a timeline (reusing an existing one) pointed at the clip as
|
|
101
|
+
// its construct target, and realizes the initial frame so the clip isn't blank before play. The source
|
|
102
|
+
// comes from a format — createTimelineSource (hand-authored), createSpritesheetTimelineSource, etc.
|
|
103
|
+
export function setMovieClipSource(clip, source) {
|
|
104
|
+
// Reuse the clip's existing timeline if it has one: enableMovieClipSignals may have already created and
|
|
105
|
+
// armed it (storing the same group in runtime.movieClipSignals), so pointing a source at the same object
|
|
106
|
+
// keeps those signals live with no re-wire needed — the runtime slot and timeline.signals are one group.
|
|
107
|
+
const timeline = clip.data.timeline ?? createTimeline();
|
|
108
|
+
timeline.source = source;
|
|
109
|
+
timeline.target = clip;
|
|
110
|
+
clip.data.timeline = timeline;
|
|
111
|
+
gotoAndStopTimeline(timeline, timeline.currentFrame);
|
|
112
|
+
}
|
|
113
|
+
export function stopMovieClip(clip) {
|
|
114
|
+
if (clip.data.timeline === null)
|
|
115
|
+
return;
|
|
116
|
+
stopTimeline(clip.data.timeline);
|
|
117
|
+
}
|
|
118
|
+
export function updateMovieClip(clip, deltaTime) {
|
|
119
|
+
if (clip.data.timeline === null)
|
|
120
|
+
return;
|
|
121
|
+
updateTimeline(clip.data.timeline, deltaTime);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=movieClip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"movieClip.js","sourceRoot":"","sources":["../src/movieClip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DisplayObject, FrameScript, Timeline, TimelineLabel, TimelineSignals, TimelineSource } from '@flighthq/types';
|
|
2
|
+
export declare function addTimelineFrameScript(timeline: Timeline, frame: number | string, script: FrameScript): void;
|
|
3
|
+
export declare function createTimeline(obj?: Partial<Timeline>): Timeline;
|
|
4
|
+
export declare function createTimelineSource(obj: {
|
|
5
|
+
totalFrames?: number;
|
|
6
|
+
frameRate?: number | null;
|
|
7
|
+
labels?: readonly TimelineLabel[];
|
|
8
|
+
constructFrame?: (target: DisplayObject, frame: number) => void;
|
|
9
|
+
}): TimelineSource;
|
|
10
|
+
export declare function disposeTimelineSignals(timeline: Timeline): void;
|
|
11
|
+
export declare function enableTimelineSignals(timeline: Timeline): TimelineSignals;
|
|
12
|
+
export declare function findTimelineLabel(timeline: Readonly<Timeline>, name: string): TimelineLabel | null;
|
|
13
|
+
export declare function getTimelineCurrentLabel(timeline: Readonly<Timeline>): TimelineLabel | null;
|
|
14
|
+
export declare function getTimelineFrameScript(timeline: Readonly<Timeline>, frame: number | string): FrameScript | null;
|
|
15
|
+
export declare function gotoAndPlayTimeline(timeline: Timeline, frame: number | string): void;
|
|
16
|
+
export declare function gotoAndStopTimeline(timeline: Timeline, frame: number | string): void;
|
|
17
|
+
export declare function nextFrameTimeline(timeline: Timeline): void;
|
|
18
|
+
export declare function playTimeline(timeline: Timeline): void;
|
|
19
|
+
export declare function prevFrameTimeline(timeline: Timeline): void;
|
|
20
|
+
export declare function removeTimelineFrameScript(timeline: Timeline, frame: number | string): void;
|
|
21
|
+
export declare function stopTimeline(timeline: Timeline): void;
|
|
22
|
+
export declare function updateTimeline(timeline: Timeline, deltaTime: number): void;
|
|
23
|
+
//# sourceMappingURL=timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EAER,aAAa,EACb,eAAe,EACf,cAAc,EACf,MAAM,iBAAiB,CAAC;AAEzB,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAG5G;AAED,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAYhE;AAMD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE,GAAG,cAAc,CAOjB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE/D;AAID,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAEzE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAElG;AAID,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,aAAa,GAAG,IAAI,CAU1F;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAI/G;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG1D;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAIrD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG1D;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK1F;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAErD;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAS1E"}
|
package/dist/timeline.js
ADDED
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { createSignal, emitSignal } from '@flighthq/signals';
|
|
2
|
+
export function addTimelineFrameScript(timeline, frame, script) {
|
|
3
|
+
const resolved = resolveFrame(timeline, frame);
|
|
4
|
+
(timeline.frameScripts ??= new Map()).set(resolved, script);
|
|
5
|
+
}
|
|
6
|
+
export function createTimeline(obj) {
|
|
7
|
+
return {
|
|
8
|
+
source: obj?.source ?? null,
|
|
9
|
+
target: obj?.target ?? null,
|
|
10
|
+
currentFrame: obj?.currentFrame ?? 1,
|
|
11
|
+
frameScripts: obj?.frameScripts ?? null,
|
|
12
|
+
isPlaying: obj?.isPlaying ?? false,
|
|
13
|
+
lastFrameUpdate: -1,
|
|
14
|
+
playMode: obj?.playMode ?? 'loop',
|
|
15
|
+
signals: obj?.signals ?? null,
|
|
16
|
+
timeElapsed: 0,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Native authoring entry: wraps an explicit per-frame `constructFrame` plus structure into a
|
|
20
|
+
// TimelineSource. This is the timeline's own "format" — the analogue of createPath/appendPath in
|
|
21
|
+
// @flighthq/path — so a Timeline is usable on its own; external formats (spritesheet, importers)
|
|
22
|
+
// produce a TimelineSource the same way.
|
|
23
|
+
export function createTimelineSource(obj) {
|
|
24
|
+
return {
|
|
25
|
+
totalFrames: obj.totalFrames ?? 1,
|
|
26
|
+
frameRate: obj.frameRate ?? null,
|
|
27
|
+
labels: obj.labels ?? EMPTY_LABELS,
|
|
28
|
+
constructFrame: obj.constructFrame ?? noopConstructFrame,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function disposeTimelineSignals(timeline) {
|
|
32
|
+
timeline.signals = null;
|
|
33
|
+
}
|
|
34
|
+
// Allocates a TimelineSignals group on the timeline and arms per-frame signal emission in
|
|
35
|
+
// updateTimeline and seekTimeline. Idempotent — returns the same group on subsequent calls.
|
|
36
|
+
export function enableTimelineSignals(timeline) {
|
|
37
|
+
return (timeline.signals ??= createTimelineSignals());
|
|
38
|
+
}
|
|
39
|
+
export function findTimelineLabel(timeline, name) {
|
|
40
|
+
return getTimelineLabels(timeline).find((l) => l.name === name) ?? null;
|
|
41
|
+
}
|
|
42
|
+
// Returns the label whose frame range the playhead currently sits in (the last label at or before
|
|
43
|
+
// currentFrame), or null if no labels are defined or none precede the current frame.
|
|
44
|
+
export function getTimelineCurrentLabel(timeline) {
|
|
45
|
+
const labels = getTimelineLabels(timeline);
|
|
46
|
+
const frame = timeline.currentFrame;
|
|
47
|
+
let result = null;
|
|
48
|
+
for (const label of labels) {
|
|
49
|
+
if (label.frame <= frame) {
|
|
50
|
+
if (result === null || label.frame >= result.frame)
|
|
51
|
+
result = label;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
export function getTimelineFrameScript(timeline, frame) {
|
|
57
|
+
if (timeline.frameScripts === null)
|
|
58
|
+
return null;
|
|
59
|
+
const resolved = resolveFrame(timeline, frame);
|
|
60
|
+
return timeline.frameScripts.get(resolved) ?? null;
|
|
61
|
+
}
|
|
62
|
+
export function gotoAndPlayTimeline(timeline, frame) {
|
|
63
|
+
playTimeline(timeline);
|
|
64
|
+
seekTimeline(timeline, resolveFrame(timeline, frame));
|
|
65
|
+
}
|
|
66
|
+
export function gotoAndStopTimeline(timeline, frame) {
|
|
67
|
+
stopTimeline(timeline);
|
|
68
|
+
seekTimeline(timeline, resolveFrame(timeline, frame));
|
|
69
|
+
}
|
|
70
|
+
export function nextFrameTimeline(timeline) {
|
|
71
|
+
stopTimeline(timeline);
|
|
72
|
+
seekTimeline(timeline, timeline.currentFrame + 1);
|
|
73
|
+
}
|
|
74
|
+
export function playTimeline(timeline) {
|
|
75
|
+
if (timeline.isPlaying || getTimelineTotalFrames(timeline) < 2)
|
|
76
|
+
return;
|
|
77
|
+
timeline.isPlaying = true;
|
|
78
|
+
timeline.timeElapsed = 0;
|
|
79
|
+
}
|
|
80
|
+
export function prevFrameTimeline(timeline) {
|
|
81
|
+
stopTimeline(timeline);
|
|
82
|
+
seekTimeline(timeline, timeline.currentFrame - 1);
|
|
83
|
+
}
|
|
84
|
+
export function removeTimelineFrameScript(timeline, frame) {
|
|
85
|
+
if (timeline.frameScripts === null)
|
|
86
|
+
return;
|
|
87
|
+
const resolved = resolveFrame(timeline, frame);
|
|
88
|
+
timeline.frameScripts.delete(resolved);
|
|
89
|
+
if (timeline.frameScripts.size === 0)
|
|
90
|
+
timeline.frameScripts = null;
|
|
91
|
+
}
|
|
92
|
+
export function stopTimeline(timeline) {
|
|
93
|
+
timeline.isPlaying = false;
|
|
94
|
+
}
|
|
95
|
+
export function updateTimeline(timeline, deltaTime) {
|
|
96
|
+
const frameRate = getTimelineFrameRate(timeline);
|
|
97
|
+
if (timeline.isPlaying && frameRate !== null) {
|
|
98
|
+
timeline.currentFrame = advanceFrame(timeline, deltaTime);
|
|
99
|
+
}
|
|
100
|
+
fireConstructFrame(timeline);
|
|
101
|
+
if (timeline.isPlaying && frameRate === null) {
|
|
102
|
+
timeline.currentFrame = advanceFrame(timeline, deltaTime);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const EMPTY_LABELS = [];
|
|
106
|
+
function noopConstructFrame() { }
|
|
107
|
+
// Frame accounting matches Flash/OpenFL: when accumulated time spans multiple frames in one update,
|
|
108
|
+
// the playhead jumps straight to the landing frame (currentFrame + floor(timeElapsed / frameTime)).
|
|
109
|
+
// Skipped intermediate frames are not visited — fireConstructFrame runs for the landing frame only, so
|
|
110
|
+
// their onEnterFrame/onExitFrame signals and frame scripts do not fire. This is intentional (a slow
|
|
111
|
+
// frame should not replay every in-between frame's scripts); a maxFrameSkip clamp or fractional-frame
|
|
112
|
+
// interpolation would be a separate policy decision, not part of this contract.
|
|
113
|
+
function advanceFrame(timeline, deltaTime) {
|
|
114
|
+
const frameRate = getTimelineFrameRate(timeline);
|
|
115
|
+
const totalFrames = getTimelineTotalFrames(timeline);
|
|
116
|
+
if (frameRate !== null) {
|
|
117
|
+
const frameTime = 1000 / frameRate;
|
|
118
|
+
timeline.timeElapsed += deltaTime;
|
|
119
|
+
let next = timeline.currentFrame + Math.floor(timeline.timeElapsed / frameTime);
|
|
120
|
+
timeline.timeElapsed %= frameTime;
|
|
121
|
+
if (next > totalFrames) {
|
|
122
|
+
if (timeline.playMode === 'once') {
|
|
123
|
+
timeline.isPlaying = false;
|
|
124
|
+
const completed = totalFrames;
|
|
125
|
+
const signals = timeline.signals;
|
|
126
|
+
if (signals !== null)
|
|
127
|
+
emitSignal(signals.onComplete);
|
|
128
|
+
return completed;
|
|
129
|
+
}
|
|
130
|
+
next = ((next - 1) % totalFrames) + 1;
|
|
131
|
+
const signals = timeline.signals;
|
|
132
|
+
if (signals !== null)
|
|
133
|
+
emitSignal(signals.onLoop);
|
|
134
|
+
}
|
|
135
|
+
return next;
|
|
136
|
+
}
|
|
137
|
+
const next = timeline.currentFrame + 1;
|
|
138
|
+
if (next > totalFrames) {
|
|
139
|
+
if (timeline.playMode === 'once') {
|
|
140
|
+
timeline.isPlaying = false;
|
|
141
|
+
const signals = timeline.signals;
|
|
142
|
+
if (signals !== null)
|
|
143
|
+
emitSignal(signals.onComplete);
|
|
144
|
+
return totalFrames;
|
|
145
|
+
}
|
|
146
|
+
const signals = timeline.signals;
|
|
147
|
+
if (signals !== null)
|
|
148
|
+
emitSignal(signals.onLoop);
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
return next;
|
|
152
|
+
}
|
|
153
|
+
function createTimelineSignals() {
|
|
154
|
+
return {
|
|
155
|
+
onComplete: createSignal(),
|
|
156
|
+
onEnterFrame: createSignal(),
|
|
157
|
+
onExitFrame: createSignal(),
|
|
158
|
+
onFrameConstructed: createSignal(),
|
|
159
|
+
onLoop: createSignal(),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
// Constructs and fires exactly one frame — the current playhead frame — regardless of how far it moved
|
|
163
|
+
// since the last update. When advanceFrame jumps across skipped frames, only the landing frame is
|
|
164
|
+
// constructed here; the intervening frames' scripts and enter/exit signals are not run (landing-frame-only,
|
|
165
|
+
// matching Flash). frameEvent.previousFrame carries the prior landing frame, which may be many frames back.
|
|
166
|
+
function fireConstructFrame(timeline) {
|
|
167
|
+
const previous = timeline.lastFrameUpdate;
|
|
168
|
+
const current = timeline.currentFrame;
|
|
169
|
+
if (current === previous)
|
|
170
|
+
return;
|
|
171
|
+
const signals = timeline.signals;
|
|
172
|
+
const target = timeline.target;
|
|
173
|
+
const frameEvent = { frame: current, previousFrame: previous };
|
|
174
|
+
if (signals !== null)
|
|
175
|
+
emitSignal(signals.onExitFrame, frameEvent);
|
|
176
|
+
timeline.lastFrameUpdate = current;
|
|
177
|
+
if (signals !== null)
|
|
178
|
+
emitSignal(signals.onEnterFrame, frameEvent);
|
|
179
|
+
if (target !== null)
|
|
180
|
+
timeline.source?.constructFrame(target, current);
|
|
181
|
+
if (timeline.frameScripts !== null) {
|
|
182
|
+
const script = timeline.frameScripts.get(current);
|
|
183
|
+
if (script !== undefined && target !== null)
|
|
184
|
+
script(target, current);
|
|
185
|
+
}
|
|
186
|
+
if (signals !== null)
|
|
187
|
+
emitSignal(signals.onFrameConstructed, frameEvent);
|
|
188
|
+
}
|
|
189
|
+
function getTimelineFrameRate(timeline) {
|
|
190
|
+
return timeline.source?.frameRate ?? null;
|
|
191
|
+
}
|
|
192
|
+
function getTimelineLabels(timeline) {
|
|
193
|
+
return timeline.source?.labels ?? EMPTY_LABELS;
|
|
194
|
+
}
|
|
195
|
+
function getTimelineTotalFrames(timeline) {
|
|
196
|
+
return timeline.source?.totalFrames ?? 1;
|
|
197
|
+
}
|
|
198
|
+
function resolveFrame(timeline, frame) {
|
|
199
|
+
if (typeof frame === 'number')
|
|
200
|
+
return frame;
|
|
201
|
+
const label = findTimelineLabel(timeline, frame);
|
|
202
|
+
if (!label)
|
|
203
|
+
throw new Error(`Frame label "${frame}" not found`);
|
|
204
|
+
return label.frame;
|
|
205
|
+
}
|
|
206
|
+
function seekTimeline(timeline, frame) {
|
|
207
|
+
timeline.currentFrame = Math.max(1, Math.min(frame, getTimelineTotalFrames(timeline)));
|
|
208
|
+
timeline.lastFrameUpdate = -1;
|
|
209
|
+
fireConstructFrame(timeline);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAW7D,MAAM,UAAU,sBAAsB,CAAC,QAAkB,EAAE,KAAsB,EAAE,MAAmB;IACpG,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC,QAAQ,CAAC,YAAY,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAuB;IACpD,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,IAAI;QAC3B,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,IAAI;QAC3B,YAAY,EAAE,GAAG,EAAE,YAAY,IAAI,CAAC;QACpC,YAAY,EAAE,GAAG,EAAE,YAAY,IAAI,IAAI;QACvC,SAAS,EAAE,GAAG,EAAE,SAAS,IAAI,KAAK;QAClC,eAAe,EAAE,CAAC,CAAC;QACnB,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,MAAM;QACjC,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,IAAI;QAC7B,WAAW,EAAE,CAAC;KACf,CAAC;AACJ,CAAC;AAED,6FAA6F;AAC7F,iGAAiG;AACjG,iGAAiG;AACjG,yCAAyC;AACzC,MAAM,UAAU,oBAAoB,CAAC,GAKpC;IACC,OAAO;QACL,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,CAAC;QACjC,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI;QAChC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,YAAY;QAClC,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,kBAAkB;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAkB;IACvD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;AAC1B,CAAC;AAED,0FAA0F;AAC1F,4FAA4F;AAC5F,MAAM,UAAU,qBAAqB,CAAC,QAAkB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,KAAK,qBAAqB,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA4B,EAAE,IAAY;IAC1E,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC;AAC1E,CAAC;AAED,kGAAkG;AAClG,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CAAC,QAA4B;IAClE,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,CAAC;IACpC,IAAI,MAAM,GAAyB,IAAI,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;gBAAE,MAAM,GAAG,KAAK,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA4B,EAAE,KAAsB;IACzF,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,KAAsB;IAC5E,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAkB,EAAE,KAAsB;IAC5E,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,IAAI,QAAQ,CAAC,SAAS,IAAI,sBAAsB,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO;IACvE,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvB,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAkB,EAAE,KAAsB;IAClF,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAkB;IAC7C,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAkB,EAAE,SAAiB;IAClE,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7C,QAAQ,CAAC,YAAY,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7B,IAAI,QAAQ,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QAC7C,QAAQ,CAAC,YAAY,GAAG,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAA6B,EAAE,CAAC;AAElD,SAAS,kBAAkB,KAAU,CAAC;AAEtC,oGAAoG;AACpG,oGAAoG;AACpG,uGAAuG;AACvG,oGAAoG;AACpG,sGAAsG;AACtG,gFAAgF;AAChF,SAAS,YAAY,CAAC,QAAkB,EAAE,SAAiB;IACzD,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;QACnC,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC;QAClC,IAAI,IAAI,GAAG,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;QAChF,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC;QAClC,IAAI,IAAI,GAAG,WAAW,EAAE,CAAC;YACvB,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACjC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC;gBAC3B,MAAM,SAAS,GAAG,WAAW,CAAC;gBAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACjC,IAAI,OAAO,KAAK,IAAI;oBAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBACrD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACjC,IAAI,OAAO,KAAK,IAAI;gBAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,GAAG,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,WAAW,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACjC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC;YAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACjC,IAAI,OAAO,KAAK,IAAI;gBAAE,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,IAAI,OAAO,KAAK,IAAI;YAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO;QACL,UAAU,EAAE,YAAY,EAAE;QAC1B,YAAY,EAAE,YAAY,EAAE;QAC5B,WAAW,EAAE,YAAY,EAAE;QAC3B,kBAAkB,EAAE,YAAY,EAAE;QAClC,MAAM,EAAE,YAAY,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,uGAAuG;AACvG,kGAAkG;AAClG,4GAA4G;AAC5G,4GAA4G;AAC5G,SAAS,kBAAkB,CAAC,QAAkB;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC;IACtC,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO;IAEjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,MAAM,UAAU,GAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;IAEnF,IAAI,OAAO,KAAK,IAAI;QAAE,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAClE,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC;IACnC,IAAI,OAAO,KAAK,IAAI;QAAE,UAAU,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,IAAI;QAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;YAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,KAAK,IAAI;QAAE,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA4B;IACxD,OAAO,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED,SAAS,iBAAiB,CAAC,QAA4B;IACrD,OAAO,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,YAAY,CAAC;AACjD,CAAC;AAED,SAAS,sBAAsB,CAAC,QAA4B;IAC1D,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,QAA4B,EAAE,KAAsB;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,KAAK,aAAa,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CAAC,QAAkB,EAAE,KAAa;IACrD,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvF,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;IAC9B,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flighthq/timeline",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"src/**/*.test.ts",
|
|
16
|
+
"!dist/**/*.test.js",
|
|
17
|
+
"!dist/**/*.test.d.ts",
|
|
18
|
+
"!dist/**/*.test.js.map",
|
|
19
|
+
"!dist/**/*.test.d.ts.map"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -b",
|
|
23
|
+
"clean": "tsc -b --clean",
|
|
24
|
+
"test": "vitest run --config vitest.config.ts",
|
|
25
|
+
"test:watch": "vitest --watch --config vitest.config.ts",
|
|
26
|
+
"prepack": "npm run clean && npm run clean:dist && npm run build",
|
|
27
|
+
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@flighthq/displayobject": "0.1.0",
|
|
31
|
+
"@flighthq/signals": "0.1.0",
|
|
32
|
+
"@flighthq/types": "0.1.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"typescript": "^5.3.0"
|
|
36
|
+
},
|
|
37
|
+
"description": "Timeline-based animation sequencing",
|
|
38
|
+
"sideEffects": false
|
|
39
|
+
}
|