egaki 0.6.0 → 0.7.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/CHANGELOG.md +140 -9
- package/dist/cli/cache-utils.d.ts +33 -0
- package/dist/cli/cache-utils.d.ts.map +1 -0
- package/dist/cli/cache-utils.js +157 -0
- package/dist/cli/cached-generate.d.ts +105 -0
- package/dist/cli/cached-generate.d.ts.map +1 -0
- package/dist/cli/cached-generate.js +208 -0
- package/dist/cli/cached-generate.test.d.ts +11 -0
- package/dist/cli/cached-generate.test.d.ts.map +1 -0
- package/dist/cli/cached-generate.test.js +431 -0
- package/dist/cli/cartesia-provider.d.ts +16 -0
- package/dist/cli/cartesia-provider.d.ts.map +1 -0
- package/dist/cli/cartesia-provider.js +184 -0
- package/dist/cli/chatgpt-auth.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +4 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/{cli.js → cli/cli.js} +626 -600
- package/dist/cli/clone-generate.d.ts +26 -0
- package/dist/cli/clone-generate.d.ts.map +1 -0
- package/dist/cli/clone-generate.js +148 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/{credentials.js → cli/credentials.js} +20 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts +26 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts.map +1 -0
- package/dist/cli/elevenlabs-speech-provider.js +199 -0
- package/dist/cli/generate.d.ts +140 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +604 -0
- package/dist/cli/generate.test.d.ts +2 -0
- package/dist/cli/generate.test.d.ts.map +1 -0
- package/dist/cli/generate.test.js +131 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +7 -0
- package/dist/{model-catalog.d.ts → cli/model-catalog.d.ts} +6 -0
- package/dist/cli/model-catalog.d.ts.map +1 -0
- package/dist/{model-catalog.js → cli/model-catalog.js} +714 -4
- package/dist/{models.d.ts → cli/models.d.ts} +12 -5
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/{models.js → cli/models.js} +58 -57
- package/dist/cli/open-browser.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.d.ts +3 -0
- package/dist/cli/openai-speech-provider.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.js +28 -0
- package/dist/cli/separation-generate.d.ts +34 -0
- package/dist/cli/separation-generate.d.ts.map +1 -0
- package/dist/cli/separation-generate.js +117 -0
- package/dist/cli/speech-catalog.d.ts +35 -0
- package/dist/cli/speech-catalog.d.ts.map +1 -0
- package/dist/cli/speech-catalog.js +195 -0
- package/dist/cli/speech-generate.d.ts +86 -0
- package/dist/cli/speech-generate.d.ts.map +1 -0
- package/dist/cli/speech-generate.js +156 -0
- package/dist/cli/speech-models.d.ts +8 -0
- package/dist/cli/speech-models.d.ts.map +1 -0
- package/dist/cli/speech-models.js +109 -0
- package/dist/cli/speech-provider.test.d.ts +2 -0
- package/dist/cli/speech-provider.test.d.ts.map +1 -0
- package/dist/cli/speech-provider.test.js +197 -0
- package/dist/cli/subscription.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.d.ts +35 -0
- package/dist/cli/transcription-catalog.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.js +192 -0
- package/dist/cli/transcription-generate.d.ts +62 -0
- package/dist/cli/transcription-generate.d.ts.map +1 -0
- package/dist/cli/transcription-generate.js +144 -0
- package/dist/cli/transcription-models.d.ts +9 -0
- package/dist/cli/transcription-models.d.ts.map +1 -0
- package/dist/cli/transcription-models.js +100 -0
- package/dist/cli/transcription-providers.d.ts +22 -0
- package/dist/cli/transcription-providers.d.ts.map +1 -0
- package/dist/cli/transcription-providers.js +290 -0
- package/dist/cli/video-model-catalog.d.ts.map +1 -0
- package/dist/cli/xai-auth.d.ts.map +1 -0
- package/dist/{xai-auth.js → cli/xai-auth.js} +1 -1
- package/dist/vite/angled-screen.d.ts +57 -0
- package/dist/vite/angled-screen.d.ts.map +1 -0
- package/dist/vite/angled-screen.js +115 -0
- package/dist/vite/app.d.ts +51 -0
- package/dist/vite/app.d.ts.map +1 -0
- package/dist/vite/app.js +150 -0
- package/dist/vite/bands-shader.d.ts +47 -0
- package/dist/vite/bands-shader.d.ts.map +1 -0
- package/dist/vite/bands-shader.js +267 -0
- package/dist/vite/code-block.d.ts +107 -0
- package/dist/vite/code-block.d.ts.map +1 -0
- package/dist/vite/code-block.js +641 -0
- package/dist/vite/components.d.ts +36 -0
- package/dist/vite/components.d.ts.map +1 -0
- package/dist/vite/components.js +113 -0
- package/dist/vite/dispersion-rings-shader.d.ts +44 -0
- package/dist/vite/dispersion-rings-shader.d.ts.map +1 -0
- package/dist/vite/dispersion-rings-shader.js +282 -0
- package/dist/vite/easing-curves.d.ts +129 -0
- package/dist/vite/easing-curves.d.ts.map +1 -0
- package/dist/vite/easing-curves.js +584 -0
- package/dist/vite/easing-curves.test.d.ts +2 -0
- package/dist/vite/easing-curves.test.d.ts.map +1 -0
- package/dist/vite/easing-curves.test.js +200 -0
- package/dist/vite/generated-media-client.d.ts +35 -0
- package/dist/vite/generated-media-client.d.ts.map +1 -0
- package/dist/vite/generated-media-client.js +76 -0
- package/dist/vite/keyframes.d.ts +129 -0
- package/dist/vite/keyframes.d.ts.map +1 -0
- package/dist/vite/keyframes.js +194 -0
- package/dist/vite/layout-editor.d.ts +45 -0
- package/dist/vite/layout-editor.d.ts.map +1 -0
- package/dist/vite/layout-editor.js +587 -0
- package/dist/vite/layout-transition.d.ts +136 -0
- package/dist/vite/layout-transition.d.ts.map +1 -0
- package/dist/vite/layout-transition.js +581 -0
- package/dist/vite/liquid-gradient-shader.d.ts +62 -0
- package/dist/vite/liquid-gradient-shader.d.ts.map +1 -0
- package/dist/vite/liquid-gradient-shader.js +413 -0
- package/dist/vite/mdx-client.d.ts +15 -0
- package/dist/vite/mdx-client.d.ts.map +1 -0
- package/dist/vite/mdx-client.js +265 -0
- package/dist/vite/mdx-parse.d.ts +102 -0
- package/dist/vite/mdx-parse.d.ts.map +1 -0
- package/dist/vite/mdx-parse.js +251 -0
- package/dist/vite/mdx-provided-components.d.ts +18 -0
- package/dist/vite/mdx-provided-components.d.ts.map +1 -0
- package/dist/vite/mdx-provided-components.js +14 -0
- package/dist/vite/mdx-video.d.ts +327 -0
- package/dist/vite/mdx-video.d.ts.map +1 -0
- package/dist/vite/mdx-video.js +596 -0
- package/dist/vite/mdx-video.test.d.ts +9 -0
- package/dist/vite/mdx-video.test.d.ts.map +1 -0
- package/dist/vite/mdx-video.test.js +1945 -0
- package/dist/vite/media-components.d.ts +45 -0
- package/dist/vite/media-components.d.ts.map +1 -0
- package/dist/vite/media-components.js +355 -0
- package/dist/vite/media-duration-store.d.ts +66 -0
- package/dist/vite/media-duration-store.d.ts.map +1 -0
- package/dist/vite/media-duration-store.js +204 -0
- package/dist/vite/player-page.d.ts +35 -0
- package/dist/vite/player-page.d.ts.map +1 -0
- package/dist/vite/player-page.js +720 -0
- package/dist/vite/render-client.d.ts +18 -0
- package/dist/vite/render-client.d.ts.map +1 -0
- package/dist/vite/render-client.js +67 -0
- package/dist/vite/sdk.d.ts +221 -0
- package/dist/vite/sdk.d.ts.map +1 -0
- package/dist/vite/sdk.js +355 -0
- package/dist/vite/server-components.d.ts +55 -0
- package/dist/vite/server-components.d.ts.map +1 -0
- package/dist/vite/server-components.js +156 -0
- package/dist/vite/server-mdx.d.ts +74 -0
- package/dist/vite/server-mdx.d.ts.map +1 -0
- package/dist/vite/server-mdx.js +259 -0
- package/dist/vite/shader-renderer.d.ts +48 -0
- package/dist/vite/shader-renderer.d.ts.map +1 -0
- package/dist/vite/shader-renderer.js +411 -0
- package/dist/vite/store-hooks.d.ts +12 -0
- package/dist/vite/store-hooks.d.ts.map +1 -0
- package/dist/vite/store-hooks.js +93 -0
- package/dist/vite/store.d.ts +75 -0
- package/dist/vite/store.d.ts.map +1 -0
- package/dist/vite/store.js +52 -0
- package/dist/vite/store.test.d.ts +6 -0
- package/dist/vite/store.test.d.ts.map +1 -0
- package/dist/vite/store.test.js +172 -0
- package/dist/vite/tweakpane-hook.d.ts +94 -0
- package/dist/vite/tweakpane-hook.d.ts.map +1 -0
- package/dist/vite/tweakpane-hook.js +450 -0
- package/dist/vite/vite-plugin.d.ts +28 -0
- package/dist/vite/vite-plugin.d.ts.map +1 -0
- package/dist/vite/vite-plugin.js +538 -0
- package/dist/vite/wave-gradient-shader.d.ts +41 -0
- package/dist/vite/wave-gradient-shader.d.ts.map +1 -0
- package/dist/vite/wave-gradient-shader.js +207 -0
- package/package.json +101 -24
- package/skills/egaki/SKILL.md +162 -1
- package/src/cli/cache-utils.ts +169 -0
- package/src/cli/cached-generate.test.ts +531 -0
- package/src/cli/cached-generate.ts +348 -0
- package/src/cli/cartesia-provider.ts +249 -0
- package/src/{cli.ts → cli/cli.ts} +836 -884
- package/src/cli/clone-generate.ts +202 -0
- package/src/{credentials.ts → cli/credentials.ts} +20 -0
- package/src/cli/elevenlabs-speech-provider.ts +243 -0
- package/src/cli/generate.test.ts +166 -0
- package/src/cli/generate.ts +912 -0
- package/src/cli/main.ts +8 -0
- package/src/{model-catalog.ts → cli/model-catalog.ts} +787 -58
- package/src/{models.ts → cli/models.ts} +65 -86
- package/src/cli/openai-speech-provider.ts +34 -0
- package/src/cli/separation-generate.ts +187 -0
- package/src/cli/speech-catalog.ts +253 -0
- package/src/cli/speech-generate.ts +275 -0
- package/src/cli/speech-models.ts +146 -0
- package/src/cli/speech-provider.test.ts +226 -0
- package/src/cli/transcription-catalog.ts +250 -0
- package/src/cli/transcription-generate.ts +214 -0
- package/src/cli/transcription-models.ts +136 -0
- package/src/cli/transcription-providers.ts +427 -0
- package/src/{xai-auth.ts → cli/xai-auth.ts} +1 -1
- package/src/vite/angled-screen.tsx +214 -0
- package/src/vite/app.tsx +197 -0
- package/src/vite/bands-shader.tsx +319 -0
- package/src/vite/code-block.tsx +939 -0
- package/src/vite/components.tsx +278 -0
- package/src/vite/dispersion-rings-shader.tsx +331 -0
- package/src/vite/easing-curves.test.ts +232 -0
- package/src/vite/easing-curves.ts +743 -0
- package/src/vite/generated-media-client.tsx +121 -0
- package/src/vite/keyframes.tsx +347 -0
- package/src/vite/layout-editor.tsx +709 -0
- package/src/vite/layout-transition.tsx +706 -0
- package/src/vite/liquid-gradient-shader.tsx +474 -0
- package/src/vite/mdx-client.tsx +420 -0
- package/src/vite/mdx-parse.ts +343 -0
- package/src/vite/mdx-provided-components.ts +19 -0
- package/src/vite/mdx-video.test.tsx +2219 -0
- package/src/vite/mdx-video.tsx +976 -0
- package/src/vite/media-components.tsx +473 -0
- package/src/vite/media-duration-store.ts +225 -0
- package/src/vite/motion-timing.ts +194 -0
- package/src/vite/player-page.tsx +1107 -0
- package/src/vite/render-client.ts +84 -0
- package/src/vite/sdk.ts +598 -0
- package/src/vite/server-components.tsx +241 -0
- package/src/vite/server-mdx.ts +285 -0
- package/src/vite/shader-renderer.tsx +535 -0
- package/src/vite/store-hooks.ts +117 -0
- package/src/vite/store.test.ts +202 -0
- package/src/vite/store.ts +115 -0
- package/src/vite/styles.css +21 -0
- package/src/vite/tweakpane-hook.tsx +593 -0
- package/src/vite/virtual-modules.d.ts +30 -0
- package/src/vite/vite-plugin.ts +584 -0
- package/src/vite/wave-gradient-shader.tsx +253 -0
- package/README.md +0 -370
- package/dist/antigravity-auth.d.ts +0 -15
- package/dist/antigravity-auth.d.ts.map +0 -1
- package/dist/antigravity-auth.js +0 -544
- package/dist/antigravity-image.d.ts +0 -11
- package/dist/antigravity-image.d.ts.map +0 -1
- package/dist/antigravity-image.js +0 -285
- package/dist/chatgpt-auth.d.ts.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/credentials.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.d.ts +0 -11
- package/dist/gateway-model-candidates.generated.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.js +0 -64
- package/dist/login.d.ts.map +0 -1
- package/dist/model-catalog.d.ts.map +0 -1
- package/dist/models.d.ts.map +0 -1
- package/dist/open-browser.d.ts.map +0 -1
- package/dist/subscription.d.ts.map +0 -1
- package/dist/video-model-catalog.d.ts.map +0 -1
- package/dist/xai-auth.d.ts.map +0 -1
- /package/dist/{chatgpt-auth.d.ts → cli/chatgpt-auth.d.ts} +0 -0
- /package/dist/{chatgpt-auth.js → cli/chatgpt-auth.js} +0 -0
- /package/dist/{credentials.d.ts → cli/credentials.d.ts} +0 -0
- /package/dist/{login.d.ts → cli/login.d.ts} +0 -0
- /package/dist/{login.js → cli/login.js} +0 -0
- /package/dist/{open-browser.d.ts → cli/open-browser.d.ts} +0 -0
- /package/dist/{open-browser.js → cli/open-browser.js} +0 -0
- /package/dist/{subscription.d.ts → cli/subscription.d.ts} +0 -0
- /package/dist/{subscription.js → cli/subscription.js} +0 -0
- /package/dist/{video-model-catalog.d.ts → cli/video-model-catalog.d.ts} +0 -0
- /package/dist/{video-model-catalog.js → cli/video-model-catalog.js} +0 -0
- /package/dist/{xai-auth.d.ts → cli/xai-auth.d.ts} +0 -0
- /package/src/{chatgpt-auth.ts → cli/chatgpt-auth.ts} +0 -0
- /package/src/{login.ts → cli/login.ts} +0 -0
- /package/src/{open-browser.ts → cli/open-browser.ts} +0 -0
- /package/src/{subscription.ts → cli/subscription.ts} +0 -0
- /package/src/{video-model-catalog.ts → cli/video-model-catalog.ts} +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framer Motion (motion/react) integration for Remotion frame-based rendering.
|
|
3
|
+
*
|
|
4
|
+
* Patches JSAnimation.prototype to register animations in a global registry,
|
|
5
|
+
* then exposes seekTo(ms) on globalThis for MotionTimingSync to call each frame.
|
|
6
|
+
*
|
|
7
|
+
* This file is imported as a side-effect from virtual:egaki-modules when the
|
|
8
|
+
* user has `motion` installed. The Vite plugin gates the import at build time.
|
|
9
|
+
* resolve.dedupe ensures motion-dom/motion-utils resolve to the same instance
|
|
10
|
+
* that motion/react uses, so prototype patches apply to the right class.
|
|
11
|
+
*
|
|
12
|
+
* Hard-won lessons (see AGENTS.md "Framer Motion" section for full details):
|
|
13
|
+
* - stop() is a per-instance arrow function, not on prototype. Wrap in play().
|
|
14
|
+
* - anim.sample(ms) doesn't flush DOM. Must call owner.render() after sampling.
|
|
15
|
+
* - useLayoutEffect, not render-time, for seekTo calls.
|
|
16
|
+
* - Prune stale animations (owner.current === null) to prevent registry bloat.
|
|
17
|
+
* - Stop driver in finish() to prevent resource leaks.
|
|
18
|
+
* - Sample newly created animations at current seekTo time in play() patch.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { JSAnimation, time, frameData } from 'motion-dom'
|
|
22
|
+
import { MotionGlobalConfig } from 'motion-utils'
|
|
23
|
+
|
|
24
|
+
// Force JS animation path by deleting WAAPI. motion's memoized
|
|
25
|
+
// supportsWaapi() checks Object.hasOwnProperty.call(Element.prototype, "animate")
|
|
26
|
+
// on first call and caches the result. Deleting before any animation runs
|
|
27
|
+
// means the memoized result is permanently false.
|
|
28
|
+
if (typeof Element !== 'undefined') {
|
|
29
|
+
// @ts-expect-error animate is non-optional on Element but we need to remove it
|
|
30
|
+
delete Element.prototype.animate
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
MotionGlobalConfig.useManualTiming = true
|
|
34
|
+
|
|
35
|
+
// --- Internal type for JSAnimation private fields we access ---
|
|
36
|
+
// These are not part of motion-dom's public types but are stable internal
|
|
37
|
+
// properties needed for frame-based seeking.
|
|
38
|
+
|
|
39
|
+
interface AnimInternal {
|
|
40
|
+
state: string
|
|
41
|
+
holdTime: number | null
|
|
42
|
+
calculatedDuration: number
|
|
43
|
+
driver?: { stop: () => void }
|
|
44
|
+
options?: {
|
|
45
|
+
motionValue?: { owner?: { current: Element | null; render?: () => void } }
|
|
46
|
+
onComplete?: () => void
|
|
47
|
+
}
|
|
48
|
+
notifyFinished: () => void
|
|
49
|
+
sample: (timeMs: number) => void
|
|
50
|
+
stop: () => void
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
type AnimInstance = InstanceType<typeof JSAnimation> & AnimInternal
|
|
54
|
+
|
|
55
|
+
const registry: {
|
|
56
|
+
allAnimations: Set<AnimInstance>
|
|
57
|
+
scopeIdMap?: WeakMap<AnimInstance, string>
|
|
58
|
+
wrappedStops: WeakSet<AnimInstance>
|
|
59
|
+
patched: boolean
|
|
60
|
+
currentTimeMs: number | undefined
|
|
61
|
+
} = (globalThis.__egakiMotionRegistry ??= {
|
|
62
|
+
allAnimations: new Set(),
|
|
63
|
+
scopeIdMap: new WeakMap(),
|
|
64
|
+
wrappedStops: new WeakSet(),
|
|
65
|
+
patched: false,
|
|
66
|
+
currentTimeMs: undefined,
|
|
67
|
+
})
|
|
68
|
+
registry.scopeIdMap ??= new WeakMap()
|
|
69
|
+
|
|
70
|
+
const { allAnimations, wrappedStops } = registry
|
|
71
|
+
const scopeIdMap = registry.scopeIdMap
|
|
72
|
+
|
|
73
|
+
// --- Helpers ---
|
|
74
|
+
|
|
75
|
+
function unregister(anim: AnimInstance) {
|
|
76
|
+
if (anim.driver?.stop) {
|
|
77
|
+
anim.driver.stop()
|
|
78
|
+
anim.driver = undefined
|
|
79
|
+
}
|
|
80
|
+
allAnimations.delete(anim)
|
|
81
|
+
scopeIdMap.delete(anim)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function registerScope(anim: AnimInstance) {
|
|
85
|
+
const element = anim.options?.motionValue?.owner?.current
|
|
86
|
+
const scope = element?.closest?.('[data-egaki-motion-scope-id]')
|
|
87
|
+
const scopeId = scope?.getAttribute('data-egaki-motion-scope-id')
|
|
88
|
+
scopeIdMap.set(anim, scopeId ?? '')
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Return only animations whose VisualElement owner is still mounted.
|
|
92
|
+
* Prunes unmounted animations that accumulate as sections mount/unmount.
|
|
93
|
+
* Without this the registry grows to thousands and seekTo grinds to a halt. */
|
|
94
|
+
function getLiveAnimations(): AnimInstance[] {
|
|
95
|
+
const live: AnimInstance[] = []
|
|
96
|
+
for (const anim of Array.from(allAnimations)) {
|
|
97
|
+
const owner = anim.options?.motionValue?.owner
|
|
98
|
+
if (owner && owner.current == null) {
|
|
99
|
+
unregister(anim)
|
|
100
|
+
} else {
|
|
101
|
+
live.push(anim)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return live
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Flush VisualElement renders after sampling. sample() updates MotionValues
|
|
108
|
+
* but does NOT synchronously flush the render to DOM. Without this, styles
|
|
109
|
+
* stay stale until the next rAF (which never comes with useManualTiming). */
|
|
110
|
+
type VisualElementOwner = NonNullable<NonNullable<NonNullable<AnimInternal['options']>['motionValue']>['owner']>
|
|
111
|
+
|
|
112
|
+
function flushOwners(anims: AnimInstance[]) {
|
|
113
|
+
const owners = new Set<VisualElementOwner>()
|
|
114
|
+
for (const a of anims) {
|
|
115
|
+
const owner = a.options?.motionValue?.owner
|
|
116
|
+
if (owner && owner.current != null) owners.add(owner)
|
|
117
|
+
}
|
|
118
|
+
for (const o of owners) {
|
|
119
|
+
o.render?.()
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function sampleAnim(anim: AnimInstance, timeMs: number) {
|
|
124
|
+
anim.sample(timeMs)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function isInScope(anim: AnimInstance, scopeId: string) {
|
|
128
|
+
return (scopeIdMap.get(anim) ?? '') === scopeId
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// --- Prototype patches (guarded against double-patching on HMR) ---
|
|
132
|
+
|
|
133
|
+
if (!registry.patched) {
|
|
134
|
+
registry.patched = true
|
|
135
|
+
|
|
136
|
+
const origPlay = JSAnimation.prototype.play
|
|
137
|
+
JSAnimation.prototype.play = function (this: AnimInstance) {
|
|
138
|
+
if (!allAnimations.has(this)) {
|
|
139
|
+
allAnimations.add(this)
|
|
140
|
+
registerScope(this)
|
|
141
|
+
}
|
|
142
|
+
// stop() is an arrow class field (per-instance, not on prototype).
|
|
143
|
+
// Must wrap per-instance inside play() to intercept unmount cleanup.
|
|
144
|
+
if (!wrappedStops.has(this)) {
|
|
145
|
+
wrappedStops.add(this)
|
|
146
|
+
const origStop = this.stop
|
|
147
|
+
const self = this
|
|
148
|
+
this.stop = function () {
|
|
149
|
+
allAnimations.delete(self)
|
|
150
|
+
scopeIdMap.delete(self)
|
|
151
|
+
return origStop.call(self)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const result = origPlay.call(this)
|
|
155
|
+
// If seekTo has been called, immediately bring this new animation
|
|
156
|
+
// to the current time so it doesn't flash its initial state.
|
|
157
|
+
if (typeof registry.currentTimeMs === 'number') {
|
|
158
|
+
sampleAnim(this, registry.currentTimeMs)
|
|
159
|
+
flushOwners([this])
|
|
160
|
+
}
|
|
161
|
+
return result
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Patch finish(): hold at end instead of teardown so backward seeking
|
|
165
|
+
// works. Also stops the driver to prevent resource leaks (the animation
|
|
166
|
+
// stays seekable via sample() without a running driver).
|
|
167
|
+
JSAnimation.prototype.finish = function (this: AnimInstance) {
|
|
168
|
+
this.state = 'finished'
|
|
169
|
+
this.holdTime = this.calculatedDuration
|
|
170
|
+
if (this.driver?.stop) {
|
|
171
|
+
this.driver.stop()
|
|
172
|
+
this.driver = undefined
|
|
173
|
+
}
|
|
174
|
+
this.options?.onComplete?.()
|
|
175
|
+
this.notifyFinished()
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// --- seekTo: synchronously update all live animations and flush DOM ---
|
|
180
|
+
|
|
181
|
+
globalThis.__egakiMotionPrepareTime = function prepareTime(absoluteMs: number) {
|
|
182
|
+
registry.currentTimeMs = absoluteMs
|
|
183
|
+
time.set(absoluteMs)
|
|
184
|
+
;(frameData as { timestamp: number }).timestamp = absoluteMs
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
globalThis.__egakiMotionSeekTo = function seekTo(absoluteMs: number, scopeId = '') {
|
|
188
|
+
globalThis.__egakiMotionPrepareTime?.(absoluteMs)
|
|
189
|
+
const live = getLiveAnimations().filter((anim) => isInScope(anim, scopeId))
|
|
190
|
+
for (let i = 0; i < live.length; i++) {
|
|
191
|
+
sampleAnim(live[i]!, absoluteMs)
|
|
192
|
+
}
|
|
193
|
+
flushOwners(live)
|
|
194
|
+
}
|