@editframe/elements 0.6.0-beta.9 → 0.7.0-beta.4

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 (102) hide show
  1. package/dist/lib/av/EncodedAsset.cjs +577 -0
  2. package/dist/lib/av/EncodedAsset.js +560 -0
  3. package/dist/lib/av/MP4File.cjs +187 -0
  4. package/dist/lib/av/MP4File.js +170 -0
  5. package/dist/lib/av/msToTimeCode.cjs +15 -0
  6. package/dist/lib/av/msToTimeCode.js +15 -0
  7. package/dist/lib/util/awaitMicrotask.cjs +4 -0
  8. package/dist/lib/util/awaitMicrotask.js +4 -0
  9. package/dist/lib/util/memoize.cjs +14 -0
  10. package/dist/lib/util/memoize.js +14 -0
  11. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +197 -0
  12. package/dist/packages/elements/src/EF_FRAMEGEN.d.ts +44 -0
  13. package/dist/packages/elements/src/EF_FRAMEGEN.js +197 -0
  14. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +4 -0
  15. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +1 -0
  16. package/dist/packages/elements/src/EF_INTERACTIVE.js +4 -0
  17. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +16 -0
  18. package/dist/packages/elements/src/elements/CrossUpdateController.d.ts +9 -0
  19. package/dist/packages/elements/src/elements/CrossUpdateController.js +16 -0
  20. package/dist/packages/elements/src/elements/EFAudio.cjs +53 -0
  21. package/dist/packages/elements/src/elements/EFAudio.d.ts +10 -0
  22. package/dist/packages/elements/src/elements/EFAudio.js +54 -0
  23. package/dist/packages/elements/src/elements/EFCaptions.cjs +164 -0
  24. package/dist/packages/elements/src/elements/EFCaptions.d.ts +38 -0
  25. package/dist/packages/elements/src/elements/EFCaptions.js +166 -0
  26. package/dist/packages/elements/src/elements/EFImage.cjs +79 -0
  27. package/dist/packages/elements/src/elements/EFImage.d.ts +14 -0
  28. package/dist/packages/elements/src/elements/EFImage.js +80 -0
  29. package/dist/packages/elements/src/elements/EFMedia.cjs +336 -0
  30. package/dist/packages/elements/src/elements/EFMedia.d.ts +61 -0
  31. package/dist/packages/elements/src/elements/EFMedia.js +336 -0
  32. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +55 -0
  33. package/dist/packages/elements/src/elements/EFSourceMixin.d.ts +12 -0
  34. package/dist/packages/elements/src/elements/EFSourceMixin.js +55 -0
  35. package/dist/packages/elements/src/elements/EFTemporal.cjs +199 -0
  36. package/dist/packages/elements/src/elements/EFTemporal.d.ts +38 -0
  37. package/dist/packages/elements/src/elements/EFTemporal.js +199 -0
  38. package/dist/packages/elements/src/elements/EFTimegroup.browsertest.d.ts +12 -0
  39. package/dist/packages/elements/src/elements/EFTimegroup.cjs +352 -0
  40. package/dist/packages/elements/src/elements/EFTimegroup.d.ts +39 -0
  41. package/dist/packages/elements/src/elements/EFTimegroup.js +353 -0
  42. package/dist/packages/elements/src/elements/EFTimeline.cjs +15 -0
  43. package/dist/packages/elements/src/elements/EFTimeline.d.ts +3 -0
  44. package/dist/packages/elements/src/elements/EFTimeline.js +15 -0
  45. package/dist/packages/elements/src/elements/EFVideo.cjs +109 -0
  46. package/dist/packages/elements/src/elements/EFVideo.d.ts +14 -0
  47. package/dist/packages/elements/src/elements/EFVideo.js +110 -0
  48. package/dist/packages/elements/src/elements/EFWaveform.cjs +242 -0
  49. package/dist/packages/elements/src/elements/EFWaveform.d.ts +30 -0
  50. package/dist/packages/elements/src/elements/EFWaveform.js +226 -0
  51. package/dist/packages/elements/src/elements/FetchMixin.cjs +28 -0
  52. package/dist/packages/elements/src/elements/FetchMixin.d.ts +8 -0
  53. package/dist/packages/elements/src/elements/FetchMixin.js +28 -0
  54. package/dist/packages/elements/src/elements/TimegroupController.cjs +20 -0
  55. package/dist/packages/elements/src/elements/TimegroupController.d.ts +14 -0
  56. package/dist/packages/elements/src/elements/TimegroupController.js +20 -0
  57. package/dist/packages/elements/src/elements/durationConverter.cjs +8 -0
  58. package/dist/packages/elements/src/elements/durationConverter.d.ts +4 -0
  59. package/dist/packages/elements/src/elements/durationConverter.js +8 -0
  60. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +12 -0
  61. package/dist/packages/elements/src/elements/parseTimeToMs.d.ts +1 -0
  62. package/dist/packages/elements/src/elements/parseTimeToMs.js +12 -0
  63. package/dist/packages/elements/src/elements/util.cjs +11 -0
  64. package/dist/packages/elements/src/elements/util.d.ts +4 -0
  65. package/dist/packages/elements/src/elements/util.js +11 -0
  66. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +825 -0
  67. package/dist/packages/elements/src/gui/EFFilmstrip.d.ts +147 -0
  68. package/dist/packages/elements/src/gui/EFFilmstrip.js +833 -0
  69. package/dist/packages/elements/src/gui/EFWorkbench.cjs +214 -0
  70. package/dist/packages/elements/src/gui/EFWorkbench.d.ts +45 -0
  71. package/dist/packages/elements/src/gui/EFWorkbench.js +215 -0
  72. package/dist/packages/elements/src/gui/TWMixin.cjs +28 -0
  73. package/dist/packages/elements/src/gui/TWMixin.css.cjs +3 -0
  74. package/dist/packages/elements/src/gui/TWMixin.css.js +4 -0
  75. package/dist/packages/elements/src/gui/TWMixin.d.ts +3 -0
  76. package/dist/packages/elements/src/gui/TWMixin.js +28 -0
  77. package/dist/packages/elements/src/index.cjs +52 -0
  78. package/dist/packages/elements/src/index.d.ts +11 -0
  79. package/dist/packages/elements/src/index.js +25 -0
  80. package/dist/style.css +791 -0
  81. package/package.json +14 -8
  82. package/src/elements/CrossUpdateController.ts +22 -0
  83. package/src/elements/EFAudio.ts +40 -0
  84. package/src/elements/EFCaptions.ts +188 -0
  85. package/src/elements/EFImage.ts +68 -0
  86. package/src/elements/EFMedia.ts +389 -0
  87. package/src/elements/EFSourceMixin.ts +57 -0
  88. package/src/elements/EFTemporal.ts +234 -0
  89. package/src/elements/EFTimegroup.browsertest.ts +333 -0
  90. package/src/elements/EFTimegroup.ts +393 -0
  91. package/src/elements/EFTimeline.ts +13 -0
  92. package/src/elements/EFVideo.ts +103 -0
  93. package/src/elements/EFWaveform.ts +417 -0
  94. package/src/elements/FetchMixin.ts +19 -0
  95. package/src/elements/TimegroupController.ts +25 -0
  96. package/src/elements/durationConverter.ts +6 -0
  97. package/src/elements/parseTimeToMs.ts +9 -0
  98. package/src/elements/util.ts +24 -0
  99. package/src/gui/EFFilmstrip.ts +884 -0
  100. package/src/gui/EFWorkbench.ts +233 -0
  101. package/src/gui/TWMixin.css +3 -0
  102. package/src/gui/TWMixin.ts +30 -0
@@ -0,0 +1,333 @@
1
+ import { describe, test, assert, beforeEach } from "vitest";
2
+ import {
3
+ LitElement,
4
+ type TemplateResult,
5
+ html,
6
+ render as litRender,
7
+ } from "lit";
8
+ import { EFTimegroup } from "./EFTimegroup";
9
+ import "./EFTimegroup";
10
+ import { customElement } from "lit/decorators/custom-element.js";
11
+ import { EFTemporal } from "./EFTemporal";
12
+
13
+ beforeEach(() => {
14
+ for (let i = 0; i < localStorage.length; i++) {
15
+ const key = localStorage.key(i);
16
+ if (typeof key !== "string") continue;
17
+ localStorage.removeItem(key);
18
+ }
19
+ while (document.body.children.length) {
20
+ document.body.children[0]?.remove();
21
+ }
22
+ });
23
+
24
+ @customElement("test-temporal")
25
+ class TestTemporal extends EFTemporal(LitElement) {
26
+ get hasOwnDuration(): boolean {
27
+ return true;
28
+ }
29
+ }
30
+
31
+ declare global {
32
+ interface HTMLElementTagNameMap {
33
+ "test-temporal": TestTemporal;
34
+ }
35
+ }
36
+
37
+ const renderTimegroup = (result: TemplateResult) => {
38
+ const container = document.createElement("div");
39
+ litRender(result, container);
40
+ const firstChild = container.firstElementChild;
41
+ if (!firstChild) {
42
+ throw new Error("No first child found");
43
+ }
44
+ if (!(firstChild instanceof EFTimegroup)) {
45
+ throw new Error("First child is not an EFTimegroup");
46
+ }
47
+ document.body.appendChild(firstChild);
48
+ return firstChild;
49
+ };
50
+
51
+ describe(`<ef-timegroup mode="fixed">`, () => {
52
+ test("can explicitly set a duration in seconds", async () => {
53
+ const timegroup = renderTimegroup(
54
+ html`<ef-timegroup mode="fixed" duration="10s"></ef-timegroup>`,
55
+ );
56
+ assert.equal(timegroup.durationMs, 10_000);
57
+ });
58
+
59
+ test("can explicitly set a duration in milliseconds", async () => {
60
+ const timegroup = renderTimegroup(
61
+ html`<ef-timegroup mode="fixed" duration="10ms"></ef-timegroup>`,
62
+ );
63
+ assert.equal(timegroup.durationMs, 10);
64
+ });
65
+ });
66
+
67
+ describe(`<ef-timegroup mode="sequence">`, () => {
68
+ test("fixed duration is ignored", () => {
69
+ const timegroup = renderTimegroup(
70
+ html`<ef-timegroup mode="sequence" duration="10s"></ef-timegroup>`,
71
+ );
72
+ assert.equal(timegroup.durationMs, 0);
73
+ });
74
+
75
+ test("duration is the sum of child time groups", async () => {
76
+ const timegroup = renderTimegroup(
77
+ html`
78
+ <ef-timegroup mode="sequence">
79
+ <ef-timegroup mode="fixed" duration="5s"></ef-timegroup>
80
+ <ef-timegroup mode="fixed" duration="5s"></ef-timegroup>
81
+ </ef-timegroup>
82
+ `,
83
+ );
84
+ assert.equal(timegroup.durationMs, 10_000);
85
+ });
86
+
87
+ test("duration can include any element with a durationMs value", async () => {
88
+ const timegroup = renderTimegroup(
89
+ html`
90
+ <ef-timegroup mode="sequence">
91
+ <ef-timegroup mode="fixed" duration="5s"></ef-timegroup>
92
+ <test-temporal duration="5s"></test-temporal>
93
+ </ef-timegroup>
94
+ `,
95
+ );
96
+
97
+ assert.equal(timegroup.durationMs, 10_000);
98
+ });
99
+
100
+ test("arbitrary html does not factor into the calculation of a sequence duration", () => {
101
+ const timegroup = renderTimegroup(
102
+ html`
103
+ <ef-timegroup mode="sequence">
104
+ <div>
105
+ <ef-timegroup mode="fixed" duration="5s"></ef-timegroup>
106
+ </div>
107
+ </ef-timegroup>
108
+ `,
109
+ );
110
+ assert.equal(timegroup.durationMs, 5_000);
111
+ });
112
+
113
+ test("nested time groups do not factor into the calculation of a sequence duration", async () => {
114
+ const timegroup = renderTimegroup(
115
+ html`
116
+ <ef-timegroup mode="sequence">
117
+ <ef-timegroup mode="fixed" duration="5s">
118
+ <ef-timegroup mode="fixed" duration="5s"></ef-timegroup>
119
+ </ef-timegroup>
120
+ </ef-timegroup>
121
+ `,
122
+ );
123
+ assert.equal(timegroup.durationMs, 5_000);
124
+ });
125
+ });
126
+
127
+ describe(`<ef-timegroup mode="contain">`, () => {
128
+ test("fixed duration is ignored", () => {
129
+ const timegroup = renderTimegroup(
130
+ html`<ef-timegroup mode="contain" duration="10s"></ef-timegroup>`,
131
+ );
132
+ assert.equal(timegroup.durationMs, 0);
133
+ });
134
+
135
+ test("duration is the maximum of it's child time groups", async () => {
136
+ const timegroup = renderTimegroup(
137
+ html`
138
+ <ef-timegroup mode="contain">
139
+ <ef-timegroup mode="fixed" duration="5s"></ef-timegroup>
140
+ <ef-timegroup mode="fixed" duration="10s"></ef-timegroup>
141
+ </ef-timegroup>
142
+ `,
143
+ );
144
+ assert.equal(timegroup.durationMs, 10_000);
145
+ });
146
+ });
147
+
148
+ describe("startTimeMs", () => {
149
+ test("is computed relative to the root time group", async () => {
150
+ const timegroup = renderTimegroup(
151
+ html`<ef-timegroup id="root" mode="sequence">
152
+ <ef-timegroup id="a" mode="fixed" duration="5s"></ef-timegroup>
153
+ <ef-timegroup id="b" mode="sequence">
154
+ <ef-timegroup id="c" mode="fixed" duration="5s"></ef-timegroup>
155
+ <ef-timegroup id="d" mode="contain">
156
+ <ef-timegroup id="e" mode="fixed" duration="5s"></ef-timegroup>
157
+ <ef-timegroup id="f" mode="fixed" duration="5s"></ef-timegroup>
158
+ </ef-timegroup>
159
+ </ef-timegroup>
160
+ </ef-timegroup>`,
161
+ );
162
+
163
+ const a = timegroup.querySelector("#a") as EFTimegroup;
164
+ const b = timegroup.querySelector("#b") as EFTimegroup;
165
+ const c = timegroup.querySelector("#c") as EFTimegroup;
166
+ const d = timegroup.querySelector("#d") as EFTimegroup;
167
+ const e = timegroup.querySelector("#e") as EFTimegroup;
168
+ const f = timegroup.querySelector("#f") as EFTimegroup;
169
+
170
+ assert.equal(a.startTimeMs, 0);
171
+ assert.equal(b.startTimeMs, 5_000);
172
+ assert.equal(c.startTimeMs, 5_000);
173
+ assert.equal(d.startTimeMs, 10_000);
174
+ assert.equal(e.startTimeMs, 10_000);
175
+ assert.equal(f.startTimeMs, 10_000);
176
+ });
177
+
178
+ // // TODO: Rethink offset math, it shouldn't effect the duration of a temporal item
179
+ // // but actually change the start and end time.
180
+ // litTest.skip("can be offset with offset attribute", async ({ container }) => {
181
+ // render(
182
+ // html`<ef-timegroup id="root" mode="contain">
183
+ // <test-temporal id="a" duration="5s" offset="5s"></test-temporal>
184
+ // </ef-timegroup> `,
185
+ // container,
186
+ // );
187
+
188
+ // const root = container.querySelector("#root") as EFTimegroup;
189
+ // const a = container.querySelector("#a") as TestTemporal;
190
+
191
+ // assert.equal(a.durationMs, 5_000);
192
+ // assert.equal(root.durationMs, 10_000);
193
+ // assert.equal(a.startTimeMs, 5_000);
194
+ // });
195
+
196
+ // litTest.skip(
197
+ // "offsets do not affect start time when in a sequence group",
198
+ // async ({ container }) => {
199
+ // render(
200
+ // html`<ef-timegroup id="root" mode="sequence">
201
+ // <test-temporal id="a" duration="5s"></test-temporal>
202
+ // <test-temporal id="b" duration="5s" offset="5s"></test-temporal>
203
+ // </ef-timegroup> `,
204
+ // container,
205
+ // );
206
+
207
+ // const root = container.querySelector("#root") as EFTimegroup;
208
+ // const a = container.querySelector("#a") as TestTemporal;
209
+ // const b = container.querySelector("#b") as TestTemporal;
210
+
211
+ // assert.equal(root.durationMs, 10_000);
212
+ // assert.equal(a.startTimeMs, 0);
213
+ // assert.equal(b.startTimeMs, 5_000);
214
+ // },
215
+ // );
216
+
217
+ test("temporal elements default to expand to fill a timegroup", async () => {
218
+ const timegroup = renderTimegroup(
219
+ html`<ef-timegroup id="root" mode="fixed" duration="10s">
220
+ <test-temporal id="a"></test-temporal>
221
+ </ef-timegroup> `,
222
+ );
223
+
224
+ const a = timegroup.querySelector("#a") as TestTemporal;
225
+
226
+ assert.equal(timegroup.durationMs, 10_000);
227
+ assert.equal(a.durationMs, 10_000);
228
+ });
229
+
230
+ test("element's parentTimegroup updates as they move", async () => {
231
+ const container = document.createElement("div");
232
+ document.body.appendChild(container);
233
+ const timegroup1 = document.createElement("ef-timegroup");
234
+ timegroup1.setAttribute("mode", "fixed");
235
+ timegroup1.setAttribute("duration", "5s");
236
+
237
+ const timegroup2 = document.createElement("ef-timegroup");
238
+ timegroup2.setAttribute("mode", "fixed");
239
+ timegroup2.setAttribute("duration", "5s");
240
+
241
+ container.appendChild(timegroup1);
242
+ container.appendChild(timegroup2);
243
+
244
+ const temporal = document.createElement("test-temporal");
245
+
246
+ timegroup1.appendChild(temporal);
247
+
248
+ assert.equal(temporal.parentTimegroup, timegroup1);
249
+
250
+ timegroup2.appendChild(temporal);
251
+ assert.equal(temporal.parentTimegroup, timegroup2);
252
+ });
253
+
254
+ test("elements can access their root temporal element", async () => {
255
+ const root = renderTimegroup(
256
+ html`<ef-timegroup id="root" mode="contain" duration="10s">
257
+ <ef-timegroup id="a" mode="contain">
258
+ <div>
259
+ <ef-timegroup id="b" mode="contain">
260
+ <div>
261
+ <test-temporal id="c" duration="5s"></test-temporal>
262
+ </div>
263
+ </ef-timegroup>
264
+ </div>
265
+ </ef-timegroup>
266
+ </ef-timegroup> `,
267
+ );
268
+
269
+ const a = root.querySelector("#a") as EFTimegroup;
270
+ const b = root.querySelector("#b") as EFTimegroup;
271
+ const c = root.querySelector("#c") as TestTemporal;
272
+
273
+ assert.equal(root.rootTimegroup, root);
274
+
275
+ assert.equal(a.rootTimegroup, root);
276
+ assert.equal(b.rootTimegroup, root);
277
+ assert.equal(c.rootTimegroup, root);
278
+ });
279
+ });
280
+
281
+ describe("setting currentTime", () => {
282
+ test("persists in localStorage if the timegroup has an id and is in the dom", async () => {
283
+ const timegroup = renderTimegroup(
284
+ html`<ef-timegroup id="root" mode="fixed" duration="10s"></ef-timegroup>`,
285
+ );
286
+ document.body.appendChild(timegroup);
287
+ assert.isNull(localStorage.getItem(timegroup.storageKey));
288
+ timegroup.currentTime = 5_000;
289
+ assert.equal(localStorage.getItem(timegroup.storageKey), "5000");
290
+ timegroup.remove();
291
+ });
292
+
293
+ test("does not persist in localStorage if the timegroup has no id", async () => {
294
+ const timegroup = renderTimegroup(
295
+ html`<ef-timegroup mode="fixed" duration="10s"></ef-timegroup>`,
296
+ );
297
+ document.body.appendChild(timegroup);
298
+ timegroup.currentTime = 5_000;
299
+ timegroup.removeAttribute("id");
300
+ assert.throws(() => {
301
+ assert.isNull(localStorage.getItem(timegroup.storageKey));
302
+ }, "Timegroup must have an id to use localStorage");
303
+ timegroup.remove();
304
+ });
305
+
306
+ test("nested items derive their ownCurrentTimeMs", async () => {
307
+ const timegroup = renderTimegroup(
308
+ html`
309
+ <ef-timegroup id="root" mode="sequence">
310
+ <ef-timegroup id="a" mode="fixed" duration="5s"> </ef-timegroup>
311
+ <ef-timegroup id="b" mode="fixed" duration="5s"> </ef-timegroup>
312
+ </ef-timegroup>
313
+ `,
314
+ );
315
+
316
+ const root = timegroup;
317
+ const a = timegroup.querySelector("#a") as EFTimegroup;
318
+ const b = timegroup.querySelector("#b") as EFTimegroup;
319
+
320
+ assert.equal(a.ownCurrentTimeMs, 0);
321
+ assert.equal(b.ownCurrentTimeMs, 0);
322
+
323
+ root.currentTimeMs = 2_500;
324
+
325
+ assert.equal(a.ownCurrentTimeMs, 2_500);
326
+ assert.equal(b.ownCurrentTimeMs, 0);
327
+
328
+ root.currentTimeMs = 7_500;
329
+
330
+ assert.equal(a.ownCurrentTimeMs, 5_000);
331
+ assert.equal(b.ownCurrentTimeMs, 2_500);
332
+ });
333
+ });