@editframe/elements 0.5.0-beta.8 → 0.6.0-beta.1

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 (109) hide show
  1. package/dist/lib/av/EncodedAsset.cjs +561 -0
  2. package/dist/{editor/util/EncodedAsset/EncodedAsset.mjs → lib/av/EncodedAsset.js} +40 -33
  3. package/dist/lib/av/MP4File.cjs +182 -0
  4. package/dist/{editor/util/MP4File.mjs → lib/av/MP4File.js} +55 -51
  5. package/dist/lib/av/msToTimeCode.cjs +15 -0
  6. package/dist/lib/util/awaitMicrotask.cjs +8 -0
  7. package/dist/lib/util/memoize.cjs +14 -0
  8. package/dist/{util/memoize.mjs → lib/util/memoize.js} +1 -2
  9. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +197 -0
  10. package/dist/packages/elements/src/EF_FRAMEGEN.d.ts +45 -0
  11. package/dist/packages/elements/src/EF_FRAMEGEN.js +197 -0
  12. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +4 -0
  13. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +1 -0
  14. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +16 -0
  15. package/dist/packages/elements/src/elements/CrossUpdateController.d.ts +9 -0
  16. package/dist/packages/elements/src/elements/EFAudio.cjs +53 -0
  17. package/dist/packages/elements/src/elements/EFAudio.d.ts +10 -0
  18. package/dist/{elements/src/elements/EFAudio.mjs → packages/elements/src/elements/EFAudio.js} +2 -5
  19. package/dist/packages/elements/src/elements/EFCaptions.cjs +171 -0
  20. package/dist/packages/elements/src/elements/EFCaptions.d.ts +39 -0
  21. package/dist/{elements/src/elements/EFCaptions.mjs → packages/elements/src/elements/EFCaptions.js} +18 -20
  22. package/dist/packages/elements/src/elements/EFImage.cjs +79 -0
  23. package/dist/packages/elements/src/elements/EFImage.d.ts +14 -0
  24. package/dist/{elements/src/elements/EFImage.mjs → packages/elements/src/elements/EFImage.js} +8 -7
  25. package/dist/packages/elements/src/elements/EFMedia.cjs +334 -0
  26. package/dist/packages/elements/src/elements/EFMedia.d.ts +61 -0
  27. package/dist/{elements/src/elements/EFMedia.mjs → packages/elements/src/elements/EFMedia.js} +40 -38
  28. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +55 -0
  29. package/dist/packages/elements/src/elements/EFSourceMixin.d.ts +12 -0
  30. package/dist/{elements/src/elements/EFSourceMixin.mjs → packages/elements/src/elements/EFSourceMixin.js} +6 -8
  31. package/dist/packages/elements/src/elements/EFTemporal.cjs +198 -0
  32. package/dist/packages/elements/src/elements/EFTemporal.d.ts +36 -0
  33. package/dist/{elements/src/elements/EFTemporal.mjs → packages/elements/src/elements/EFTemporal.js} +6 -22
  34. package/dist/packages/elements/src/elements/EFTimegroup.browsertest.d.ts +12 -0
  35. package/{src/elements/EFTimegroup.ts → dist/packages/elements/src/elements/EFTimegroup.cjs} +162 -213
  36. package/dist/packages/elements/src/elements/EFTimegroup.d.ts +39 -0
  37. package/dist/{elements/src/elements/EFTimegroup.mjs → packages/elements/src/elements/EFTimegroup.js} +55 -65
  38. package/{src/elements/EFTimeline.ts → dist/packages/elements/src/elements/EFTimeline.cjs} +5 -3
  39. package/dist/packages/elements/src/elements/EFTimeline.d.ts +3 -0
  40. package/dist/{elements/src/elements/EFTimeline.mjs → packages/elements/src/elements/EFTimeline.js} +5 -2
  41. package/dist/packages/elements/src/elements/EFVideo.cjs +110 -0
  42. package/dist/packages/elements/src/elements/EFVideo.d.ts +14 -0
  43. package/dist/{elements/src/elements/EFVideo.mjs → packages/elements/src/elements/EFVideo.js} +10 -32
  44. package/dist/packages/elements/src/elements/EFWaveform.cjs +235 -0
  45. package/dist/packages/elements/src/elements/EFWaveform.d.ts +28 -0
  46. package/dist/{elements/src/elements/EFWaveform.mjs → packages/elements/src/elements/EFWaveform.js} +15 -16
  47. package/dist/packages/elements/src/elements/FetchMixin.cjs +28 -0
  48. package/dist/packages/elements/src/elements/FetchMixin.d.ts +8 -0
  49. package/dist/{elements/src/elements/FetchMixin.mjs → packages/elements/src/elements/FetchMixin.js} +5 -7
  50. package/dist/packages/elements/src/elements/TimegroupController.cjs +20 -0
  51. package/dist/packages/elements/src/elements/TimegroupController.d.ts +14 -0
  52. package/dist/packages/elements/src/elements/durationConverter.cjs +8 -0
  53. package/dist/packages/elements/src/elements/durationConverter.d.ts +4 -0
  54. package/dist/{elements/src/elements/durationConverter.mjs → packages/elements/src/elements/durationConverter.js} +1 -1
  55. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +12 -0
  56. package/dist/packages/elements/src/elements/parseTimeToMs.d.ts +1 -0
  57. package/dist/packages/elements/src/elements/parseTimeToMs.js +12 -0
  58. package/dist/packages/elements/src/elements/util.cjs +11 -0
  59. package/dist/packages/elements/src/elements/util.d.ts +4 -0
  60. package/dist/{elements/src/elements/util.mjs → packages/elements/src/elements/util.js} +1 -1
  61. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +675 -0
  62. package/dist/packages/elements/src/gui/EFFilmstrip.d.ts +138 -0
  63. package/dist/{elements/src/gui/EFFilmstrip.mjs → packages/elements/src/gui/EFFilmstrip.js} +57 -55
  64. package/dist/packages/elements/src/gui/EFWorkbench.cjs +199 -0
  65. package/dist/packages/elements/src/gui/EFWorkbench.d.ts +44 -0
  66. package/dist/{elements/src/gui/EFWorkbench.mjs → packages/elements/src/gui/EFWorkbench.js} +27 -49
  67. package/{src/gui/TWMixin.ts → dist/packages/elements/src/gui/TWMixin.cjs} +11 -10
  68. package/dist/packages/elements/src/gui/TWMixin.css.cjs +3 -0
  69. package/dist/packages/elements/src/gui/TWMixin.css.js +4 -0
  70. package/dist/packages/elements/src/gui/TWMixin.d.ts +3 -0
  71. package/dist/{elements/src/gui/TWMixin.mjs → packages/elements/src/gui/TWMixin.js} +4 -3
  72. package/dist/packages/elements/src/index.cjs +47 -0
  73. package/dist/packages/elements/src/index.d.ts +10 -0
  74. package/dist/packages/elements/src/index.js +23 -0
  75. package/dist/style.css +13 -4
  76. package/package.json +23 -4
  77. package/dist/elements/src/EF_FRAMEGEN.mjs +0 -130
  78. package/dist/elements/src/elements/parseTimeToMs.mjs +0 -13
  79. package/dist/elements/src/elements.mjs +0 -12
  80. package/dist/elements/src/gui/TWMixin.css.mjs +0 -4
  81. package/dist/util/awaitAnimationFrame.mjs +0 -11
  82. package/docker-compose.yaml +0 -17
  83. package/src/EF_FRAMEGEN.ts +0 -208
  84. package/src/EF_INTERACTIVE.ts +0 -2
  85. package/src/elements/CrossUpdateController.ts +0 -18
  86. package/src/elements/EFAudio.ts +0 -42
  87. package/src/elements/EFCaptions.ts +0 -202
  88. package/src/elements/EFImage.ts +0 -70
  89. package/src/elements/EFMedia.ts +0 -395
  90. package/src/elements/EFSourceMixin.ts +0 -57
  91. package/src/elements/EFTemporal.ts +0 -246
  92. package/src/elements/EFTimegroup.browsertest.ts +0 -360
  93. package/src/elements/EFVideo.ts +0 -114
  94. package/src/elements/EFWaveform.ts +0 -407
  95. package/src/elements/FetchMixin.ts +0 -18
  96. package/src/elements/TimegroupController.ts +0 -25
  97. package/src/elements/buildLitFixture.ts +0 -13
  98. package/src/elements/durationConverter.ts +0 -6
  99. package/src/elements/parseTimeToMs.ts +0 -10
  100. package/src/elements/util.ts +0 -24
  101. package/src/gui/EFFilmstrip.ts +0 -702
  102. package/src/gui/EFWorkbench.ts +0 -242
  103. package/src/gui/TWMixin.css +0 -3
  104. package/src/util.d.ts +0 -1
  105. /package/dist/{editor/msToTimeCode.mjs → lib/av/msToTimeCode.js} +0 -0
  106. /package/dist/{util/awaitMicrotask.mjs → lib/util/awaitMicrotask.js} +0 -0
  107. /package/dist/{elements/src/EF_INTERACTIVE.mjs → packages/elements/src/EF_INTERACTIVE.js} +0 -0
  108. /package/dist/{elements/src/elements/CrossUpdateController.mjs → packages/elements/src/elements/CrossUpdateController.js} +0 -0
  109. /package/dist/{elements/src/elements/TimegroupController.mjs → packages/elements/src/elements/TimegroupController.js} +0 -0
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const EFAudio = require("./EFAudio.cjs");
4
+ const lit = require("lit");
5
+ const decorators_js = require("lit/decorators.js");
6
+ const EFVideo = require("./EFVideo.cjs");
7
+ const EFTemporal = require("./EFTemporal.cjs");
8
+ const CrossUpdateController = require("./CrossUpdateController.cjs");
9
+ const TWMixin = require("../gui/TWMixin.cjs");
10
+ const task = require("@lit/task");
11
+ const d3 = require("d3");
12
+ const ref_js = require("lit/directives/ref.js");
13
+ const EF_INTERACTIVE = require("../EF_INTERACTIVE.cjs");
14
+ function _interopNamespaceDefault(e) {
15
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
16
+ if (e) {
17
+ for (const k in e) {
18
+ if (k !== "default") {
19
+ const d = Object.getOwnPropertyDescriptor(e, k);
20
+ Object.defineProperty(n, k, d.get ? d : {
21
+ enumerable: true,
22
+ get: () => e[k]
23
+ });
24
+ }
25
+ }
26
+ }
27
+ n.default = e;
28
+ return Object.freeze(n);
29
+ }
30
+ const d3__namespace = /* @__PURE__ */ _interopNamespaceDefault(d3);
31
+ var __defProp = Object.defineProperty;
32
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
33
+ var __decorateClass = (decorators, target, key, kind) => {
34
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
35
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
36
+ if (decorator = decorators[i])
37
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
38
+ if (kind && result) __defProp(target, key, result);
39
+ return result;
40
+ };
41
+ exports.EFWaveform = class EFWaveform extends EFTemporal.EFTemporal(TWMixin.TWMixin(lit.LitElement)) {
42
+ constructor() {
43
+ super(...arguments);
44
+ this.svgRef = ref_js.createRef();
45
+ this.mode = "bars";
46
+ this.color = "currentColor";
47
+ this.frameTask = new task.Task(this, {
48
+ autoRun: EF_INTERACTIVE.EF_INTERACTIVE,
49
+ args: () => [this.target.audioBufferTask.status],
50
+ task: async () => {
51
+ await this.target.audioBufferTask.taskComplete;
52
+ }
53
+ });
54
+ }
55
+ createRenderRoot() {
56
+ return this;
57
+ }
58
+ render() {
59
+ return lit.html` <svg ${ref_js.ref(this.svgRef)} class="h-full w-full" store></svg> `;
60
+ }
61
+ connectedCallback() {
62
+ super.connectedCallback();
63
+ if (this.target) {
64
+ new CrossUpdateController.CrossUpdateController(this.target, this);
65
+ }
66
+ }
67
+ drawBars(svg, frequencyData) {
68
+ const waveWidth = svg.clientWidth * devicePixelRatio;
69
+ const waveHeight = svg.clientHeight;
70
+ const waveLeft = 0;
71
+ const waveRight = waveWidth;
72
+ const barX = d3__namespace.scaleBand().paddingInner(0.5).paddingOuter(0.01).domain(d3__namespace.range(frequencyData.length).map((n) => String(n))).rangeRound([waveLeft, waveRight]);
73
+ const height = d3__namespace.scaleLinear().domain([0, 255]).range([0, waveHeight / 2]);
74
+ const baseline = waveHeight / 2;
75
+ const bars = d3__namespace.select(svg).selectAll("rect").data(frequencyData);
76
+ const minBarHeight = 2;
77
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth() / 1.2).attr("height", (value) => Math.max(height(value) * 2, minBarHeight));
78
+ bars.exit().remove();
79
+ }
80
+ drawBricks(svg, frequencyData) {
81
+ const waveWidth = svg.clientWidth * devicePixelRatio;
82
+ const waveHeight = svg.clientHeight * devicePixelRatio;
83
+ const brickWidth = waveWidth / frequencyData.length;
84
+ const brickHeightFactor = waveHeight / 255 / 2;
85
+ const brickPadding = 2;
86
+ const midHeight = waveHeight / 2;
87
+ d3__namespace.select(svg).selectAll("line.brickBaseLine").data([0]).join("line").attr("class", "brickBaseLine").attr("x1", 0).attr("x2", waveWidth).attr("y1", midHeight).attr("y2", midHeight).attr("stroke", "currentColor").attr("stroke-width", 4).attr("stroke-dasharray", "2");
88
+ d3__namespace.select(svg).selectAll("rect.brick").data(frequencyData).join("rect").attr("class", "brick").attr("x", (_d, i) => i * brickWidth).attr("y", (d) => midHeight - d * brickHeightFactor).attr("width", brickWidth - brickPadding).attr("height", (d) => d * brickHeightFactor * 2);
89
+ }
90
+ drawLine(svg, frequencyData) {
91
+ const waveWidth = svg.clientWidth * devicePixelRatio;
92
+ const waveHeight = svg.clientHeight * devicePixelRatio;
93
+ const xScale = d3__namespace.scaleLinear().domain([0, frequencyData.length - 1]).range([0, waveWidth]);
94
+ const yScale = d3__namespace.scaleLinear().domain([0, 255]).range([waveHeight, 0]);
95
+ const lineGenerator = d3__namespace.line().x((_, i) => xScale(i)).y((d) => yScale(d));
96
+ const pathData = lineGenerator(frequencyData);
97
+ d3__namespace.select(svg).selectAll("path.line").data([frequencyData]).join("path").attr("class", "line").attr("d", pathData).attr("fill", "none").attr("stroke", "currentColor").attr("stroke-width", 4);
98
+ }
99
+ drawRoundBars(svg, frequencyData) {
100
+ const waveWidth = svg.clientWidth * devicePixelRatio;
101
+ const waveHeight = svg.clientHeight;
102
+ const waveLeft = 0;
103
+ const waveRight = waveWidth;
104
+ const barX = d3__namespace.scaleBand().paddingInner(0.5).paddingOuter(0.01).domain(d3__namespace.range(frequencyData.length).map((n) => String(n))).rangeRound([waveLeft, waveRight]);
105
+ const height = d3__namespace.scaleLinear().domain([0, 255]).range([0, waveHeight / 2]);
106
+ const baseline = waveHeight / 2;
107
+ const bars = d3__namespace.select(svg).selectAll("rect").data(frequencyData);
108
+ const minBarHeight = 2;
109
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth() / 1.2).attr("height", (value) => Math.max(height(value) * 2, minBarHeight)).attr("rx", barX.bandwidth()).attr("ry", barX.bandwidth());
110
+ bars.exit().remove();
111
+ }
112
+ drawEqualizer(svg, frequencyData) {
113
+ const waveWidth = svg.clientWidth * devicePixelRatio;
114
+ const waveHeight = svg.clientHeight * devicePixelRatio;
115
+ const barWidth = waveWidth / frequencyData.length;
116
+ const barPadding = 1;
117
+ const minHeight = 1;
118
+ const heightScale = d3__namespace.scaleLinear().domain([0, 255]).range([0, waveHeight / 2]);
119
+ d3__namespace.select(svg).selectAll("line.equalizerBaseLine").data([0]).join("line").attr("class", "equalizerBaseLine").attr("x1", 0).attr("x2", waveWidth).attr("y1", waveHeight / 2).attr("y2", waveHeight / 2).attr("stroke-width", 2);
120
+ d3__namespace.select(svg).selectAll("rect.equalizerBar").data(frequencyData).join("rect").attr("class", "equalizerBar").attr("x", (_d, i) => i * barWidth + barPadding / 2).attr(
121
+ "y",
122
+ (d) => waveHeight / 2 - Math.max(heightScale(d) / 2, minHeight)
123
+ ).attr("width", barWidth - barPadding).attr("height", (d) => Math.max(heightScale(d), minHeight));
124
+ d3__namespace.select(svg).selectAll("rect.equalizerBar").transition().duration(100).attr(
125
+ "y",
126
+ (d) => waveHeight / 2 - Math.max(heightScale(Number(d)) / 2, minHeight)
127
+ ).attr("height", (d) => Math.max(heightScale(Number(d)), minHeight));
128
+ }
129
+ drawCurve(svg, frequencyData) {
130
+ const waveWidth = svg.clientWidth * devicePixelRatio;
131
+ const waveHeight = svg.clientHeight * devicePixelRatio;
132
+ const xScale = d3__namespace.scaleLinear().domain([0, frequencyData.length]).range([0, waveWidth]);
133
+ const yScale = d3__namespace.scaleLinear().domain([0, 255]).range([waveHeight, 0]);
134
+ const curveGenerator = d3__namespace.line().x((_, i) => xScale(i)).y((d) => yScale(d)).curve(d3__namespace.curveNatural);
135
+ const pathData = curveGenerator(frequencyData);
136
+ d3__namespace.select(svg).selectAll("path.curve").data([frequencyData]).join("path").attr("class", "curve").attr("d", pathData).attr("fill", "none").attr("stroke", "currentColor").attr("stroke-width", 4);
137
+ }
138
+ drawPixel(svg, frequencyData) {
139
+ const waveWidth = svg.clientWidth * devicePixelRatio;
140
+ const waveHeight = svg.clientHeight;
141
+ const baseline = waveHeight / 2;
142
+ const barX = d3__namespace.scaleBand().domain(d3__namespace.range(frequencyData.length).map(String)).rangeRound([0, waveWidth]).paddingInner(0.03).paddingOuter(0.02);
143
+ const height = d3__namespace.scaleLinear().domain([0, 255]).range([0, baseline]);
144
+ const bars = d3__namespace.select(svg).selectAll("rect").data(frequencyData);
145
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth()).attr("height", (value) => height(value) * 2);
146
+ bars.exit().remove();
147
+ }
148
+ drawWave(svg, frequencyData) {
149
+ const waveWidth = svg.clientWidth * devicePixelRatio;
150
+ const waveHeight = svg.clientHeight;
151
+ const barX = d3__namespace.scaleBand().domain(d3__namespace.range(frequencyData.length).map(String)).rangeRound([0, waveWidth]).paddingInner(0.03).paddingOuter(0.02);
152
+ const height = d3__namespace.scaleLinear().domain([0, 255]).range([0, waveHeight / 2]);
153
+ d3__namespace.select(svg).selectAll("line.baseline").data([0]).join("line").attr("class", "baseline").attr("x1", (_, i) => barX(String(i)) || 0).attr("x2", waveWidth).attr("y1", waveHeight / 2).attr("y2", waveHeight / 2).attr("stroke", "currentColor").attr("stroke-width", 2);
154
+ const bars = d3__namespace.select(svg).selectAll("rect").data(frequencyData);
155
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => waveHeight / 2 - height(value)).attr("width", barX.bandwidth()).attr("height", (value) => height(value) * 2);
156
+ bars.exit().remove();
157
+ }
158
+ async updated() {
159
+ const svg = this.svgRef.value;
160
+ if (!svg) {
161
+ return;
162
+ }
163
+ if (!this.target.audioBufferTask.value) {
164
+ return;
165
+ }
166
+ if (this.target.ownCurrentTimeMs > 0) {
167
+ const audioContext = new OfflineAudioContext(2, 48e3 / 25, 48e3);
168
+ const audioBufferSource = audioContext.createBufferSource();
169
+ audioBufferSource.buffer = this.target.audioBufferTask.value.buffer;
170
+ const analyser = audioContext.createAnalyser();
171
+ analyser.fftSize = 256;
172
+ audioBufferSource.connect(analyser);
173
+ audioBufferSource.start(
174
+ 0,
175
+ Math.max(
176
+ 0,
177
+ (this.target.ownCurrentTimeMs - this.target.audioBufferTask.value.startOffsetMs) / 1e3
178
+ ),
179
+ 48e3 / 1e3
180
+ );
181
+ await audioContext.startRendering();
182
+ const frequencyData = new Uint8Array(analyser.frequencyBinCount);
183
+ analyser.getByteFrequencyData(frequencyData);
184
+ const rect = this.getBoundingClientRect();
185
+ svg.setAttribute("width", (rect.width * devicePixelRatio).toString());
186
+ svg.setAttribute("height", (rect.height * devicePixelRatio).toString());
187
+ switch (this.mode) {
188
+ case "bars":
189
+ this.drawBars(svg, frequencyData);
190
+ break;
191
+ case "bricks":
192
+ this.drawBricks(svg, frequencyData);
193
+ break;
194
+ case "curve":
195
+ this.drawCurve(svg, frequencyData);
196
+ break;
197
+ case "line":
198
+ this.drawLine(svg, frequencyData);
199
+ break;
200
+ case "pixel":
201
+ this.drawPixel(svg, frequencyData);
202
+ break;
203
+ case "wave":
204
+ this.drawWave(svg, frequencyData);
205
+ break;
206
+ case "roundBars":
207
+ this.drawRoundBars(svg, frequencyData);
208
+ break;
209
+ case "equalizer":
210
+ this.drawEqualizer(svg, frequencyData);
211
+ break;
212
+ }
213
+ }
214
+ }
215
+ get target() {
216
+ const target = document.querySelector(this.getAttribute("target") ?? "");
217
+ if (target instanceof EFAudio.EFAudio || target instanceof EFVideo.EFVideo) {
218
+ return target;
219
+ }
220
+ throw new Error("Invalid target, must be an EFAudio element");
221
+ }
222
+ };
223
+ exports.EFWaveform.styles = [];
224
+ __decorateClass([
225
+ decorators_js.property({
226
+ type: String,
227
+ attribute: "mode"
228
+ })
229
+ ], exports.EFWaveform.prototype, "mode", 2);
230
+ __decorateClass([
231
+ decorators_js.property({ type: String })
232
+ ], exports.EFWaveform.prototype, "color", 2);
233
+ exports.EFWaveform = __decorateClass([
234
+ decorators_js.customElement("ef-waveform")
235
+ ], exports.EFWaveform);
@@ -0,0 +1,28 @@
1
+ import { EFAudio } from './EFAudio';
2
+ import { LitElement } from 'lit';
3
+ import { EFVideo } from './EFVideo';
4
+ import { Task } from '@lit/task';
5
+ import { Ref } from 'lit/directives/ref.js';
6
+
7
+ declare const EFWaveform_base: (new (...args: any[]) => import('./EFTemporal').TemporalMixinInterface) & typeof LitElement;
8
+ export declare class EFWaveform extends EFWaveform_base {
9
+ static styles: never[];
10
+ svgRef: Ref<SVGElement>;
11
+ createRenderRoot(): this;
12
+ render(): import('lit-html').TemplateResult<1>;
13
+ mode: "roundBars" | "bars" | "bricks" | "equalizer" | "curve" | "line" | "pixel" | "wave";
14
+ color: string;
15
+ connectedCallback(): void;
16
+ protected drawBars(svg: SVGElement, frequencyData: Uint8Array): void;
17
+ protected drawBricks(svg: SVGElement, frequencyData: Uint8Array): void;
18
+ protected drawLine(svg: SVGElement, frequencyData: Uint8Array): void;
19
+ protected drawRoundBars(svg: SVGElement, frequencyData: Uint8Array): void;
20
+ protected drawEqualizer(svg: SVGElement, frequencyData: Uint8Array): void;
21
+ protected drawCurve(svg: SVGElement, frequencyData: Uint8Array): void;
22
+ protected drawPixel(svg: SVGElement, frequencyData: Uint8Array): void;
23
+ protected drawWave(svg: SVGElement, frequencyData: Uint8Array): void;
24
+ frameTask: Task<readonly [import('@lit/task').TaskStatus], void>;
25
+ protected updated(): Promise<void>;
26
+ get target(): EFAudio | EFVideo;
27
+ }
28
+ export {};
@@ -1,14 +1,14 @@
1
- import { EFAudio } from "./EFAudio.mjs";
1
+ import { EFAudio } from "./EFAudio.js";
2
2
  import { html, LitElement } from "lit";
3
3
  import { property, customElement } from "lit/decorators.js";
4
- import { EFVideo } from "./EFVideo.mjs";
5
- import { EFTemporal } from "./EFTemporal.mjs";
6
- import { CrossUpdateController } from "./CrossUpdateController.mjs";
7
- import { TWMixin } from "../gui/TWMixin.mjs";
4
+ import { EFVideo } from "./EFVideo.js";
5
+ import { EFTemporal } from "./EFTemporal.js";
6
+ import { CrossUpdateController } from "./CrossUpdateController.js";
7
+ import { TWMixin } from "../gui/TWMixin.js";
8
8
  import { Task } from "@lit/task";
9
9
  import * as d3 from "d3";
10
10
  import { createRef, ref } from "lit/directives/ref.js";
11
- import { EF_INTERACTIVE } from "../EF_INTERACTIVE.mjs";
11
+ import { EF_INTERACTIVE } from "../EF_INTERACTIVE.js";
12
12
  var __defProp = Object.defineProperty;
13
13
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
14
14
  var __decorateClass = (decorators, target, key, kind) => {
@@ -16,8 +16,7 @@ var __decorateClass = (decorators, target, key, kind) => {
16
16
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
17
17
  if (decorator = decorators[i])
18
18
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
19
- if (kind && result)
20
- __defProp(target, key, result);
19
+ if (kind && result) __defProp(target, key, result);
21
20
  return result;
22
21
  };
23
22
  let EFWaveform = class extends EFTemporal(TWMixin(LitElement)) {
@@ -56,7 +55,7 @@ let EFWaveform = class extends EFTemporal(TWMixin(LitElement)) {
56
55
  const baseline = waveHeight / 2;
57
56
  const bars = d3.select(svg).selectAll("rect").data(frequencyData);
58
57
  const minBarHeight = 2;
59
- bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i))).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth() / 1.2).attr("height", (value) => Math.max(height(value) * 2, minBarHeight));
58
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth() / 1.2).attr("height", (value) => Math.max(height(value) * 2, minBarHeight));
60
59
  bars.exit().remove();
61
60
  }
62
61
  drawBricks(svg, frequencyData) {
@@ -88,7 +87,7 @@ let EFWaveform = class extends EFTemporal(TWMixin(LitElement)) {
88
87
  const baseline = waveHeight / 2;
89
88
  const bars = d3.select(svg).selectAll("rect").data(frequencyData);
90
89
  const minBarHeight = 2;
91
- bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i))).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth() / 1.2).attr("height", (value) => Math.max(height(value) * 2, minBarHeight)).attr("rx", barX.bandwidth()).attr("ry", barX.bandwidth());
90
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth() / 1.2).attr("height", (value) => Math.max(height(value) * 2, minBarHeight)).attr("rx", barX.bandwidth()).attr("ry", barX.bandwidth());
92
91
  bars.exit().remove();
93
92
  }
94
93
  drawEqualizer(svg, frequencyData) {
@@ -99,14 +98,14 @@ let EFWaveform = class extends EFTemporal(TWMixin(LitElement)) {
99
98
  const minHeight = 1;
100
99
  const heightScale = d3.scaleLinear().domain([0, 255]).range([0, waveHeight / 2]);
101
100
  d3.select(svg).selectAll("line.equalizerBaseLine").data([0]).join("line").attr("class", "equalizerBaseLine").attr("x1", 0).attr("x2", waveWidth).attr("y1", waveHeight / 2).attr("y2", waveHeight / 2).attr("stroke-width", 2);
102
- d3.select(svg).selectAll("rect.equalizerBar").data(frequencyData).join("rect").attr("class", "equalizerBar").attr("x", (d, i) => i * barWidth + barPadding / 2).attr(
101
+ d3.select(svg).selectAll("rect.equalizerBar").data(frequencyData).join("rect").attr("class", "equalizerBar").attr("x", (_d, i) => i * barWidth + barPadding / 2).attr(
103
102
  "y",
104
103
  (d) => waveHeight / 2 - Math.max(heightScale(d) / 2, minHeight)
105
104
  ).attr("width", barWidth - barPadding).attr("height", (d) => Math.max(heightScale(d), minHeight));
106
105
  d3.select(svg).selectAll("rect.equalizerBar").transition().duration(100).attr(
107
106
  "y",
108
- (d) => waveHeight / 2 - Math.max(heightScale(d) / 2, minHeight)
109
- ).attr("height", (d) => Math.max(heightScale(d), minHeight));
107
+ (d) => waveHeight / 2 - Math.max(heightScale(Number(d)) / 2, minHeight)
108
+ ).attr("height", (d) => Math.max(heightScale(Number(d)), minHeight));
110
109
  }
111
110
  drawCurve(svg, frequencyData) {
112
111
  const waveWidth = svg.clientWidth * devicePixelRatio;
@@ -124,7 +123,7 @@ let EFWaveform = class extends EFTemporal(TWMixin(LitElement)) {
124
123
  const barX = d3.scaleBand().domain(d3.range(frequencyData.length).map(String)).rangeRound([0, waveWidth]).paddingInner(0.03).paddingOuter(0.02);
125
124
  const height = d3.scaleLinear().domain([0, 255]).range([0, baseline]);
126
125
  const bars = d3.select(svg).selectAll("rect").data(frequencyData);
127
- bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i))).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth()).attr("height", (value) => height(value) * 2);
126
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => baseline - height(value)).attr("width", barX.bandwidth()).attr("height", (value) => height(value) * 2);
128
127
  bars.exit().remove();
129
128
  }
130
129
  drawWave(svg, frequencyData) {
@@ -132,9 +131,9 @@ let EFWaveform = class extends EFTemporal(TWMixin(LitElement)) {
132
131
  const waveHeight = svg.clientHeight;
133
132
  const barX = d3.scaleBand().domain(d3.range(frequencyData.length).map(String)).rangeRound([0, waveWidth]).paddingInner(0.03).paddingOuter(0.02);
134
133
  const height = d3.scaleLinear().domain([0, 255]).range([0, waveHeight / 2]);
135
- d3.select(svg).selectAll("line.baseline").data([0]).join("line").attr("class", "baseline").attr("x1", (_, i) => barX(String(i))).attr("x2", waveWidth).attr("y1", waveHeight / 2).attr("y2", waveHeight / 2).attr("stroke", "currentColor").attr("stroke-width", 2);
134
+ d3.select(svg).selectAll("line.baseline").data([0]).join("line").attr("class", "baseline").attr("x1", (_, i) => barX(String(i)) || 0).attr("x2", waveWidth).attr("y1", waveHeight / 2).attr("y2", waveHeight / 2).attr("stroke", "currentColor").attr("stroke-width", 2);
136
135
  const bars = d3.select(svg).selectAll("rect").data(frequencyData);
137
- bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i))).attr("y", (value) => waveHeight / 2 - height(value)).attr("width", barX.bandwidth()).attr("height", (value) => height(value) * 2);
136
+ bars.enter().append("rect").merge(bars).attr("x", (_, i) => barX(String(i)) || 0).attr("y", (value) => waveHeight / 2 - height(value)).attr("width", barX.bandwidth()).attr("height", (value) => height(value) * 2);
138
137
  bars.exit().remove();
139
138
  }
140
139
  async updated() {
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const context = require("@lit/context");
4
+ const EFWorkbench = require("../gui/EFWorkbench.cjs");
5
+ const state_js = require("lit/decorators/state.js");
6
+ var __defProp = Object.defineProperty;
7
+ var __decorateClass = (decorators, target, key, kind) => {
8
+ var result = void 0;
9
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
10
+ if (decorator = decorators[i])
11
+ result = decorator(target, key, result) || result;
12
+ if (result) __defProp(target, key, result);
13
+ return result;
14
+ };
15
+ function FetchMixin(superClass) {
16
+ class FetchElement extends superClass {
17
+ constructor() {
18
+ super(...arguments);
19
+ this.fetch = fetch.bind(window);
20
+ }
21
+ }
22
+ __decorateClass([
23
+ context.consume({ context: EFWorkbench.fetchContext, subscribe: true }),
24
+ state_js.state()
25
+ ], FetchElement.prototype, "fetch");
26
+ return FetchElement;
27
+ }
28
+ exports.FetchMixin = FetchMixin;
@@ -0,0 +1,8 @@
1
+ import { LitElement } from 'lit';
2
+
3
+ export declare class FetchMixinInterface {
4
+ fetch: typeof fetch;
5
+ }
6
+ type Constructor<T = {}> = new (...args: any[]) => T;
7
+ export declare function FetchMixin<T extends Constructor<LitElement>>(superClass: T): Constructor<FetchMixinInterface> & T;
8
+ export {};
@@ -1,15 +1,13 @@
1
1
  import { consume } from "@lit/context";
2
- import { fetchContext } from "../gui/EFWorkbench.mjs";
2
+ import { fetchContext } from "../gui/EFWorkbench.js";
3
3
  import { state } from "lit/decorators/state.js";
4
4
  var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
5
  var __decorateClass = (decorators, target, key, kind) => {
7
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
6
+ var result = void 0;
8
7
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
9
8
  if (decorator = decorators[i])
10
- result = (kind ? decorator(target, key, result) : decorator(result)) || result;
11
- if (kind && result)
12
- __defProp(target, key, result);
9
+ result = decorator(target, key, result) || result;
10
+ if (result) __defProp(target, key, result);
13
11
  return result;
14
12
  };
15
13
  function FetchMixin(superClass) {
@@ -22,7 +20,7 @@ function FetchMixin(superClass) {
22
20
  __decorateClass([
23
21
  consume({ context: fetchContext, subscribe: true }),
24
22
  state()
25
- ], FetchElement.prototype, "fetch", 2);
23
+ ], FetchElement.prototype, "fetch");
26
24
  return FetchElement;
27
25
  }
28
26
  export {
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ class TimegroupController {
4
+ constructor(host, child) {
5
+ this.host = host;
6
+ this.child = child;
7
+ this.host.addController(this);
8
+ }
9
+ remove() {
10
+ this.host.removeController(this);
11
+ }
12
+ hostDisconnected() {
13
+ this.host.removeController(this);
14
+ }
15
+ hostUpdated() {
16
+ this.child.requestUpdate();
17
+ this.child.currentTimeMs = this.host.currentTimeMs - (this.child.startTimeMs ?? 0);
18
+ }
19
+ }
20
+ exports.TimegroupController = TimegroupController;
@@ -0,0 +1,14 @@
1
+ import { ReactiveController, LitElement } from 'lit';
2
+ import { EFTimegroup } from './EFTimegroup';
3
+
4
+ export declare class TimegroupController implements ReactiveController {
5
+ private host;
6
+ private child;
7
+ constructor(host: EFTimegroup, child: {
8
+ currentTimeMs: number;
9
+ startTimeMs?: number;
10
+ } & LitElement);
11
+ remove(): void;
12
+ hostDisconnected(): void;
13
+ hostUpdated(): void;
14
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const parseTimeToMs = require("./parseTimeToMs.cjs");
4
+ const durationConverter = {
5
+ fromAttribute: (value) => parseTimeToMs.parseTimeToMs(value),
6
+ toAttribute: (value) => `${value}s`
7
+ };
8
+ exports.durationConverter = durationConverter;
@@ -0,0 +1,4 @@
1
+ export declare const durationConverter: {
2
+ fromAttribute: (value: string) => number;
3
+ toAttribute: (value: number) => string;
4
+ };
@@ -1,4 +1,4 @@
1
- import { parseTimeToMs } from "./parseTimeToMs.mjs";
1
+ import { parseTimeToMs } from "./parseTimeToMs.js";
2
2
  const durationConverter = {
3
3
  fromAttribute: (value) => parseTimeToMs(value),
4
4
  toAttribute: (value) => `${value}s`
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const parseTimeToMs = (time) => {
4
+ if (time.endsWith("ms")) {
5
+ return Number.parseFloat(time);
6
+ }
7
+ if (time.endsWith("s")) {
8
+ return Number.parseFloat(time) * 1e3;
9
+ }
10
+ throw new Error("Time must be in milliseconds or seconds (10s, 10000ms)");
11
+ };
12
+ exports.parseTimeToMs = parseTimeToMs;
@@ -0,0 +1 @@
1
+ export declare const parseTimeToMs: (time: string) => number;
@@ -0,0 +1,12 @@
1
+ const parseTimeToMs = (time) => {
2
+ if (time.endsWith("ms")) {
3
+ return Number.parseFloat(time);
4
+ }
5
+ if (time.endsWith("s")) {
6
+ return Number.parseFloat(time) * 1e3;
7
+ }
8
+ throw new Error("Time must be in milliseconds or seconds (10s, 10000ms)");
9
+ };
10
+ export {
11
+ parseTimeToMs
12
+ };
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const EFTimegroup = require("./EFTimegroup.cjs");
4
+ const getStartTimeMs = (element) => {
5
+ const nearestTimeGroup = element.closest("ef-timegroup");
6
+ if (!(nearestTimeGroup instanceof EFTimegroup.EFTimegroup)) {
7
+ return 0;
8
+ }
9
+ return nearestTimeGroup.startTimeMs;
10
+ };
11
+ exports.getStartTimeMs = getStartTimeMs;
@@ -0,0 +1,4 @@
1
+ import { EFTimegroup } from './EFTimegroup';
2
+
3
+ export declare const getRootTimeGroup: (element: Element) => EFTimegroup | null;
4
+ export declare const getStartTimeMs: (element: Element) => number;
@@ -1,4 +1,4 @@
1
- import { EFTimegroup } from "./EFTimegroup.mjs";
1
+ import { EFTimegroup } from "./EFTimegroup.js";
2
2
  const getStartTimeMs = (element) => {
3
3
  const nearestTimeGroup = element.closest("ef-timegroup");
4
4
  if (!(nearestTimeGroup instanceof EFTimegroup)) {