@editframe/react 0.23.8-beta.0 → 0.25.0-beta.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/components/TimeDisplay.d.ts +8 -0
- package/dist/components/TimeDisplay.js +10 -7
- package/dist/components/TimeDisplay.js.map +1 -0
- package/dist/elements/Audio.d.ts +8 -2
- package/dist/elements/Audio.js +10 -7
- package/dist/elements/Audio.js.map +1 -0
- package/dist/elements/Captions.d.ts +12 -6
- package/dist/elements/Captions.js +23 -24
- package/dist/elements/Captions.js.map +1 -0
- package/dist/elements/Image.d.ts +8 -2
- package/dist/elements/Image.js +10 -7
- package/dist/elements/Image.js.map +1 -0
- package/dist/elements/Surface.d.ts +8 -2
- package/dist/elements/Surface.js +12 -9
- package/dist/elements/Surface.js.map +1 -0
- package/dist/elements/ThumbnailStrip.d.ts +8 -2
- package/dist/elements/ThumbnailStrip.js +12 -9
- package/dist/elements/ThumbnailStrip.js.map +1 -0
- package/dist/elements/Timegroup.d.ts +8 -2
- package/dist/elements/Timegroup.js +10 -7
- package/dist/elements/Timegroup.js.map +1 -0
- package/dist/elements/Video.d.ts +8 -2
- package/dist/elements/Video.js +10 -7
- package/dist/elements/Video.js.map +1 -0
- package/dist/elements/Waveform.d.ts +8 -2
- package/dist/elements/Waveform.js +10 -7
- package/dist/elements/Waveform.js.map +1 -0
- package/dist/gui/Configuration.d.ts +8 -2
- package/dist/gui/Configuration.js +10 -7
- package/dist/gui/Configuration.js.map +1 -0
- package/dist/gui/Controls.d.ts +8 -2
- package/dist/gui/Controls.js +10 -7
- package/dist/gui/Controls.js.map +1 -0
- package/dist/gui/EFDial.d.ts +9 -3
- package/dist/gui/EFDial.js +11 -10
- package/dist/gui/EFDial.js.map +1 -0
- package/dist/gui/EFResizableBox.d.ts +9 -3
- package/dist/gui/EFResizableBox.js +11 -10
- package/dist/gui/EFResizableBox.js.map +1 -0
- package/dist/gui/Filmstrip.d.ts +8 -2
- package/dist/gui/Filmstrip.js +10 -7
- package/dist/gui/Filmstrip.js.map +1 -0
- package/dist/gui/FitScale.d.ts +8 -2
- package/dist/gui/FitScale.js +10 -7
- package/dist/gui/FitScale.js.map +1 -0
- package/dist/gui/FocusOverlay.d.ts +8 -2
- package/dist/gui/FocusOverlay.js +10 -7
- package/dist/gui/FocusOverlay.js.map +1 -0
- package/dist/gui/Pause.d.ts +8 -2
- package/dist/gui/Pause.js +10 -7
- package/dist/gui/Pause.js.map +1 -0
- package/dist/gui/Play.d.ts +8 -2
- package/dist/gui/Play.js +10 -7
- package/dist/gui/Play.js.map +1 -0
- package/dist/gui/Preview.d.ts +8 -2
- package/dist/gui/Preview.js +10 -7
- package/dist/gui/Preview.js.map +1 -0
- package/dist/gui/Scrubber.d.ts +8 -2
- package/dist/gui/Scrubber.js +10 -7
- package/dist/gui/Scrubber.js.map +1 -0
- package/dist/gui/ToggleLoop.d.ts +8 -2
- package/dist/gui/ToggleLoop.js +10 -7
- package/dist/gui/ToggleLoop.js.map +1 -0
- package/dist/gui/TogglePlay.d.ts +8 -2
- package/dist/gui/TogglePlay.js +10 -7
- package/dist/gui/TogglePlay.js.map +1 -0
- package/dist/gui/Workbench.d.ts +8 -2
- package/dist/gui/Workbench.js +10 -7
- package/dist/gui/Workbench.js.map +1 -0
- package/dist/hooks/create-element.d.ts +9 -18
- package/dist/hooks/create-element.js +72 -94
- package/dist/hooks/create-element.js.map +1 -0
- package/dist/hooks/useTimingInfo.d.ts +12 -6
- package/dist/hooks/useTimingInfo.js +63 -33
- package/dist/hooks/useTimingInfo.js.map +1 -0
- package/dist/index.d.ts +25 -24
- package/dist/index.js +2 -30
- package/package.json +11 -19
- package/src/hooks/useTimingInfo.browsertest.tsx +371 -0
- package/src/hooks/useTimingInfo.ts +56 -1
- package/tsdown.config.ts +36 -0
- package/types.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EFTimegroup } from "@editframe/elements";
|
|
2
|
+
import type { Task } from "@lit/task";
|
|
2
3
|
import type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
3
4
|
import { useEffect, useRef, useState } from "react";
|
|
4
5
|
|
|
@@ -9,27 +10,65 @@ interface TimeInfo {
|
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
class CurrentTimeController implements ReactiveController {
|
|
13
|
+
#lastTaskPromise: Promise<unknown> | null = null;
|
|
14
|
+
#isConnected = false;
|
|
15
|
+
|
|
12
16
|
constructor(
|
|
13
17
|
private host: {
|
|
14
18
|
ownCurrentTimeMs: number;
|
|
15
19
|
durationMs: number;
|
|
20
|
+
frameTask: Task<readonly unknown[], unknown>;
|
|
16
21
|
} & ReactiveControllerHost,
|
|
17
22
|
private setCurrentTime: React.Dispatch<React.SetStateAction<TimeInfo>>,
|
|
18
23
|
) {
|
|
19
24
|
this.host.addController(this);
|
|
20
25
|
}
|
|
21
26
|
|
|
27
|
+
hostConnected(): void {
|
|
28
|
+
this.#isConnected = true;
|
|
29
|
+
}
|
|
30
|
+
|
|
22
31
|
hostDisconnected(): void {
|
|
32
|
+
this.#isConnected = false;
|
|
33
|
+
this.#lastTaskPromise = null;
|
|
23
34
|
this.host.removeController(this);
|
|
24
35
|
}
|
|
25
36
|
|
|
26
37
|
hostUpdated(): void {
|
|
38
|
+
const currentTaskPromise = this.host.frameTask.taskComplete;
|
|
39
|
+
|
|
40
|
+
// Detect if a new frame task has started (promise reference changed)
|
|
41
|
+
if (currentTaskPromise !== this.#lastTaskPromise) {
|
|
42
|
+
this.#lastTaskPromise = currentTaskPromise;
|
|
43
|
+
|
|
44
|
+
// Wait for this specific task to complete, then update React
|
|
45
|
+
// This is async so it doesn't block the update cycle
|
|
46
|
+
currentTaskPromise
|
|
47
|
+
.then(() => {
|
|
48
|
+
// Only update if still connected
|
|
49
|
+
if (this.#isConnected) {
|
|
50
|
+
this.#updateReactState();
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
.catch(() => {
|
|
54
|
+
// Ignore task errors - we'll continue observing
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#updateReactState(): void {
|
|
60
|
+
// Always update to ensure React has the latest state
|
|
27
61
|
this.setCurrentTime({
|
|
28
62
|
ownCurrentTimeMs: this.host.ownCurrentTimeMs,
|
|
29
63
|
durationMs: this.host.durationMs,
|
|
30
64
|
percentComplete: this.host.ownCurrentTimeMs / this.host.durationMs,
|
|
31
65
|
});
|
|
32
66
|
}
|
|
67
|
+
|
|
68
|
+
// Public method to manually trigger sync (for initialization)
|
|
69
|
+
syncNow(): void {
|
|
70
|
+
this.#updateReactState();
|
|
71
|
+
}
|
|
33
72
|
}
|
|
34
73
|
|
|
35
74
|
export const useTimingInfo = (
|
|
@@ -45,7 +84,23 @@ export const useTimingInfo = (
|
|
|
45
84
|
if (!timegroupRef.current) {
|
|
46
85
|
throw new Error("Timegroup ref not set");
|
|
47
86
|
}
|
|
48
|
-
|
|
87
|
+
|
|
88
|
+
const controller = new CurrentTimeController(
|
|
89
|
+
timegroupRef.current,
|
|
90
|
+
setTimeInfo,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
// Trigger initial update if the timegroup is already connected
|
|
94
|
+
if (timegroupRef.current.isConnected) {
|
|
95
|
+
controller.hostConnected();
|
|
96
|
+
// Sync initial state immediately
|
|
97
|
+
controller.syncNow();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Cleanup function
|
|
101
|
+
return () => {
|
|
102
|
+
controller.hostDisconnected();
|
|
103
|
+
};
|
|
49
104
|
}, [timegroupRef.current]);
|
|
50
105
|
|
|
51
106
|
return { ...timeInfo, ref: timegroupRef };
|
package/tsdown.config.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
import { defineConfig, type Plugin } from "tsdown";
|
|
5
|
+
|
|
6
|
+
import { createTsdownConfig } from "../tsdown.config.base.ts";
|
|
7
|
+
|
|
8
|
+
// Plugin to handle CSS ?inline imports from @editframe/elements
|
|
9
|
+
const inlineCssPlugin = (): Plugin => ({
|
|
10
|
+
name: "inline-css",
|
|
11
|
+
resolveId(source, importer) {
|
|
12
|
+
if (source.endsWith(".css?inline") && importer) {
|
|
13
|
+
const resolved = path.resolve(
|
|
14
|
+
path.dirname(importer),
|
|
15
|
+
source.replace("?inline", ""),
|
|
16
|
+
);
|
|
17
|
+
return { id: resolved + "?inline", external: false };
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
},
|
|
21
|
+
load(id) {
|
|
22
|
+
if (id.endsWith("?inline")) {
|
|
23
|
+
const filePath = id.replace("?inline", "");
|
|
24
|
+
const css = readFileSync(filePath, "utf-8");
|
|
25
|
+
return `export default ${JSON.stringify(css)}`;
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export default defineConfig(
|
|
32
|
+
createTsdownConfig({
|
|
33
|
+
plugins: [inlineCssPlugin()],
|
|
34
|
+
external: [/@editframe\/(elements|assets)/],
|
|
35
|
+
}),
|
|
36
|
+
);
|