@editframe/elements 0.21.0-beta.0 → 0.23.7-beta.0

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 (142) hide show
  1. package/dist/EF_FRAMEGEN.js +2 -3
  2. package/dist/attachContextRoot.d.ts +1 -0
  3. package/dist/attachContextRoot.js +9 -0
  4. package/dist/elements/ContextProxiesController.d.ts +1 -2
  5. package/dist/elements/EFAudio.js +2 -2
  6. package/dist/elements/EFCaptions.d.ts +1 -3
  7. package/dist/elements/EFCaptions.js +59 -51
  8. package/dist/elements/EFImage.js +2 -2
  9. package/dist/elements/EFMedia/AssetIdMediaEngine.js +1 -2
  10. package/dist/elements/EFMedia/AssetMediaEngine.js +1 -3
  11. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +1 -1
  12. package/dist/elements/EFMedia/BufferedSeekingInput.js +2 -4
  13. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +4 -7
  14. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +1 -2
  15. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +5 -9
  16. package/dist/elements/EFMedia/shared/BufferUtils.js +1 -3
  17. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +4 -7
  18. package/dist/elements/EFMedia.d.ts +19 -0
  19. package/dist/elements/EFMedia.js +19 -2
  20. package/dist/elements/EFSourceMixin.js +1 -1
  21. package/dist/elements/EFSurface.js +1 -1
  22. package/dist/elements/EFTemporal.browsertest.d.ts +11 -0
  23. package/dist/elements/EFTemporal.d.ts +10 -0
  24. package/dist/elements/EFTemporal.js +82 -5
  25. package/dist/elements/EFThumbnailStrip.js +9 -16
  26. package/dist/elements/EFTimegroup.browsertest.d.ts +3 -3
  27. package/dist/elements/EFTimegroup.d.ts +35 -14
  28. package/dist/elements/EFTimegroup.js +73 -120
  29. package/dist/elements/EFVideo.d.ts +10 -0
  30. package/dist/elements/EFVideo.js +15 -2
  31. package/dist/elements/EFWaveform.js +10 -18
  32. package/dist/elements/SampleBuffer.js +1 -2
  33. package/dist/elements/TargetController.js +2 -2
  34. package/dist/elements/renderTemporalAudio.d.ts +10 -0
  35. package/dist/elements/renderTemporalAudio.js +35 -0
  36. package/dist/elements/updateAnimations.js +7 -10
  37. package/dist/gui/ContextMixin.d.ts +5 -5
  38. package/dist/gui/ContextMixin.js +151 -117
  39. package/dist/gui/Controllable.browsertest.d.ts +0 -0
  40. package/dist/gui/Controllable.d.ts +15 -0
  41. package/dist/gui/Controllable.js +9 -0
  42. package/dist/gui/EFConfiguration.js +1 -1
  43. package/dist/gui/EFControls.browsertest.d.ts +11 -0
  44. package/dist/gui/EFControls.d.ts +18 -4
  45. package/dist/gui/EFControls.js +67 -25
  46. package/dist/gui/EFDial.browsertest.d.ts +0 -0
  47. package/dist/gui/EFDial.d.ts +18 -0
  48. package/dist/gui/EFDial.js +141 -0
  49. package/dist/gui/EFFilmstrip.browsertest.d.ts +11 -0
  50. package/dist/gui/EFFilmstrip.d.ts +12 -2
  51. package/dist/gui/EFFilmstrip.js +140 -34
  52. package/dist/gui/EFFitScale.js +2 -4
  53. package/dist/gui/EFFocusOverlay.js +1 -1
  54. package/dist/gui/EFPause.browsertest.d.ts +0 -0
  55. package/dist/gui/EFPause.d.ts +23 -0
  56. package/dist/gui/EFPause.js +59 -0
  57. package/dist/gui/EFPlay.browsertest.d.ts +0 -0
  58. package/dist/gui/EFPlay.d.ts +23 -0
  59. package/dist/gui/EFPlay.js +59 -0
  60. package/dist/gui/EFPreview.d.ts +4 -0
  61. package/dist/gui/EFPreview.js +15 -6
  62. package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
  63. package/dist/gui/EFResizableBox.d.ts +34 -0
  64. package/dist/gui/EFResizableBox.js +547 -0
  65. package/dist/gui/EFScrubber.d.ts +9 -3
  66. package/dist/gui/EFScrubber.js +7 -7
  67. package/dist/gui/EFTimeDisplay.d.ts +7 -1
  68. package/dist/gui/EFTimeDisplay.js +5 -5
  69. package/dist/gui/EFToggleLoop.d.ts +9 -3
  70. package/dist/gui/EFToggleLoop.js +6 -4
  71. package/dist/gui/EFTogglePlay.d.ts +12 -4
  72. package/dist/gui/EFTogglePlay.js +24 -19
  73. package/dist/gui/EFWorkbench.js +1 -1
  74. package/dist/gui/PlaybackController.d.ts +67 -0
  75. package/dist/gui/PlaybackController.js +310 -0
  76. package/dist/gui/TWMixin.js +1 -1
  77. package/dist/gui/TargetOrContextMixin.d.ts +10 -0
  78. package/dist/gui/TargetOrContextMixin.js +98 -0
  79. package/dist/gui/efContext.d.ts +2 -2
  80. package/dist/index.d.ts +4 -0
  81. package/dist/index.js +5 -1
  82. package/dist/otel/setupBrowserTracing.d.ts +1 -1
  83. package/dist/otel/setupBrowserTracing.js +6 -4
  84. package/dist/otel/tracingHelpers.js +1 -2
  85. package/dist/style.css +1 -1
  86. package/package.json +5 -5
  87. package/src/elements/ContextProxiesController.ts +10 -10
  88. package/src/elements/EFAudio.ts +1 -0
  89. package/src/elements/EFCaptions.browsertest.ts +128 -58
  90. package/src/elements/EFCaptions.ts +60 -34
  91. package/src/elements/EFImage.browsertest.ts +1 -2
  92. package/src/elements/EFMedia/JitMediaEngine.browsertest.ts +3 -0
  93. package/src/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.ts +1 -1
  94. package/src/elements/EFMedia.browsertest.ts +8 -15
  95. package/src/elements/EFMedia.ts +38 -7
  96. package/src/elements/EFSurface.browsertest.ts +2 -6
  97. package/src/elements/EFSurface.ts +1 -0
  98. package/src/elements/EFTemporal.browsertest.ts +58 -1
  99. package/src/elements/EFTemporal.ts +140 -4
  100. package/src/elements/EFThumbnailStrip.browsertest.ts +2 -8
  101. package/src/elements/EFThumbnailStrip.ts +1 -0
  102. package/src/elements/EFTimegroup.browsertest.ts +6 -7
  103. package/src/elements/EFTimegroup.ts +163 -244
  104. package/src/elements/EFVideo.browsertest.ts +143 -47
  105. package/src/elements/EFVideo.ts +26 -0
  106. package/src/elements/FetchContext.browsertest.ts +7 -2
  107. package/src/elements/TargetController.browsertest.ts +1 -0
  108. package/src/elements/TargetController.ts +1 -0
  109. package/src/elements/renderTemporalAudio.ts +108 -0
  110. package/src/elements/updateAnimations.browsertest.ts +181 -6
  111. package/src/elements/updateAnimations.ts +6 -6
  112. package/src/gui/ContextMixin.browsertest.ts +274 -27
  113. package/src/gui/ContextMixin.ts +230 -175
  114. package/src/gui/Controllable.browsertest.ts +258 -0
  115. package/src/gui/Controllable.ts +41 -0
  116. package/src/gui/EFControls.browsertest.ts +294 -80
  117. package/src/gui/EFControls.ts +139 -28
  118. package/src/gui/EFDial.browsertest.ts +84 -0
  119. package/src/gui/EFDial.ts +172 -0
  120. package/src/gui/EFFilmstrip.browsertest.ts +712 -0
  121. package/src/gui/EFFilmstrip.ts +213 -23
  122. package/src/gui/EFPause.browsertest.ts +202 -0
  123. package/src/gui/EFPause.ts +73 -0
  124. package/src/gui/EFPlay.browsertest.ts +202 -0
  125. package/src/gui/EFPlay.ts +73 -0
  126. package/src/gui/EFPreview.ts +20 -5
  127. package/src/gui/EFResizableBox.browsertest.ts +79 -0
  128. package/src/gui/EFResizableBox.ts +898 -0
  129. package/src/gui/EFScrubber.ts +7 -5
  130. package/src/gui/EFTimeDisplay.browsertest.ts +19 -19
  131. package/src/gui/EFTimeDisplay.ts +3 -1
  132. package/src/gui/EFToggleLoop.ts +6 -5
  133. package/src/gui/EFTogglePlay.ts +30 -23
  134. package/src/gui/PlaybackController.ts +522 -0
  135. package/src/gui/TWMixin.css +3 -0
  136. package/src/gui/TargetOrContextMixin.ts +185 -0
  137. package/src/gui/efContext.ts +2 -2
  138. package/src/otel/setupBrowserTracing.ts +17 -12
  139. package/test/cache-integration-verification.browsertest.ts +1 -1
  140. package/types.json +1 -1
  141. package/dist/elements/ContextProxiesController.js +0 -49
  142. /package/dist/_virtual/{_@oxc-project_runtime@0.93.0 → _@oxc-project_runtime@0.94.0}/helpers/decorate.js +0 -0
@@ -1,12 +1,14 @@
1
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.93.0/helpers/decorate.js";
1
+ import { loopContext, playingContext } from "./playingContext.js";
2
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
3
+ import { isEFTemporal } from "../elements/EFTemporal.js";
2
4
  import { focusContext } from "./focusContext.js";
3
5
  import { focusedElementContext } from "./focusedElementContext.js";
4
- import { loopContext, playingContext } from "./playingContext.js";
5
- import { targetTimegroupContext } from "./ContextMixin.js";
6
+ import { targetTemporalContext } from "./ContextMixin.js";
7
+ import { TWMixin } from "./TWMixin2.js";
8
+ import { TargetController } from "../elements/TargetController.js";
6
9
  import { TimegroupController } from "../elements/TimegroupController.js";
7
10
  import { EFTimegroup } from "../elements/EFTimegroup.js";
8
11
  import { EFImage } from "../elements/EFImage.js";
9
- import { TWMixin } from "./TWMixin2.js";
10
12
  import { EFAudio } from "../elements/EFAudio.js";
11
13
  import { EFVideo } from "../elements/EFVideo.js";
12
14
  import { EFCaptions, EFCaptionsActiveWord } from "../elements/EFCaptions.js";
@@ -92,7 +94,7 @@ var FilmstripItem = class extends TWMixin(LitElement) {
92
94
  </div>`;
93
95
  }
94
96
  renderChildren() {
95
- return renderFilmstripChildren(Array.from(this.element.children), this.pixelsPerMs);
97
+ return renderFilmstripChildren(Array.from(this.element.children), this.pixelsPerMs, this.hideSelectors, this.showSelectors);
96
98
  }
97
99
  contents() {
98
100
  return html``;
@@ -147,6 +149,14 @@ __decorate([property({
147
149
  attribute: false
148
150
  })], FilmstripItem.prototype, "element", void 0);
149
151
  __decorate([property({ type: Number })], FilmstripItem.prototype, "pixelsPerMs", void 0);
152
+ __decorate([property({
153
+ type: Array,
154
+ attribute: false
155
+ })], FilmstripItem.prototype, "hideSelectors", void 0);
156
+ __decorate([property({
157
+ type: Array,
158
+ attribute: false
159
+ })], FilmstripItem.prototype, "showSelectors", void 0);
150
160
  var EFAudioFilmstrip = class EFAudioFilmstrip$1 extends FilmstripItem {
151
161
  contents() {
152
162
  return html``;
@@ -188,7 +198,7 @@ var EFCaptionsFilmstrip = class EFCaptionsFilmstrip$1 extends FilmstripItem {
188
198
  if (!captionsData) return html``;
189
199
  const captions = this.element;
190
200
  const captionsLocalTimeSec = ((captions.rootTimegroup?.currentTimeMs || 0) - captions.startTimeMs) / 1e3;
191
- const segmentElements = captionsData.segments.map((segment) => {
201
+ return html`${captionsData.segments.map((segment) => {
192
202
  const isActive = captionsLocalTimeSec >= segment.start && captionsLocalTimeSec < segment.end;
193
203
  return html`<div
194
204
  class="absolute border border-slate-600 text-xs overflow-hidden flex items-center ${isActive ? "bg-green-200 border-green-500 font-bold z-[5]" : "bg-slate-100"}"
@@ -202,11 +212,10 @@ var EFCaptionsFilmstrip = class EFCaptionsFilmstrip$1 extends FilmstripItem {
202
212
  >
203
213
  <span class="px-0.5 text-[8px] ${isActive ? "font-bold" : ""}">${segment.text}</span>
204
214
  </div>`;
205
- });
206
- return html`${segmentElements}`;
215
+ })}`;
207
216
  }
208
217
  renderChildren() {
209
- return super.renderChildren();
218
+ return renderFilmstripChildren(Array.from(this.element.children), this.pixelsPerMs, this.hideSelectors, this.showSelectors);
210
219
  }
211
220
  };
212
221
  EFCaptionsFilmstrip = __decorate([customElement("ef-captions-filmstrip")], EFCaptionsFilmstrip);
@@ -311,9 +320,8 @@ var EFCaptionsBeforeWordFilmstrip = class EFCaptionsBeforeWordFilmstrip$1 extend
311
320
  return html`<div style=${styleMap(this.captionsTrackStyles)}>
312
321
  <div class="bg-slate-300 relative border border-slate-500 h-[1.1rem] mb-[1px] w-full">
313
322
  ${captionsData.word_segments.map((word) => {
314
- const isCurrentlyActive = captionsLocalTimeSec >= word.start && captionsLocalTimeSec < word.end;
315
323
  return html`<div
316
- class="absolute border text-xs overflow-visible flex items-center ${isCurrentlyActive ? "bg-yellow-200 border-yellow-500 font-bold z-[5]" : "bg-purple-50 border-purple-200"}"
324
+ class="absolute border text-xs overflow-visible flex items-center ${captionsLocalTimeSec >= word.start && captionsLocalTimeSec < word.end ? "bg-yellow-200 border-yellow-500 font-bold z-[5]" : "bg-purple-50 border-purple-200"}"
317
325
  style=${styleMap({
318
326
  left: `${this.pixelsPerMs * word.start * 1e3}px`,
319
327
  width: `${this.pixelsPerMs * (word.end - word.start) * 1e3}px`,
@@ -351,9 +359,8 @@ var EFCaptionsAfterWordFilmstrip = class EFCaptionsAfterWordFilmstrip$1 extends
351
359
  return html`<div style=${styleMap(this.captionsTrackStyles)}>
352
360
  <div class="bg-slate-300 relative border border-slate-500 h-[1.1rem] mb-[1px] w-full">
353
361
  ${captionsData.word_segments.map((word) => {
354
- const isCurrentlyActive = captionsLocalTimeSec >= word.start && captionsLocalTimeSec < word.end;
355
362
  return html`<div
356
- class="absolute border text-xs overflow-visible flex items-center ${isCurrentlyActive ? "bg-yellow-200 border-yellow-500 font-bold z-[5]" : "bg-purple-50 border-purple-200"}"
363
+ class="absolute border text-xs overflow-visible flex items-center ${captionsLocalTimeSec >= word.start && captionsLocalTimeSec < word.end ? "bg-yellow-200 border-yellow-500 font-bold z-[5]" : "bg-purple-50 border-purple-200"}"
357
364
  style=${styleMap({
358
365
  left: `${this.pixelsPerMs * word.start * 1e3}px`,
359
366
  width: `${this.pixelsPerMs * (word.end - word.start) * 1e3}px`,
@@ -389,7 +396,7 @@ var EFTimegroupFilmstrip = class EFTimegroupFilmstrip$1 extends FilmstripItem {
389
396
  contents() {
390
397
  return html`
391
398
  <span>TIME GROUP</span>
392
- ${renderFilmstripChildren(Array.from(this.element.children || []), this.pixelsPerMs)}
399
+ ${renderFilmstripChildren(Array.from(this.element.children || []), this.pixelsPerMs, this.hideSelectors, this.showSelectors)}
393
400
  </div>
394
401
  `;
395
402
  }
@@ -399,7 +406,7 @@ var EFHTMLFilmstrip = class EFHTMLFilmstrip$1 extends FilmstripItem {
399
406
  contents() {
400
407
  return html`
401
408
  <span>${this.element.tagName}</span>
402
- ${renderFilmstripChildren(Array.from(this.element.children || []), this.pixelsPerMs)}
409
+ ${renderFilmstripChildren(Array.from(this.element.children || []), this.pixelsPerMs, this.hideSelectors, this.showSelectors)}
403
410
  `;
404
411
  }
405
412
  };
@@ -443,7 +450,7 @@ var EFHierarchyItem = class EFHierarchyItem$1 extends TWMixin(LitElement) {
443
450
  </div>`;
444
451
  }
445
452
  renderChildren() {
446
- return renderHierarchyChildren(Array.from(this.element.children));
453
+ return renderHierarchyChildren(Array.from(this.element.children), this.hideSelectors, this.showSelectors);
447
454
  }
448
455
  };
449
456
  __decorate([property({
@@ -455,6 +462,14 @@ __decorate([consume({
455
462
  context: focusedElementContext,
456
463
  subscribe: true
457
464
  })], EFHierarchyItem.prototype, "focusedElement", void 0);
465
+ __decorate([property({
466
+ type: Array,
467
+ attribute: false
468
+ })], EFHierarchyItem.prototype, "hideSelectors", void 0);
469
+ __decorate([property({
470
+ type: Array,
471
+ attribute: false
472
+ })], EFHierarchyItem.prototype, "showSelectors", void 0);
458
473
  EFHierarchyItem = __decorate([customElement("ef-hierarchy-item")], EFHierarchyItem);
459
474
  var EFTimegroupHierarchyItem = class EFTimegroupHierarchyItem$1 extends EFHierarchyItem {
460
475
  get icon() {
@@ -519,82 +534,138 @@ var EFHTMLHierarchyItem = class EFHTMLHierarchyItem$1 extends EFHierarchyItem {
519
534
  }
520
535
  };
521
536
  EFHTMLHierarchyItem = __decorate([customElement("ef-html-hierarchy-item")], EFHTMLHierarchyItem);
522
- var renderHierarchyChildren = (children) => {
537
+ var shouldRenderElement = (element, hideSelectors, showSelectors) => {
538
+ if (element instanceof HTMLElement && element.dataset?.efHidden) return false;
539
+ if (showSelectors && showSelectors.length > 0) return showSelectors.some((selector) => {
540
+ try {
541
+ return element.matches(selector);
542
+ } catch {
543
+ return false;
544
+ }
545
+ });
546
+ if (hideSelectors && hideSelectors.length > 0) return !hideSelectors.some((selector) => {
547
+ try {
548
+ return element.matches(selector);
549
+ } catch {
550
+ return false;
551
+ }
552
+ });
553
+ return true;
554
+ };
555
+ var renderHierarchyChildren = (children, hideSelectors, showSelectors, skipRootFiltering = false) => {
523
556
  return children.map((child) => {
524
- if (child instanceof HTMLElement && child.dataset?.efHidden) return nothing;
557
+ if (!skipRootFiltering && !shouldRenderElement(child, hideSelectors, showSelectors)) return nothing;
525
558
  if (child instanceof EFTimegroup) return html`<ef-timegroup-hierarchy-item
526
559
  .element=${child}
560
+ .hideSelectors=${hideSelectors}
561
+ .showSelectors=${showSelectors}
527
562
  ></ef-timegroup-hierarchy-item>`;
528
563
  if (child instanceof EFImage) return html`<ef-image-hierarchy-item
529
564
  .element=${child}
565
+ .hideSelectors=${hideSelectors}
566
+ .showSelectors=${showSelectors}
530
567
  ></ef-image-hierarchy-item>`;
531
568
  if (child instanceof EFAudio) return html`<ef-audio-hierarchy-item
532
569
  .element=${child}
570
+ .hideSelectors=${hideSelectors}
571
+ .showSelectors=${showSelectors}
533
572
  ></ef-audio-hierarchy-item>`;
534
573
  if (child instanceof EFVideo) return html`<ef-video-hierarchy-item
535
574
  .element=${child}
575
+ .hideSelectors=${hideSelectors}
576
+ .showSelectors=${showSelectors}
536
577
  ></ef-video-hierarchy-item>`;
537
578
  if (child instanceof EFCaptions) return html`<ef-captions-hierarchy-item
538
579
  .element=${child}
580
+ .hideSelectors=${hideSelectors}
581
+ .showSelectors=${showSelectors}
539
582
  ></ef-captions-hierarchy-item>`;
540
583
  if (child instanceof EFCaptionsActiveWord) return html`<ef-captions-active-word-hierarchy-item
541
584
  .element=${child}
585
+ .hideSelectors=${hideSelectors}
586
+ .showSelectors=${showSelectors}
542
587
  ></ef-captions-active-word-hierarchy-item>`;
543
588
  if (child instanceof EFWaveform) return html`<ef-waveform-hierarchy-item
544
589
  .element=${child}
590
+ .hideSelectors=${hideSelectors}
591
+ .showSelectors=${showSelectors}
545
592
  ></ef-waveform-hierarchy-item>`;
546
593
  return html`<ef-html-hierarchy-item
547
594
  .element=${child}
595
+ .hideSelectors=${hideSelectors}
596
+ .showSelectors=${showSelectors}
548
597
  ></ef-html-hierarchy-item>`;
549
598
  });
550
599
  };
551
- var renderFilmstripChildren = (children, pixelsPerMs) => {
600
+ var renderFilmstripChildren = (children, pixelsPerMs, hideSelectors, showSelectors, skipRootFiltering = false) => {
552
601
  return children.map((child) => {
553
- if (child instanceof HTMLElement && child.dataset?.efHidden) return nothing;
602
+ if (!skipRootFiltering && !shouldRenderElement(child, hideSelectors, showSelectors)) return nothing;
554
603
  if (child instanceof EFTimegroup) return html`<ef-timegroup-filmstrip
555
604
  .element=${child}
556
605
  .pixelsPerMs=${pixelsPerMs}
606
+ .hideSelectors=${hideSelectors}
607
+ .showSelectors=${showSelectors}
557
608
  >
558
609
  </ef-timegroup-filmstrip>`;
559
610
  if (child instanceof EFImage) return html`<ef-image-filmstrip
560
611
  .element=${child}
561
612
  .pixelsPerMs=${pixelsPerMs}
613
+ .hideSelectors=${hideSelectors}
614
+ .showSelectors=${showSelectors}
562
615
  ></ef-image-filmstrip>`;
563
616
  if (child instanceof EFAudio) return html`<ef-audio-filmstrip
564
617
  .element=${child}
565
618
  .pixelsPerMs=${pixelsPerMs}
619
+ .hideSelectors=${hideSelectors}
620
+ .showSelectors=${showSelectors}
566
621
  ></ef-audio-filmstrip>`;
567
622
  if (child instanceof EFVideo) return html`<ef-video-filmstrip
568
623
  .element=${child}
569
624
  .pixelsPerMs=${pixelsPerMs}
625
+ .hideSelectors=${hideSelectors}
626
+ .showSelectors=${showSelectors}
570
627
  ></ef-video-filmstrip>`;
571
628
  if (child instanceof EFCaptions) return html`<ef-captions-filmstrip
572
629
  .element=${child}
573
630
  .pixelsPerMs=${pixelsPerMs}
631
+ .hideSelectors=${hideSelectors}
632
+ .showSelectors=${showSelectors}
574
633
  ></ef-captions-filmstrip>`;
575
634
  if (child instanceof EFCaptionsActiveWord) return html`<ef-captions-active-word-filmstrip
576
635
  .element=${child}
577
636
  .pixelsPerMs=${pixelsPerMs}
637
+ .hideSelectors=${hideSelectors}
638
+ .showSelectors=${showSelectors}
578
639
  ></ef-captions-active-word-filmstrip>`;
579
640
  if (child.tagName === "EF-CAPTIONS-SEGMENT") return html`<ef-captions-segment-filmstrip
580
641
  .element=${child}
581
642
  .pixelsPerMs=${pixelsPerMs}
643
+ .hideSelectors=${hideSelectors}
644
+ .showSelectors=${showSelectors}
582
645
  ></ef-captions-segment-filmstrip>`;
583
646
  if (child.tagName === "EF-CAPTIONS-BEFORE-ACTIVE-WORD") return html`<ef-captions-before-word-filmstrip
584
647
  .element=${child}
585
648
  .pixelsPerMs=${pixelsPerMs}
649
+ .hideSelectors=${hideSelectors}
650
+ .showSelectors=${showSelectors}
586
651
  ></ef-captions-before-word-filmstrip>`;
587
652
  if (child.tagName === "EF-CAPTIONS-AFTER-ACTIVE-WORD") return html`<ef-captions-after-word-filmstrip
588
653
  .element=${child}
589
654
  .pixelsPerMs=${pixelsPerMs}
655
+ .hideSelectors=${hideSelectors}
656
+ .showSelectors=${showSelectors}
590
657
  ></ef-captions-after-word-filmstrip>`;
591
658
  if (child instanceof EFWaveform) return html`<ef-waveform-filmstrip
592
659
  .element=${child}
593
660
  .pixelsPerMs=${pixelsPerMs}
661
+ .hideSelectors=${hideSelectors}
662
+ .showSelectors=${showSelectors}
594
663
  ></ef-waveform-filmstrip>`;
595
664
  return html`<ef-html-filmstrip
596
665
  .element=${child}
597
666
  .pixelsPerMs=${pixelsPerMs}
667
+ .hideSelectors=${hideSelectors}
668
+ .showSelectors=${showSelectors}
598
669
  ></ef-html-filmstrip>`;
599
670
  });
600
671
  };
@@ -602,6 +673,8 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
602
673
  constructor(..._args3) {
603
674
  super(..._args3);
604
675
  this.pixelsPerMs = .04;
676
+ this.hide = "";
677
+ this.show = "";
605
678
  this.scrubbing = false;
606
679
  this.timelineScrolltop = 0;
607
680
  this.currentTimeMs = 0;
@@ -612,6 +685,8 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
612
685
  this.gutterRef = createRef();
613
686
  this.hierarchyRef = createRef();
614
687
  this.playheadRef = createRef();
688
+ this.target = "";
689
+ this.targetElement = null;
615
690
  }
616
691
  static {
617
692
  this.styles = [css`
@@ -623,11 +698,20 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
623
698
  }
624
699
  `];
625
700
  }
701
+ get hideSelectors() {
702
+ if (!this.hide) return void 0;
703
+ return this.hide.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
704
+ }
705
+ get showSelectors() {
706
+ if (!this.show) return void 0;
707
+ return this.show.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
708
+ }
626
709
  connectedCallback() {
627
710
  super.connectedCallback();
628
711
  this.#bindToTargetTimegroup();
629
712
  window.addEventListener("keypress", this.#handleKeyPress);
630
713
  this.resizeObserver.observe(this);
714
+ if (this.target) this.#targetController = new TargetController(this);
631
715
  }
632
716
  disconnectedCallback() {
633
717
  super.disconnectedCallback();
@@ -635,13 +719,13 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
635
719
  this.resizeObserver.disconnect();
636
720
  }
637
721
  updatePixelsPerMs() {
638
- const target = this.targetTimegroup;
722
+ const target = this.targetTemporal;
639
723
  const gutter = this.gutterRef.value;
640
724
  if (target && gutter && gutter.clientWidth > 0) this.pixelsPerMs = gutter.clientWidth / (target.durationMs || 1);
641
725
  }
642
726
  #bindToTargetTimegroup() {
643
727
  if (this.timegroupController) this.timegroupController.remove();
644
- const target = this.targetTimegroup;
728
+ const target = this.targetTemporal;
645
729
  if (target) {
646
730
  this.timegroupController = new TimegroupController(target, this);
647
731
  this.currentTimeMs = target.currentTimeMs;
@@ -686,13 +770,13 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
686
770
  const gutter = this.shadowRoot?.querySelector("#gutter");
687
771
  if (!gutter) return;
688
772
  const rect = gutter.getBoundingClientRect();
689
- if (this.targetTimegroup) {
773
+ if (this.targetTemporal) {
690
774
  const scrubTimeMs = (e.pageX - rect.left + gutter.scrollLeft) / this.pixelsPerMs;
691
- this.targetTimegroup.currentTimeMs = scrubTimeMs;
775
+ this.targetTemporal.currentTimeMs = scrubTimeMs;
692
776
  }
693
777
  }
694
778
  scrollScrub(e) {
695
- if (this.targetTimegroup && this.gutter && !this.playing) {
779
+ if (this.targetTemporal && this.gutter && !this.playing) {
696
780
  if (e.deltaX !== 0) e.preventDefault();
697
781
  if (this.gutterRef.value && this.gutterRef.value.scrollLeft === 0 && e.deltaX < 0) {
698
782
  this.gutter.scrollBy(0, e.deltaY);
@@ -704,7 +788,7 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
704
788
  }
705
789
  if (this) {
706
790
  this.gutter.scrollBy(e.deltaX, e.deltaY);
707
- this.targetTimegroup.currentTimeMs += e.deltaX / this.pixelsPerMs;
791
+ this.targetTemporal.currentTimeMs += e.deltaX / this.pixelsPerMs;
708
792
  }
709
793
  }
710
794
  }
@@ -712,7 +796,7 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
712
796
  return this.gutterRef.value;
713
797
  }
714
798
  render() {
715
- const target = this.targetTimegroup;
799
+ const target = this.targetTemporal;
716
800
  return html` <div
717
801
  class="grid h-full bg-slate-100"
718
802
  style=${styleMap({
@@ -751,7 +835,7 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
751
835
  ${ref(this.hierarchyRef)}
752
836
  @scroll=${this.syncHierarchyScroll}
753
837
  >
754
- ${renderHierarchyChildren(target ? [target] : [])}
838
+ ${renderHierarchyChildren(target ? [target] : [], this.hideSelectors, this.showSelectors, true)}
755
839
  </div>
756
840
  <div
757
841
  class="flex h-full w-full cursor-crosshair overflow-auto bg-slate-200 pt-[8px]"
@@ -775,27 +859,48 @@ var EFFilmstrip = class EFFilmstrip$1 extends TWMixin(LitElement) {
775
859
  ${ref(this.playheadRef)}
776
860
  ></div>
777
861
 
778
- ${renderFilmstripChildren(target ? [target] : [], this.pixelsPerMs)}
862
+ ${renderFilmstripChildren(target ? [target] : [], this.pixelsPerMs, this.hideSelectors, this.showSelectors, true)}
779
863
  </div>
780
864
  </div>
781
865
  </div>`;
782
866
  }
783
867
  updated(changes) {
784
- if (!this.targetTimegroup) return;
868
+ if (!this.targetTemporal) return;
785
869
  if (changes.has("currentTimeMs")) {
786
- if (this.targetTimegroup.currentTimeMs !== this.currentTimeMs) this.targetTimegroup.currentTimeMs = this.currentTimeMs;
870
+ if (this.targetTemporal.currentTimeMs !== this.currentTimeMs) this.targetTemporal.currentTimeMs = this.currentTimeMs;
787
871
  }
788
872
  }
789
873
  get #contextElement() {
790
874
  return this.closest("ef-workbench, ef-preview");
791
875
  }
876
+ #targetController;
877
+ #lastTargetTemporal;
878
+ get targetTemporal() {
879
+ const fromTarget = this.targetElement && isEFTemporal(this.targetElement) ? this.targetElement : null;
880
+ const fromContext = this._contextProvidedTemporal;
881
+ if (fromTarget && fromContext && fromTarget !== fromContext) console.warn("EFFilmstrip: Both target attribute and parent context found. Using target attribute.", {
882
+ target: this.target,
883
+ fromTarget,
884
+ fromContext
885
+ });
886
+ return fromTarget ?? fromContext ?? null;
887
+ }
792
888
  willUpdate(changedProperties) {
793
- if (changedProperties.has("targetTimegroup")) this.#bindToTargetTimegroup();
889
+ if (changedProperties.has("target")) {
890
+ if (this.target && !this.#targetController) this.#targetController = new TargetController(this);
891
+ }
892
+ const currentTargetTemporal = this.targetTemporal;
893
+ if (this.#lastTargetTemporal !== currentTargetTemporal) {
894
+ this.#bindToTargetTimegroup();
895
+ this.#lastTargetTemporal = currentTargetTemporal;
896
+ }
794
897
  if (this.autoScale) this.updatePixelsPerMs();
795
898
  super.willUpdate(changedProperties);
796
899
  }
797
900
  };
798
901
  __decorate([property({ type: Number })], EFFilmstrip.prototype, "pixelsPerMs", void 0);
902
+ __decorate([property({ type: String })], EFFilmstrip.prototype, "hide", void 0);
903
+ __decorate([property({ type: String })], EFFilmstrip.prototype, "show", void 0);
799
904
  __decorate([state()], EFFilmstrip.prototype, "scrubbing", void 0);
800
905
  __decorate([state()], EFFilmstrip.prototype, "timelineScrolltop", void 0);
801
906
  __decorate([consume({
@@ -818,9 +923,10 @@ __decorate([eventOptions({ capture: false })], EFFilmstrip.prototype, "scrub", n
818
923
  __decorate([eventOptions({ capture: false })], EFFilmstrip.prototype, "startScrub", null);
819
924
  __decorate([eventOptions({ passive: false })], EFFilmstrip.prototype, "scrollScrub", null);
820
925
  __decorate([property({ type: String })], EFFilmstrip.prototype, "target", void 0);
926
+ __decorate([state()], EFFilmstrip.prototype, "targetElement", void 0);
821
927
  __decorate([consume({
822
- context: targetTimegroupContext,
928
+ context: targetTemporalContext,
823
929
  subscribe: true
824
- }), state()], EFFilmstrip.prototype, "targetTimegroup", void 0);
930
+ }), state()], EFFilmstrip.prototype, "_contextProvidedTemporal", void 0);
825
931
  EFFilmstrip = __decorate([customElement("ef-filmstrip")], EFFilmstrip);
826
932
  export { EFFilmstrip };
@@ -1,4 +1,4 @@
1
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.93.0/helpers/decorate.js";
1
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
2
2
  import { LitElement } from "lit";
3
3
  import { customElement, state } from "lit/decorators.js";
4
4
  import { createRef } from "lit/directives/ref.js";
@@ -89,10 +89,8 @@ var EFFitScale = class EFFitScale$1 extends LitElement {
89
89
  const containerHeight = this.clientHeight;
90
90
  const contentWidth = this.contentChild.clientWidth;
91
91
  const contentHeight = this.contentChild.clientHeight;
92
- const containerRatio = containerWidth / containerHeight;
93
- const contentRatio = contentWidth / contentHeight;
94
92
  return {
95
- scale: containerRatio > contentRatio ? containerHeight / contentHeight : containerWidth / contentWidth,
93
+ scale: containerWidth / containerHeight > contentWidth / contentHeight ? containerHeight / contentHeight : containerWidth / contentWidth,
96
94
  containerWidth,
97
95
  containerHeight,
98
96
  contentWidth,
@@ -1,4 +1,4 @@
1
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.93.0/helpers/decorate.js";
1
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
2
2
  import { focusedElementContext } from "./focusedElementContext.js";
3
3
  import { consume } from "@lit/context";
4
4
  import { LitElement, css, html } from "lit";
File without changes
@@ -0,0 +1,23 @@
1
+ import { LitElement } from 'lit';
2
+ import { ControllableInterface } from './Controllable.js';
3
+ declare const EFPause_base: (new (...args: any[]) => {
4
+ target: string;
5
+ targetElement: ControllableInterface | null;
6
+ effectiveContext: ControllableInterface | null;
7
+ }) & typeof LitElement;
8
+ export declare class EFPause extends EFPause_base {
9
+ static styles: import('lit').CSSResult[];
10
+ playing: boolean;
11
+ get efContext(): ControllableInterface | null;
12
+ connectedCallback(): void;
13
+ disconnectedCallback(): void;
14
+ updated(changedProperties: Map<string | number | symbol, unknown>): void;
15
+ render(): import('lit-html').TemplateResult<1>;
16
+ handleClick: () => void;
17
+ }
18
+ declare global {
19
+ interface HTMLElementTagNameMap {
20
+ "ef-pause": EFPause;
21
+ }
22
+ }
23
+ export {};
@@ -0,0 +1,59 @@
1
+ import { playingContext } from "./playingContext.js";
2
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
3
+ import { efContext } from "./efContext.js";
4
+ import { attachContextRoot } from "../attachContextRoot.js";
5
+ import { TargetOrContextMixin } from "./TargetOrContextMixin.js";
6
+ import { consume } from "@lit/context";
7
+ import { LitElement, css, html } from "lit";
8
+ import { customElement, state } from "lit/decorators.js";
9
+ attachContextRoot();
10
+ var EFPause = class EFPause$1 extends TargetOrContextMixin(LitElement, efContext) {
11
+ constructor(..._args) {
12
+ super(..._args);
13
+ this.playing = false;
14
+ this.handleClick = () => {
15
+ if (this.efContext) this.efContext.pause();
16
+ };
17
+ }
18
+ static {
19
+ this.styles = [css`
20
+ :host {
21
+ display: block;
22
+ }
23
+ :host([hidden]) {
24
+ display: none;
25
+ }
26
+ div {
27
+ all: inherit;
28
+ }
29
+ `];
30
+ }
31
+ get efContext() {
32
+ return this.effectiveContext;
33
+ }
34
+ connectedCallback() {
35
+ super.connectedCallback();
36
+ this.addEventListener("click", this.handleClick);
37
+ }
38
+ disconnectedCallback() {
39
+ super.disconnectedCallback();
40
+ this.removeEventListener("click", this.handleClick);
41
+ }
42
+ updated(changedProperties) {
43
+ super.updated(changedProperties);
44
+ if (changedProperties.has("playing")) this.style.display = this.playing ? "" : "none";
45
+ }
46
+ render() {
47
+ return html`
48
+ <div>
49
+ <slot></slot>
50
+ </div>
51
+ `;
52
+ }
53
+ };
54
+ __decorate([consume({
55
+ context: playingContext,
56
+ subscribe: true
57
+ }), state()], EFPause.prototype, "playing", void 0);
58
+ EFPause = __decorate([customElement("ef-pause")], EFPause);
59
+ export { EFPause };
File without changes
@@ -0,0 +1,23 @@
1
+ import { LitElement } from 'lit';
2
+ import { ControllableInterface } from './Controllable.js';
3
+ declare const EFPlay_base: (new (...args: any[]) => {
4
+ target: string;
5
+ targetElement: ControllableInterface | null;
6
+ effectiveContext: ControllableInterface | null;
7
+ }) & typeof LitElement;
8
+ export declare class EFPlay extends EFPlay_base {
9
+ static styles: import('lit').CSSResult[];
10
+ playing: boolean;
11
+ get efContext(): ControllableInterface | null;
12
+ connectedCallback(): void;
13
+ disconnectedCallback(): void;
14
+ updated(changedProperties: Map<string | number | symbol, unknown>): void;
15
+ render(): import('lit-html').TemplateResult<1>;
16
+ handleClick: () => void;
17
+ }
18
+ declare global {
19
+ interface HTMLElementTagNameMap {
20
+ "ef-play": EFPlay;
21
+ }
22
+ }
23
+ export {};
@@ -0,0 +1,59 @@
1
+ import { playingContext } from "./playingContext.js";
2
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
3
+ import { efContext } from "./efContext.js";
4
+ import { attachContextRoot } from "../attachContextRoot.js";
5
+ import { TargetOrContextMixin } from "./TargetOrContextMixin.js";
6
+ import { consume } from "@lit/context";
7
+ import { LitElement, css, html } from "lit";
8
+ import { customElement, state } from "lit/decorators.js";
9
+ attachContextRoot();
10
+ var EFPlay = class EFPlay$1 extends TargetOrContextMixin(LitElement, efContext) {
11
+ constructor(..._args) {
12
+ super(..._args);
13
+ this.playing = false;
14
+ this.handleClick = () => {
15
+ if (this.efContext) this.efContext.play();
16
+ };
17
+ }
18
+ static {
19
+ this.styles = [css`
20
+ :host {
21
+ display: block;
22
+ }
23
+ :host([hidden]) {
24
+ display: none;
25
+ }
26
+ div {
27
+ all: inherit;
28
+ }
29
+ `];
30
+ }
31
+ get efContext() {
32
+ return this.effectiveContext;
33
+ }
34
+ connectedCallback() {
35
+ super.connectedCallback();
36
+ this.addEventListener("click", this.handleClick);
37
+ }
38
+ disconnectedCallback() {
39
+ super.disconnectedCallback();
40
+ this.removeEventListener("click", this.handleClick);
41
+ }
42
+ updated(changedProperties) {
43
+ super.updated(changedProperties);
44
+ if (changedProperties.has("playing")) this.style.display = this.playing ? "none" : "";
45
+ }
46
+ render() {
47
+ return html`
48
+ <div>
49
+ <slot></slot>
50
+ </div>
51
+ `;
52
+ }
53
+ };
54
+ __decorate([consume({
55
+ context: playingContext,
56
+ subscribe: true
57
+ }), state()], EFPlay.prototype, "playing", void 0);
58
+ EFPlay = __decorate([customElement("ef-play")], EFPlay);
59
+ export { EFPlay };
@@ -3,6 +3,10 @@ declare const EFPreview_base: (new (...args: any[]) => import('./ContextMixin.js
3
3
  export declare class EFPreview extends EFPreview_base {
4
4
  static styles: import('lit').CSSResult[];
5
5
  focusedElement?: HTMLElement;
6
+ /**
7
+ * Find the closest temporal element (timegroup, video, audio, etc.)
8
+ */
9
+ private findClosestTemporal;
6
10
  constructor();
7
11
  render(): import('lit-html').TemplateResult<1>;
8
12
  }