@editframe/elements 0.20.4-beta.0 → 0.23.6-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 (183) hide show
  1. package/dist/DelayedLoadingState.js +0 -27
  2. package/dist/EF_FRAMEGEN.d.ts +5 -3
  3. package/dist/EF_FRAMEGEN.js +49 -11
  4. package/dist/_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js +7 -0
  5. package/dist/attachContextRoot.d.ts +1 -0
  6. package/dist/attachContextRoot.js +9 -0
  7. package/dist/elements/ContextProxiesController.d.ts +1 -2
  8. package/dist/elements/EFAudio.js +5 -9
  9. package/dist/elements/EFCaptions.d.ts +1 -3
  10. package/dist/elements/EFCaptions.js +112 -129
  11. package/dist/elements/EFImage.js +6 -7
  12. package/dist/elements/EFMedia/AssetIdMediaEngine.js +2 -5
  13. package/dist/elements/EFMedia/AssetMediaEngine.js +36 -33
  14. package/dist/elements/EFMedia/BaseMediaEngine.js +57 -73
  15. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +1 -1
  16. package/dist/elements/EFMedia/BufferedSeekingInput.js +134 -78
  17. package/dist/elements/EFMedia/JitMediaEngine.js +9 -19
  18. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +7 -13
  19. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +2 -3
  20. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +1 -1
  21. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +6 -5
  22. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +1 -3
  23. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +1 -1
  24. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +1 -1
  25. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +1 -1
  26. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +9 -25
  27. package/dist/elements/EFMedia/shared/BufferUtils.js +2 -17
  28. package/dist/elements/EFMedia/shared/GlobalInputCache.js +0 -24
  29. package/dist/elements/EFMedia/shared/PrecisionUtils.js +0 -21
  30. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +0 -17
  31. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +1 -10
  32. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.d.ts +29 -0
  33. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +32 -0
  34. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +1 -15
  35. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +1 -7
  36. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +8 -5
  37. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +12 -13
  38. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +1 -1
  39. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +134 -70
  40. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +11 -18
  41. package/dist/elements/EFMedia.d.ts +19 -0
  42. package/dist/elements/EFMedia.js +44 -25
  43. package/dist/elements/EFSourceMixin.js +5 -7
  44. package/dist/elements/EFSurface.js +6 -9
  45. package/dist/elements/EFTemporal.browsertest.d.ts +11 -0
  46. package/dist/elements/EFTemporal.d.ts +10 -0
  47. package/dist/elements/EFTemporal.js +100 -41
  48. package/dist/elements/EFThumbnailStrip.js +23 -73
  49. package/dist/elements/EFTimegroup.browsertest.d.ts +3 -3
  50. package/dist/elements/EFTimegroup.d.ts +35 -14
  51. package/dist/elements/EFTimegroup.js +138 -181
  52. package/dist/elements/EFVideo.d.ts +16 -2
  53. package/dist/elements/EFVideo.js +156 -108
  54. package/dist/elements/EFWaveform.js +23 -40
  55. package/dist/elements/SampleBuffer.js +3 -7
  56. package/dist/elements/TargetController.js +5 -5
  57. package/dist/elements/durationConverter.js +4 -4
  58. package/dist/elements/renderTemporalAudio.d.ts +10 -0
  59. package/dist/elements/renderTemporalAudio.js +35 -0
  60. package/dist/elements/updateAnimations.js +19 -43
  61. package/dist/gui/ContextMixin.d.ts +5 -5
  62. package/dist/gui/ContextMixin.js +167 -162
  63. package/dist/gui/Controllable.browsertest.d.ts +0 -0
  64. package/dist/gui/Controllable.d.ts +15 -0
  65. package/dist/gui/Controllable.js +9 -0
  66. package/dist/gui/EFConfiguration.js +7 -7
  67. package/dist/gui/EFControls.browsertest.d.ts +11 -0
  68. package/dist/gui/EFControls.d.ts +18 -4
  69. package/dist/gui/EFControls.js +70 -28
  70. package/dist/gui/EFDial.browsertest.d.ts +0 -0
  71. package/dist/gui/EFDial.d.ts +18 -0
  72. package/dist/gui/EFDial.js +141 -0
  73. package/dist/gui/EFFilmstrip.browsertest.d.ts +11 -0
  74. package/dist/gui/EFFilmstrip.d.ts +12 -2
  75. package/dist/gui/EFFilmstrip.js +214 -129
  76. package/dist/gui/EFFitScale.js +5 -8
  77. package/dist/gui/EFFocusOverlay.js +4 -4
  78. package/dist/gui/EFPause.browsertest.d.ts +0 -0
  79. package/dist/gui/EFPause.d.ts +23 -0
  80. package/dist/gui/EFPause.js +59 -0
  81. package/dist/gui/EFPlay.browsertest.d.ts +0 -0
  82. package/dist/gui/EFPlay.d.ts +23 -0
  83. package/dist/gui/EFPlay.js +59 -0
  84. package/dist/gui/EFPreview.d.ts +4 -0
  85. package/dist/gui/EFPreview.js +18 -9
  86. package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
  87. package/dist/gui/EFResizableBox.d.ts +34 -0
  88. package/dist/gui/EFResizableBox.js +547 -0
  89. package/dist/gui/EFScrubber.d.ts +9 -3
  90. package/dist/gui/EFScrubber.js +13 -13
  91. package/dist/gui/EFTimeDisplay.d.ts +7 -1
  92. package/dist/gui/EFTimeDisplay.js +8 -8
  93. package/dist/gui/EFToggleLoop.d.ts +9 -3
  94. package/dist/gui/EFToggleLoop.js +7 -5
  95. package/dist/gui/EFTogglePlay.d.ts +12 -4
  96. package/dist/gui/EFTogglePlay.js +26 -21
  97. package/dist/gui/EFWorkbench.js +5 -5
  98. package/dist/gui/PlaybackController.d.ts +67 -0
  99. package/dist/gui/PlaybackController.js +310 -0
  100. package/dist/gui/TWMixin.js +1 -1
  101. package/dist/gui/TWMixin2.js +1 -1
  102. package/dist/gui/TargetOrContextMixin.d.ts +10 -0
  103. package/dist/gui/TargetOrContextMixin.js +98 -0
  104. package/dist/gui/efContext.d.ts +2 -2
  105. package/dist/index.d.ts +5 -0
  106. package/dist/index.js +5 -1
  107. package/dist/otel/BridgeSpanExporter.d.ts +13 -0
  108. package/dist/otel/BridgeSpanExporter.js +87 -0
  109. package/dist/otel/setupBrowserTracing.d.ts +12 -0
  110. package/dist/otel/setupBrowserTracing.js +32 -0
  111. package/dist/otel/tracingHelpers.d.ts +34 -0
  112. package/dist/otel/tracingHelpers.js +112 -0
  113. package/dist/style.css +1 -1
  114. package/dist/transcoding/cache/RequestDeduplicator.js +0 -21
  115. package/dist/transcoding/cache/URLTokenDeduplicator.js +1 -21
  116. package/dist/transcoding/utils/UrlGenerator.js +2 -19
  117. package/dist/utils/LRUCache.js +6 -53
  118. package/package.json +13 -5
  119. package/src/elements/ContextProxiesController.ts +10 -10
  120. package/src/elements/EFAudio.ts +1 -0
  121. package/src/elements/EFCaptions.browsertest.ts +128 -56
  122. package/src/elements/EFCaptions.ts +60 -34
  123. package/src/elements/EFImage.browsertest.ts +1 -2
  124. package/src/elements/EFMedia/AssetMediaEngine.ts +65 -37
  125. package/src/elements/EFMedia/BaseMediaEngine.ts +110 -52
  126. package/src/elements/EFMedia/BufferedSeekingInput.ts +218 -101
  127. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +3 -0
  128. package/src/elements/EFMedia/audioTasks/makeAudioInputTask.ts +7 -3
  129. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +1 -1
  130. package/src/elements/EFMedia/videoTasks/MainVideoInputCache.ts +76 -0
  131. package/src/elements/EFMedia/videoTasks/makeScrubVideoInputTask.ts +16 -10
  132. package/src/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.ts +7 -1
  133. package/src/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.ts +222 -116
  134. package/src/elements/EFMedia.browsertest.ts +8 -15
  135. package/src/elements/EFMedia.ts +54 -8
  136. package/src/elements/EFSurface.browsertest.ts +2 -6
  137. package/src/elements/EFSurface.ts +1 -0
  138. package/src/elements/EFTemporal.browsertest.ts +58 -1
  139. package/src/elements/EFTemporal.ts +140 -4
  140. package/src/elements/EFThumbnailStrip.browsertest.ts +2 -8
  141. package/src/elements/EFThumbnailStrip.ts +1 -0
  142. package/src/elements/EFTimegroup.browsertest.ts +16 -15
  143. package/src/elements/EFTimegroup.ts +281 -275
  144. package/src/elements/EFVideo.browsertest.ts +162 -74
  145. package/src/elements/EFVideo.ts +229 -101
  146. package/src/elements/FetchContext.browsertest.ts +7 -2
  147. package/src/elements/TargetController.browsertest.ts +1 -0
  148. package/src/elements/TargetController.ts +1 -0
  149. package/src/elements/renderTemporalAudio.ts +108 -0
  150. package/src/elements/updateAnimations.browsertest.ts +181 -6
  151. package/src/elements/updateAnimations.ts +6 -6
  152. package/src/gui/ContextMixin.browsertest.ts +274 -27
  153. package/src/gui/ContextMixin.ts +230 -175
  154. package/src/gui/Controllable.browsertest.ts +258 -0
  155. package/src/gui/Controllable.ts +41 -0
  156. package/src/gui/EFControls.browsertest.ts +294 -80
  157. package/src/gui/EFControls.ts +139 -28
  158. package/src/gui/EFDial.browsertest.ts +84 -0
  159. package/src/gui/EFDial.ts +172 -0
  160. package/src/gui/EFFilmstrip.browsertest.ts +712 -0
  161. package/src/gui/EFFilmstrip.ts +213 -23
  162. package/src/gui/EFPause.browsertest.ts +202 -0
  163. package/src/gui/EFPause.ts +73 -0
  164. package/src/gui/EFPlay.browsertest.ts +202 -0
  165. package/src/gui/EFPlay.ts +73 -0
  166. package/src/gui/EFPreview.ts +20 -5
  167. package/src/gui/EFResizableBox.browsertest.ts +79 -0
  168. package/src/gui/EFResizableBox.ts +898 -0
  169. package/src/gui/EFScrubber.ts +7 -5
  170. package/src/gui/EFTimeDisplay.browsertest.ts +19 -19
  171. package/src/gui/EFTimeDisplay.ts +3 -1
  172. package/src/gui/EFToggleLoop.ts +6 -5
  173. package/src/gui/EFTogglePlay.ts +30 -23
  174. package/src/gui/PlaybackController.ts +522 -0
  175. package/src/gui/TWMixin.css +3 -0
  176. package/src/gui/TargetOrContextMixin.ts +185 -0
  177. package/src/gui/efContext.ts +2 -2
  178. package/src/otel/BridgeSpanExporter.ts +150 -0
  179. package/src/otel/setupBrowserTracing.ts +73 -0
  180. package/src/otel/tracingHelpers.ts +251 -0
  181. package/test/cache-integration-verification.browsertest.ts +1 -1
  182. package/types.json +1 -1
  183. package/dist/elements/ContextProxiesController.js +0 -69
@@ -3,14 +3,15 @@ import { css, html, LitElement } from "lit";
3
3
  import { customElement, state } from "lit/decorators.js";
4
4
 
5
5
  import { ref } from "lit/directives/ref.js";
6
- import type { ContextMixinInterface } from "./ContextMixin.js";
6
+ import type { ControllableInterface } from "./Controllable.js";
7
7
  import { currentTimeContext } from "./currentTimeContext.js";
8
8
  import { durationContext } from "./durationContext.js";
9
9
  import { efContext } from "./efContext.js";
10
10
  import { playingContext } from "./playingContext.js";
11
+ import { TargetOrContextMixin } from "./TargetOrContextMixin.js";
11
12
 
12
13
  @customElement("ef-scrubber")
13
- export class EFScrubber extends LitElement {
14
+ export class EFScrubber extends TargetOrContextMixin(LitElement, efContext) {
14
15
  static styles = [
15
16
  css`
16
17
  :host {
@@ -58,9 +59,6 @@ export class EFScrubber extends LitElement {
58
59
  `,
59
60
  ];
60
61
 
61
- @consume({ context: efContext, subscribe: true })
62
- context?: ContextMixinInterface | null;
63
-
64
62
  @consume({ context: playingContext, subscribe: true })
65
63
  playing = false;
66
64
 
@@ -70,6 +68,10 @@ export class EFScrubber extends LitElement {
70
68
  @consume({ context: durationContext, subscribe: true })
71
69
  durationMs = 0;
72
70
 
71
+ get context(): ControllableInterface | null {
72
+ return this.effectiveContext;
73
+ }
74
+
73
75
  @state()
74
76
  private scrubProgress = 0;
75
77
 
@@ -103,25 +103,24 @@ describe("EFTimeDisplay", () => {
103
103
  test("formats time correctly with valid values", async () => {
104
104
  const { timeDisplay } = renderTimeDisplay(
105
105
  html`<ef-preview>
106
- <ef-timegroup mode="fixed" duration="5s"></ef-timegroup>
106
+ <ef-timegroup mode="fixed" duration="3s"></ef-timegroup>
107
107
  <ef-time-display></ef-time-display>
108
108
  </ef-preview>`,
109
109
  );
110
110
 
111
111
  const context = timeDisplay.closest("ef-preview")!;
112
+ const timegroup = context.querySelector("ef-timegroup") as EFTimegroup;
112
113
 
113
- // Create a mock timegroup with duration
114
- const mockTimegroup = document.createElement("ef-timegroup") as EFTimegroup;
115
- mockTimegroup.setAttribute("mode", "fixed");
116
- mockTimegroup.setAttribute("duration", "3s");
114
+ await timegroup.updateComplete;
115
+ await timegroup.seek(1500); // 1.5 seconds = 0:01
117
116
 
118
- context.targetTimegroup = mockTimegroup;
119
- context.currentTimeMs = 1500; // 1.5 seconds = 0:01
117
+ // Wait for context to update and propagate to time display
118
+ await new Promise((resolve) => requestAnimationFrame(resolve));
119
+ await context.updateComplete;
120
120
  await timeDisplay.updateComplete;
121
121
 
122
- await vi.waitUntil(
123
- () => timeDisplay.shadowRoot?.textContent?.trim() === "0:01 / 0:03",
124
- );
122
+ const timeText = timeDisplay.shadowRoot?.textContent?.trim();
123
+ assert.equal(timeText, "0:01 / 0:03");
125
124
  });
126
125
 
127
126
  test("formats minutes correctly", async () => {
@@ -154,22 +153,23 @@ describe("EFTimeDisplay", () => {
154
153
  );
155
154
 
156
155
  const context = timeDisplay.closest("ef-preview")!;
156
+ const timegroup = context.querySelector("ef-timegroup") as EFTimegroup;
157
157
 
158
- const mockTimegroup = document.createElement("ef-timegroup") as EFTimegroup;
159
- mockTimegroup.setAttribute("mode", "fixed");
160
- mockTimegroup.setAttribute("duration", "10s");
161
-
162
- context.targetTimegroup = mockTimegroup;
158
+ await timegroup.updateComplete;
163
159
 
164
160
  // Initial time
165
- context.currentTimeMs = 2000; // 2 seconds = 0:02
161
+ await timegroup.seek(2000); // 2 seconds = 0:02
162
+ await new Promise((resolve) => requestAnimationFrame(resolve));
163
+ await context.updateComplete;
166
164
  await timeDisplay.updateComplete;
167
165
 
168
166
  let timeText = timeDisplay.shadowRoot?.textContent?.trim();
169
167
  assert.equal(timeText, "0:02 / 0:10");
170
168
 
171
169
  // Update time
172
- context.currentTimeMs = 7000; // 7 seconds = 0:07
170
+ await timegroup.seek(7000); // 7 seconds = 0:07
171
+ await new Promise((resolve) => requestAnimationFrame(resolve));
172
+ await context.updateComplete;
173
173
  await timeDisplay.updateComplete;
174
174
 
175
175
  timeText = timeDisplay.shadowRoot?.textContent?.trim();
@@ -185,9 +185,9 @@ describe("EFTimeDisplay", () => {
185
185
  );
186
186
 
187
187
  const context = timeDisplay.closest("ef-preview")!;
188
- const timegroup = context.targetTimegroup!;
188
+ const timegroup = context.targetTemporal!;
189
189
 
190
- timegroup.setAttribute("duration", "0s");
190
+ (timegroup as unknown as Element).setAttribute("duration", "0s");
191
191
  assert.equal(timegroup.durationMs, 0);
192
192
 
193
193
  await timegroup.updateComplete;
@@ -3,9 +3,11 @@ import { css, html, LitElement } from "lit";
3
3
  import { customElement } from "lit/decorators.js";
4
4
  import { currentTimeContext } from "./currentTimeContext.js";
5
5
  import { durationContext } from "./durationContext.js";
6
+ import { efContext } from "./efContext.js";
7
+ import { TargetOrContextMixin } from "./TargetOrContextMixin.js";
6
8
 
7
9
  @customElement("ef-time-display")
8
- export class EFTimeDisplay extends LitElement {
10
+ export class EFTimeDisplay extends TargetOrContextMixin(LitElement, efContext) {
9
11
  static styles = css`
10
12
  :host {
11
13
  display: inline-block;
@@ -1,20 +1,21 @@
1
- import { consume } from "@lit/context";
2
1
  import { css, html, LitElement } from "lit";
3
2
  import { customElement } from "lit/decorators.js";
4
3
 
5
- import type { ContextMixinInterface } from "./ContextMixin.js";
4
+ import type { ControllableInterface } from "./Controllable.js";
6
5
  import { efContext } from "./efContext.js";
6
+ import { TargetOrContextMixin } from "./TargetOrContextMixin.js";
7
7
 
8
8
  @customElement("ef-toggle-loop")
9
- export class EFToggleLoop extends LitElement {
9
+ export class EFToggleLoop extends TargetOrContextMixin(LitElement, efContext) {
10
10
  static styles = [
11
11
  css`
12
12
  :host {}
13
13
  `,
14
14
  ];
15
15
 
16
- @consume({ context: efContext })
17
- context?: ContextMixinInterface | null;
16
+ get context(): ControllableInterface | null {
17
+ return this.effectiveContext;
18
+ }
18
19
 
19
20
  render() {
20
21
  return html`
@@ -1,13 +1,16 @@
1
1
  import { consume } from "@lit/context";
2
2
  import { css, html, LitElement } from "lit";
3
- import { customElement } from "lit/decorators.js";
4
-
5
- import type { ContextMixinInterface } from "./ContextMixin.js";
3
+ import { customElement, state } from "lit/decorators.js";
4
+ import { attachContextRoot } from "../attachContextRoot.js";
5
+ import type { ControllableInterface } from "./Controllable.js";
6
6
  import { efContext } from "./efContext.js";
7
7
  import { playingContext } from "./playingContext.js";
8
+ import { TargetOrContextMixin } from "./TargetOrContextMixin.js";
9
+
10
+ attachContextRoot();
8
11
 
9
12
  @customElement("ef-toggle-play")
10
- export class EFTogglePlay extends LitElement {
13
+ export class EFTogglePlay extends TargetOrContextMixin(LitElement, efContext) {
11
14
  static styles = [
12
15
  css`
13
16
  :host {}
@@ -17,25 +20,29 @@ export class EFTogglePlay extends LitElement {
17
20
  `,
18
21
  ];
19
22
 
20
- @consume({ context: efContext, subscribe: true })
21
- context?: ContextMixinInterface | null;
22
-
23
23
  @consume({ context: playingContext, subscribe: true })
24
+ @state()
24
25
  playing = false;
25
26
 
27
+ get efContext(): ControllableInterface | null {
28
+ return this.effectiveContext;
29
+ }
30
+
31
+ // Attach click listener to host
32
+ connectedCallback() {
33
+ super.connectedCallback();
34
+ this.addEventListener("click", this.togglePlay);
35
+ }
36
+
37
+ // Detach click listener from host
38
+ disconnectedCallback() {
39
+ super.disconnectedCallback();
40
+ this.removeEventListener("click", this.togglePlay);
41
+ }
42
+
26
43
  render() {
27
44
  return html`
28
- <div
29
- @click=${() => {
30
- if (this.context) {
31
- if (this.playing) {
32
- this.context.pause();
33
- } else {
34
- this.context.play();
35
- }
36
- }
37
- }}
38
- >
45
+ <div>
39
46
  ${
40
47
  this.playing
41
48
  ? html`<slot name="pause"></slot>`
@@ -45,15 +52,15 @@ export class EFTogglePlay extends LitElement {
45
52
  `;
46
53
  }
47
54
 
48
- togglePlay() {
49
- if (this.context) {
55
+ togglePlay = () => {
56
+ if (this.efContext) {
50
57
  if (this.playing) {
51
- this.context.pause();
58
+ this.efContext.pause();
52
59
  } else {
53
- this.context.play();
60
+ this.efContext.play();
54
61
  }
55
62
  }
56
- }
63
+ };
57
64
  }
58
65
 
59
66
  declare global {