@aura3d/editor-runtime 1.0.6 → 1.3.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 (91) hide show
  1. package/dist/AnimationSceneEditor.d.ts +111 -0
  2. package/dist/AnimationSceneEditor.d.ts.map +1 -0
  3. package/dist/AnimationSceneEditor.js +285 -0
  4. package/dist/AnimationSceneEditor.js.map +1 -0
  5. package/dist/AssetDropZone.d.ts +52 -0
  6. package/dist/AssetDropZone.d.ts.map +1 -0
  7. package/dist/AssetDropZone.js +115 -0
  8. package/dist/AssetDropZone.js.map +1 -0
  9. package/dist/CameraPathEditor.d.ts +48 -0
  10. package/dist/CameraPathEditor.d.ts.map +1 -0
  11. package/dist/CameraPathEditor.js +181 -0
  12. package/dist/CameraPathEditor.js.map +1 -0
  13. package/dist/CartoonSceneEditor.d.ts +111 -0
  14. package/dist/CartoonSceneEditor.d.ts.map +1 -0
  15. package/dist/CartoonSceneEditor.js +285 -0
  16. package/dist/CartoonSceneEditor.js.map +1 -0
  17. package/dist/CurveEditor.d.ts +38 -0
  18. package/dist/CurveEditor.d.ts.map +1 -0
  19. package/dist/CurveEditor.js +112 -0
  20. package/dist/CurveEditor.js.map +1 -0
  21. package/dist/EpisodeReviewPanel.d.ts +67 -0
  22. package/dist/EpisodeReviewPanel.d.ts.map +1 -0
  23. package/dist/EpisodeReviewPanel.js +162 -0
  24. package/dist/EpisodeReviewPanel.js.map +1 -0
  25. package/dist/EventTrackEditor.d.ts +54 -0
  26. package/dist/EventTrackEditor.d.ts.map +1 -0
  27. package/dist/EventTrackEditor.js +124 -0
  28. package/dist/EventTrackEditor.js.map +1 -0
  29. package/dist/KeyframeEditor.d.ts +49 -0
  30. package/dist/KeyframeEditor.d.ts.map +1 -0
  31. package/dist/KeyframeEditor.js +161 -0
  32. package/dist/KeyframeEditor.js.map +1 -0
  33. package/dist/MultiUserReviewWorkflow.d.ts +77 -0
  34. package/dist/MultiUserReviewWorkflow.d.ts.map +1 -0
  35. package/dist/MultiUserReviewWorkflow.js +162 -0
  36. package/dist/MultiUserReviewWorkflow.js.map +1 -0
  37. package/dist/NonlinearAnimationEditor.d.ts +81 -0
  38. package/dist/NonlinearAnimationEditor.d.ts.map +1 -0
  39. package/dist/NonlinearAnimationEditor.js +180 -0
  40. package/dist/NonlinearAnimationEditor.js.map +1 -0
  41. package/dist/PropertyPanel.d.ts +21 -0
  42. package/dist/PropertyPanel.d.ts.map +1 -0
  43. package/dist/PropertyPanel.js +72 -0
  44. package/dist/PropertyPanel.js.map +1 -0
  45. package/dist/RenderQueuePanel.d.ts +38 -0
  46. package/dist/RenderQueuePanel.d.ts.map +1 -0
  47. package/dist/RenderQueuePanel.js +72 -0
  48. package/dist/RenderQueuePanel.js.map +1 -0
  49. package/dist/SceneOutliner.d.ts +19 -0
  50. package/dist/SceneOutliner.d.ts.map +1 -0
  51. package/dist/SceneOutliner.js +64 -0
  52. package/dist/SceneOutliner.js.map +1 -0
  53. package/dist/TimelineEditorController.d.ts +102 -0
  54. package/dist/TimelineEditorController.d.ts.map +1 -0
  55. package/dist/TimelineEditorController.js +449 -0
  56. package/dist/TimelineEditorController.js.map +1 -0
  57. package/dist/TimelineTrackTypes.d.ts +25 -0
  58. package/dist/TimelineTrackTypes.d.ts.map +1 -0
  59. package/dist/TimelineTrackTypes.js +48 -0
  60. package/dist/TimelineTrackTypes.js.map +1 -0
  61. package/dist/TimelineUI.d.ts +27 -0
  62. package/dist/TimelineUI.d.ts.map +1 -0
  63. package/dist/TimelineUI.js +123 -0
  64. package/dist/TimelineUI.js.map +1 -0
  65. package/dist/VisualReviewDashboard.d.ts +43 -0
  66. package/dist/VisualReviewDashboard.d.ts.map +1 -0
  67. package/dist/VisualReviewDashboard.js +47 -0
  68. package/dist/VisualReviewDashboard.js.map +1 -0
  69. package/dist/index.d.ts +32 -0
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +16 -0
  72. package/dist/index.js.map +1 -1
  73. package/package.json +5 -4
  74. package/src/AnimationSceneEditor.ts +368 -0
  75. package/src/AssetDropZone.ts +144 -0
  76. package/src/CameraPathEditor.ts +223 -0
  77. package/src/CurveEditor.ts +152 -0
  78. package/src/EpisodeReviewPanel.ts +236 -0
  79. package/src/EventTrackEditor.ts +169 -0
  80. package/src/KeyframeEditor.ts +214 -0
  81. package/src/MultiUserReviewWorkflow.ts +229 -0
  82. package/src/NonlinearAnimationEditor.ts +262 -0
  83. package/src/PropertyPanel.ts +82 -0
  84. package/src/RenderQueuePanel.ts +106 -0
  85. package/src/SceneOutliner.ts +78 -0
  86. package/src/TimelineEditorController.ts +525 -0
  87. package/src/TimelineTrackTypes.ts +89 -0
  88. package/src/TimelineUI.ts +153 -0
  89. package/src/VisualReviewDashboard.ts +87 -0
  90. package/src/index.ts +55 -0
  91. package/tests/editor-runtime.test.ts +490 -0
@@ -0,0 +1,153 @@
1
+ import { TimelineEditorController, type TimelineEditorSnapshot } from "./TimelineEditorController";
2
+
3
+ export interface TimelineUIOptions {
4
+ readonly document?: Document;
5
+ readonly className?: string;
6
+ readonly onRender?: (snapshot: TimelineEditorSnapshot) => void;
7
+ }
8
+
9
+ export interface TimelineUIRenderResult {
10
+ readonly root: HTMLElement;
11
+ readonly snapshot: TimelineEditorSnapshot;
12
+ dispose(): void;
13
+ render(): TimelineUIRenderResult;
14
+ }
15
+
16
+ export class TimelineUI {
17
+ private readonly documentRef: Document;
18
+ private readonly listeners: (() => void)[] = [];
19
+
20
+ constructor(
21
+ private readonly controller: TimelineEditorController,
22
+ private readonly container: HTMLElement,
23
+ private readonly options: TimelineUIOptions = {}
24
+ ) {
25
+ this.documentRef = options.document ?? container.ownerDocument;
26
+ }
27
+
28
+ render(): TimelineUIRenderResult {
29
+ this.dispose();
30
+ const snapshot = this.controller.snapshot();
31
+ this.container.replaceChildren();
32
+ this.container.className = this.options.className ?? "aura-timeline";
33
+ this.container.tabIndex = this.container.tabIndex >= 0 ? this.container.tabIndex : 0;
34
+
35
+ const toolbar = this.el("div", "aura-timeline__toolbar");
36
+ toolbar.append(
37
+ this.button("Play", () => {
38
+ this.controller.togglePlayback();
39
+ this.render();
40
+ }),
41
+ this.button("Start", () => {
42
+ this.controller.scrubTo(0);
43
+ this.render();
44
+ }),
45
+ this.button("End", () => {
46
+ this.controller.scrubTo(this.controller.timeline.duration);
47
+ this.render();
48
+ })
49
+ );
50
+
51
+ const ruler = this.el("div", "aura-timeline__ruler");
52
+ const durationPixels = Math.max(1, this.controller.timeline.duration * snapshot.zoomPixelsPerSecond);
53
+ ruler.style.width = `${durationPixels}px`;
54
+ ruler.append(this.marker("playhead", this.controller.timeline.currentTime));
55
+ for (let second = 0; second <= Math.ceil(this.controller.timeline.duration); second += 1) {
56
+ const tick = this.marker("tick", second);
57
+ tick.textContent = `${second}s`;
58
+ ruler.append(tick);
59
+ }
60
+
61
+ const tracks = this.el("div", "aura-timeline__tracks");
62
+ for (const track of this.controller.timeline.tracks) {
63
+ const trackSnapshot = snapshot.tracks.find((candidate) => candidate.id === track.id);
64
+ const lane = this.el("div", "aura-timeline__track");
65
+ lane.dataset.trackId = track.id;
66
+ lane.dataset.trackKind = trackSnapshot?.kind ?? "generic";
67
+ lane.dataset.waveform = String(trackSnapshot?.kind === "dialogue" || trackSnapshot?.kind === "audio" || trackSnapshot?.kind === "sfx" || trackSnapshot?.kind === "viseme");
68
+ lane.style.minHeight = `${trackSnapshot?.laneHeight ?? 32}px`;
69
+ const label = this.el("div", "aura-timeline__track-label");
70
+ label.textContent = track.name;
71
+ const clips = this.el("div", "aura-timeline__clips");
72
+ clips.style.width = `${durationPixels}px`;
73
+ for (const clip of track.clips) {
74
+ const clipEl = this.el("button", "aura-timeline__clip") as HTMLButtonElement;
75
+ clipEl.type = "button";
76
+ clipEl.dataset.clipId = clip.id;
77
+ clipEl.textContent = clip.name;
78
+ clipEl.style.left = `${clip.startTime * snapshot.zoomPixelsPerSecond}px`;
79
+ clipEl.style.width = `${Math.max(8, clip.duration * snapshot.zoomPixelsPerSecond)}px`;
80
+ clipEl.style.background = trackSnapshot?.color ?? "#334155";
81
+ if (snapshot.selectedIds.includes(clip.id)) clipEl.dataset.selected = "true";
82
+ const click = (event: MouseEvent): void => {
83
+ if (trackSnapshot?.kind === "shot") {
84
+ this.controller.jumpToShot(clip.id);
85
+ }
86
+ this.controller.selectClip(clip.id, event.shiftKey);
87
+ this.render();
88
+ };
89
+ clipEl.addEventListener("click", click);
90
+ this.listeners.push(() => clipEl.removeEventListener("click", click));
91
+ clips.append(clipEl);
92
+ }
93
+ lane.append(label, clips);
94
+ tracks.append(lane);
95
+ }
96
+
97
+ const minimap = this.el("div", "aura-timeline__minimap");
98
+ minimap.style.setProperty("--aura-timeline-duration-px", `${durationPixels}px`);
99
+ minimap.textContent = `${snapshot.timeline.clipCount} clips`;
100
+
101
+ const keydown = (event: KeyboardEvent): void => {
102
+ if (this.controller.handleKeyboardShortcut(event.key)) {
103
+ event.preventDefault();
104
+ this.render();
105
+ }
106
+ };
107
+ this.container.addEventListener("keydown", keydown);
108
+ this.listeners.push(() => this.container.removeEventListener("keydown", keydown));
109
+
110
+ this.container.append(toolbar, ruler, tracks, minimap);
111
+ this.options.onRender?.(snapshot);
112
+ return {
113
+ root: this.container,
114
+ snapshot,
115
+ dispose: () => this.dispose(),
116
+ render: () => this.render()
117
+ };
118
+ }
119
+
120
+ dispose(): void {
121
+ for (const dispose of this.listeners.splice(0)) dispose();
122
+ }
123
+
124
+ private button(label: string, onClick: () => void): HTMLButtonElement {
125
+ const button = this.el("button", "aura-timeline__button") as HTMLButtonElement;
126
+ button.type = "button";
127
+ button.textContent = label;
128
+ button.addEventListener("click", onClick);
129
+ this.listeners.push(() => button.removeEventListener("click", onClick));
130
+ return button;
131
+ }
132
+
133
+ private marker(kind: string, time: number): HTMLElement {
134
+ const marker = this.el("div", `aura-timeline__${kind}`);
135
+ marker.style.left = `${time * this.controller.zoomPixelsPerSecond}px`;
136
+ marker.dataset.time = String(time);
137
+ return marker;
138
+ }
139
+
140
+ private el(tagName: string, className: string): HTMLElement {
141
+ const element = this.documentRef.createElement(tagName);
142
+ element.className = className;
143
+ return element;
144
+ }
145
+ }
146
+
147
+ export function renderTimelineUI(
148
+ controller: TimelineEditorController,
149
+ container: HTMLElement,
150
+ options: TimelineUIOptions = {}
151
+ ): TimelineUIRenderResult {
152
+ return new TimelineUI(controller, container, options).render();
153
+ }
@@ -0,0 +1,87 @@
1
+ import type {
2
+ EpisodeReviewManualVisemeEdit,
3
+ EpisodeReviewNote,
4
+ EpisodeReviewPanelSnapshot,
5
+ EpisodeReviewRejectedFrame,
6
+ EpisodeReviewWaveformLane
7
+ } from "./EpisodeReviewPanel";
8
+
9
+ export interface VisualReviewDashboardPackage {
10
+ readonly packageId: string;
11
+ readonly status: EpisodeReviewPanelSnapshot["status"];
12
+ readonly failedFrameCount: number;
13
+ readonly noteCount: number;
14
+ readonly waveformLaneCount: number;
15
+ readonly manualVisemeEditCount: number;
16
+ readonly approvalBlocked: boolean;
17
+ }
18
+
19
+ export interface VisualReviewDashboardSnapshot {
20
+ readonly kind: "visual-review-dashboard";
21
+ readonly packageCount: number;
22
+ readonly packages: readonly VisualReviewDashboardPackage[];
23
+ readonly failedFrames: readonly (EpisodeReviewRejectedFrame & { readonly packageId: string })[];
24
+ readonly reviewerNotes: readonly (EpisodeReviewNote & { readonly packageId: string })[];
25
+ readonly waveformLanes: readonly (EpisodeReviewWaveformLane & { readonly packageId: string })[];
26
+ readonly manualVisemeEdits: readonly (EpisodeReviewManualVisemeEdit & { readonly packageId: string })[];
27
+ readonly approvalBlockedPackageIds: readonly string[];
28
+ readonly evidence: {
29
+ readonly listsFailedFrames: boolean;
30
+ readonly listsReviewerNotes: boolean;
31
+ readonly waveformReview: boolean;
32
+ readonly manualVisemeEdits: boolean;
33
+ readonly approvalBlocking: boolean;
34
+ };
35
+ }
36
+
37
+ export class VisualReviewDashboard {
38
+ private reviews: readonly EpisodeReviewPanelSnapshot[];
39
+
40
+ constructor(reviews: readonly EpisodeReviewPanelSnapshot[]) {
41
+ this.reviews = reviews.map((review) => ({ ...review }));
42
+ }
43
+
44
+ setReviews(reviews: readonly EpisodeReviewPanelSnapshot[]): VisualReviewDashboardSnapshot {
45
+ this.reviews = reviews.map((review) => ({ ...review }));
46
+ return this.snapshot();
47
+ }
48
+
49
+ snapshot(): VisualReviewDashboardSnapshot {
50
+ const packages = this.reviews.map((review) => ({
51
+ packageId: review.packageId,
52
+ status: review.status,
53
+ failedFrameCount: review.rejectedFrameCount,
54
+ noteCount: review.noteCount,
55
+ waveformLaneCount: review.waveformLaneCount,
56
+ manualVisemeEditCount: review.manualVisemeEditCount,
57
+ approvalBlocked: review.rejectedFrameCount > 0
58
+ }));
59
+ const failedFrames = this.reviews.flatMap((review) => review.rejectedFrames.map((frame) => ({ ...frame, packageId: review.packageId })));
60
+ const reviewerNotes = this.reviews.flatMap((review) => review.notes.map((note) => ({ ...note, packageId: review.packageId })));
61
+ const waveformLanes = this.reviews.flatMap((review) => (review.waveformLanes ?? []).map((lane) => ({ ...lane, packageId: review.packageId })));
62
+ const manualVisemeEdits = this.reviews.flatMap((review) => (review.manualVisemeEdits ?? []).map((edit) => ({ ...edit, packageId: review.packageId })));
63
+ const approvalBlockedPackageIds = packages.filter((item) => item.approvalBlocked).map((item) => item.packageId);
64
+
65
+ return {
66
+ kind: "visual-review-dashboard",
67
+ packageCount: packages.length,
68
+ packages,
69
+ failedFrames,
70
+ reviewerNotes,
71
+ waveformLanes,
72
+ manualVisemeEdits,
73
+ approvalBlockedPackageIds,
74
+ evidence: {
75
+ listsFailedFrames: failedFrames.length > 0,
76
+ listsReviewerNotes: reviewerNotes.length > 0,
77
+ waveformReview: waveformLanes.length > 0,
78
+ manualVisemeEdits: manualVisemeEdits.length > 0,
79
+ approvalBlocking: approvalBlockedPackageIds.length > 0
80
+ }
81
+ };
82
+ }
83
+ }
84
+
85
+ export function createVisualReviewDashboard(reviews: readonly EpisodeReviewPanelSnapshot[]): VisualReviewDashboard {
86
+ return new VisualReviewDashboard(reviews);
87
+ }
package/src/index.ts CHANGED
@@ -1,9 +1,21 @@
1
1
  export type { Command, CommandContext } from "./Command";
2
2
  export { CommandHistory, CommandTransactionError } from "./CommandHistory";
3
+ export { AssetDropZone, readAssetFromDataTransfer, serializeAssetForDrag } from "./AssetDropZone";
4
+ export type { AssetDropPlacement, AssetDropResult, AssetDropZoneOptions, AnimationAssetCategory, AnimationEditorAssetReference } from "./AssetDropZone";
5
+ export { CameraPathEditor, createCameraPathEditor, readCameraPathKeyframes } from "./CameraPathEditor";
6
+ export type { EditorCameraPathEvidence, EditorCameraPathKeyframe, EditorCameraPathSample, EditorCameraVector3 } from "./CameraPathEditor";
7
+ export { AnimationSceneEditor, createAnimationSceneNode } from "./AnimationSceneEditor";
8
+ export type { AnimationSceneEditorOptions, AnimationSceneEditorSnapshot, AnimationSceneEpisodeSnapshot, AnimationSceneEpisodeState, AnimationSceneNode, AnimationSceneTransform } from "./AnimationSceneEditor";
9
+ export { CurveEditor } from "./CurveEditor";
10
+ export type { TimelineCurveEvidence, TimelineCurvePoint, TimelineCurveSample } from "./CurveEditor";
3
11
  export { DiagnosticsOverlayModel } from "./DiagnosticsOverlayModel";
4
12
  export type { EditorDiagnosticsInput, EditorDiagnosticsResource, EditorDiagnosticsSnapshot } from "./DiagnosticsOverlayModel";
5
13
  export { EditorRuntime } from "./EditorRuntime";
6
14
  export type { EditorMode, EditorRuntimeSnapshot } from "./EditorRuntime";
15
+ export { EventTrackEditor, createEventTrackEditor } from "./EventTrackEditor";
16
+ export type { AddEventMarkerOptions, EventMarkerView, EventTrackEditorOptions, EventTrackLane } from "./EventTrackEditor";
17
+ export { EpisodeReviewPanel, createEpisodeReviewPanel } from "./EpisodeReviewPanel";
18
+ export type { EpisodeReviewManualVisemeEdit, EpisodeReviewNote, EpisodeReviewPanelSnapshot, EpisodeReviewPanelState, EpisodeReviewRejectedFrame, EpisodeReviewStatus, EpisodeReviewWaveformLane } from "./EpisodeReviewPanel";
7
19
  export { EditorStateModel, createMemoryEditorStateStorage } from "./EditorStateModel";
8
20
  export type { EditorGridSnapSettings, EditorStateChange, EditorStateSnapshot, EditorStateStorage, EditorViewportSettings } from "./EditorStateModel";
9
21
  export { EditorPluginHost } from "./EditorPluginHost";
@@ -22,6 +34,15 @@ export { HierarchyModel } from "./HierarchyModel";
22
34
  export type { HierarchyLikeNode, HierarchyNodeDescriptor } from "./HierarchyModel";
23
35
  export { InspectorModel } from "./InspectorModel";
24
36
  export type { InspectorEditableValue, InspectorProperty } from "./InspectorModel";
37
+ export { KeyframeEditor, encodeTimelineKeyframes, readTimelineKeyframes, timelineKeyframesByProperty } from "./KeyframeEditor";
38
+ export type {
39
+ CreateTimelineKeyframeOptions,
40
+ PasteTimelineKeyframesOptions,
41
+ TimelineBezierHandle,
42
+ TimelineKeyframe,
43
+ TimelineKeyframeInterpolation,
44
+ TimelineKeyframeValue
45
+ } from "./KeyframeEditor";
25
46
  export { sampleLocalizationAccessibilityFixture } from "./LocalizationAccessibilityFixtures";
26
47
  export type {
27
48
  EditorAccessibilityElementSample,
@@ -34,14 +55,40 @@ export type {
34
55
  } from "./LocalizationAccessibilityFixtures";
35
56
  export { MaterialVariantWorkflow } from "./MaterialVariantWorkflow";
36
57
  export type { MaterialVariantRenderOptions, MaterialVariantState } from "./MaterialVariantWorkflow";
58
+ export { MultiUserReviewWorkflow, createMultiUserReviewWorkflow } from "./MultiUserReviewWorkflow";
59
+ export type {
60
+ MultiUserReviewWorkflowSnapshot,
61
+ MultiUserReviewWorkflowState,
62
+ ReviewDecision,
63
+ ReviewDecisionStatus,
64
+ ReviewParticipant,
65
+ ReviewParticipantRole,
66
+ ReviewThread,
67
+ ReviewWorkflowStatus
68
+ } from "./MultiUserReviewWorkflow";
69
+ export { NonlinearAnimationEditor, createNonlinearAnimationEditor } from "./NonlinearAnimationEditor";
70
+ export type {
71
+ NonlinearAnimationEditorSnapshot,
72
+ NonlinearAnimationEditorState,
73
+ NonlinearBinAsset,
74
+ NonlinearBinAssetKind,
75
+ NonlinearSequenceConfig,
76
+ NonlinearSequenceSnapshot
77
+ } from "./NonlinearAnimationEditor";
37
78
  export { PickingService } from "./PickingService";
38
79
  export type { EditorPickHit, EditorPickTarget, EditorPickingColorId, EditorPickingEvidenceSnapshot } from "./PickingService";
39
80
  export { PlayModeBridge } from "./PlayModeBridge";
40
81
  export type { SnapshotAdapter } from "./PlayModeBridge";
41
82
  export { PrefabRegistry, validatePrefab } from "./PrefabRegistry";
42
83
  export type { CreatePrefabOptions, EditorPrefab, EditorPrefabNodeBase, EditorPrefabSchemaVersion, InstantiatePrefabOptions } from "./PrefabRegistry";
84
+ export { PropertyPanel } from "./PropertyPanel";
85
+ export type { PropertyPanelField, PropertyPanelOptions } from "./PropertyPanel";
43
86
  export { RotateGizmo } from "./RotateGizmo";
87
+ export { RenderQueuePanel, createRenderQueuePanel } from "./RenderQueuePanel";
88
+ export type { RenderQueuePanelItem, RenderQueuePanelItemStatus, RenderQueuePanelSnapshot } from "./RenderQueuePanel";
44
89
  export { ScaleGizmo } from "./ScaleGizmo";
90
+ export { SceneOutliner } from "./SceneOutliner";
91
+ export type { SceneOutlinerItem, SceneOutlinerOptions } from "./SceneOutliner";
45
92
  export { Selection } from "./Selection";
46
93
  export type { SelectionChange, SelectionId, SelectionListener } from "./Selection";
47
94
  export { createOldBranchShaderGraphFixture } from "./ShaderGraphModel";
@@ -63,6 +110,8 @@ export type {
63
110
  TimelineRuntimeTargetSnapshot
64
111
  } from "./TimelineRuntimeBridge";
65
112
  export { TranslateGizmo } from "./TranslateGizmo";
113
+ export { TimelineEditorController } from "./TimelineEditorController";
114
+ export type { TimelineEditorClipboard, TimelineEditorControllerOptions, TimelineEditorSnapshot, TimelineRoutePlaybackBinding } from "./TimelineEditorController";
66
115
  export { TimelineClip, TimelineModel, TimelineTrack } from "./TimelineModel";
67
116
  export type {
68
117
  TimelineActiveClipSnapshot,
@@ -76,6 +125,12 @@ export type {
76
125
  TimelineTrackConfig,
77
126
  TimelineTrackSnapshot
78
127
  } from "./TimelineModel";
128
+ export { TIMELINE_TRACK_TYPES, createTimelineTrackConfig, timelineTrackKindFromConfig, timelineTrackTypeDefinition } from "./TimelineTrackTypes";
129
+ export type { CreateTimelineTrackConfigOptions, TimelineEditorTrackKind, TimelineTrackTypeDefinition } from "./TimelineTrackTypes";
130
+ export { TimelineUI, renderTimelineUI } from "./TimelineUI";
131
+ export type { TimelineUIOptions, TimelineUIRenderResult } from "./TimelineUI";
132
+ export { VisualReviewDashboard, createVisualReviewDashboard } from "./VisualReviewDashboard";
133
+ export type { VisualReviewDashboardPackage, VisualReviewDashboardSnapshot } from "./VisualReviewDashboard";
79
134
  export { CreateNodeCommand } from "./commands/CreateNodeCommand";
80
135
  export type { NodeContainer } from "./commands/CreateNodeCommand";
81
136
  export { DeleteNodeCommand } from "./commands/DeleteNodeCommand";