@editframe/elements 0.7.0-beta.11 → 0.7.0-beta.12

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 (99) hide show
  1. package/dist/EF_INTERACTIVE.d.ts +1 -0
  2. package/dist/{lib/av → assets/dist}/EncodedAsset.js +1 -1
  3. package/dist/{packages/elements/src/elements → elements}/EFAudio.d.ts +2 -2
  4. package/dist/{packages/elements/src/elements → elements}/EFCaptions.d.ts +4 -4
  5. package/dist/{packages/elements/src/elements → elements}/EFImage.d.ts +3 -3
  6. package/dist/{packages/elements/src/elements → elements}/EFMedia.d.ts +3 -3
  7. package/dist/{packages/elements/src/elements → elements}/EFTemporal.d.ts +1 -1
  8. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.browsertest.d.ts +1 -1
  9. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.d.ts +3 -3
  10. package/dist/{packages/elements/src/elements → elements}/EFVideo.d.ts +3 -3
  11. package/dist/{packages/elements/src/elements → elements}/EFWaveform.d.ts +3 -3
  12. package/dist/{packages/elements/src/elements → elements}/TimegroupController.d.ts +1 -1
  13. package/dist/{packages/elements → elements}/src/EF_FRAMEGEN.js +4 -3
  14. package/dist/elements/src/EF_INTERACTIVE.js +7 -0
  15. package/dist/{packages/elements → elements}/src/elements/EFMedia.js +2 -2
  16. package/dist/{packages/elements → elements}/src/elements/EFTemporal.js +37 -2
  17. package/dist/{packages/elements → elements}/src/gui/EFFilmstrip.js +3 -3
  18. package/dist/{packages/elements → elements}/src/gui/EFWorkbench.js +1 -2
  19. package/dist/{packages/elements → elements}/src/gui/TWMixin.js +10 -2
  20. package/dist/{packages/elements → elements}/src/index.js +3 -1
  21. package/dist/{packages/elements/src/elements → elements}/util.d.ts +1 -1
  22. package/dist/{packages/elements/src/gui → gui}/EFFilmstrip.d.ts +10 -10
  23. package/dist/{packages/elements/src/gui → gui}/EFWorkbench.d.ts +3 -3
  24. package/dist/index.d.ts +10 -0
  25. package/dist/msToTimeCode.d.ts +1 -0
  26. package/dist/style.css +9 -0
  27. package/package.json +6 -9
  28. package/src/elements/EFAudio.ts +1 -1
  29. package/src/elements/EFCaptions.ts +7 -7
  30. package/src/elements/EFImage.ts +3 -3
  31. package/src/elements/EFMedia.ts +8 -8
  32. package/src/elements/EFSourceMixin.ts +1 -1
  33. package/src/elements/EFTemporal.ts +42 -5
  34. package/src/elements/EFTimegroup.browsertest.ts +3 -3
  35. package/src/elements/EFTimegroup.ts +4 -4
  36. package/src/elements/EFVideo.ts +2 -2
  37. package/src/elements/EFWaveform.ts +6 -6
  38. package/src/elements/FetchMixin.ts +1 -1
  39. package/src/elements/TimegroupController.ts +1 -1
  40. package/src/elements/durationConverter.ts +1 -1
  41. package/src/elements/util.ts +1 -1
  42. package/src/gui/EFFilmstrip.ts +17 -13
  43. package/src/gui/EFWorkbench.ts +4 -5
  44. package/src/gui/TWMixin.ts +10 -3
  45. package/dist/lib/av/EncodedAsset.cjs +0 -577
  46. package/dist/lib/av/MP4File.cjs +0 -187
  47. package/dist/lib/av/msToTimeCode.cjs +0 -15
  48. package/dist/lib/util/awaitMicrotask.cjs +0 -4
  49. package/dist/lib/util/awaitMicrotask.js +0 -4
  50. package/dist/lib/util/memoize.cjs +0 -14
  51. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +0 -197
  52. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +0 -4
  53. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +0 -1
  54. package/dist/packages/elements/src/EF_INTERACTIVE.js +0 -4
  55. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +0 -16
  56. package/dist/packages/elements/src/elements/EFAudio.cjs +0 -53
  57. package/dist/packages/elements/src/elements/EFCaptions.cjs +0 -164
  58. package/dist/packages/elements/src/elements/EFImage.cjs +0 -79
  59. package/dist/packages/elements/src/elements/EFMedia.cjs +0 -336
  60. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +0 -55
  61. package/dist/packages/elements/src/elements/EFTemporal.cjs +0 -199
  62. package/dist/packages/elements/src/elements/EFTimegroup.cjs +0 -352
  63. package/dist/packages/elements/src/elements/EFVideo.cjs +0 -109
  64. package/dist/packages/elements/src/elements/EFWaveform.cjs +0 -242
  65. package/dist/packages/elements/src/elements/FetchMixin.cjs +0 -28
  66. package/dist/packages/elements/src/elements/TimegroupController.cjs +0 -20
  67. package/dist/packages/elements/src/elements/durationConverter.cjs +0 -8
  68. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +0 -12
  69. package/dist/packages/elements/src/elements/util.cjs +0 -11
  70. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +0 -825
  71. package/dist/packages/elements/src/gui/EFWorkbench.cjs +0 -214
  72. package/dist/packages/elements/src/gui/TWMixin.cjs +0 -28
  73. package/dist/packages/elements/src/gui/TWMixin.css.cjs +0 -3
  74. package/dist/packages/elements/src/index.cjs +0 -50
  75. package/dist/packages/elements/src/index.d.ts +0 -10
  76. package/dist/{packages/elements/src/EF_FRAMEGEN.d.ts → EF_FRAMEGEN.d.ts} +0 -0
  77. package/dist/{lib/av → assets/dist}/MP4File.js +0 -0
  78. package/dist/{lib/util → assets/dist}/memoize.js +0 -0
  79. package/dist/{packages/elements/src/elements → elements}/CrossUpdateController.d.ts +0 -0
  80. package/dist/{packages/elements/src/elements → elements}/EFSourceMixin.d.ts +0 -0
  81. package/dist/{packages/elements/src/elements → elements}/FetchMixin.d.ts +0 -0
  82. package/dist/{packages/elements/src/elements → elements}/durationConverter.d.ts +0 -0
  83. package/dist/{packages/elements/src/elements → elements}/parseTimeToMs.d.ts +0 -0
  84. package/dist/{packages/elements → elements}/src/elements/CrossUpdateController.js +0 -0
  85. package/dist/{packages/elements → elements}/src/elements/EFAudio.js +0 -0
  86. package/dist/{packages/elements → elements}/src/elements/EFCaptions.js +1 -1
  87. /package/dist/{packages/elements → elements}/src/elements/EFImage.js +0 -0
  88. /package/dist/{packages/elements → elements}/src/elements/EFSourceMixin.js +0 -0
  89. /package/dist/{packages/elements → elements}/src/elements/EFTimegroup.js +0 -0
  90. /package/dist/{packages/elements → elements}/src/elements/EFVideo.js +0 -0
  91. /package/dist/{packages/elements → elements}/src/elements/EFWaveform.js +0 -0
  92. /package/dist/{packages/elements → elements}/src/elements/FetchMixin.js +0 -0
  93. /package/dist/{packages/elements → elements}/src/elements/TimegroupController.js +0 -0
  94. /package/dist/{packages/elements → elements}/src/elements/durationConverter.js +0 -0
  95. /package/dist/{packages/elements → elements}/src/elements/parseTimeToMs.js +0 -0
  96. /package/dist/{packages/elements → elements}/src/elements/util.js +0 -0
  97. /package/dist/{packages/elements → elements}/src/gui/TWMixin.css.js +0 -0
  98. /package/dist/{lib/av → elements/src}/msToTimeCode.js +0 -0
  99. /package/dist/{packages/elements/src/gui → gui}/TWMixin.d.ts +0 -0
@@ -1,11 +1,11 @@
1
1
  import type { LitElement, ReactiveController } from "lit";
2
2
  import { consume, createContext } from "@lit/context";
3
3
  import { property, state } from "lit/decorators.js";
4
- import type { EFTimegroup } from "./EFTimegroup";
4
+ import type { EFTimegroup } from "./EFTimegroup.ts";
5
5
 
6
- import { durationConverter } from "./durationConverter";
6
+ import { durationConverter } from "./durationConverter.ts";
7
7
  import { Task } from "@lit/task";
8
- import { EF_INTERACTIVE } from "../EF_INTERACTIVE";
8
+ import { EF_INTERACTIVE } from "../EF_INTERACTIVE.ts";
9
9
 
10
10
  export const timegroupContext = createContext<EFTimegroup>(
11
11
  Symbol("timeGroupContext"),
@@ -59,10 +59,23 @@ export const deepGetElementsWithFrameTasks = (
59
59
  return elements;
60
60
  };
61
61
 
62
+ let temporalCache: Map<Element, TemporalMixinInterface[]>;
63
+ const resetTemporalCache = () => {
64
+ temporalCache = new Map();
65
+ if (typeof requestAnimationFrame !== "undefined") {
66
+ requestAnimationFrame(resetTemporalCache);
67
+ }
68
+ };
69
+ resetTemporalCache();
70
+
62
71
  export const shallowGetTemporalElements = (
63
72
  element: Element,
64
73
  temporals: TemporalMixinInterface[] = [],
65
74
  ) => {
75
+ const cachedResult = temporalCache.get(element);
76
+ if (cachedResult) {
77
+ return cachedResult;
78
+ }
66
79
  for (const child of element.children) {
67
80
  if (isEFTemporal(child)) {
68
81
  temporals.push(child);
@@ -70,6 +83,7 @@ export const shallowGetTemporalElements = (
70
83
  shallowGetTemporalElements(child, temporals);
71
84
  }
72
85
  }
86
+ temporalCache.set(element, temporals);
73
87
  return temporals;
74
88
  };
75
89
 
@@ -92,6 +106,15 @@ export class OwnCurrentTimeController implements ReactiveController {
92
106
 
93
107
  type Constructor<T = {}> = new (...args: any[]) => T;
94
108
 
109
+ let startTimeMsCache = new WeakMap<Element, number>();
110
+ const resetStartTimeMsCache = () => {
111
+ startTimeMsCache = new WeakMap();
112
+ if (typeof requestAnimationFrame !== "undefined") {
113
+ requestAnimationFrame(resetStartTimeMsCache);
114
+ }
115
+ };
116
+ resetStartTimeMsCache();
117
+
95
118
  export const EFTemporal = <T extends Constructor<LitElement>>(
96
119
  superClass: T,
97
120
  ) => {
@@ -172,27 +195,41 @@ export const EFTemporal = <T extends Constructor<LitElement>>(
172
195
  }
173
196
 
174
197
  get startTimeMs(): number {
198
+ const cachedStartTime = startTimeMsCache.get(this);
199
+ if (cachedStartTime !== undefined) {
200
+ return cachedStartTime;
201
+ }
175
202
  const parentTimegroup = this.parentTimegroup;
176
203
  if (!parentTimegroup) {
204
+ startTimeMsCache.set(this, 0);
177
205
  return 0;
178
206
  }
179
207
  switch (parentTimegroup.mode) {
180
208
  case "sequence": {
181
209
  const siblingTemorals = shallowGetTemporalElements(parentTimegroup);
182
- const ownIndex = siblingTemorals.indexOf(
210
+ const ownIndex = siblingTemorals?.indexOf(
183
211
  this as InstanceType<Constructor<TemporalMixinInterface> & T>,
184
212
  );
185
213
  if (ownIndex === 0) {
214
+ startTimeMsCache.set(this, parentTimegroup.startTimeMs);
186
215
  return parentTimegroup.startTimeMs;
187
216
  }
188
- const previous = siblingTemorals[ownIndex - 1];
217
+ const previous = siblingTemorals?.[(ownIndex ?? 0) - 1];
189
218
  if (!previous) {
190
219
  throw new Error("Previous temporal element not found");
191
220
  }
221
+ startTimeMsCache.set(
222
+ this,
223
+ previous.startTimeMs + previous.durationMs,
224
+ );
192
225
  return previous.startTimeMs + previous.durationMs;
193
226
  }
194
227
  case "contain":
195
228
  case "fixed":
229
+ startTimeMsCache.set(
230
+ this,
231
+ parentTimegroup.startTimeMs + this.offsetMs,
232
+ );
196
233
  return parentTimegroup.startTimeMs + this.offsetMs;
197
234
  default:
198
235
  throw new Error(`Invalid time mode: ${parentTimegroup.mode}`);
@@ -5,10 +5,10 @@ import {
5
5
  html,
6
6
  render as litRender,
7
7
  } from "lit";
8
- import { EFTimegroup } from "./EFTimegroup";
9
- import "./EFTimegroup";
8
+ import { EFTimegroup } from "./EFTimegroup.ts";
9
+ import "./EFTimegroup.ts";
10
10
  import { customElement } from "lit/decorators/custom-element.js";
11
- import { EFTemporal } from "./EFTemporal";
11
+ import { EFTemporal } from "./EFTemporal.ts";
12
12
 
13
13
  beforeEach(() => {
14
14
  for (let i = 0; i < localStorage.length; i++) {
@@ -9,10 +9,10 @@ import {
9
9
  isEFTemporal,
10
10
  shallowGetTemporalElements,
11
11
  timegroupContext,
12
- } from "./EFTemporal";
13
- import { TimegroupController } from "./TimegroupController";
14
- import { EF_INTERACTIVE } from "../EF_INTERACTIVE";
15
- import { deepGetMediaElements } from "./EFMedia";
12
+ } from "./EFTemporal.ts";
13
+ import { TimegroupController } from "./TimegroupController.ts";
14
+ import { EF_INTERACTIVE } from "../EF_INTERACTIVE.ts";
15
+ import { deepGetMediaElements } from "./EFMedia.ts";
16
16
 
17
17
  const log = debug("ef:elements:EFTimegroup");
18
18
 
@@ -3,8 +3,8 @@ import { Task } from "@lit/task";
3
3
  import { createRef, ref } from "lit/directives/ref.js";
4
4
  import { customElement } from "lit/decorators.js";
5
5
 
6
- import { EFMedia } from "./EFMedia";
7
- import { TWMixin } from "../gui/TWMixin";
6
+ import { EFMedia } from "./EFMedia.ts";
7
+ import { TWMixin } from "../gui/TWMixin.ts";
8
8
 
9
9
  @customElement("ef-video")
10
10
  export class EFVideo extends TWMixin(EFMedia) {
@@ -1,15 +1,15 @@
1
- import { EFAudio } from "./EFAudio";
1
+ import { EFAudio } from "./EFAudio.ts";
2
2
 
3
3
  import { LitElement, html } from "lit";
4
4
  import { customElement, property } from "lit/decorators.js";
5
- import { EFVideo } from "./EFVideo";
6
- import { EFTemporal } from "./EFTemporal";
7
- import { CrossUpdateController } from "./CrossUpdateController";
8
- import { TWMixin } from "../gui/TWMixin";
5
+ import { EFVideo } from "./EFVideo.ts";
6
+ import { EFTemporal } from "./EFTemporal.ts";
7
+ import { CrossUpdateController } from "./CrossUpdateController.ts";
8
+ import { TWMixin } from "../gui/TWMixin.ts";
9
9
  import { Task } from "@lit/task";
10
10
  import * as d3 from "d3";
11
11
  import { type Ref, createRef, ref } from "lit/directives/ref.js";
12
- import { EF_INTERACTIVE } from "../EF_INTERACTIVE";
12
+ import { EF_INTERACTIVE } from "../EF_INTERACTIVE.ts";
13
13
 
14
14
  @customElement("ef-waveform")
15
15
  export class EFWaveform extends EFTemporal(TWMixin(LitElement)) {
@@ -1,6 +1,6 @@
1
1
  import { consume } from "@lit/context";
2
2
  import type { LitElement } from "lit";
3
- import { fetchContext } from "../gui/EFWorkbench";
3
+ import { fetchContext } from "../gui/EFWorkbench.ts";
4
4
  import { state } from "lit/decorators/state.js";
5
5
 
6
6
  export declare class FetchMixinInterface {
@@ -1,5 +1,5 @@
1
1
  import type { ReactiveController, LitElement } from "lit";
2
- import type { EFTimegroup } from "./EFTimegroup";
2
+ import type { EFTimegroup } from "./EFTimegroup.ts";
3
3
 
4
4
  export class TimegroupController implements ReactiveController {
5
5
  constructor(
@@ -1,4 +1,4 @@
1
- import { parseTimeToMs } from "./parseTimeToMs";
1
+ import { parseTimeToMs } from "./parseTimeToMs.ts";
2
2
 
3
3
  export const durationConverter = {
4
4
  fromAttribute: (value: string): number => parseTimeToMs(value),
@@ -1,4 +1,4 @@
1
- import { EFTimegroup } from "./EFTimegroup";
1
+ import { EFTimegroup } from "./EFTimegroup.ts";
2
2
 
3
3
  export const getRootTimeGroup = (element: Element): EFTimegroup | null => {
4
4
  let bestCandidate: EFTimegroup | null = null;
@@ -1,4 +1,4 @@
1
- import { EFTimegroup } from "../elements/EFTimegroup";
1
+ import { EFTimegroup } from "../elements/EFTimegroup.ts";
2
2
  import {
3
3
  LitElement,
4
4
  html,
@@ -16,17 +16,21 @@ import {
16
16
  } from "lit/decorators.js";
17
17
  import { styleMap } from "lit/directives/style-map.js";
18
18
  import { ref, createRef } from "lit/directives/ref.js";
19
- import { EFImage } from "../elements/EFImage";
20
- import { EFAudio } from "../elements/EFAudio";
21
- import { EFVideo } from "../elements/EFVideo";
22
- import { EFCaptions, EFCaptionsActiveWord } from "../elements/EFCaptions";
23
- import { EFWaveform } from "../elements/EFWaveform";
24
- import type { TemporalMixinInterface } from "../elements/EFTemporal";
25
- import { TimegroupController } from "../elements/TimegroupController";
19
+ import { EFImage } from "../elements/EFImage.ts";
20
+ import { EFAudio } from "../elements/EFAudio.ts";
21
+ import { EFVideo } from "../elements/EFVideo.ts";
22
+ import { EFCaptions, EFCaptionsActiveWord } from "../elements/EFCaptions.ts";
23
+ import { EFWaveform } from "../elements/EFWaveform.ts";
24
+ import type { TemporalMixinInterface } from "../elements/EFTemporal.ts";
25
+ import { TimegroupController } from "../elements/TimegroupController.ts";
26
26
  import { consume } from "@lit/context";
27
- import { type FocusContext, focusContext, focusedElement } from "./EFWorkbench";
28
- import { TWMixin } from "./TWMixin";
29
- import { msToTimeCode } from "@/av/msToTimeCode";
27
+ import {
28
+ type FocusContext,
29
+ focusContext,
30
+ focusedElement,
31
+ } from "./EFWorkbench.ts";
32
+ import { TWMixin } from "./TWMixin.ts";
33
+ import { msToTimeCode } from "../msToTimeCode.ts";
30
34
 
31
35
  class ElementFilmstripController implements ReactiveController {
32
36
  constructor(
@@ -75,7 +79,7 @@ class FilmstripItem extends TWMixin(LitElement) {
75
79
  return this.element && this.focusContext?.focusedElement === this.element;
76
80
  }
77
81
 
78
- @property({ type: HTMLElement, attribute: false })
82
+ @property({ type: Object, attribute: false })
79
83
  element: TemporalMixinInterface & LitElement = new EFTimegroup();
80
84
 
81
85
  @property({ type: Number })
@@ -254,7 +258,7 @@ export class EFHTMLFilmstrip extends FilmstripItem {
254
258
  class EFHierarchyItem<
255
259
  ElementType extends HTMLElement = HTMLElement,
256
260
  > extends TWMixin(LitElement) {
257
- @property({ type: HTMLElement, attribute: false })
261
+ @property({ type: Object, attribute: false })
258
262
  // @ts-expect-error This could be initialzed with any HTMLElement
259
263
  element: ElementType = new EFTimegroup();
260
264
 
@@ -9,10 +9,9 @@ import {
9
9
  } from "lit/decorators.js";
10
10
  import { ref, createRef } from "lit/directives/ref.js";
11
11
 
12
- import { awaitMicrotask } from "@/util/awaitMicrotask";
13
- import { deepGetTemporalElements } from "../elements/EFTemporal";
14
- import { TWMixin } from "./TWMixin";
15
- import { shallowGetTimegroups } from "../elements/EFTimegroup";
12
+ import { deepGetTemporalElements } from "../elements/EFTemporal.ts";
13
+ import { TWMixin } from "./TWMixin.ts";
14
+ import { shallowGetTimegroups } from "../elements/EFTimegroup.ts";
16
15
 
17
16
  export interface FocusContext {
18
17
  focusedElement: HTMLElement | null;
@@ -215,7 +214,7 @@ export class EFWorkbench extends TWMixin(LitElement) {
215
214
 
216
215
  for (let i = 0; i < frameCount; i++) {
217
216
  firstGroup.currentTimeMs = i * stepDurationMs;
218
- await awaitMicrotask();
217
+ await new Promise<void>(queueMicrotask);
219
218
  const busyTasks = temporals
220
219
  .filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE)
221
220
  .map((temporal) => temporal.frameTask);
@@ -2,8 +2,11 @@ import type { LitElement } from "lit";
2
2
  // @ts-expect-error cannot figure out how to declare this module as a string
3
3
  import twStyle from "./TWMixin.css?inline";
4
4
 
5
- const twSheet = new CSSStyleSheet();
6
- twSheet.replaceSync(twStyle);
5
+ let twSheet: CSSStyleSheet | null = null;
6
+ if (typeof window !== "undefined") {
7
+ twSheet = new CSSStyleSheet();
8
+ twSheet.replaceSync(twStyle);
9
+ }
7
10
  export function TWMixin<T extends new (...args: any[]) => LitElement>(Base: T) {
8
11
  class TWElement extends Base {
9
12
  createRenderRoot() {
@@ -13,7 +16,11 @@ export function TWMixin<T extends new (...args: any[]) => LitElement>(Base: T) {
13
16
  "TWMixin can only be applied to elements with shadow roots",
14
17
  );
15
18
  }
16
-
19
+ if (!twSheet) {
20
+ throw new Error(
21
+ "twSheet not found. Probable cause: CSSStyleSheet not supported in this environment",
22
+ );
23
+ }
17
24
  if (renderRoot?.adoptedStyleSheets) {
18
25
  renderRoot.adoptedStyleSheets = [
19
26
  twSheet,