@editframe/elements 0.7.0-beta.9 → 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 (97) hide show
  1. package/dist/EF_FRAMEGEN.d.ts +44 -0
  2. package/dist/EF_INTERACTIVE.d.ts +1 -0
  3. package/dist/assets/dist/EncodedAsset.js +560 -0
  4. package/dist/assets/dist/MP4File.js +170 -0
  5. package/dist/assets/dist/memoize.js +14 -0
  6. package/dist/elements/CrossUpdateController.d.ts +9 -0
  7. package/dist/elements/EFAudio.d.ts +10 -0
  8. package/dist/elements/EFCaptions.d.ts +38 -0
  9. package/dist/elements/EFImage.d.ts +14 -0
  10. package/dist/elements/EFMedia.d.ts +61 -0
  11. package/dist/elements/EFSourceMixin.d.ts +12 -0
  12. package/dist/elements/EFTemporal.d.ts +38 -0
  13. package/dist/elements/EFTimegroup.browsertest.d.ts +12 -0
  14. package/dist/elements/EFTimegroup.d.ts +39 -0
  15. package/dist/elements/EFVideo.d.ts +14 -0
  16. package/dist/elements/EFWaveform.d.ts +30 -0
  17. package/dist/elements/FetchMixin.d.ts +8 -0
  18. package/dist/elements/TimegroupController.d.ts +14 -0
  19. package/dist/elements/durationConverter.d.ts +4 -0
  20. package/dist/elements/parseTimeToMs.d.ts +1 -0
  21. package/{src/EF_FRAMEGEN.ts → dist/elements/src/EF_FRAMEGEN.js} +35 -115
  22. package/dist/elements/src/EF_INTERACTIVE.js +7 -0
  23. package/dist/elements/src/elements/CrossUpdateController.js +16 -0
  24. package/dist/elements/src/elements/EFAudio.js +54 -0
  25. package/dist/elements/src/elements/EFCaptions.js +166 -0
  26. package/dist/elements/src/elements/EFImage.js +80 -0
  27. package/dist/elements/src/elements/EFMedia.js +339 -0
  28. package/dist/elements/src/elements/EFSourceMixin.js +55 -0
  29. package/dist/elements/src/elements/EFTemporal.js +234 -0
  30. package/dist/elements/src/elements/EFTimegroup.js +355 -0
  31. package/dist/elements/src/elements/EFVideo.js +110 -0
  32. package/dist/elements/src/elements/EFWaveform.js +226 -0
  33. package/dist/elements/src/elements/FetchMixin.js +28 -0
  34. package/dist/elements/src/elements/TimegroupController.js +20 -0
  35. package/dist/elements/src/elements/durationConverter.js +8 -0
  36. package/dist/elements/src/elements/parseTimeToMs.js +12 -0
  37. package/dist/elements/src/elements/util.js +11 -0
  38. package/dist/elements/src/gui/ContextMixin.js +234 -0
  39. package/dist/elements/src/gui/EFFilmstrip.js +729 -0
  40. package/dist/elements/src/gui/EFPreview.js +45 -0
  41. package/dist/elements/src/gui/EFWorkbench.js +128 -0
  42. package/dist/elements/src/gui/TWMixin.css.js +4 -0
  43. package/dist/elements/src/gui/TWMixin.js +36 -0
  44. package/dist/elements/src/gui/apiHostContext.js +5 -0
  45. package/dist/elements/src/gui/fetchContext.js +5 -0
  46. package/dist/elements/src/gui/focusContext.js +5 -0
  47. package/dist/elements/src/gui/focusedElementContext.js +7 -0
  48. package/dist/elements/src/gui/playingContext.js +5 -0
  49. package/dist/elements/src/index.js +27 -0
  50. package/dist/elements/src/msToTimeCode.js +15 -0
  51. package/dist/elements/util.d.ts +4 -0
  52. package/dist/gui/ContextMixin.d.ts +23 -0
  53. package/dist/gui/EFFilmstrip.d.ts +144 -0
  54. package/dist/gui/EFPreview.d.ts +27 -0
  55. package/dist/gui/EFWorkbench.d.ts +34 -0
  56. package/dist/gui/TWMixin.d.ts +3 -0
  57. package/dist/gui/apiHostContext.d.ts +3 -0
  58. package/dist/gui/fetchContext.d.ts +3 -0
  59. package/dist/gui/focusContext.d.ts +6 -0
  60. package/dist/gui/focusedElementContext.d.ts +3 -0
  61. package/dist/gui/playingContext.d.ts +3 -0
  62. package/dist/index.d.ts +11 -0
  63. package/dist/msToTimeCode.d.ts +1 -0
  64. package/dist/style.css +800 -0
  65. package/package.json +6 -9
  66. package/src/elements/EFAudio.ts +1 -1
  67. package/src/elements/EFCaptions.ts +9 -9
  68. package/src/elements/EFImage.ts +3 -3
  69. package/src/elements/EFMedia.ts +11 -8
  70. package/src/elements/EFSourceMixin.ts +1 -1
  71. package/src/elements/EFTemporal.ts +42 -5
  72. package/src/elements/EFTimegroup.browsertest.ts +3 -3
  73. package/src/elements/EFTimegroup.ts +9 -6
  74. package/src/elements/EFVideo.ts +2 -2
  75. package/src/elements/EFWaveform.ts +6 -6
  76. package/src/elements/FetchMixin.ts +5 -3
  77. package/src/elements/TimegroupController.ts +1 -1
  78. package/src/elements/durationConverter.ts +1 -1
  79. package/src/elements/util.ts +1 -1
  80. package/src/gui/ContextMixin.ts +254 -0
  81. package/src/gui/EFFilmstrip.ts +41 -150
  82. package/src/gui/EFPreview.ts +39 -0
  83. package/src/gui/EFWorkbench.ts +7 -105
  84. package/src/gui/TWMixin.ts +10 -3
  85. package/src/gui/apiHostContext.ts +3 -0
  86. package/src/gui/fetchContext.ts +5 -0
  87. package/src/gui/focusContext.ts +7 -0
  88. package/src/gui/focusedElementContext.ts +5 -0
  89. package/src/gui/playingContext.ts +3 -0
  90. package/CHANGELOG.md +0 -7
  91. package/postcss.config.cjs +0 -12
  92. package/src/EF_INTERACTIVE.ts +0 -2
  93. package/src/elements.css +0 -22
  94. package/src/index.ts +0 -33
  95. package/tailwind.config.ts +0 -10
  96. package/tsconfig.json +0 -4
  97. package/vite.config.ts +0 -8
@@ -1,4 +1,3 @@
1
- import { EFTimegroup } from "../elements/EFTimegroup";
2
1
  import {
3
2
  LitElement,
4
3
  html,
@@ -14,19 +13,25 @@ import {
14
13
  eventOptions,
15
14
  state,
16
15
  } from "lit/decorators.js";
16
+ import { consume } from "@lit/context";
17
17
  import { styleMap } from "lit/directives/style-map.js";
18
18
  import { ref, createRef } from "lit/directives/ref.js";
19
- import { EFImage } from "../elements/EFImage";
20
- import { EFAudio } from "../elements/EFAudio";
21
- import { EFVideo } from "../elements/EFVideo";
22
- import { EFCaptions, EFCaptionsActiveWord } from "../elements/EFCaptions";
23
- import { EFWaveform } from "../elements/EFWaveform";
24
- import type { TemporalMixinInterface } from "../elements/EFTemporal";
25
- import { TimegroupController } from "../elements/TimegroupController";
26
- import { consume } from "@lit/context";
27
- import { type FocusContext, focusContext, focusedElement } from "./EFWorkbench";
28
- import { TWMixin } from "./TWMixin";
29
- import { msToTimeCode } from "@/av/msToTimeCode";
19
+
20
+ import { EFImage } from "../elements/EFImage.ts";
21
+ import { EFAudio } from "../elements/EFAudio.ts";
22
+ import { EFVideo } from "../elements/EFVideo.ts";
23
+ import { EFCaptions, EFCaptionsActiveWord } from "../elements/EFCaptions.ts";
24
+ import { EFWaveform } from "../elements/EFWaveform.ts";
25
+ import { EFTimegroup } from "../elements/EFTimegroup.ts";
26
+ import type { TemporalMixinInterface } from "../elements/EFTemporal.ts";
27
+ import { TimegroupController } from "../elements/TimegroupController.ts";
28
+ import { TWMixin } from "./TWMixin.ts";
29
+ import { msToTimeCode } from "../msToTimeCode.ts";
30
+ import { focusedElementContext } from "./focusedElementContext.ts";
31
+ import { type FocusContext, focusContext } from "./focusContext.ts";
32
+ import { playingContext } from "./playingContext.ts";
33
+ import type { EFWorkbench } from "./EFWorkbench.ts";
34
+ import type { EFPreview } from "./EFPreview.ts";
30
35
 
31
36
  class ElementFilmstripController implements ReactiveController {
32
37
  constructor(
@@ -68,14 +73,14 @@ class FilmstripItem extends TWMixin(LitElement) {
68
73
  @consume({ context: focusContext, subscribe: true })
69
74
  focusContext?: FocusContext;
70
75
 
71
- @consume({ context: focusedElement, subscribe: true })
76
+ @consume({ context: focusedElementContext, subscribe: true })
72
77
  focusedElement?: HTMLElement | null;
73
78
 
74
79
  get isFocused() {
75
80
  return this.element && this.focusContext?.focusedElement === this.element;
76
81
  }
77
82
 
78
- @property({ type: HTMLElement, attribute: false })
83
+ @property({ type: Object, attribute: false })
79
84
  element: TemporalMixinInterface & LitElement = new EFTimegroup();
80
85
 
81
86
  @property({ type: Number })
@@ -254,14 +259,14 @@ export class EFHTMLFilmstrip extends FilmstripItem {
254
259
  class EFHierarchyItem<
255
260
  ElementType extends HTMLElement = HTMLElement,
256
261
  > extends TWMixin(LitElement) {
257
- @property({ type: HTMLElement, attribute: false })
262
+ @property({ type: Object, attribute: false })
258
263
  // @ts-expect-error This could be initialzed with any HTMLElement
259
264
  element: ElementType = new EFTimegroup();
260
265
 
261
266
  @consume({ context: focusContext })
262
267
  focusContext?: FocusContext;
263
268
 
264
- @consume({ context: focusedElement, subscribe: true })
269
+ @consume({ context: focusedElementContext, subscribe: true })
265
270
  focusedElement?: HTMLElement | null;
266
271
 
267
272
  get icon(): TemplateResult<1> | string {
@@ -485,23 +490,21 @@ export class EFFilmstrip extends TWMixin(LitElement) {
485
490
  @property({ type: Number })
486
491
  pixelsPerMs = 0.04;
487
492
 
488
- @property({ type: Number })
489
- currentTimeMs = 0;
490
-
491
- @property({ type: String, attribute: "target", reflect: true })
492
- targetSelector = "";
493
-
494
493
  @state()
495
494
  scrubbing = false;
496
495
 
497
496
  @state()
498
- playing = false;
497
+ timelineScrolltop = 0;
499
498
 
499
+ @consume({ context: playingContext, subscribe: true })
500
500
  @state()
501
- timelineScrolltop = 0;
501
+ playing?: boolean;
502
502
 
503
503
  timegroupController?: TimegroupController;
504
504
 
505
+ @state()
506
+ currentTimeMs = 0;
507
+
505
508
  connectedCallback(): void {
506
509
  super.connectedCallback();
507
510
  this.#bindToTargetTimegroup();
@@ -541,7 +544,9 @@ export class EFFilmstrip extends TWMixin(LitElement) {
541
544
  return;
542
545
  }
543
546
  event.preventDefault();
544
- this.playing = !this.playing;
547
+ if (this.#contextElement) {
548
+ this.#contextElement.playing = !this.#contextElement.playing;
549
+ }
545
550
  }
546
551
  };
547
552
 
@@ -561,108 +566,6 @@ export class EFFilmstrip extends TWMixin(LitElement) {
561
566
  }
562
567
  }
563
568
 
564
- #lastTick?: DOMHighResTimeStamp;
565
-
566
- #playbackAudioContext: AudioContext | null = null;
567
- #playbackAnimationFrameRequest: number | null = null;
568
- #AUDIO_PLAYBACK_SLICE_MS = 1000;
569
-
570
- #syncPlayheadToAudioContext(target: EFTimegroup, startMs: number) {
571
- target.currentTimeMs =
572
- startMs + (this.#playbackAudioContext?.currentTime ?? 0) * 1000;
573
- this.#playbackAnimationFrameRequest = requestAnimationFrame(() => {
574
- this.#syncPlayheadToAudioContext(target, startMs);
575
- });
576
- }
577
-
578
- async #stopPlayback() {
579
- if (this.#playbackAudioContext) {
580
- if (this.#playbackAudioContext.state !== "closed") {
581
- await this.#playbackAudioContext.close();
582
- }
583
- }
584
- if (this.#playbackAnimationFrameRequest) {
585
- cancelAnimationFrame(this.#playbackAnimationFrameRequest);
586
- }
587
- this.#playbackAudioContext = null;
588
- }
589
-
590
- async #startPlayback() {
591
- await this.#stopPlayback();
592
- const timegroup = this.targetTimegroup;
593
- if (!timegroup) {
594
- return;
595
- }
596
-
597
- let currentMs = timegroup.currentTimeMs;
598
- let bufferCount = 0;
599
- this.#playbackAudioContext = new AudioContext({
600
- latencyHint: "playback",
601
- });
602
- if (this.#playbackAnimationFrameRequest) {
603
- cancelAnimationFrame(this.#playbackAnimationFrameRequest);
604
- }
605
- this.#syncPlayheadToAudioContext(timegroup, currentMs);
606
- const playbackContext = this.#playbackAudioContext;
607
- await playbackContext.suspend();
608
-
609
- const fillBuffer = async () => {
610
- if (bufferCount > 1) {
611
- return;
612
- }
613
- const canFillBuffer = await queueBufferSource();
614
- if (canFillBuffer) {
615
- fillBuffer();
616
- }
617
- };
618
-
619
- const fromMs = currentMs;
620
- const toMs = timegroup.endTimeMs;
621
-
622
- const queueBufferSource = async () => {
623
- if (currentMs >= toMs) {
624
- return false;
625
- }
626
- const startMs = currentMs;
627
- const endMs = currentMs + this.#AUDIO_PLAYBACK_SLICE_MS;
628
- currentMs += this.#AUDIO_PLAYBACK_SLICE_MS;
629
- const audioBuffer = await timegroup.renderAudio(startMs, endMs);
630
- bufferCount++;
631
- const source = playbackContext.createBufferSource();
632
- source.buffer = audioBuffer;
633
- source.connect(playbackContext.destination);
634
- source.start((startMs - fromMs) / 1000);
635
- source.onended = () => {
636
- bufferCount--;
637
- if (endMs >= toMs) {
638
- this.playing = false;
639
- } else {
640
- fillBuffer();
641
- }
642
- };
643
- return true;
644
- };
645
-
646
- await fillBuffer();
647
- await playbackContext.resume();
648
- }
649
-
650
- advancePlayhead = (tick?: DOMHighResTimeStamp) => {
651
- if (this.#lastTick && tick && this.targetTimegroup) {
652
- this.targetTimegroup.currentTimeMs += tick - this.#lastTick;
653
- if (
654
- this.targetTimegroup.currentTimeMs >= this.targetTimegroup.durationMs
655
- ) {
656
- this.playing = false;
657
- }
658
- }
659
- this.#lastTick = tick;
660
-
661
- if (this.playing) {
662
- requestAnimationFrame(this.advancePlayhead);
663
- }
664
- };
665
-
666
569
  @eventOptions({ capture: false })
667
570
  scrub(e: MouseEvent) {
668
571
  if (this.playing) {
@@ -777,14 +680,18 @@ export class EFFilmstrip extends TWMixin(LitElement) {
777
680
  this.playing
778
681
  ? html`<button
779
682
  @click=${() => {
780
- this.playing = false;
683
+ if (this.#contextElement) {
684
+ this.#contextElement.playing = false;
685
+ }
781
686
  }}
782
687
  >
783
688
  ⏸️
784
689
  </button>`
785
690
  : html`<button
786
691
  @click=${() => {
787
- this.playing = true;
692
+ if (this.#contextElement) {
693
+ this.#contextElement.playing = true;
694
+ }
788
695
  }}
789
696
  >
790
697
  ▶️
@@ -826,17 +733,6 @@ export class EFFilmstrip extends TWMixin(LitElement) {
826
733
  </div>`;
827
734
  }
828
735
 
829
- update(changedProperties: Map<string | number | symbol, unknown>) {
830
- if (changedProperties.has("playing")) {
831
- if (this.playing) {
832
- this.#startPlayback();
833
- } else {
834
- this.#stopPlayback();
835
- }
836
- }
837
- super.update(changedProperties);
838
- }
839
-
840
736
  updated(changes: PropertyValueMap<any> | Map<PropertyKey, unknown>) {
841
737
  if (!this.targetTimegroup) {
842
738
  return;
@@ -846,19 +742,14 @@ export class EFFilmstrip extends TWMixin(LitElement) {
846
742
  this.targetTimegroup.currentTimeMs = this.currentTimeMs;
847
743
  }
848
744
  }
849
- if (changes.has("target")) {
850
- this.#bindToTargetTimegroup();
851
- }
745
+ }
746
+
747
+ get #contextElement(): EFWorkbench | EFPreview | null {
748
+ return this.closest("ef-workbench, ef-preview") as EFWorkbench | EFPreview;
852
749
  }
853
750
 
854
751
  get targetTimegroup() {
855
- if (this.getAttribute("target")) {
856
- const target = document.getElementById(this.getAttribute("target") ?? "");
857
- if (target instanceof EFTimegroup) {
858
- return target;
859
- }
860
- }
861
- return undefined;
752
+ return this.#contextElement?.targetTimegroup;
862
753
  }
863
754
  }
864
755
 
@@ -0,0 +1,39 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement } from "lit/decorators.js";
3
+ import { ref } from "lit/directives/ref.js";
4
+
5
+ import { TWMixin } from "./TWMixin.ts";
6
+ import { ContextMixin } from "./ContextMixin.ts";
7
+
8
+ @customElement("ef-preview")
9
+ export class EFPreview extends ContextMixin(TWMixin(LitElement)) {
10
+ static styles = [
11
+ css`
12
+ :host {
13
+ display: block;
14
+ width: 100%;
15
+ height: 100%;
16
+ }
17
+ `,
18
+ ];
19
+
20
+ render() {
21
+ return html`
22
+ <div
23
+ ${ref(this.stageRef)}
24
+ class="relative grid h-full w-full place-content-center place-items-center overflow-hidden"
25
+ >
26
+ <slot
27
+ ${ref(this.canvasRef)}
28
+ class="inline-block"
29
+ ></slot>
30
+ </div>
31
+ `;
32
+ }
33
+ }
34
+
35
+ declare global {
36
+ interface HTMLElementTagNameMap {
37
+ "ef-preview": EFPreview;
38
+ }
39
+ }
@@ -1,34 +1,15 @@
1
- import { createContext, provide } from "@lit/context";
2
1
  import { LitElement, html, css, type PropertyValueMap } from "lit";
3
2
  import { TaskStatus } from "@lit/task";
4
- import {
5
- customElement,
6
- eventOptions,
7
- property,
8
- state,
9
- } from "lit/decorators.js";
3
+ import { customElement, eventOptions } from "lit/decorators.js";
10
4
  import { ref, createRef } from "lit/directives/ref.js";
11
5
 
12
- import { awaitMicrotask } from "@/util/awaitMicrotask";
13
- import { deepGetTemporalElements } from "../elements/EFTemporal";
14
- import { TWMixin } from "./TWMixin";
15
- import { shallowGetTimegroups } from "../elements/EFTimegroup";
16
-
17
- export interface FocusContext {
18
- focusedElement: HTMLElement | null;
19
- }
20
- export const focusContext = createContext<FocusContext>(Symbol("focusContext"));
21
-
22
- export const focusedElement = createContext<HTMLElement | undefined>(
23
- Symbol("focusedElement"),
24
- );
25
-
26
- export const fetchContext = createContext<typeof fetch>(Symbol("fetchContext"));
27
-
28
- export const apiHostContext = createContext<string>(Symbol("apiHostContext"));
6
+ import { deepGetTemporalElements } from "../elements/EFTemporal.ts";
7
+ import { TWMixin } from "./TWMixin.ts";
8
+ import { shallowGetTimegroups } from "../elements/EFTimegroup.ts";
9
+ import { ContextMixin } from "./ContextMixin.ts";
29
10
 
30
11
  @customElement("ef-workbench")
31
- export class EFWorkbench extends TWMixin(LitElement) {
12
+ export class EFWorkbench extends ContextMixin(TWMixin(LitElement)) {
32
13
  static styles = [
33
14
  css`
34
15
  :host {
@@ -38,51 +19,6 @@ export class EFWorkbench extends TWMixin(LitElement) {
38
19
  }
39
20
  `,
40
21
  ];
41
- stageRef = createRef<HTMLDivElement>();
42
- canvasRef = createRef<HTMLSlotElement>();
43
-
44
- @state()
45
- stageScale = 1;
46
-
47
- setStageScale = () => {
48
- if (this.isConnected && !this.rendering) {
49
- const canvasElement = this.canvasRef.value;
50
- const stageElement = this.stageRef.value;
51
- if (stageElement && canvasElement) {
52
- // Determine the appropriate scale factor to make the canvas fit into
53
- // it's parent element.
54
- const stageWidth = stageElement.clientWidth;
55
- const stageHeight = stageElement.clientHeight;
56
- const canvasWidth = canvasElement.clientWidth;
57
- const canvasHeight = canvasElement.clientHeight;
58
- const stageRatio = stageWidth / stageHeight;
59
- const canvasRatio = canvasWidth / canvasHeight;
60
- if (stageRatio > canvasRatio) {
61
- const scale = stageHeight / canvasHeight;
62
- if (this.stageScale !== scale) {
63
- canvasElement.style.transform = `scale(${scale})`;
64
- }
65
- this.stageScale = scale;
66
- } else {
67
- const scale = stageWidth / canvasWidth;
68
- if (this.stageScale !== scale) {
69
- canvasElement.style.transform = `scale(${scale})`;
70
- }
71
- this.stageScale = scale;
72
- }
73
- }
74
- }
75
- if (this.isConnected) {
76
- requestAnimationFrame(this.setStageScale);
77
- }
78
- };
79
-
80
- connectedCallback(): void {
81
- super.connectedCallback();
82
- // Preferrably we would use a resizeObserver, but it is difficult to get the first resize
83
- // timed correctl. So we use requestAnimationFrame as a stop-gap.
84
- requestAnimationFrame(this.setStageScale);
85
- }
86
22
 
87
23
  disconnectedCallback(): void {
88
24
  super.disconnectedCallback();
@@ -93,40 +29,6 @@ export class EFWorkbench extends TWMixin(LitElement) {
93
29
  event.preventDefault();
94
30
  }
95
31
 
96
- @provide({ context: focusContext })
97
- focusContext = this as FocusContext;
98
-
99
- @provide({ context: focusedElement })
100
- @state()
101
- focusedElement?: HTMLElement;
102
-
103
- @provide({ context: fetchContext })
104
- fetch = (path: URL | RequestInfo, init: RequestInit = {}) => {
105
- init.headers ||= {};
106
- Object.assign(init.headers, {
107
- "Content-Type": "application/json",
108
- });
109
-
110
- const bearerToken = this.apiToken;
111
- if (bearerToken) {
112
- Object.assign(init.headers, {
113
- Authorization: `Bearer ${bearerToken}`,
114
- });
115
- }
116
-
117
- return fetch(path, init);
118
- };
119
-
120
- @property({ type: String })
121
- apiToken?: string;
122
-
123
- @provide({ context: apiHostContext })
124
- @property({ type: String })
125
- apiHost = "";
126
-
127
- @property({ type: Boolean })
128
- rendering = false;
129
-
130
32
  focusOverlay = createRef<HTMLDivElement>();
131
33
 
132
34
  update(
@@ -215,7 +117,7 @@ export class EFWorkbench extends TWMixin(LitElement) {
215
117
 
216
118
  for (let i = 0; i < frameCount; i++) {
217
119
  firstGroup.currentTimeMs = i * stepDurationMs;
218
- await awaitMicrotask();
120
+ await new Promise<void>(queueMicrotask);
219
121
  const busyTasks = temporals
220
122
  .filter((temporal) => temporal.frameTask.status < TaskStatus.COMPLETE)
221
123
  .map((temporal) => temporal.frameTask);
@@ -2,8 +2,11 @@ import type { LitElement } from "lit";
2
2
  // @ts-expect-error cannot figure out how to declare this module as a string
3
3
  import twStyle from "./TWMixin.css?inline";
4
4
 
5
- const twSheet = new CSSStyleSheet();
6
- twSheet.replaceSync(twStyle);
5
+ let twSheet: CSSStyleSheet | null = null;
6
+ if (typeof window !== "undefined") {
7
+ twSheet = new CSSStyleSheet();
8
+ twSheet.replaceSync(twStyle);
9
+ }
7
10
  export function TWMixin<T extends new (...args: any[]) => LitElement>(Base: T) {
8
11
  class TWElement extends Base {
9
12
  createRenderRoot() {
@@ -13,7 +16,11 @@ export function TWMixin<T extends new (...args: any[]) => LitElement>(Base: T) {
13
16
  "TWMixin can only be applied to elements with shadow roots",
14
17
  );
15
18
  }
16
-
19
+ if (!twSheet) {
20
+ throw new Error(
21
+ "twSheet not found. Probable cause: CSSStyleSheet not supported in this environment",
22
+ );
23
+ }
17
24
  if (renderRoot?.adoptedStyleSheets) {
18
25
  renderRoot.adoptedStyleSheets = [
19
26
  twSheet,
@@ -0,0 +1,3 @@
1
+ import { createContext } from "@lit/context";
2
+
3
+ export const apiHostContext = createContext<string>(Symbol("apiHostContext"));
@@ -0,0 +1,5 @@
1
+ import { createContext } from "@lit/context";
2
+
3
+ export const fetchContext = createContext<
4
+ (url: string, init?: RequestInit) => Promise<Response>
5
+ >(Symbol("fetchContext"));
@@ -0,0 +1,7 @@
1
+ import { createContext } from "@lit/context";
2
+
3
+ export interface FocusContext {
4
+ focusedElement: HTMLElement | null;
5
+ }
6
+
7
+ export const focusContext = createContext<FocusContext>(Symbol("focusContext"));
@@ -0,0 +1,5 @@
1
+ import { createContext } from "@lit/context";
2
+
3
+ export const focusedElementContext = createContext<HTMLElement | undefined>(
4
+ Symbol("focusedElement"),
5
+ );
@@ -0,0 +1,3 @@
1
+ import { createContext } from "@lit/context";
2
+
3
+ export const playingContext = createContext<boolean>(Symbol("playingContext"));
package/CHANGELOG.md DELETED
@@ -1,7 +0,0 @@
1
- # @editframe/elements
2
-
3
- ## 0.7.0-beta.9
4
-
5
- ### Patch Changes
6
-
7
- - [#33](https://github.com/editframe/elements/pull/33) [`17c4452`](https://github.com/editframe/elements/commit/17c4452f679b042ac0accd9bf520728455e8cc2c) Thanks [@IliasHad](https://github.com/IliasHad)! - resolve lit global package issue
@@ -1,12 +0,0 @@
1
- const path = require("node:path");
2
- module.exports = {
3
- plugins: {
4
- autoprefixer: {},
5
- "postcss-import": {},
6
- tailwindcss: {
7
- config: {
8
- content: [path.join(__dirname, "src/**/*.ts")],
9
- },
10
- },
11
- },
12
- };
@@ -1,2 +0,0 @@
1
- export const EF_INTERACTIVE =
2
- !window.location.search.includes("EF_NONINTERACTIVE");
package/src/elements.css DELETED
@@ -1,22 +0,0 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- html {
6
- @apply h-full w-full;
7
- }
8
- body {
9
- @apply h-full w-full bg-black;
10
- }
11
-
12
- :root {
13
- font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
14
- line-height: 1.5;
15
- font-weight: 400;
16
-
17
- font-synthesis: none;
18
- text-rendering: optimizeLegibility;
19
- -webkit-font-smoothing: antialiased;
20
- -moz-osx-font-smoothing: grayscale;
21
- -webkit-text-size-adjust: 100%;
22
- }
package/src/index.ts DELETED
@@ -1,33 +0,0 @@
1
- import "./elements.css";
2
-
3
- import "./elements/EFTimegroup";
4
- export { EFTimegroup } from "./elements/EFTimegroup";
5
-
6
- import "./elements/EFImage";
7
- export { EFImage } from "./elements/EFImage";
8
-
9
- import "./elements/EFMedia";
10
- export type { EFMedia } from "./elements/EFMedia";
11
-
12
- import "./elements/EFAudio";
13
- export { EFAudio } from "./elements/EFAudio";
14
-
15
- import "./elements/EFVideo";
16
- export { EFVideo } from "./elements/EFVideo";
17
-
18
- import "./elements/EFCaptions";
19
- export { EFCaptions, EFCaptionsActiveWord } from "./elements/EFCaptions";
20
-
21
- import "./elements/EFWaveform";
22
- export { EFWaveform } from "./elements/EFWaveform";
23
-
24
- import "./gui/EFWorkbench";
25
- export { EFWorkbench } from "./gui/EFWorkbench";
26
-
27
- import "./gui/EFFilmstrip";
28
- export { EFFilmstrip } from "./gui/EFFilmstrip";
29
-
30
- // @ts-expect-error
31
- window.EF_REGISTERED = true;
32
-
33
- import "./EF_FRAMEGEN";
@@ -1,10 +0,0 @@
1
- import type { Config } from "tailwindcss";
2
-
3
- module.exports = {
4
- content: ["./src/**/*.ts"],
5
-
6
- theme: {
7
- extend: {},
8
- },
9
- plugins: [],
10
- } satisfies Config;
package/tsconfig.json DELETED
@@ -1,4 +0,0 @@
1
- {
2
- "include": ["src/**/*.ts"],
3
- "extends": "../../tsconfig.json"
4
- }
package/vite.config.ts DELETED
@@ -1,8 +0,0 @@
1
- import path from "node:path";
2
-
3
- import { defineViteBuildConfig } from "../defineViteBuildConfig";
4
-
5
- export default defineViteBuildConfig({
6
- root: path.dirname(new URL(import.meta.url).pathname),
7
- name: "editframe-elements",
8
- });