@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.
Files changed (121) hide show
  1. package/dist/EF_INTERACTIVE.d.ts +1 -0
  2. package/dist/{lib/av → assets/dist}/EncodedAsset.js +1 -1
  3. package/dist/{packages/elements/src/elements → elements}/EFAudio.d.ts +2 -2
  4. package/dist/{packages/elements/src/elements → elements}/EFCaptions.d.ts +5 -5
  5. package/dist/{packages/elements/src/elements → elements}/EFImage.d.ts +3 -3
  6. package/dist/{packages/elements/src/elements → elements}/EFMedia.d.ts +4 -4
  7. package/dist/{packages/elements/src/elements → elements}/EFTemporal.d.ts +1 -1
  8. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.browsertest.d.ts +1 -1
  9. package/dist/{packages/elements/src/elements → elements}/EFTimegroup.d.ts +3 -3
  10. package/dist/{packages/elements/src/elements → elements}/EFVideo.d.ts +3 -3
  11. package/dist/{packages/elements/src/elements → elements}/EFWaveform.d.ts +3 -3
  12. package/dist/{packages/elements/src/elements → elements}/TimegroupController.d.ts +1 -1
  13. package/dist/{packages/elements → elements}/src/EF_FRAMEGEN.js +4 -3
  14. package/dist/elements/src/EF_INTERACTIVE.js +7 -0
  15. package/dist/{packages/elements → elements}/src/elements/EFCaptions.js +5 -5
  16. package/dist/{packages/elements → elements}/src/elements/EFMedia.js +6 -3
  17. package/dist/{packages/elements → elements}/src/elements/EFSourceMixin.js +1 -1
  18. package/dist/{packages/elements → elements}/src/elements/EFTemporal.js +37 -2
  19. package/dist/{packages/elements → elements}/src/elements/EFTimegroup.js +4 -2
  20. package/dist/{packages/elements → elements}/src/elements/FetchMixin.js +1 -1
  21. package/dist/elements/src/gui/ContextMixin.js +234 -0
  22. package/dist/{packages/elements → elements}/src/gui/EFFilmstrip.js +30 -134
  23. package/dist/elements/src/gui/EFPreview.js +45 -0
  24. package/dist/{packages/elements → elements}/src/gui/EFWorkbench.js +6 -93
  25. package/dist/{packages/elements → elements}/src/gui/TWMixin.js +10 -2
  26. package/dist/elements/src/gui/apiHostContext.js +5 -0
  27. package/dist/elements/src/gui/fetchContext.js +5 -0
  28. package/dist/elements/src/gui/focusContext.js +5 -0
  29. package/dist/elements/src/gui/focusedElementContext.js +7 -0
  30. package/dist/elements/src/gui/playingContext.js +5 -0
  31. package/dist/{packages/elements → elements}/src/index.js +5 -1
  32. package/dist/{packages/elements/src/elements → elements}/util.d.ts +1 -1
  33. package/dist/gui/ContextMixin.d.ts +23 -0
  34. package/dist/{packages/elements/src/gui → gui}/EFFilmstrip.d.ts +12 -15
  35. package/dist/gui/EFPreview.d.ts +27 -0
  36. package/dist/gui/EFWorkbench.d.ts +34 -0
  37. package/dist/gui/apiHostContext.d.ts +3 -0
  38. package/dist/gui/fetchContext.d.ts +3 -0
  39. package/dist/gui/focusContext.d.ts +6 -0
  40. package/dist/gui/focusedElementContext.d.ts +3 -0
  41. package/dist/gui/playingContext.d.ts +3 -0
  42. package/dist/index.d.ts +11 -0
  43. package/dist/msToTimeCode.d.ts +1 -0
  44. package/dist/style.css +9 -0
  45. package/package.json +6 -9
  46. package/src/elements/EFAudio.ts +1 -1
  47. package/src/elements/EFCaptions.ts +9 -9
  48. package/src/elements/EFImage.ts +3 -3
  49. package/src/elements/EFMedia.ts +11 -8
  50. package/src/elements/EFSourceMixin.ts +1 -1
  51. package/src/elements/EFTemporal.ts +42 -5
  52. package/src/elements/EFTimegroup.browsertest.ts +3 -3
  53. package/src/elements/EFTimegroup.ts +9 -6
  54. package/src/elements/EFVideo.ts +2 -2
  55. package/src/elements/EFWaveform.ts +6 -6
  56. package/src/elements/FetchMixin.ts +5 -3
  57. package/src/elements/TimegroupController.ts +1 -1
  58. package/src/elements/durationConverter.ts +1 -1
  59. package/src/elements/util.ts +1 -1
  60. package/src/gui/ContextMixin.ts +254 -0
  61. package/src/gui/EFFilmstrip.ts +41 -150
  62. package/src/gui/EFPreview.ts +39 -0
  63. package/src/gui/EFWorkbench.ts +7 -105
  64. package/src/gui/TWMixin.ts +10 -3
  65. package/src/gui/apiHostContext.ts +3 -0
  66. package/src/gui/fetchContext.ts +5 -0
  67. package/src/gui/focusContext.ts +7 -0
  68. package/src/gui/focusedElementContext.ts +5 -0
  69. package/src/gui/playingContext.ts +3 -0
  70. package/dist/lib/av/EncodedAsset.cjs +0 -577
  71. package/dist/lib/av/MP4File.cjs +0 -187
  72. package/dist/lib/av/msToTimeCode.cjs +0 -15
  73. package/dist/lib/util/awaitMicrotask.cjs +0 -4
  74. package/dist/lib/util/awaitMicrotask.js +0 -4
  75. package/dist/lib/util/memoize.cjs +0 -14
  76. package/dist/packages/elements/src/EF_FRAMEGEN.cjs +0 -197
  77. package/dist/packages/elements/src/EF_INTERACTIVE.cjs +0 -4
  78. package/dist/packages/elements/src/EF_INTERACTIVE.d.ts +0 -1
  79. package/dist/packages/elements/src/EF_INTERACTIVE.js +0 -4
  80. package/dist/packages/elements/src/elements/CrossUpdateController.cjs +0 -16
  81. package/dist/packages/elements/src/elements/EFAudio.cjs +0 -53
  82. package/dist/packages/elements/src/elements/EFCaptions.cjs +0 -164
  83. package/dist/packages/elements/src/elements/EFImage.cjs +0 -79
  84. package/dist/packages/elements/src/elements/EFMedia.cjs +0 -336
  85. package/dist/packages/elements/src/elements/EFSourceMixin.cjs +0 -55
  86. package/dist/packages/elements/src/elements/EFTemporal.cjs +0 -199
  87. package/dist/packages/elements/src/elements/EFTimegroup.cjs +0 -352
  88. package/dist/packages/elements/src/elements/EFVideo.cjs +0 -109
  89. package/dist/packages/elements/src/elements/EFWaveform.cjs +0 -242
  90. package/dist/packages/elements/src/elements/FetchMixin.cjs +0 -28
  91. package/dist/packages/elements/src/elements/TimegroupController.cjs +0 -20
  92. package/dist/packages/elements/src/elements/durationConverter.cjs +0 -8
  93. package/dist/packages/elements/src/elements/parseTimeToMs.cjs +0 -12
  94. package/dist/packages/elements/src/elements/util.cjs +0 -11
  95. package/dist/packages/elements/src/gui/EFFilmstrip.cjs +0 -825
  96. package/dist/packages/elements/src/gui/EFWorkbench.cjs +0 -214
  97. package/dist/packages/elements/src/gui/EFWorkbench.d.ts +0 -45
  98. package/dist/packages/elements/src/gui/TWMixin.cjs +0 -28
  99. package/dist/packages/elements/src/gui/TWMixin.css.cjs +0 -3
  100. package/dist/packages/elements/src/index.cjs +0 -50
  101. package/dist/packages/elements/src/index.d.ts +0 -10
  102. /package/dist/{packages/elements/src/EF_FRAMEGEN.d.ts → EF_FRAMEGEN.d.ts} +0 -0
  103. /package/dist/{lib/av → assets/dist}/MP4File.js +0 -0
  104. /package/dist/{lib/util → assets/dist}/memoize.js +0 -0
  105. /package/dist/{packages/elements/src/elements → elements}/CrossUpdateController.d.ts +0 -0
  106. /package/dist/{packages/elements/src/elements → elements}/EFSourceMixin.d.ts +0 -0
  107. /package/dist/{packages/elements/src/elements → elements}/FetchMixin.d.ts +0 -0
  108. /package/dist/{packages/elements/src/elements → elements}/durationConverter.d.ts +0 -0
  109. /package/dist/{packages/elements/src/elements → elements}/parseTimeToMs.d.ts +0 -0
  110. /package/dist/{packages/elements → elements}/src/elements/CrossUpdateController.js +0 -0
  111. /package/dist/{packages/elements → elements}/src/elements/EFAudio.js +0 -0
  112. /package/dist/{packages/elements → elements}/src/elements/EFImage.js +0 -0
  113. /package/dist/{packages/elements → elements}/src/elements/EFVideo.js +0 -0
  114. /package/dist/{packages/elements → elements}/src/elements/EFWaveform.js +0 -0
  115. /package/dist/{packages/elements → elements}/src/elements/TimegroupController.js +0 -0
  116. /package/dist/{packages/elements → elements}/src/elements/durationConverter.js +0 -0
  117. /package/dist/{packages/elements → elements}/src/elements/parseTimeToMs.js +0 -0
  118. /package/dist/{packages/elements → elements}/src/elements/util.js +0 -0
  119. /package/dist/{packages/elements → elements}/src/gui/TWMixin.css.js +0 -0
  120. /package/dist/{lib/av → elements/src}/msToTimeCode.js +0 -0
  121. /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 "../../../../lib/av/msToTimeCode.js";
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, _lastTick, _playbackAudioContext, _playbackAnimationFrameRequest, _AUDIO_PLAYBACK_SLICE_MS, syncPlayheadToAudioContext_fn, stopPlayback_fn, startPlayback_fn;
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: focusedElement, subscribe: true })
169
+ consume({ context: focusedElementContext, subscribe: true })
169
170
  ], FilmstripItem.prototype, "focusedElement", 2);
170
171
  __decorateClass([
171
- property({ type: HTMLElement, attribute: false })
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: HTMLElement, attribute: false })
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: focusedElement, subscribe: true })
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.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;
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
- __privateSet(this, _lastTick, tick);
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.playing = false;
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.playing = true;
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
- if (this.getAttribute("target")) {
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
- _lastTick = /* @__PURE__ */ new WeakMap();
714
- _playbackAudioContext = /* @__PURE__ */ new WeakMap();
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, "timelineScrolltop", 2);
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 { createContext, provide } from "@lit/context";
2
- import { css, html, LitElement } from "lit";
1
+ import { html, css, LitElement } from "lit";
3
2
  import { TaskStatus } from "@lit/task";
4
- import { state, eventOptions, property, customElement } from "lit/decorators.js";
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
- const focusContext = createContext(Symbol("focusContext"));
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 awaitMicrotask();
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
- const twSheet = new CSSStyleSheet();
3
- twSheet.replaceSync(twStyle);
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,
@@ -0,0 +1,5 @@
1
+ import { createContext } from "@lit/context";
2
+ const apiHostContext = createContext(Symbol("apiHostContext"));
3
+ export {
4
+ apiHostContext
5
+ };
@@ -0,0 +1,5 @@
1
+ import { createContext } from "@lit/context";
2
+ const fetchContext = createContext(Symbol("fetchContext"));
3
+ export {
4
+ fetchContext
5
+ };
@@ -0,0 +1,5 @@
1
+ import { createContext } from "@lit/context";
2
+ const focusContext = createContext(Symbol("focusContext"));
3
+ export {
4
+ focusContext
5
+ };
@@ -0,0 +1,7 @@
1
+ import { createContext } from "@lit/context";
2
+ const focusedElementContext = createContext(
3
+ Symbol("focusedElement")
4
+ );
5
+ export {
6
+ focusedElementContext
7
+ };
@@ -0,0 +1,5 @@
1
+ import { createContext } from "@lit/context";
2
+ const playingContext = createContext(Symbol("playingContext"));
3
+ export {
4
+ playingContext
5
+ };
@@ -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.EF_REGISTERED = true;
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,
@@ -1,4 +1,4 @@
1
- import { EFTimegroup } from './EFTimegroup';
1
+ import { EFTimegroup } from './EFTimegroup.ts';
2
2
 
3
3
  export declare const getRootTimeGroup: (element: Element) => EFTimegroup | null;
4
4
  export declare const getStartTimeMs: (element: Element) => number;
@@ -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 { TemporalMixinInterface } from '../elements/EFTemporal';
7
- import { TimegroupController } from '../elements/TimegroupController';
8
- import { FocusContext } from './EFWorkbench';
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 {};