@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.
Files changed (82) hide show
  1. package/dist/components/TimeDisplay.d.ts +8 -0
  2. package/dist/components/TimeDisplay.js +10 -7
  3. package/dist/components/TimeDisplay.js.map +1 -0
  4. package/dist/elements/Audio.d.ts +8 -2
  5. package/dist/elements/Audio.js +10 -7
  6. package/dist/elements/Audio.js.map +1 -0
  7. package/dist/elements/Captions.d.ts +12 -6
  8. package/dist/elements/Captions.js +23 -24
  9. package/dist/elements/Captions.js.map +1 -0
  10. package/dist/elements/Image.d.ts +8 -2
  11. package/dist/elements/Image.js +10 -7
  12. package/dist/elements/Image.js.map +1 -0
  13. package/dist/elements/Surface.d.ts +8 -2
  14. package/dist/elements/Surface.js +12 -9
  15. package/dist/elements/Surface.js.map +1 -0
  16. package/dist/elements/ThumbnailStrip.d.ts +8 -2
  17. package/dist/elements/ThumbnailStrip.js +12 -9
  18. package/dist/elements/ThumbnailStrip.js.map +1 -0
  19. package/dist/elements/Timegroup.d.ts +8 -2
  20. package/dist/elements/Timegroup.js +10 -7
  21. package/dist/elements/Timegroup.js.map +1 -0
  22. package/dist/elements/Video.d.ts +8 -2
  23. package/dist/elements/Video.js +10 -7
  24. package/dist/elements/Video.js.map +1 -0
  25. package/dist/elements/Waveform.d.ts +8 -2
  26. package/dist/elements/Waveform.js +10 -7
  27. package/dist/elements/Waveform.js.map +1 -0
  28. package/dist/gui/Configuration.d.ts +8 -2
  29. package/dist/gui/Configuration.js +10 -7
  30. package/dist/gui/Configuration.js.map +1 -0
  31. package/dist/gui/Controls.d.ts +8 -2
  32. package/dist/gui/Controls.js +10 -7
  33. package/dist/gui/Controls.js.map +1 -0
  34. package/dist/gui/EFDial.d.ts +9 -3
  35. package/dist/gui/EFDial.js +11 -10
  36. package/dist/gui/EFDial.js.map +1 -0
  37. package/dist/gui/EFResizableBox.d.ts +9 -3
  38. package/dist/gui/EFResizableBox.js +11 -10
  39. package/dist/gui/EFResizableBox.js.map +1 -0
  40. package/dist/gui/Filmstrip.d.ts +8 -2
  41. package/dist/gui/Filmstrip.js +10 -7
  42. package/dist/gui/Filmstrip.js.map +1 -0
  43. package/dist/gui/FitScale.d.ts +8 -2
  44. package/dist/gui/FitScale.js +10 -7
  45. package/dist/gui/FitScale.js.map +1 -0
  46. package/dist/gui/FocusOverlay.d.ts +8 -2
  47. package/dist/gui/FocusOverlay.js +10 -7
  48. package/dist/gui/FocusOverlay.js.map +1 -0
  49. package/dist/gui/Pause.d.ts +8 -2
  50. package/dist/gui/Pause.js +10 -7
  51. package/dist/gui/Pause.js.map +1 -0
  52. package/dist/gui/Play.d.ts +8 -2
  53. package/dist/gui/Play.js +10 -7
  54. package/dist/gui/Play.js.map +1 -0
  55. package/dist/gui/Preview.d.ts +8 -2
  56. package/dist/gui/Preview.js +10 -7
  57. package/dist/gui/Preview.js.map +1 -0
  58. package/dist/gui/Scrubber.d.ts +8 -2
  59. package/dist/gui/Scrubber.js +10 -7
  60. package/dist/gui/Scrubber.js.map +1 -0
  61. package/dist/gui/ToggleLoop.d.ts +8 -2
  62. package/dist/gui/ToggleLoop.js +10 -7
  63. package/dist/gui/ToggleLoop.js.map +1 -0
  64. package/dist/gui/TogglePlay.d.ts +8 -2
  65. package/dist/gui/TogglePlay.js +10 -7
  66. package/dist/gui/TogglePlay.js.map +1 -0
  67. package/dist/gui/Workbench.d.ts +8 -2
  68. package/dist/gui/Workbench.js +10 -7
  69. package/dist/gui/Workbench.js.map +1 -0
  70. package/dist/hooks/create-element.d.ts +9 -18
  71. package/dist/hooks/create-element.js +72 -94
  72. package/dist/hooks/create-element.js.map +1 -0
  73. package/dist/hooks/useTimingInfo.d.ts +12 -6
  74. package/dist/hooks/useTimingInfo.js +63 -33
  75. package/dist/hooks/useTimingInfo.js.map +1 -0
  76. package/dist/index.d.ts +25 -24
  77. package/dist/index.js +2 -30
  78. package/package.json +11 -19
  79. package/src/hooks/useTimingInfo.browsertest.tsx +371 -0
  80. package/src/hooks/useTimingInfo.ts +56 -1
  81. package/tsdown.config.ts +36 -0
  82. 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
- new CurrentTimeController(timegroupRef.current, setTimeInfo);
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 };
@@ -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
+ );