@twick/timeline 0.14.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 (38) hide show
  1. package/README.md +175 -0
  2. package/dist/context/timeline-context.d.ts +33 -0
  3. package/dist/context/undo-redo-context.d.ts +21 -0
  4. package/dist/core/addOns/animation.d.ts +24 -0
  5. package/dist/core/addOns/frame-effect.d.ts +14 -0
  6. package/dist/core/addOns/text-effect.d.ts +19 -0
  7. package/dist/core/editor/timeline.editor.d.ts +94 -0
  8. package/dist/core/elements/audio.element.d.ts +20 -0
  9. package/dist/core/elements/base.element.d.ts +35 -0
  10. package/dist/core/elements/caption.element.d.ts +10 -0
  11. package/dist/core/elements/circle.element.d.ts +13 -0
  12. package/dist/core/elements/icon.element.d.ts +9 -0
  13. package/dist/core/elements/image.element.d.ts +32 -0
  14. package/dist/core/elements/rect.element.d.ts +11 -0
  15. package/dist/core/elements/text.element.d.ts +26 -0
  16. package/dist/core/elements/video.element.d.ts +41 -0
  17. package/dist/core/track/track.d.ts +77 -0
  18. package/dist/core/track/track.friend.d.ts +34 -0
  19. package/dist/core/visitor/element-adder.d.ts +29 -0
  20. package/dist/core/visitor/element-cloner.d.ts +22 -0
  21. package/dist/core/visitor/element-deserializer.d.ts +23 -0
  22. package/dist/core/visitor/element-remover.d.ts +28 -0
  23. package/dist/core/visitor/element-serializer.d.ts +23 -0
  24. package/dist/core/visitor/element-splitter.d.ts +28 -0
  25. package/dist/core/visitor/element-updater.d.ts +28 -0
  26. package/dist/core/visitor/element-validator.d.ts +34 -0
  27. package/dist/core/visitor/element-visitor.d.ts +19 -0
  28. package/dist/index.d.ts +36 -0
  29. package/dist/index.js +2630 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/index.mjs +2628 -0
  32. package/dist/index.mjs.map +1 -0
  33. package/dist/services/data.service.d.ts +25 -0
  34. package/dist/types/index.d.ts +169 -0
  35. package/dist/utils/constants.d.ts +55 -0
  36. package/dist/utils/register-editor.d.ts +8 -0
  37. package/dist/utils/timeline.utils.d.ts +11 -0
  38. package/package.json +40 -0
@@ -0,0 +1,34 @@
1
+ import { TrackElement } from '../elements/base.element';
2
+ import { Track } from './track';
3
+
4
+ /**
5
+ * Friend class that provides explicit access to Track's protected methods
6
+ * This implements the Friend Class Pattern for better encapsulation control
7
+ */
8
+ export declare class TrackFriend {
9
+ private track;
10
+ constructor(track: Track);
11
+ /**
12
+ * Add an element to the track with validation
13
+ * @param element The element to add
14
+ * @param skipValidation If true, skips validation (use with caution)
15
+ * @returns true if element was added successfully, throws ValidationError if validation fails
16
+ */
17
+ addElement(element: TrackElement, skipValidation?: boolean): boolean;
18
+ /**
19
+ * Remove an element from the track
20
+ * @param element The element to remove
21
+ */
22
+ removeElement(element: TrackElement): void;
23
+ /**
24
+ * Update an element in the track with validation
25
+ * @param element The element to update
26
+ * @returns true if element was updated successfully, throws ValidationError if validation fails
27
+ */
28
+ updateElement(element: TrackElement): boolean;
29
+ /**
30
+ * Get the track instance (for advanced operations)
31
+ * @returns The track instance
32
+ */
33
+ getTrack(): Track;
34
+ }
@@ -0,0 +1,29 @@
1
+ import { ElementVisitor } from './element-visitor';
2
+ import { VideoElement } from '../elements/video.element';
3
+ import { AudioElement } from '../elements/audio.element';
4
+ import { ImageElement } from '../elements/image.element';
5
+ import { TextElement } from '../elements/text.element';
6
+ import { CaptionElement } from '../elements/caption.element';
7
+ import { IconElement } from '../elements/icon.element';
8
+ import { CircleElement } from '../elements/circle.element';
9
+ import { RectElement } from '../elements/rect.element';
10
+ import { Track } from '../track/track';
11
+
12
+ /**
13
+ * ElementAdder visitor for adding elements to tracks
14
+ * Uses the visitor pattern to handle different element types
15
+ * Implements the Friend Class Pattern for explicit access control
16
+ */
17
+ export declare class ElementAdder implements ElementVisitor<Promise<boolean>> {
18
+ private track;
19
+ private trackFriend;
20
+ constructor(track: Track);
21
+ visitVideoElement(element: VideoElement): Promise<boolean>;
22
+ visitAudioElement(element: AudioElement): Promise<boolean>;
23
+ visitImageElement(element: ImageElement): Promise<boolean>;
24
+ visitTextElement(element: TextElement): Promise<boolean>;
25
+ visitCaptionElement(element: CaptionElement): Promise<boolean>;
26
+ visitIconElement(element: IconElement): Promise<boolean>;
27
+ visitCircleElement(element: CircleElement): Promise<boolean>;
28
+ visitRectElement(element: RectElement): Promise<boolean>;
29
+ }
@@ -0,0 +1,22 @@
1
+ import { ElementVisitor } from './element-visitor';
2
+ import { VideoElement } from '../elements/video.element';
3
+ import { AudioElement } from '../elements/audio.element';
4
+ import { ImageElement } from '../elements/image.element';
5
+ import { TextElement } from '../elements/text.element';
6
+ import { CaptionElement } from '../elements/caption.element';
7
+ import { RectElement } from '../elements/rect.element';
8
+ import { CircleElement } from '../elements/circle.element';
9
+ import { IconElement } from '../elements/icon.element';
10
+ import { TrackElement } from '../elements/base.element';
11
+
12
+ export declare class ElementCloner implements ElementVisitor<TrackElement> {
13
+ cloneElementProperties(srcElement: TrackElement, destElement: TrackElement): TrackElement;
14
+ visitVideoElement(element: VideoElement): TrackElement;
15
+ visitAudioElement(element: AudioElement): TrackElement;
16
+ visitImageElement(element: ImageElement): TrackElement;
17
+ visitTextElement(element: TextElement): TrackElement;
18
+ visitCaptionElement(element: CaptionElement): TrackElement;
19
+ visitRectElement(element: RectElement): TrackElement;
20
+ visitCircleElement(element: CircleElement): TrackElement;
21
+ visitIconElement(element: IconElement): TrackElement;
22
+ }
@@ -0,0 +1,23 @@
1
+ import { ElementJSON } from '../../types';
2
+ import { VideoElement } from '../elements/video.element';
3
+ import { AudioElement } from '../elements/audio.element';
4
+ import { ImageElement } from '../elements/image.element';
5
+ import { TextElement } from '../elements/text.element';
6
+ import { CaptionElement } from '../elements/caption.element';
7
+ import { IconElement } from '../elements/icon.element';
8
+ import { CircleElement } from '../elements/circle.element';
9
+ import { RectElement } from '../elements/rect.element';
10
+ import { TrackElement } from '../elements/base.element';
11
+
12
+ export declare class ElementDeserializer {
13
+ private static deserializeBaseElement;
14
+ static deserializeVideoElement(json: ElementJSON): VideoElement;
15
+ static deserializeAudioElement(json: ElementJSON): AudioElement;
16
+ static deserializeImageElement(json: ElementJSON): ImageElement;
17
+ static deserializeTextElement(json: ElementJSON): TextElement;
18
+ static deserializeCaptionElement(json: ElementJSON): CaptionElement;
19
+ static deserializeIconElement(json: ElementJSON): IconElement;
20
+ static deserializeCircleElement(json: ElementJSON): CircleElement;
21
+ static deserializeRectElement(json: ElementJSON): RectElement;
22
+ static fromJSON(json: ElementJSON): TrackElement | null;
23
+ }
@@ -0,0 +1,28 @@
1
+ import { ElementVisitor } from './element-visitor';
2
+ import { VideoElement } from '../elements/video.element';
3
+ import { AudioElement } from '../elements/audio.element';
4
+ import { ImageElement } from '../elements/image.element';
5
+ import { TextElement } from '../elements/text.element';
6
+ import { CaptionElement } from '../elements/caption.element';
7
+ import { IconElement } from '../elements/icon.element';
8
+ import { CircleElement } from '../elements/circle.element';
9
+ import { RectElement } from '../elements/rect.element';
10
+ import { Track } from '../track/track';
11
+
12
+ /**
13
+ * ElementRemover visitor for removing elements from tracks
14
+ * Uses the visitor pattern to handle different element types
15
+ * Implements the Friend Class Pattern for explicit access control
16
+ */
17
+ export declare class ElementRemover implements ElementVisitor<boolean> {
18
+ private trackFriend;
19
+ constructor(track: Track);
20
+ visitVideoElement(element: VideoElement): boolean;
21
+ visitAudioElement(element: AudioElement): boolean;
22
+ visitImageElement(element: ImageElement): boolean;
23
+ visitTextElement(element: TextElement): boolean;
24
+ visitCaptionElement(element: CaptionElement): boolean;
25
+ visitIconElement(element: IconElement): boolean;
26
+ visitCircleElement(element: CircleElement): boolean;
27
+ visitRectElement(element: RectElement): boolean;
28
+ }
@@ -0,0 +1,23 @@
1
+ import { ElementJSON } from '../../types';
2
+ import { ElementVisitor } from './element-visitor';
3
+ import { VideoElement } from '../elements/video.element';
4
+ import { AudioElement } from '../elements/audio.element';
5
+ import { ImageElement } from '../elements/image.element';
6
+ import { TextElement } from '../elements/text.element';
7
+ import { CaptionElement } from '../elements/caption.element';
8
+ import { RectElement } from '../elements/rect.element';
9
+ import { CircleElement } from '../elements/circle.element';
10
+ import { IconElement } from '../elements/icon.element';
11
+ import { TrackElement } from '../elements/base.element';
12
+
13
+ export declare class ElementSerializer implements ElementVisitor<ElementJSON> {
14
+ serializeElement(element: TrackElement): ElementJSON;
15
+ visitVideoElement(element: VideoElement): ElementJSON;
16
+ visitAudioElement(element: AudioElement): ElementJSON;
17
+ visitImageElement(element: ImageElement): ElementJSON;
18
+ visitTextElement(element: TextElement): ElementJSON;
19
+ visitCaptionElement(element: CaptionElement): ElementJSON;
20
+ visitIconElement(element: IconElement): ElementJSON;
21
+ visitCircleElement(element: CircleElement): ElementJSON;
22
+ visitRectElement(element: RectElement): ElementJSON;
23
+ }
@@ -0,0 +1,28 @@
1
+ import { ElementVisitor } from './element-visitor';
2
+ import { VideoElement } from '../elements/video.element';
3
+ import { AudioElement } from '../elements/audio.element';
4
+ import { ImageElement } from '../elements/image.element';
5
+ import { TextElement } from '../elements/text.element';
6
+ import { CaptionElement } from '../elements/caption.element';
7
+ import { RectElement } from '../elements/rect.element';
8
+ import { CircleElement } from '../elements/circle.element';
9
+ import { IconElement } from '../elements/icon.element';
10
+
11
+ export interface SplitResult {
12
+ firstElement: any;
13
+ secondElement: any;
14
+ success: boolean;
15
+ }
16
+ export declare class ElementSplitter implements ElementVisitor<SplitResult> {
17
+ private splitTime;
18
+ private elementCloner;
19
+ constructor(splitTime: number);
20
+ visitVideoElement(element: VideoElement): SplitResult;
21
+ visitAudioElement(element: AudioElement): SplitResult;
22
+ visitImageElement(element: ImageElement): SplitResult;
23
+ visitTextElement(element: TextElement): SplitResult;
24
+ visitCaptionElement(element: CaptionElement): SplitResult;
25
+ visitRectElement(element: RectElement): SplitResult;
26
+ visitCircleElement(element: CircleElement): SplitResult;
27
+ visitIconElement(element: IconElement): SplitResult;
28
+ }
@@ -0,0 +1,28 @@
1
+ import { ElementVisitor } from './element-visitor';
2
+ import { VideoElement } from '../elements/video.element';
3
+ import { AudioElement } from '../elements/audio.element';
4
+ import { ImageElement } from '../elements/image.element';
5
+ import { TextElement } from '../elements/text.element';
6
+ import { CaptionElement } from '../elements/caption.element';
7
+ import { IconElement } from '../elements/icon.element';
8
+ import { CircleElement } from '../elements/circle.element';
9
+ import { RectElement } from '../elements/rect.element';
10
+ import { Track } from '../track/track';
11
+
12
+ /**
13
+ * ElementUpdater visitor for updating elements in tracks
14
+ * Uses the visitor pattern to handle different element types
15
+ * Implements the Friend Class Pattern for explicit access control
16
+ */
17
+ export declare class ElementUpdater implements ElementVisitor<boolean> {
18
+ private trackFriend;
19
+ constructor(track: Track);
20
+ visitVideoElement(element: VideoElement): boolean;
21
+ visitAudioElement(element: AudioElement): boolean;
22
+ visitImageElement(element: ImageElement): boolean;
23
+ visitTextElement(element: TextElement): boolean;
24
+ visitCaptionElement(element: CaptionElement): boolean;
25
+ visitIconElement(element: IconElement): boolean;
26
+ visitCircleElement(element: CircleElement): boolean;
27
+ visitRectElement(element: RectElement): boolean;
28
+ }
@@ -0,0 +1,34 @@
1
+ import { ElementVisitor } from './element-visitor';
2
+ import { VideoElement } from '../elements/video.element';
3
+ import { AudioElement } from '../elements/audio.element';
4
+ import { ImageElement } from '../elements/image.element';
5
+ import { TextElement } from '../elements/text.element';
6
+ import { CaptionElement } from '../elements/caption.element';
7
+ import { IconElement } from '../elements/icon.element';
8
+ import { CircleElement } from '../elements/circle.element';
9
+ import { RectElement } from '../elements/rect.element';
10
+
11
+ export declare class ValidationError extends Error {
12
+ errors: string[];
13
+ warnings: string[];
14
+ constructor(message: string, errors: string[], warnings?: string[]);
15
+ }
16
+ export declare class ElementValidator implements ElementVisitor<boolean> {
17
+ private validateBasicProperties;
18
+ private validateTextElement;
19
+ private validateVideoElement;
20
+ private validateAudioElement;
21
+ private validateImageElement;
22
+ private validateCaptionElement;
23
+ private validateIconElement;
24
+ private validateCircleElement;
25
+ private validateRectElement;
26
+ visitVideoElement(element: VideoElement): boolean;
27
+ visitAudioElement(element: AudioElement): boolean;
28
+ visitImageElement(element: ImageElement): boolean;
29
+ visitTextElement(element: TextElement): boolean;
30
+ visitCaptionElement(element: CaptionElement): boolean;
31
+ visitIconElement(element: IconElement): boolean;
32
+ visitCircleElement(element: CircleElement): boolean;
33
+ visitRectElement(element: RectElement): boolean;
34
+ }
@@ -0,0 +1,19 @@
1
+ import { VideoElement } from '../elements/video.element';
2
+ import { AudioElement } from '../elements/audio.element';
3
+ import { ImageElement } from '../elements/image.element';
4
+ import { TextElement } from '../elements/text.element';
5
+ import { CaptionElement } from '../elements/caption.element';
6
+ import { IconElement } from '../elements/icon.element';
7
+ import { CircleElement } from '../elements/circle.element';
8
+ import { RectElement } from '../elements/rect.element';
9
+
10
+ export interface ElementVisitor<T> {
11
+ visitVideoElement(element: VideoElement): T;
12
+ visitAudioElement(element: AudioElement): T;
13
+ visitImageElement(element: ImageElement): T;
14
+ visitTextElement(element: TextElement): T;
15
+ visitCaptionElement(element: CaptionElement): T;
16
+ visitIconElement(element: IconElement): T;
17
+ visitCircleElement(element: CircleElement): T;
18
+ visitRectElement(element: RectElement): T;
19
+ }
@@ -0,0 +1,36 @@
1
+ import { TIMELINE_ELEMENT_TYPE } from './utils/constants';
2
+ import { TimelineEditor } from './core/editor/timeline.editor';
3
+ import { TimelineProvider, TimelineProviderProps } from './context/timeline-context';
4
+ import { Track } from './core/track/track';
5
+ import { CaptionElement } from './core/elements/caption.element';
6
+ import { RectElement } from './core/elements/rect.element';
7
+ import { TextElement } from './core/elements/text.element';
8
+ import { ImageElement } from './core/elements/image.element';
9
+ import { AudioElement } from './core/elements/audio.element';
10
+ import { CircleElement } from './core/elements/circle.element';
11
+ import { IconElement } from './core/elements/icon.element';
12
+ import { VideoElement } from './core/elements/video.element';
13
+ import { TrackElement } from './core/elements/base.element';
14
+ import { ElementAnimation } from './core/addOns/animation';
15
+ import { ElementFrameEffect } from './core/addOns/frame-effect';
16
+ import { ElementTextEffect } from './core/addOns/text-effect';
17
+
18
+ export { TrackElement, Track, CaptionElement, RectElement, TextElement, ImageElement, IconElement, AudioElement, CircleElement, VideoElement, ElementAnimation, ElementFrameEffect, ElementTextEffect };
19
+ export { TimelineProvider, TimelineEditor, };
20
+ export type { TimelineProviderProps };
21
+ export { TIMELINE_ELEMENT_TYPE };
22
+ export * from './types';
23
+ export * from './utils/constants';
24
+ export * from './utils/timeline.utils';
25
+ export * from './context/timeline-context';
26
+ export * from './core/track/track';
27
+ export * from './core/elements/base.element';
28
+ export * from './core/visitor/element-visitor';
29
+ export * from './core/visitor/element-serializer';
30
+ export * from './core/visitor/element-deserializer';
31
+ export * from './core/visitor/element-validator';
32
+ export * from './core/visitor/element-adder';
33
+ export * from './core/visitor/element-remover';
34
+ export * from './core/visitor/element-updater';
35
+ export * from './core/visitor/element-splitter';
36
+ export * from './core/visitor/element-cloner';