@r2digisolutions/components 0.1.7 → 0.2.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 +59 -0
- package/dist/components/atoms/Playhead/Playhead.svelte.d.ts +13 -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 +58 -0
- package/dist/components/atoms/TimeRuler/TimeRuler.svelte.d.ts +10 -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/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 +1 -1
- 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 +204 -60
- 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 +94 -0
- package/dist/components/molecules/MediaAssetBrowser/MediaAssetBrowser.svelte.d.ts +15 -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 +131 -0
- package/dist/components/molecules/MediaTimeline/MediaTimeline.svelte.d.ts +19 -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/Poll/Poll.stories.d.ts +1 -1
- package/dist/components/molecules/ProgramMonitor/ProgramMonitor.stories.js +8 -0
- package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte +72 -0
- package/dist/components/molecules/ProgramMonitor/ProgramMonitor.svelte.d.ts +12 -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 +96 -37
- 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 +116 -0
- package/dist/components/molecules/TimelineClip/TimelineClip.svelte.d.ts +15 -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 +56 -0
- package/dist/components/molecules/TimelineTrack/TimelineTrack.svelte.d.ts +16 -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 +53 -0
- package/dist/components/molecules/TransportControls/TransportControls.svelte.d.ts +12 -0
- package/dist/components/molecules/TransportControls/TransportControlsStory.svelte +18 -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/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 +59 -0
- package/dist/components/molecules/VideoTrackHeader/VideoTrackHeader.svelte.d.ts +9 -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/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 +273 -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 +123 -28
- package/dist/components/organisms/EditorShell/EditorShell.svelte.d.ts +21 -1
- package/dist/components/organisms/FileUploader/FileUploader.svelte +77 -15
- package/dist/components/organisms/FileUploader/FileUploader.svelte.d.ts +11 -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 +308 -0
- package/dist/components/organisms/VideoEditor/VideoEditor.svelte.d.ts +13 -0
- package/dist/components/organisms/VideoEditor/VideoEditorStory.svelte +10 -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 +83 -1
- package/dist/index.js +60 -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 +16 -0
- package/dist/utils/mediaTime.js +57 -0
- package/dist/utils/mediaTracks.d.ts +61 -0
- package/dist/utils/mediaTracks.js +102 -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 +63 -0
- package/package.json +5 -2
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
import { createCanvasLayer, defaultSlotFromRect, rectFromSlot } from './canvasDocument.js';
|
|
2
|
+
import { uid } from './mediaTracks.js';
|
|
3
|
+
export const CONTAINER_KINDS = new Set([
|
|
4
|
+
'canvasPanel',
|
|
5
|
+
'overlay',
|
|
6
|
+
'border',
|
|
7
|
+
'hBox',
|
|
8
|
+
'vBox',
|
|
9
|
+
'sizeBox',
|
|
10
|
+
'scaleBox',
|
|
11
|
+
'group',
|
|
12
|
+
'image',
|
|
13
|
+
'rect',
|
|
14
|
+
'roundRect',
|
|
15
|
+
'ellipse',
|
|
16
|
+
'namedSlot',
|
|
17
|
+
'scrollBox',
|
|
18
|
+
'wrapBox',
|
|
19
|
+
'uniformGrid'
|
|
20
|
+
]);
|
|
21
|
+
export const LAYOUT_BOX_KINDS = new Set([
|
|
22
|
+
'hBox',
|
|
23
|
+
'vBox',
|
|
24
|
+
'sizeBox',
|
|
25
|
+
'scaleBox',
|
|
26
|
+
'wrapBox',
|
|
27
|
+
'uniformGrid',
|
|
28
|
+
'scrollBox'
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Structural shells whose empty area should start a marquee (not a layer drag),
|
|
32
|
+
* matching Figma-style select-drag on the canvas / inside frames.
|
|
33
|
+
*/
|
|
34
|
+
export const MARQUEE_PASS_KINDS = new Set([
|
|
35
|
+
'canvasPanel',
|
|
36
|
+
'overlay',
|
|
37
|
+
'group',
|
|
38
|
+
...LAYOUT_BOX_KINDS
|
|
39
|
+
]);
|
|
40
|
+
export function isContainerKind(kind) {
|
|
41
|
+
return CONTAINER_KINDS.has(kind);
|
|
42
|
+
}
|
|
43
|
+
export function isMarqueePassThroughKind(kind) {
|
|
44
|
+
return MARQUEE_PASS_KINDS.has(kind);
|
|
45
|
+
}
|
|
46
|
+
export function canHaveChildren(layer) {
|
|
47
|
+
return isContainerKind(layer.kind);
|
|
48
|
+
}
|
|
49
|
+
export function getChildren(layers, parentId) {
|
|
50
|
+
return layers
|
|
51
|
+
.filter((l) => (l.parentId ?? null) === parentId)
|
|
52
|
+
.sort((a, b) => a.zIndex - b.zIndex || (a.slot?.order ?? 0) - (b.slot?.order ?? 0));
|
|
53
|
+
}
|
|
54
|
+
export function getDescendantIds(layers, rootId) {
|
|
55
|
+
const out = [];
|
|
56
|
+
const walk = (pid) => {
|
|
57
|
+
for (const c of getChildren(layers, pid)) {
|
|
58
|
+
out.push(c.id);
|
|
59
|
+
walk(c.id);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
walk(rootId);
|
|
63
|
+
return out;
|
|
64
|
+
}
|
|
65
|
+
export function getSubtreeIds(layers, rootId) {
|
|
66
|
+
return [rootId, ...getDescendantIds(layers, rootId)];
|
|
67
|
+
}
|
|
68
|
+
export function getAncestors(layers, layerId) {
|
|
69
|
+
const map = new Map(layers.map((l) => [l.id, l]));
|
|
70
|
+
const out = [];
|
|
71
|
+
let cur = map.get(layerId);
|
|
72
|
+
while (cur?.parentId) {
|
|
73
|
+
const parent = map.get(cur.parentId);
|
|
74
|
+
if (!parent)
|
|
75
|
+
break;
|
|
76
|
+
out.push(parent);
|
|
77
|
+
cur = parent;
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
/** True when the layer and every ancestor is visible (flat stage paint must check this). */
|
|
82
|
+
export function isEffectivelyVisible(layers, layerId, map) {
|
|
83
|
+
const byId = map ?? new Map(layers.map((l) => [l.id, l]));
|
|
84
|
+
let cur = byId.get(layerId);
|
|
85
|
+
while (cur) {
|
|
86
|
+
if (!cur.visible)
|
|
87
|
+
return false;
|
|
88
|
+
cur = cur.parentId ? byId.get(cur.parentId) : undefined;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* CSS transform for a flat-stage layer so ancestor rotations orbit children
|
|
94
|
+
* around each ancestor's center (DOM is not nested).
|
|
95
|
+
* Uses transform-origin top-left (0 0) of the layer box.
|
|
96
|
+
*/
|
|
97
|
+
export function paintTransformForLayer(layers, layerId, absMap, map) {
|
|
98
|
+
const byId = map ?? new Map(layers.map((l) => [l.id, l]));
|
|
99
|
+
const layer = byId.get(layerId);
|
|
100
|
+
if (!layer)
|
|
101
|
+
return undefined;
|
|
102
|
+
const selfAbs = absMap.get(layerId) ?? layer.rect;
|
|
103
|
+
const ancestors = [];
|
|
104
|
+
let cur = layer.parentId ? byId.get(layer.parentId) : undefined;
|
|
105
|
+
while (cur) {
|
|
106
|
+
ancestors.unshift(cur);
|
|
107
|
+
cur = cur.parentId ? byId.get(cur.parentId) : undefined;
|
|
108
|
+
}
|
|
109
|
+
const parts = [];
|
|
110
|
+
for (const anc of ancestors) {
|
|
111
|
+
const deg = anc.rotation ?? 0;
|
|
112
|
+
if (!deg)
|
|
113
|
+
continue;
|
|
114
|
+
const a = absMap.get(anc.id) ?? anc.rect;
|
|
115
|
+
const ox = a.x + a.w / 2 - selfAbs.x;
|
|
116
|
+
const oy = a.y + a.h / 2 - selfAbs.y;
|
|
117
|
+
parts.push(`translate(${ox}px, ${oy}px) rotate(${deg}deg) translate(${-ox}px, ${-oy}px)`);
|
|
118
|
+
}
|
|
119
|
+
const own = layer.rotation ?? 0;
|
|
120
|
+
if (own) {
|
|
121
|
+
const ox = selfAbs.w / 2;
|
|
122
|
+
const oy = selfAbs.h / 2;
|
|
123
|
+
parts.push(`translate(${ox}px, ${oy}px) rotate(${own}deg) translate(${-ox}px, ${-oy}px)`);
|
|
124
|
+
}
|
|
125
|
+
return parts.length ? parts.join(' ') : undefined;
|
|
126
|
+
}
|
|
127
|
+
export function isDescendant(layers, maybeChildId, ancestorId) {
|
|
128
|
+
return getAncestors(layers, maybeChildId).some((a) => a.id === ancestorId);
|
|
129
|
+
}
|
|
130
|
+
export function canReparent(layers, layerId, newParentId) {
|
|
131
|
+
if (newParentId === null)
|
|
132
|
+
return true;
|
|
133
|
+
if (layerId === newParentId)
|
|
134
|
+
return false;
|
|
135
|
+
const parent = layers.find((l) => l.id === newParentId);
|
|
136
|
+
if (!parent || !canHaveChildren(parent))
|
|
137
|
+
return false;
|
|
138
|
+
if (isDescendant(layers, newParentId, layerId))
|
|
139
|
+
return false;
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
export const ANCHOR_PRESETS = {
|
|
143
|
+
topLeft: { minX: 0, minY: 0, maxX: 0, maxY: 0 },
|
|
144
|
+
topCenter: { minX: 0.5, minY: 0, maxX: 0.5, maxY: 0 },
|
|
145
|
+
topRight: { minX: 1, minY: 0, maxX: 1, maxY: 0 },
|
|
146
|
+
centerLeft: { minX: 0, minY: 0.5, maxX: 0, maxY: 0.5 },
|
|
147
|
+
center: { minX: 0.5, minY: 0.5, maxX: 0.5, maxY: 0.5 },
|
|
148
|
+
centerRight: { minX: 1, minY: 0.5, maxX: 1, maxY: 0.5 },
|
|
149
|
+
bottomLeft: { minX: 0, minY: 1, maxX: 0, maxY: 1 },
|
|
150
|
+
bottomCenter: { minX: 0.5, minY: 1, maxX: 0.5, maxY: 1 },
|
|
151
|
+
bottomRight: { minX: 1, minY: 1, maxX: 1, maxY: 1 },
|
|
152
|
+
stretch: { minX: 0, minY: 0, maxX: 1, maxY: 1 },
|
|
153
|
+
stretchHorizontal: { minX: 0, minY: 0, maxX: 1, maxY: 0 },
|
|
154
|
+
stretchVertical: { minX: 0, minY: 0, maxX: 0, maxY: 1 }
|
|
155
|
+
};
|
|
156
|
+
/** Resolve UMG slot against parent content size → local rect. */
|
|
157
|
+
export function resolveSlotRect(parentSize, slot) {
|
|
158
|
+
const { anchors, offsets } = slot;
|
|
159
|
+
const left = anchors.minX * parentSize.width + offsets.left;
|
|
160
|
+
const top = anchors.minY * parentSize.height + offsets.top;
|
|
161
|
+
const right = anchors.maxX * parentSize.width - offsets.right;
|
|
162
|
+
const bottom = anchors.maxY * parentSize.height - offsets.bottom;
|
|
163
|
+
return {
|
|
164
|
+
x: left,
|
|
165
|
+
y: top,
|
|
166
|
+
w: Math.max(1, right - left),
|
|
167
|
+
h: Math.max(1, bottom - top)
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/** Build slot offsets from a local rect + anchors (keeps anchors, recomputes offsets). */
|
|
171
|
+
export function slotFromLocalRect(parentSize, rect, anchors = ANCHOR_PRESETS.topLeft) {
|
|
172
|
+
return {
|
|
173
|
+
anchors: { ...anchors },
|
|
174
|
+
offsets: {
|
|
175
|
+
left: rect.x - anchors.minX * parentSize.width,
|
|
176
|
+
top: rect.y - anchors.minY * parentSize.height,
|
|
177
|
+
right: anchors.maxX * parentSize.width - (rect.x + rect.w),
|
|
178
|
+
bottom: anchors.maxY * parentSize.height - (rect.y + rect.h)
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
export function contentPadding(layer) {
|
|
183
|
+
const p = layer.slot?.padding;
|
|
184
|
+
return {
|
|
185
|
+
left: p?.left ?? 0,
|
|
186
|
+
top: p?.top ?? 0,
|
|
187
|
+
right: p?.right ?? 0,
|
|
188
|
+
bottom: p?.bottom ?? 0
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
export function contentSize(layerRect, layer) {
|
|
192
|
+
const pad = contentPadding(layer);
|
|
193
|
+
return {
|
|
194
|
+
width: Math.max(0, layerRect.w - pad.left - pad.right),
|
|
195
|
+
height: Math.max(0, layerRect.h - pad.top - pad.bottom)
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Compute absolute (document) rect for every layer via parent walk + layout boxes.
|
|
200
|
+
* Returns map layerId → absolute rect.
|
|
201
|
+
*/
|
|
202
|
+
export function computeAbsoluteRects(layers, rootSize) {
|
|
203
|
+
const abs = new Map();
|
|
204
|
+
const byParent = new Map();
|
|
205
|
+
for (const l of layers) {
|
|
206
|
+
const pid = l.parentId ?? null;
|
|
207
|
+
const list = byParent.get(pid) ?? [];
|
|
208
|
+
list.push(l);
|
|
209
|
+
byParent.set(pid, list);
|
|
210
|
+
}
|
|
211
|
+
for (const [, list] of byParent) {
|
|
212
|
+
list.sort((a, b) => a.zIndex - b.zIndex || (a.slot?.order ?? 0) - (b.slot?.order ?? 0));
|
|
213
|
+
}
|
|
214
|
+
const layoutUnder = (parentId, parentAbs, parentLayer) => {
|
|
215
|
+
const children = byParent.get(parentId) ?? [];
|
|
216
|
+
if (!children.length)
|
|
217
|
+
return;
|
|
218
|
+
const parentW = parentAbs?.w ?? rootSize.width;
|
|
219
|
+
const parentH = parentAbs?.h ?? rootSize.height;
|
|
220
|
+
const pad = parentLayer ? contentPadding(parentLayer) : { left: 0, top: 0, right: 0, bottom: 0 };
|
|
221
|
+
const originX = (parentAbs?.x ?? 0) + pad.left;
|
|
222
|
+
const originY = (parentAbs?.y ?? 0) + pad.top;
|
|
223
|
+
const contentW = Math.max(0, parentW - pad.left - pad.right);
|
|
224
|
+
const contentH = Math.max(0, parentH - pad.top - pad.bottom);
|
|
225
|
+
const kind = parentLayer?.kind;
|
|
226
|
+
let placed = [];
|
|
227
|
+
if (kind === 'hBox' || kind === 'vBox') {
|
|
228
|
+
const gap = parentLayer?.gap ?? 0;
|
|
229
|
+
const horizontal = kind === 'hBox';
|
|
230
|
+
let cursor = 0;
|
|
231
|
+
const flexKids = children.filter((c) => (c.slot?.sizeRule ?? 'fixed') === 'fill');
|
|
232
|
+
const fixedKids = children.filter((c) => (c.slot?.sizeRule ?? 'fixed') !== 'fill');
|
|
233
|
+
let fixedTotal = 0;
|
|
234
|
+
for (const c of fixedKids) {
|
|
235
|
+
const r = c.rect;
|
|
236
|
+
fixedTotal += horizontal ? r.w : r.h;
|
|
237
|
+
}
|
|
238
|
+
fixedTotal += gap * Math.max(0, children.length - 1);
|
|
239
|
+
const remaining = Math.max(0, (horizontal ? contentW : contentH) - fixedTotal);
|
|
240
|
+
const fillEach = flexKids.length ? remaining / flexKids.length : 0;
|
|
241
|
+
for (const c of children) {
|
|
242
|
+
const rule = c.slot?.sizeRule ?? 'fixed';
|
|
243
|
+
const align = c.slot?.alignment ?? { x: 0, y: 0 };
|
|
244
|
+
if (horizontal) {
|
|
245
|
+
const w = rule === 'fill' ? fillEach : c.rect.w;
|
|
246
|
+
const h = rule === 'fill' ? contentH : c.rect.h;
|
|
247
|
+
const y = (contentH - h) * align.y;
|
|
248
|
+
placed.push({ layer: c, local: { x: cursor, y, w, h } });
|
|
249
|
+
cursor += w + gap;
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
const h = rule === 'fill' ? fillEach : c.rect.h;
|
|
253
|
+
const w = rule === 'fill' ? contentW : c.rect.w;
|
|
254
|
+
const x = (contentW - w) * align.x;
|
|
255
|
+
placed.push({ layer: c, local: { x, y: cursor, w, h } });
|
|
256
|
+
cursor += h + gap;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else if (kind === 'wrapBox') {
|
|
261
|
+
const gap = parentLayer?.gap ?? 0;
|
|
262
|
+
let x = 0;
|
|
263
|
+
let y = 0;
|
|
264
|
+
let rowH = 0;
|
|
265
|
+
for (const c of children) {
|
|
266
|
+
const w = Math.min(c.rect.w, contentW);
|
|
267
|
+
const h = c.rect.h;
|
|
268
|
+
if (x > 0 && x + w > contentW) {
|
|
269
|
+
x = 0;
|
|
270
|
+
y += rowH + gap;
|
|
271
|
+
rowH = 0;
|
|
272
|
+
}
|
|
273
|
+
placed.push({ layer: c, local: { x, y, w, h } });
|
|
274
|
+
x += w + gap;
|
|
275
|
+
rowH = Math.max(rowH, h);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
else if (kind === 'uniformGrid') {
|
|
279
|
+
const gap = parentLayer?.gap ?? 0;
|
|
280
|
+
const cols = Math.max(1, parentLayer?.columns ?? 2);
|
|
281
|
+
const cellW = Math.max(1, (contentW - gap * Math.max(0, cols - 1)) / cols);
|
|
282
|
+
const rows = Math.max(1, Math.ceil(children.length / cols));
|
|
283
|
+
const cellH = Math.max(1, (contentH - gap * Math.max(0, rows - 1)) / rows);
|
|
284
|
+
children.forEach((c, i) => {
|
|
285
|
+
const col = i % cols;
|
|
286
|
+
const row = Math.floor(i / cols);
|
|
287
|
+
placed.push({
|
|
288
|
+
layer: c,
|
|
289
|
+
local: {
|
|
290
|
+
x: col * (cellW + gap),
|
|
291
|
+
y: row * (cellH + gap),
|
|
292
|
+
w: cellW,
|
|
293
|
+
h: cellH
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
else if (kind === 'sizeBox' || kind === 'scaleBox') {
|
|
299
|
+
for (const c of children) {
|
|
300
|
+
const slot = c.slot ?? defaultSlotFromRect(c.rect);
|
|
301
|
+
let local = resolveSlotRect({ width: contentW, height: contentH }, slot);
|
|
302
|
+
if (kind === 'scaleBox' && c.rect.w > 0 && c.rect.h > 0) {
|
|
303
|
+
const sx = contentW / c.rect.w;
|
|
304
|
+
const sy = contentH / c.rect.h;
|
|
305
|
+
const s = Math.min(sx, sy);
|
|
306
|
+
const w = c.rect.w * s;
|
|
307
|
+
const h = c.rect.h * s;
|
|
308
|
+
local = {
|
|
309
|
+
x: (contentW - w) / 2,
|
|
310
|
+
y: (contentH - h) / 2,
|
|
311
|
+
w,
|
|
312
|
+
h
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
else if (kind === 'sizeBox') {
|
|
316
|
+
local = {
|
|
317
|
+
x: Math.max(0, Math.min(local.x, contentW - 1)),
|
|
318
|
+
y: Math.max(0, Math.min(local.y, contentH - 1)),
|
|
319
|
+
w: Math.min(local.w, contentW),
|
|
320
|
+
h: Math.min(local.h, contentH)
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
placed.push({ layer: c, local });
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
// canvasPanel / border / group / overlay / namedSlot / image / shapes / root — freeform slots
|
|
328
|
+
for (const c of children) {
|
|
329
|
+
const slot = c.slot ?? defaultSlotFromRect(c.rect);
|
|
330
|
+
const local = resolveSlotRect({ width: contentW, height: contentH }, slot);
|
|
331
|
+
placed.push({ layer: c, local });
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
for (const { layer, local } of placed) {
|
|
335
|
+
const absolute = {
|
|
336
|
+
x: originX + local.x,
|
|
337
|
+
y: originY + local.y,
|
|
338
|
+
w: local.w,
|
|
339
|
+
h: local.h
|
|
340
|
+
};
|
|
341
|
+
abs.set(layer.id, absolute);
|
|
342
|
+
layoutUnder(layer.id, absolute, layer);
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
layoutUnder(null, null, null);
|
|
346
|
+
return abs;
|
|
347
|
+
}
|
|
348
|
+
export function absoluteRectFor(layerId, layers, rootSize) {
|
|
349
|
+
return computeAbsoluteRects(layers, rootSize).get(layerId) ?? null;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* CSS clip-path inset for a child absolute rect clipped by ancestors with clipChildren.
|
|
353
|
+
* Values are relative to the child's own box.
|
|
354
|
+
* `scrollBox` always clips (UMG-style viewport).
|
|
355
|
+
*/
|
|
356
|
+
export function clipPathForLayer(layerId, layers, absMap) {
|
|
357
|
+
const child = absMap.get(layerId);
|
|
358
|
+
if (!child)
|
|
359
|
+
return undefined;
|
|
360
|
+
const map = new Map(layers.map((l) => [l.id, l]));
|
|
361
|
+
let cur = map.get(layerId);
|
|
362
|
+
let clip = null;
|
|
363
|
+
while (cur?.parentId) {
|
|
364
|
+
const parent = map.get(cur.parentId);
|
|
365
|
+
if (!parent)
|
|
366
|
+
break;
|
|
367
|
+
if (parent.clipChildren || parent.kind === 'scrollBox') {
|
|
368
|
+
const pa = absMap.get(parent.id);
|
|
369
|
+
if (pa) {
|
|
370
|
+
clip = clip
|
|
371
|
+
? {
|
|
372
|
+
x: Math.max(clip.x, pa.x),
|
|
373
|
+
y: Math.max(clip.y, pa.y),
|
|
374
|
+
w: Math.min(clip.x + clip.w, pa.x + pa.w) - Math.max(clip.x, pa.x),
|
|
375
|
+
h: Math.min(clip.y + clip.h, pa.y + pa.h) - Math.max(clip.y, pa.y)
|
|
376
|
+
}
|
|
377
|
+
: { ...pa };
|
|
378
|
+
if (clip.w <= 0 || clip.h <= 0)
|
|
379
|
+
return 'inset(100%)';
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
cur = parent;
|
|
383
|
+
}
|
|
384
|
+
if (!clip)
|
|
385
|
+
return undefined;
|
|
386
|
+
const top = Math.max(0, clip.y - child.y);
|
|
387
|
+
const left = Math.max(0, clip.x - child.x);
|
|
388
|
+
const right = Math.max(0, child.x + child.w - (clip.x + clip.w));
|
|
389
|
+
const bottom = Math.max(0, child.y + child.h - (clip.y + clip.h));
|
|
390
|
+
if (top === 0 && left === 0 && right === 0 && bottom === 0)
|
|
391
|
+
return undefined;
|
|
392
|
+
return `inset(${top}px ${right}px ${bottom}px ${left}px)`;
|
|
393
|
+
}
|
|
394
|
+
/** Scrollbar thumb size/position for a scrollBox viewport (preview chrome). */
|
|
395
|
+
export function scrollBarMetrics(viewport, maxScroll, offset) {
|
|
396
|
+
if (maxScroll <= 0 || viewport <= 0)
|
|
397
|
+
return null;
|
|
398
|
+
const content = viewport + maxScroll;
|
|
399
|
+
const thumb = Math.max(18, Math.min(viewport, (viewport / content) * viewport));
|
|
400
|
+
const travel = Math.max(0, viewport - thumb);
|
|
401
|
+
const thumbOffset = maxScroll > 0 ? (offset / maxScroll) * travel : 0;
|
|
402
|
+
return { thumb, offset: thumbOffset, track: viewport };
|
|
403
|
+
}
|
|
404
|
+
/** Max scrollable overflow of a scrollBox (content extent beyond the viewport). */
|
|
405
|
+
export function scrollBoxOverflow(scrollBoxId, layers, absMap) {
|
|
406
|
+
const box = absMap.get(scrollBoxId);
|
|
407
|
+
if (!box)
|
|
408
|
+
return { maxX: 0, maxY: 0 };
|
|
409
|
+
let maxR = box.w;
|
|
410
|
+
let maxB = box.h;
|
|
411
|
+
for (const l of layers) {
|
|
412
|
+
if ((l.parentId ?? null) !== scrollBoxId)
|
|
413
|
+
continue;
|
|
414
|
+
const r = absMap.get(l.id);
|
|
415
|
+
if (!r)
|
|
416
|
+
continue;
|
|
417
|
+
maxR = Math.max(maxR, r.x + r.w - box.x);
|
|
418
|
+
maxB = Math.max(maxB, r.y + r.h - box.y);
|
|
419
|
+
}
|
|
420
|
+
return {
|
|
421
|
+
maxX: Math.max(0, maxR - box.w),
|
|
422
|
+
maxY: Math.max(0, maxB - box.h)
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Shift descendants of scrollBoxes by ephemeral scroll offsets (preview only).
|
|
427
|
+
* ScrollBox frames themselves stay put.
|
|
428
|
+
*/
|
|
429
|
+
export function applyScrollBoxOffsets(layers, absMap, offsets) {
|
|
430
|
+
if (!offsets.size)
|
|
431
|
+
return absMap;
|
|
432
|
+
const byId = new Map(layers.map((l) => [l.id, l]));
|
|
433
|
+
const out = new Map();
|
|
434
|
+
for (const [id, rect] of absMap) {
|
|
435
|
+
let dx = 0;
|
|
436
|
+
let dy = 0;
|
|
437
|
+
let cur = byId.get(id);
|
|
438
|
+
while (cur?.parentId) {
|
|
439
|
+
const parent = byId.get(cur.parentId);
|
|
440
|
+
if (!parent)
|
|
441
|
+
break;
|
|
442
|
+
if (parent.kind === 'scrollBox') {
|
|
443
|
+
const o = offsets.get(parent.id);
|
|
444
|
+
if (o) {
|
|
445
|
+
dx -= o.x;
|
|
446
|
+
dy -= o.y;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
cur = parent;
|
|
450
|
+
}
|
|
451
|
+
out.set(id, dx || dy ? { ...rect, x: rect.x + dx, y: rect.y + dy } : rect);
|
|
452
|
+
}
|
|
453
|
+
return out;
|
|
454
|
+
}
|
|
455
|
+
export function reparentLayer(layers, layerId, newParentId, rootSize) {
|
|
456
|
+
if (!canReparent(layers, layerId, newParentId))
|
|
457
|
+
return layers;
|
|
458
|
+
const absMap = computeAbsoluteRects(layers, rootSize);
|
|
459
|
+
const layer = layers.find((l) => l.id === layerId);
|
|
460
|
+
if (!layer)
|
|
461
|
+
return layers;
|
|
462
|
+
const abs = absMap.get(layerId) ?? layer.rect;
|
|
463
|
+
let parentAbs = { x: 0, y: 0, w: rootSize.width, h: rootSize.height };
|
|
464
|
+
let parentLayer = null;
|
|
465
|
+
if (newParentId) {
|
|
466
|
+
parentLayer = layers.find((l) => l.id === newParentId) ?? null;
|
|
467
|
+
const pa = absMap.get(newParentId);
|
|
468
|
+
if (pa)
|
|
469
|
+
parentAbs = pa;
|
|
470
|
+
}
|
|
471
|
+
const pad = parentLayer ? contentPadding(parentLayer) : { left: 0, top: 0, right: 0, bottom: 0 };
|
|
472
|
+
const contentW = Math.max(0, parentAbs.w - pad.left - pad.right);
|
|
473
|
+
const contentH = Math.max(0, parentAbs.h - pad.top - pad.bottom);
|
|
474
|
+
const local = {
|
|
475
|
+
x: abs.x - parentAbs.x - pad.left,
|
|
476
|
+
y: abs.y - parentAbs.y - pad.top,
|
|
477
|
+
w: abs.w,
|
|
478
|
+
h: abs.h
|
|
479
|
+
};
|
|
480
|
+
const siblings = getChildren(layers, newParentId).filter((c) => c.id !== layerId);
|
|
481
|
+
const zIndex = siblings.length ? Math.max(...siblings.map((s) => s.zIndex)) + 1 : 0;
|
|
482
|
+
const slot = slotFromLocalRect({ width: contentW, height: contentH }, local);
|
|
483
|
+
return layers.map((l) => l.id === layerId
|
|
484
|
+
? {
|
|
485
|
+
...l,
|
|
486
|
+
parentId: newParentId,
|
|
487
|
+
rect: local,
|
|
488
|
+
slot: { ...slot, order: zIndex },
|
|
489
|
+
zIndex
|
|
490
|
+
}
|
|
491
|
+
: l);
|
|
492
|
+
}
|
|
493
|
+
export function wrapSelection(doc, selectedIds, wrapKind = 'group') {
|
|
494
|
+
if (!selectedIds.length)
|
|
495
|
+
return null;
|
|
496
|
+
const set = new Set(selectedIds);
|
|
497
|
+
let layers = doc.layers;
|
|
498
|
+
const rootSize = { width: doc.width, height: doc.height };
|
|
499
|
+
// Exclude descendants when parent+child are both selected
|
|
500
|
+
let selected = layers.filter((l) => set.has(l.id));
|
|
501
|
+
selected = selected.filter((l) => !selected.some((other) => other.id !== l.id && isDescendant(layers, l.id, other.id)));
|
|
502
|
+
if (selected.length < 2)
|
|
503
|
+
return null;
|
|
504
|
+
const wrapIds = selected.map((l) => l.id);
|
|
505
|
+
// Only wrap siblings that share the same parent — otherwise lift to root first
|
|
506
|
+
let parentId = selected[0].parentId ?? null;
|
|
507
|
+
if (!selected.every((l) => (l.parentId ?? null) === parentId)) {
|
|
508
|
+
for (const id of wrapIds) {
|
|
509
|
+
layers = reparentLayer(layers, id, null, rootSize);
|
|
510
|
+
}
|
|
511
|
+
parentId = null;
|
|
512
|
+
selected = wrapIds.map((id) => layers.find((l) => l.id === id)).filter(Boolean);
|
|
513
|
+
}
|
|
514
|
+
const absMap = computeAbsoluteRects(layers, rootSize);
|
|
515
|
+
let minX = Infinity;
|
|
516
|
+
let minY = Infinity;
|
|
517
|
+
let maxX = -Infinity;
|
|
518
|
+
let maxY = -Infinity;
|
|
519
|
+
for (const l of selected) {
|
|
520
|
+
const r = absMap.get(l.id) ?? l.rect;
|
|
521
|
+
minX = Math.min(minX, r.x);
|
|
522
|
+
minY = Math.min(minY, r.y);
|
|
523
|
+
maxX = Math.max(maxX, r.x + r.w);
|
|
524
|
+
maxY = Math.max(maxY, r.y + r.h);
|
|
525
|
+
}
|
|
526
|
+
const wrapperAbs = {
|
|
527
|
+
x: minX,
|
|
528
|
+
y: minY,
|
|
529
|
+
w: Math.max(24, maxX - minX),
|
|
530
|
+
h: Math.max(24, maxY - minY)
|
|
531
|
+
};
|
|
532
|
+
let parentAbs = { x: 0, y: 0, w: doc.width, h: doc.height };
|
|
533
|
+
let parentLayer = null;
|
|
534
|
+
if (parentId) {
|
|
535
|
+
parentLayer = layers.find((l) => l.id === parentId) ?? null;
|
|
536
|
+
const pa = absMap.get(parentId);
|
|
537
|
+
if (pa)
|
|
538
|
+
parentAbs = pa;
|
|
539
|
+
}
|
|
540
|
+
const pad = parentLayer ? contentPadding(parentLayer) : { left: 0, top: 0, right: 0, bottom: 0 };
|
|
541
|
+
const contentW = Math.max(0, parentAbs.w - pad.left - pad.right);
|
|
542
|
+
const contentH = Math.max(0, parentAbs.h - pad.top - pad.bottom);
|
|
543
|
+
const wrapperLocal = {
|
|
544
|
+
x: wrapperAbs.x - parentAbs.x - pad.left,
|
|
545
|
+
y: wrapperAbs.y - parentAbs.y - pad.top,
|
|
546
|
+
w: wrapperAbs.w,
|
|
547
|
+
h: wrapperAbs.h
|
|
548
|
+
};
|
|
549
|
+
const zIndex = Math.min(...selected.map((s) => s.zIndex));
|
|
550
|
+
const wrapper = createCanvasLayer(wrapKind, {
|
|
551
|
+
name: wrapKind === 'group' ? 'Group' : wrapKind,
|
|
552
|
+
parentId,
|
|
553
|
+
rect: wrapperLocal,
|
|
554
|
+
slot: slotFromLocalRect({ width: contentW, height: contentH }, wrapperLocal),
|
|
555
|
+
zIndex,
|
|
556
|
+
clipChildren: wrapKind === 'border' || wrapKind === 'canvasPanel' || wrapKind === 'scrollBox',
|
|
557
|
+
fill: wrapKind === 'border' || wrapKind === 'roundRect'
|
|
558
|
+
? '#ffffff'
|
|
559
|
+
: wrapKind === 'group'
|
|
560
|
+
? 'transparent'
|
|
561
|
+
: undefined,
|
|
562
|
+
borderRadius: wrapKind === 'border' || wrapKind === 'roundRect' ? 12 : undefined,
|
|
563
|
+
opacity: 1
|
|
564
|
+
});
|
|
565
|
+
let resultLayers = [...layers, wrapper];
|
|
566
|
+
for (const id of wrapIds) {
|
|
567
|
+
resultLayers = reparentLayer(resultLayers, id, wrapper.id, rootSize);
|
|
568
|
+
}
|
|
569
|
+
return { doc: { ...doc, layers: resultLayers }, wrapperId: wrapper.id };
|
|
570
|
+
}
|
|
571
|
+
export function groupLayers(doc, selectedIds) {
|
|
572
|
+
return wrapSelection(doc, selectedIds, 'group');
|
|
573
|
+
}
|
|
574
|
+
export function ungroupLayers(doc, groupId) {
|
|
575
|
+
const group = doc.layers.find((l) => l.id === groupId);
|
|
576
|
+
if (!group)
|
|
577
|
+
return doc;
|
|
578
|
+
const parentId = group.parentId ?? null;
|
|
579
|
+
const children = getChildren(doc.layers, groupId);
|
|
580
|
+
const rootSize = { width: doc.width, height: doc.height };
|
|
581
|
+
let layers = doc.layers;
|
|
582
|
+
for (const c of children) {
|
|
583
|
+
layers = reparentLayer(layers, c.id, parentId, rootSize);
|
|
584
|
+
}
|
|
585
|
+
layers = layers.filter((l) => l.id !== groupId);
|
|
586
|
+
return { ...doc, layers };
|
|
587
|
+
}
|
|
588
|
+
/** Delete layer and all descendants. */
|
|
589
|
+
export function deleteSubtree(doc, ids) {
|
|
590
|
+
const remove = new Set();
|
|
591
|
+
for (const id of ids) {
|
|
592
|
+
for (const sid of getSubtreeIds(doc.layers, id))
|
|
593
|
+
remove.add(sid);
|
|
594
|
+
}
|
|
595
|
+
return { ...doc, layers: doc.layers.filter((l) => !remove.has(l.id)) };
|
|
596
|
+
}
|
|
597
|
+
/** Duplicate subtree with new ids; keeps relative hierarchy. */
|
|
598
|
+
export function duplicateSubtree(doc, rootIds, offset = { x: 16, y: 16 }) {
|
|
599
|
+
const absMap = computeAbsoluteRects(doc.layers, { width: doc.width, height: doc.height });
|
|
600
|
+
const idMap = new Map();
|
|
601
|
+
const toCopy = [];
|
|
602
|
+
for (const rootId of rootIds) {
|
|
603
|
+
for (const id of getSubtreeIds(doc.layers, rootId)) {
|
|
604
|
+
if (idMap.has(id))
|
|
605
|
+
continue;
|
|
606
|
+
const layer = doc.layers.find((l) => l.id === id);
|
|
607
|
+
if (!layer)
|
|
608
|
+
continue;
|
|
609
|
+
idMap.set(id, uid('layer'));
|
|
610
|
+
toCopy.push(layer);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
const clones = toCopy.map((layer) => {
|
|
614
|
+
const newId = idMap.get(layer.id);
|
|
615
|
+
const isRoot = rootIds.includes(layer.id);
|
|
616
|
+
const parentMapped = layer.parentId && idMap.has(layer.parentId)
|
|
617
|
+
? idMap.get(layer.parentId)
|
|
618
|
+
: isRoot
|
|
619
|
+
? (layer.parentId ?? null)
|
|
620
|
+
: (layer.parentId ?? null);
|
|
621
|
+
let rect = { ...layer.rect };
|
|
622
|
+
let slot = layer.slot ? { ...layer.slot, anchors: { ...layer.slot.anchors }, offsets: { ...layer.slot.offsets } } : undefined;
|
|
623
|
+
if (isRoot) {
|
|
624
|
+
rect = { ...rect, x: rect.x + offset.x, y: rect.y + offset.y };
|
|
625
|
+
if (slot) {
|
|
626
|
+
slot = {
|
|
627
|
+
...slot,
|
|
628
|
+
offsets: {
|
|
629
|
+
...slot.offsets,
|
|
630
|
+
left: slot.offsets.left + offset.x,
|
|
631
|
+
top: slot.offsets.top + offset.y
|
|
632
|
+
}
|
|
633
|
+
};
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
return {
|
|
637
|
+
...layer,
|
|
638
|
+
id: newId,
|
|
639
|
+
parentId: parentMapped,
|
|
640
|
+
rect,
|
|
641
|
+
slot,
|
|
642
|
+
overrides: layer.overrides ? { ...layer.overrides } : undefined
|
|
643
|
+
};
|
|
644
|
+
});
|
|
645
|
+
// Fix parentId for non-copied parents of roots — already handled
|
|
646
|
+
const newIds = rootIds.map((id) => idMap.get(id)).filter(Boolean);
|
|
647
|
+
return { doc: { ...doc, layers: [...doc.layers, ...clones] }, newIds };
|
|
648
|
+
}
|
|
649
|
+
export function reorderSiblings(layers, parentId, orderedChildIds) {
|
|
650
|
+
const set = new Set(orderedChildIds);
|
|
651
|
+
return layers.map((l) => {
|
|
652
|
+
if ((l.parentId ?? null) !== parentId || !set.has(l.id))
|
|
653
|
+
return l;
|
|
654
|
+
const z = orderedChildIds.indexOf(l.id);
|
|
655
|
+
return { ...l, zIndex: z, slot: { ...(l.slot ?? defaultSlotFromRect(l.rect)), order: z } };
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
/** Sync layer.rect from its slot given parent size (for editors that edit rect). */
|
|
659
|
+
export function syncRectFromSlot(layer, parentSize) {
|
|
660
|
+
if (!layer.slot)
|
|
661
|
+
return layer;
|
|
662
|
+
return { ...layer, rect: resolveSlotRect(parentSize, layer.slot) };
|
|
663
|
+
}
|
|
664
|
+
export function syncSlotFromRect(layer, parentSize) {
|
|
665
|
+
const anchors = layer.slot?.anchors ?? ANCHOR_PRESETS.topLeft;
|
|
666
|
+
const slot = {
|
|
667
|
+
...slotFromLocalRect(parentSize, layer.rect, anchors),
|
|
668
|
+
padding: layer.slot?.padding,
|
|
669
|
+
sizeRule: layer.slot?.sizeRule,
|
|
670
|
+
alignment: layer.slot?.alignment,
|
|
671
|
+
order: layer.slot?.order
|
|
672
|
+
};
|
|
673
|
+
return { ...layer, slot, rect: rectFromSlot(slot, parentSize) };
|
|
674
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CanvasDocument } from './canvasDocument.js';
|
|
2
|
+
export declare function serializeCanvasDoc(doc: CanvasDocument): string;
|
|
3
|
+
export declare function parseCanvasDoc(raw: string): CanvasDocument;
|
|
4
|
+
export type CanvasHistoryState = {
|
|
5
|
+
past: string[];
|
|
6
|
+
future: string[];
|
|
7
|
+
last: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function createCanvasHistory(doc: CanvasDocument): CanvasHistoryState;
|
|
10
|
+
/** Push current `last` to past when document changes (skips no-ops). */
|
|
11
|
+
export declare function pushCanvasHistory(state: CanvasHistoryState, nextDoc: CanvasDocument): CanvasHistoryState;
|
|
12
|
+
export declare function undoCanvasHistory(state: CanvasHistoryState): {
|
|
13
|
+
state: CanvasHistoryState;
|
|
14
|
+
doc: CanvasDocument;
|
|
15
|
+
} | null;
|
|
16
|
+
export declare function redoCanvasHistory(state: CanvasHistoryState): {
|
|
17
|
+
state: CanvasHistoryState;
|
|
18
|
+
doc: CanvasDocument;
|
|
19
|
+
} | null;
|