@editframe/elements 0.7.0-beta.6 → 0.7.0-beta.9

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 (86) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/package.json +2 -2
  3. package/postcss.config.cjs +12 -0
  4. package/{dist/packages/elements/src/EF_FRAMEGEN.js → src/EF_FRAMEGEN.ts} +113 -32
  5. package/src/EF_INTERACTIVE.ts +2 -0
  6. package/src/elements.css +22 -0
  7. package/src/index.ts +33 -0
  8. package/tailwind.config.ts +10 -0
  9. package/tsconfig.json +4 -0
  10. package/vite.config.ts +8 -0
  11. package/dist/lib/av/EncodedAsset.cjs +0 -577
  12. package/dist/lib/av/EncodedAsset.js +0 -560
  13. package/dist/lib/av/MP4File.cjs +0 -187
  14. package/dist/lib/av/MP4File.js +0 -170
  15. package/dist/lib/av/msToTimeCode.cjs +0 -15
  16. package/dist/lib/av/msToTimeCode.js +0 -15
  17. package/dist/lib/util/awaitMicrotask.cjs +0 -4
  18. package/dist/lib/util/awaitMicrotask.js +0 -4
  19. package/dist/lib/util/memoize.cjs +0 -14
  20. package/dist/lib/util/memoize.js +0 -14
  21. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +0 -197
  22. package/dist/packages/elements/src/EF_FRAMEGEN.d.ts +0 -44
  23. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +0 -4
  24. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +0 -1
  25. package/dist/packages/elements/src/EF_INTERACTIVE.js +0 -4
  26. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +0 -16
  27. package/dist/packages/elements/src/elements/CrossUpdateController.d.ts +0 -9
  28. package/dist/packages/elements/src/elements/CrossUpdateController.js +0 -16
  29. package/dist/packages/elements/src/elements/EFAudio.cjs +0 -53
  30. package/dist/packages/elements/src/elements/EFAudio.d.ts +0 -10
  31. package/dist/packages/elements/src/elements/EFAudio.js +0 -54
  32. package/dist/packages/elements/src/elements/EFCaptions.cjs +0 -164
  33. package/dist/packages/elements/src/elements/EFCaptions.d.ts +0 -38
  34. package/dist/packages/elements/src/elements/EFCaptions.js +0 -166
  35. package/dist/packages/elements/src/elements/EFImage.cjs +0 -79
  36. package/dist/packages/elements/src/elements/EFImage.d.ts +0 -14
  37. package/dist/packages/elements/src/elements/EFImage.js +0 -80
  38. package/dist/packages/elements/src/elements/EFMedia.cjs +0 -336
  39. package/dist/packages/elements/src/elements/EFMedia.d.ts +0 -61
  40. package/dist/packages/elements/src/elements/EFMedia.js +0 -336
  41. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +0 -55
  42. package/dist/packages/elements/src/elements/EFSourceMixin.d.ts +0 -12
  43. package/dist/packages/elements/src/elements/EFSourceMixin.js +0 -55
  44. package/dist/packages/elements/src/elements/EFTemporal.cjs +0 -199
  45. package/dist/packages/elements/src/elements/EFTemporal.d.ts +0 -38
  46. package/dist/packages/elements/src/elements/EFTemporal.js +0 -199
  47. package/dist/packages/elements/src/elements/EFTimegroup.browsertest.d.ts +0 -12
  48. package/dist/packages/elements/src/elements/EFTimegroup.cjs +0 -352
  49. package/dist/packages/elements/src/elements/EFTimegroup.d.ts +0 -39
  50. package/dist/packages/elements/src/elements/EFTimegroup.js +0 -353
  51. package/dist/packages/elements/src/elements/EFVideo.cjs +0 -109
  52. package/dist/packages/elements/src/elements/EFVideo.d.ts +0 -14
  53. package/dist/packages/elements/src/elements/EFVideo.js +0 -110
  54. package/dist/packages/elements/src/elements/EFWaveform.cjs +0 -242
  55. package/dist/packages/elements/src/elements/EFWaveform.d.ts +0 -30
  56. package/dist/packages/elements/src/elements/EFWaveform.js +0 -226
  57. package/dist/packages/elements/src/elements/FetchMixin.cjs +0 -28
  58. package/dist/packages/elements/src/elements/FetchMixin.d.ts +0 -8
  59. package/dist/packages/elements/src/elements/FetchMixin.js +0 -28
  60. package/dist/packages/elements/src/elements/TimegroupController.cjs +0 -20
  61. package/dist/packages/elements/src/elements/TimegroupController.d.ts +0 -14
  62. package/dist/packages/elements/src/elements/TimegroupController.js +0 -20
  63. package/dist/packages/elements/src/elements/durationConverter.cjs +0 -8
  64. package/dist/packages/elements/src/elements/durationConverter.d.ts +0 -4
  65. package/dist/packages/elements/src/elements/durationConverter.js +0 -8
  66. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +0 -12
  67. package/dist/packages/elements/src/elements/parseTimeToMs.d.ts +0 -1
  68. package/dist/packages/elements/src/elements/parseTimeToMs.js +0 -12
  69. package/dist/packages/elements/src/elements/util.cjs +0 -11
  70. package/dist/packages/elements/src/elements/util.d.ts +0 -4
  71. package/dist/packages/elements/src/elements/util.js +0 -11
  72. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +0 -825
  73. package/dist/packages/elements/src/gui/EFFilmstrip.d.ts +0 -147
  74. package/dist/packages/elements/src/gui/EFFilmstrip.js +0 -833
  75. package/dist/packages/elements/src/gui/EFWorkbench.cjs +0 -214
  76. package/dist/packages/elements/src/gui/EFWorkbench.d.ts +0 -45
  77. package/dist/packages/elements/src/gui/EFWorkbench.js +0 -215
  78. package/dist/packages/elements/src/gui/TWMixin.cjs +0 -28
  79. package/dist/packages/elements/src/gui/TWMixin.css.cjs +0 -3
  80. package/dist/packages/elements/src/gui/TWMixin.css.js +0 -4
  81. package/dist/packages/elements/src/gui/TWMixin.d.ts +0 -3
  82. package/dist/packages/elements/src/gui/TWMixin.js +0 -28
  83. package/dist/packages/elements/src/index.cjs +0 -50
  84. package/dist/packages/elements/src/index.d.ts +0 -10
  85. package/dist/packages/elements/src/index.js +0 -23
  86. package/dist/style.css +0 -791
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @editframe/elements
2
+
3
+ ## 0.7.0-beta.9
4
+
5
+ ### Patch Changes
6
+
7
+ - [#33](https://github.com/editframe/elements/pull/33) [`17c4452`](https://github.com/editframe/elements/commit/17c4452f679b042ac0accd9bf520728455e8cc2c) Thanks [@IliasHad](https://github.com/IliasHad)! - resolve lit global package issue
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@editframe/elements",
3
- "version": "0.7.0-beta.6",
3
+ "version": "0.7.0-beta.9",
4
4
  "description": "",
5
5
  "exports": {
6
6
  ".": {
@@ -24,7 +24,7 @@
24
24
  "author": "",
25
25
  "license": "UNLICENSED",
26
26
  "dependencies": {
27
- "@editframe/assets": "0.7.0-beta.6",
27
+ "@editframe/assets": "0.7.0-beta.8",
28
28
  "@lit/context": "^1.1.2",
29
29
  "@lit/task": "^1.0.1",
30
30
  "d3": "^7.9.0",
@@ -0,0 +1,12 @@
1
+ const path = require("node:path");
2
+ module.exports = {
3
+ plugins: {
4
+ autoprefixer: {},
5
+ "postcss-import": {},
6
+ tailwindcss: {
7
+ config: {
8
+ content: [path.join(__dirname, "src/**/*.ts")],
9
+ },
10
+ },
11
+ },
12
+ };
@@ -1,10 +1,49 @@
1
1
  import debug from "debug";
2
2
  import { TaskStatus } from "@lit/task";
3
- import { awaitMicrotask } from "../../../lib/util/awaitMicrotask.js";
4
- import { deepGetElementsWithFrameTasks } from "./elements/EFTemporal.js";
5
- import { shallowGetTimegroups } from "./elements/EFTimegroup.js";
3
+
4
+ import type { VideoRenderOptions } from "@editframe/assets";
5
+ import { awaitMicrotask } from "@/util/awaitMicrotask";
6
+
7
+ import { deepGetElementsWithFrameTasks } from "./elements/EFTemporal";
8
+ import { shallowGetTimegroups } from "./elements/EFTimegroup";
9
+
6
10
  const log = debug("ef:elements:EF_FRAMEGEN");
11
+
12
+ declare global {
13
+ interface Window {
14
+ EF_FRAMEGEN?: EfFramegen;
15
+ FRAMEGEN_BRIDGE?: {
16
+ onInitialize: (
17
+ callback: (renderId: string, renderOptions: VideoRenderOptions) => void,
18
+ ) => void;
19
+
20
+ initialized(renderId: string): void;
21
+
22
+ onBeginFrame(
23
+ callback: (
24
+ renderId: string,
25
+ frameNumber: number,
26
+ isLast: boolean,
27
+ ) => void,
28
+ ): void;
29
+
30
+ onTriggerCanvas(callback: () => void): void;
31
+
32
+ frameReady(
33
+ renderId: string,
34
+ frameNumber: number,
35
+ audioSamples: ArrayBuffer,
36
+ ): void;
37
+
38
+ error(renderId: string, error: Error): void;
39
+ };
40
+ }
41
+ }
42
+
7
43
  class TriggerCanvas {
44
+ private canvas: HTMLCanvasElement;
45
+ private ctx: CanvasRenderingContext2D;
46
+
8
47
  constructor() {
9
48
  this.canvas = document.createElement("canvas");
10
49
  this.canvas.width = 1;
@@ -15,7 +54,7 @@ class TriggerCanvas {
15
54
  left: "0px",
16
55
  width: "1px",
17
56
  height: "1px",
18
- zIndex: "100000"
57
+ zIndex: "100000",
19
58
  });
20
59
  document.body.prepend(this.canvas);
21
60
  const ctx = this.canvas.getContext("2d", { willReadFrequently: true });
@@ -23,54 +62,70 @@ class TriggerCanvas {
23
62
  this.ctx = ctx;
24
63
  this.ctx.fillStyle = "black";
25
64
  }
65
+
26
66
  trigger() {
27
67
  log("TRIGGERING CANVAS");
28
68
  this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
29
69
  }
30
70
  }
31
- class EfFramegen {
71
+
72
+ export class EfFramegen {
73
+ time = 0;
74
+ frameDurationMs = 0;
75
+ initialBusyTasks: Promise<unknown[]> = Promise.resolve([]);
76
+ audioBufferPromise?: Promise<AudioBuffer>;
77
+ renderOptions?: VideoRenderOptions;
78
+ frameBox = document.createElement("div");
79
+ BRIDGE = window.FRAMEGEN_BRIDGE;
80
+ triggerCanvas = new TriggerCanvas();
81
+
82
+ trace(...args: any[]) {
83
+ console.trace("[EF_FRAMEGEN]", ...args);
84
+ }
85
+
32
86
  constructor() {
33
- this.time = 0;
34
- this.frameDurationMs = 0;
35
- this.initialBusyTasks = Promise.resolve([]);
36
- this.frameBox = document.createElement("div");
37
- this.BRIDGE = window.FRAMEGEN_BRIDGE;
38
- this.triggerCanvas = new TriggerCanvas();
39
87
  if (this.BRIDGE) {
40
88
  this.connectToBridge();
41
89
  }
42
90
  }
43
- trace(...args) {
44
- console.trace("[EF_FRAMEGEN]", ...args);
45
- }
91
+
46
92
  connectToBridge() {
47
93
  const BRIDGE = this.BRIDGE;
48
94
  if (!BRIDGE) {
49
95
  throw new Error("No BRIDGE when attempting to connect to bridge");
50
96
  }
97
+
51
98
  BRIDGE.onInitialize(async (renderId, renderOptions) => {
52
99
  log("BRIDGE.onInitialize", renderId, renderOptions);
53
100
  await this.initialize(renderId, renderOptions);
54
101
  BRIDGE.initialized(renderId);
55
102
  });
103
+
56
104
  BRIDGE.onBeginFrame((renderId, frameNumber, isLast) => {
57
105
  log("BRIDGE.onBeginFrame", renderId, frameNumber, isLast);
58
106
  this.beginFrame(renderId, frameNumber, isLast);
59
107
  });
108
+
109
+ // BRIDGE.onTriggerCanvas(() => {
110
+ // // this.triggerCanvas.trigger();
111
+ // });
60
112
  }
61
- async initialize(renderId, renderOptions) {
113
+
114
+ async initialize(renderId: string, renderOptions: VideoRenderOptions) {
62
115
  addEventListener("unhandledrejection", (event) => {
63
116
  this.trace("Unhandled rejection:", event.reason);
64
117
  if (this.BRIDGE) {
65
118
  this.BRIDGE.error(renderId, event.reason);
66
119
  }
67
120
  });
121
+
68
122
  addEventListener("error", (event) => {
69
123
  this.trace("Uncaught error", event.error);
70
124
  if (this.BRIDGE) {
71
125
  this.BRIDGE.error(renderId, event.error);
72
126
  }
73
127
  });
128
+
74
129
  this.renderOptions = renderOptions;
75
130
  const workbench = document.querySelector("ef-workbench");
76
131
  if (!workbench) {
@@ -80,14 +135,21 @@ class EfFramegen {
80
135
  const timegroups = shallowGetTimegroups(workbench);
81
136
  const temporals = deepGetElementsWithFrameTasks(workbench);
82
137
  const firstGroup = timegroups[0];
138
+
83
139
  if (!firstGroup) {
84
140
  throw new Error("No temporal elements found");
85
141
  }
86
142
  firstGroup.currentTimeMs = renderOptions.encoderOptions.fromMs;
87
- this.frameDurationMs = 1e3 / renderOptions.encoderOptions.video.framerate;
143
+
144
+ this.frameDurationMs = 1000 / renderOptions.encoderOptions.video.framerate;
145
+
88
146
  this.initialBusyTasks = Promise.all(
89
- temporals.filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE).map((temporal) => temporal.frameTask).map((task) => task.taskComplete)
147
+ temporals
148
+ .filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE)
149
+ .map((temporal) => temporal.frameTask)
150
+ .map((task) => task.taskComplete),
90
151
  );
152
+
91
153
  this.time = 0;
92
154
  if (renderOptions.showFrameBox) {
93
155
  Object.assign(this.frameBox.style, {
@@ -98,20 +160,21 @@ class EfFramegen {
98
160
  position: "absolute",
99
161
  top: "0px",
100
162
  left: "0px",
101
- zIndex: "100000"
163
+ zIndex: "100000",
102
164
  });
103
165
  document.body.prepend(this.frameBox);
104
166
  }
167
+
105
168
  this.audioBufferPromise = firstGroup.renderAudio(
106
- renderOptions.encoderOptions.alignedFromUs / 1e3,
107
- renderOptions.encoderOptions.alignedToUs / 1e3
169
+ renderOptions.encoderOptions.alignedFromUs / 1000,
170
+ renderOptions.encoderOptions.alignedToUs / 1000,
108
171
  // renderOptions.encoderOptions.fromMs,
109
172
  // renderOptions.encoderOptions.toMs,
110
173
  );
111
174
  log("Initialized");
112
175
  }
113
- async beginFrame(renderId, frameNumber, isLast) {
114
- if (this.renderOptions === void 0) {
176
+ async beginFrame(renderId: string, frameNumber: number, isLast: boolean) {
177
+ if (this.renderOptions === undefined) {
115
178
  throw new Error("No renderOptions");
116
179
  }
117
180
  if (this.renderOptions.showFrameBox) {
@@ -131,40 +194,60 @@ class EfFramegen {
131
194
  if (!firstGroup) {
132
195
  throw new Error("No temporal elements found");
133
196
  }
134
- this.time = this.renderOptions.encoderOptions.fromMs + frameNumber * this.frameDurationMs;
197
+
198
+ this.time =
199
+ this.renderOptions.encoderOptions.fromMs +
200
+ frameNumber * this.frameDurationMs;
201
+
135
202
  firstGroup.currentTimeMs = this.time;
203
+
136
204
  log("Awaiting initialBusyTasks");
137
205
  await this.initialBusyTasks;
206
+
138
207
  log("Awaiting microtask");
139
208
  await awaitMicrotask();
209
+
140
210
  log("Awaiting frame tasks");
141
211
  const now = performance.now();
142
212
  await Promise.all(
143
- temporals.filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE).map((temporal) => {
144
- return temporal.frameTask;
145
- }).map((task) => task.taskComplete)
213
+ temporals
214
+ .filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE)
215
+ .map((temporal) => {
216
+ return temporal.frameTask;
217
+ })
218
+ .map((task) => task.taskComplete),
146
219
  );
220
+
147
221
  log(`frame:${frameNumber} All tasks complete ${performance.now() - now}ms`);
222
+
148
223
  if (isLast && this.audioBufferPromise) {
224
+ // Currently we emit the audio in one belch at the end of the render.
225
+ // This is not ideal, but it's the simplest thing that could possibly work.
226
+ // We could either emit it slices, or in parallel with the video.
227
+ // But in any case, it's fine for now.
149
228
  const renderedAudio = await this.audioBufferPromise;
229
+
150
230
  const channelCount = renderedAudio.numberOfChannels;
231
+
151
232
  const interleavedSamples = new Float32Array(
152
- channelCount * renderedAudio.length
233
+ channelCount * renderedAudio.length,
153
234
  );
235
+
154
236
  for (let i = 0; i < renderedAudio.length; i++) {
155
237
  for (let j = 0; j < channelCount; j++) {
156
238
  interleavedSamples.set(
157
239
  renderedAudio.getChannelData(j).slice(i, i + 1),
158
- i * channelCount + j
240
+ i * channelCount + j,
159
241
  );
160
242
  }
161
243
  }
244
+
162
245
  if (this.BRIDGE) {
163
246
  this.triggerCanvas.trigger();
164
247
  this.BRIDGE.frameReady(
165
248
  renderId,
166
249
  frameNumber,
167
- interleavedSamples.buffer
250
+ interleavedSamples.buffer,
168
251
  );
169
252
  } else {
170
253
  const fileReader = new FileReader();
@@ -191,7 +274,5 @@ class EfFramegen {
191
274
  }
192
275
  }
193
276
  }
277
+
194
278
  window.EF_FRAMEGEN = new EfFramegen();
195
- export {
196
- EfFramegen
197
- };
@@ -0,0 +1,2 @@
1
+ export const EF_INTERACTIVE =
2
+ !window.location.search.includes("EF_NONINTERACTIVE");
@@ -0,0 +1,22 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ html {
6
+ @apply h-full w-full;
7
+ }
8
+ body {
9
+ @apply h-full w-full bg-black;
10
+ }
11
+
12
+ :root {
13
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
14
+ line-height: 1.5;
15
+ font-weight: 400;
16
+
17
+ font-synthesis: none;
18
+ text-rendering: optimizeLegibility;
19
+ -webkit-font-smoothing: antialiased;
20
+ -moz-osx-font-smoothing: grayscale;
21
+ -webkit-text-size-adjust: 100%;
22
+ }
package/src/index.ts ADDED
@@ -0,0 +1,33 @@
1
+ import "./elements.css";
2
+
3
+ import "./elements/EFTimegroup";
4
+ export { EFTimegroup } from "./elements/EFTimegroup";
5
+
6
+ import "./elements/EFImage";
7
+ export { EFImage } from "./elements/EFImage";
8
+
9
+ import "./elements/EFMedia";
10
+ export type { EFMedia } from "./elements/EFMedia";
11
+
12
+ import "./elements/EFAudio";
13
+ export { EFAudio } from "./elements/EFAudio";
14
+
15
+ import "./elements/EFVideo";
16
+ export { EFVideo } from "./elements/EFVideo";
17
+
18
+ import "./elements/EFCaptions";
19
+ export { EFCaptions, EFCaptionsActiveWord } from "./elements/EFCaptions";
20
+
21
+ import "./elements/EFWaveform";
22
+ export { EFWaveform } from "./elements/EFWaveform";
23
+
24
+ import "./gui/EFWorkbench";
25
+ export { EFWorkbench } from "./gui/EFWorkbench";
26
+
27
+ import "./gui/EFFilmstrip";
28
+ export { EFFilmstrip } from "./gui/EFFilmstrip";
29
+
30
+ // @ts-expect-error
31
+ window.EF_REGISTERED = true;
32
+
33
+ import "./EF_FRAMEGEN";
@@ -0,0 +1,10 @@
1
+ import type { Config } from "tailwindcss";
2
+
3
+ module.exports = {
4
+ content: ["./src/**/*.ts"],
5
+
6
+ theme: {
7
+ extend: {},
8
+ },
9
+ plugins: [],
10
+ } satisfies Config;
package/tsconfig.json ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "include": ["src/**/*.ts"],
3
+ "extends": "../../tsconfig.json"
4
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,8 @@
1
+ import path from "node:path";
2
+
3
+ import { defineViteBuildConfig } from "../defineViteBuildConfig";
4
+
5
+ export default defineViteBuildConfig({
6
+ root: path.dirname(new URL(import.meta.url).pathname),
7
+ name: "editframe-elements",
8
+ });