@editframe/elements 0.8.0-beta.1 → 0.8.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EF_FRAMEGEN.d.ts +0 -1
- package/dist/elements/CrossUpdateController.d.ts +0 -1
- package/dist/elements/EFAudio.d.ts +0 -1
- package/dist/elements/EFCaptions.d.ts +3 -3
- package/dist/elements/EFImage.d.ts +0 -1
- package/dist/elements/EFMedia.d.ts +5 -3
- package/dist/elements/EFSourceMixin.d.ts +0 -1
- package/dist/elements/EFTemporal.d.ts +3 -1
- package/dist/elements/EFTimegroup.browsertest.d.ts +0 -1
- package/dist/elements/EFTimegroup.d.ts +2 -5
- package/dist/elements/EFVideo.d.ts +0 -1
- package/dist/elements/EFWaveform.d.ts +0 -1
- package/dist/elements/FetchMixin.d.ts +0 -1
- package/dist/elements/TimegroupController.d.ts +0 -1
- package/dist/elements/durationConverter.d.ts +8 -0
- package/dist/elements/src/elements/EFCaptions.js +10 -7
- package/dist/elements/src/elements/EFMedia.js +25 -8
- package/dist/elements/src/elements/EFTemporal.js +51 -2
- package/dist/elements/src/elements/EFTimegroup.js +22 -39
- package/dist/elements/src/elements/EFWaveform.js +3 -3
- package/dist/elements/src/elements/parseTimeToMs.js +1 -0
- package/dist/elements/src/gui/ContextMixin.js +37 -25
- package/dist/elements/src/gui/EFFilmstrip.js +27 -25
- package/dist/elements/src/gui/EFToggleLoop.js +39 -0
- package/dist/elements/src/gui/EFTogglePlay.js +43 -0
- package/dist/elements/src/gui/EFWorkbench.js +4 -4
- package/dist/elements/src/gui/TWMixin.css.js +1 -1
- package/dist/elements/src/gui/efContext.js +7 -0
- package/dist/elements/src/gui/playingContext.js +2 -0
- package/dist/elements/src/index.js +4 -0
- package/dist/elements/util.d.ts +0 -1
- package/dist/gui/ContextMixin.d.ts +8 -12
- package/dist/gui/EFFilmstrip.d.ts +7 -3
- package/dist/gui/EFPreview.d.ts +1 -16
- package/dist/gui/EFToggleLoop.d.ts +12 -0
- package/dist/gui/EFTogglePlay.d.ts +12 -0
- package/dist/gui/EFWorkbench.d.ts +1 -17
- package/dist/gui/TWMixin.d.ts +0 -1
- package/dist/gui/efContext.d.ts +4 -0
- package/dist/gui/playingContext.d.ts +3 -0
- package/dist/index.d.ts +2 -1
- package/dist/style.css +7 -5
- package/package.json +3 -3
- package/src/elements/EFCaptions.ts +14 -8
- package/src/elements/EFMedia.ts +37 -9
- package/src/elements/EFTemporal.ts +60 -2
- package/src/elements/EFTimegroup.ts +21 -41
- package/src/elements/EFWaveform.ts +3 -3
- package/src/elements/durationConverter.ts +20 -0
- package/src/elements/parseTimeToMs.ts +1 -0
- package/src/gui/ContextMixin.ts +50 -36
- package/src/gui/EFFilmstrip.ts +27 -28
- package/src/gui/EFToggleLoop.ts +34 -0
- package/src/gui/EFTogglePlay.ts +38 -0
- package/src/gui/EFWorkbench.ts +4 -4
- package/src/gui/efContext.ts +6 -0
- package/src/gui/playingContext.ts +2 -0
package/src/gui/EFFilmstrip.ts
CHANGED
|
@@ -29,7 +29,7 @@ import { TWMixin } from "./TWMixin.ts";
|
|
|
29
29
|
import { msToTimeCode } from "../msToTimeCode.ts";
|
|
30
30
|
import { focusedElementContext } from "./focusedElementContext.ts";
|
|
31
31
|
import { type FocusContext, focusContext } from "./focusContext.ts";
|
|
32
|
-
import { playingContext } from "./playingContext.ts";
|
|
32
|
+
import { playingContext, loopContext } from "./playingContext.ts";
|
|
33
33
|
import type { EFWorkbench } from "./EFWorkbench.ts";
|
|
34
34
|
import type { EFPreview } from "./EFPreview.ts";
|
|
35
35
|
|
|
@@ -86,18 +86,25 @@ class FilmstripItem extends TWMixin(LitElement) {
|
|
|
86
86
|
@property({ type: Number })
|
|
87
87
|
pixelsPerMs = 0.04;
|
|
88
88
|
|
|
89
|
-
get
|
|
89
|
+
get gutterStyles() {
|
|
90
90
|
return {
|
|
91
91
|
position: "relative",
|
|
92
|
-
left: `${this.pixelsPerMs * this.element.startTimeWithinParentMs}px`,
|
|
92
|
+
left: `${this.pixelsPerMs * (this.element.startTimeWithinParentMs - this.element.trimStartMs)}px`,
|
|
93
|
+
width: `${this.pixelsPerMs * (this.element.durationMs + this.element.trimStartMs + this.element.trimEndMs)}px`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
get trimPortionStyles() {
|
|
98
|
+
return {
|
|
93
99
|
width: `${this.pixelsPerMs * this.element.durationMs}px`,
|
|
100
|
+
left: `${this.pixelsPerMs * this.element.trimStartMs}px`,
|
|
94
101
|
};
|
|
95
102
|
}
|
|
96
103
|
|
|
97
104
|
render() {
|
|
98
|
-
return html
|
|
105
|
+
return html`<div style=${styleMap(this.gutterStyles)}>
|
|
99
106
|
<div
|
|
100
|
-
class="
|
|
107
|
+
class="bg-slate-300"
|
|
101
108
|
?data-focused=${this.isFocused}
|
|
102
109
|
@mouseenter=${() => {
|
|
103
110
|
if (this.focusContext) {
|
|
@@ -110,7 +117,13 @@ class FilmstripItem extends TWMixin(LitElement) {
|
|
|
110
117
|
}
|
|
111
118
|
}}
|
|
112
119
|
>
|
|
113
|
-
|
|
120
|
+
<div
|
|
121
|
+
?data-focused=${this.isFocused}
|
|
122
|
+
class="border-outset relative mb-[1px] block h-[1.1rem] text-nowrap border border-slate-500 bg-blue-200 text-sm data-[focused]:bg-slate-400"
|
|
123
|
+
style=${styleMap(this.trimPortionStyles)}
|
|
124
|
+
>
|
|
125
|
+
${this.animations()}
|
|
126
|
+
</div>
|
|
114
127
|
</div>
|
|
115
128
|
${this.renderChildren()}
|
|
116
129
|
</div>`;
|
|
@@ -500,6 +513,10 @@ export class EFFilmstrip extends TWMixin(LitElement) {
|
|
|
500
513
|
@state()
|
|
501
514
|
playing?: boolean;
|
|
502
515
|
|
|
516
|
+
@consume({ context: loopContext, subscribe: true })
|
|
517
|
+
@state()
|
|
518
|
+
loop?: boolean;
|
|
519
|
+
|
|
503
520
|
timegroupController?: TimegroupController;
|
|
504
521
|
|
|
505
522
|
@state()
|
|
@@ -532,12 +549,13 @@ export class EFFilmstrip extends TWMixin(LitElement) {
|
|
|
532
549
|
#handleKeyPress = (event: KeyboardEvent) => {
|
|
533
550
|
// On spacebar, toggle playback
|
|
534
551
|
if (event.key === " ") {
|
|
552
|
+
const [target] = event.composedPath();
|
|
535
553
|
// CSS selector to match all interactive elements
|
|
536
554
|
const interactiveSelector =
|
|
537
555
|
"input, textarea, button, select, a, [contenteditable]";
|
|
538
556
|
|
|
539
557
|
// Check if the event target or its ancestor matches an interactive element
|
|
540
|
-
const closestInteractive = (
|
|
558
|
+
const closestInteractive = (target as HTMLElement | null)?.closest(
|
|
541
559
|
interactiveSelector,
|
|
542
560
|
);
|
|
543
561
|
if (closestInteractive) {
|
|
@@ -676,27 +694,8 @@ export class EFFilmstrip extends TWMixin(LitElement) {
|
|
|
676
694
|
/>
|
|
677
695
|
<code>${msToTimeCode(this.currentTimeMs, true)} </code> /
|
|
678
696
|
<code>${msToTimeCode(target?.durationMs ?? 0, true)}</code>
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
? html`<button
|
|
682
|
-
@click=${() => {
|
|
683
|
-
if (this.#contextElement) {
|
|
684
|
-
this.#contextElement.playing = false;
|
|
685
|
-
}
|
|
686
|
-
}}
|
|
687
|
-
>
|
|
688
|
-
⏸️
|
|
689
|
-
</button>`
|
|
690
|
-
: html`<button
|
|
691
|
-
@click=${() => {
|
|
692
|
-
if (this.#contextElement) {
|
|
693
|
-
this.#contextElement.playing = true;
|
|
694
|
-
}
|
|
695
|
-
}}
|
|
696
|
-
>
|
|
697
|
-
▶️
|
|
698
|
-
</button>`
|
|
699
|
-
}
|
|
697
|
+
<ef-toggle-play><button>${this.playing ? "⏸️" : "▶️"}</button></ef-toggle-play>
|
|
698
|
+
<ef-toggle-loop><button>${this.loop ? "🔁" : html`<span class="opacity-50">🔁</span>`}</button></ef-toggle-loop>
|
|
700
699
|
</div>
|
|
701
700
|
<div
|
|
702
701
|
class="z-10 pl-1 pr-1 pt-2 shadow shadow-slate-600 overflow-auto"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { css, html, LitElement } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
import { consume } from "@lit/context";
|
|
4
|
+
|
|
5
|
+
import { efContext } from "./efContext.ts";
|
|
6
|
+
import type { ContextMixinInterface } from "./ContextMixin.ts";
|
|
7
|
+
|
|
8
|
+
@customElement("ef-toggle-loop")
|
|
9
|
+
export class EFToggleLoop extends LitElement {
|
|
10
|
+
static styles = [
|
|
11
|
+
css`
|
|
12
|
+
:host {}
|
|
13
|
+
`,
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
@consume({ context: efContext })
|
|
17
|
+
context?: ContextMixinInterface | null;
|
|
18
|
+
|
|
19
|
+
render() {
|
|
20
|
+
return html`
|
|
21
|
+
<slot @click=${() => {
|
|
22
|
+
if (this.context) {
|
|
23
|
+
this.context.loop = !this.context.loop;
|
|
24
|
+
}
|
|
25
|
+
}}></slot>
|
|
26
|
+
`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
declare global {
|
|
31
|
+
interface HTMLElementTagNameMap {
|
|
32
|
+
"ef-toggle-loop": EFToggleLoop;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { css, html, LitElement } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
import { consume } from "@lit/context";
|
|
4
|
+
|
|
5
|
+
import { efContext } from "./efContext.ts";
|
|
6
|
+
import type { ContextMixinInterface } from "./ContextMixin.ts";
|
|
7
|
+
|
|
8
|
+
@customElement("ef-toggle-play")
|
|
9
|
+
export class EFTogglePlay extends LitElement {
|
|
10
|
+
static styles = [
|
|
11
|
+
css`
|
|
12
|
+
:host {}
|
|
13
|
+
`,
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
@consume({ context: efContext })
|
|
17
|
+
context?: ContextMixinInterface | null;
|
|
18
|
+
|
|
19
|
+
render() {
|
|
20
|
+
return html`
|
|
21
|
+
<slot @click=${() => {
|
|
22
|
+
if (this.context) {
|
|
23
|
+
if (this.context.playing) {
|
|
24
|
+
this.context.pause();
|
|
25
|
+
} else {
|
|
26
|
+
this.context.play();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}}></slot>
|
|
30
|
+
`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
declare global {
|
|
35
|
+
interface HTMLElementTagNameMap {
|
|
36
|
+
"ef-toggle-play": EFTogglePlay;
|
|
37
|
+
}
|
|
38
|
+
}
|
package/src/gui/EFWorkbench.ts
CHANGED
|
@@ -78,21 +78,21 @@ export class EFWorkbench extends ContextMixin(TWMixin(LitElement)) {
|
|
|
78
78
|
>
|
|
79
79
|
<div
|
|
80
80
|
${ref(this.stageRef)}
|
|
81
|
-
class="relative grid h-full w-full
|
|
81
|
+
class="relative grid h-full w-full justify-center overflow-hidden"
|
|
82
82
|
@wheel=${this.handleStageWheel}
|
|
83
83
|
>
|
|
84
84
|
<slot
|
|
85
85
|
${ref(this.canvasRef)}
|
|
86
|
-
class="inline-block"
|
|
87
86
|
name="canvas"
|
|
87
|
+
class="inline-block"
|
|
88
88
|
></slot>
|
|
89
89
|
<div
|
|
90
|
-
class="border border-blue-500 bg-blue-200 bg-opacity-20"
|
|
90
|
+
class="border border-blue-500 bg-blue-200 bg-opacity-20 absolute"
|
|
91
91
|
${ref(this.focusOverlay)}
|
|
92
92
|
></div>
|
|
93
93
|
</div>
|
|
94
94
|
|
|
95
|
-
<slot class="overflow" name="timeline"></slot>
|
|
95
|
+
<slot class="overflow inline-block" name="timeline"></slot>
|
|
96
96
|
</div>
|
|
97
97
|
`;
|
|
98
98
|
}
|