@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.
- package/dist/components/atoms/IconButton/IconButton.svelte +1 -1
- package/dist/components/atoms/MediaKindIcon/MediaKindIcon.stories.js +8 -0
- package/dist/components/atoms/MediaKindIcon/MediaKindIcon.svelte +122 -0
- package/dist/components/atoms/MediaKindIcon/MediaKindIcon.svelte.d.ts +11 -0
- package/dist/components/atoms/MediaKindIcon/MediaKindIconStory.svelte +12 -0
- package/dist/components/atoms/MediaKindIcon/MediaKindIconStory.svelte.d.ts +18 -0
- package/dist/components/atoms/PanKnob/PanKnob.stories.d.ts +9 -0
- package/dist/components/atoms/PanKnob/PanKnob.stories.js +8 -0
- package/dist/components/atoms/PanKnob/PanKnob.svelte +218 -0
- package/dist/components/atoms/PanKnob/PanKnob.svelte.d.ts +19 -0
- package/dist/components/atoms/PanKnob/PanKnobStory.svelte +15 -0
- package/dist/components/atoms/PanKnob/PanKnobStory.svelte.d.ts +3 -0
- package/dist/components/atoms/Playhead/Playhead.stories.js +8 -0
- package/dist/components/atoms/Playhead/Playhead.svelte +98 -0
- package/dist/components/atoms/Playhead/Playhead.svelte.d.ts +21 -0
- package/dist/components/atoms/Playhead/PlayheadStory.svelte +9 -0
- package/dist/components/atoms/Playhead/PlayheadStory.svelte.d.ts +18 -0
- package/dist/components/atoms/TimeRuler/TimeRuler.stories.js +8 -0
- package/dist/components/atoms/TimeRuler/TimeRuler.svelte +117 -0
- package/dist/components/atoms/TimeRuler/TimeRuler.svelte.d.ts +17 -0
- package/dist/components/atoms/TimeRuler/TimeRulerStory.svelte +7 -0
- package/dist/components/atoms/TimeRuler/TimeRulerStory.svelte.d.ts +18 -0
- package/dist/components/atoms/TimelineGrid/TimelineGrid.stories.js +8 -0
- package/dist/components/atoms/TimelineGrid/TimelineGrid.svelte +39 -0
- package/dist/components/atoms/TimelineGrid/TimelineGrid.svelte.d.ts +11 -0
- package/dist/components/atoms/TimelineGrid/TimelineGridStory.svelte +7 -0
- package/dist/components/atoms/TimelineGrid/TimelineGridStory.svelte.d.ts +18 -0
- package/dist/components/atoms/Tooltip/Tooltip.svelte +1 -1
- package/dist/components/atoms/TrimHandle/TrimHandle.stories.js +8 -0
- package/dist/components/atoms/TrimHandle/TrimHandle.svelte +63 -0
- package/dist/components/atoms/TrimHandle/TrimHandle.svelte.d.ts +12 -0
- package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte +11 -0
- package/dist/components/atoms/TrimHandle/TrimHandleStory.svelte.d.ts +18 -0
- package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.d.ts +9 -0
- package/dist/components/molecules/AiAssistPanel/AiAssistPanel.stories.js +8 -0
- package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte +102 -0
- package/dist/components/molecules/AiAssistPanel/AiAssistPanel.svelte.d.ts +20 -0
- package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte +34 -0
- package/dist/components/molecules/AiAssistPanel/AiAssistPanelStory.svelte.d.ts +3 -0
- package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte +97 -61
- package/dist/components/molecules/BulkActionBar/BulkActionBar.svelte.d.ts +2 -0
- package/dist/components/molecules/BulkEditPanel/BulkEditPanel.stories.js +8 -0
- package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte +117 -0
- package/dist/components/molecules/BulkEditPanel/BulkEditPanel.svelte.d.ts +23 -0
- package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte +18 -0
- package/dist/components/molecules/BulkEditPanel/BulkEditPanelStory.svelte.d.ts +18 -0
- package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.stories.js +8 -0
- package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte +858 -0
- package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanel.svelte.d.ts +43 -0
- package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte +7 -0
- package/dist/components/molecules/CanvasElementsPanel/CanvasElementsPanelStory.svelte.d.ts +18 -0
- package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.d.ts +9 -0
- package/dist/components/molecules/CanvasInspector/CanvasInspector.stories.js +8 -0
- package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte +1140 -0
- package/dist/components/molecules/CanvasInspector/CanvasInspector.svelte.d.ts +28 -0
- package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte +20 -0
- package/dist/components/molecules/CanvasInspector/CanvasInspectorStory.svelte.d.ts +3 -0
- package/dist/components/molecules/ColorPicker/ColorPicker.svelte +46 -5
- package/dist/components/molecules/ColorPicker/ColorPicker.svelte.d.ts +2 -0
- package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.d.ts +9 -0
- package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.stories.js +8 -0
- package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte +108 -0
- package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenu.svelte.d.ts +18 -0
- package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte +15 -0
- package/dist/components/molecules/ColumnVisibilityMenu/ColumnVisibilityMenuStory.svelte.d.ts +3 -0
- package/dist/components/molecules/ConflictResolver/ConflictResolver.stories.js +8 -0
- package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte +73 -0
- package/dist/components/molecules/ConflictResolver/ConflictResolver.svelte.d.ts +16 -0
- package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte +11 -0
- package/dist/components/molecules/ConflictResolver/ConflictResolverStory.svelte.d.ts +18 -0
- package/dist/components/molecules/ContextMenu/ContextMenu.svelte +237 -66
- package/dist/components/molecules/ContextMenu/ContextMenu.svelte.d.ts +9 -0
- package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.d.ts +9 -0
- package/dist/components/molecules/ExpressionEditor/ExpressionEditor.stories.js +8 -0
- package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte +56 -0
- package/dist/components/molecules/ExpressionEditor/ExpressionEditor.svelte.d.ts +12 -0
- package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte +12 -0
- package/dist/components/molecules/ExpressionEditor/ExpressionEditorStory.svelte.d.ts +3 -0
- package/dist/components/molecules/FilterList/FilterList.stories.d.ts +9 -0
- package/dist/components/molecules/FilterList/FilterList.stories.js +8 -0
- package/dist/components/molecules/FilterList/FilterList.svelte +101 -0
- package/dist/components/molecules/FilterList/FilterList.svelte.d.ts +18 -0
- package/dist/components/molecules/FilterList/FilterListStory.svelte +31 -0
- package/dist/components/molecules/FilterList/FilterListStory.svelte.d.ts +3 -0
- package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.d.ts +9 -0
- package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.stories.js +8 -0
- package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte +109 -0
- package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte.d.ts +20 -0
- package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte +18 -0
- package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowserStory.svelte.d.ts +3 -0
- package/dist/components/molecules/MediaAssetCard/MediaAssetCard.stories.js +8 -0
- package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte +50 -0
- package/dist/components/molecules/MediaAssetCard/MediaAssetCard.svelte.d.ts +11 -0
- package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte +13 -0
- package/dist/components/molecules/MediaAssetCard/MediaAssetCardStory.svelte.d.ts +18 -0
- package/dist/components/molecules/MediaLayerItem/MediaLayerItem.stories.js +8 -0
- package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte +380 -0
- package/dist/components/molecules/MediaLayerItem/MediaLayerItem.svelte.d.ts +33 -0
- package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte +14 -0
- package/dist/components/molecules/MediaLayerItem/MediaLayerItemStory.svelte.d.ts +18 -0
- package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.d.ts +9 -0
- package/dist/components/molecules/MediaLayerList/MediaLayerList.stories.js +8 -0
- package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte +399 -0
- package/dist/components/molecules/MediaLayerList/MediaLayerList.svelte.d.ts +37 -0
- package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte +24 -0
- package/dist/components/molecules/MediaLayerList/MediaLayerListStory.svelte.d.ts +3 -0
- package/dist/components/molecules/MediaStage/MediaStage.stories.d.ts +9 -0
- package/dist/components/molecules/MediaStage/MediaStage.stories.js +8 -0
- package/dist/components/molecules/MediaStage/MediaStage.svelte +1498 -0
- package/dist/components/molecules/MediaStage/MediaStage.svelte.d.ts +45 -0
- package/dist/components/molecules/MediaStage/MediaStageStory.svelte +35 -0
- package/dist/components/molecules/MediaStage/MediaStageStory.svelte.d.ts +3 -0
- package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.d.ts +9 -0
- package/dist/components/molecules/MediaTimeline/MediaTimeline.stories.js +8 -0
- package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte +441 -0
- package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte.d.ts +39 -0
- package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte +20 -0
- package/dist/components/molecules/MediaTimeline/MediaTimelineStory.svelte.d.ts +3 -0
- package/dist/components/molecules/MixerChannel/MixerChannel.stories.d.ts +9 -0
- package/dist/components/molecules/MixerChannel/MixerChannel.stories.js +8 -0
- package/dist/components/molecules/MixerChannel/MixerChannel.svelte +92 -0
- package/dist/components/molecules/MixerChannel/MixerChannel.svelte.d.ts +11 -0
- package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte +13 -0
- package/dist/components/molecules/MixerChannel/MixerChannelStory.svelte.d.ts +3 -0
- package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte +454 -0
- package/dist/components/molecules/NodeGraph/GraphBlueprintNode.svelte.d.ts +8 -0
- package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte +26 -0
- package/dist/components/molecules/NodeGraph/GraphFlowBridge.svelte.d.ts +22 -0
- package/dist/components/molecules/NodeGraph/NodeGraph.stories.d.ts +12 -0
- package/dist/components/molecules/NodeGraph/NodeGraph.stories.js +9 -0
- package/dist/components/molecules/NodeGraph/NodeGraph.svelte +1409 -0
- package/dist/components/molecules/NodeGraph/NodeGraph.svelte.d.ts +33 -0
- package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte +90 -0
- package/dist/components/molecules/NodeGraph/NodeGraphStory.svelte.d.ts +3 -0
- package/dist/components/molecules/NodePalette/NodePalette.stories.js +8 -0
- package/dist/components/molecules/NodePalette/NodePalette.svelte +86 -0
- package/dist/components/molecules/NodePalette/NodePalette.svelte.d.ts +11 -0
- package/dist/components/molecules/NodePalette/NodePaletteStory.svelte +11 -0
- package/dist/components/molecules/NodePalette/NodePaletteStory.svelte.d.ts +18 -0
- package/dist/components/molecules/PdfViewer/PdfViewer.svelte.d.ts +1 -1
- package/dist/components/molecules/Poll/Poll.stories.d.ts +1 -1
- package/dist/components/molecules/ProgramMonitor/ProgramMonitor.stories.js +8 -0
- package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte +794 -0
- package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte.d.ts +25 -0
- package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte +16 -0
- package/dist/components/molecules/ProgramMonitor/ProgramMonitorStory.svelte.d.ts +18 -0
- package/dist/components/molecules/PropertyField/PropertyField.svelte +57 -3
- package/dist/components/molecules/PropertyField/PropertyField.svelte.d.ts +10 -0
- package/dist/components/molecules/PropertyField/PropertyFieldStory.svelte +21 -0
- package/dist/components/molecules/PropertyGroup/PropertyGroup.svelte +1 -1
- package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.d.ts +9 -0
- package/dist/components/molecules/QueryBuilder/QueryBuilder.stories.js +8 -0
- package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte +52 -0
- package/dist/components/molecules/QueryBuilder/QueryBuilder.svelte.d.ts +18 -0
- package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte +62 -0
- package/dist/components/molecules/QueryBuilder/QueryBuilderStory.svelte.d.ts +3 -0
- package/dist/components/molecules/RelationPicker/RelationPicker.stories.d.ts +9 -0
- package/dist/components/molecules/RelationPicker/RelationPicker.stories.js +8 -0
- package/dist/components/molecules/RelationPicker/RelationPicker.svelte +180 -0
- package/dist/components/molecules/RelationPicker/RelationPicker.svelte.d.ts +24 -0
- package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte +16 -0
- package/dist/components/molecules/RelationPicker/RelationPickerStory.svelte.d.ts +3 -0
- package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.d.ts +9 -0
- package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.stories.js +8 -0
- package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte +154 -0
- package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilder.svelte.d.ts +12 -0
- package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte +16 -0
- package/dist/components/molecules/SchemaFieldBuilder/SchemaFieldBuilderStory.svelte.d.ts +3 -0
- package/dist/components/molecules/SecretField/SecretField.stories.d.ts +9 -0
- package/dist/components/molecules/SecretField/SecretField.stories.js +8 -0
- package/dist/components/molecules/SecretField/SecretField.svelte +58 -0
- package/dist/components/molecules/SecretField/SecretField.svelte.d.ts +15 -0
- package/dist/components/molecules/SecretField/SecretFieldStory.svelte +8 -0
- package/dist/components/molecules/SecretField/SecretFieldStory.svelte.d.ts +3 -0
- package/dist/components/molecules/SplitPane/SplitPane.svelte +99 -40
- package/dist/components/molecules/SplitPane/SplitPane.svelte.d.ts +10 -2
- package/dist/components/molecules/TableToolbar/TableToolbar.svelte.d.ts +1 -1
- package/dist/components/molecules/Terminal/Terminal.stories.js +20 -0
- package/dist/components/molecules/Terminal/Terminal.svelte +238 -0
- package/dist/components/molecules/Terminal/Terminal.svelte.d.ts +19 -0
- package/dist/components/molecules/Terminal/TerminalStory.svelte +47 -0
- package/dist/components/molecules/Terminal/TerminalStory.svelte.d.ts +6 -0
- package/dist/components/molecules/TimelineClip/TimelineClip.stories.js +8 -0
- package/dist/components/molecules/TimelineClip/TimelineClip.svelte +193 -0
- package/dist/components/molecules/TimelineClip/TimelineClip.svelte.d.ts +18 -0
- package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte +18 -0
- package/dist/components/molecules/TimelineClip/TimelineClipStory.svelte.d.ts +18 -0
- package/dist/components/molecules/TimelineTrack/TimelineTrack.stories.js +8 -0
- package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte +126 -0
- package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte.d.ts +27 -0
- package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte +35 -0
- package/dist/components/molecules/TimelineTrack/TimelineTrackStory.svelte.d.ts +18 -0
- package/dist/components/molecules/TraceWaterfall/TraceWaterfall.stories.js +8 -0
- package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte +158 -0
- package/dist/components/molecules/TraceWaterfall/TraceWaterfall.svelte.d.ts +18 -0
- package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte +55 -0
- package/dist/components/molecules/TraceWaterfall/TraceWaterfallStory.svelte.d.ts +18 -0
- package/dist/components/molecules/TrackHeader/TrackHeader.stories.d.ts +9 -0
- package/dist/components/molecules/TrackHeader/TrackHeader.stories.js +8 -0
- package/dist/components/molecules/TrackHeader/TrackHeader.svelte +54 -0
- package/dist/components/molecules/TrackHeader/TrackHeader.svelte.d.ts +9 -0
- package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte +10 -0
- package/dist/components/molecules/TrackHeader/TrackHeaderStory.svelte.d.ts +3 -0
- package/dist/components/molecules/TransportControls/TransportControls.stories.d.ts +9 -0
- package/dist/components/molecules/TransportControls/TransportControls.stories.js +8 -0
- package/dist/components/molecules/TransportControls/TransportControls.svelte +135 -0
- package/dist/components/molecules/TransportControls/TransportControls.svelte.d.ts +24 -0
- package/dist/components/molecules/TransportControls/TransportControlsStory.svelte +40 -0
- package/dist/components/molecules/TransportControls/TransportControlsStory.svelte.d.ts +3 -0
- package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.stories.js +8 -0
- package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte +117 -0
- package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanel.svelte.d.ts +20 -0
- package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte +36 -0
- package/dist/components/molecules/VersionHistoryPanel/VersionHistoryPanelStory.svelte.d.ts +18 -0
- package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.stories.js +8 -0
- package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.svelte +213 -0
- package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanel.svelte.d.ts +22 -0
- package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanelStory.svelte +7 -0
- package/dist/components/molecules/VideoAnimationsPanel/VideoAnimationsPanelStory.svelte.d.ts +18 -0
- package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.stories.js +8 -0
- package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.svelte +524 -0
- package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanel.svelte.d.ts +32 -0
- package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanelStory.svelte +7 -0
- package/dist/components/molecules/VideoComponentsPanel/VideoComponentsPanelStory.svelte.d.ts +18 -0
- package/dist/components/molecules/VideoPlayer/VideoPlayer.stories.d.ts +1 -1
- package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.d.ts +9 -0
- package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.stories.js +8 -0
- package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte +112 -0
- package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte.d.ts +15 -0
- package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte +10 -0
- package/dist/components/molecules/VideoTrackHeader/VideoTrackHeaderStory.svelte.d.ts +3 -0
- package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.stories.js +8 -0
- package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.svelte +113 -0
- package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanel.svelte.d.ts +18 -0
- package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanelStory.svelte +7 -0
- package/dist/components/molecules/VideoTransitionsPanel/VideoTransitionsPanelStory.svelte.d.ts +18 -0
- package/dist/components/molecules/WaveformRegion/WaveformRegion.stories.js +8 -0
- package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte +82 -0
- package/dist/components/molecules/WaveformRegion/WaveformRegion.svelte.d.ts +13 -0
- package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte +17 -0
- package/dist/components/molecules/WaveformRegion/WaveformRegionStory.svelte.d.ts +18 -0
- package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte +13 -4
- package/dist/components/molecules/WidgetCanvas/WidgetCanvas.svelte.d.ts +3 -1
- package/dist/components/molecules/WidgetCanvas/widgetCanvasContext.d.ts +2 -0
- package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte +206 -37
- package/dist/components/molecules/WidgetFrame/WidgetFrame.svelte.d.ts +31 -0
- package/dist/components/organisms/AudioEditor/AudioEditor.stories.d.ts +12 -0
- package/dist/components/organisms/AudioEditor/AudioEditor.stories.js +9 -0
- package/dist/components/organisms/AudioEditor/AudioEditor.svelte +324 -0
- package/dist/components/organisms/AudioEditor/AudioEditor.svelte.d.ts +13 -0
- package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte +10 -0
- package/dist/components/organisms/AudioEditor/AudioEditorStory.svelte.d.ts +3 -0
- package/dist/components/organisms/BlogEditor/BlogEditor.stories.d.ts +12 -0
- package/dist/components/organisms/BlogEditor/BlogEditor.stories.js +9 -0
- package/dist/components/organisms/BlogEditor/BlogEditor.svelte +1208 -0
- package/dist/components/organisms/BlogEditor/BlogEditor.svelte.d.ts +16 -0
- package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte +144 -0
- package/dist/components/organisms/BlogEditor/BlogEditorStory.svelte.d.ts +3 -0
- package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte +28 -0
- package/dist/components/organisms/BlogEditor/DemoBlogCard.svelte.d.ts +10 -0
- package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte +34 -0
- package/dist/components/organisms/BlogEditor/DemoBlogStats.svelte.d.ts +11 -0
- package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte +13 -0
- package/dist/components/organisms/BlogEditor/DemoBlogWidget.svelte.d.ts +8 -0
- package/dist/components/organisms/BlogRenderer/BlogRenderer.stories.js +8 -0
- package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte +469 -0
- package/dist/components/organisms/BlogRenderer/BlogRenderer.svelte.d.ts +14 -0
- package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte +20 -0
- package/dist/components/organisms/BlogRenderer/BlogRendererStory.svelte.d.ts +18 -0
- package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.d.ts +12 -0
- package/dist/components/organisms/BlueprintEditor/BlueprintEditor.stories.js +9 -0
- package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte +1012 -0
- package/dist/components/organisms/BlueprintEditor/BlueprintEditor.svelte.d.ts +16 -0
- package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte +76 -0
- package/dist/components/organisms/BlueprintEditor/BlueprintEditorStory.svelte.d.ts +3 -0
- package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.d.ts +12 -0
- package/dist/components/organisms/CanvasEditor/CanvasEditor.stories.js +9 -0
- package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte +1680 -0
- package/dist/components/organisms/CanvasEditor/CanvasEditor.svelte.d.ts +18 -0
- package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte +329 -0
- package/dist/components/organisms/CanvasEditor/CanvasEditorStory.svelte.d.ts +3 -0
- package/dist/components/organisms/DashboardBuilderPage/DashboardBuilderPage.svelte.d.ts +1 -1
- package/dist/components/organisms/DesktopShell/DesktopShell.svelte.d.ts +1 -1
- package/dist/components/organisms/EditorShell/EditorShell.svelte +162 -57
- package/dist/components/organisms/EditorShell/EditorShell.svelte.d.ts +21 -1
- package/dist/components/organisms/FileUploader/FileUploader.stories.d.ts +10 -0
- package/dist/components/organisms/FileUploader/FileUploader.stories.js +21 -0
- package/dist/components/organisms/FileUploader/FileUploader.svelte +127 -25
- package/dist/components/organisms/FileUploader/FileUploader.svelte.d.ts +20 -0
- package/dist/components/organisms/FileUploader/FileUploaderStory.svelte +7 -1
- package/dist/components/organisms/FileUploader/FileUploaderStory.svelte.d.ts +3 -0
- package/dist/components/organisms/ImportWizard/ImportWizard.stories.js +8 -0
- package/dist/components/organisms/ImportWizard/ImportWizard.svelte +209 -0
- package/dist/components/organisms/ImportWizard/ImportWizard.svelte.d.ts +22 -0
- package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte +16 -0
- package/dist/components/organisms/ImportWizard/ImportWizardStory.svelte.d.ts +18 -0
- package/dist/components/organisms/VideoEditor/VideoEditor.stories.d.ts +12 -0
- package/dist/components/organisms/VideoEditor/VideoEditor.stories.js +9 -0
- package/dist/components/organisms/VideoEditor/VideoEditor.svelte +1687 -0
- package/dist/components/organisms/VideoEditor/VideoEditor.svelte.d.ts +14 -0
- package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte +11 -0
- package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte.d.ts +3 -0
- package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.d.ts +12 -0
- package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.stories.js +9 -0
- package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte +22 -0
- package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplate.svelte.d.ts +13 -0
- package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte +8 -0
- package/dist/components/templates/AudioEditorTemplate/AudioEditorTemplateStory.svelte.d.ts +3 -0
- package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.d.ts +12 -0
- package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.stories.js +9 -0
- package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte +32 -0
- package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplate.svelte.d.ts +17 -0
- package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte +21 -0
- package/dist/components/templates/CanvasEditorTemplate/CanvasEditorTemplateStory.svelte.d.ts +3 -0
- package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.d.ts +12 -0
- package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.stories.js +9 -0
- package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte +22 -0
- package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplate.svelte.d.ts +13 -0
- package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte +8 -0
- package/dist/components/templates/VideoEditorTemplate/VideoEditorTemplateStory.svelte.d.ts +3 -0
- package/dist/index.d.ts +91 -1
- package/dist/index.js +64 -0
- package/dist/types/xyflow-svelte.d.ts +62 -0
- package/dist/utils/audioProject.d.ts +19 -0
- package/dist/utils/audioProject.js +70 -0
- package/dist/utils/blogDocument.d.ts +175 -0
- package/dist/utils/blogDocument.js +220 -0
- package/dist/utils/blueprintRuntime.d.ts +34 -0
- package/dist/utils/blueprintRuntime.js +289 -0
- package/dist/utils/canvasDocument.d.ts +239 -0
- package/dist/utils/canvasDocument.js +443 -0
- package/dist/utils/canvasExport.d.ts +10 -0
- package/dist/utils/canvasExport.js +469 -0
- package/dist/utils/canvasHierarchy.d.ts +189 -0
- package/dist/utils/canvasHierarchy.js +674 -0
- package/dist/utils/canvasHistory.d.ts +19 -0
- package/dist/utils/canvasHistory.js +48 -0
- package/dist/utils/canvasWidget.d.ts +81 -0
- package/dist/utils/canvasWidget.js +597 -0
- package/dist/utils/mediaTime.d.ts +26 -0
- package/dist/utils/mediaTime.js +76 -0
- package/dist/utils/mediaTracks.d.ts +215 -0
- package/dist/utils/mediaTracks.js +798 -0
- package/dist/utils/nodeGraph.d.ts +354 -0
- package/dist/utils/nodeGraph.js +1453 -0
- package/dist/utils/queryBridge.d.ts +18 -0
- package/dist/utils/queryBridge.js +118 -0
- package/dist/utils/videoSequence.d.ts +13 -0
- package/dist/utils/videoSequence.js +94 -0
- package/package.json +5 -2
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
import { createCanvasLayer, defaultSlotFromRect, ensureLayerSlot } from './canvasDocument.js';
|
|
2
|
+
import { computeAbsoluteRects, contentPadding, deleteSubtree, getChildren, getSubtreeIds, slotFromLocalRect } from './canvasHierarchy.js';
|
|
3
|
+
import { uid } from './mediaTracks.js';
|
|
4
|
+
const EXPOSEABLE_FIELDS = [
|
|
5
|
+
'text',
|
|
6
|
+
'fill',
|
|
7
|
+
'src',
|
|
8
|
+
'color',
|
|
9
|
+
'opacity',
|
|
10
|
+
'visible',
|
|
11
|
+
'name',
|
|
12
|
+
'fontSize',
|
|
13
|
+
'borderRadius',
|
|
14
|
+
'stroke',
|
|
15
|
+
'strokeWidth',
|
|
16
|
+
'textBackground',
|
|
17
|
+
'objectFit'
|
|
18
|
+
];
|
|
19
|
+
export function isExposeableField(field) {
|
|
20
|
+
return EXPOSEABLE_FIELDS.includes(field);
|
|
21
|
+
}
|
|
22
|
+
export function createWidgetDefinition(partial) {
|
|
23
|
+
return {
|
|
24
|
+
id: partial?.id ?? uid('widget'),
|
|
25
|
+
name: partial?.name ?? 'New Widget',
|
|
26
|
+
width: partial?.width ?? 320,
|
|
27
|
+
height: partial?.height ?? 200,
|
|
28
|
+
background: partial?.background ?? 'transparent',
|
|
29
|
+
layers: (partial?.layers ?? []).map(ensureLayerSlot),
|
|
30
|
+
exposed: partial?.exposed ?? []
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function remapLayerIds(layers) {
|
|
34
|
+
const idMap = new Map();
|
|
35
|
+
for (const l of layers)
|
|
36
|
+
idMap.set(l.id, uid('layer'));
|
|
37
|
+
const next = layers.map((l) => ({
|
|
38
|
+
...l,
|
|
39
|
+
id: idMap.get(l.id),
|
|
40
|
+
parentId: l.parentId && idMap.has(l.parentId) ? idMap.get(l.parentId) : null,
|
|
41
|
+
slot: l.slot
|
|
42
|
+
? {
|
|
43
|
+
...l.slot,
|
|
44
|
+
anchors: { ...l.slot.anchors },
|
|
45
|
+
offsets: { ...l.slot.offsets },
|
|
46
|
+
padding: l.slot.padding ? { ...l.slot.padding } : undefined,
|
|
47
|
+
alignment: l.slot.alignment ? { ...l.slot.alignment } : undefined
|
|
48
|
+
}
|
|
49
|
+
: defaultSlotFromRect(l.rect),
|
|
50
|
+
overrides: l.overrides ? { ...l.overrides } : undefined
|
|
51
|
+
}));
|
|
52
|
+
return { layers: next, idMap };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a User Widget from selected scene layers (must share same parent).
|
|
56
|
+
* Replaces selection with a single widget instance.
|
|
57
|
+
*/
|
|
58
|
+
export function createWidgetFromSelection(doc, selectedIds, name = 'Widget') {
|
|
59
|
+
if (!selectedIds.length)
|
|
60
|
+
return null;
|
|
61
|
+
const set = new Set(selectedIds);
|
|
62
|
+
const selected = doc.layers.filter((l) => set.has(l.id));
|
|
63
|
+
if (!selected.length)
|
|
64
|
+
return null;
|
|
65
|
+
const parentId = selected[0].parentId ?? null;
|
|
66
|
+
if (!selected.every((l) => (l.parentId ?? null) === parentId))
|
|
67
|
+
return null;
|
|
68
|
+
const rootSize = { width: doc.width, height: doc.height };
|
|
69
|
+
const absMap = computeAbsoluteRects(doc.layers, rootSize);
|
|
70
|
+
let minX = Infinity;
|
|
71
|
+
let minY = Infinity;
|
|
72
|
+
let maxX = -Infinity;
|
|
73
|
+
let maxY = -Infinity;
|
|
74
|
+
const subtreeIds = new Set();
|
|
75
|
+
for (const id of selectedIds) {
|
|
76
|
+
for (const sid of getSubtreeIds(doc.layers, id))
|
|
77
|
+
subtreeIds.add(sid);
|
|
78
|
+
const r = absMap.get(id) ?? selected.find((s) => s.id === id).rect;
|
|
79
|
+
minX = Math.min(minX, r.x);
|
|
80
|
+
minY = Math.min(minY, r.y);
|
|
81
|
+
maxX = Math.max(maxX, r.x + r.w);
|
|
82
|
+
maxY = Math.max(maxY, r.y + r.h);
|
|
83
|
+
}
|
|
84
|
+
const defW = Math.max(24, maxX - minX);
|
|
85
|
+
const defH = Math.max(24, maxY - minY);
|
|
86
|
+
const rawLayers = doc.layers.filter((l) => subtreeIds.has(l.id));
|
|
87
|
+
const { layers: remapped, idMap } = remapLayerIds(rawLayers);
|
|
88
|
+
// Re-root selected roots under null and convert abs → local within widget
|
|
89
|
+
const defLayers = remapped.map((l) => {
|
|
90
|
+
const oldId = [...idMap.entries()].find(([, n]) => n === l.id)?.[0];
|
|
91
|
+
const wasRoot = oldId ? selectedIds.includes(oldId) : false;
|
|
92
|
+
if (wasRoot) {
|
|
93
|
+
const abs = oldId ? absMap.get(oldId) : null;
|
|
94
|
+
const local = abs
|
|
95
|
+
? { x: abs.x - minX, y: abs.y - minY, w: abs.w, h: abs.h }
|
|
96
|
+
: l.rect;
|
|
97
|
+
return {
|
|
98
|
+
...l,
|
|
99
|
+
parentId: null,
|
|
100
|
+
rect: local,
|
|
101
|
+
slot: defaultSlotFromRect(local)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return l;
|
|
105
|
+
});
|
|
106
|
+
const definition = createWidgetDefinition({
|
|
107
|
+
name,
|
|
108
|
+
width: defW,
|
|
109
|
+
height: defH,
|
|
110
|
+
layers: defLayers,
|
|
111
|
+
exposed: []
|
|
112
|
+
});
|
|
113
|
+
const zIndex = Math.min(...selected.map((s) => s.zIndex));
|
|
114
|
+
const instanceRect = { x: minX, y: minY, w: defW, h: defH };
|
|
115
|
+
// Convert instance rect to parent-local (respect content padding)
|
|
116
|
+
let localRect = instanceRect;
|
|
117
|
+
let slot = defaultSlotFromRect(instanceRect);
|
|
118
|
+
if (parentId) {
|
|
119
|
+
const parentLayer = doc.layers.find((l) => l.id === parentId) ?? null;
|
|
120
|
+
const parentAbs = absMap.get(parentId) ?? { x: 0, y: 0, w: doc.width, h: doc.height };
|
|
121
|
+
const pad = parentLayer
|
|
122
|
+
? contentPadding(parentLayer)
|
|
123
|
+
: { left: 0, top: 0, right: 0, bottom: 0 };
|
|
124
|
+
const contentW = Math.max(1, parentAbs.w - pad.left - pad.right);
|
|
125
|
+
const contentH = Math.max(1, parentAbs.h - pad.top - pad.bottom);
|
|
126
|
+
localRect = {
|
|
127
|
+
x: instanceRect.x - parentAbs.x - pad.left,
|
|
128
|
+
y: instanceRect.y - parentAbs.y - pad.top,
|
|
129
|
+
w: defW,
|
|
130
|
+
h: defH
|
|
131
|
+
};
|
|
132
|
+
slot = slotFromLocalRect({ width: contentW, height: contentH }, localRect);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
slot = slotFromLocalRect({ width: doc.width, height: doc.height }, instanceRect);
|
|
136
|
+
localRect = instanceRect;
|
|
137
|
+
}
|
|
138
|
+
const instance = createCanvasLayer('widget', {
|
|
139
|
+
name,
|
|
140
|
+
parentId,
|
|
141
|
+
definitionId: definition.id,
|
|
142
|
+
overrides: {},
|
|
143
|
+
rect: localRect,
|
|
144
|
+
slot,
|
|
145
|
+
zIndex
|
|
146
|
+
});
|
|
147
|
+
let layers = doc.layers.filter((l) => !subtreeIds.has(l.id));
|
|
148
|
+
layers = [...layers, instance];
|
|
149
|
+
return {
|
|
150
|
+
doc: {
|
|
151
|
+
...doc,
|
|
152
|
+
version: 2,
|
|
153
|
+
widgets: [...(doc.widgets ?? []), definition],
|
|
154
|
+
layers
|
|
155
|
+
},
|
|
156
|
+
definitionId: definition.id,
|
|
157
|
+
instanceId: instance.id
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/** Place a new instance of a widget definition into the document. */
|
|
161
|
+
export function placeWidgetInstance(doc, definitionId, opts) {
|
|
162
|
+
const def = (doc.widgets ?? []).find((w) => w.id === definitionId);
|
|
163
|
+
if (!def)
|
|
164
|
+
return null;
|
|
165
|
+
const parentId = opts?.parentId ?? null;
|
|
166
|
+
const absMap = computeAbsoluteRects(doc.layers, { width: doc.width, height: doc.height });
|
|
167
|
+
const parentLayer = parentId ? (doc.layers.find((l) => l.id === parentId) ?? null) : null;
|
|
168
|
+
const parentAbs = parentId
|
|
169
|
+
? (absMap.get(parentId) ?? { x: 0, y: 0, w: doc.width, h: doc.height })
|
|
170
|
+
: { x: 0, y: 0, w: doc.width, h: doc.height };
|
|
171
|
+
const pad = parentLayer
|
|
172
|
+
? contentPadding(parentLayer)
|
|
173
|
+
: { left: 0, top: 0, right: 0, bottom: 0 };
|
|
174
|
+
const contentW = Math.max(1, parentAbs.w - pad.left - pad.right);
|
|
175
|
+
const contentH = Math.max(1, parentAbs.h - pad.top - pad.bottom);
|
|
176
|
+
const x = opts?.x ?? (parentId ? Math.round((contentW - def.width) / 2) : 80);
|
|
177
|
+
const y = opts?.y ?? (parentId ? Math.round((contentH - def.height) / 2) : 80);
|
|
178
|
+
const rect = { x, y, w: def.width, h: def.height };
|
|
179
|
+
const siblings = getChildren(doc.layers, parentId);
|
|
180
|
+
const zIndex = siblings.length ? Math.max(...siblings.map((s) => s.zIndex)) + 1 : 0;
|
|
181
|
+
const instance = createCanvasLayer('widget', {
|
|
182
|
+
name: opts?.name ?? def.name,
|
|
183
|
+
parentId,
|
|
184
|
+
definitionId,
|
|
185
|
+
overrides: {},
|
|
186
|
+
rect,
|
|
187
|
+
slot: slotFromLocalRect(parentId ? { width: contentW, height: contentH } : { width: doc.width, height: doc.height }, rect),
|
|
188
|
+
zIndex
|
|
189
|
+
});
|
|
190
|
+
return { ...doc, version: 2, layers: [...doc.layers, instance] };
|
|
191
|
+
}
|
|
192
|
+
/** Rename a widget definition (and matching instance names that still equal the old name). */
|
|
193
|
+
export function renameWidgetDefinition(doc, definitionId, name) {
|
|
194
|
+
const trimmed = name.trim() || 'Widget';
|
|
195
|
+
const prev = (doc.widgets ?? []).find((w) => w.id === definitionId);
|
|
196
|
+
const oldName = prev?.name;
|
|
197
|
+
return {
|
|
198
|
+
...doc,
|
|
199
|
+
version: 2,
|
|
200
|
+
widgets: (doc.widgets ?? []).map((w) => (w.id === definitionId ? { ...w, name: trimmed } : w)),
|
|
201
|
+
layers: doc.layers.map((l) => l.kind === 'widget' && l.definitionId === definitionId && (!oldName || l.name === oldName)
|
|
202
|
+
? { ...l, name: trimmed }
|
|
203
|
+
: l)
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/** Duplicate a widget definition (new id, remapped layer ids). Does not place an instance. */
|
|
207
|
+
export function duplicateWidgetDefinition(doc, definitionId) {
|
|
208
|
+
const def = (doc.widgets ?? []).find((w) => w.id === definitionId);
|
|
209
|
+
if (!def)
|
|
210
|
+
return null;
|
|
211
|
+
const { layers, idMap } = remapLayerIds(def.layers);
|
|
212
|
+
const exposed = def.exposed.map((e) => ({
|
|
213
|
+
...e,
|
|
214
|
+
id: uid('exp'),
|
|
215
|
+
targetLayerId: idMap.get(e.targetLayerId) ?? e.targetLayerId
|
|
216
|
+
}));
|
|
217
|
+
const definition = createWidgetDefinition({
|
|
218
|
+
name: `${def.name} Copy`,
|
|
219
|
+
width: def.width,
|
|
220
|
+
height: def.height,
|
|
221
|
+
background: def.background,
|
|
222
|
+
layers,
|
|
223
|
+
exposed
|
|
224
|
+
});
|
|
225
|
+
return {
|
|
226
|
+
doc: {
|
|
227
|
+
...doc,
|
|
228
|
+
version: 2,
|
|
229
|
+
widgets: [...(doc.widgets ?? []), definition]
|
|
230
|
+
},
|
|
231
|
+
definitionId: definition.id
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* When a blueprint artboard size changes, optionally resize all instances to match.
|
|
236
|
+
*/
|
|
237
|
+
export function syncInstanceSizesToDefinition(doc, definitionId) {
|
|
238
|
+
const def = (doc.widgets ?? []).find((w) => w.id === definitionId);
|
|
239
|
+
if (!def)
|
|
240
|
+
return doc;
|
|
241
|
+
const absMap = computeAbsoluteRects(doc.layers, { width: doc.width, height: doc.height });
|
|
242
|
+
return {
|
|
243
|
+
...doc,
|
|
244
|
+
layers: doc.layers.map((l) => {
|
|
245
|
+
if (l.kind !== 'widget' || l.definitionId !== definitionId)
|
|
246
|
+
return l;
|
|
247
|
+
const parentId = l.parentId ?? null;
|
|
248
|
+
const parentLayer = parentId ? (doc.layers.find((p) => p.id === parentId) ?? null) : null;
|
|
249
|
+
const parentAbs = parentId
|
|
250
|
+
? (absMap.get(parentId) ?? { x: 0, y: 0, w: doc.width, h: doc.height })
|
|
251
|
+
: { x: 0, y: 0, w: doc.width, h: doc.height };
|
|
252
|
+
const pad = parentLayer
|
|
253
|
+
? contentPadding(parentLayer)
|
|
254
|
+
: { left: 0, top: 0, right: 0, bottom: 0 };
|
|
255
|
+
const contentW = Math.max(1, parentAbs.w - pad.left - pad.right);
|
|
256
|
+
const contentH = Math.max(1, parentAbs.h - pad.top - pad.bottom);
|
|
257
|
+
const rect = { ...l.rect, w: def.width, h: def.height };
|
|
258
|
+
const slot = slotFromLocalRect(parentId ? { width: contentW, height: contentH } : { width: doc.width, height: doc.height }, rect, l.slot?.anchors);
|
|
259
|
+
return {
|
|
260
|
+
...l,
|
|
261
|
+
rect,
|
|
262
|
+
slot: {
|
|
263
|
+
...slot,
|
|
264
|
+
padding: l.slot?.padding,
|
|
265
|
+
sizeRule: l.slot?.sizeRule,
|
|
266
|
+
alignment: l.slot?.alignment,
|
|
267
|
+
order: l.slot?.order
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
})
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
function applyFieldOverride(layer, field, value) {
|
|
274
|
+
return { ...layer, [field]: value };
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Resolve a widget instance into concrete layers (for render/export).
|
|
278
|
+
* Layer ids are prefixed so they don't collide with scene ids.
|
|
279
|
+
*/
|
|
280
|
+
export function resolveWidgetInstance(instance, definition, idPrefix) {
|
|
281
|
+
const prefix = idPrefix ?? `${instance.id}::`;
|
|
282
|
+
const idMap = new Map();
|
|
283
|
+
for (const l of definition.layers)
|
|
284
|
+
idMap.set(l.id, `${prefix}${l.id}`);
|
|
285
|
+
const overrides = instance.overrides ?? {};
|
|
286
|
+
const exposedById = new Map(definition.exposed.filter((e) => e.exposed).map((e) => [e.id, e]));
|
|
287
|
+
const fieldOverrides = new Map();
|
|
288
|
+
for (const [propId, value] of Object.entries(overrides)) {
|
|
289
|
+
const exp = exposedById.get(propId);
|
|
290
|
+
if (!exp)
|
|
291
|
+
continue;
|
|
292
|
+
const m = fieldOverrides.get(exp.targetLayerId) ?? new Map();
|
|
293
|
+
m.set(exp.field, value);
|
|
294
|
+
fieldOverrides.set(exp.targetLayerId, m);
|
|
295
|
+
}
|
|
296
|
+
return definition.layers.map((l) => {
|
|
297
|
+
let next = {
|
|
298
|
+
...l,
|
|
299
|
+
id: idMap.get(l.id),
|
|
300
|
+
parentId: l.parentId ? (idMap.get(l.parentId) ?? null) : null,
|
|
301
|
+
slot: l.slot
|
|
302
|
+
? {
|
|
303
|
+
...l.slot,
|
|
304
|
+
anchors: { ...l.slot.anchors },
|
|
305
|
+
offsets: { ...l.slot.offsets }
|
|
306
|
+
}
|
|
307
|
+
: defaultSlotFromRect(l.rect)
|
|
308
|
+
};
|
|
309
|
+
const fo = fieldOverrides.get(l.id);
|
|
310
|
+
if (fo) {
|
|
311
|
+
for (const [field, value] of fo) {
|
|
312
|
+
next = applyFieldOverride(next, field, value);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return next;
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
/** Expand all widget instances in a layer list (nested widgets + named-slot injection). */
|
|
319
|
+
export function flattenLayersWithWidgets(layers, widgets, depth = 0) {
|
|
320
|
+
if (depth > 8)
|
|
321
|
+
return layers;
|
|
322
|
+
const defs = new Map(widgets.map((w) => [w.id, w]));
|
|
323
|
+
const widgetIds = new Set(layers.filter((l) => l.kind === 'widget' && l.definitionId).map((l) => l.id));
|
|
324
|
+
const out = [];
|
|
325
|
+
for (const layer of layers) {
|
|
326
|
+
// Scene children of widget instances are re-attached during expand (named slots / host).
|
|
327
|
+
if (layer.parentId && widgetIds.has(layer.parentId) && layer.kind !== 'widget') {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
if (layer.kind === 'widget' && layer.definitionId) {
|
|
331
|
+
const def = defs.get(layer.definitionId);
|
|
332
|
+
if (!def) {
|
|
333
|
+
out.push(layer);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
const resolved = resolveWidgetInstance(layer, def);
|
|
337
|
+
const nested = resolved.map((l) => l.parentId === null ? { ...l, parentId: layer.id } : l);
|
|
338
|
+
const slotByName = new Map();
|
|
339
|
+
for (const l of nested) {
|
|
340
|
+
if (l.kind === 'namedSlot') {
|
|
341
|
+
const key = (l.slotName || l.name || '').trim();
|
|
342
|
+
if (key)
|
|
343
|
+
slotByName.set(key, l.id);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
const sceneKids = layers.filter((l) => (l.parentId ?? null) === layer.id);
|
|
347
|
+
const hostLocal = {
|
|
348
|
+
...layer,
|
|
349
|
+
parentId: null,
|
|
350
|
+
kind: 'group',
|
|
351
|
+
clipChildren: false,
|
|
352
|
+
rect: { x: 0, y: 0, w: layer.rect.w, h: layer.rect.h },
|
|
353
|
+
slot: defaultSlotFromRect({ x: 0, y: 0, w: layer.rect.w, h: layer.rect.h })
|
|
354
|
+
};
|
|
355
|
+
const layoutProbe = computeAbsoluteRects([hostLocal, ...nested], {
|
|
356
|
+
width: layer.rect.w,
|
|
357
|
+
height: layer.rect.h
|
|
358
|
+
});
|
|
359
|
+
const injected = sceneKids.map((kid) => {
|
|
360
|
+
const target = kid.fillSlot?.trim();
|
|
361
|
+
const slotId = target ? slotByName.get(target) : undefined;
|
|
362
|
+
if (!slotId) {
|
|
363
|
+
return { ...kid, parentId: layer.id };
|
|
364
|
+
}
|
|
365
|
+
// Scene stores widget-local rects (parentId = instance). Convert to
|
|
366
|
+
// slot-local so paint/hit-test match the named slot coordinate space.
|
|
367
|
+
const slotAbs = layoutProbe.get(slotId) ?? { x: 0, y: 0, w: 0, h: 0 };
|
|
368
|
+
const local = {
|
|
369
|
+
x: kid.rect.x - slotAbs.x,
|
|
370
|
+
y: kid.rect.y - slotAbs.y,
|
|
371
|
+
w: kid.rect.w,
|
|
372
|
+
h: kid.rect.h
|
|
373
|
+
};
|
|
374
|
+
return {
|
|
375
|
+
...kid,
|
|
376
|
+
parentId: slotId,
|
|
377
|
+
rect: local,
|
|
378
|
+
slot: kid.slot
|
|
379
|
+
? {
|
|
380
|
+
...kid.slot,
|
|
381
|
+
...slotFromLocalRect({ width: Math.max(1, slotAbs.w), height: Math.max(1, slotAbs.h) }, local, kid.slot.anchors)
|
|
382
|
+
}
|
|
383
|
+
: defaultSlotFromRect(local)
|
|
384
|
+
};
|
|
385
|
+
});
|
|
386
|
+
out.push({
|
|
387
|
+
...layer,
|
|
388
|
+
clipChildren: true,
|
|
389
|
+
kind: 'group',
|
|
390
|
+
name: layer.name
|
|
391
|
+
});
|
|
392
|
+
out.push(...flattenLayersWithWidgets([...nested, ...injected], widgets, depth + 1));
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
out.push(layer);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
return out;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Break / detach instance: inline resolved layers into the document and remove the instance.
|
|
402
|
+
*/
|
|
403
|
+
export function breakWidgetInstance(doc, instanceId) {
|
|
404
|
+
const instance = doc.layers.find((l) => l.id === instanceId && l.kind === 'widget');
|
|
405
|
+
if (!instance?.definitionId)
|
|
406
|
+
return doc;
|
|
407
|
+
const def = (doc.widgets ?? []).find((w) => w.id === instance.definitionId);
|
|
408
|
+
if (!def)
|
|
409
|
+
return doc;
|
|
410
|
+
const absMap = computeAbsoluteRects(doc.layers, { width: doc.width, height: doc.height });
|
|
411
|
+
const instAbs = absMap.get(instanceId) ?? instance.rect;
|
|
412
|
+
const resolved = resolveWidgetInstance(instance, def);
|
|
413
|
+
const { layers: remapped, idMap } = remapLayerIds(resolved);
|
|
414
|
+
const inlined = remapped.map((l) => {
|
|
415
|
+
if (l.parentId === null) {
|
|
416
|
+
const abs = {
|
|
417
|
+
x: instAbs.x + l.rect.x,
|
|
418
|
+
y: instAbs.y + l.rect.y,
|
|
419
|
+
w: l.rect.w,
|
|
420
|
+
h: l.rect.h
|
|
421
|
+
};
|
|
422
|
+
const parentId = instance.parentId ?? null;
|
|
423
|
+
if (parentId) {
|
|
424
|
+
const pa = absMap.get(parentId) ?? { x: 0, y: 0, w: doc.width, h: doc.height };
|
|
425
|
+
const lr = { x: abs.x - pa.x, y: abs.y - pa.y, w: abs.w, h: abs.h };
|
|
426
|
+
return {
|
|
427
|
+
...l,
|
|
428
|
+
parentId,
|
|
429
|
+
rect: lr,
|
|
430
|
+
slot: slotFromLocalRect({ width: pa.w, height: pa.h }, lr),
|
|
431
|
+
zIndex: instance.zIndex + (l.zIndex ?? 0)
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
return {
|
|
435
|
+
...l,
|
|
436
|
+
parentId: null,
|
|
437
|
+
rect: abs,
|
|
438
|
+
slot: defaultSlotFromRect(abs),
|
|
439
|
+
zIndex: instance.zIndex + (l.zIndex ?? 0)
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
return { ...l, zIndex: instance.zIndex + (l.zIndex ?? 0) };
|
|
443
|
+
});
|
|
444
|
+
const layers = [...doc.layers.filter((l) => l.id !== instanceId), ...inlined];
|
|
445
|
+
return { ...doc, layers };
|
|
446
|
+
}
|
|
447
|
+
export function updateWidgetDefinition(doc, definitionId, updater) {
|
|
448
|
+
const widgets = (doc.widgets ?? []).map((w) => (w.id === definitionId ? updater(w) : w));
|
|
449
|
+
return { ...doc, version: 2, widgets };
|
|
450
|
+
}
|
|
451
|
+
/** Remove a widget definition and all of its instances (including nested scene children). */
|
|
452
|
+
export function deleteWidgetDefinition(doc, definitionId) {
|
|
453
|
+
const instanceIds = doc.layers
|
|
454
|
+
.filter((l) => l.kind === 'widget' && l.definitionId === definitionId)
|
|
455
|
+
.map((l) => l.id);
|
|
456
|
+
const remove = new Set();
|
|
457
|
+
for (const id of instanceIds) {
|
|
458
|
+
for (const sid of getSubtreeIds(doc.layers, id))
|
|
459
|
+
remove.add(sid);
|
|
460
|
+
}
|
|
461
|
+
return {
|
|
462
|
+
...doc,
|
|
463
|
+
version: 2,
|
|
464
|
+
widgets: (doc.widgets ?? []).filter((w) => w.id !== definitionId),
|
|
465
|
+
layers: doc.layers.filter((l) => !remove.has(l.id))
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
export function setExposedProp(def, targetLayerId, field, exposed, label) {
|
|
469
|
+
const existing = def.exposed.find((e) => e.targetLayerId === targetLayerId && e.field === field);
|
|
470
|
+
if (!exposed) {
|
|
471
|
+
return {
|
|
472
|
+
...def,
|
|
473
|
+
exposed: def.exposed.filter((e) => !(e.targetLayerId === targetLayerId && e.field === field))
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
if (existing) {
|
|
477
|
+
return {
|
|
478
|
+
...def,
|
|
479
|
+
exposed: def.exposed.map((e) => e.id === existing.id ? { ...e, exposed: true, label: label ?? e.label } : e)
|
|
480
|
+
};
|
|
481
|
+
}
|
|
482
|
+
const prop = {
|
|
483
|
+
id: uid('exp'),
|
|
484
|
+
targetLayerId,
|
|
485
|
+
field,
|
|
486
|
+
label: label ?? field,
|
|
487
|
+
exposed: true
|
|
488
|
+
};
|
|
489
|
+
return { ...def, exposed: [...def.exposed, prop] };
|
|
490
|
+
}
|
|
491
|
+
export function isPropExposed(def, layerId, field) {
|
|
492
|
+
if (!def)
|
|
493
|
+
return false;
|
|
494
|
+
return def.exposed.some((e) => e.exposed && e.targetLayerId === layerId && e.field === field);
|
|
495
|
+
}
|
|
496
|
+
export function getExposedProp(def, layerId, field) {
|
|
497
|
+
return def?.exposed.find((e) => e.targetLayerId === layerId && e.field === field);
|
|
498
|
+
}
|
|
499
|
+
/** Blueprint default for an exposed prop (value on the target layer inside the definition). */
|
|
500
|
+
export function getExposedFieldDefault(def, prop) {
|
|
501
|
+
const target = def.layers.find((l) => l.id === prop.targetLayerId);
|
|
502
|
+
if (!target)
|
|
503
|
+
return undefined;
|
|
504
|
+
const value = target[prop.field];
|
|
505
|
+
if (value !== undefined)
|
|
506
|
+
return value;
|
|
507
|
+
if (prop.field === 'visible')
|
|
508
|
+
return true;
|
|
509
|
+
if (prop.field === 'opacity')
|
|
510
|
+
return 1;
|
|
511
|
+
if (prop.field === 'fontSize')
|
|
512
|
+
return 32;
|
|
513
|
+
if (prop.field === 'fill' || prop.field === 'color' || prop.field === 'stroke')
|
|
514
|
+
return '#000000';
|
|
515
|
+
return undefined;
|
|
516
|
+
}
|
|
517
|
+
/** Instance override if set, otherwise the blueprint default. */
|
|
518
|
+
export function resolveExposedPropValue(instance, def, prop) {
|
|
519
|
+
if (instance.overrides && Object.prototype.hasOwnProperty.call(instance.overrides, prop.id)) {
|
|
520
|
+
return instance.overrides[prop.id];
|
|
521
|
+
}
|
|
522
|
+
return getExposedFieldDefault(def, prop);
|
|
523
|
+
}
|
|
524
|
+
/** Group exposed props by target layer for inspector headers. */
|
|
525
|
+
export function groupExposedPropsByLayer(def) {
|
|
526
|
+
const props = def.exposed.filter((e) => e.exposed);
|
|
527
|
+
const order = [];
|
|
528
|
+
const map = new Map();
|
|
529
|
+
for (const p of props) {
|
|
530
|
+
if (!map.has(p.targetLayerId)) {
|
|
531
|
+
order.push(p.targetLayerId);
|
|
532
|
+
map.set(p.targetLayerId, []);
|
|
533
|
+
}
|
|
534
|
+
map.get(p.targetLayerId).push(p);
|
|
535
|
+
}
|
|
536
|
+
return order.map((layerId) => {
|
|
537
|
+
const target = def.layers.find((l) => l.id === layerId);
|
|
538
|
+
return {
|
|
539
|
+
layerId,
|
|
540
|
+
layerName: target?.name?.trim() || target?.kind || 'Layer',
|
|
541
|
+
props: map.get(layerId)
|
|
542
|
+
};
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
export function setInstanceOverride(doc, instanceId, propId, value) {
|
|
546
|
+
return {
|
|
547
|
+
...doc,
|
|
548
|
+
layers: doc.layers.map((l) => {
|
|
549
|
+
if (l.id !== instanceId)
|
|
550
|
+
return l;
|
|
551
|
+
const overrides = { ...(l.overrides ?? {}) };
|
|
552
|
+
if (value === undefined)
|
|
553
|
+
delete overrides[propId];
|
|
554
|
+
else
|
|
555
|
+
overrides[propId] = value;
|
|
556
|
+
return { ...l, overrides };
|
|
557
|
+
})
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
export function documentAsWidgetEditSurface(doc, definitionId) {
|
|
561
|
+
const def = (doc.widgets ?? []).find((w) => w.id === definitionId);
|
|
562
|
+
if (!def)
|
|
563
|
+
return null;
|
|
564
|
+
return {
|
|
565
|
+
width: def.width,
|
|
566
|
+
height: def.height,
|
|
567
|
+
background: def.background ?? '#ffffff',
|
|
568
|
+
layers: def.layers
|
|
569
|
+
};
|
|
570
|
+
}
|
|
571
|
+
export function patchWidgetEditSurface(doc, definitionId, surface) {
|
|
572
|
+
return updateWidgetDefinition(doc, definitionId, (d) => ({
|
|
573
|
+
...d,
|
|
574
|
+
width: surface.width ?? d.width,
|
|
575
|
+
height: surface.height ?? d.height,
|
|
576
|
+
background: surface.background ?? d.background,
|
|
577
|
+
layers: surface.layers ?? d.layers
|
|
578
|
+
}));
|
|
579
|
+
}
|
|
580
|
+
export function getNamedSlotsFromDefinition(def) {
|
|
581
|
+
if (!def)
|
|
582
|
+
return [];
|
|
583
|
+
return def.layers
|
|
584
|
+
.filter((l) => l.kind === 'namedSlot')
|
|
585
|
+
.map((l) => ({
|
|
586
|
+
layerId: l.id,
|
|
587
|
+
name: (l.slotName || l.name || 'Slot').trim()
|
|
588
|
+
}));
|
|
589
|
+
}
|
|
590
|
+
export function listFillableSlotsForInstance(doc, instanceId) {
|
|
591
|
+
const inst = doc.layers.find((l) => l.id === instanceId && l.kind === 'widget');
|
|
592
|
+
if (!inst?.definitionId)
|
|
593
|
+
return [];
|
|
594
|
+
const def = (doc.widgets ?? []).find((w) => w.id === inst.definitionId);
|
|
595
|
+
return getNamedSlotsFromDefinition(def).map((s) => s.name);
|
|
596
|
+
}
|
|
597
|
+
export { deleteSubtree };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Milliseconds ↔ pixels and timecode helpers for media timelines. */
|
|
2
|
+
export type TimeTickLevel = 'major' | 'mid' | 'minor';
|
|
3
|
+
export interface TimeTick {
|
|
4
|
+
ms: number;
|
|
5
|
+
level: TimeTickLevel;
|
|
6
|
+
/** @deprecated Prefer `level === 'major'` */
|
|
7
|
+
major: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function msToPx(ms: number, pxPerMs: number): number;
|
|
10
|
+
export declare function pxToMs(px: number, pxPerMs: number): number;
|
|
11
|
+
/** px per ms from a zoom level (1 = 0.05 px/ms ≈ 50px/s). */
|
|
12
|
+
export declare function pxPerMsFromZoom(zoom: number): number;
|
|
13
|
+
export declare function snapMs(ms: number, snapToMs: number): number;
|
|
14
|
+
export declare function clampMs(ms: number, min?: number, max?: number): number;
|
|
15
|
+
/** Format as HH:MM:SS or MM:SS.mmm when showMs. */
|
|
16
|
+
export declare function formatTimecode(ms: number, opts?: {
|
|
17
|
+
showMs?: boolean;
|
|
18
|
+
fps?: number;
|
|
19
|
+
}): string;
|
|
20
|
+
/**
|
|
21
|
+
* Major / mid / minor ticks for a duration (same hierarchy idea as MediaStage rulers).
|
|
22
|
+
* mid = major/2, minor = major/10.
|
|
23
|
+
*/
|
|
24
|
+
export declare function ticksForDuration(durationMs: number, pxPerMs: number, minTickPx?: number): TimeTick[];
|
|
25
|
+
/** Suggested snap interval from current zoom (mid tick step). */
|
|
26
|
+
export declare function snapStepForZoom(pxPerMs: number, minTickPx?: number): number;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/** Milliseconds ↔ pixels and timecode helpers for media timelines. */
|
|
2
|
+
export function msToPx(ms, pxPerMs) {
|
|
3
|
+
return ms * pxPerMs;
|
|
4
|
+
}
|
|
5
|
+
export function pxToMs(px, pxPerMs) {
|
|
6
|
+
if (pxPerMs <= 0)
|
|
7
|
+
return 0;
|
|
8
|
+
return px / pxPerMs;
|
|
9
|
+
}
|
|
10
|
+
/** px per ms from a zoom level (1 = 0.05 px/ms ≈ 50px/s). */
|
|
11
|
+
export function pxPerMsFromZoom(zoom) {
|
|
12
|
+
return Math.max(0.001, zoom) * 0.05;
|
|
13
|
+
}
|
|
14
|
+
export function snapMs(ms, snapToMs) {
|
|
15
|
+
if (snapToMs <= 0)
|
|
16
|
+
return ms;
|
|
17
|
+
return Math.round(ms / snapToMs) * snapToMs;
|
|
18
|
+
}
|
|
19
|
+
export function clampMs(ms, min = 0, max = Number.POSITIVE_INFINITY) {
|
|
20
|
+
return Math.min(max, Math.max(min, ms));
|
|
21
|
+
}
|
|
22
|
+
/** Format as HH:MM:SS or MM:SS.mmm when showMs. */
|
|
23
|
+
export function formatTimecode(ms, opts) {
|
|
24
|
+
const showMs = opts?.showMs ?? false;
|
|
25
|
+
const fps = opts?.fps;
|
|
26
|
+
const total = Math.max(0, Math.floor(ms));
|
|
27
|
+
const hours = Math.floor(total / 3_600_000);
|
|
28
|
+
const minutes = Math.floor((total % 3_600_000) / 60_000);
|
|
29
|
+
const seconds = Math.floor((total % 60_000) / 1000);
|
|
30
|
+
const millis = total % 1000;
|
|
31
|
+
const hh = hours > 0 ? `${String(hours).padStart(2, '0')}:` : '';
|
|
32
|
+
const mm = String(minutes).padStart(2, '0');
|
|
33
|
+
const ss = String(seconds).padStart(2, '0');
|
|
34
|
+
if (fps && fps > 0) {
|
|
35
|
+
const frame = Math.floor((millis / 1000) * fps) % Math.round(fps);
|
|
36
|
+
return `${hh}${mm}:${ss}:${String(frame).padStart(2, '0')}`;
|
|
37
|
+
}
|
|
38
|
+
if (showMs) {
|
|
39
|
+
return `${hh}${mm}:${ss}.${String(millis).padStart(3, '0')}`;
|
|
40
|
+
}
|
|
41
|
+
return `${hh}${mm}:${ss}`;
|
|
42
|
+
}
|
|
43
|
+
/** Nice major step so major labels sit ~minTickPx apart on screen. */
|
|
44
|
+
function majorStepForPxPerMs(pxPerMs, minTickPx = 64) {
|
|
45
|
+
const candidates = [100, 250, 500, 1000, 2000, 5000, 10_000, 30_000, 60_000, 120_000, 300_000];
|
|
46
|
+
for (const c of candidates) {
|
|
47
|
+
if (msToPx(c, pxPerMs) >= minTickPx)
|
|
48
|
+
return c;
|
|
49
|
+
}
|
|
50
|
+
return candidates[candidates.length - 1];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Major / mid / minor ticks for a duration (same hierarchy idea as MediaStage rulers).
|
|
54
|
+
* mid = major/2, minor = major/10.
|
|
55
|
+
*/
|
|
56
|
+
export function ticksForDuration(durationMs, pxPerMs, minTickPx = 64) {
|
|
57
|
+
const major = majorStepForPxPerMs(pxPerMs, minTickPx);
|
|
58
|
+
const mid = major / 2;
|
|
59
|
+
const minor = major / 10;
|
|
60
|
+
const ticks = [];
|
|
61
|
+
const eps = minor / 4;
|
|
62
|
+
for (let t = 0; t <= durationMs + eps; t += minor) {
|
|
63
|
+
const ms = Math.round(t * 1000) / 1000;
|
|
64
|
+
if (ms > durationMs)
|
|
65
|
+
break;
|
|
66
|
+
const nearMajor = Math.abs(ms % major) < eps || Math.abs((ms % major) - major) < eps;
|
|
67
|
+
const nearMid = Math.abs(ms % mid) < eps || Math.abs((ms % mid) - mid) < eps;
|
|
68
|
+
const level = nearMajor ? 'major' : nearMid ? 'mid' : 'minor';
|
|
69
|
+
ticks.push({ ms, level, major: level === 'major' });
|
|
70
|
+
}
|
|
71
|
+
return ticks;
|
|
72
|
+
}
|
|
73
|
+
/** Suggested snap interval from current zoom (mid tick step). */
|
|
74
|
+
export function snapStepForZoom(pxPerMs, minTickPx = 64) {
|
|
75
|
+
return majorStepForPxPerMs(pxPerMs, minTickPx) / 2;
|
|
76
|
+
}
|