@r2digisolutions/components 0.1.7 → 0.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 (350) hide show
  1. package/dist/components/atoms/IconButton/IconButton.svelte +1 -1
  2. package/dist/components/atoms/MediaKindIcon/MediaKindIcon.stories.js +8 -0
  3. package/dist/components/atoms/MediaKindIcon/MediaKindIcon.svelte +122 -0
  4. package/dist/components/atoms/MediaKindIcon/MediaKindIcon.svelte.d.ts +11 -0
  5. package/dist/components/atoms/MediaKindIcon/MediaKindIconStory.svelte +12 -0
  6. package/dist/components/atoms/MediaKindIcon/MediaKindIconStory.svelte.d.ts +18 -0
  7. package/dist/components/atoms/PanKnob/PanKnob.stories.d.ts +9 -0
  8. package/dist/components/atoms/PanKnob/PanKnob.stories.js +8 -0
  9. package/dist/components/atoms/PanKnob/PanKnob.svelte +218 -0
  10. package/dist/components/atoms/PanKnob/PanKnob.svelte.d.ts +19 -0
  11. package/dist/components/atoms/PanKnob/PanKnobStory.svelte +15 -0
  12. package/dist/components/atoms/PanKnob/PanKnobStory.svelte.d.ts +3 -0
  13. package/dist/components/atoms/Playhead/Playhead.stories.js +8 -0
  14. package/dist/components/atoms/Playhead/Playhead.svelte +98 -0
  15. package/dist/components/atoms/Playhead/Playhead.svelte.d.ts +21 -0
  16. package/dist/components/atoms/Playhead/PlayheadStory.svelte +9 -0
  17. package/dist/components/atoms/Playhead/PlayheadStory.svelte.d.ts +18 -0
  18. package/dist/components/atoms/TimeRuler/TimeRuler.stories.js +8 -0
  19. package/dist/components/atoms/TimeRuler/TimeRuler.svelte +117 -0
  20. package/dist/components/atoms/TimeRuler/TimeRuler.svelte.d.ts +17 -0
  21. package/dist/components/atoms/TimeRuler/TimeRulerStory.svelte +7 -0
  22. package/dist/components/atoms/TimeRuler/TimeRulerStory.svelte.d.ts +18 -0
  23. package/dist/components/atoms/TimelineGrid/TimelineGrid.stories.js +8 -0
  24. package/dist/components/atoms/TimelineGrid/TimelineGrid.svelte +39 -0
  25. package/dist/components/atoms/TimelineGrid/TimelineGrid.svelte.d.ts +11 -0
  26. package/dist/components/atoms/TimelineGrid/TimelineGridStory.svelte +7 -0
  27. package/dist/components/atoms/TimelineGrid/TimelineGridStory.svelte.d.ts +18 -0
  28. package/dist/components/atoms/Tooltip/Tooltip.svelte +1 -1
  29. package/dist/components/atoms/TrimHandle/TrimHandle.stories.js +8 -0
  30. package/dist/components/atoms/TrimHandle/TrimHandle.svelte +63 -0
  31. package/dist/components/atoms/TrimHandle/TrimHandle.svelte.d.ts +12 -0
  32. package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte +11 -0
  33. package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte.d.ts +18 -0
  34. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.d.ts +9 -0
  35. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.js +8 -0
  36. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte +102 -0
  37. package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte.d.ts +20 -0
  38. package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte +34 -0
  39. package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte.d.ts +3 -0
  40. package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte +97 -61
  41. package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte.d.ts +2 -0
  42. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.stories.js +8 -0
  43. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte +117 -0
  44. package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte.d.ts +23 -0
  45. package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte +18 -0
  46. package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte.d.ts +18 -0
  47. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.stories.js +8 -0
  48. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte +858 -0
  49. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte.d.ts +43 -0
  50. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte +7 -0
  51. package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte.d.ts +18 -0
  52. package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.d.ts +9 -0
  53. package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.js +8 -0
  54. package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte +1140 -0
  55. package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte.d.ts +28 -0
  56. package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte +20 -0
  57. package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte.d.ts +3 -0
  58. package/dist/components/molecules/ColorPicker/ColorPicker.svelte +46 -5
  59. package/dist/components/molecules/ColorPicker/ColorPicker.svelte.d.ts +2 -0
  60. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.d.ts +9 -0
  61. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.js +8 -0
  62. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte +108 -0
  63. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte.d.ts +18 -0
  64. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte +15 -0
  65. package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte.d.ts +3 -0
  66. package/dist/components/molecules/ConflictResolver/ConflictResolver.stories.js +8 -0
  67. package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte +73 -0
  68. package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte.d.ts +16 -0
  69. package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte +11 -0
  70. package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte.d.ts +18 -0
  71. package/dist/components/molecules/ContextMenu/ContextMenu.svelte +237 -66
  72. package/dist/components/molecules/ContextMenu/ContextMenu.svelte.d.ts +9 -0
  73. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.d.ts +9 -0
  74. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.js +8 -0
  75. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte +56 -0
  76. package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte.d.ts +12 -0
  77. package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte +12 -0
  78. package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte.d.ts +3 -0
  79. package/dist/components/molecules/FilterList/FilterList.stories.d.ts +9 -0
  80. package/dist/components/molecules/FilterList/FilterList.stories.js +8 -0
  81. package/dist/components/molecules/FilterList/FilterList.svelte +101 -0
  82. package/dist/components/molecules/FilterList/FilterList.svelte.d.ts +18 -0
  83. package/dist/components/molecules/FilterList/FilterListStory.svelte +31 -0
  84. package/dist/components/molecules/FilterList/FilterListStory.svelte.d.ts +3 -0
  85. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.d.ts +9 -0
  86. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.js +8 -0
  87. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte +109 -0
  88. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte.d.ts +20 -0
  89. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte +18 -0
  90. package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte.d.ts +3 -0
  91. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.stories.js +8 -0
  92. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte +50 -0
  93. package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte.d.ts +11 -0
  94. package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte +13 -0
  95. package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte.d.ts +18 -0
  96. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.stories.js +8 -0
  97. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte +380 -0
  98. package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte.d.ts +33 -0
  99. package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte +14 -0
  100. package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte.d.ts +18 -0
  101. package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.d.ts +9 -0
  102. package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.js +8 -0
  103. package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte +399 -0
  104. package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte.d.ts +37 -0
  105. package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte +24 -0
  106. package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte.d.ts +3 -0
  107. package/dist/components/molecules/MediaStage/MediaStage.stories.d.ts +9 -0
  108. package/dist/components/molecules/MediaStage/MediaStage.stories.js +8 -0
  109. package/dist/components/molecules/MediaStage/MediaStage.svelte +1498 -0
  110. package/dist/components/molecules/MediaStage/MediaStage.svelte.d.ts +45 -0
  111. package/dist/components/molecules/MediaStage/MediaStageStory.svelte +35 -0
  112. package/dist/components/molecules/MediaStage/MediaStageStory.svelte.d.ts +3 -0
  113. package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.d.ts +9 -0
  114. package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.js +8 -0
  115. package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte +441 -0
  116. package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte.d.ts +39 -0
  117. package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte +20 -0
  118. package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte.d.ts +3 -0
  119. package/dist/components/molecules/MixerChannel/MixerChannel.stories.d.ts +9 -0
  120. package/dist/components/molecules/MixerChannel/MixerChannel.stories.js +8 -0
  121. package/dist/components/molecules/MixerChannel/MixerChannel.svelte +92 -0
  122. package/dist/components/molecules/MixerChannel/MixerChannel.svelte.d.ts +11 -0
  123. package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte +13 -0
  124. package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte.d.ts +3 -0
  125. package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte +454 -0
  126. package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte.d.ts +8 -0
  127. package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte +26 -0
  128. package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte.d.ts +22 -0
  129. package/dist/components/molecules/NodeGraph/NodeGraph.stories.d.ts +12 -0
  130. package/dist/components/molecules/NodeGraph/NodeGraph.stories.js +9 -0
  131. package/dist/components/molecules/NodeGraph/NodeGraph.svelte +1409 -0
  132. package/dist/components/molecules/NodeGraph/NodeGraph.svelte.d.ts +33 -0
  133. package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte +90 -0
  134. package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte.d.ts +3 -0
  135. package/dist/components/molecules/NodePalette/NodePalette.stories.js +8 -0
  136. package/dist/components/molecules/NodePalette/NodePalette.svelte +86 -0
  137. package/dist/components/molecules/NodePalette/NodePalette.svelte.d.ts +11 -0
  138. package/dist/components/molecules/NodePalette/NodePaletteStory.svelte +11 -0
  139. package/dist/components/molecules/NodePalette/NodePaletteStory.svelte.d.ts +18 -0
  140. package/dist/components/molecules/PdfViewer/PdfViewer.svelte.d.ts +1 -1
  141. package/dist/components/molecules/Poll/Poll.stories.d.ts +1 -1
  142. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.stories.js +8 -0
  143. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte +794 -0
  144. package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte.d.ts +25 -0
  145. package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte +16 -0
  146. package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte.d.ts +18 -0
  147. package/dist/components/molecules/PropertyField/PropertyField.svelte +57 -3
  148. package/dist/components/molecules/PropertyField/PropertyField.svelte.d.ts +10 -0
  149. package/dist/components/molecules/PropertyField/PropertyFieldStory.svelte +21 -0
  150. package/dist/components/molecules/PropertyGroup/PropertyGroup.svelte +1 -1
  151. package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.d.ts +9 -0
  152. package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.js +8 -0
  153. package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte +52 -0
  154. package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte.d.ts +18 -0
  155. package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte +62 -0
  156. package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte.d.ts +3 -0
  157. package/dist/components/molecules/RelationPicker/RelationPicker.stories.d.ts +9 -0
  158. package/dist/components/molecules/RelationPicker/RelationPicker.stories.js +8 -0
  159. package/dist/components/molecules/RelationPicker/RelationPicker.svelte +180 -0
  160. package/dist/components/molecules/RelationPicker/RelationPicker.svelte.d.ts +24 -0
  161. package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte +16 -0
  162. package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte.d.ts +3 -0
  163. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.d.ts +9 -0
  164. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.js +8 -0
  165. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte +154 -0
  166. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte.d.ts +12 -0
  167. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte +16 -0
  168. package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte.d.ts +3 -0
  169. package/dist/components/molecules/SecretField/SecretField.stories.d.ts +9 -0
  170. package/dist/components/molecules/SecretField/SecretField.stories.js +8 -0
  171. package/dist/components/molecules/SecretField/SecretField.svelte +58 -0
  172. package/dist/components/molecules/SecretField/SecretField.svelte.d.ts +15 -0
  173. package/dist/components/molecules/SecretField/SecretFieldStory.svelte +8 -0
  174. package/dist/components/molecules/SecretField/SecretFieldStory.svelte.d.ts +3 -0
  175. package/dist/components/molecules/SplitPane/SplitPane.svelte +99 -40
  176. package/dist/components/molecules/SplitPane/SplitPane.svelte.d.ts +10 -2
  177. package/dist/components/molecules/TableToolbar/TableToolbar.svelte.d.ts +1 -1
  178. package/dist/components/molecules/Terminal/Terminal.stories.js +20 -0
  179. package/dist/components/molecules/Terminal/Terminal.svelte +238 -0
  180. package/dist/components/molecules/Terminal/Terminal.svelte.d.ts +19 -0
  181. package/dist/components/molecules/Terminal/TerminalStory.svelte +47 -0
  182. package/dist/components/molecules/Terminal/TerminalStory.svelte.d.ts +6 -0
  183. package/dist/components/molecules/TimelineClip/TimelineClip.stories.js +8 -0
  184. package/dist/components/molecules/TimelineClip/TimelineClip.svelte +193 -0
  185. package/dist/components/molecules/TimelineClip/TimelineClip.svelte.d.ts +18 -0
  186. package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte +18 -0
  187. package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte.d.ts +18 -0
  188. package/dist/components/molecules/TimelineTrack/TimelineTrack.stories.js +8 -0
  189. package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte +126 -0
  190. package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte.d.ts +27 -0
  191. package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte +35 -0
  192. package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte.d.ts +18 -0
  193. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.stories.js +8 -0
  194. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte +158 -0
  195. package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte.d.ts +18 -0
  196. package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte +55 -0
  197. package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte.d.ts +18 -0
  198. package/dist/components/molecules/TrackHeader/TrackHeader.stories.d.ts +9 -0
  199. package/dist/components/molecules/TrackHeader/TrackHeader.stories.js +8 -0
  200. package/dist/components/molecules/TrackHeader/TrackHeader.svelte +54 -0
  201. package/dist/components/molecules/TrackHeader/TrackHeader.svelte.d.ts +9 -0
  202. package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte +10 -0
  203. package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte.d.ts +3 -0
  204. package/dist/components/molecules/TransportControls/TransportControls.stories.d.ts +9 -0
  205. package/dist/components/molecules/TransportControls/TransportControls.stories.js +8 -0
  206. package/dist/components/molecules/TransportControls/TransportControls.svelte +135 -0
  207. package/dist/components/molecules/TransportControls/TransportControls.svelte.d.ts +24 -0
  208. package/dist/components/molecules/TransportControls/TransportControlsStory.svelte +40 -0
  209. package/dist/components/molecules/TransportControls/TransportControlsStory.svelte.d.ts +3 -0
  210. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.stories.js +8 -0
  211. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte +117 -0
  212. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte.d.ts +20 -0
  213. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte +36 -0
  214. package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte.d.ts +18 -0
  215. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.stories.js +8 -0
  216. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.svelte +213 -0
  217. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.svelte.d.ts +22 -0
  218. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanelStory.svelte +7 -0
  219. package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanelStory.svelte.d.ts +18 -0
  220. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.stories.js +8 -0
  221. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.svelte +524 -0
  222. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.svelte.d.ts +32 -0
  223. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanelStory.svelte +7 -0
  224. package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanelStory.svelte.d.ts +18 -0
  225. package/dist/components/molecules/VideoPlayer/VideoPlayer.stories.d.ts +1 -1
  226. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.d.ts +9 -0
  227. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.js +8 -0
  228. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte +112 -0
  229. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte.d.ts +15 -0
  230. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte +10 -0
  231. package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte.d.ts +3 -0
  232. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.stories.js +8 -0
  233. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.svelte +113 -0
  234. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.svelte.d.ts +18 -0
  235. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanelStory.svelte +7 -0
  236. package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanelStory.svelte.d.ts +18 -0
  237. package/dist/components/molecules/WaveformRegion/WaveformRegion.stories.js +8 -0
  238. package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte +82 -0
  239. package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte.d.ts +13 -0
  240. package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte +17 -0
  241. package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte.d.ts +18 -0
  242. package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte +13 -4
  243. package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte.d.ts +3 -1
  244. package/dist/components/molecules/WidgetCanvas/widgetCanvasContext.d.ts +2 -0
  245. package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte +206 -37
  246. package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte.d.ts +31 -0
  247. package/dist/components/organisms/AudioEditor/AudioEditor.stories.d.ts +12 -0
  248. package/dist/components/organisms/AudioEditor/AudioEditor.stories.js +9 -0
  249. package/dist/components/organisms/AudioEditor/AudioEditor.svelte +324 -0
  250. package/dist/components/organisms/AudioEditor/AudioEditor.svelte.d.ts +13 -0
  251. package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte +10 -0
  252. package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte.d.ts +3 -0
  253. package/dist/components/organisms/BlogEditor/BlogEditor.stories.d.ts +12 -0
  254. package/dist/components/organisms/BlogEditor/BlogEditor.stories.js +9 -0
  255. package/dist/components/organisms/BlogEditor/BlogEditor.svelte +1208 -0
  256. package/dist/components/organisms/BlogEditor/BlogEditor.svelte.d.ts +16 -0
  257. package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte +144 -0
  258. package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte.d.ts +3 -0
  259. package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte +28 -0
  260. package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte.d.ts +10 -0
  261. package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte +34 -0
  262. package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte.d.ts +11 -0
  263. package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte +13 -0
  264. package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte.d.ts +8 -0
  265. package/dist/components/organisms/BlogRenderer/BlogRenderer.stories.js +8 -0
  266. package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte +469 -0
  267. package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte.d.ts +14 -0
  268. package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte +20 -0
  269. package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte.d.ts +18 -0
  270. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.d.ts +12 -0
  271. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.js +9 -0
  272. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte +1012 -0
  273. package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte.d.ts +16 -0
  274. package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte +76 -0
  275. package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte.d.ts +3 -0
  276. package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.d.ts +12 -0
  277. package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.js +9 -0
  278. package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte +1680 -0
  279. package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte.d.ts +18 -0
  280. package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte +329 -0
  281. package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte.d.ts +3 -0
  282. package/dist/components/organisms/DashboardBuilderPage/DashboardBuilderPage.svelte.d.ts +1 -1
  283. package/dist/components/organisms/DesktopShell/DesktopShell.svelte.d.ts +1 -1
  284. package/dist/components/organisms/EditorShell/EditorShell.svelte +162 -57
  285. package/dist/components/organisms/EditorShell/EditorShell.svelte.d.ts +21 -1
  286. package/dist/components/organisms/FileUploader/FileUploader.stories.d.ts +10 -0
  287. package/dist/components/organisms/FileUploader/FileUploader.stories.js +21 -0
  288. package/dist/components/organisms/FileUploader/FileUploader.svelte +127 -25
  289. package/dist/components/organisms/FileUploader/FileUploader.svelte.d.ts +20 -0
  290. package/dist/components/organisms/FileUploader/FileUploaderStory.svelte +7 -1
  291. package/dist/components/organisms/FileUploader/FileUploaderStory.svelte.d.ts +3 -0
  292. package/dist/components/organisms/ImportWizard/ImportWizard.stories.js +8 -0
  293. package/dist/components/organisms/ImportWizard/ImportWizard.svelte +209 -0
  294. package/dist/components/organisms/ImportWizard/ImportWizard.svelte.d.ts +22 -0
  295. package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte +16 -0
  296. package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte.d.ts +18 -0
  297. package/dist/components/organisms/VideoEditor/VideoEditor.stories.d.ts +12 -0
  298. package/dist/components/organisms/VideoEditor/VideoEditor.stories.js +9 -0
  299. package/dist/components/organisms/VideoEditor/VideoEditor.svelte +1687 -0
  300. package/dist/components/organisms/VideoEditor/VideoEditor.svelte.d.ts +14 -0
  301. package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte +11 -0
  302. package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte.d.ts +3 -0
  303. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.d.ts +12 -0
  304. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.js +9 -0
  305. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte +22 -0
  306. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte.d.ts +13 -0
  307. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte +8 -0
  308. package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte.d.ts +3 -0
  309. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.d.ts +12 -0
  310. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.js +9 -0
  311. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte +32 -0
  312. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte.d.ts +17 -0
  313. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte +21 -0
  314. package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte.d.ts +3 -0
  315. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.d.ts +12 -0
  316. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.js +9 -0
  317. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte +22 -0
  318. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte.d.ts +13 -0
  319. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte +8 -0
  320. package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte.d.ts +3 -0
  321. package/dist/index.d.ts +91 -1
  322. package/dist/index.js +64 -0
  323. package/dist/types/xyflow-svelte.d.ts +62 -0
  324. package/dist/utils/audioProject.d.ts +19 -0
  325. package/dist/utils/audioProject.js +70 -0
  326. package/dist/utils/blogDocument.d.ts +175 -0
  327. package/dist/utils/blogDocument.js +220 -0
  328. package/dist/utils/blueprintRuntime.d.ts +34 -0
  329. package/dist/utils/blueprintRuntime.js +289 -0
  330. package/dist/utils/canvasDocument.d.ts +239 -0
  331. package/dist/utils/canvasDocument.js +443 -0
  332. package/dist/utils/canvasExport.d.ts +10 -0
  333. package/dist/utils/canvasExport.js +469 -0
  334. package/dist/utils/canvasHierarchy.d.ts +189 -0
  335. package/dist/utils/canvasHierarchy.js +674 -0
  336. package/dist/utils/canvasHistory.d.ts +19 -0
  337. package/dist/utils/canvasHistory.js +48 -0
  338. package/dist/utils/canvasWidget.d.ts +81 -0
  339. package/dist/utils/canvasWidget.js +597 -0
  340. package/dist/utils/mediaTime.d.ts +26 -0
  341. package/dist/utils/mediaTime.js +76 -0
  342. package/dist/utils/mediaTracks.d.ts +215 -0
  343. package/dist/utils/mediaTracks.js +798 -0
  344. package/dist/utils/nodeGraph.d.ts +354 -0
  345. package/dist/utils/nodeGraph.js +1453 -0
  346. package/dist/utils/queryBridge.d.ts +18 -0
  347. package/dist/utils/queryBridge.js +118 -0
  348. package/dist/utils/videoSequence.d.ts +13 -0
  349. package/dist/utils/videoSequence.js +94 -0
  350. package/package.json +5 -2
@@ -0,0 +1,794 @@
1
+ <script lang="ts">
2
+ import type { MediaClip, MediaClipRect, MediaTrack } from '../../../utils/mediaTracks.js';
3
+ import {
4
+ findClipAt,
5
+ findTransitionAt,
6
+ isClipActiveAt,
7
+ resolveClipRect,
8
+ resolvePreviewOpacity,
9
+ transitionDipOverlay,
10
+ transitionLayerStyle,
11
+ type TransitionLayerStyle
12
+ } from '../../../utils/mediaTracks.js';
13
+ import { formatTimecode } from '../../../utils/mediaTime.js';
14
+ import MarqueeRect from '../../atoms/MarqueeRect/MarqueeRect.svelte';
15
+ import {
16
+ attachMarqueeSelect,
17
+ collectMarqueeItems,
18
+ defaultMarqueeIgnore,
19
+ resolveMarqueeSelection,
20
+ type MarqueeRect as MarqueeBox
21
+ } from '../../../utils/marqueeSelect.js';
22
+ import { onDestroy } from 'svelte';
23
+
24
+ type ResizeEdge = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';
25
+
26
+ interface ProgramMonitorProps {
27
+ width?: number;
28
+ height?: number;
29
+ background?: string;
30
+ currentTimeMs?: number;
31
+ playing?: boolean;
32
+ playbackRate?: number;
33
+ muted?: boolean;
34
+ volume?: number;
35
+ tracks?: MediaTrack[];
36
+ selectedClipIds?: string[];
37
+ /** When true, selected overlays can be dragged / resized on the frame */
38
+ editable?: boolean;
39
+ class?: string;
40
+ onselectclip?: (clipId: string, e: MouseEvent) => void;
41
+ onchangeclip?: (clip: MediaClip) => void;
42
+ /** Batch update (multi-drag). Falls back to repeated onchangeclip. */
43
+ onchangeclips?: (clips: MediaClip[]) => void;
44
+ onemptyclick?: () => void;
45
+ onselectionchange?: (clipIds: string[]) => void;
46
+ }
47
+
48
+ let {
49
+ width = 1280,
50
+ height = 720,
51
+ background = '#0a0a0a',
52
+ currentTimeMs = 0,
53
+ playing = false,
54
+ playbackRate = 1,
55
+ muted = false,
56
+ volume = 1,
57
+ tracks = [],
58
+ selectedClipIds = [],
59
+ editable = true,
60
+ class: className = '',
61
+ onselectclip,
62
+ onchangeclip,
63
+ onchangeclips,
64
+ onemptyclick,
65
+ onselectionchange
66
+ }: ProgramMonitorProps = $props();
67
+
68
+ const frame = $derived({ width, height });
69
+ const selectedSet = $derived(new Set(selectedClipIds));
70
+
71
+ function isOverlayClip(clip: MediaClip): boolean {
72
+ if (clip.kind === 'text') return true;
73
+ if (clip.kind === 'image' && !clip.src) return true;
74
+ if (clip.rect && clip.kind !== 'video' && clip.kind !== 'audio') return true;
75
+ return false;
76
+ }
77
+
78
+ const activeVideo = $derived.by(() => {
79
+ const clip =
80
+ findClipAt(tracks, currentTimeMs, 'video') ?? findClipAt(tracks, currentTimeMs, 'image');
81
+ if (!clip || clip.kind === 'text' || isOverlayClip(clip)) return null;
82
+ return clip;
83
+ });
84
+
85
+ const activeAudio = $derived(findClipAt(tracks, currentTimeMs, 'audio'));
86
+
87
+ const transition = $derived(findTransitionAt(tracks, currentTimeMs));
88
+
89
+ function isProgramMedia(clip: MediaClip | null | undefined): clip is MediaClip {
90
+ return !!clip && clip.kind !== 'text' && clip.kind !== 'audio' && !isOverlayClip(clip);
91
+ }
92
+
93
+ /** Outgoing full-frame layer during a transition (kept even past the cut). */
94
+ const programOutgoing = $derived.by(() => {
95
+ if (transition) {
96
+ if (isProgramMedia(transition.from)) return transition.from;
97
+ // From is an overlay — don't also treat the incoming program clip as "outgoing"
98
+ if (activeVideo && activeVideo.id !== transition.to?.id) return activeVideo;
99
+ return null;
100
+ }
101
+ return activeVideo;
102
+ });
103
+
104
+ const programIncoming = $derived.by(() => {
105
+ if (!transition?.to || !isProgramMedia(transition.to)) return null;
106
+ return transition.to;
107
+ });
108
+
109
+ const overlays = $derived.by(() => {
110
+ const list: MediaClip[] = [];
111
+ const seen = new Set<string>();
112
+ for (const t of tracks) {
113
+ if (t.muted && !t.solo) continue;
114
+ for (const c of t.clips) {
115
+ if (!isOverlayClip(c)) continue;
116
+ const active = isClipActiveAt(c, currentTimeMs);
117
+ const inTransition =
118
+ !!transition &&
119
+ (c.id === transition.from.id || (!!transition.to && c.id === transition.to.id));
120
+ if (!active && !inTransition) continue;
121
+ if (seen.has(c.id)) continue;
122
+ seen.add(c.id);
123
+ list.push(c);
124
+ }
125
+ }
126
+ return list;
127
+ });
128
+
129
+ const dip = $derived(
130
+ transition ? transitionDipOverlay(transition.type, transition.progress) : null
131
+ );
132
+
133
+ let stageEl = $state<HTMLDivElement | null>(null);
134
+ let videoEl = $state<HTMLVideoElement | null>(null);
135
+ let incomingVideoEl = $state<HTMLVideoElement | null>(null);
136
+ let audioEl = $state<HTMLAudioElement | null>(null);
137
+ let marquee = $state<MarqueeBox | null>(null);
138
+ let disposeMarquee: (() => void) | null = null;
139
+
140
+ const SCRUB_DRIFT = 0.04;
141
+ const PLAY_DRIFT = 0.45;
142
+
143
+ let lastVideoClipId: string | null = null;
144
+ let lastIncomingClipId: string | null = null;
145
+ let lastAudioClipId: string | null = null;
146
+ let wasPlayingVideo = false;
147
+ let wasPlayingIncoming = false;
148
+ let wasPlayingAudio = false;
149
+
150
+ type DragMode = 'move' | 'resize';
151
+ let drag = $state<{
152
+ clipId: string;
153
+ mode: DragMode;
154
+ edge?: ResizeEdge;
155
+ startX: number;
156
+ startY: number;
157
+ origins: Record<string, MediaClipRect>;
158
+ } | null>(null);
159
+
160
+ $effect(() => {
161
+ disposeMarquee?.();
162
+ disposeMarquee = null;
163
+ const el = stageEl;
164
+ if (!el || !editable || playing || !onselectionchange) return;
165
+ disposeMarquee = attachMarqueeSelect(el, {
166
+ getItems: () => collectMarqueeItems(el),
167
+ onRect: (r) => (marquee = r),
168
+ shouldIgnore: (target) =>
169
+ defaultMarqueeIgnore(target) ||
170
+ (target instanceof Element && Boolean(target.closest('[data-marquee-id]'))),
171
+ onSelect: ({ ids, modifier }) => {
172
+ onselectionchange(resolveMarqueeSelection(ids, selectedClipIds, modifier));
173
+ }
174
+ });
175
+ });
176
+
177
+ onDestroy(() => {
178
+ disposeMarquee?.();
179
+ });
180
+
181
+ const canvaHandles: { edge: ResizeEdge; class: string }[] = [
182
+ { edge: 'n', class: 'left-1/2 top-0 -translate-x-1/2 -translate-y-1/2 cursor-n-resize' },
183
+ { edge: 's', class: 'left-1/2 bottom-0 -translate-x-1/2 translate-y-1/2 cursor-s-resize' },
184
+ { edge: 'e', class: 'top-1/2 right-0 translate-x-1/2 -translate-y-1/2 cursor-e-resize' },
185
+ { edge: 'w', class: 'top-1/2 left-0 -translate-x-1/2 -translate-y-1/2 cursor-w-resize' },
186
+ { edge: 'nw', class: 'left-0 top-0 -translate-x-1/2 -translate-y-1/2 cursor-nw-resize' },
187
+ { edge: 'ne', class: 'right-0 top-0 translate-x-1/2 -translate-y-1/2 cursor-ne-resize' },
188
+ { edge: 'sw', class: 'bottom-0 left-0 -translate-x-1/2 translate-y-1/2 cursor-sw-resize' },
189
+ { edge: 'se', class: 'bottom-0 right-0 translate-x-1/2 translate-y-1/2 cursor-se-resize' }
190
+ ];
191
+
192
+ function sourceTime(clip: MediaClip): number {
193
+ const trim = clip.trimInMs ?? 0;
194
+ if (currentTimeMs < clip.startMs) return trim / 1000;
195
+ return Math.max(0, currentTimeMs - clip.startMs + trim) / 1000;
196
+ }
197
+
198
+ function clipOpacity(clip: MediaClip): number {
199
+ const t = currentTimeMs;
200
+ const inAnim = clip.animationIn;
201
+ const outAnim = clip.animationOut;
202
+ let opacity = resolvePreviewOpacity(clip);
203
+
204
+ const fadeTypes = new Set([
205
+ 'fade',
206
+ 'pop',
207
+ 'bounce',
208
+ 'blur',
209
+ 'glow',
210
+ 'drop',
211
+ 'swing',
212
+ 'spin',
213
+ 'flip-x',
214
+ 'flip-y'
215
+ ]);
216
+ if (inAnim && fadeTypes.has(inAnim.type) && inAnim.durationMs > 0) {
217
+ const local = t - clip.startMs;
218
+ if (local < inAnim.durationMs) {
219
+ const p = local / inAnim.durationMs;
220
+ const eased = inAnim.type === 'bounce' ? bounceEase(p) : p;
221
+ opacity = Math.min(opacity, eased);
222
+ }
223
+ }
224
+ if (outAnim && fadeTypes.has(outAnim.type) && outAnim.durationMs > 0) {
225
+ const remaining = clip.endMs - t;
226
+ if (remaining < outAnim.durationMs) {
227
+ const p = remaining / outAnim.durationMs;
228
+ opacity = Math.min(opacity, p);
229
+ }
230
+ }
231
+ return Math.max(0, Math.min(1, opacity));
232
+ }
233
+
234
+ function bounceEase(p: number) {
235
+ return Math.min(1, 1 - Math.abs(Math.sin((1 - p) * Math.PI * 1.2)) * (1 - p));
236
+ }
237
+
238
+ function clipFilter(clip: MediaClip): string | undefined {
239
+ const t = currentTimeMs;
240
+ const parts: string[] = [];
241
+
242
+ function apply(type: string, durationMs: number, entering: boolean) {
243
+ const local = entering ? t - clip.startMs : clip.endMs - t;
244
+ if (local < 0 || local >= durationMs) return;
245
+ const p = entering ? 1 - local / durationMs : 1 - local / durationMs;
246
+ if (type === 'blur') parts.push(`blur(${p * 10}px)`);
247
+ if (type === 'glow') parts.push(`brightness(${1 + p * 0.8})`);
248
+ }
249
+
250
+ if (clip.animationIn?.durationMs) apply(clip.animationIn.type, clip.animationIn.durationMs, true);
251
+ if (clip.animationOut?.durationMs) apply(clip.animationOut.type, clip.animationOut.durationMs, false);
252
+ return parts.length ? parts.join(' ') : undefined;
253
+ }
254
+
255
+ function clipTransform(clip: MediaClip): string {
256
+ const t = currentTimeMs;
257
+ const inAnim = clip.animationIn;
258
+ const outAnim = clip.animationOut;
259
+ const parts: string[] = [];
260
+
261
+ function applyIn(type: string, durationMs: number) {
262
+ const local = t - clip.startMs;
263
+ if (local < 0 || local >= durationMs) return;
264
+ const p = 1 - local / durationMs; // 1 → 0 as it settles
265
+ const reveal = 1 - p; // 0 → 1
266
+ if (type === 'slide' || type === 'slide-up') parts.push(`translateY(${p * 48}px)`);
267
+ else if (type === 'slide-down') parts.push(`translateY(${-p * 48}px)`);
268
+ else if (type === 'slide-left') parts.push(`translateX(${p * 64}px)`);
269
+ else if (type === 'slide-right') parts.push(`translateX(${-p * 64}px)`);
270
+ else if (type === 'scale' || type === 'pop' || type === 'grow')
271
+ parts.push(`scale(${0.55 + 0.45 * reveal})`);
272
+ else if (type === 'shrink') parts.push(`scale(${1.35 - 0.35 * reveal})`);
273
+ else if (type === 'rotate' || type === 'spin')
274
+ parts.push(`rotate(${p * -28}deg) scale(${0.85 + 0.15 * reveal})`);
275
+ else if (type === 'bounce') parts.push(`translateY(${Math.sin(p * Math.PI) * 22}px)`);
276
+ else if (type === 'drop') parts.push(`translateY(${-p * 80}px)`);
277
+ else if (type === 'swing') parts.push(`rotate(${Math.sin(p * Math.PI) * -18}deg)`);
278
+ else if (type === 'flip-x') parts.push(`perspective(700px) rotateY(${p * 90}deg)`);
279
+ else if (type === 'flip-y') parts.push(`perspective(700px) rotateX(${p * 90}deg)`);
280
+ else if (type === 'skew') parts.push(`skewX(${p * 18}deg)`);
281
+ else if (type === 'expand-h') parts.push(`scaleX(${0.15 + 0.85 * reveal})`);
282
+ else if (type === 'expand-v') parts.push(`scaleY(${0.15 + 0.85 * reveal})`);
283
+ }
284
+
285
+ function applyOut(type: string, durationMs: number) {
286
+ const remaining = clip.endMs - t;
287
+ if (remaining < 0 || remaining >= durationMs) return;
288
+ const p = 1 - remaining / durationMs; // 0 → 1 as it exits
289
+ if (type === 'slide' || type === 'slide-up') parts.push(`translateY(${-p * 48}px)`);
290
+ else if (type === 'slide-down') parts.push(`translateY(${p * 48}px)`);
291
+ else if (type === 'slide-left') parts.push(`translateX(${-p * 64}px)`);
292
+ else if (type === 'slide-right') parts.push(`translateX(${p * 64}px)`);
293
+ else if (type === 'scale' || type === 'pop' || type === 'shrink')
294
+ parts.push(`scale(${1 - 0.45 * p})`);
295
+ else if (type === 'grow') parts.push(`scale(${1 + 0.35 * p})`);
296
+ else if (type === 'rotate' || type === 'spin')
297
+ parts.push(`rotate(${p * 28}deg) scale(${1 - 0.15 * p})`);
298
+ else if (type === 'bounce') parts.push(`translateY(${-Math.sin(p * Math.PI) * 22}px)`);
299
+ else if (type === 'drop') parts.push(`translateY(${p * 80}px)`);
300
+ else if (type === 'swing') parts.push(`rotate(${Math.sin(p * Math.PI) * 18}deg)`);
301
+ else if (type === 'flip-x') parts.push(`perspective(700px) rotateY(${p * -90}deg)`);
302
+ else if (type === 'flip-y') parts.push(`perspective(700px) rotateX(${p * -90}deg)`);
303
+ else if (type === 'skew') parts.push(`skewX(${-p * 18}deg)`);
304
+ else if (type === 'expand-h') parts.push(`scaleX(${1 - 0.85 * p})`);
305
+ else if (type === 'expand-v') parts.push(`scaleY(${1 - 0.85 * p})`);
306
+ }
307
+
308
+ if (inAnim?.durationMs) applyIn(inAnim.type, inAnim.durationMs);
309
+ if (outAnim?.durationMs) applyOut(outAnim.type, outAnim.durationMs);
310
+
311
+ return parts.length ? parts.join(' ') : 'none';
312
+ }
313
+
314
+ function ensureSrc(el: HTMLMediaElement, src: string) {
315
+ if (el.dataset.mediaSrc === src) return;
316
+ el.dataset.mediaSrc = src;
317
+ el.src = src;
318
+ el.load();
319
+ }
320
+
321
+ function syncMedia(
322
+ el: HTMLMediaElement | null,
323
+ clip: MediaClip | null,
324
+ shouldPlay: boolean,
325
+ opts: {
326
+ lastClipId: string | null;
327
+ wasPlaying: boolean;
328
+ applyAudio: boolean;
329
+ }
330
+ ): { clipId: string | null; wasPlaying: boolean } {
331
+ if (!el || !clip?.src) {
332
+ if (el && !el.paused) el.pause();
333
+ return { clipId: null, wasPlaying: false };
334
+ }
335
+
336
+ ensureSrc(el, clip.src);
337
+ el.playbackRate = playbackRate;
338
+
339
+ if (opts.applyAudio) {
340
+ const clipVol = clip.volume ?? 1;
341
+ const nextVol = muted ? 0 : Math.max(0, Math.min(1, clipVol * volume));
342
+ el.muted = muted || nextVol === 0;
343
+ el.volume = nextVol;
344
+ } else {
345
+ el.muted = true;
346
+ }
347
+
348
+ const target = sourceTime(clip);
349
+ const clipChanged = clip.id !== opts.lastClipId;
350
+ const playStarted = shouldPlay && !opts.wasPlaying;
351
+ const drift = Math.abs(el.currentTime - target);
352
+ const threshold = shouldPlay ? PLAY_DRIFT * Math.max(1, playbackRate) : SCRUB_DRIFT;
353
+
354
+ if (clipChanged || playStarted || drift > threshold) {
355
+ try {
356
+ el.currentTime = target;
357
+ } catch {
358
+ /* ignore seek before loaded */
359
+ }
360
+ }
361
+
362
+ if (shouldPlay) {
363
+ if (el.paused) void el.play().catch(() => {});
364
+ } else if (!el.paused) {
365
+ el.pause();
366
+ }
367
+
368
+ return { clipId: clip.id, wasPlaying: shouldPlay };
369
+ }
370
+
371
+ $effect(() => {
372
+ const videoClip = programOutgoing?.kind === 'video' ? programOutgoing : null;
373
+ const next = syncMedia(videoEl, videoClip, playing, {
374
+ lastClipId: lastVideoClipId,
375
+ wasPlaying: wasPlayingVideo,
376
+ applyAudio: false
377
+ });
378
+ lastVideoClipId = next.clipId;
379
+ wasPlayingVideo = next.wasPlaying;
380
+ });
381
+
382
+ $effect(() => {
383
+ const videoClip = programIncoming?.kind === 'video' ? programIncoming : null;
384
+ const next = syncMedia(incomingVideoEl, videoClip, playing, {
385
+ lastClipId: lastIncomingClipId,
386
+ wasPlaying: wasPlayingIncoming,
387
+ applyAudio: false
388
+ });
389
+ lastIncomingClipId = next.clipId;
390
+ wasPlayingIncoming = next.wasPlaying;
391
+ });
392
+
393
+ $effect(() => {
394
+ const next = syncMedia(audioEl, activeAudio, playing, {
395
+ lastClipId: lastAudioClipId,
396
+ wasPlaying: wasPlayingAudio,
397
+ applyAudio: true
398
+ });
399
+ lastAudioClipId = next.clipId;
400
+ wasPlayingAudio = next.wasPlaying;
401
+ });
402
+
403
+ function overlayVisual(clip: MediaClip): TransitionLayerStyle {
404
+ const baseOp = clipOpacity(clip);
405
+ const baseTf = clipTransform(clip);
406
+ const baseFilter = clipFilter(clip);
407
+ if (
408
+ !transition ||
409
+ (clip.id !== transition.from.id && clip.id !== transition.to?.id)
410
+ ) {
411
+ return {
412
+ opacity: baseOp,
413
+ transform: baseTf === 'none' ? 'none' : baseTf,
414
+ filter: baseFilter
415
+ };
416
+ }
417
+ const role = clip.id === transition.from.id ? 'from' : 'to';
418
+ const layer = transitionLayerStyle(role, transition.type, transition.progress);
419
+ const parts = [baseTf !== 'none' ? baseTf : '', layer.transform !== 'none' ? layer.transform : '']
420
+ .filter(Boolean)
421
+ .join(' ');
422
+ const filters = [baseFilter, layer.filter].filter(Boolean).join(' ');
423
+ return {
424
+ opacity: baseOp * layer.opacity,
425
+ transform: parts || 'none',
426
+ filter: filters || undefined,
427
+ transformOrigin: layer.transformOrigin,
428
+ maskImage: layer.maskImage,
429
+ wipe: layer.wipe,
430
+ clipPath: layer.clipPath
431
+ };
432
+ }
433
+
434
+ function programLayerStyle(role: 'from' | 'to', clip: MediaClip): TransitionLayerStyle {
435
+ if (transition && (clip.id === transition.from.id || clip.id === transition.to?.id)) {
436
+ const r = clip.id === transition.from.id ? 'from' : 'to';
437
+ return transitionLayerStyle(r, transition.type, transition.progress);
438
+ }
439
+ if (role === 'from') {
440
+ return {
441
+ opacity: clipOpacity(clip),
442
+ transform: clipTransform(clip),
443
+ filter: clipFilter(clip)
444
+ };
445
+ }
446
+ return { opacity: 1, transform: 'none' };
447
+ }
448
+
449
+ function layerInlineStyle(s: TransitionLayerStyle): string {
450
+ const parts = [
451
+ `opacity:${s.opacity}`,
452
+ `transform:${s.transform || 'none'}`,
453
+ `transform-origin:${s.transformOrigin ?? 'center'}`
454
+ ];
455
+ if (s.filter) parts.push(`filter:${s.filter}`);
456
+ if (s.clipPath) parts.push(`clip-path:${s.clipPath}`, `-webkit-clip-path:${s.clipPath}`);
457
+ if (s.maskImage) {
458
+ parts.push(
459
+ `mask-image:${s.maskImage}`,
460
+ `-webkit-mask-image:${s.maskImage}`,
461
+ 'mask-size:100% 100%',
462
+ '-webkit-mask-size:100% 100%',
463
+ 'mask-repeat:no-repeat',
464
+ '-webkit-mask-repeat:no-repeat'
465
+ );
466
+ }
467
+ return parts.join(';');
468
+ }
469
+
470
+ function wipeBoxStyle(box: { left: string; top: string; width: string; height: string }): string {
471
+ return `left:${box.left};top:${box.top};width:${box.width};height:${box.height};`;
472
+ }
473
+
474
+ function beginInteract(clip: MediaClip, mode: DragMode, e: PointerEvent, edge?: ResizeEdge) {
475
+ if (!editable || playing) return;
476
+ e.preventDefault();
477
+ e.stopPropagation();
478
+ (e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId);
479
+ onselectclip?.(clip.id, e as unknown as MouseEvent);
480
+ const moveIds =
481
+ mode === 'move' && selectedSet.has(clip.id) && selectedClipIds.length > 1
482
+ ? selectedClipIds
483
+ : [clip.id];
484
+ const origins: Record<string, MediaClipRect> = {};
485
+ for (const id of moveIds) {
486
+ const c = overlays.find((o) => o.id === id) ?? (id === clip.id ? clip : null);
487
+ if (c) origins[id] = { ...resolveClipRect(c, frame) };
488
+ }
489
+ if (!origins[clip.id]) origins[clip.id] = { ...resolveClipRect(clip, frame) };
490
+ drag = {
491
+ clipId: clip.id,
492
+ mode,
493
+ edge,
494
+ startX: e.clientX,
495
+ startY: e.clientY,
496
+ origins
497
+ };
498
+ }
499
+
500
+ function applyResize(o: MediaClipRect, edge: ResizeEdge, dx: number, dy: number): MediaClipRect {
501
+ const minW = 40;
502
+ const minH = 24;
503
+ let { x, y, w, h } = o;
504
+
505
+ if (edge.includes('e')) w = Math.max(minW, o.w + dx);
506
+ if (edge.includes('s')) h = Math.max(minH, o.h + dy);
507
+ if (edge.includes('w')) {
508
+ const nextW = Math.max(minW, o.w - dx);
509
+ x = o.x + (o.w - nextW);
510
+ w = nextW;
511
+ }
512
+ if (edge.includes('n')) {
513
+ const nextH = Math.max(minH, o.h - dy);
514
+ y = o.y + (o.h - nextH);
515
+ h = nextH;
516
+ }
517
+
518
+ x = Math.min(Math.max(0, x), width - w);
519
+ y = Math.min(Math.max(0, y), height - h);
520
+ w = Math.min(w, width - x);
521
+ h = Math.min(h, height - y);
522
+
523
+ return { x: Math.round(x), y: Math.round(y), w: Math.round(w), h: Math.round(h) };
524
+ }
525
+
526
+ function onPointerMove(e: PointerEvent) {
527
+ if (!drag || !stageEl) return;
528
+ const r = stageEl.getBoundingClientRect();
529
+ const sx = r.width > 0 ? width / r.width : 1;
530
+ const sy = r.height > 0 ? height / r.height : 1;
531
+ const dx = (e.clientX - drag.startX) * sx;
532
+ const dy = (e.clientY - drag.startY) * sy;
533
+
534
+ if (drag.mode === 'move') {
535
+ const updates: MediaClip[] = [];
536
+ for (const [id, o] of Object.entries(drag.origins)) {
537
+ const next = {
538
+ x: Math.round(Math.min(Math.max(0, o.x + dx), width - o.w)),
539
+ y: Math.round(Math.min(Math.max(0, o.y + dy), height - o.h)),
540
+ w: o.w,
541
+ h: o.h
542
+ };
543
+ const clip = overlays.find((c) => c.id === id);
544
+ if (clip) updates.push({ ...clip, rect: next });
545
+ }
546
+ if (updates.length) {
547
+ if (onchangeclips) onchangeclips(updates);
548
+ else updates.forEach((c) => onchangeclip?.(c));
549
+ }
550
+ return;
551
+ }
552
+
553
+ const o = drag.origins[drag.clipId];
554
+ if (!o) return;
555
+ const next = applyResize(o, drag.edge ?? 'se', dx, dy);
556
+ const clip = overlays.find((c) => c.id === drag!.clipId);
557
+ if (clip) onchangeclip?.({ ...clip, rect: next });
558
+ }
559
+
560
+ function endInteract() {
561
+ drag = null;
562
+ }
563
+
564
+ function styleForRect(rect: MediaClipRect): string {
565
+ return `left:${(rect.x / width) * 100}%;top:${(rect.y / height) * 100}%;width:${(rect.w / width) * 100}%;height:${(rect.h / height) * 100}%;`;
566
+ }
567
+ </script>
568
+
569
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
570
+ <div
571
+ bind:this={stageEl}
572
+ class={[
573
+ 'relative flex aspect-video w-full items-center justify-center overflow-hidden rounded-lg border border-border',
574
+ className
575
+ ]}
576
+ style:background
577
+ style:aspect-ratio={`${width} / ${height}`}
578
+ onpointermove={onPointerMove}
579
+ onpointerup={endInteract}
580
+ onpointercancel={endInteract}
581
+ onclick={(e) => {
582
+ if (e.target === e.currentTarget) onemptyclick?.();
583
+ }}
584
+ >
585
+ <!-- Program / full-frame media (+ transition pair) -->
586
+ <div class="absolute inset-0 overflow-hidden">
587
+ {#if programOutgoing?.src && (programOutgoing.kind === 'video' || programOutgoing.kind === 'image')}
588
+ {@const fromStyle = programLayerStyle('from', programOutgoing)}
589
+ {#if fromStyle.wipe}
590
+ <div class="absolute overflow-hidden" style={wipeBoxStyle(fromStyle.wipe.box)}>
591
+ <div
592
+ class="absolute flex items-center justify-center"
593
+ style={`${wipeBoxStyle(fromStyle.wipe.content)}${layerInlineStyle(fromStyle)}`}
594
+ >
595
+ {#if programOutgoing.kind === 'video'}
596
+ <video
597
+ bind:this={videoEl}
598
+ class="h-full w-full object-contain"
599
+ muted
600
+ playsinline
601
+ preload="auto"
602
+ ></video>
603
+ {:else}
604
+ <img
605
+ src={programOutgoing.src}
606
+ alt={programOutgoing.name}
607
+ class="h-full w-full object-contain"
608
+ />
609
+ {/if}
610
+ </div>
611
+ </div>
612
+ {:else}
613
+ <div class="absolute inset-0 flex items-center justify-center" style={layerInlineStyle(fromStyle)}>
614
+ {#if programOutgoing.kind === 'video'}
615
+ <video
616
+ bind:this={videoEl}
617
+ class="h-full w-full object-contain"
618
+ muted
619
+ playsinline
620
+ preload="auto"
621
+ ></video>
622
+ {:else}
623
+ <img
624
+ src={programOutgoing.src}
625
+ alt={programOutgoing.name}
626
+ class="h-full w-full object-contain"
627
+ />
628
+ {/if}
629
+ </div>
630
+ {/if}
631
+ {/if}
632
+
633
+ {#if programIncoming?.src}
634
+ {@const toStyle = programLayerStyle('to', programIncoming)}
635
+ {#if toStyle.wipe}
636
+ <div class="absolute overflow-hidden" style={wipeBoxStyle(toStyle.wipe.box)}>
637
+ <div
638
+ class="absolute flex items-center justify-center"
639
+ style={`${wipeBoxStyle(toStyle.wipe.content)}${layerInlineStyle(toStyle)}`}
640
+ >
641
+ {#if programIncoming.kind === 'video'}
642
+ <video
643
+ bind:this={incomingVideoEl}
644
+ class="h-full w-full object-contain"
645
+ muted
646
+ playsinline
647
+ preload="auto"
648
+ ></video>
649
+ {:else}
650
+ <img
651
+ src={programIncoming.src}
652
+ alt={programIncoming.name}
653
+ class="h-full w-full object-contain"
654
+ />
655
+ {/if}
656
+ </div>
657
+ </div>
658
+ {:else}
659
+ <div class="absolute inset-0 flex items-center justify-center" style={layerInlineStyle(toStyle)}>
660
+ {#if programIncoming.kind === 'video'}
661
+ <video
662
+ bind:this={incomingVideoEl}
663
+ class="h-full w-full object-contain"
664
+ muted
665
+ playsinline
666
+ preload="auto"
667
+ ></video>
668
+ {:else}
669
+ <img
670
+ src={programIncoming.src}
671
+ alt={programIncoming.name}
672
+ class="h-full w-full object-contain"
673
+ />
674
+ {/if}
675
+ </div>
676
+ {/if}
677
+ {/if}
678
+
679
+ {#if dip}
680
+ <div
681
+ class="pointer-events-none absolute inset-0"
682
+ style:background={dip.color}
683
+ style:opacity={dip.opacity}
684
+ ></div>
685
+ {/if}
686
+
687
+ {#if !programOutgoing?.src && overlays.length === 0 && !programIncoming}
688
+ <div class="flex h-full items-center justify-center">
689
+ <span class="text-sm text-muted">No clip at playhead</span>
690
+ </div>
691
+ {/if}
692
+ </div>
693
+
694
+ {#each overlays as clip (clip.id)}
695
+ {@const rect = resolveClipRect(clip, frame)}
696
+ {@const selected = selectedSet.has(clip.id)}
697
+ {@const showChrome = selected && editable && !playing}
698
+ {@const visual = overlayVisual(clip)}
699
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
700
+ <div
701
+ class={[
702
+ 'group/overlay absolute box-border overflow-hidden',
703
+ editable && !playing ? 'cursor-move' : 'pointer-events-none',
704
+ showChrome && 'outline outline-2 outline-[#3b82f6]'
705
+ ]}
706
+ style={styleForRect(rect)}
707
+ data-marquee-id={clip.id}
708
+ onpointerdown={(e) => {
709
+ const t = e.target as HTMLElement;
710
+ if (t?.closest('[data-resize-handle]')) return;
711
+ beginInteract(clip, 'move', e);
712
+ }}
713
+ onclick={(e) => {
714
+ e.stopPropagation();
715
+ onselectclip?.(clip.id, e);
716
+ }}
717
+ >
718
+ {#if visual.wipe}
719
+ <div class="absolute overflow-hidden" style={wipeBoxStyle(visual.wipe.box)}>
720
+ <div
721
+ class="absolute flex items-center justify-center"
722
+ style={`${wipeBoxStyle(visual.wipe.content)}${layerInlineStyle(visual)};background:${clip.kind === 'image' && !clip.src ? (clip.color ?? '#000') : 'transparent'}`}
723
+ >
724
+ {#if clip.kind === 'text'}
725
+ <span
726
+ class="max-h-full max-w-full overflow-hidden whitespace-pre-line px-2 py-1 text-center leading-tight"
727
+ style:color={clip.textColor ?? '#ffffff'}
728
+ style:font-size={`${Math.max(10, (clip.fontSize ?? 24) * (rect.h / 120))}px`}
729
+ style:font-weight={clip.fontWeight ?? 600}
730
+ style:font-family={clip.fontFamily}
731
+ style:text-align={clip.textAlign ?? 'center'}
732
+ style:text-shadow="0 1px 3px rgba(0,0,0,0.55)"
733
+ >
734
+ {clip.text ?? clip.name}
735
+ </span>
736
+ {:else if clip.src}
737
+ <img src={clip.src} alt={clip.name} class="h-full w-full object-cover" />
738
+ {/if}
739
+ </div>
740
+ </div>
741
+ {:else}
742
+ <div
743
+ class="flex h-full w-full items-center justify-center overflow-hidden"
744
+ style={`${layerInlineStyle(visual)};background:${clip.kind === 'image' && !clip.src ? (clip.color ?? '#000') : 'transparent'}`}
745
+ >
746
+ {#if clip.kind === 'text'}
747
+ <span
748
+ class="max-h-full max-w-full overflow-hidden whitespace-pre-line px-2 py-1 text-center leading-tight"
749
+ style:color={clip.textColor ?? '#ffffff'}
750
+ style:font-size={`${Math.max(10, (clip.fontSize ?? 24) * (rect.h / 120))}px`}
751
+ style:font-weight={clip.fontWeight ?? 600}
752
+ style:font-family={clip.fontFamily}
753
+ style:text-align={clip.textAlign ?? 'center'}
754
+ style:text-shadow="0 1px 3px rgba(0,0,0,0.55)"
755
+ >
756
+ {clip.text ?? clip.name}
757
+ </span>
758
+ {:else if clip.src}
759
+ <img src={clip.src} alt={clip.name} class="h-full w-full object-cover" />
760
+ {/if}
761
+ </div>
762
+ {/if}
763
+
764
+ {#if showChrome}
765
+ {#each canvaHandles as h (h.edge)}
766
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
767
+ <div
768
+ data-resize-handle
769
+ role="separator"
770
+ aria-label={`Resize ${h.edge}`}
771
+ class={[
772
+ 'absolute z-20 h-3 w-3 touch-none rounded-full border-2 border-[#3b82f6] bg-white shadow-sm',
773
+ h.class
774
+ ]}
775
+ onpointerdown={(e) => beginInteract(clip, 'resize', e, h.edge)}
776
+ ></div>
777
+ {/each}
778
+ {/if}
779
+ </div>
780
+ {/each}
781
+
782
+ <audio bind:this={audioEl} class="hidden" preload="auto"></audio>
783
+
784
+ <MarqueeRect rect={marquee} />
785
+
786
+ <div
787
+ class="pointer-events-none absolute bottom-2 left-2 rounded bg-black/50 px-2 py-0.5 font-mono text-[10px] text-white"
788
+ >
789
+ {formatTimecode(currentTimeMs)}
790
+ {#if transition}
791
+ <span class="ml-2 text-fuchsia-300">· {transition.type}</span>
792
+ {/if}
793
+ </div>
794
+ </div>