@editframe/elements 0.7.0-beta.8 → 0.8.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.
- package/dist/EF_INTERACTIVE.d.ts +1 -0
- package/dist/{lib/av → assets/dist}/EncodedAsset.js +1 -1
- package/dist/{packages/elements/src/elements → elements}/EFAudio.d.ts +2 -2
- package/dist/{packages/elements/src/elements → elements}/EFCaptions.d.ts +5 -5
- package/dist/{packages/elements/src/elements → elements}/EFImage.d.ts +3 -3
- package/dist/{packages/elements/src/elements → elements}/EFMedia.d.ts +4 -4
- package/dist/{packages/elements/src/elements → elements}/EFTemporal.d.ts +1 -1
- package/dist/{packages/elements/src/elements → elements}/EFTimegroup.browsertest.d.ts +1 -1
- package/dist/{packages/elements/src/elements → elements}/EFTimegroup.d.ts +3 -3
- package/dist/{packages/elements/src/elements → elements}/EFVideo.d.ts +3 -3
- package/dist/{packages/elements/src/elements → elements}/EFWaveform.d.ts +3 -3
- package/dist/{packages/elements/src/elements → elements}/TimegroupController.d.ts +1 -1
- package/dist/{packages/elements → elements}/src/EF_FRAMEGEN.js +4 -3
- package/dist/elements/src/EF_INTERACTIVE.js +7 -0
- package/dist/{packages/elements → elements}/src/elements/EFCaptions.js +5 -5
- package/dist/{packages/elements → elements}/src/elements/EFMedia.js +6 -3
- package/dist/{packages/elements → elements}/src/elements/EFSourceMixin.js +1 -1
- package/dist/{packages/elements → elements}/src/elements/EFTemporal.js +37 -2
- package/dist/{packages/elements → elements}/src/elements/EFTimegroup.js +4 -2
- package/dist/{packages/elements → elements}/src/elements/FetchMixin.js +1 -1
- package/dist/elements/src/gui/ContextMixin.js +234 -0
- package/dist/{packages/elements → elements}/src/gui/EFFilmstrip.js +30 -134
- package/dist/elements/src/gui/EFPreview.js +45 -0
- package/dist/{packages/elements → elements}/src/gui/EFWorkbench.js +6 -93
- package/dist/{packages/elements → elements}/src/gui/TWMixin.js +10 -2
- package/dist/elements/src/gui/apiHostContext.js +5 -0
- package/dist/elements/src/gui/fetchContext.js +5 -0
- package/dist/elements/src/gui/focusContext.js +5 -0
- package/dist/elements/src/gui/focusedElementContext.js +7 -0
- package/dist/elements/src/gui/playingContext.js +5 -0
- package/dist/{packages/elements → elements}/src/index.js +5 -1
- package/dist/{packages/elements/src/elements → elements}/util.d.ts +1 -1
- package/dist/gui/ContextMixin.d.ts +23 -0
- package/dist/{packages/elements/src/gui → gui}/EFFilmstrip.d.ts +12 -15
- package/dist/gui/EFPreview.d.ts +27 -0
- package/dist/gui/EFWorkbench.d.ts +34 -0
- package/dist/gui/apiHostContext.d.ts +3 -0
- package/dist/gui/fetchContext.d.ts +3 -0
- package/dist/gui/focusContext.d.ts +6 -0
- package/dist/gui/focusedElementContext.d.ts +3 -0
- package/dist/gui/playingContext.d.ts +3 -0
- package/dist/index.d.ts +11 -0
- package/dist/msToTimeCode.d.ts +1 -0
- package/dist/style.css +9 -0
- package/package.json +6 -9
- package/src/elements/EFAudio.ts +1 -1
- package/src/elements/EFCaptions.ts +9 -9
- package/src/elements/EFImage.ts +3 -3
- package/src/elements/EFMedia.ts +11 -8
- package/src/elements/EFSourceMixin.ts +1 -1
- package/src/elements/EFTemporal.ts +42 -5
- package/src/elements/EFTimegroup.browsertest.ts +3 -3
- package/src/elements/EFTimegroup.ts +9 -6
- package/src/elements/EFVideo.ts +2 -2
- package/src/elements/EFWaveform.ts +6 -6
- package/src/elements/FetchMixin.ts +5 -3
- package/src/elements/TimegroupController.ts +1 -1
- package/src/elements/durationConverter.ts +1 -1
- package/src/elements/util.ts +1 -1
- package/src/gui/ContextMixin.ts +254 -0
- package/src/gui/EFFilmstrip.ts +41 -150
- package/src/gui/EFPreview.ts +39 -0
- package/src/gui/EFWorkbench.ts +7 -105
- package/src/gui/TWMixin.ts +10 -3
- package/src/gui/apiHostContext.ts +3 -0
- package/src/gui/fetchContext.ts +5 -0
- package/src/gui/focusContext.ts +7 -0
- package/src/gui/focusedElementContext.ts +5 -0
- package/src/gui/playingContext.ts +3 -0
- package/dist/lib/av/EncodedAsset.cjs +0 -577
- package/dist/lib/av/MP4File.cjs +0 -187
- package/dist/lib/av/msToTimeCode.cjs +0 -15
- package/dist/lib/util/awaitMicrotask.cjs +0 -4
- package/dist/lib/util/awaitMicrotask.js +0 -4
- package/dist/lib/util/memoize.cjs +0 -14
- package/dist/packages/elements/src/EF_FRAMEGEN.cjs +0 -197
- package/dist/packages/elements/src/EF_INTERACTIVE.cjs +0 -4
- package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +0 -1
- package/dist/packages/elements/src/EF_INTERACTIVE.js +0 -4
- package/dist/packages/elements/src/elements/CrossUpdateController.cjs +0 -16
- package/dist/packages/elements/src/elements/EFAudio.cjs +0 -53
- package/dist/packages/elements/src/elements/EFCaptions.cjs +0 -164
- package/dist/packages/elements/src/elements/EFImage.cjs +0 -79
- package/dist/packages/elements/src/elements/EFMedia.cjs +0 -336
- package/dist/packages/elements/src/elements/EFSourceMixin.cjs +0 -55
- package/dist/packages/elements/src/elements/EFTemporal.cjs +0 -199
- package/dist/packages/elements/src/elements/EFTimegroup.cjs +0 -352
- package/dist/packages/elements/src/elements/EFVideo.cjs +0 -109
- package/dist/packages/elements/src/elements/EFWaveform.cjs +0 -242
- package/dist/packages/elements/src/elements/FetchMixin.cjs +0 -28
- package/dist/packages/elements/src/elements/TimegroupController.cjs +0 -20
- package/dist/packages/elements/src/elements/durationConverter.cjs +0 -8
- package/dist/packages/elements/src/elements/parseTimeToMs.cjs +0 -12
- package/dist/packages/elements/src/elements/util.cjs +0 -11
- package/dist/packages/elements/src/gui/EFFilmstrip.cjs +0 -825
- package/dist/packages/elements/src/gui/EFWorkbench.cjs +0 -214
- package/dist/packages/elements/src/gui/EFWorkbench.d.ts +0 -45
- package/dist/packages/elements/src/gui/TWMixin.cjs +0 -28
- package/dist/packages/elements/src/gui/TWMixin.css.cjs +0 -3
- package/dist/packages/elements/src/index.cjs +0 -50
- package/dist/packages/elements/src/index.d.ts +0 -10
- /package/dist/{packages/elements/src/EF_FRAMEGEN.d.ts → EF_FRAMEGEN.d.ts} +0 -0
- /package/dist/{lib/av → assets/dist}/MP4File.js +0 -0
- /package/dist/{lib/util → assets/dist}/memoize.js +0 -0
- /package/dist/{packages/elements/src/elements → elements}/CrossUpdateController.d.ts +0 -0
- /package/dist/{packages/elements/src/elements → elements}/EFSourceMixin.d.ts +0 -0
- /package/dist/{packages/elements/src/elements → elements}/FetchMixin.d.ts +0 -0
- /package/dist/{packages/elements/src/elements → elements}/durationConverter.d.ts +0 -0
- /package/dist/{packages/elements/src/elements → elements}/parseTimeToMs.d.ts +0 -0
- /package/dist/{packages/elements → elements}/src/elements/CrossUpdateController.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/EFAudio.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/EFImage.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/EFVideo.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/EFWaveform.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/TimegroupController.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/durationConverter.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/parseTimeToMs.js +0 -0
- /package/dist/{packages/elements → elements}/src/elements/util.js +0 -0
- /package/dist/{packages/elements → elements}/src/gui/TWMixin.css.js +0 -0
- /package/dist/{lib/av → elements/src}/msToTimeCode.js +0 -0
- /package/dist/{packages/elements/src/gui → gui}/TWMixin.d.ts +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { EFTimegroup } from "../elements/EFTimegroup.js";
|
|
2
1
|
import { css, html, nothing, LitElement } from "lit";
|
|
3
2
|
import { property, customElement, state, eventOptions } from "lit/decorators.js";
|
|
3
|
+
import { consume } from "@lit/context";
|
|
4
4
|
import { styleMap } from "lit/directives/style-map.js";
|
|
5
5
|
import { createRef, ref } from "lit/directives/ref.js";
|
|
6
6
|
import { EFImage } from "../elements/EFImage.js";
|
|
@@ -8,11 +8,13 @@ import { EFAudio } from "../elements/EFAudio.js";
|
|
|
8
8
|
import { EFVideo } from "../elements/EFVideo.js";
|
|
9
9
|
import { EFCaptions, EFCaptionsActiveWord } from "../elements/EFCaptions.js";
|
|
10
10
|
import { EFWaveform } from "../elements/EFWaveform.js";
|
|
11
|
+
import { EFTimegroup } from "../elements/EFTimegroup.js";
|
|
11
12
|
import { TimegroupController } from "../elements/TimegroupController.js";
|
|
12
|
-
import { consume } from "@lit/context";
|
|
13
|
-
import { focusContext, focusedElement } from "./EFWorkbench.js";
|
|
14
13
|
import { TWMixin } from "./TWMixin.js";
|
|
15
|
-
import { msToTimeCode } from "
|
|
14
|
+
import { msToTimeCode } from "../msToTimeCode.js";
|
|
15
|
+
import { focusedElementContext } from "./focusedElementContext.js";
|
|
16
|
+
import { focusContext } from "./focusContext.js";
|
|
17
|
+
import { playingContext } from "./playingContext.js";
|
|
16
18
|
var __defProp = Object.defineProperty;
|
|
17
19
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
18
20
|
var __typeError = (msg) => {
|
|
@@ -27,11 +29,10 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
27
29
|
return result;
|
|
28
30
|
};
|
|
29
31
|
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));
|
|
32
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
31
33
|
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
34
|
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
34
|
-
var _EFFilmstrip_instances, bindToTargetTimegroup_fn, _handleKeyPress,
|
|
35
|
+
var _EFFilmstrip_instances, bindToTargetTimegroup_fn, _handleKeyPress, contextElement_get;
|
|
35
36
|
class ElementFilmstripController {
|
|
36
37
|
constructor(host, filmstrip) {
|
|
37
38
|
this.host = host;
|
|
@@ -165,10 +166,10 @@ __decorateClass([
|
|
|
165
166
|
consume({ context: focusContext, subscribe: true })
|
|
166
167
|
], FilmstripItem.prototype, "focusContext", 2);
|
|
167
168
|
__decorateClass([
|
|
168
|
-
consume({ context:
|
|
169
|
+
consume({ context: focusedElementContext, subscribe: true })
|
|
169
170
|
], FilmstripItem.prototype, "focusedElement", 2);
|
|
170
171
|
__decorateClass([
|
|
171
|
-
property({ type:
|
|
172
|
+
property({ type: Object, attribute: false })
|
|
172
173
|
], FilmstripItem.prototype, "element", 2);
|
|
173
174
|
__decorateClass([
|
|
174
175
|
property({ type: Number })
|
|
@@ -292,13 +293,13 @@ let EFHierarchyItem = class extends TWMixin(LitElement) {
|
|
|
292
293
|
}
|
|
293
294
|
};
|
|
294
295
|
__decorateClass([
|
|
295
|
-
property({ type:
|
|
296
|
+
property({ type: Object, attribute: false })
|
|
296
297
|
], EFHierarchyItem.prototype, "element", 2);
|
|
297
298
|
__decorateClass([
|
|
298
299
|
consume({ context: focusContext })
|
|
299
300
|
], EFHierarchyItem.prototype, "focusContext", 2);
|
|
300
301
|
__decorateClass([
|
|
301
|
-
consume({ context:
|
|
302
|
+
consume({ context: focusedElementContext, subscribe: true })
|
|
302
303
|
], EFHierarchyItem.prototype, "focusedElement", 2);
|
|
303
304
|
EFHierarchyItem = __decorateClass([
|
|
304
305
|
customElement("ef-hierarchy-item")
|
|
@@ -474,11 +475,9 @@ let EFFilmstrip = class extends TWMixin(LitElement) {
|
|
|
474
475
|
super(...arguments);
|
|
475
476
|
__privateAdd(this, _EFFilmstrip_instances);
|
|
476
477
|
this.pixelsPerMs = 0.04;
|
|
477
|
-
this.currentTimeMs = 0;
|
|
478
|
-
this.targetSelector = "";
|
|
479
478
|
this.scrubbing = false;
|
|
480
|
-
this.playing = false;
|
|
481
479
|
this.timelineScrolltop = 0;
|
|
480
|
+
this.currentTimeMs = 0;
|
|
482
481
|
__privateAdd(this, _handleKeyPress, (event) => {
|
|
483
482
|
if (event.key === " ") {
|
|
484
483
|
const interactiveSelector = "input, textarea, button, select, a, [contenteditable]";
|
|
@@ -489,25 +488,11 @@ let EFFilmstrip = class extends TWMixin(LitElement) {
|
|
|
489
488
|
return;
|
|
490
489
|
}
|
|
491
490
|
event.preventDefault();
|
|
492
|
-
this
|
|
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;
|
|
491
|
+
if (__privateGet(this, _EFFilmstrip_instances, contextElement_get)) {
|
|
492
|
+
__privateGet(this, _EFFilmstrip_instances, contextElement_get).playing = !__privateGet(this, _EFFilmstrip_instances, contextElement_get).playing;
|
|
504
493
|
}
|
|
505
494
|
}
|
|
506
|
-
|
|
507
|
-
if (this.playing) {
|
|
508
|
-
requestAnimationFrame(this.advancePlayhead);
|
|
509
|
-
}
|
|
510
|
-
};
|
|
495
|
+
});
|
|
511
496
|
this.gutterRef = createRef();
|
|
512
497
|
this.hierarchyRef = createRef();
|
|
513
498
|
this.playheadRef = createRef();
|
|
@@ -619,13 +604,17 @@ let EFFilmstrip = class extends TWMixin(LitElement) {
|
|
|
619
604
|
<code>${msToTimeCode(target?.durationMs ?? 0, true)}</code>
|
|
620
605
|
${this.playing ? html`<button
|
|
621
606
|
@click=${() => {
|
|
622
|
-
this
|
|
607
|
+
if (__privateGet(this, _EFFilmstrip_instances, contextElement_get)) {
|
|
608
|
+
__privateGet(this, _EFFilmstrip_instances, contextElement_get).playing = false;
|
|
609
|
+
}
|
|
623
610
|
}}
|
|
624
611
|
>
|
|
625
612
|
⏸️
|
|
626
613
|
</button>` : html`<button
|
|
627
614
|
@click=${() => {
|
|
628
|
-
this
|
|
615
|
+
if (__privateGet(this, _EFFilmstrip_instances, contextElement_get)) {
|
|
616
|
+
__privateGet(this, _EFFilmstrip_instances, contextElement_get).playing = true;
|
|
617
|
+
}
|
|
629
618
|
}}
|
|
630
619
|
>
|
|
631
620
|
▶️
|
|
@@ -665,16 +654,6 @@ let EFFilmstrip = class extends TWMixin(LitElement) {
|
|
|
665
654
|
</div>
|
|
666
655
|
</div>`;
|
|
667
656
|
}
|
|
668
|
-
update(changedProperties) {
|
|
669
|
-
if (changedProperties.has("playing")) {
|
|
670
|
-
if (this.playing) {
|
|
671
|
-
__privateMethod(this, _EFFilmstrip_instances, startPlayback_fn).call(this);
|
|
672
|
-
} else {
|
|
673
|
-
__privateMethod(this, _EFFilmstrip_instances, stopPlayback_fn).call(this);
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
super.update(changedProperties);
|
|
677
|
-
}
|
|
678
657
|
updated(changes) {
|
|
679
658
|
if (!this.targetTimegroup) {
|
|
680
659
|
return;
|
|
@@ -684,18 +663,9 @@ let EFFilmstrip = class extends TWMixin(LitElement) {
|
|
|
684
663
|
this.targetTimegroup.currentTimeMs = this.currentTimeMs;
|
|
685
664
|
}
|
|
686
665
|
}
|
|
687
|
-
if (changes.has("target")) {
|
|
688
|
-
__privateMethod(this, _EFFilmstrip_instances, bindToTargetTimegroup_fn).call(this);
|
|
689
|
-
}
|
|
690
666
|
}
|
|
691
667
|
get targetTimegroup() {
|
|
692
|
-
|
|
693
|
-
const target = document.getElementById(this.getAttribute("target") ?? "");
|
|
694
|
-
if (target instanceof EFTimegroup) {
|
|
695
|
-
return target;
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
return void 0;
|
|
668
|
+
return __privateGet(this, _EFFilmstrip_instances, contextElement_get)?.targetTimegroup;
|
|
699
669
|
}
|
|
700
670
|
};
|
|
701
671
|
_EFFilmstrip_instances = /* @__PURE__ */ new WeakSet();
|
|
@@ -710,99 +680,25 @@ bindToTargetTimegroup_fn = function() {
|
|
|
710
680
|
}
|
|
711
681
|
};
|
|
712
682
|
_handleKeyPress = /* @__PURE__ */ new WeakMap();
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
_playbackAnimationFrameRequest = /* @__PURE__ */ new WeakMap();
|
|
716
|
-
_AUDIO_PLAYBACK_SLICE_MS = /* @__PURE__ */ new WeakMap();
|
|
717
|
-
syncPlayheadToAudioContext_fn = function(target, startMs) {
|
|
718
|
-
target.currentTimeMs = startMs + (__privateGet(this, _playbackAudioContext)?.currentTime ?? 0) * 1e3;
|
|
719
|
-
__privateSet(this, _playbackAnimationFrameRequest, requestAnimationFrame(() => {
|
|
720
|
-
__privateMethod(this, _EFFilmstrip_instances, syncPlayheadToAudioContext_fn).call(this, target, startMs);
|
|
721
|
-
}));
|
|
722
|
-
};
|
|
723
|
-
stopPlayback_fn = async function() {
|
|
724
|
-
if (__privateGet(this, _playbackAudioContext)) {
|
|
725
|
-
if (__privateGet(this, _playbackAudioContext).state !== "closed") {
|
|
726
|
-
await __privateGet(this, _playbackAudioContext).close();
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
if (__privateGet(this, _playbackAnimationFrameRequest)) {
|
|
730
|
-
cancelAnimationFrame(__privateGet(this, _playbackAnimationFrameRequest));
|
|
731
|
-
}
|
|
732
|
-
__privateSet(this, _playbackAudioContext, null);
|
|
733
|
-
};
|
|
734
|
-
startPlayback_fn = async function() {
|
|
735
|
-
await __privateMethod(this, _EFFilmstrip_instances, stopPlayback_fn).call(this);
|
|
736
|
-
const timegroup = this.targetTimegroup;
|
|
737
|
-
if (!timegroup) {
|
|
738
|
-
return;
|
|
739
|
-
}
|
|
740
|
-
let currentMs = timegroup.currentTimeMs;
|
|
741
|
-
let bufferCount = 0;
|
|
742
|
-
__privateSet(this, _playbackAudioContext, new AudioContext({
|
|
743
|
-
latencyHint: "playback"
|
|
744
|
-
}));
|
|
745
|
-
if (__privateGet(this, _playbackAnimationFrameRequest)) {
|
|
746
|
-
cancelAnimationFrame(__privateGet(this, _playbackAnimationFrameRequest));
|
|
747
|
-
}
|
|
748
|
-
__privateMethod(this, _EFFilmstrip_instances, syncPlayheadToAudioContext_fn).call(this, timegroup, currentMs);
|
|
749
|
-
const playbackContext = __privateGet(this, _playbackAudioContext);
|
|
750
|
-
await playbackContext.suspend();
|
|
751
|
-
const fillBuffer = async () => {
|
|
752
|
-
if (bufferCount > 1) {
|
|
753
|
-
return;
|
|
754
|
-
}
|
|
755
|
-
const canFillBuffer = await queueBufferSource();
|
|
756
|
-
if (canFillBuffer) {
|
|
757
|
-
fillBuffer();
|
|
758
|
-
}
|
|
759
|
-
};
|
|
760
|
-
const fromMs = currentMs;
|
|
761
|
-
const toMs = timegroup.endTimeMs;
|
|
762
|
-
const queueBufferSource = async () => {
|
|
763
|
-
if (currentMs >= toMs) {
|
|
764
|
-
return false;
|
|
765
|
-
}
|
|
766
|
-
const startMs = currentMs;
|
|
767
|
-
const endMs = currentMs + __privateGet(this, _AUDIO_PLAYBACK_SLICE_MS);
|
|
768
|
-
currentMs += __privateGet(this, _AUDIO_PLAYBACK_SLICE_MS);
|
|
769
|
-
const audioBuffer = await timegroup.renderAudio(startMs, endMs);
|
|
770
|
-
bufferCount++;
|
|
771
|
-
const source = playbackContext.createBufferSource();
|
|
772
|
-
source.buffer = audioBuffer;
|
|
773
|
-
source.connect(playbackContext.destination);
|
|
774
|
-
source.start((startMs - fromMs) / 1e3);
|
|
775
|
-
source.onended = () => {
|
|
776
|
-
bufferCount--;
|
|
777
|
-
if (endMs >= toMs) {
|
|
778
|
-
this.playing = false;
|
|
779
|
-
} else {
|
|
780
|
-
fillBuffer();
|
|
781
|
-
}
|
|
782
|
-
};
|
|
783
|
-
return true;
|
|
784
|
-
};
|
|
785
|
-
await fillBuffer();
|
|
786
|
-
await playbackContext.resume();
|
|
683
|
+
contextElement_get = function() {
|
|
684
|
+
return this.closest("ef-workbench, ef-preview");
|
|
787
685
|
};
|
|
788
686
|
__decorateClass([
|
|
789
687
|
property({ type: Number })
|
|
790
688
|
], EFFilmstrip.prototype, "pixelsPerMs", 2);
|
|
791
|
-
__decorateClass([
|
|
792
|
-
property({ type: Number })
|
|
793
|
-
], EFFilmstrip.prototype, "currentTimeMs", 2);
|
|
794
|
-
__decorateClass([
|
|
795
|
-
property({ type: String, attribute: "target", reflect: true })
|
|
796
|
-
], EFFilmstrip.prototype, "targetSelector", 2);
|
|
797
689
|
__decorateClass([
|
|
798
690
|
state()
|
|
799
691
|
], EFFilmstrip.prototype, "scrubbing", 2);
|
|
800
692
|
__decorateClass([
|
|
801
693
|
state()
|
|
694
|
+
], EFFilmstrip.prototype, "timelineScrolltop", 2);
|
|
695
|
+
__decorateClass([
|
|
696
|
+
consume({ context: playingContext, subscribe: true }),
|
|
697
|
+
state()
|
|
802
698
|
], EFFilmstrip.prototype, "playing", 2);
|
|
803
699
|
__decorateClass([
|
|
804
700
|
state()
|
|
805
|
-
], EFFilmstrip.prototype, "
|
|
701
|
+
], EFFilmstrip.prototype, "currentTimeMs", 2);
|
|
806
702
|
__decorateClass([
|
|
807
703
|
eventOptions({ passive: false })
|
|
808
704
|
], EFFilmstrip.prototype, "syncGutterScroll", 1);
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { html, css, LitElement } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
import { ref } from "lit/directives/ref.js";
|
|
4
|
+
import { TWMixin } from "./TWMixin.js";
|
|
5
|
+
import { ContextMixin } from "./ContextMixin.js";
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
8
|
+
var __decorateClass = (decorators, target, key, kind) => {
|
|
9
|
+
var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
|
|
10
|
+
for (var i = decorators.length - 1, decorator; i >= 0; i--)
|
|
11
|
+
if (decorator = decorators[i])
|
|
12
|
+
result = (kind ? decorator(target, key, result) : decorator(result)) || result;
|
|
13
|
+
if (kind && result) __defProp(target, key, result);
|
|
14
|
+
return result;
|
|
15
|
+
};
|
|
16
|
+
let EFPreview = class extends ContextMixin(TWMixin(LitElement)) {
|
|
17
|
+
render() {
|
|
18
|
+
return html`
|
|
19
|
+
<div
|
|
20
|
+
${ref(this.stageRef)}
|
|
21
|
+
class="relative grid h-full w-full place-content-center place-items-center overflow-hidden"
|
|
22
|
+
>
|
|
23
|
+
<slot
|
|
24
|
+
${ref(this.canvasRef)}
|
|
25
|
+
class="inline-block"
|
|
26
|
+
></slot>
|
|
27
|
+
</div>
|
|
28
|
+
`;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
EFPreview.styles = [
|
|
32
|
+
css`
|
|
33
|
+
:host {
|
|
34
|
+
display: block;
|
|
35
|
+
width: 100%;
|
|
36
|
+
height: 100%;
|
|
37
|
+
}
|
|
38
|
+
`
|
|
39
|
+
];
|
|
40
|
+
EFPreview = __decorateClass([
|
|
41
|
+
customElement("ef-preview")
|
|
42
|
+
], EFPreview);
|
|
43
|
+
export {
|
|
44
|
+
EFPreview
|
|
45
|
+
};
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { css, html, LitElement } from "lit";
|
|
1
|
+
import { html, css, LitElement } from "lit";
|
|
3
2
|
import { TaskStatus } from "@lit/task";
|
|
4
|
-
import {
|
|
3
|
+
import { eventOptions, customElement } from "lit/decorators.js";
|
|
5
4
|
import { createRef, ref } from "lit/directives/ref.js";
|
|
6
|
-
import { awaitMicrotask } from "../../../../lib/util/awaitMicrotask.js";
|
|
7
5
|
import { deepGetTemporalElements } from "../elements/EFTemporal.js";
|
|
8
6
|
import { TWMixin } from "./TWMixin.js";
|
|
9
7
|
import { shallowGetTimegroups } from "../elements/EFTimegroup.js";
|
|
8
|
+
import { ContextMixin } from "./ContextMixin.js";
|
|
10
9
|
var __defProp = Object.defineProperty;
|
|
11
10
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
11
|
var __decorateClass = (decorators, target, key, kind) => {
|
|
@@ -17,64 +16,9 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
17
16
|
if (kind && result) __defProp(target, key, result);
|
|
18
17
|
return result;
|
|
19
18
|
};
|
|
20
|
-
|
|
21
|
-
const focusedElement = createContext(
|
|
22
|
-
Symbol("focusedElement")
|
|
23
|
-
);
|
|
24
|
-
const fetchContext = createContext(Symbol("fetchContext"));
|
|
25
|
-
const apiHostContext = createContext(Symbol("apiHostContext"));
|
|
26
|
-
let EFWorkbench = class extends TWMixin(LitElement) {
|
|
19
|
+
let EFWorkbench = class extends ContextMixin(TWMixin(LitElement)) {
|
|
27
20
|
constructor() {
|
|
28
21
|
super(...arguments);
|
|
29
|
-
this.stageRef = createRef();
|
|
30
|
-
this.canvasRef = createRef();
|
|
31
|
-
this.stageScale = 1;
|
|
32
|
-
this.setStageScale = () => {
|
|
33
|
-
if (this.isConnected && !this.rendering) {
|
|
34
|
-
const canvasElement = this.canvasRef.value;
|
|
35
|
-
const stageElement = this.stageRef.value;
|
|
36
|
-
if (stageElement && canvasElement) {
|
|
37
|
-
const stageWidth = stageElement.clientWidth;
|
|
38
|
-
const stageHeight = stageElement.clientHeight;
|
|
39
|
-
const canvasWidth = canvasElement.clientWidth;
|
|
40
|
-
const canvasHeight = canvasElement.clientHeight;
|
|
41
|
-
const stageRatio = stageWidth / stageHeight;
|
|
42
|
-
const canvasRatio = canvasWidth / canvasHeight;
|
|
43
|
-
if (stageRatio > canvasRatio) {
|
|
44
|
-
const scale = stageHeight / canvasHeight;
|
|
45
|
-
if (this.stageScale !== scale) {
|
|
46
|
-
canvasElement.style.transform = `scale(${scale})`;
|
|
47
|
-
}
|
|
48
|
-
this.stageScale = scale;
|
|
49
|
-
} else {
|
|
50
|
-
const scale = stageWidth / canvasWidth;
|
|
51
|
-
if (this.stageScale !== scale) {
|
|
52
|
-
canvasElement.style.transform = `scale(${scale})`;
|
|
53
|
-
}
|
|
54
|
-
this.stageScale = scale;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (this.isConnected) {
|
|
59
|
-
requestAnimationFrame(this.setStageScale);
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
this.focusContext = this;
|
|
63
|
-
this.fetch = (path, init = {}) => {
|
|
64
|
-
init.headers ||= {};
|
|
65
|
-
Object.assign(init.headers, {
|
|
66
|
-
"Content-Type": "application/json"
|
|
67
|
-
});
|
|
68
|
-
const bearerToken = this.apiToken;
|
|
69
|
-
if (bearerToken) {
|
|
70
|
-
Object.assign(init.headers, {
|
|
71
|
-
Authorization: `Bearer ${bearerToken}`
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
return fetch(path, init);
|
|
75
|
-
};
|
|
76
|
-
this.apiHost = "";
|
|
77
|
-
this.rendering = false;
|
|
78
22
|
this.focusOverlay = createRef();
|
|
79
23
|
this.drawOverlays = () => {
|
|
80
24
|
const focusOverlay = this.focusOverlay.value;
|
|
@@ -96,10 +40,6 @@ let EFWorkbench = class extends TWMixin(LitElement) {
|
|
|
96
40
|
}
|
|
97
41
|
};
|
|
98
42
|
}
|
|
99
|
-
connectedCallback() {
|
|
100
|
-
super.connectedCallback();
|
|
101
|
-
requestAnimationFrame(this.setStageScale);
|
|
102
|
-
}
|
|
103
43
|
disconnectedCallback() {
|
|
104
44
|
super.disconnectedCallback();
|
|
105
45
|
}
|
|
@@ -161,7 +101,7 @@ let EFWorkbench = class extends TWMixin(LitElement) {
|
|
|
161
101
|
await Promise.all(busyTasks.map((task) => task.taskComplete));
|
|
162
102
|
for (let i = 0; i < frameCount; i++) {
|
|
163
103
|
firstGroup.currentTimeMs = i * stepDurationMs;
|
|
164
|
-
await
|
|
104
|
+
await new Promise(queueMicrotask);
|
|
165
105
|
const busyTasks2 = temporals.filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE).map((temporal) => temporal.frameTask);
|
|
166
106
|
await Promise.all(busyTasks2.map((task) => task.taskComplete));
|
|
167
107
|
await new Promise((resolve) => requestAnimationFrame(resolve));
|
|
@@ -177,39 +117,12 @@ EFWorkbench.styles = [
|
|
|
177
117
|
}
|
|
178
118
|
`
|
|
179
119
|
];
|
|
180
|
-
__decorateClass([
|
|
181
|
-
state()
|
|
182
|
-
], EFWorkbench.prototype, "stageScale", 2);
|
|
183
120
|
__decorateClass([
|
|
184
121
|
eventOptions({ passive: false, capture: true })
|
|
185
122
|
], EFWorkbench.prototype, "handleStageWheel", 1);
|
|
186
|
-
__decorateClass([
|
|
187
|
-
provide({ context: focusContext })
|
|
188
|
-
], EFWorkbench.prototype, "focusContext", 2);
|
|
189
|
-
__decorateClass([
|
|
190
|
-
provide({ context: focusedElement }),
|
|
191
|
-
state()
|
|
192
|
-
], EFWorkbench.prototype, "focusedElement", 2);
|
|
193
|
-
__decorateClass([
|
|
194
|
-
provide({ context: fetchContext })
|
|
195
|
-
], EFWorkbench.prototype, "fetch", 2);
|
|
196
|
-
__decorateClass([
|
|
197
|
-
property({ type: String })
|
|
198
|
-
], EFWorkbench.prototype, "apiToken", 2);
|
|
199
|
-
__decorateClass([
|
|
200
|
-
provide({ context: apiHostContext }),
|
|
201
|
-
property({ type: String })
|
|
202
|
-
], EFWorkbench.prototype, "apiHost", 2);
|
|
203
|
-
__decorateClass([
|
|
204
|
-
property({ type: Boolean })
|
|
205
|
-
], EFWorkbench.prototype, "rendering", 2);
|
|
206
123
|
EFWorkbench = __decorateClass([
|
|
207
124
|
customElement("ef-workbench")
|
|
208
125
|
], EFWorkbench);
|
|
209
126
|
export {
|
|
210
|
-
EFWorkbench
|
|
211
|
-
apiHostContext,
|
|
212
|
-
fetchContext,
|
|
213
|
-
focusContext,
|
|
214
|
-
focusedElement
|
|
127
|
+
EFWorkbench
|
|
215
128
|
};
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import twStyle from "./TWMixin.css.js";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
let twSheet = null;
|
|
3
|
+
if (typeof window !== "undefined") {
|
|
4
|
+
twSheet = new CSSStyleSheet();
|
|
5
|
+
twSheet.replaceSync(twStyle);
|
|
6
|
+
}
|
|
4
7
|
function TWMixin(Base) {
|
|
5
8
|
class TWElement extends Base {
|
|
6
9
|
createRenderRoot() {
|
|
@@ -10,6 +13,11 @@ function TWMixin(Base) {
|
|
|
10
13
|
"TWMixin can only be applied to elements with shadow roots"
|
|
11
14
|
);
|
|
12
15
|
}
|
|
16
|
+
if (!twSheet) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
"twSheet not found. Probable cause: CSSStyleSheet not supported in this environment"
|
|
19
|
+
);
|
|
20
|
+
}
|
|
13
21
|
if (renderRoot?.adoptedStyleSheets) {
|
|
14
22
|
renderRoot.adoptedStyleSheets = [
|
|
15
23
|
twSheet,
|
|
@@ -7,15 +7,19 @@ import { EFVideo } from "./elements/EFVideo.js";
|
|
|
7
7
|
import { EFCaptions, EFCaptionsActiveWord } from "./elements/EFCaptions.js";
|
|
8
8
|
import { EFWaveform } from "./elements/EFWaveform.js";
|
|
9
9
|
import { EFWorkbench } from "./gui/EFWorkbench.js";
|
|
10
|
+
import { EFPreview } from "./gui/EFPreview.js";
|
|
10
11
|
import { EFFilmstrip } from "./gui/EFFilmstrip.js";
|
|
11
12
|
import "./EF_FRAMEGEN.js";
|
|
12
|
-
window
|
|
13
|
+
if (typeof window !== "undefined") {
|
|
14
|
+
window.EF_REGISTERED = true;
|
|
15
|
+
}
|
|
13
16
|
export {
|
|
14
17
|
EFAudio,
|
|
15
18
|
EFCaptions,
|
|
16
19
|
EFCaptionsActiveWord,
|
|
17
20
|
EFFilmstrip,
|
|
18
21
|
EFImage,
|
|
22
|
+
EFPreview,
|
|
19
23
|
EFTimegroup,
|
|
20
24
|
EFVideo,
|
|
21
25
|
EFWaveform,
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import { FocusContext } from './focusContext.ts';
|
|
3
|
+
import { createRef } from 'lit/directives/ref.js';
|
|
4
|
+
import { EFTimegroup } from '../elements/EFTimegroup.ts';
|
|
5
|
+
|
|
6
|
+
declare class ContextMixinInterface {
|
|
7
|
+
focusContext: FocusContext;
|
|
8
|
+
focusedElement?: HTMLElement;
|
|
9
|
+
fetch: typeof fetch;
|
|
10
|
+
signingURL?: string;
|
|
11
|
+
apiToken?: string;
|
|
12
|
+
apiHost: string;
|
|
13
|
+
stageScale: number;
|
|
14
|
+
rendering: boolean;
|
|
15
|
+
stageRef: ReturnType<typeof createRef<HTMLDivElement>>;
|
|
16
|
+
canvasRef: ReturnType<typeof createRef<HTMLElement>>;
|
|
17
|
+
playing: boolean;
|
|
18
|
+
targetTimegroup?: EFTimegroup;
|
|
19
|
+
currentTimeMs: number;
|
|
20
|
+
}
|
|
21
|
+
type Constructor<T = {}> = new (...args: any[]) => T;
|
|
22
|
+
export declare function ContextMixin<T extends Constructor<LitElement>>(superClass: T): Constructor<ContextMixinInterface> & T;
|
|
23
|
+
export {};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { EFTimegroup } from '../elements/EFTimegroup';
|
|
2
1
|
import { LitElement, nothing, TemplateResult, ReactiveController, PropertyValueMap } from 'lit';
|
|
3
|
-
import { EFImage } from '../elements/EFImage';
|
|
4
|
-
import { EFAudio } from '../elements/EFAudio';
|
|
5
|
-
import { EFVideo } from '../elements/EFVideo';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
2
|
+
import { EFImage } from '../elements/EFImage.ts';
|
|
3
|
+
import { EFAudio } from '../elements/EFAudio.ts';
|
|
4
|
+
import { EFVideo } from '../elements/EFVideo.ts';
|
|
5
|
+
import { EFTimegroup } from '../elements/EFTimegroup.ts';
|
|
6
|
+
import { TemporalMixinInterface } from '../elements/EFTemporal.ts';
|
|
7
|
+
import { TimegroupController } from '../elements/TimegroupController.ts';
|
|
8
|
+
import { FocusContext } from './focusContext.ts';
|
|
9
9
|
|
|
10
10
|
declare class ElementFilmstripController implements ReactiveController {
|
|
11
11
|
private host;
|
|
@@ -101,26 +101,23 @@ declare const EFFilmstrip_base: typeof LitElement;
|
|
|
101
101
|
export declare class EFFilmstrip extends EFFilmstrip_base {
|
|
102
102
|
#private;
|
|
103
103
|
pixelsPerMs: number;
|
|
104
|
-
currentTimeMs: number;
|
|
105
|
-
targetSelector: string;
|
|
106
104
|
scrubbing: boolean;
|
|
107
|
-
playing: boolean;
|
|
108
105
|
timelineScrolltop: number;
|
|
106
|
+
playing?: boolean;
|
|
109
107
|
timegroupController?: TimegroupController;
|
|
108
|
+
currentTimeMs: number;
|
|
110
109
|
connectedCallback(): void;
|
|
111
110
|
disconnectedCallback(): void;
|
|
112
111
|
syncGutterScroll(): void;
|
|
113
112
|
syncHierarchyScroll(): void;
|
|
114
|
-
advancePlayhead: (tick?: DOMHighResTimeStamp) => void;
|
|
115
113
|
scrub(e: MouseEvent): void;
|
|
116
114
|
startScrub(e: MouseEvent): void;
|
|
117
115
|
scrollScrub(e: WheelEvent): void;
|
|
118
|
-
gutterRef: import('lit-html/directives/ref').Ref<HTMLDivElement>;
|
|
119
|
-
hierarchyRef: import('lit-html/directives/ref').Ref<HTMLDivElement>;
|
|
120
|
-
playheadRef: import('lit-html/directives/ref').Ref<HTMLDivElement>;
|
|
116
|
+
gutterRef: import('lit-html/directives/ref.js').Ref<HTMLDivElement>;
|
|
117
|
+
hierarchyRef: import('lit-html/directives/ref.js').Ref<HTMLDivElement>;
|
|
118
|
+
playheadRef: import('lit-html/directives/ref.js').Ref<HTMLDivElement>;
|
|
121
119
|
get gutter(): HTMLDivElement | undefined;
|
|
122
120
|
render(): TemplateResult<1>;
|
|
123
|
-
update(changedProperties: Map<string | number | symbol, unknown>): void;
|
|
124
121
|
updated(changes: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
|
|
125
122
|
get targetTimegroup(): EFTimegroup | undefined;
|
|
126
123
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
|
|
3
|
+
declare const EFPreview_base: (new (...args: any[]) => {
|
|
4
|
+
focusContext: import('./focusContext.ts').FocusContext;
|
|
5
|
+
focusedElement?: HTMLElement;
|
|
6
|
+
fetch: typeof fetch;
|
|
7
|
+
signingURL?: string;
|
|
8
|
+
apiToken?: string;
|
|
9
|
+
apiHost: string;
|
|
10
|
+
stageScale: number;
|
|
11
|
+
rendering: boolean;
|
|
12
|
+
stageRef: ReturnType<typeof import('lit-html/directives/ref.js').createRef>;
|
|
13
|
+
canvasRef: ReturnType<typeof import('lit-html/directives/ref.js').createRef>;
|
|
14
|
+
playing: boolean;
|
|
15
|
+
targetTimegroup?: import('../index.ts').EFTimegroup;
|
|
16
|
+
currentTimeMs: number;
|
|
17
|
+
}) & typeof LitElement;
|
|
18
|
+
export declare class EFPreview extends EFPreview_base {
|
|
19
|
+
static styles: import('lit').CSSResult[];
|
|
20
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
21
|
+
}
|
|
22
|
+
declare global {
|
|
23
|
+
interface HTMLElementTagNameMap {
|
|
24
|
+
"ef-preview": EFPreview;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export {};
|