@editframe/elements 0.6.0-beta.19 → 0.6.0-beta.22
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.
- package/dist/lib/av/EncodedAsset.cjs +570 -0
- package/dist/lib/av/EncodedAsset.js +553 -0
- package/dist/lib/av/MP4File.cjs +182 -0
- package/dist/lib/av/MP4File.js +165 -0
- package/dist/lib/av/msToTimeCode.cjs +15 -0
- package/dist/lib/av/msToTimeCode.js +15 -0
- package/dist/lib/util/awaitMicrotask.cjs +4 -0
- package/dist/lib/util/awaitMicrotask.js +4 -0
- package/dist/lib/util/memoize.cjs +14 -0
- package/dist/lib/util/memoize.js +14 -0
- package/dist/packages/elements/src/EF_FRAMEGEN.cjs +200 -0
- package/dist/packages/elements/src/EF_FRAMEGEN.d.ts +45 -0
- package/dist/packages/elements/src/EF_FRAMEGEN.js +200 -0
- package/dist/packages/elements/src/EF_INTERACTIVE.cjs +4 -0
- package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +1 -0
- package/dist/packages/elements/src/EF_INTERACTIVE.js +4 -0
- package/dist/packages/elements/src/elements/CrossUpdateController.cjs +16 -0
- package/dist/packages/elements/src/elements/CrossUpdateController.d.ts +9 -0
- package/dist/packages/elements/src/elements/CrossUpdateController.js +16 -0
- package/dist/packages/elements/src/elements/EFAudio.cjs +53 -0
- package/dist/packages/elements/src/elements/EFAudio.d.ts +10 -0
- package/dist/packages/elements/src/elements/EFAudio.js +54 -0
- package/dist/packages/elements/src/elements/EFCaptions.cjs +164 -0
- package/dist/packages/elements/src/elements/EFCaptions.d.ts +38 -0
- package/dist/packages/elements/src/elements/EFCaptions.js +166 -0
- package/dist/packages/elements/src/elements/EFImage.cjs +79 -0
- package/dist/packages/elements/src/elements/EFImage.d.ts +14 -0
- package/dist/packages/elements/src/elements/EFImage.js +80 -0
- package/dist/packages/elements/src/elements/EFMedia.cjs +334 -0
- package/dist/packages/elements/src/elements/EFMedia.d.ts +61 -0
- package/dist/packages/elements/src/elements/EFMedia.js +334 -0
- package/dist/packages/elements/src/elements/EFSourceMixin.cjs +55 -0
- package/dist/packages/elements/src/elements/EFSourceMixin.d.ts +12 -0
- package/dist/packages/elements/src/elements/EFSourceMixin.js +55 -0
- package/dist/packages/elements/src/elements/EFTemporal.cjs +198 -0
- package/dist/packages/elements/src/elements/EFTemporal.d.ts +36 -0
- package/dist/packages/elements/src/elements/EFTemporal.js +198 -0
- package/dist/packages/elements/src/elements/EFTimegroup.browsertest.d.ts +12 -0
- package/dist/packages/elements/src/elements/EFTimegroup.cjs +350 -0
- package/dist/packages/elements/src/elements/EFTimegroup.d.ts +39 -0
- package/dist/packages/elements/src/elements/EFTimegroup.js +351 -0
- package/dist/packages/elements/src/elements/EFTimeline.cjs +15 -0
- package/dist/packages/elements/src/elements/EFTimeline.d.ts +3 -0
- package/dist/packages/elements/src/elements/EFTimeline.js +15 -0
- package/dist/packages/elements/src/elements/EFVideo.cjs +109 -0
- package/dist/packages/elements/src/elements/EFVideo.d.ts +14 -0
- package/dist/packages/elements/src/elements/EFVideo.js +110 -0
- package/dist/packages/elements/src/elements/EFWaveform.cjs +235 -0
- package/dist/packages/elements/src/elements/EFWaveform.d.ts +28 -0
- package/dist/packages/elements/src/elements/EFWaveform.js +219 -0
- package/dist/packages/elements/src/elements/FetchMixin.cjs +28 -0
- package/dist/packages/elements/src/elements/FetchMixin.d.ts +8 -0
- package/dist/packages/elements/src/elements/FetchMixin.js +28 -0
- package/dist/packages/elements/src/elements/TimegroupController.cjs +20 -0
- package/dist/packages/elements/src/elements/TimegroupController.d.ts +14 -0
- package/dist/packages/elements/src/elements/TimegroupController.js +20 -0
- package/dist/packages/elements/src/elements/durationConverter.cjs +8 -0
- package/dist/packages/elements/src/elements/durationConverter.d.ts +4 -0
- package/dist/packages/elements/src/elements/durationConverter.js +8 -0
- package/dist/packages/elements/src/elements/parseTimeToMs.cjs +12 -0
- package/dist/packages/elements/src/elements/parseTimeToMs.d.ts +1 -0
- package/dist/packages/elements/src/elements/parseTimeToMs.js +12 -0
- package/dist/packages/elements/src/elements/util.cjs +11 -0
- package/dist/packages/elements/src/elements/util.d.ts +4 -0
- package/dist/packages/elements/src/elements/util.js +11 -0
- package/dist/packages/elements/src/gui/EFFilmstrip.cjs +820 -0
- package/dist/packages/elements/src/gui/EFFilmstrip.d.ts +147 -0
- package/dist/packages/elements/src/gui/EFFilmstrip.js +828 -0
- package/dist/packages/elements/src/gui/EFWorkbench.cjs +213 -0
- package/dist/packages/elements/src/gui/EFWorkbench.d.ts +45 -0
- package/dist/packages/elements/src/gui/EFWorkbench.js +214 -0
- package/dist/packages/elements/src/gui/TWMixin.cjs +28 -0
- package/dist/packages/elements/src/gui/TWMixin.css.cjs +3 -0
- package/dist/packages/elements/src/gui/TWMixin.css.js +4 -0
- package/dist/packages/elements/src/gui/TWMixin.d.ts +3 -0
- package/dist/packages/elements/src/gui/TWMixin.js +28 -0
- package/dist/packages/elements/src/index.cjs +51 -0
- package/dist/packages/elements/src/index.d.ts +10 -0
- package/dist/packages/elements/src/index.js +24 -0
- package/dist/style.css +787 -0
- package/package.json +2 -2
- package/src/gui/EFFilmstrip.ts +3 -3
|
@@ -0,0 +1,828 @@
|
|
|
1
|
+
import { EFTimegroup } from "../elements/EFTimegroup.js";
|
|
2
|
+
import { css, html, nothing, LitElement } from "lit";
|
|
3
|
+
import { property, customElement, state, eventOptions } from "lit/decorators.js";
|
|
4
|
+
import { styleMap } from "lit/directives/style-map.js";
|
|
5
|
+
import { createRef, ref } from "lit/directives/ref.js";
|
|
6
|
+
import { EFImage } from "../elements/EFImage.js";
|
|
7
|
+
import { EFAudio } from "../elements/EFAudio.js";
|
|
8
|
+
import { EFVideo } from "../elements/EFVideo.js";
|
|
9
|
+
import { EFCaptions, EFCaptionsActiveWord } from "../elements/EFCaptions.js";
|
|
10
|
+
import { EFWaveform } from "../elements/EFWaveform.js";
|
|
11
|
+
import { TimegroupController } from "../elements/TimegroupController.js";
|
|
12
|
+
import { consume } from "@lit/context";
|
|
13
|
+
import { focusContext, focusedElement } from "./EFWorkbench.js";
|
|
14
|
+
import { TWMixin } from "./TWMixin.js";
|
|
15
|
+
import { msToTimeCode } from "../../../../lib/av/msToTimeCode.js";
|
|
16
|
+
var __defProp = Object.defineProperty;
|
|
17
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
18
|
+
var __typeError = (msg) => {
|
|
19
|
+
throw TypeError(msg);
|
|
20
|
+
};
|
|
21
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
22
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
23
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
24
|
+
if (decorator = decorators[i])
|
|
25
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
26
|
+
if (kind && result) __defProp(target, key, result);
|
|
27
|
+
return result;
|
|
28
|
+
};
|
|
29
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
30
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
|
|
31
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
32
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
33
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
34
|
+
var _handleKeyPress, _lastTick, _playbackAudioContext, _playbackAnimationFrameRequest, _AUDIO_PLAYBACK_SLICE_MS, _EFFilmstrip_instances, syncPlayheadToAudioContext_fn, stopPlayback_fn, startPlayback_fn;
|
|
35
|
+
class ElementFilmstripController {
|
|
36
|
+
constructor(host, filmstrip) {
|
|
37
|
+
this.host = host;
|
|
38
|
+
this.filmstrip = filmstrip;
|
|
39
|
+
this.host.addController(this);
|
|
40
|
+
}
|
|
41
|
+
remove() {
|
|
42
|
+
this.host.removeController(this);
|
|
43
|
+
}
|
|
44
|
+
hostDisconnected() {
|
|
45
|
+
this.host.removeController(this);
|
|
46
|
+
}
|
|
47
|
+
hostUpdated() {
|
|
48
|
+
this.filmstrip.requestUpdate();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const CommonEffectKeys = /* @__PURE__ */ new Set([
|
|
52
|
+
"offset",
|
|
53
|
+
"easing",
|
|
54
|
+
"composite",
|
|
55
|
+
"computedOffset"
|
|
56
|
+
]);
|
|
57
|
+
class FilmstripItem extends TWMixin(LitElement) {
|
|
58
|
+
constructor() {
|
|
59
|
+
super(...arguments);
|
|
60
|
+
this.element = new EFTimegroup();
|
|
61
|
+
this.pixelsPerMs = 0.04;
|
|
62
|
+
}
|
|
63
|
+
static {
|
|
64
|
+
this.styles = [
|
|
65
|
+
css`
|
|
66
|
+
:host {
|
|
67
|
+
display: block;
|
|
68
|
+
}
|
|
69
|
+
`
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
get isFocused() {
|
|
73
|
+
return this.element && this.focusedElement === this.element;
|
|
74
|
+
}
|
|
75
|
+
get styles() {
|
|
76
|
+
return {
|
|
77
|
+
position: "relative",
|
|
78
|
+
left: `${this.pixelsPerMs * this.element.startTimeWithinParentMs}px`,
|
|
79
|
+
width: `${this.pixelsPerMs * this.element.durationMs}px`
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
render() {
|
|
83
|
+
return html` <div class="" style=${styleMap(this.styles)}>
|
|
84
|
+
<div
|
|
85
|
+
@mouseenter=${() => {
|
|
86
|
+
if (this.focusContext) {
|
|
87
|
+
this.focusContext.focusedElement = this.element;
|
|
88
|
+
}
|
|
89
|
+
}}
|
|
90
|
+
@mouseleave=${() => {
|
|
91
|
+
if (this.focusContext) {
|
|
92
|
+
this.focusContext.focusedElement = null;
|
|
93
|
+
}
|
|
94
|
+
}}
|
|
95
|
+
?data-focused=${this.isFocused}
|
|
96
|
+
class="border-outset relative mb-[1px] block h-[1.1rem] text-nowrap border border-slate-500 bg-blue-200 text-sm data-[focused]:bg-slate-400"
|
|
97
|
+
>
|
|
98
|
+
${this.animations()}
|
|
99
|
+
</div>
|
|
100
|
+
${this.renderChildren()}
|
|
101
|
+
</div>`;
|
|
102
|
+
}
|
|
103
|
+
renderChildren() {
|
|
104
|
+
return renderFilmstripChildren(
|
|
105
|
+
Array.from(this.element.children),
|
|
106
|
+
this.pixelsPerMs
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
contents() {
|
|
110
|
+
return html``;
|
|
111
|
+
}
|
|
112
|
+
animations() {
|
|
113
|
+
const animations = this.element.getAnimations();
|
|
114
|
+
return animations.map((animation) => {
|
|
115
|
+
const effect = animation.effect;
|
|
116
|
+
if (!(effect instanceof KeyframeEffect)) {
|
|
117
|
+
return nothing;
|
|
118
|
+
}
|
|
119
|
+
const start = effect.getTiming().delay ?? 0;
|
|
120
|
+
const duration = effect.getTiming().duration;
|
|
121
|
+
if (duration === null) {
|
|
122
|
+
return nothing;
|
|
123
|
+
}
|
|
124
|
+
const keyframes = effect.getKeyframes();
|
|
125
|
+
const firstKeyframe = keyframes[0];
|
|
126
|
+
if (!firstKeyframe) {
|
|
127
|
+
return nothing;
|
|
128
|
+
}
|
|
129
|
+
const properties = new Set(Object.keys(firstKeyframe));
|
|
130
|
+
for (const key of CommonEffectKeys) {
|
|
131
|
+
properties.delete(key);
|
|
132
|
+
}
|
|
133
|
+
return html`<div
|
|
134
|
+
class="relative h-[5px] bg-blue-500 opacity-50"
|
|
135
|
+
label="animation"
|
|
136
|
+
style=${styleMap({
|
|
137
|
+
left: `${this.pixelsPerMs * start}px`,
|
|
138
|
+
width: `${this.pixelsPerMs * Number(duration)}px`
|
|
139
|
+
})}
|
|
140
|
+
>
|
|
141
|
+
<!-- <div class="text-nowrap">${Array.from(properties).join(" ")}</div> -->
|
|
142
|
+
${effect.getKeyframes().map((keyframe) => {
|
|
143
|
+
return html`<div
|
|
144
|
+
class="absolute top-0 h-full w-1 bg-red-500"
|
|
145
|
+
style=${styleMap({
|
|
146
|
+
left: `${this.pixelsPerMs * keyframe.computedOffset * Number(duration)}px`
|
|
147
|
+
})}
|
|
148
|
+
></div>`;
|
|
149
|
+
})}
|
|
150
|
+
</div>`;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
update(changedProperties) {
|
|
154
|
+
if (changedProperties.has("element") && this.element instanceof LitElement) {
|
|
155
|
+
this.filmstripController?.remove();
|
|
156
|
+
this.filmstripController = new ElementFilmstripController(
|
|
157
|
+
this.element,
|
|
158
|
+
this
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
super.update(changedProperties);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
__decorateClass([
|
|
165
|
+
consume({ context: focusContext })
|
|
166
|
+
], FilmstripItem.prototype, "focusContext", 2);
|
|
167
|
+
__decorateClass([
|
|
168
|
+
consume({ context: focusedElement, subscribe: true })
|
|
169
|
+
], FilmstripItem.prototype, "focusedElement", 2);
|
|
170
|
+
__decorateClass([
|
|
171
|
+
property({ type: HTMLElement, attribute: false })
|
|
172
|
+
], FilmstripItem.prototype, "element", 2);
|
|
173
|
+
__decorateClass([
|
|
174
|
+
property({ type: Number })
|
|
175
|
+
], FilmstripItem.prototype, "pixelsPerMs", 2);
|
|
176
|
+
let EFAudioFilmstrip = class extends FilmstripItem {
|
|
177
|
+
contents() {
|
|
178
|
+
return html``;
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
EFAudioFilmstrip = __decorateClass([
|
|
182
|
+
customElement("ef-audio-filmstrip")
|
|
183
|
+
], EFAudioFilmstrip);
|
|
184
|
+
let EFVideoFilmstrip = class extends FilmstripItem {
|
|
185
|
+
contents() {
|
|
186
|
+
return html` 📼 `;
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
EFVideoFilmstrip = __decorateClass([
|
|
190
|
+
customElement("ef-video-filmstrip")
|
|
191
|
+
], EFVideoFilmstrip);
|
|
192
|
+
let EFCaptionsFilmstrip = class extends FilmstripItem {
|
|
193
|
+
contents() {
|
|
194
|
+
return html` 📝 `;
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
EFCaptionsFilmstrip = __decorateClass([
|
|
198
|
+
customElement("ef-captions-filmstrip")
|
|
199
|
+
], EFCaptionsFilmstrip);
|
|
200
|
+
let EFWaveformFilmstrip = class extends FilmstripItem {
|
|
201
|
+
contents() {
|
|
202
|
+
return html` 🌊 `;
|
|
203
|
+
}
|
|
204
|
+
renderChildren() {
|
|
205
|
+
return nothing;
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
EFWaveformFilmstrip = __decorateClass([
|
|
209
|
+
customElement("ef-waveform-filmstrip")
|
|
210
|
+
], EFWaveformFilmstrip);
|
|
211
|
+
let EFImageFilmstrip = class extends FilmstripItem {
|
|
212
|
+
contents() {
|
|
213
|
+
return html` 🖼️ `;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
EFImageFilmstrip = __decorateClass([
|
|
217
|
+
customElement("ef-image-filmstrip")
|
|
218
|
+
], EFImageFilmstrip);
|
|
219
|
+
let EFTimegroupFilmstrip = class extends FilmstripItem {
|
|
220
|
+
contents() {
|
|
221
|
+
return html`
|
|
222
|
+
<span>TIME GROUP</span>
|
|
223
|
+
${renderFilmstripChildren(
|
|
224
|
+
Array.from(this.element.children || []),
|
|
225
|
+
this.pixelsPerMs
|
|
226
|
+
)}
|
|
227
|
+
</div>
|
|
228
|
+
`;
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
EFTimegroupFilmstrip = __decorateClass([
|
|
232
|
+
customElement("ef-timegroup-filmstrip")
|
|
233
|
+
], EFTimegroupFilmstrip);
|
|
234
|
+
let EFHTMLFilmstrip = class extends FilmstripItem {
|
|
235
|
+
contents() {
|
|
236
|
+
return html`
|
|
237
|
+
<span>${this.element.tagName}</span>
|
|
238
|
+
${renderFilmstripChildren(
|
|
239
|
+
Array.from(this.element.children || []),
|
|
240
|
+
this.pixelsPerMs
|
|
241
|
+
)}
|
|
242
|
+
`;
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
EFHTMLFilmstrip = __decorateClass([
|
|
246
|
+
customElement("ef-html-filmstrip")
|
|
247
|
+
], EFHTMLFilmstrip);
|
|
248
|
+
let EFHierarchyItem = class extends TWMixin(LitElement) {
|
|
249
|
+
constructor() {
|
|
250
|
+
super(...arguments);
|
|
251
|
+
this.element = new EFTimegroup();
|
|
252
|
+
}
|
|
253
|
+
get icon() {
|
|
254
|
+
return "📼";
|
|
255
|
+
}
|
|
256
|
+
get isFocused() {
|
|
257
|
+
return this.element && this.focusedElement === this.element;
|
|
258
|
+
}
|
|
259
|
+
displayLabel() {
|
|
260
|
+
return nothing;
|
|
261
|
+
}
|
|
262
|
+
render() {
|
|
263
|
+
return html`
|
|
264
|
+
<div>
|
|
265
|
+
<div
|
|
266
|
+
?data-focused=${this.isFocused}
|
|
267
|
+
class="peer
|
|
268
|
+
flex h-[1.1rem] items-center overflow-hidden text-nowrap border border-slate-500
|
|
269
|
+
bg-slate-200 pl-2 text-xs font-mono hover:bg-slate-400 data-[focused]:bg-slate-400"
|
|
270
|
+
@mouseenter=${() => {
|
|
271
|
+
if (this.focusContext) {
|
|
272
|
+
this.focusContext.focusedElement = this.element;
|
|
273
|
+
}
|
|
274
|
+
}}
|
|
275
|
+
@mouseleave=${() => {
|
|
276
|
+
if (this.focusContext) {
|
|
277
|
+
this.focusContext.focusedElement = null;
|
|
278
|
+
}
|
|
279
|
+
}}
|
|
280
|
+
>
|
|
281
|
+
${this.icon} ${this.displayLabel()}
|
|
282
|
+
</div>
|
|
283
|
+
<div
|
|
284
|
+
class="p-[1px] pb-0 pl-2 pr-0 peer-hover:bg-slate-300 peer-data-[focused]:bg-slate-300 peer-hover:border-slate-400 peer-data-[focused]:border-slate-400""
|
|
285
|
+
>
|
|
286
|
+
${this.renderChildren()}
|
|
287
|
+
</div>
|
|
288
|
+
</div>`;
|
|
289
|
+
}
|
|
290
|
+
renderChildren() {
|
|
291
|
+
return renderHierarchyChildren(Array.from(this.element.children));
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
__decorateClass([
|
|
295
|
+
property({ type: HTMLElement, attribute: false })
|
|
296
|
+
], EFHierarchyItem.prototype, "element", 2);
|
|
297
|
+
__decorateClass([
|
|
298
|
+
consume({ context: focusContext })
|
|
299
|
+
], EFHierarchyItem.prototype, "focusContext", 2);
|
|
300
|
+
__decorateClass([
|
|
301
|
+
consume({ context: focusedElement, subscribe: true })
|
|
302
|
+
], EFHierarchyItem.prototype, "focusedElement", 2);
|
|
303
|
+
EFHierarchyItem = __decorateClass([
|
|
304
|
+
customElement("ef-hierarchy-item")
|
|
305
|
+
], EFHierarchyItem);
|
|
306
|
+
let EFTimegroupHierarchyItem = class extends EFHierarchyItem {
|
|
307
|
+
get icon() {
|
|
308
|
+
return "🕒";
|
|
309
|
+
}
|
|
310
|
+
displayLabel() {
|
|
311
|
+
return this.element.mode ?? "(no mode)";
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
EFTimegroupHierarchyItem = __decorateClass([
|
|
315
|
+
customElement("ef-timegroup-hierarchy-item")
|
|
316
|
+
], EFTimegroupHierarchyItem);
|
|
317
|
+
let EFAudioHierarchyItem = class extends EFHierarchyItem {
|
|
318
|
+
get icon() {
|
|
319
|
+
return "🔊";
|
|
320
|
+
}
|
|
321
|
+
displayLabel() {
|
|
322
|
+
return this.element.src ?? "(no src)";
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
EFAudioHierarchyItem = __decorateClass([
|
|
326
|
+
customElement("ef-audio-hierarchy-item")
|
|
327
|
+
], EFAudioHierarchyItem);
|
|
328
|
+
let EFVideoHierarchyItem = class extends EFHierarchyItem {
|
|
329
|
+
get icon() {
|
|
330
|
+
return "📼";
|
|
331
|
+
}
|
|
332
|
+
displayLabel() {
|
|
333
|
+
return this.element.src ?? "(no src)";
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
EFVideoHierarchyItem = __decorateClass([
|
|
337
|
+
customElement("ef-video-hierarchy-item")
|
|
338
|
+
], EFVideoHierarchyItem);
|
|
339
|
+
let EFCaptionsHierarchyItem = class extends EFHierarchyItem {
|
|
340
|
+
get icon() {
|
|
341
|
+
return "📝 Captions";
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
EFCaptionsHierarchyItem = __decorateClass([
|
|
345
|
+
customElement("ef-captions-hierarchy-item")
|
|
346
|
+
], EFCaptionsHierarchyItem);
|
|
347
|
+
let EFCaptionsActiveWordHierarchyItem = class extends EFHierarchyItem {
|
|
348
|
+
get icon() {
|
|
349
|
+
return "🗣️ Active Word";
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
EFCaptionsActiveWordHierarchyItem = __decorateClass([
|
|
353
|
+
customElement("ef-captions-active-word-hierarchy-item")
|
|
354
|
+
], EFCaptionsActiveWordHierarchyItem);
|
|
355
|
+
let EFWaveformHierarchyItem = class extends EFHierarchyItem {
|
|
356
|
+
get icon() {
|
|
357
|
+
return "🌊";
|
|
358
|
+
}
|
|
359
|
+
renderChildren() {
|
|
360
|
+
return nothing;
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
EFWaveformHierarchyItem = __decorateClass([
|
|
364
|
+
customElement("ef-waveform-hierarchy-item")
|
|
365
|
+
], EFWaveformHierarchyItem);
|
|
366
|
+
let EFImageHierarchyItem = class extends EFHierarchyItem {
|
|
367
|
+
get icon() {
|
|
368
|
+
return "🖼️";
|
|
369
|
+
}
|
|
370
|
+
displayLabel() {
|
|
371
|
+
return this.element.src ?? "(no src)";
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
EFImageHierarchyItem = __decorateClass([
|
|
375
|
+
customElement("ef-image-hierarchy-item")
|
|
376
|
+
], EFImageHierarchyItem);
|
|
377
|
+
let EFHTMLHierarchyItem = class extends EFHierarchyItem {
|
|
378
|
+
get icon() {
|
|
379
|
+
return html`<code>${`<${this.element.tagName.toLowerCase()}>`}</code>`;
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
EFHTMLHierarchyItem = __decorateClass([
|
|
383
|
+
customElement("ef-html-hierarchy-item")
|
|
384
|
+
], EFHTMLHierarchyItem);
|
|
385
|
+
const renderHierarchyChildren = (children) => {
|
|
386
|
+
return children.map((child) => {
|
|
387
|
+
if (child instanceof EFTimegroup) {
|
|
388
|
+
return html`<ef-timegroup-hierarchy-item
|
|
389
|
+
.element=${child}
|
|
390
|
+
></ef-timegroup-hierarchy-item>`;
|
|
391
|
+
}
|
|
392
|
+
if (child instanceof EFImage) {
|
|
393
|
+
return html`<ef-image-hierarchy-item
|
|
394
|
+
.element=${child}
|
|
395
|
+
></ef-image-hierarchy-item>`;
|
|
396
|
+
}
|
|
397
|
+
if (child instanceof EFAudio) {
|
|
398
|
+
return html`<ef-audio-hierarchy-item
|
|
399
|
+
.element=${child}
|
|
400
|
+
></ef-audio-hierarchy-item>`;
|
|
401
|
+
}
|
|
402
|
+
if (child instanceof EFVideo) {
|
|
403
|
+
return html`<ef-video-hierarchy-item
|
|
404
|
+
.element=${child}
|
|
405
|
+
></ef-video-hierarchy-item>`;
|
|
406
|
+
}
|
|
407
|
+
if (child instanceof EFCaptions) {
|
|
408
|
+
return html`<ef-captions-hierarchy-item
|
|
409
|
+
.element=${child}
|
|
410
|
+
></ef-captions-hierarchy-item>`;
|
|
411
|
+
}
|
|
412
|
+
if (child instanceof EFCaptionsActiveWord) {
|
|
413
|
+
return html`<ef-captions-active-word-hierarchy-item
|
|
414
|
+
.element=${child}
|
|
415
|
+
></ef-captions-active-word-hierarchy-item>`;
|
|
416
|
+
}
|
|
417
|
+
if (child instanceof EFWaveform) {
|
|
418
|
+
return html`<ef-waveform-hierarchy-item
|
|
419
|
+
.element=${child}
|
|
420
|
+
></ef-waveform-hierarchy-item>`;
|
|
421
|
+
}
|
|
422
|
+
return html`<ef-html-hierarchy-item
|
|
423
|
+
.element=${child}
|
|
424
|
+
></ef-html-hierarchy-item>`;
|
|
425
|
+
});
|
|
426
|
+
};
|
|
427
|
+
const renderFilmstripChildren = (children, pixelsPerMs) => {
|
|
428
|
+
return children.map((child) => {
|
|
429
|
+
if (child instanceof EFTimegroup) {
|
|
430
|
+
return html`<ef-timegroup-filmstrip
|
|
431
|
+
.element=${child}
|
|
432
|
+
.pixelsPerMs=${pixelsPerMs}
|
|
433
|
+
>
|
|
434
|
+
</ef-timegroup-filmstrip>`;
|
|
435
|
+
}
|
|
436
|
+
if (child instanceof EFImage) {
|
|
437
|
+
return html`<ef-image-filmstrip
|
|
438
|
+
.element=${child}
|
|
439
|
+
.pixelsPerMs=${pixelsPerMs}
|
|
440
|
+
></ef-image-filmstrip>`;
|
|
441
|
+
}
|
|
442
|
+
if (child instanceof EFAudio) {
|
|
443
|
+
return html`<ef-audio-filmstrip
|
|
444
|
+
.element=${child}
|
|
445
|
+
.pixelsPerMs=${pixelsPerMs}
|
|
446
|
+
></ef-audio-filmstrip>`;
|
|
447
|
+
}
|
|
448
|
+
if (child instanceof EFVideo) {
|
|
449
|
+
return html`<ef-video-filmstrip
|
|
450
|
+
.element=${child}
|
|
451
|
+
.pixelsPerMs=${pixelsPerMs}
|
|
452
|
+
></ef-video-filmstrip>`;
|
|
453
|
+
}
|
|
454
|
+
if (child instanceof EFCaptions) {
|
|
455
|
+
return html`<ef-captions-filmstrip
|
|
456
|
+
.element=${child}
|
|
457
|
+
.pixelsPerMs=${pixelsPerMs}
|
|
458
|
+
></ef-captions-filmstrip>`;
|
|
459
|
+
}
|
|
460
|
+
if (child instanceof EFWaveform) {
|
|
461
|
+
return html`<ef-waveform-filmstrip
|
|
462
|
+
.element=${child}
|
|
463
|
+
.pixelsPerMs=${pixelsPerMs}
|
|
464
|
+
></ef-waveform-filmstrip>`;
|
|
465
|
+
}
|
|
466
|
+
return html`<ef-html-filmstrip
|
|
467
|
+
.element=${child}
|
|
468
|
+
.pixelsPerMs=${pixelsPerMs}
|
|
469
|
+
></ef-html-filmstrip>`;
|
|
470
|
+
});
|
|
471
|
+
};
|
|
472
|
+
let EFFilmstrip = class extends TWMixin(LitElement) {
|
|
473
|
+
constructor() {
|
|
474
|
+
super(...arguments);
|
|
475
|
+
__privateAdd(this, _EFFilmstrip_instances);
|
|
476
|
+
this.pixelsPerMs = 0.04;
|
|
477
|
+
this.currentTimeMs = 0;
|
|
478
|
+
this.targetSelector = "";
|
|
479
|
+
this.scrubbing = false;
|
|
480
|
+
this.playing = false;
|
|
481
|
+
this.timelineScrolltop = 0;
|
|
482
|
+
__privateAdd(this, _handleKeyPress, (event) => {
|
|
483
|
+
if (event.key === " ") {
|
|
484
|
+
const interactiveSelector = "input, textarea, button, select, a, [contenteditable]";
|
|
485
|
+
const closestInteractive = event.target?.closest(
|
|
486
|
+
interactiveSelector
|
|
487
|
+
);
|
|
488
|
+
if (closestInteractive) {
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
event.preventDefault();
|
|
492
|
+
this.playing = !this.playing;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
__privateAdd(this, _lastTick);
|
|
496
|
+
__privateAdd(this, _playbackAudioContext, null);
|
|
497
|
+
__privateAdd(this, _playbackAnimationFrameRequest, null);
|
|
498
|
+
__privateAdd(this, _AUDIO_PLAYBACK_SLICE_MS, 1e3);
|
|
499
|
+
this.advancePlayhead = (tick) => {
|
|
500
|
+
if (__privateGet(this, _lastTick) && tick && this.targetTimegroup) {
|
|
501
|
+
this.targetTimegroup.currentTimeMs += tick - __privateGet(this, _lastTick);
|
|
502
|
+
if (this.targetTimegroup.currentTimeMs >= this.targetTimegroup.durationMs) {
|
|
503
|
+
this.playing = false;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
__privateSet(this, _lastTick, tick);
|
|
507
|
+
if (this.playing) {
|
|
508
|
+
requestAnimationFrame(this.advancePlayhead);
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
this.gutterRef = createRef();
|
|
512
|
+
this.hierarchyRef = createRef();
|
|
513
|
+
this.playheadRef = createRef();
|
|
514
|
+
}
|
|
515
|
+
connectedCallback() {
|
|
516
|
+
super.connectedCallback();
|
|
517
|
+
const target = this.targetTimegroup;
|
|
518
|
+
if (target) {
|
|
519
|
+
this.timegroupController = new TimegroupController(target, this);
|
|
520
|
+
this.currentTimeMs = target.currentTimeMs;
|
|
521
|
+
}
|
|
522
|
+
window.addEventListener("keypress", __privateGet(this, _handleKeyPress));
|
|
523
|
+
}
|
|
524
|
+
disconnectedCallback() {
|
|
525
|
+
super.disconnectedCallback();
|
|
526
|
+
window.removeEventListener("keypress", __privateGet(this, _handleKeyPress));
|
|
527
|
+
}
|
|
528
|
+
syncGutterScroll() {
|
|
529
|
+
if (this.gutter && this.hierarchyRef.value) {
|
|
530
|
+
this.hierarchyRef.value.scrollTop = this.gutter.scrollTop;
|
|
531
|
+
this.timelineScrolltop = this.gutter.scrollTop;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
syncHierarchyScroll() {
|
|
535
|
+
if (this.gutter && this.hierarchyRef.value) {
|
|
536
|
+
this.gutter.scrollTop = this.hierarchyRef.value.scrollTop;
|
|
537
|
+
this.timelineScrolltop = this.hierarchyRef.value.scrollTop;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
scrub(e) {
|
|
541
|
+
if (this.playing) {
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
if (!this.scrubbing) {
|
|
545
|
+
return;
|
|
546
|
+
}
|
|
547
|
+
const gutter = this.shadowRoot?.querySelector("#gutter");
|
|
548
|
+
if (!gutter) {
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
const rect = gutter.getBoundingClientRect();
|
|
552
|
+
if (this.targetTimegroup) {
|
|
553
|
+
const layerX = e.pageX - rect.left + gutter.scrollLeft;
|
|
554
|
+
this.targetTimegroup.currentTimeMs = layerX / this.pixelsPerMs;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
startScrub(e) {
|
|
558
|
+
e.preventDefault();
|
|
559
|
+
this.scrubbing = true;
|
|
560
|
+
queueMicrotask(() => {
|
|
561
|
+
const gutter = this.shadowRoot?.querySelector("#gutter");
|
|
562
|
+
if (!gutter) {
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
565
|
+
const rect = gutter.getBoundingClientRect();
|
|
566
|
+
if (this.targetTimegroup) {
|
|
567
|
+
const layerX = e.pageX - rect.left + gutter.scrollLeft;
|
|
568
|
+
this.targetTimegroup.currentTimeMs = layerX / this.pixelsPerMs;
|
|
569
|
+
}
|
|
570
|
+
});
|
|
571
|
+
addEventListener(
|
|
572
|
+
"mouseup",
|
|
573
|
+
() => {
|
|
574
|
+
this.scrubbing = false;
|
|
575
|
+
},
|
|
576
|
+
{ once: true }
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
scrollScrub(e) {
|
|
580
|
+
if (this.targetTimegroup && this.gutter && !this.playing) {
|
|
581
|
+
e.preventDefault();
|
|
582
|
+
if (this.gutterRef.value && this.gutterRef.value.scrollLeft === 0 && e.deltaX < 0) {
|
|
583
|
+
this.gutter.scrollBy(0, e.deltaY);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
if (this.gutter.scrollWidth - this.gutter.scrollLeft === this.gutter.clientWidth && e.deltaX > 0) {
|
|
587
|
+
this.gutter.scrollBy(0, e.deltaY);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
if (this) {
|
|
591
|
+
this.gutter.scrollBy(e.deltaX, e.deltaY);
|
|
592
|
+
this.targetTimegroup.currentTimeMs += e.deltaX / this.pixelsPerMs;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
get gutter() {
|
|
597
|
+
return this.gutterRef.value;
|
|
598
|
+
}
|
|
599
|
+
render() {
|
|
600
|
+
const target = this.targetTimegroup;
|
|
601
|
+
return html` <div
|
|
602
|
+
class="grid h-full bg-slate-100"
|
|
603
|
+
style=${styleMap({
|
|
604
|
+
gridTemplateColumns: "200px 1fr",
|
|
605
|
+
gridTemplateRows: "1.5rem 1fr"
|
|
606
|
+
})}
|
|
607
|
+
>
|
|
608
|
+
<div
|
|
609
|
+
class="z-20 col-span-2 border-b-slate-600 bg-slate-100 shadow shadow-slate-300"
|
|
610
|
+
>
|
|
611
|
+
<input
|
|
612
|
+
type="range"
|
|
613
|
+
.value=${this.pixelsPerMs}
|
|
614
|
+
min="0.01"
|
|
615
|
+
max="0.1"
|
|
616
|
+
step="0.001"
|
|
617
|
+
@input=${(e) => {
|
|
618
|
+
const target2 = e.target;
|
|
619
|
+
this.pixelsPerMs = Number.parseFloat(target2.value);
|
|
620
|
+
}}
|
|
621
|
+
/>
|
|
622
|
+
<code>${msToTimeCode(this.currentTimeMs, true)} </code> /
|
|
623
|
+
<code>${msToTimeCode(target?.durationMs ?? 0, true)}</code>
|
|
624
|
+
${this.playing ? html`<button
|
|
625
|
+
@click=${() => {
|
|
626
|
+
this.playing = false;
|
|
627
|
+
}}
|
|
628
|
+
>
|
|
629
|
+
⏸️
|
|
630
|
+
</button>` : html`<button
|
|
631
|
+
@click=${() => {
|
|
632
|
+
this.playing = true;
|
|
633
|
+
}}
|
|
634
|
+
>
|
|
635
|
+
▶️
|
|
636
|
+
</button>`}
|
|
637
|
+
</div>
|
|
638
|
+
<div
|
|
639
|
+
class="z-10 pl-1 pr-1 pt-2 shadow shadow-slate-600 overflow-auto"
|
|
640
|
+
${ref(this.hierarchyRef)}
|
|
641
|
+
@scroll=${this.syncHierarchyScroll}
|
|
642
|
+
>
|
|
643
|
+
${renderHierarchyChildren(Array.from(target?.children ?? []))}
|
|
644
|
+
</div>
|
|
645
|
+
<div
|
|
646
|
+
class="h-full w-full cursor-crosshair overflow-auto bg-slate-200 pt-2"
|
|
647
|
+
id="gutter"
|
|
648
|
+
${ref(this.gutterRef)}
|
|
649
|
+
@scroll=${this.syncGutterScroll}
|
|
650
|
+
@wheel=${this.scrollScrub}
|
|
651
|
+
>
|
|
652
|
+
<div
|
|
653
|
+
class="relative h-full w-full"
|
|
654
|
+
style="width: ${this.pixelsPerMs * (target?.durationMs ?? 0)}px;"
|
|
655
|
+
@mousemove=${this.scrub}
|
|
656
|
+
@mousedown=${this.startScrub}
|
|
657
|
+
>
|
|
658
|
+
<div
|
|
659
|
+
class="border-red pointer-events-none absolute z-10 h-full w-[2px] border-r-2 border-red-700"
|
|
660
|
+
style=${styleMap({
|
|
661
|
+
left: `${this.pixelsPerMs * this.currentTimeMs}px`,
|
|
662
|
+
top: `${this.timelineScrolltop}px`
|
|
663
|
+
})}
|
|
664
|
+
${ref(this.playheadRef)}
|
|
665
|
+
></div>
|
|
666
|
+
|
|
667
|
+
${renderFilmstripChildren(
|
|
668
|
+
Array.from(target?.children || []),
|
|
669
|
+
this.pixelsPerMs
|
|
670
|
+
)}
|
|
671
|
+
</div>
|
|
672
|
+
</div>
|
|
673
|
+
</div>`;
|
|
674
|
+
}
|
|
675
|
+
update(changedProperties) {
|
|
676
|
+
if (changedProperties.has("playing")) {
|
|
677
|
+
if (this.playing) {
|
|
678
|
+
__privateMethod(this, _EFFilmstrip_instances, startPlayback_fn).call(this);
|
|
679
|
+
} else {
|
|
680
|
+
__privateMethod(this, _EFFilmstrip_instances, stopPlayback_fn).call(this);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
super.update(changedProperties);
|
|
684
|
+
}
|
|
685
|
+
updated(changes) {
|
|
686
|
+
if (!this.targetTimegroup) {
|
|
687
|
+
return;
|
|
688
|
+
}
|
|
689
|
+
if (changes.has("currentTimeMs")) {
|
|
690
|
+
if (this.targetTimegroup.currentTimeMs !== this.currentTimeMs) {
|
|
691
|
+
this.targetTimegroup.currentTimeMs = this.currentTimeMs;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
get targetTimegroup() {
|
|
696
|
+
if (this.getAttribute("target")) {
|
|
697
|
+
const target = document.querySelector(this.getAttribute("target") ?? "");
|
|
698
|
+
if (target instanceof EFTimegroup) {
|
|
699
|
+
return target;
|
|
700
|
+
}
|
|
701
|
+
throw new Error("Invalid target, must be an EFTimegroup element");
|
|
702
|
+
}
|
|
703
|
+
return void 0;
|
|
704
|
+
}
|
|
705
|
+
};
|
|
706
|
+
_handleKeyPress = /* @__PURE__ */ new WeakMap();
|
|
707
|
+
_lastTick = /* @__PURE__ */ new WeakMap();
|
|
708
|
+
_playbackAudioContext = /* @__PURE__ */ new WeakMap();
|
|
709
|
+
_playbackAnimationFrameRequest = /* @__PURE__ */ new WeakMap();
|
|
710
|
+
_AUDIO_PLAYBACK_SLICE_MS = /* @__PURE__ */ new WeakMap();
|
|
711
|
+
_EFFilmstrip_instances = /* @__PURE__ */ new WeakSet();
|
|
712
|
+
syncPlayheadToAudioContext_fn = function(target, startMs) {
|
|
713
|
+
target.currentTimeMs = startMs + (__privateGet(this, _playbackAudioContext)?.currentTime ?? 0) * 1e3;
|
|
714
|
+
__privateSet(this, _playbackAnimationFrameRequest, requestAnimationFrame(() => {
|
|
715
|
+
__privateMethod(this, _EFFilmstrip_instances, syncPlayheadToAudioContext_fn).call(this, target, startMs);
|
|
716
|
+
}));
|
|
717
|
+
};
|
|
718
|
+
stopPlayback_fn = async function() {
|
|
719
|
+
if (__privateGet(this, _playbackAudioContext)) {
|
|
720
|
+
if (__privateGet(this, _playbackAudioContext).state !== "closed") {
|
|
721
|
+
await __privateGet(this, _playbackAudioContext).close();
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
if (__privateGet(this, _playbackAnimationFrameRequest)) {
|
|
725
|
+
cancelAnimationFrame(__privateGet(this, _playbackAnimationFrameRequest));
|
|
726
|
+
}
|
|
727
|
+
__privateSet(this, _playbackAudioContext, null);
|
|
728
|
+
};
|
|
729
|
+
startPlayback_fn = async function() {
|
|
730
|
+
await __privateMethod(this, _EFFilmstrip_instances, stopPlayback_fn).call(this);
|
|
731
|
+
const timegroup = this.targetTimegroup;
|
|
732
|
+
if (!timegroup) {
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
let currentMs = timegroup.currentTimeMs;
|
|
736
|
+
let bufferCount = 0;
|
|
737
|
+
__privateSet(this, _playbackAudioContext, new AudioContext({
|
|
738
|
+
latencyHint: "playback"
|
|
739
|
+
}));
|
|
740
|
+
if (__privateGet(this, _playbackAnimationFrameRequest)) {
|
|
741
|
+
cancelAnimationFrame(__privateGet(this, _playbackAnimationFrameRequest));
|
|
742
|
+
}
|
|
743
|
+
__privateMethod(this, _EFFilmstrip_instances, syncPlayheadToAudioContext_fn).call(this, timegroup, currentMs);
|
|
744
|
+
const playbackContext = __privateGet(this, _playbackAudioContext);
|
|
745
|
+
await playbackContext.suspend();
|
|
746
|
+
const fillBuffer = async () => {
|
|
747
|
+
if (bufferCount > 1) {
|
|
748
|
+
return;
|
|
749
|
+
}
|
|
750
|
+
const canFillBuffer = await queueBufferSource();
|
|
751
|
+
if (canFillBuffer) {
|
|
752
|
+
fillBuffer();
|
|
753
|
+
}
|
|
754
|
+
};
|
|
755
|
+
const fromMs = currentMs;
|
|
756
|
+
const toMs = timegroup.endTimeMs;
|
|
757
|
+
const queueBufferSource = async () => {
|
|
758
|
+
if (currentMs >= toMs) {
|
|
759
|
+
return false;
|
|
760
|
+
}
|
|
761
|
+
const startMs = currentMs;
|
|
762
|
+
const endMs = currentMs + __privateGet(this, _AUDIO_PLAYBACK_SLICE_MS);
|
|
763
|
+
currentMs += __privateGet(this, _AUDIO_PLAYBACK_SLICE_MS);
|
|
764
|
+
const audioBuffer = await timegroup.renderAudio(startMs, endMs);
|
|
765
|
+
bufferCount++;
|
|
766
|
+
const source = playbackContext.createBufferSource();
|
|
767
|
+
source.buffer = audioBuffer;
|
|
768
|
+
source.connect(playbackContext.destination);
|
|
769
|
+
source.start((startMs - fromMs) / 1e3);
|
|
770
|
+
source.onended = () => {
|
|
771
|
+
bufferCount--;
|
|
772
|
+
if (endMs >= toMs) {
|
|
773
|
+
this.playing = false;
|
|
774
|
+
} else {
|
|
775
|
+
fillBuffer();
|
|
776
|
+
}
|
|
777
|
+
};
|
|
778
|
+
return true;
|
|
779
|
+
};
|
|
780
|
+
await fillBuffer();
|
|
781
|
+
await playbackContext.resume();
|
|
782
|
+
};
|
|
783
|
+
__decorateClass([
|
|
784
|
+
property({ type: Number })
|
|
785
|
+
], EFFilmstrip.prototype, "pixelsPerMs", 2);
|
|
786
|
+
__decorateClass([
|
|
787
|
+
property({ type: Number })
|
|
788
|
+
], EFFilmstrip.prototype, "currentTimeMs", 2);
|
|
789
|
+
__decorateClass([
|
|
790
|
+
property({ type: String, attribute: "target", reflect: true })
|
|
791
|
+
], EFFilmstrip.prototype, "targetSelector", 2);
|
|
792
|
+
__decorateClass([
|
|
793
|
+
state()
|
|
794
|
+
], EFFilmstrip.prototype, "scrubbing", 2);
|
|
795
|
+
__decorateClass([
|
|
796
|
+
state()
|
|
797
|
+
], EFFilmstrip.prototype, "playing", 2);
|
|
798
|
+
__decorateClass([
|
|
799
|
+
state()
|
|
800
|
+
], EFFilmstrip.prototype, "timelineScrolltop", 2);
|
|
801
|
+
__decorateClass([
|
|
802
|
+
eventOptions({ passive: false })
|
|
803
|
+
], EFFilmstrip.prototype, "syncGutterScroll", 1);
|
|
804
|
+
__decorateClass([
|
|
805
|
+
eventOptions({ passive: false })
|
|
806
|
+
], EFFilmstrip.prototype, "syncHierarchyScroll", 1);
|
|
807
|
+
__decorateClass([
|
|
808
|
+
eventOptions({ capture: false })
|
|
809
|
+
], EFFilmstrip.prototype, "scrub", 1);
|
|
810
|
+
__decorateClass([
|
|
811
|
+
eventOptions({ capture: false })
|
|
812
|
+
], EFFilmstrip.prototype, "startScrub", 1);
|
|
813
|
+
__decorateClass([
|
|
814
|
+
eventOptions({ passive: false })
|
|
815
|
+
], EFFilmstrip.prototype, "scrollScrub", 1);
|
|
816
|
+
EFFilmstrip = __decorateClass([
|
|
817
|
+
customElement("ef-filmstrip")
|
|
818
|
+
], EFFilmstrip);
|
|
819
|
+
export {
|
|
820
|
+
EFAudioFilmstrip,
|
|
821
|
+
EFCaptionsFilmstrip,
|
|
822
|
+
EFFilmstrip,
|
|
823
|
+
EFHTMLFilmstrip,
|
|
824
|
+
EFImageFilmstrip,
|
|
825
|
+
EFTimegroupFilmstrip,
|
|
826
|
+
EFVideoFilmstrip,
|
|
827
|
+
EFWaveformFilmstrip
|
|
828
|
+
};
|