@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.
Files changed (57) hide show
  1. package/dist/EF_FRAMEGEN.d.ts +0 -1
  2. package/dist/elements/CrossUpdateController.d.ts +0 -1
  3. package/dist/elements/EFAudio.d.ts +0 -1
  4. package/dist/elements/EFCaptions.d.ts +3 -3
  5. package/dist/elements/EFImage.d.ts +0 -1
  6. package/dist/elements/EFMedia.d.ts +5 -3
  7. package/dist/elements/EFSourceMixin.d.ts +0 -1
  8. package/dist/elements/EFTemporal.d.ts +3 -1
  9. package/dist/elements/EFTimegroup.browsertest.d.ts +0 -1
  10. package/dist/elements/EFTimegroup.d.ts +2 -5
  11. package/dist/elements/EFVideo.d.ts +0 -1
  12. package/dist/elements/EFWaveform.d.ts +0 -1
  13. package/dist/elements/FetchMixin.d.ts +0 -1
  14. package/dist/elements/TimegroupController.d.ts +0 -1
  15. package/dist/elements/durationConverter.d.ts +8 -0
  16. package/dist/elements/src/elements/EFCaptions.js +10 -7
  17. package/dist/elements/src/elements/EFMedia.js +25 -8
  18. package/dist/elements/src/elements/EFTemporal.js +51 -2
  19. package/dist/elements/src/elements/EFTimegroup.js +22 -39
  20. package/dist/elements/src/elements/EFWaveform.js +3 -3
  21. package/dist/elements/src/elements/parseTimeToMs.js +1 -0
  22. package/dist/elements/src/gui/ContextMixin.js +37 -25
  23. package/dist/elements/src/gui/EFFilmstrip.js +27 -25
  24. package/dist/elements/src/gui/EFToggleLoop.js +39 -0
  25. package/dist/elements/src/gui/EFTogglePlay.js +43 -0
  26. package/dist/elements/src/gui/EFWorkbench.js +4 -4
  27. package/dist/elements/src/gui/TWMixin.css.js +1 -1
  28. package/dist/elements/src/gui/efContext.js +7 -0
  29. package/dist/elements/src/gui/playingContext.js +2 -0
  30. package/dist/elements/src/index.js +4 -0
  31. package/dist/elements/util.d.ts +0 -1
  32. package/dist/gui/ContextMixin.d.ts +8 -12
  33. package/dist/gui/EFFilmstrip.d.ts +7 -3
  34. package/dist/gui/EFPreview.d.ts +1 -16
  35. package/dist/gui/EFToggleLoop.d.ts +12 -0
  36. package/dist/gui/EFTogglePlay.d.ts +12 -0
  37. package/dist/gui/EFWorkbench.d.ts +1 -17
  38. package/dist/gui/TWMixin.d.ts +0 -1
  39. package/dist/gui/efContext.d.ts +4 -0
  40. package/dist/gui/playingContext.d.ts +3 -0
  41. package/dist/index.d.ts +2 -1
  42. package/dist/style.css +7 -5
  43. package/package.json +3 -3
  44. package/src/elements/EFCaptions.ts +14 -8
  45. package/src/elements/EFMedia.ts +37 -9
  46. package/src/elements/EFTemporal.ts +60 -2
  47. package/src/elements/EFTimegroup.ts +21 -41
  48. package/src/elements/EFWaveform.ts +3 -3
  49. package/src/elements/durationConverter.ts +20 -0
  50. package/src/elements/parseTimeToMs.ts +1 -0
  51. package/src/gui/ContextMixin.ts +50 -36
  52. package/src/gui/EFFilmstrip.ts +27 -28
  53. package/src/gui/EFToggleLoop.ts +34 -0
  54. package/src/gui/EFTogglePlay.ts +38 -0
  55. package/src/gui/EFWorkbench.ts +4 -4
  56. package/src/gui/efContext.ts +6 -0
  57. package/src/gui/playingContext.ts +2 -0
@@ -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 styles() {
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` <div class="" style=${styleMap(this.styles)}>
105
+ return html`<div style=${styleMap(this.gutterStyles)}>
99
106
  <div
100
- class="border-outset relative mb-[1px] block h-[1.1rem] text-nowrap border border-slate-500 bg-blue-200 hover:bg-blue-400 text-sm data-[focused]:bg-slate-400"
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
- ${this.animations()}
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 = (event.target as HTMLElement | null)?.closest(
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
- this.playing
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
+ }
@@ -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 place-content-center place-items-center overflow-hidden"
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
  }
@@ -0,0 +1,6 @@
1
+ import { createContext } from "@lit/context";
2
+ import type { ContextMixinInterface } from "./ContextMixin.ts";
3
+
4
+ export const efContext = createContext<ContextMixinInterface | null>(
5
+ Symbol("efContext"),
6
+ );
@@ -1,3 +1,5 @@
1
1
  import { createContext } from "@lit/context";
2
2
 
3
3
  export const playingContext = createContext<boolean>(Symbol("playingContext"));
4
+
5
+ export const loopContext = createContext<boolean>(Symbol("loopContext"));