@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.
- package/README.md +175 -0
- package/dist/context/timeline-context.d.ts +33 -0
- package/dist/context/undo-redo-context.d.ts +21 -0
- package/dist/core/addOns/animation.d.ts +24 -0
- package/dist/core/addOns/frame-effect.d.ts +14 -0
- package/dist/core/addOns/text-effect.d.ts +19 -0
- package/dist/core/editor/timeline.editor.d.ts +94 -0
- package/dist/core/elements/audio.element.d.ts +20 -0
- package/dist/core/elements/base.element.d.ts +35 -0
- package/dist/core/elements/caption.element.d.ts +10 -0
- package/dist/core/elements/circle.element.d.ts +13 -0
- package/dist/core/elements/icon.element.d.ts +9 -0
- package/dist/core/elements/image.element.d.ts +32 -0
- package/dist/core/elements/rect.element.d.ts +11 -0
- package/dist/core/elements/text.element.d.ts +26 -0
- package/dist/core/elements/video.element.d.ts +41 -0
- package/dist/core/track/track.d.ts +77 -0
- package/dist/core/track/track.friend.d.ts +34 -0
- package/dist/core/visitor/element-adder.d.ts +29 -0
- package/dist/core/visitor/element-cloner.d.ts +22 -0
- package/dist/core/visitor/element-deserializer.d.ts +23 -0
- package/dist/core/visitor/element-remover.d.ts +28 -0
- package/dist/core/visitor/element-serializer.d.ts +23 -0
- package/dist/core/visitor/element-splitter.d.ts +28 -0
- package/dist/core/visitor/element-updater.d.ts +28 -0
- package/dist/core/visitor/element-validator.d.ts +34 -0
- package/dist/core/visitor/element-visitor.d.ts +19 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +2630 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2628 -0
- package/dist/index.mjs.map +1 -0
- package/dist/services/data.service.d.ts +25 -0
- package/dist/types/index.d.ts +169 -0
- package/dist/utils/constants.d.ts +55 -0
- package/dist/utils/register-editor.d.ts +8 -0
- package/dist/utils/timeline.utils.d.ts +11 -0
- 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
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -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';
|