@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
@@ -0,0 +1,170 @@
1
+ import * as MP4Box from "mp4box";
2
+ import debug from "debug";
3
+ const log = debug("ef:av:mp4file");
4
+ class MP4File extends MP4Box.ISOFile {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.readyPromise = new Promise((resolve, reject) => {
8
+ this.onReady = () => resolve();
9
+ this.onError = reject;
10
+ });
11
+ this.waitingForSamples = [];
12
+ this._hasSeenLastSamples = false;
13
+ this._arrayBufferFileStart = 0;
14
+ }
15
+ setSegmentOptions(id, user, options) {
16
+ const trak = this.getTrackById(id);
17
+ if (trak) {
18
+ trak.nextSample = 0;
19
+ this.fragmentedTracks.push({
20
+ id,
21
+ user,
22
+ trak,
23
+ segmentStream: null,
24
+ nb_samples: "nbSamples" in options && options.nbSamples || 1e3,
25
+ rapAlignement: ("rapAlignement" in options && options.rapAlignement) ?? true
26
+ });
27
+ }
28
+ }
29
+ /**
30
+ * Fragments all tracks in a file into separate array buffers.
31
+ */
32
+ async fragmentAllTracks() {
33
+ const trackBuffers = {};
34
+ for await (const segment of this.fragmentIterator()) {
35
+ (trackBuffers[segment.track] ??= []).push(segment.data);
36
+ }
37
+ return trackBuffers;
38
+ }
39
+ async *fragmentIterator() {
40
+ await this.readyPromise;
41
+ const trackInfo = {};
42
+ for (const videoTrack of this.getInfo().videoTracks) {
43
+ trackInfo[videoTrack.id] = { index: 0, complete: false };
44
+ this.setSegmentOptions(videoTrack.id, null, {
45
+ rapAlignement: true
46
+ });
47
+ }
48
+ for (const audioTrack of this.getInfo().audioTracks) {
49
+ trackInfo[audioTrack.id] = { index: 0, complete: false };
50
+ const sampleRate = audioTrack.audio.sample_rate;
51
+ const probablePacketSize = 1024;
52
+ const probableFourSecondsOfSamples = Math.ceil(
53
+ sampleRate / probablePacketSize * 4
54
+ );
55
+ this.setSegmentOptions(audioTrack.id, null, {
56
+ nbSamples: probableFourSecondsOfSamples
57
+ });
58
+ }
59
+ const initSegments = this.initializeSegmentation();
60
+ for (const initSegment of initSegments) {
61
+ yield {
62
+ track: initSegment.id,
63
+ segment: "init",
64
+ data: initSegment.buffer,
65
+ complete: false
66
+ };
67
+ }
68
+ const fragmentStartSamples = {};
69
+ let finishedReading = false;
70
+ const allTracksFinished = () => {
71
+ for (const fragmentedTrack of this.fragmentedTracks) {
72
+ if (!trackInfo[fragmentedTrack.id]?.complete) {
73
+ return false;
74
+ }
75
+ }
76
+ return true;
77
+ };
78
+ while (!(finishedReading && allTracksFinished())) {
79
+ for (const fragTrak of this.fragmentedTracks) {
80
+ const trak = fragTrak.trak;
81
+ if (trak.nextSample === void 0) {
82
+ throw new Error("trak.nextSample is undefined");
83
+ }
84
+ if (trak.samples === void 0) {
85
+ throw new Error("trak.samples is undefined");
86
+ }
87
+ while (trak.nextSample < trak.samples.length) {
88
+ let result = void 0;
89
+ const fragTrakNextSample = trak.samples[trak.nextSample];
90
+ if (fragTrakNextSample) {
91
+ fragmentStartSamples[fragTrak.id] ||= fragTrakNextSample;
92
+ }
93
+ try {
94
+ result = this.createFragment(
95
+ fragTrak.id,
96
+ trak.nextSample,
97
+ fragTrak.segmentStream
98
+ );
99
+ } catch (error) {
100
+ console.error("Failed to createFragment", error);
101
+ }
102
+ if (result) {
103
+ fragTrak.segmentStream = result;
104
+ trak.nextSample++;
105
+ } else {
106
+ finishedReading = await this.waitForMoreSamples();
107
+ break;
108
+ }
109
+ const nextSample = trak.samples[trak.nextSample];
110
+ const emitSegment = (
111
+ // if rapAlignement is true, we emit a fragment when we have a rap sample coming up next
112
+ fragTrak.rapAlignement === true && nextSample?.is_sync || // if rapAlignement is false, we emit a fragment when we have the required number of samples
113
+ !fragTrak.rapAlignement && trak.nextSample % fragTrak.nb_samples === 0 || // // if this is the last sample, we emit the fragment
114
+ // finished ||
115
+ // if we have more samples than the number of samples requested, we emit the fragment
116
+ trak.nextSample >= trak.samples.length
117
+ );
118
+ if (emitSegment) {
119
+ const trackInfoForFrag = trackInfo[fragTrak.id];
120
+ if (!trackInfoForFrag) {
121
+ throw new Error("trackInfoForFrag is undefined");
122
+ }
123
+ if (trak.nextSample >= trak.samples.length) {
124
+ trackInfoForFrag.complete = true;
125
+ }
126
+ log(
127
+ `Yielding fragment #${trackInfoForFrag.index} for track=${fragTrak.id}`
128
+ );
129
+ const startSample = fragmentStartSamples[fragTrak.id];
130
+ const endSample = trak.samples[trak.nextSample - 1];
131
+ if (!startSample || !endSample) {
132
+ throw new Error("startSample or endSample is undefined");
133
+ }
134
+ yield {
135
+ track: fragTrak.id,
136
+ segment: trackInfoForFrag.index,
137
+ data: fragTrak.segmentStream.buffer,
138
+ complete: trackInfoForFrag.complete,
139
+ cts: startSample.cts,
140
+ dts: startSample.dts,
141
+ duration: endSample.cts - startSample.cts + endSample.duration
142
+ };
143
+ trackInfoForFrag.index += 1;
144
+ fragTrak.segmentStream = null;
145
+ delete fragmentStartSamples[fragTrak.id];
146
+ }
147
+ }
148
+ }
149
+ finishedReading = await this.waitForMoreSamples();
150
+ }
151
+ }
152
+ waitForMoreSamples() {
153
+ if (this._hasSeenLastSamples) {
154
+ return Promise.resolve(true);
155
+ }
156
+ return new Promise((resolve) => {
157
+ this.waitingForSamples.push(resolve);
158
+ });
159
+ }
160
+ processSamples(last) {
161
+ this._hasSeenLastSamples = last;
162
+ for (const observer of this.waitingForSamples) {
163
+ observer(last);
164
+ }
165
+ this.waitingForSamples = [];
166
+ }
167
+ }
168
+ export {
169
+ MP4File
170
+ };
@@ -0,0 +1,14 @@
1
+ const memoize = (_target, _propertyKey, descriptor) => {
2
+ const get = descriptor.get;
3
+ if (!get) return;
4
+ const memoized = /* @__PURE__ */ new WeakMap();
5
+ descriptor.get = function() {
6
+ if (!memoized.has(this)) {
7
+ memoized.set(this, get.call(this));
8
+ }
9
+ return memoized.get(this);
10
+ };
11
+ };
12
+ export {
13
+ memoize
14
+ };
@@ -0,0 +1,9 @@
1
+ import { LitElement, ReactiveController, ReactiveControllerHost } from 'lit';
2
+
3
+ export declare class CrossUpdateController implements ReactiveController {
4
+ private host;
5
+ private target;
6
+ constructor(host: ReactiveControllerHost, target: LitElement);
7
+ hostUpdate(): void;
8
+ remove(): void;
9
+ }
@@ -0,0 +1,10 @@
1
+ import { EFMedia } from './EFMedia.ts';
2
+ import { Task } from '@lit/task';
3
+
4
+ export declare class EFAudio extends EFMedia {
5
+ audioElementRef: import('lit-html/directives/ref.js').Ref<HTMLAudioElement>;
6
+ src: string;
7
+ render(): import('lit-html').TemplateResult<1>;
8
+ get audioElement(): HTMLAudioElement | undefined;
9
+ frameTask: Task<readonly [import('@lit/task').TaskStatus, import('@lit/task').TaskStatus, import('@lit/task').TaskStatus, import('@lit/task').TaskStatus, import('@lit/task').TaskStatus], void>;
10
+ }
@@ -0,0 +1,38 @@
1
+ import { LitElement, PropertyValueMap } from 'lit';
2
+ import { Task } from '@lit/task';
3
+ import { EFVideo } from './EFVideo.ts';
4
+ import { EFAudio } from './EFAudio.ts';
5
+
6
+ declare const EFCaptionsActiveWord_base: (new (...args: any[]) => import('./EFTemporal.ts').TemporalMixinInterface) & typeof LitElement;
7
+ export declare class EFCaptionsActiveWord extends EFCaptionsActiveWord_base {
8
+ static styles: import('lit').CSSResult[];
9
+ render(): import('lit-html').TemplateResult<1>;
10
+ wordStartMs: number;
11
+ wordEndMs: number;
12
+ wordText: string;
13
+ get startTimeMs(): number;
14
+ get durationMs(): number;
15
+ }
16
+ declare const EFCaptions_base: (new (...args: any[]) => import('./EFSourceMixin.ts').EFSourceMixinInterface) & (new (...args: any[]) => import('./EFTemporal.ts').TemporalMixinInterface) & (new (...args: any[]) => import('./FetchMixin.ts').FetchMixinInterface) & typeof LitElement;
17
+ export declare class EFCaptions extends EFCaptions_base {
18
+ static styles: import('lit').CSSResult[];
19
+ target: null;
20
+ wordStyle: string;
21
+ activeWordContainers: HTMLCollectionOf<EFCaptionsActiveWord>;
22
+ captionsPath(): string;
23
+ protected md5SumLoader: Task<readonly [null, typeof fetch], string | undefined>;
24
+ private captionsDataTask;
25
+ frameTask: Task<import('@lit/task').TaskStatus[], void>;
26
+ connectedCallback(): void;
27
+ render(): import('lit-html').TemplateResult<1> | undefined;
28
+ protected updated(_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
29
+ updateActiveWord(): void;
30
+ get targetElement(): EFAudio | EFVideo;
31
+ }
32
+ declare global {
33
+ interface HTMLElementTagNameMap {
34
+ "ef-captions": EFCaptions;
35
+ "ef-captions-active-word": EFCaptionsActiveWord;
36
+ }
37
+ }
38
+ export {};
@@ -0,0 +1,14 @@
1
+ import { Task } from '@lit/task';
2
+ import { LitElement } from 'lit';
3
+
4
+ declare const EFImage_base: (new (...args: any[]) => import('./EFSourceMixin.ts').EFSourceMixinInterface) & (new (...args: any[]) => import('./FetchMixin.ts').FetchMixinInterface) & typeof LitElement;
5
+ export declare class EFImage extends EFImage_base {
6
+ static styles: import('lit').CSSResult[];
7
+ imageRef: import('lit-html/directives/ref.js').Ref<HTMLImageElement>;
8
+ canvasRef: import('lit-html/directives/ref.js').Ref<HTMLCanvasElement>;
9
+ render(): import('lit-html').TemplateResult<1>;
10
+ assetPath(): string;
11
+ fetchImage: Task<readonly [string, typeof fetch], void>;
12
+ frameTask: Task<readonly [import('@lit/task').TaskStatus], void>;
13
+ }
14
+ export {};
@@ -0,0 +1,61 @@
1
+ import { LitElement, PropertyValueMap } from 'lit';
2
+ import { Task } from '@lit/task';
3
+ import { TrackFragmentIndex, TrackSegment } from '../../../assets/src';
4
+ import { MP4File } from '../../../assets/MP4File.js/src';
5
+ import { VideoAsset } from '../../../assets/EncodedAsset.js/src';
6
+
7
+ import type * as MP4Box from "mp4box";
8
+ export declare const deepGetMediaElements: (element: Element, medias?: EFMedia[]) => EFMedia[];
9
+ declare const EFMedia_base: (new (...args: any[]) => import('./EFSourceMixin.ts').EFSourceMixinInterface) & (new (...args: any[]) => import('./EFTemporal.ts').TemporalMixinInterface) & (new (...args: any[]) => import('./FetchMixin.ts').FetchMixinInterface) & typeof LitElement;
10
+ export declare class EFMedia extends EFMedia_base {
11
+ #private;
12
+ static styles: import('lit').CSSResult[];
13
+ currentTimeMs: number;
14
+ efHost?: string;
15
+ fragmentIndexPath(): string;
16
+ fragmentTrackPath(trackId: string): string;
17
+ trackFragmentIndexLoader: Task<readonly [string, typeof fetch], Record<number, TrackFragmentIndex> | undefined>;
18
+ protected initSegmentsLoader: Task<readonly [Record<number, TrackFragmentIndex> | undefined, string, typeof fetch], {
19
+ trackId: string;
20
+ buffer: MP4Box.MP4ArrayBuffer;
21
+ mp4File: MP4File;
22
+ }[] | undefined>;
23
+ get defaultVideoTrackId(): number | undefined;
24
+ get defaultAudioTrackId(): number | undefined;
25
+ seekTask: Task<readonly [number, Record<number, TrackFragmentIndex> | undefined, {
26
+ trackId: string;
27
+ buffer: MP4Box.MP4ArrayBuffer;
28
+ mp4File: MP4File;
29
+ }[] | undefined], Record<string, {
30
+ segment: TrackSegment;
31
+ track: MP4Box.TrackInfo;
32
+ }> | undefined>;
33
+ fetchSeekTask: Task<readonly [{
34
+ trackId: string;
35
+ buffer: MP4Box.MP4ArrayBuffer;
36
+ mp4File: MP4File;
37
+ }[] | undefined, Record<string, {
38
+ segment: TrackSegment;
39
+ track: MP4Box.TrackInfo;
40
+ }> | undefined, typeof fetch], Record<string, File> | undefined>;
41
+ videoAssetTask: Task<readonly [Record<string, File> | undefined], VideoAsset | undefined>;
42
+ desiredSeekTimeMs: number;
43
+ protected executeSeek(seekToMs: number): Promise<void>;
44
+ protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
45
+ get hasOwnDuration(): boolean;
46
+ get durationMs(): number;
47
+ get startTimeMs(): number;
48
+ audioBufferTask: Task<readonly [Record<string, File> | undefined, Record<string, {
49
+ segment: TrackSegment;
50
+ track: MP4Box.TrackInfo;
51
+ }> | undefined], {
52
+ buffer: AudioBuffer;
53
+ startOffsetMs: number;
54
+ } | undefined>;
55
+ fetchAudioSpanningTime(fromMs: number, toMs: number): Promise<{
56
+ blob: Blob;
57
+ startMs: number;
58
+ endMs: number;
59
+ } | undefined>;
60
+ }
61
+ export {};
@@ -0,0 +1,12 @@
1
+ import { LitElement } from 'lit';
2
+
3
+ export declare class EFSourceMixinInterface {
4
+ productionSrc(): string;
5
+ src: string;
6
+ }
7
+ interface EFSourceMixinOptions {
8
+ assetType: string;
9
+ }
10
+ type Constructor<T = {}> = new (...args: any[]) => T;
11
+ export declare function EFSourceMixin<T extends Constructor<LitElement>>(superClass: T, options: EFSourceMixinOptions): Constructor<EFSourceMixinInterface> & T;
12
+ export {};
@@ -0,0 +1,38 @@
1
+ import { LitElement, ReactiveController } from 'lit';
2
+ import { EFTimegroup } from './EFTimegroup.ts';
3
+ import { Task } from '@lit/task';
4
+
5
+ export declare const timegroupContext: {
6
+ __context__: EFTimegroup;
7
+ };
8
+ export declare class TemporalMixinInterface {
9
+ get hasOwnDuration(): boolean;
10
+ get durationMs(): number;
11
+ get startTimeMs(): number;
12
+ get startTimeWithinParentMs(): number;
13
+ get endTimeMs(): number;
14
+ get ownCurrentTimeMs(): number;
15
+ set duration(value: string);
16
+ get duration(): string;
17
+ parentTimegroup?: EFTimegroup;
18
+ rootTimegroup?: EFTimegroup;
19
+ frameTask: Task<readonly unknown[], unknown>;
20
+ }
21
+ export declare const isEFTemporal: (obj: any) => obj is TemporalMixinInterface;
22
+ export declare const deepGetTemporalElements: (element: Element, temporals?: TemporalMixinInterface[]) => TemporalMixinInterface[];
23
+ export declare const deepGetElementsWithFrameTasks: (element: Element, elements?: Array<HTMLElement & {
24
+ frameTask: Task;
25
+ }>) => (HTMLElement & {
26
+ frameTask: Task;
27
+ })[];
28
+ export declare const shallowGetTemporalElements: (element: Element, temporals?: TemporalMixinInterface[]) => TemporalMixinInterface[];
29
+ export declare class OwnCurrentTimeController implements ReactiveController {
30
+ private host;
31
+ private temporal;
32
+ constructor(host: EFTimegroup, temporal: TemporalMixinInterface & LitElement);
33
+ hostUpdated(): void;
34
+ remove(): void;
35
+ }
36
+ type Constructor<T = {}> = new (...args: any[]) => T;
37
+ export declare const EFTemporal: <T extends Constructor<LitElement>>(superClass: T) => Constructor<TemporalMixinInterface> & T;
38
+ export {};
@@ -0,0 +1,12 @@
1
+ import { LitElement } from 'lit';
2
+
3
+ declare const TestTemporal_base: (new (...args: any[]) => import('./EFTemporal.ts').TemporalMixinInterface) & typeof LitElement;
4
+ declare class TestTemporal extends TestTemporal_base {
5
+ get hasOwnDuration(): boolean;
6
+ }
7
+ declare global {
8
+ interface HTMLElementTagNameMap {
9
+ "test-temporal": TestTemporal;
10
+ }
11
+ }
12
+ export {};
@@ -0,0 +1,39 @@
1
+ import { LitElement, PropertyValueMap } from 'lit';
2
+ import { Task } from '@lit/task';
3
+
4
+ export declare const shallowGetTimegroups: (element: Element, groups?: EFTimegroup[]) => EFTimegroup[];
5
+ declare const EFTimegroup_base: (new (...args: any[]) => import('./EFTemporal.ts').TemporalMixinInterface) & typeof LitElement;
6
+ export declare class EFTimegroup extends EFTimegroup_base {
7
+ #private;
8
+ static styles: import('lit').CSSResult;
9
+ _timeGroupContext: this;
10
+ mode: "fixed" | "sequence" | "contain";
11
+ set currentTime(time: number);
12
+ get currentTime(): number;
13
+ get currentTimeMs(): number;
14
+ set currentTimeMs(ms: number);
15
+ crossoverMs: number;
16
+ render(): import('lit-html').TemplateResult<1>;
17
+ maybeLoadTimeFromLocalStorage(): number;
18
+ connectedCallback(): void;
19
+ get storageKey(): string;
20
+ get crossoverStartMs(): number;
21
+ get crossoverEndMs(): number;
22
+ get durationMs(): number;
23
+ waitForMediaDurations(): Promise<(Record<number, import('packages/assets/dist/Probe.js').TrackFragmentIndex> | undefined)[]>;
24
+ get childTemporals(): import('./EFTemporal.ts').TemporalMixinInterface[];
25
+ protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
26
+ shouldWrapWithWorkbench(): boolean;
27
+ wrapWithWorkbench(): void;
28
+ get hasOwnDuration(): boolean;
29
+ get efElements(): Element[];
30
+ renderAudio(fromMs: number, toMs: number): Promise<AudioBuffer>;
31
+ loadMd5Sums(): Promise<void>;
32
+ frameTask: Task<readonly [number, number], void>;
33
+ }
34
+ declare global {
35
+ interface HTMLElementTagNameMap {
36
+ "ef-timegroup": EFTimegroup & Element;
37
+ }
38
+ }
39
+ export {};
@@ -0,0 +1,14 @@
1
+ import { Task } from '@lit/task';
2
+ import { EFMedia } from './EFMedia.ts';
3
+
4
+ declare const EFVideo_base: typeof EFMedia;
5
+ export declare class EFVideo extends EFVideo_base {
6
+ #private;
7
+ static styles: import('lit').CSSResult[];
8
+ canvasRef: import('lit-html/directives/ref.js').Ref<HTMLCanvasElement>;
9
+ render(): import('lit-html').TemplateResult<1>;
10
+ get canvasElement(): HTMLCanvasElement | undefined;
11
+ frameTask: Task<readonly [import('@lit/task').TaskStatus, import('@lit/task').TaskStatus, import('@lit/task').TaskStatus, import('@lit/task').TaskStatus, import('@lit/task').TaskStatus, import('@lit/task').TaskStatus], void>;
12
+ paintTask: Task<readonly [import('packages/assets/dist/EncodedAsset.js').VideoAsset | undefined, number], number | undefined>;
13
+ }
14
+ export {};
@@ -0,0 +1,30 @@
1
+ import { EFAudio } from './EFAudio.ts';
2
+ import { LitElement } from 'lit';
3
+ import { EFVideo } from './EFVideo.ts';
4
+ import { Task } from '@lit/task';
5
+ import { Ref } from 'lit/directives/ref.js';
6
+
7
+ declare const EFWaveform_base: (new (...args: any[]) => import('./EFTemporal.ts').TemporalMixinInterface) & typeof LitElement;
8
+ export declare class EFWaveform extends EFWaveform_base {
9
+ static styles: never[];
10
+ svgRef: Ref<SVGElement>;
11
+ createRenderRoot(): this;
12
+ render(): import('lit-html').TemplateResult<1>;
13
+ mode: "roundBars" | "bars" | "bricks" | "equalizer" | "curve" | "line" | "pixel" | "wave";
14
+ color: string;
15
+ targetSelector: string;
16
+ set target(value: string);
17
+ connectedCallback(): void;
18
+ protected drawBars(svg: SVGElement, frequencyData: Uint8Array): void;
19
+ protected drawBricks(svg: SVGElement, frequencyData: Uint8Array): void;
20
+ protected drawLine(svg: SVGElement, frequencyData: Uint8Array): void;
21
+ protected drawRoundBars(svg: SVGElement, frequencyData: Uint8Array): void;
22
+ protected drawEqualizer(svg: SVGElement, frequencyData: Uint8Array): void;
23
+ protected drawCurve(svg: SVGElement, frequencyData: Uint8Array): void;
24
+ protected drawPixel(svg: SVGElement, frequencyData: Uint8Array): void;
25
+ protected drawWave(svg: SVGElement, frequencyData: Uint8Array): void;
26
+ frameTask: Task<readonly [import('@lit/task').TaskStatus], void>;
27
+ protected updated(): Promise<void>;
28
+ get targetElement(): EFAudio | EFVideo;
29
+ }
30
+ export {};
@@ -0,0 +1,8 @@
1
+ import { LitElement } from 'lit';
2
+
3
+ export declare class FetchMixinInterface {
4
+ fetch: typeof fetch;
5
+ }
6
+ type Constructor<T = {}> = new (...args: any[]) => T;
7
+ export declare function FetchMixin<T extends Constructor<LitElement>>(superClass: T): Constructor<FetchMixinInterface> & T;
8
+ export {};
@@ -0,0 +1,14 @@
1
+ import { ReactiveController, LitElement } from 'lit';
2
+ import { EFTimegroup } from './EFTimegroup.ts';
3
+
4
+ export declare class TimegroupController implements ReactiveController {
5
+ private host;
6
+ private child;
7
+ constructor(host: EFTimegroup, child: {
8
+ currentTimeMs: number;
9
+ startTimeMs?: number;
10
+ } & LitElement);
11
+ remove(): void;
12
+ hostDisconnected(): void;
13
+ hostUpdated(): void;
14
+ }
@@ -0,0 +1,4 @@
1
+ export declare const durationConverter: {
2
+ fromAttribute: (value: string) => number;
3
+ toAttribute: (value: number) => string;
4
+ };
@@ -0,0 +1 @@
1
+ export declare const parseTimeToMs: (time: string) => number;