@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 12.0.129
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/lib/compute.js +57 -1
- package/lib/compute.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +3 -2
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +11 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +448 -105
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +237 -22
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +17 -6
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +18 -1
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/DesignCategoryGallery.js +423 -0
- package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +763 -187
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +199 -11
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +59 -40
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/aiEdit.js +4 -2
- package/lib/features/canvas/aiEdit.js.map +1 -1
- package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
- package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
- package/lib/features/canvas/canvasTaskSync.js +34 -7
- package/lib/features/canvas/canvasTaskSync.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +23 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +10 -24
- package/lib/features/canvas/canvasTheme.js.map +1 -1
- package/lib/features/canvas/canvasUi.js +1 -1
- package/lib/features/canvas/canvasUi.js.map +1 -1
- package/lib/features/canvas/createTiles.js +17 -9
- package/lib/features/canvas/createTiles.js.map +1 -1
- package/lib/features/canvas/deepLinks.js +35 -5
- package/lib/features/canvas/deepLinks.js.map +1 -1
- package/lib/features/canvas/designCatalog.js +165 -0
- package/lib/features/canvas/designCatalog.js.map +1 -0
- package/lib/features/canvas/designCategories.js +262 -0
- package/lib/features/canvas/designCategories.js.map +1 -0
- package/lib/features/canvas/editorControls.js +406 -0
- package/lib/features/canvas/editorControls.js.map +1 -0
- package/lib/features/canvas/generationModels.js +5 -3
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generationTasks.js +162 -0
- package/lib/features/canvas/generationTasks.js.map +1 -0
- package/lib/features/canvas/generator/BottomSheet.js +167 -0
- package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
- package/lib/features/canvas/generator/DirectorSheet.js +163 -0
- package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
- package/lib/features/canvas/generator/ReframePreview.js +122 -0
- package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
- package/lib/features/canvas/generator/RunLogCard.js +119 -0
- package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
- package/lib/features/canvas/generator/ShotPanel.js +261 -0
- package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
- package/lib/features/canvas/generator/businessCardWidget.js +117 -0
- package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
- package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
- package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/direction.js +41 -0
- package/lib/features/canvas/generator/direction.js.map +1 -0
- package/lib/features/canvas/generator/reframeGeometry.js +108 -0
- package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
- package/lib/features/canvas/generator/runLog.js +71 -0
- package/lib/features/canvas/generator/runLog.js.map +1 -0
- package/lib/features/canvas/generator/shot.js +133 -0
- package/lib/features/canvas/generator/shot.js.map +1 -0
- package/lib/features/canvas/generator/useShotSpec.js +87 -0
- package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
- package/lib/features/canvas/home/HeroComposer.js +214 -0
- package/lib/features/canvas/home/HeroComposer.js.map +1 -0
- package/lib/features/canvas/home/HeroMonitor.js +225 -0
- package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
- package/lib/features/canvas/home/LookDetail.js +185 -0
- package/lib/features/canvas/home/LookDetail.js.map +1 -0
- package/lib/features/canvas/home/LoopingVideo.js +37 -0
- package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
- package/lib/features/canvas/home/TemplatesGallery.js +253 -0
- package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
- package/lib/features/canvas/home/heroShots.js +100 -0
- package/lib/features/canvas/home/heroShots.js.map +1 -0
- package/lib/features/canvas/homeWork.js +62 -3
- package/lib/features/canvas/homeWork.js.map +1 -1
- package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
- package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/rankedCatalogSearch.js +375 -0
- package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/recorder/RecordingReview.js +272 -0
- package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
- package/lib/features/canvas/recorder/RecordingsList.js +179 -0
- package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
- package/lib/features/canvas/recorder/recorderOps.js +99 -0
- package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
- package/lib/features/canvas/seedanceShowcase.js +314 -0
- package/lib/features/canvas/seedanceShowcase.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +149 -15
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/sessionRenewal.js +114 -0
- package/lib/features/canvas/sessionRenewal.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +34 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/setTurn.js +4 -2
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
- package/lib/features/canvas/set/setPresets.js +85 -0
- package/lib/features/canvas/set/setPresets.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +4 -1
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +59 -4
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +31 -4
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/surfaceIndex.js +1 -14
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateSearch.js +489 -0
- package/lib/features/canvas/templateSearch.js.map +1 -0
- package/lib/features/canvas/useCanvasSession.js +28 -6
- package/lib/features/canvas/useCanvasSession.js.map +1 -1
- package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
- package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
- package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/audioServices.js +165 -0
- package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
- package/lib/features/canvas/videoEditor/captions.js +144 -0
- package/lib/features/canvas/videoEditor/captions.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/editorModel.js +12 -2
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +89 -7
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/layers.js +117 -0
- package/lib/features/canvas/videoEditor/layers.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/revoice.js +138 -0
- package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
- package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
- package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
- package/lib/features/canvas/videoEditor/textMotion.js +109 -0
- package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
- package/lib/features/canvas/videoEditor/transitions.js +31 -0
- package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
- package/lib/features/chat/TemplatesChatCards.js +8 -3
- package/lib/features/chat/TemplatesChatCards.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +674 -644
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +285 -538
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/design/designCore.js +2 -212
- package/lib/features/design/designCore.js.map +1 -1
- package/lib/features/design/designIndex.js +1 -50
- package/lib/features/design/designIndex.js.map +1 -1
- package/lib/features/design/doc/aiDesign.js +247 -0
- package/lib/features/design/doc/aiDesign.js.map +1 -0
- package/lib/features/design/doc/artifacts.js +280 -0
- package/lib/features/design/doc/artifacts.js.map +1 -0
- package/lib/features/design/doc/chart.js +98 -0
- package/lib/features/design/doc/chart.js.map +1 -0
- package/lib/features/design/doc/crop.js +104 -0
- package/lib/features/design/doc/crop.js.map +1 -0
- package/lib/features/design/doc/curve.js +49 -0
- package/lib/features/design/doc/curve.js.map +1 -0
- package/lib/features/design/doc/docOps.js +397 -0
- package/lib/features/design/doc/docOps.js.map +1 -0
- package/lib/features/design/doc/findReplace.js +112 -0
- package/lib/features/design/doc/findReplace.js.map +1 -0
- package/lib/features/design/doc/fonts.js +79 -0
- package/lib/features/design/doc/fonts.js.map +1 -0
- package/lib/features/design/doc/frames.js +17 -0
- package/lib/features/design/doc/frames.js.map +1 -0
- package/lib/features/design/doc/geometry.js +133 -0
- package/lib/features/design/doc/geometry.js.map +1 -0
- package/lib/features/design/doc/imageAdjust.js +203 -0
- package/lib/features/design/doc/imageAdjust.js.map +1 -0
- package/lib/features/design/doc/legacyDoc.js +107 -0
- package/lib/features/design/doc/legacyDoc.js.map +1 -0
- package/lib/features/design/doc/newDoc.js +335 -0
- package/lib/features/design/doc/newDoc.js.map +1 -0
- package/lib/features/design/doc/pageRange.js +17 -0
- package/lib/features/design/doc/pageRange.js.map +1 -0
- package/lib/features/design/doc/pathScale.js +68 -0
- package/lib/features/design/doc/pathScale.js.map +1 -0
- package/lib/features/design/doc/qr.js +62 -0
- package/lib/features/design/doc/qr.js.map +1 -0
- package/lib/features/design/doc/shapes.js +366 -0
- package/lib/features/design/doc/shapes.js.map +1 -0
- package/lib/features/design/doc/sizes.js +230 -0
- package/lib/features/design/doc/sizes.js.map +1 -0
- package/lib/features/design/doc/textEffects.js +134 -0
- package/lib/features/design/doc/textEffects.js.map +1 -0
- package/lib/features/design/doc/textLayout.js +182 -0
- package/lib/features/design/doc/textLayout.js.map +1 -0
- package/lib/features/design/doc/types.js +30 -0
- package/lib/features/design/doc/types.js.map +1 -0
- package/lib/features/design/editor/AiPanel.js +194 -0
- package/lib/features/design/editor/AiPanel.js.map +1 -0
- package/lib/features/design/editor/ChartDataPanel.js +182 -0
- package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
- package/lib/features/design/editor/CropOverlay.js +199 -0
- package/lib/features/design/editor/CropOverlay.js.map +1 -0
- package/lib/features/design/editor/DesignCanvas.js +363 -0
- package/lib/features/design/editor/DesignCanvas.js.map +1 -0
- package/lib/features/design/editor/ExportSheet.js +123 -0
- package/lib/features/design/editor/ExportSheet.js.map +1 -0
- package/lib/features/design/editor/FindReplacePanel.js +93 -0
- package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
- package/lib/features/design/editor/ImageTools.js +188 -0
- package/lib/features/design/editor/ImageTools.js.map +1 -0
- package/lib/features/design/editor/LayerTools.js +485 -0
- package/lib/features/design/editor/LayerTools.js.map +1 -0
- package/lib/features/design/editor/PageStrip.js +203 -0
- package/lib/features/design/editor/PageStrip.js.map +1 -0
- package/lib/features/design/editor/Slideshow.js +97 -0
- package/lib/features/design/editor/Slideshow.js.map +1 -0
- package/lib/features/design/editor/ToolPanels.js +695 -0
- package/lib/features/design/editor/ToolPanels.js.map +1 -0
- package/lib/features/design/editor/controls.js +630 -0
- package/lib/features/design/editor/controls.js.map +1 -0
- package/lib/features/design/editor/useDesignSave.js +91 -0
- package/lib/features/design/editor/useDesignSave.js.map +1 -0
- package/lib/features/design/export/exportDesign.js +170 -0
- package/lib/features/design/export/exportDesign.js.map +1 -0
- package/lib/features/design/export/pdf.js +143 -0
- package/lib/features/design/export/pdf.js.map +1 -0
- package/lib/features/design/home/DesignHome.js +688 -0
- package/lib/features/design/home/DesignHome.js.map +1 -0
- package/lib/features/design/home/studioHome.js +61 -0
- package/lib/features/design/home/studioHome.js.map +1 -0
- package/lib/features/design/pickDesignImage.js +60 -0
- package/lib/features/design/pickDesignImage.js.map +1 -0
- package/lib/features/design/render/DesignPageView.js +69 -0
- package/lib/features/design/render/DesignPageView.js.map +1 -0
- package/lib/features/design/render/PageCapture.js +288 -0
- package/lib/features/design/render/PageCapture.js.map +1 -0
- package/lib/features/design/render/TextMeasure.js +115 -0
- package/lib/features/design/render/TextMeasure.js.map +1 -0
- package/lib/features/design/render/fontRegistry.js +110 -0
- package/lib/features/design/render/fontRegistry.js.map +1 -0
- package/lib/features/design/render/layers.js +392 -0
- package/lib/features/design/render/layers.js.map +1 -0
- package/lib/features/design/render/svg.js +35 -0
- package/lib/features/design/render/svg.js.map +1 -0
- package/lib/features/design/render/svgParts.js +435 -0
- package/lib/features/design/render/svgParts.js.map +1 -0
- package/lib/features/design/surface/BoardScreen.js +529 -0
- package/lib/features/design/surface/BoardScreen.js.map +1 -0
- package/lib/features/design/surface/CompareView.js +138 -0
- package/lib/features/design/surface/CompareView.js.map +1 -0
- package/lib/features/design/surface/CreationScreen.js +294 -0
- package/lib/features/design/surface/CreationScreen.js.map +1 -0
- package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
- package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
- package/lib/features/design/surface/DesignBoards.js +441 -0
- package/lib/features/design/surface/DesignBoards.js.map +1 -0
- package/lib/features/design/surface/DesignPreview.js +159 -0
- package/lib/features/design/surface/DesignPreview.js.map +1 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
- package/lib/features/design/surface/FullScreenPreview.js +59 -0
- package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
- package/lib/features/design/surface/NewSystemDialog.js +122 -0
- package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
- package/lib/features/design/surface/PickerSheet.js +175 -0
- package/lib/features/design/surface/PickerSheet.js.map +1 -0
- package/lib/features/design/surface/TemplatesGallery.js +156 -0
- package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
- package/lib/features/design/surface/WetPaint.js +140 -0
- package/lib/features/design/surface/WetPaint.js.map +1 -0
- package/lib/features/design/surface/agentTurn.js +229 -0
- package/lib/features/design/surface/agentTurn.js.map +1 -0
- package/lib/features/design/surface/designBoard.js +218 -0
- package/lib/features/design/surface/designBoard.js.map +1 -0
- package/lib/features/design/surface/designChannel.js +186 -0
- package/lib/features/design/surface/designChannel.js.map +1 -0
- package/lib/features/design/surface/designChat.js +141 -0
- package/lib/features/design/surface/designChat.js.map +1 -0
- package/lib/features/design/surface/designConnector.js +266 -0
- package/lib/features/design/surface/designConnector.js.map +1 -0
- package/lib/features/design/surface/designDocument.js +40 -0
- package/lib/features/design/surface/designDocument.js.map +1 -0
- package/lib/features/design/surface/designExport.js +55 -0
- package/lib/features/design/surface/designExport.js.map +1 -0
- package/lib/features/design/surface/designLinks.js +64 -0
- package/lib/features/design/surface/designLinks.js.map +1 -0
- package/lib/features/design/surface/designPalette.js +24 -0
- package/lib/features/design/surface/designPalette.js.map +1 -0
- package/lib/features/design/surface/designRun.js +161 -0
- package/lib/features/design/surface/designRun.js.map +1 -0
- package/lib/features/design/surface/designTheme.js +119 -0
- package/lib/features/design/surface/designTheme.js.map +1 -0
- package/lib/features/design/surface/execStream.js +206 -0
- package/lib/features/design/surface/execStream.js.map +1 -0
- package/lib/features/design/surface/metaball.js +48 -0
- package/lib/features/design/surface/metaball.js.map +1 -0
- package/lib/features/design/surface/pickReferenceFiles.js +35 -0
- package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
- package/lib/features/design/surface/useDesignSurface.js +379 -0
- package/lib/features/design/surface/useDesignSurface.js.map +1 -0
- package/lib/features/docs/DocBlockRow.js +336 -0
- package/lib/features/docs/DocBlockRow.js.map +1 -0
- package/lib/features/docs/DocsEditorExperience.js +949 -0
- package/lib/features/docs/DocsEditorExperience.js.map +1 -0
- package/lib/features/docs/DocsToolbar.js +247 -0
- package/lib/features/docs/DocsToolbar.js.map +1 -0
- package/lib/features/docs/blocks.js +560 -0
- package/lib/features/docs/blocks.js.map +1 -0
- package/lib/features/docs/docArtifacts.js +129 -0
- package/lib/features/docs/docArtifacts.js.map +1 -0
- package/lib/features/docs/docEdits.js +201 -0
- package/lib/features/docs/docEdits.js.map +1 -0
- package/lib/features/docs/docExport.js +235 -0
- package/lib/features/docs/docExport.js.map +1 -0
- package/lib/features/docs/docShare.js +62 -0
- package/lib/features/docs/docShare.js.map +1 -0
- package/lib/features/links/openInApp.js +38 -2
- package/lib/features/links/openInApp.js.map +1 -1
- package/lib/routes.json +54 -0
- package/lib/screens/DesignNative/index.js +35 -0
- package/lib/screens/DesignNative/index.js.map +1 -0
- package/package.json +4 -4
- package/lib/features/design/exportDesign.js +0 -133
- package/lib/features/design/exportDesign.js.map +0 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {useState,useRef,useMemo}from'react';import {PanResponder,View,StyleSheet}from'react-native';import Svg,{Polyline,Ellipse,Line,Rect}from'react-native-svg';import {containRect,rectFromCorners,viewToNatural}from'./imageEditOps.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
let seq = 0;
|
|
21
|
+
const nextId = () => `mk-${Date.now().toString(36)}-${seq++}`;
|
|
22
|
+
function ImageMarkup({
|
|
23
|
+
natural,
|
|
24
|
+
mode,
|
|
25
|
+
strokes,
|
|
26
|
+
strokeColor,
|
|
27
|
+
strokeSize,
|
|
28
|
+
onStroke,
|
|
29
|
+
boxes,
|
|
30
|
+
boxKind = "rect",
|
|
31
|
+
boxColor = "#ffffff",
|
|
32
|
+
onBox
|
|
33
|
+
}) {
|
|
34
|
+
const [view, setView] = useState({
|
|
35
|
+
width: 0,
|
|
36
|
+
height: 0
|
|
37
|
+
});
|
|
38
|
+
const [livePoints, setLivePoints] = useState(null);
|
|
39
|
+
const [liveBox, setLiveBox] = useState(null);
|
|
40
|
+
const frame = natural ? containRect(view, natural) : null;
|
|
41
|
+
const scale = frame && natural ? frame.width / natural.width : 1;
|
|
42
|
+
const live = useRef({
|
|
43
|
+
mode,
|
|
44
|
+
natural,
|
|
45
|
+
frame,
|
|
46
|
+
strokeColor,
|
|
47
|
+
strokeSize,
|
|
48
|
+
boxKind,
|
|
49
|
+
boxColor,
|
|
50
|
+
onStroke,
|
|
51
|
+
onBox
|
|
52
|
+
});
|
|
53
|
+
live.current = {
|
|
54
|
+
mode,
|
|
55
|
+
natural,
|
|
56
|
+
frame,
|
|
57
|
+
strokeColor,
|
|
58
|
+
strokeSize,
|
|
59
|
+
boxKind,
|
|
60
|
+
boxColor,
|
|
61
|
+
onStroke,
|
|
62
|
+
onBox
|
|
63
|
+
};
|
|
64
|
+
const points = useRef([]);
|
|
65
|
+
const anchor = useRef(null);
|
|
66
|
+
const responder = useMemo(() => PanResponder.create({
|
|
67
|
+
onStartShouldSetPanResponder: () => live.current.mode !== "none" && Boolean(live.current.natural),
|
|
68
|
+
onMoveShouldSetPanResponder: () => live.current.mode !== "none" && Boolean(live.current.natural),
|
|
69
|
+
onPanResponderTerminationRequest: () => false,
|
|
70
|
+
onPanResponderGrant: (e) => {
|
|
71
|
+
const {
|
|
72
|
+
natural: nat,
|
|
73
|
+
frame: fr,
|
|
74
|
+
mode: m
|
|
75
|
+
} = live.current;
|
|
76
|
+
if (!nat || !fr) return;
|
|
77
|
+
const p = viewToNatural({
|
|
78
|
+
x: e.nativeEvent.locationX,
|
|
79
|
+
y: e.nativeEvent.locationY
|
|
80
|
+
}, fr, nat);
|
|
81
|
+
if (m === "stroke") {
|
|
82
|
+
points.current = [p.x, p.y];
|
|
83
|
+
setLivePoints(points.current);
|
|
84
|
+
} else {
|
|
85
|
+
anchor.current = p;
|
|
86
|
+
setLiveBox({
|
|
87
|
+
id: "live",
|
|
88
|
+
x1: p.x,
|
|
89
|
+
y1: p.y,
|
|
90
|
+
x2: p.x,
|
|
91
|
+
y2: p.y,
|
|
92
|
+
kind: live.current.boxKind,
|
|
93
|
+
color: live.current.boxColor
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
onPanResponderMove: (e) => {
|
|
98
|
+
const {
|
|
99
|
+
natural: nat,
|
|
100
|
+
frame: fr,
|
|
101
|
+
mode: m
|
|
102
|
+
} = live.current;
|
|
103
|
+
if (!nat || !fr) return;
|
|
104
|
+
const p = viewToNatural({
|
|
105
|
+
x: e.nativeEvent.locationX,
|
|
106
|
+
y: e.nativeEvent.locationY
|
|
107
|
+
}, fr, nat);
|
|
108
|
+
if (m === "stroke") {
|
|
109
|
+
const pts = points.current;
|
|
110
|
+
const lx = pts[pts.length - 2];
|
|
111
|
+
const ly = pts[pts.length - 1];
|
|
112
|
+
if (Math.hypot(p.x - lx, p.y - ly) < 2) return;
|
|
113
|
+
points.current = [...pts, p.x, p.y];
|
|
114
|
+
setLivePoints(points.current);
|
|
115
|
+
} else if (anchor.current) {
|
|
116
|
+
const a = anchor.current;
|
|
117
|
+
setLiveBox((b) => b ? __spreadProps(__spreadValues({}, b), {
|
|
118
|
+
x1: a.x,
|
|
119
|
+
y1: a.y,
|
|
120
|
+
x2: p.x,
|
|
121
|
+
y2: p.y
|
|
122
|
+
}) : b);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
onPanResponderRelease: () => {
|
|
126
|
+
const {
|
|
127
|
+
mode: m
|
|
128
|
+
} = live.current;
|
|
129
|
+
if (m === "stroke") {
|
|
130
|
+
const pts = points.current;
|
|
131
|
+
if (pts.length >= 2) live.current.onStroke({
|
|
132
|
+
id: nextId(),
|
|
133
|
+
points: pts.length === 2 ? [...pts, pts[0] + 1, pts[1]] : pts,
|
|
134
|
+
size: live.current.strokeSize,
|
|
135
|
+
color: live.current.strokeColor
|
|
136
|
+
});
|
|
137
|
+
points.current = [];
|
|
138
|
+
setLivePoints(null);
|
|
139
|
+
} else {
|
|
140
|
+
setLiveBox((b) => {
|
|
141
|
+
if (b) {
|
|
142
|
+
const rect = rectFromCorners({
|
|
143
|
+
x: b.x1,
|
|
144
|
+
y: b.y1
|
|
145
|
+
}, {
|
|
146
|
+
x: b.x2,
|
|
147
|
+
y: b.y2
|
|
148
|
+
});
|
|
149
|
+
if (rect.width >= 4 || rect.height >= 4) live.current.onBox(__spreadProps(__spreadValues({}, b), {
|
|
150
|
+
id: nextId()
|
|
151
|
+
}), rect);
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
});
|
|
155
|
+
anchor.current = null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}), []);
|
|
159
|
+
const toView = (x, y) => frame ? {
|
|
160
|
+
x: frame.x + x * scale,
|
|
161
|
+
y: frame.y + y * scale
|
|
162
|
+
} : {
|
|
163
|
+
x,
|
|
164
|
+
y
|
|
165
|
+
};
|
|
166
|
+
const polyline = (pts) => {
|
|
167
|
+
const out = [];
|
|
168
|
+
for (let i = 0; i + 1 < pts.length; i += 2) {
|
|
169
|
+
const v = toView(pts[i], pts[i + 1]);
|
|
170
|
+
out.push(`${v.x.toFixed(1)},${v.y.toFixed(1)}`);
|
|
171
|
+
}
|
|
172
|
+
return out.join(" ");
|
|
173
|
+
};
|
|
174
|
+
const drawBox = (b, key) => {
|
|
175
|
+
const a = toView(b.x1, b.y1);
|
|
176
|
+
const c = toView(b.x2, b.y2);
|
|
177
|
+
const x = Math.min(a.x, c.x);
|
|
178
|
+
const y = Math.min(a.y, c.y);
|
|
179
|
+
const w = Math.abs(c.x - a.x);
|
|
180
|
+
const h = Math.abs(c.y - a.y);
|
|
181
|
+
if (b.kind === "ellipse") return /* @__PURE__ */ jsx(Ellipse, { cx: x + w / 2, cy: y + h / 2, rx: w / 2, ry: h / 2, stroke: b.color, strokeWidth: 2, fill: "none" }, key);
|
|
182
|
+
if (b.kind === "arrow") return /* @__PURE__ */ jsx(Line, { x1: a.x, y1: a.y, x2: c.x, y2: c.y, stroke: b.color, strokeWidth: 3 }, key);
|
|
183
|
+
if (b.kind === "redact") return /* @__PURE__ */ jsx(Rect, { x, y, width: w, height: h, fill: "rgba(0,0,0,0.45)", stroke: b.color, strokeWidth: 1.5 }, key);
|
|
184
|
+
return /* @__PURE__ */ jsx(Rect, { x, y, width: w, height: h, fill: b.kind === "crop" ? "rgba(255,255,255,0.08)" : "none", stroke: b.color, strokeWidth: 2, strokeDasharray: b.kind === "crop" ? "6,4" : void 0 }, key);
|
|
185
|
+
};
|
|
186
|
+
return /* @__PURE__ */ jsx(View, __spreadProps(__spreadValues({ style: StyleSheet.absoluteFill, pointerEvents: mode === "none" ? "none" : "auto", onLayout: (e) => setView({
|
|
187
|
+
width: e.nativeEvent.layout.width,
|
|
188
|
+
height: e.nativeEvent.layout.height
|
|
189
|
+
}) }, responder.panHandlers), { children: view.width > 0 ? /* @__PURE__ */ jsxs(Svg, { width: view.width, height: view.height, pointerEvents: "none", children: [
|
|
190
|
+
strokes.map((s) => /* @__PURE__ */ jsx(Polyline, { points: polyline(s.points), stroke: s.color, strokeWidth: Math.max(1, s.size * scale), strokeLinecap: "round", strokeLinejoin: "round", strokeOpacity: 0.85, fill: "none" }, s.id)),
|
|
191
|
+
livePoints ? /* @__PURE__ */ jsx(Polyline, { points: polyline(livePoints), stroke: strokeColor, strokeWidth: Math.max(1, strokeSize * scale), strokeLinecap: "round", strokeLinejoin: "round", strokeOpacity: 0.85, fill: "none" }) : null,
|
|
192
|
+
boxes.map((b) => drawBox(b, b.id)),
|
|
193
|
+
liveBox ? drawBox(liveBox, "live") : null
|
|
194
|
+
] }) : null }));
|
|
195
|
+
}export{ImageMarkup};//# sourceMappingURL=ImageMarkup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageMarkup.js","sources":["../../../../src/features/canvas/imageEditor/ImageMarkup.tsx"],"sourcesContent":["/**\n * The touch layer over the image editor's picture - the phone twin of the web\n * KonvaOverlay. It sits exactly over the contain-fit picture and works in\n * the picture's own pixels, so whatever it collects goes straight to the\n * connector ops:\n *\n * stroke freehand scribble (Mark & edit, Draw)\n * rect drag a box (free crop, redact, annotate shapes)\n *\n * Drawn with react-native-svg; gestures through PanResponder.\n */\nimport React, { useMemo, useRef, useState } from 'react';\nimport { PanResponder, StyleSheet, View, type LayoutChangeEvent } from 'react-native';\nimport Svg, { Ellipse, Line, Polyline, Rect } from 'react-native-svg';\nimport {\n containRect,\n rectFromCorners,\n viewToNatural,\n type NaturalSize,\n type PixelRect,\n type Stroke,\n} from './imageEditOps';\n\nexport type MarkupMode = 'none' | 'stroke' | 'rect';\n\nexport interface MarkupBox {\n id: string;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n kind: 'rect' | 'ellipse' | 'arrow' | 'crop' | 'redact';\n color: string;\n}\n\nlet seq = 0;\nconst nextId = () => `mk-${Date.now().toString(36)}-${seq++}`;\n\nexport function ImageMarkup({\n natural,\n mode,\n strokes,\n strokeColor,\n strokeSize,\n onStroke,\n boxes,\n boxKind = 'rect',\n boxColor = '#ffffff',\n onBox,\n}: {\n natural: NaturalSize | null;\n mode: MarkupMode;\n strokes: Stroke[];\n strokeColor: string;\n /** Brush diameter in natural pixels. */\n strokeSize: number;\n onStroke: (stroke: Stroke) => void;\n boxes: MarkupBox[];\n boxKind?: MarkupBox['kind'];\n boxColor?: string;\n onBox: (box: MarkupBox, rect: PixelRect) => void;\n}) {\n const [view, setView] = useState({ width: 0, height: 0 });\n const [livePoints, setLivePoints] = useState<number[] | null>(null);\n const [liveBox, setLiveBox] = useState<MarkupBox | null>(null);\n const frame = natural ? containRect(view, natural) : null;\n const scale = frame && natural ? frame.width / natural.width : 1;\n\n const live = useRef({ mode, natural, frame, strokeColor, strokeSize, boxKind, boxColor, onStroke, onBox });\n live.current = { mode, natural, frame, strokeColor, strokeSize, boxKind, boxColor, onStroke, onBox };\n const points = useRef<number[]>([]);\n const anchor = useRef<{ x: number; y: number } | null>(null);\n\n const responder = useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => live.current.mode !== 'none' && Boolean(live.current.natural),\n onMoveShouldSetPanResponder: () => live.current.mode !== 'none' && Boolean(live.current.natural),\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (e) => {\n const { natural: nat, frame: fr, mode: m } = live.current;\n if (!nat || !fr) return;\n const p = viewToNatural({ x: e.nativeEvent.locationX, y: e.nativeEvent.locationY }, fr, nat);\n if (m === 'stroke') {\n points.current = [p.x, p.y];\n setLivePoints(points.current);\n } else {\n anchor.current = p;\n setLiveBox({\n id: 'live',\n x1: p.x,\n y1: p.y,\n x2: p.x,\n y2: p.y,\n kind: live.current.boxKind,\n color: live.current.boxColor,\n });\n }\n },\n onPanResponderMove: (e) => {\n const { natural: nat, frame: fr, mode: m } = live.current;\n if (!nat || !fr) return;\n const p = viewToNatural({ x: e.nativeEvent.locationX, y: e.nativeEvent.locationY }, fr, nat);\n if (m === 'stroke') {\n const pts = points.current;\n const lx = pts[pts.length - 2];\n const ly = pts[pts.length - 1];\n // Skip sub-2px jitter: it only fattens the op list.\n if (Math.hypot(p.x - lx, p.y - ly) < 2) return;\n points.current = [...pts, p.x, p.y];\n setLivePoints(points.current);\n } else if (anchor.current) {\n const a = anchor.current;\n setLiveBox((b) => (b ? { ...b, x1: a.x, y1: a.y, x2: p.x, y2: p.y } : b));\n }\n },\n onPanResponderRelease: () => {\n const { mode: m } = live.current;\n if (m === 'stroke') {\n const pts = points.current;\n if (pts.length >= 2)\n live.current.onStroke({\n id: nextId(),\n points: pts.length === 2 ? [...pts, pts[0] + 1, pts[1]] : pts,\n size: live.current.strokeSize,\n color: live.current.strokeColor,\n });\n points.current = [];\n setLivePoints(null);\n } else {\n setLiveBox((b) => {\n if (b) {\n const rect = rectFromCorners({ x: b.x1, y: b.y1 }, { x: b.x2, y: b.y2 });\n // A tap is not a box; arrows only need length.\n if (rect.width >= 4 || rect.height >= 4)\n live.current.onBox({ ...b, id: nextId() }, rect);\n }\n return null;\n });\n anchor.current = null;\n }\n },\n }),\n [],\n );\n\n const toView = (x: number, y: number) => (frame ? { x: frame.x + x * scale, y: frame.y + y * scale } : { x, y });\n const polyline = (pts: number[]) => {\n const out: string[] = [];\n for (let i = 0; i + 1 < pts.length; i += 2) {\n const v = toView(pts[i], pts[i + 1]);\n out.push(`${v.x.toFixed(1)},${v.y.toFixed(1)}`);\n }\n return out.join(' ');\n };\n const drawBox = (b: MarkupBox, key: string) => {\n const a = toView(b.x1, b.y1);\n const c = toView(b.x2, b.y2);\n const x = Math.min(a.x, c.x);\n const y = Math.min(a.y, c.y);\n const w = Math.abs(c.x - a.x);\n const h = Math.abs(c.y - a.y);\n if (b.kind === 'ellipse')\n return (\n <Ellipse\n key={key}\n cx={x + w / 2}\n cy={y + h / 2}\n rx={w / 2}\n ry={h / 2}\n stroke={b.color}\n strokeWidth={2}\n fill=\"none\"\n />\n );\n if (b.kind === 'arrow')\n return <Line key={key} x1={a.x} y1={a.y} x2={c.x} y2={c.y} stroke={b.color} strokeWidth={3} />;\n if (b.kind === 'redact')\n return (\n <Rect\n key={key}\n x={x}\n y={y}\n width={w}\n height={h}\n fill=\"rgba(0,0,0,0.45)\"\n stroke={b.color}\n strokeWidth={1.5}\n />\n );\n return (\n <Rect\n key={key}\n x={x}\n y={y}\n width={w}\n height={h}\n fill={b.kind === 'crop' ? 'rgba(255,255,255,0.08)' : 'none'}\n stroke={b.color}\n strokeWidth={2}\n strokeDasharray={b.kind === 'crop' ? '6,4' : undefined}\n />\n );\n };\n\n return (\n <View\n style={StyleSheet.absoluteFill}\n pointerEvents={mode === 'none' ? 'none' : 'auto'}\n onLayout={(e: LayoutChangeEvent) =>\n setView({ width: e.nativeEvent.layout.width, height: e.nativeEvent.layout.height })\n }\n {...responder.panHandlers}\n >\n {view.width > 0 ? (\n <Svg width={view.width} height={view.height} pointerEvents=\"none\">\n {strokes.map((s) => (\n <Polyline\n key={s.id}\n points={polyline(s.points)}\n stroke={s.color}\n strokeWidth={Math.max(1, s.size * scale)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeOpacity={0.85}\n fill=\"none\"\n />\n ))}\n {livePoints ? (\n <Polyline\n points={polyline(livePoints)}\n stroke={strokeColor}\n strokeWidth={Math.max(1, strokeSize * scale)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeOpacity={0.85}\n fill=\"none\"\n />\n ) : null}\n {boxes.map((b) => drawBox(b, b.id))}\n {liveBox ? drawBox(liveBox, 'live') : null}\n </Svg>\n ) : null}\n </View>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAyBA,IAAI,GAAM,GAAA,CAAA;AACV,MAAM,MAAA,GAAS,MAAM,CAAA,GAAA,EAAM,IAAK,CAAA,GAAA,GAAM,QAAS,CAAA,EAAE,CAAC,CAAA,CAAA,EAAI,GAAK,EAAA,CAAA,CAAA;AACpD,SAAS,WAAY,CAAA;AAAA,EAC1B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAU,GAAA,MAAA;AAAA,EACV,QAAW,GAAA,SAAA;AAAA,EACX;AACF,CAYG,EAAA;AACD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,QAAS,CAAA;AAAA,IAC/B,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA;AAAA,GACT,CAAA;AACD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAA0B,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA2B,IAAI,CAAA;AAC7D,EAAA,MAAM,KAAQ,GAAA,OAAA,GAAU,WAAY,CAAA,IAAA,EAAM,OAAO,CAAI,GAAA,IAAA;AACrD,EAAA,MAAM,QAAQ,KAAS,IAAA,OAAA,GAAU,KAAM,CAAA,KAAA,GAAQ,QAAQ,KAAQ,GAAA,CAAA;AAC/D,EAAA,MAAM,OAAO,MAAO,CAAA;AAAA,IAClB,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,IAAA,CAAK,OAAU,GAAA;AAAA,IACb,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACA,EAAM,MAAA,MAAA,GAAS,MAAiB,CAAA,EAAE,CAAA;AAClC,EAAM,MAAA,MAAA,GAAS,OAGL,IAAI,CAAA;AACd,EAAA,MAAM,SAAY,GAAA,OAAA,CAAQ,MAAM,YAAA,CAAa,MAAO,CAAA;AAAA,IAClD,4BAAA,EAA8B,MAAM,IAAK,CAAA,OAAA,CAAQ,SAAS,MAAU,IAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IAChG,2BAAA,EAA6B,MAAM,IAAK,CAAA,OAAA,CAAQ,SAAS,MAAU,IAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC/F,kCAAkC,MAAM,KAAA;AAAA,IACxC,qBAAqB,CAAK,CAAA,KAAA;AACxB,MAAM,MAAA;AAAA,QACJ,OAAS,EAAA,GAAA;AAAA,QACT,KAAO,EAAA,EAAA;AAAA,QACP,IAAM,EAAA;AAAA,UACJ,IAAK,CAAA,OAAA;AACT,MAAI,IAAA,CAAC,GAAO,IAAA,CAAC,EAAI,EAAA;AACjB,MAAA,MAAM,IAAI,aAAc,CAAA;AAAA,QACtB,CAAA,EAAG,EAAE,WAAY,CAAA,SAAA;AAAA,QACjB,CAAA,EAAG,EAAE,WAAY,CAAA;AAAA,OACnB,EAAG,IAAI,GAAG,CAAA;AACV,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,MAAA,CAAO,OAAU,GAAA,CAAC,CAAE,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AAC1B,QAAA,aAAA,CAAc,OAAO,OAAO,CAAA;AAAA,OACvB,MAAA;AACL,QAAA,MAAA,CAAO,OAAU,GAAA,CAAA;AACjB,QAAW,UAAA,CAAA;AAAA,UACT,EAAI,EAAA,MAAA;AAAA,UACJ,IAAI,CAAE,CAAA,CAAA;AAAA,UACN,IAAI,CAAE,CAAA,CAAA;AAAA,UACN,IAAI,CAAE,CAAA,CAAA;AAAA,UACN,IAAI,CAAE,CAAA,CAAA;AAAA,UACN,IAAA,EAAM,KAAK,OAAQ,CAAA,OAAA;AAAA,UACnB,KAAA,EAAO,KAAK,OAAQ,CAAA;AAAA,SACrB,CAAA;AAAA;AACH,KACF;AAAA,IACA,oBAAoB,CAAK,CAAA,KAAA;AACvB,MAAM,MAAA;AAAA,QACJ,OAAS,EAAA,GAAA;AAAA,QACT,KAAO,EAAA,EAAA;AAAA,QACP,IAAM,EAAA;AAAA,UACJ,IAAK,CAAA,OAAA;AACT,MAAI,IAAA,CAAC,GAAO,IAAA,CAAC,EAAI,EAAA;AACjB,MAAA,MAAM,IAAI,aAAc,CAAA;AAAA,QACtB,CAAA,EAAG,EAAE,WAAY,CAAA,SAAA;AAAA,QACjB,CAAA,EAAG,EAAE,WAAY,CAAA;AAAA,OACnB,EAAG,IAAI,GAAG,CAAA;AACV,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,MAAM,MAAM,MAAO,CAAA,OAAA;AACnB,QAAA,MAAM,EAAK,GAAA,GAAA,CAAI,GAAI,CAAA,MAAA,GAAS,CAAC,CAAA;AAC7B,QAAA,MAAM,EAAK,GAAA,GAAA,CAAI,GAAI,CAAA,MAAA,GAAS,CAAC,CAAA;AAE7B,QAAI,IAAA,IAAA,CAAK,MAAM,CAAE,CAAA,CAAA,GAAI,IAAI,CAAE,CAAA,CAAA,GAAI,EAAE,CAAA,GAAI,CAAG,EAAA;AACxC,QAAA,MAAA,CAAO,UAAU,CAAC,GAAG,KAAK,CAAE,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AAClC,QAAA,aAAA,CAAc,OAAO,OAAO,CAAA;AAAA,OAC9B,MAAA,IAAW,OAAO,OAAS,EAAA;AACzB,QAAA,MAAM,IAAI,MAAO,CAAA,OAAA;AACjB,QAAW,UAAA,CAAA,CAAA,CAAA,KAAK,CAAI,GAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACf,CADe,CAAA,EAAA;AAAA,UAElB,IAAI,CAAE,CAAA,CAAA;AAAA,UACN,IAAI,CAAE,CAAA,CAAA;AAAA,UACN,IAAI,CAAE,CAAA,CAAA;AAAA,UACN,IAAI,CAAE,CAAA;AAAA,aACJ,CAAC,CAAA;AAAA;AACP,KACF;AAAA,IACA,uBAAuB,MAAM;AAC3B,MAAM,MAAA;AAAA,QACJ,IAAM,EAAA;AAAA,UACJ,IAAK,CAAA,OAAA;AACT,MAAA,IAAI,MAAM,QAAU,EAAA;AAClB,QAAA,MAAM,MAAM,MAAO,CAAA,OAAA;AACnB,QAAA,IAAI,GAAI,CAAA,MAAA,IAAU,CAAG,EAAA,IAAA,CAAK,QAAQ,QAAS,CAAA;AAAA,UACzC,IAAI,MAAO,EAAA;AAAA,UACX,MAAQ,EAAA,GAAA,CAAI,MAAW,KAAA,CAAA,GAAI,CAAC,GAAG,GAAA,EAAK,GAAI,CAAA,CAAC,CAAI,GAAA,CAAA,EAAG,GAAI,CAAA,CAAC,CAAC,CAAI,GAAA,GAAA;AAAA,UAC1D,IAAA,EAAM,KAAK,OAAQ,CAAA,UAAA;AAAA,UACnB,KAAA,EAAO,KAAK,OAAQ,CAAA;AAAA,SACrB,CAAA;AACD,QAAA,MAAA,CAAO,UAAU,EAAC;AAClB,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,OACb,MAAA;AACL,QAAA,UAAA,CAAW,CAAK,CAAA,KAAA;AACd,UAAA,IAAI,CAAG,EAAA;AACL,YAAA,MAAM,OAAO,eAAgB,CAAA;AAAA,cAC3B,GAAG,CAAE,CAAA,EAAA;AAAA,cACL,GAAG,CAAE,CAAA;AAAA,aACJ,EAAA;AAAA,cACD,GAAG,CAAE,CAAA,EAAA;AAAA,cACL,GAAG,CAAE,CAAA;AAAA,aACN,CAAA;AAED,YAAI,IAAA,IAAA,CAAK,KAAS,IAAA,CAAA,IAAK,IAAK,CAAA,MAAA,IAAU,GAAQ,IAAA,CAAA,OAAA,CAAQ,KAAM,CAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACvD,CADuD,CAAA,EAAA;AAAA,cAE1D,IAAI,MAAO;AAAA,gBACV,IAAI,CAAA;AAAA;AAET,UAAO,OAAA,IAAA;AAAA,SACR,CAAA;AACD,QAAA,MAAA,CAAO,OAAU,GAAA,IAAA;AAAA;AACnB;AACF,GACD,CAAG,EAAA,EAAE,CAAA;AACN,EAAA,MAAM,MAAS,GAAA,CAAC,CAAW,EAAA,CAAA,KAAc,KAAQ,GAAA;AAAA,IAC/C,CAAA,EAAG,KAAM,CAAA,CAAA,GAAI,CAAI,GAAA,KAAA;AAAA,IACjB,CAAA,EAAG,KAAM,CAAA,CAAA,GAAI,CAAI,GAAA;AAAA,GACf,GAAA;AAAA,IACF,CAAA;AAAA,IACA;AAAA,GACF;AACA,EAAM,MAAA,QAAA,GAAW,CAAC,GAAkB,KAAA;AAClC,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,IAAI,GAAI,CAAA,MAAA,EAAQ,KAAK,CAAG,EAAA;AAC1C,MAAM,MAAA,CAAA,GAAI,OAAO,GAAI,CAAA,CAAC,GAAG,GAAI,CAAA,CAAA,GAAI,CAAC,CAAC,CAAA;AACnC,MAAA,GAAA,CAAI,IAAK,CAAA,CAAA,EAAG,CAAE,CAAA,CAAA,CAAE,OAAQ,CAAA,CAAC,CAAC,CAAA,CAAA,EAAI,CAAE,CAAA,CAAA,CAAE,OAAQ,CAAA,CAAC,CAAC,CAAE,CAAA,CAAA;AAAA;AAEhD,IAAO,OAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,GACrB;AACA,EAAM,MAAA,OAAA,GAAU,CAAC,CAAA,EAAc,GAAgB,KAAA;AAC7C,IAAA,MAAM,CAAI,GAAA,MAAA,CAAO,CAAE,CAAA,EAAA,EAAI,EAAE,EAAE,CAAA;AAC3B,IAAA,MAAM,CAAI,GAAA,MAAA,CAAO,CAAE,CAAA,EAAA,EAAI,EAAE,EAAE,CAAA;AAC3B,IAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3B,IAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3B,IAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,CAAA,GAAI,EAAE,CAAC,CAAA;AAC5B,IAAA,MAAM,IAAI,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,CAAA,GAAI,EAAE,CAAC,CAAA;AAC5B,IAAI,IAAA,CAAA,CAAE,IAAS,KAAA,SAAA,EAAkB,uBAAA,GAAA,CAAC,OAAkB,EAAA,EAAA,EAAA,EAAI,CAAI,GAAA,CAAA,GAAI,CAAG,EAAA,EAAA,EAAI,CAAI,GAAA,CAAA,GAAI,CAAG,EAAA,EAAA,EAAI,CAAI,GAAA,CAAA,EAAG,EAAI,EAAA,CAAA,GAAI,CAAG,EAAA,MAAA,EAAQ,CAAE,CAAA,KAAA,EAAO,WAAa,EAAA,CAAA,EAAG,IAAK,EAAA,MAAA,EAAA,EAA/F,GAAsG,CAAA;AACrJ,IAAI,IAAA,CAAA,CAAE,SAAS,OAAS,EAAA,2BAAQ,IAAe,EAAA,EAAA,EAAA,EAAI,CAAE,CAAA,CAAA,EAAG,EAAI,EAAA,CAAA,CAAE,GAAG,EAAI,EAAA,CAAA,CAAE,CAAG,EAAA,EAAA,EAAI,CAAE,CAAA,CAAA,EAAG,QAAQ,CAAE,CAAA,KAAA,EAAO,WAAa,EAAA,CAAA,EAAA,EAAvE,GAA0E,CAAA;AACpH,IAAA,IAAI,EAAE,IAAS,KAAA,QAAA,yBAAkB,GAAA,CAAA,IAAA,EAAA,EAAe,GAAM,CAAM,EAAA,KAAA,EAAO,GAAG,MAAQ,EAAA,CAAA,EAAG,MAAK,kBAAmB,EAAA,MAAA,EAAQ,EAAE,KAAO,EAAA,WAAA,EAAa,OAA5F,GAAiG,CAAA;AAC5I,IAAO,uBAAA,GAAA,CAAC,IAAe,EAAA,EAAA,CAAA,EAAM,CAAM,EAAA,KAAA,EAAO,GAAG,MAAQ,EAAA,CAAA,EAAG,IAAM,EAAA,CAAA,CAAE,IAAS,KAAA,MAAA,GAAS,2BAA2B,MAAQ,EAAA,MAAA,EAAQ,CAAE,CAAA,KAAA,EAAO,WAAa,EAAA,CAAA,EAAG,eAAiB,EAAA,CAAA,CAAE,IAAS,KAAA,MAAA,GAAS,KAAQ,GAAA,MAAA,EAAA,EAAjL,GAA4L,CAAA;AAAA,GAChN;AACA,EAAA,uBAAQ,GAAA,CAAA,IAAA,EAAA,aAAA,CAAA,cAAA,CAAA,EAAK,KAAO,EAAA,UAAA,CAAW,YAAc,EAAA,aAAA,EAAe,IAAS,KAAA,MAAA,GAAS,MAAS,GAAA,MAAA,EAAQ,QAAU,EAAA,CAAC,MAAyB,OAAQ,CAAA;AAAA,IACzI,KAAA,EAAO,CAAE,CAAA,WAAA,CAAY,MAAO,CAAA,KAAA;AAAA,IAC5B,MAAA,EAAQ,CAAE,CAAA,WAAA,CAAY,MAAO,CAAA;AAAA,GAC9B,CAAO,EAAA,EAAA,SAAA,CAAU,WAHV,CAAA,EAAA,EAIG,eAAK,KAAQ,GAAA,CAAA,mBAAK,IAAA,CAAA,GAAA,EAAA,EAAI,OAAO,IAAK,CAAA,KAAA,EAAO,QAAQ,IAAK,CAAA,MAAA,EAAQ,eAAc,MACpE,EAAA,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,CAAA,qBAAM,GAAA,CAAA,QAAA,EAAA,EAAoB,MAAQ,EAAA,QAAA,CAAS,CAAE,CAAA,MAAM,CAAG,EAAA,MAAA,EAAQ,CAAE,CAAA,KAAA,EAAO,aAAa,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,CAAA,CAAE,IAAO,GAAA,KAAK,CAAG,EAAA,aAAA,EAAc,OAAQ,EAAA,cAAA,EAAe,OAAQ,EAAA,aAAA,EAAe,IAAM,EAAA,IAAA,EAAK,MAApK,EAAA,EAAA,CAAA,CAAE,EAAyK,CAAE,CAAA;AAAA,IAC7M,UAAA,mBAAc,GAAA,CAAA,QAAA,EAAA,EAAS,MAAQ,EAAA,QAAA,CAAS,UAAU,CAAG,EAAA,MAAA,EAAQ,WAAa,EAAA,WAAA,EAAa,IAAK,CAAA,GAAA,CAAI,GAAG,UAAa,GAAA,KAAK,CAAG,EAAA,aAAA,EAAc,OAAQ,EAAA,cAAA,EAAe,SAAQ,aAAe,EAAA,IAAA,EAAM,IAAK,EAAA,MAAA,EAAO,CAAK,GAAA,IAAA;AAAA,IAC3M,MAAM,GAAI,CAAA,CAAA,CAAA,KAAK,QAAQ,CAAG,EAAA,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,IAC/B,OAAU,GAAA,OAAA,CAAQ,OAAS,EAAA,MAAM,CAAI,GAAA;AAAA,GAAA,EAC1C,IAAS,IACjB,EAAA,CAAA,CAAA;AACR"}
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
const IMAGE_EDIT_ACTIONS = {
|
|
18
|
+
crop: "YANTRA_IMAGE_EDIT_CROP",
|
|
19
|
+
rotate: "YANTRA_IMAGE_EDIT_ROTATE",
|
|
20
|
+
flip: "YANTRA_IMAGE_EDIT_FLIP",
|
|
21
|
+
resize: "YANTRA_IMAGE_EDIT_RESIZE",
|
|
22
|
+
pad: "YANTRA_IMAGE_EDIT_PAD",
|
|
23
|
+
finetune: "YANTRA_IMAGE_EDIT_FINETUNE",
|
|
24
|
+
filter: "YANTRA_IMAGE_EDIT_FILTER",
|
|
25
|
+
redact: "YANTRA_IMAGE_EDIT_REDACT",
|
|
26
|
+
frame: "YANTRA_IMAGE_EDIT_FRAME",
|
|
27
|
+
annotate: "YANTRA_IMAGE_EDIT_ANNOTATE",
|
|
28
|
+
watermark: "YANTRA_IMAGE_EDIT_WATERMARK",
|
|
29
|
+
convert: "YANTRA_IMAGE_EDIT_CONVERT",
|
|
30
|
+
colorspace: "YANTRA_IMAGE_EDIT_COLORSPACE",
|
|
31
|
+
compose: "YANTRA_IMAGE_EDIT_COMPOSE",
|
|
32
|
+
mask: "YANTRA_IMAGE_EDIT_MASK",
|
|
33
|
+
levels: "YANTRA_IMAGE_EDIT_LEVELS",
|
|
34
|
+
vignette: "YANTRA_IMAGE_EDIT_VIGNETTE",
|
|
35
|
+
drop_shadow: "YANTRA_IMAGE_EDIT_DROP_SHADOW",
|
|
36
|
+
remove_background: "YANTRA_IMAGE_EDIT_REMOVE_BACKGROUND"
|
|
37
|
+
};
|
|
38
|
+
function containRect(view, natural) {
|
|
39
|
+
if (!(view.width > 0) || !(view.height > 0) || !(natural.width > 0) || !(natural.height > 0)) return {
|
|
40
|
+
x: 0,
|
|
41
|
+
y: 0,
|
|
42
|
+
width: Math.max(0, view.width),
|
|
43
|
+
height: Math.max(0, view.height)
|
|
44
|
+
};
|
|
45
|
+
const k = Math.min(view.width / natural.width, view.height / natural.height);
|
|
46
|
+
const width = natural.width * k;
|
|
47
|
+
const height = natural.height * k;
|
|
48
|
+
return {
|
|
49
|
+
x: (view.width - width) / 2,
|
|
50
|
+
y: (view.height - height) / 2,
|
|
51
|
+
width,
|
|
52
|
+
height
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function viewToNatural(point, frame, natural) {
|
|
56
|
+
const fx = frame.width > 0 ? (point.x - frame.x) / frame.width : 0;
|
|
57
|
+
const fy = frame.height > 0 ? (point.y - frame.y) / frame.height : 0;
|
|
58
|
+
return {
|
|
59
|
+
x: Math.round(Math.min(1, Math.max(0, fx)) * natural.width),
|
|
60
|
+
y: Math.round(Math.min(1, Math.max(0, fy)) * natural.height)
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function rectFromCorners(a, b) {
|
|
64
|
+
return {
|
|
65
|
+
x: Math.round(Math.min(a.x, b.x)),
|
|
66
|
+
y: Math.round(Math.min(a.y, b.y)),
|
|
67
|
+
width: Math.round(Math.abs(b.x - a.x)),
|
|
68
|
+
height: Math.round(Math.abs(b.y - a.y))
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function centeredAspectRect(natural, ratio) {
|
|
72
|
+
let w = natural.width;
|
|
73
|
+
let h = w / ratio;
|
|
74
|
+
if (h > natural.height) {
|
|
75
|
+
h = natural.height;
|
|
76
|
+
w = h * ratio;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
x: Math.round((natural.width - w) / 2),
|
|
80
|
+
y: Math.round((natural.height - h) / 2),
|
|
81
|
+
width: Math.round(w),
|
|
82
|
+
height: Math.round(h)
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const MAX_STROKE_DOTS = 1500;
|
|
86
|
+
function strokesToAnnotateOps(strokes, maxDots = MAX_STROKE_DOTS) {
|
|
87
|
+
const dotsAt = (spacingK) => {
|
|
88
|
+
const dots2 = [];
|
|
89
|
+
for (const s of strokes) {
|
|
90
|
+
const r = Math.max(1, Math.round(s.size / 2));
|
|
91
|
+
const gap = Math.max(1, s.size * spacingK);
|
|
92
|
+
const pts = s.points;
|
|
93
|
+
if (pts.length < 2) continue;
|
|
94
|
+
dots2.push({
|
|
95
|
+
x: pts[0],
|
|
96
|
+
y: pts[1],
|
|
97
|
+
r,
|
|
98
|
+
color: s.color
|
|
99
|
+
});
|
|
100
|
+
for (let i = 2; i + 1 < pts.length; i += 2) {
|
|
101
|
+
const x0 = pts[i - 2];
|
|
102
|
+
const y0 = pts[i - 1];
|
|
103
|
+
const dx = pts[i] - x0;
|
|
104
|
+
const dy = pts[i + 1] - y0;
|
|
105
|
+
const n = Math.max(1, Math.ceil(Math.hypot(dx, dy) / gap));
|
|
106
|
+
for (let k2 = 1; k2 <= n; k2 += 1) dots2.push({
|
|
107
|
+
x: x0 + dx * k2 / n,
|
|
108
|
+
y: y0 + dy * k2 / n,
|
|
109
|
+
r,
|
|
110
|
+
color: s.color
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return dots2;
|
|
115
|
+
};
|
|
116
|
+
let k = 1 / 3;
|
|
117
|
+
let dots = dotsAt(k);
|
|
118
|
+
while (dots.length > maxDots && k < 4) {
|
|
119
|
+
k *= 1.5;
|
|
120
|
+
dots = dotsAt(k);
|
|
121
|
+
}
|
|
122
|
+
return dots.slice(0, maxDots).map((d) => ({
|
|
123
|
+
type: "ellipse",
|
|
124
|
+
cx: Math.round(d.x),
|
|
125
|
+
cy: Math.round(d.y),
|
|
126
|
+
rx: d.r,
|
|
127
|
+
ry: d.r,
|
|
128
|
+
color: d.color,
|
|
129
|
+
thickness: 1,
|
|
130
|
+
fill: true
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
function annotateOp(a) {
|
|
134
|
+
var _a, _b;
|
|
135
|
+
const x = Math.min(a.x1, a.x2);
|
|
136
|
+
const y = Math.min(a.y1, a.y2);
|
|
137
|
+
const w = Math.abs(a.x2 - a.x1);
|
|
138
|
+
const h = Math.abs(a.y2 - a.y1);
|
|
139
|
+
switch (a.kind) {
|
|
140
|
+
case "text":
|
|
141
|
+
return {
|
|
142
|
+
type: "text",
|
|
143
|
+
text: (_a = a.text) != null ? _a : "",
|
|
144
|
+
x: String(a.x1),
|
|
145
|
+
y: String(a.y1),
|
|
146
|
+
font_size: (_b = a.fontSize) != null ? _b : 24,
|
|
147
|
+
font_color: a.color
|
|
148
|
+
};
|
|
149
|
+
case "box":
|
|
150
|
+
return {
|
|
151
|
+
type: "box",
|
|
152
|
+
x,
|
|
153
|
+
y,
|
|
154
|
+
width: w,
|
|
155
|
+
height: h,
|
|
156
|
+
color: a.color,
|
|
157
|
+
thickness: a.thickness,
|
|
158
|
+
fill: a.fill
|
|
159
|
+
};
|
|
160
|
+
case "ellipse":
|
|
161
|
+
return {
|
|
162
|
+
type: "ellipse",
|
|
163
|
+
cx: Math.round(x + w / 2),
|
|
164
|
+
cy: Math.round(y + h / 2),
|
|
165
|
+
rx: Math.round(w / 2),
|
|
166
|
+
ry: Math.round(h / 2),
|
|
167
|
+
color: a.color,
|
|
168
|
+
thickness: a.thickness,
|
|
169
|
+
fill: a.fill
|
|
170
|
+
};
|
|
171
|
+
case "arrow":
|
|
172
|
+
default:
|
|
173
|
+
return {
|
|
174
|
+
type: "arrow",
|
|
175
|
+
x1: a.x1,
|
|
176
|
+
y1: a.y1,
|
|
177
|
+
x2: a.x2,
|
|
178
|
+
y2: a.y2,
|
|
179
|
+
color: a.color,
|
|
180
|
+
thickness: a.thickness,
|
|
181
|
+
head_size: Math.max(8, a.thickness * 4)
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const RESIZE_SUGGESTIONS = [{
|
|
186
|
+
label: "Instagram Post",
|
|
187
|
+
hint: "Portrait 4:5",
|
|
188
|
+
width: 1080,
|
|
189
|
+
height: 1350
|
|
190
|
+
}, {
|
|
191
|
+
label: "Instagram Post",
|
|
192
|
+
hint: "Square",
|
|
193
|
+
width: 1080,
|
|
194
|
+
height: 1080
|
|
195
|
+
}, {
|
|
196
|
+
label: "Instagram Story or Reel",
|
|
197
|
+
hint: "Vertical 9:16",
|
|
198
|
+
width: 1080,
|
|
199
|
+
height: 1920
|
|
200
|
+
}, {
|
|
201
|
+
label: "Facebook Post",
|
|
202
|
+
hint: "Landscape",
|
|
203
|
+
width: 1200,
|
|
204
|
+
height: 630
|
|
205
|
+
}, {
|
|
206
|
+
label: "YouTube Thumbnail",
|
|
207
|
+
hint: "HD",
|
|
208
|
+
width: 1280,
|
|
209
|
+
height: 720
|
|
210
|
+
}, {
|
|
211
|
+
label: "X / Twitter Post",
|
|
212
|
+
hint: "Landscape",
|
|
213
|
+
width: 1600,
|
|
214
|
+
height: 900
|
|
215
|
+
}, {
|
|
216
|
+
label: "LinkedIn Banner",
|
|
217
|
+
hint: "Wide",
|
|
218
|
+
width: 1584,
|
|
219
|
+
height: 396
|
|
220
|
+
}, {
|
|
221
|
+
label: "Pinterest Pin",
|
|
222
|
+
hint: "Vertical",
|
|
223
|
+
width: 1e3,
|
|
224
|
+
height: 1500
|
|
225
|
+
}, {
|
|
226
|
+
label: "Full HD",
|
|
227
|
+
hint: "1080p",
|
|
228
|
+
width: 1920,
|
|
229
|
+
height: 1080
|
|
230
|
+
}];
|
|
231
|
+
const CROP_ASPECTS = [{
|
|
232
|
+
id: "free",
|
|
233
|
+
label: "Free",
|
|
234
|
+
ratio: null
|
|
235
|
+
}, {
|
|
236
|
+
id: "1:1",
|
|
237
|
+
label: "1:1",
|
|
238
|
+
ratio: 1
|
|
239
|
+
}, {
|
|
240
|
+
id: "4:5",
|
|
241
|
+
label: "4:5",
|
|
242
|
+
ratio: 4 / 5
|
|
243
|
+
}, {
|
|
244
|
+
id: "4:3",
|
|
245
|
+
label: "4:3",
|
|
246
|
+
ratio: 4 / 3
|
|
247
|
+
}, {
|
|
248
|
+
id: "3:2",
|
|
249
|
+
label: "3:2",
|
|
250
|
+
ratio: 3 / 2
|
|
251
|
+
}, {
|
|
252
|
+
id: "16:9",
|
|
253
|
+
label: "16:9",
|
|
254
|
+
ratio: 16 / 9
|
|
255
|
+
}, {
|
|
256
|
+
id: "9:16",
|
|
257
|
+
label: "9:16",
|
|
258
|
+
ratio: 9 / 16
|
|
259
|
+
}];
|
|
260
|
+
const SHADOW_PRESETS = [{
|
|
261
|
+
id: "subtle",
|
|
262
|
+
label: "Subtle",
|
|
263
|
+
params: {
|
|
264
|
+
offsetX: 3,
|
|
265
|
+
offsetY: 3,
|
|
266
|
+
blur: 6,
|
|
267
|
+
color: "#000000",
|
|
268
|
+
opacity: 0.3
|
|
269
|
+
}
|
|
270
|
+
}, {
|
|
271
|
+
id: "drop",
|
|
272
|
+
label: "Drop",
|
|
273
|
+
params: {
|
|
274
|
+
offsetX: 8,
|
|
275
|
+
offsetY: 8,
|
|
276
|
+
blur: 10,
|
|
277
|
+
color: "#000000",
|
|
278
|
+
opacity: 0.55
|
|
279
|
+
}
|
|
280
|
+
}, {
|
|
281
|
+
id: "strong",
|
|
282
|
+
label: "Strong",
|
|
283
|
+
params: {
|
|
284
|
+
offsetX: 14,
|
|
285
|
+
offsetY: 14,
|
|
286
|
+
blur: 22,
|
|
287
|
+
color: "#000000",
|
|
288
|
+
opacity: 0.7
|
|
289
|
+
}
|
|
290
|
+
}, {
|
|
291
|
+
id: "left",
|
|
292
|
+
label: "Left tilt",
|
|
293
|
+
params: {
|
|
294
|
+
offsetX: -12,
|
|
295
|
+
offsetY: 10,
|
|
296
|
+
blur: 16,
|
|
297
|
+
color: "#000000",
|
|
298
|
+
opacity: 0.5
|
|
299
|
+
}
|
|
300
|
+
}, {
|
|
301
|
+
id: "backdrop",
|
|
302
|
+
label: "Backdrop",
|
|
303
|
+
params: {
|
|
304
|
+
offsetX: 0,
|
|
305
|
+
offsetY: 18,
|
|
306
|
+
blur: 32,
|
|
307
|
+
color: "#000000",
|
|
308
|
+
opacity: 0.45
|
|
309
|
+
}
|
|
310
|
+
}, {
|
|
311
|
+
id: "glow",
|
|
312
|
+
label: "Glow",
|
|
313
|
+
params: {
|
|
314
|
+
offsetX: 0,
|
|
315
|
+
offsetY: 0,
|
|
316
|
+
blur: 28,
|
|
317
|
+
color: "#ffffff",
|
|
318
|
+
opacity: 0.85
|
|
319
|
+
}
|
|
320
|
+
}];
|
|
321
|
+
function shadowParams(p) {
|
|
322
|
+
return {
|
|
323
|
+
offset_x: p.offsetX,
|
|
324
|
+
offset_y: p.offsetY,
|
|
325
|
+
blur: p.blur,
|
|
326
|
+
color: p.color,
|
|
327
|
+
opacity: p.opacity
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
const LOGO_POSITIONS = ["top-left", "top-center", "top-right", "center", "bottom-left", "bottom-center", "bottom-right"];
|
|
331
|
+
function positionLogo(box, natural, position) {
|
|
332
|
+
const margin = Math.round(natural.width * 0.04);
|
|
333
|
+
const [vertical, horizontal] = position === "center" ? ["center", "center"] : position.split("-");
|
|
334
|
+
const x = horizontal === "left" ? margin : horizontal === "right" ? natural.width - box.width - margin : (natural.width - box.width) / 2;
|
|
335
|
+
const y = vertical === "top" ? margin : vertical === "bottom" ? natural.height - box.height - margin : (natural.height - box.height) / 2;
|
|
336
|
+
return {
|
|
337
|
+
x: Math.round(Math.max(0, x)),
|
|
338
|
+
y: Math.round(Math.max(0, y))
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
function logoComposeParams(opts) {
|
|
342
|
+
const width = Math.max(1, Math.round(opts.natural.width * opts.percent / 100));
|
|
343
|
+
const height = Math.max(1, Math.round(width / (opts.logoAspect > 0 ? opts.logoAspect : 1)));
|
|
344
|
+
const {
|
|
345
|
+
x,
|
|
346
|
+
y
|
|
347
|
+
} = positionLogo({
|
|
348
|
+
width,
|
|
349
|
+
height
|
|
350
|
+
}, opts.natural, opts.position);
|
|
351
|
+
return {
|
|
352
|
+
overlay_url: opts.logoUrl,
|
|
353
|
+
x: String(x),
|
|
354
|
+
y: String(y),
|
|
355
|
+
scale: `${width}:${height}`,
|
|
356
|
+
opacity: opts.opacity
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
const COLORSPACE_TARGETS = ["srgb", "bt709", "bt601", "bt2020", "display-p3"];
|
|
360
|
+
const EXPORT_FORMATS = ["png", "jpeg", "webp", "avif"];
|
|
361
|
+
function convertParams(format, quality) {
|
|
362
|
+
return __spreadValues({
|
|
363
|
+
format
|
|
364
|
+
}, format !== "png" ? {
|
|
365
|
+
quality
|
|
366
|
+
} : {});
|
|
367
|
+
}export{COLORSPACE_TARGETS,CROP_ASPECTS,EXPORT_FORMATS,IMAGE_EDIT_ACTIONS,LOGO_POSITIONS,MAX_STROKE_DOTS,RESIZE_SUGGESTIONS,SHADOW_PRESETS,annotateOp,centeredAspectRect,containRect,convertParams,logoComposeParams,positionLogo,rectFromCorners,shadowParams,strokesToAnnotateOps,viewToNatural};//# sourceMappingURL=imageEditOps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageEditOps.js","sources":["../../../../src/features/canvas/imageEditor/imageEditOps.ts"],"sourcesContent":["/**\n * Pure helpers for the native image editor, twinned from the web\n * `editors/image-editor` (types.ts, ImageToolPanel.tsx) and the connector\n * action map in `rpc/mediaEditingRpc.ts`.\n *\n * The web bakes marks, pen strokes and logos on a client canvas; a phone has\n * no 2D canvas in the remote, so strokes are baked on the server instead: a\n * stroke becomes a run of filled dots through the `annotate` op, which draws\n * the same marker line at the picture's own resolution.\n */\n\n/** Connector action slugs - must match `image-edit-extension/src/constants.ts` (web IMAGE_EDIT_ACTIONS). */\nexport const IMAGE_EDIT_ACTIONS = {\n crop: 'YANTRA_IMAGE_EDIT_CROP',\n rotate: 'YANTRA_IMAGE_EDIT_ROTATE',\n flip: 'YANTRA_IMAGE_EDIT_FLIP',\n resize: 'YANTRA_IMAGE_EDIT_RESIZE',\n pad: 'YANTRA_IMAGE_EDIT_PAD',\n finetune: 'YANTRA_IMAGE_EDIT_FINETUNE',\n filter: 'YANTRA_IMAGE_EDIT_FILTER',\n redact: 'YANTRA_IMAGE_EDIT_REDACT',\n frame: 'YANTRA_IMAGE_EDIT_FRAME',\n annotate: 'YANTRA_IMAGE_EDIT_ANNOTATE',\n watermark: 'YANTRA_IMAGE_EDIT_WATERMARK',\n convert: 'YANTRA_IMAGE_EDIT_CONVERT',\n colorspace: 'YANTRA_IMAGE_EDIT_COLORSPACE',\n compose: 'YANTRA_IMAGE_EDIT_COMPOSE',\n mask: 'YANTRA_IMAGE_EDIT_MASK',\n levels: 'YANTRA_IMAGE_EDIT_LEVELS',\n vignette: 'YANTRA_IMAGE_EDIT_VIGNETTE',\n drop_shadow: 'YANTRA_IMAGE_EDIT_DROP_SHADOW',\n remove_background: 'YANTRA_IMAGE_EDIT_REMOVE_BACKGROUND',\n} as const;\nexport type ImageEditOp = keyof typeof IMAGE_EDIT_ACTIONS;\n\nexport interface NaturalSize {\n width: number;\n height: number;\n}\n\nexport interface PixelRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** A freehand stroke in image-natural pixels: flat [x1, y1, x2, y2, ...], brush diameter, colour. */\nexport interface Stroke {\n id: string;\n points: number[];\n size: number;\n color: string;\n}\n\n/** Where a `contain`-fit picture actually sits inside its view box. */\nexport function containRect(view: { width: number; height: number }, natural: NaturalSize): PixelRect {\n if (!(view.width > 0) || !(view.height > 0) || !(natural.width > 0) || !(natural.height > 0))\n return { x: 0, y: 0, width: Math.max(0, view.width), height: Math.max(0, view.height) };\n const k = Math.min(view.width / natural.width, view.height / natural.height);\n const width = natural.width * k;\n const height = natural.height * k;\n return { x: (view.width - width) / 2, y: (view.height - height) / 2, width, height };\n}\n\n/** A touch in view space as a natural-pixel point, clamped onto the picture. */\nexport function viewToNatural(\n point: { x: number; y: number },\n frame: PixelRect,\n natural: NaturalSize,\n): { x: number; y: number } {\n const fx = frame.width > 0 ? (point.x - frame.x) / frame.width : 0;\n const fy = frame.height > 0 ? (point.y - frame.y) / frame.height : 0;\n return {\n x: Math.round(Math.min(1, Math.max(0, fx)) * natural.width),\n y: Math.round(Math.min(1, Math.max(0, fy)) * natural.height),\n };\n}\n\n/** The rect two drag corners span, in whole pixels. */\nexport function rectFromCorners(a: { x: number; y: number }, b: { x: number; y: number }): PixelRect {\n return {\n x: Math.round(Math.min(a.x, b.x)),\n y: Math.round(Math.min(a.y, b.y)),\n width: Math.round(Math.abs(b.x - a.x)),\n height: Math.round(Math.abs(b.y - a.y)),\n };\n}\n\n/** Largest centred rect of a width/height ratio inside the picture (web centeredAspectRect). */\nexport function centeredAspectRect(natural: NaturalSize, ratio: number): PixelRect {\n let w = natural.width;\n let h = w / ratio;\n if (h > natural.height) {\n h = natural.height;\n w = h * ratio;\n }\n return {\n x: Math.round((natural.width - w) / 2),\n y: Math.round((natural.height - h) / 2),\n width: Math.round(w),\n height: Math.round(h),\n };\n}\n\n/** The most dots one bake sends; long scribbles thin their spacing to stay under it. */\nexport const MAX_STROKE_DOTS = 1500;\n\n/**\n * Freehand strokes as `annotate` ops: a filled dot every third of a brush\n * width along each segment reads as one continuous marker line.\n */\nexport function strokesToAnnotateOps(strokes: Stroke[], maxDots = MAX_STROKE_DOTS): Record<string, unknown>[] {\n const dotsAt = (spacingK: number) => {\n const dots: Array<{ x: number; y: number; r: number; color: string }> = [];\n for (const s of strokes) {\n const r = Math.max(1, Math.round(s.size / 2));\n const gap = Math.max(1, s.size * spacingK);\n const pts = s.points;\n if (pts.length < 2) continue;\n dots.push({ x: pts[0], y: pts[1], r, color: s.color });\n for (let i = 2; i + 1 < pts.length; i += 2) {\n const x0 = pts[i - 2];\n const y0 = pts[i - 1];\n const dx = pts[i] - x0;\n const dy = pts[i + 1] - y0;\n const n = Math.max(1, Math.ceil(Math.hypot(dx, dy) / gap));\n for (let k = 1; k <= n; k += 1)\n dots.push({ x: x0 + (dx * k) / n, y: y0 + (dy * k) / n, r, color: s.color });\n }\n }\n return dots;\n };\n let k = 1 / 3;\n let dots = dotsAt(k);\n while (dots.length > maxDots && k < 4) {\n k *= 1.5;\n dots = dotsAt(k);\n }\n return dots.slice(0, maxDots).map((d) => ({\n type: 'ellipse',\n cx: Math.round(d.x),\n cy: Math.round(d.y),\n rx: d.r,\n ry: d.r,\n color: d.color,\n thickness: 1,\n fill: true,\n }));\n}\n\nexport type AnnotateKind = 'box' | 'ellipse' | 'arrow' | 'text';\n\nexport interface AnnotateShape {\n id: string;\n kind: AnnotateKind;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n color: string;\n thickness: number;\n fill: boolean;\n text?: string;\n fontSize?: number;\n}\n\n/** One pending shape as the `annotate` op takes it (web AnnotateSection onApply). */\nexport function annotateOp(a: AnnotateShape): Record<string, unknown> {\n const x = Math.min(a.x1, a.x2);\n const y = Math.min(a.y1, a.y2);\n const w = Math.abs(a.x2 - a.x1);\n const h = Math.abs(a.y2 - a.y1);\n switch (a.kind) {\n case 'text':\n return {\n type: 'text',\n text: a.text ?? '',\n x: String(a.x1),\n y: String(a.y1),\n font_size: a.fontSize ?? 24,\n font_color: a.color,\n };\n case 'box':\n return { type: 'box', x, y, width: w, height: h, color: a.color, thickness: a.thickness, fill: a.fill };\n case 'ellipse':\n return {\n type: 'ellipse',\n cx: Math.round(x + w / 2),\n cy: Math.round(y + h / 2),\n rx: Math.round(w / 2),\n ry: Math.round(h / 2),\n color: a.color,\n thickness: a.thickness,\n fill: a.fill,\n };\n case 'arrow':\n default:\n return {\n type: 'arrow',\n x1: a.x1,\n y1: a.y1,\n x2: a.x2,\n y2: a.y2,\n color: a.color,\n thickness: a.thickness,\n head_size: Math.max(8, a.thickness * 4),\n };\n }\n}\n\n/** Canva-style \"resize for...\" sizes (web RESIZE_SUGGESTIONS). */\nexport const RESIZE_SUGGESTIONS: ReadonlyArray<{ label: string; hint: string; width: number; height: number }> = [\n { label: 'Instagram Post', hint: 'Portrait 4:5', width: 1080, height: 1350 },\n { label: 'Instagram Post', hint: 'Square', width: 1080, height: 1080 },\n { label: 'Instagram Story or Reel', hint: 'Vertical 9:16', width: 1080, height: 1920 },\n { label: 'Facebook Post', hint: 'Landscape', width: 1200, height: 630 },\n { label: 'YouTube Thumbnail', hint: 'HD', width: 1280, height: 720 },\n { label: 'X / Twitter Post', hint: 'Landscape', width: 1600, height: 900 },\n { label: 'LinkedIn Banner', hint: 'Wide', width: 1584, height: 396 },\n { label: 'Pinterest Pin', hint: 'Vertical', width: 1000, height: 1500 },\n { label: 'Full HD', hint: '1080p', width: 1920, height: 1080 },\n];\n\n/** Crop aspect presets; `null` is free crop (drag a box on the picture). */\nexport const CROP_ASPECTS: ReadonlyArray<{ id: string; label: string; ratio: number | null }> = [\n { id: 'free', label: 'Free', ratio: null },\n { id: '1:1', label: '1:1', ratio: 1 },\n { id: '4:5', label: '4:5', ratio: 4 / 5 },\n { id: '4:3', label: '4:3', ratio: 4 / 3 },\n { id: '3:2', label: '3:2', ratio: 3 / 2 },\n { id: '16:9', label: '16:9', ratio: 16 / 9 },\n { id: '9:16', label: '9:16', ratio: 9 / 16 },\n];\n\n/** Drop-shadow presets; params feed the `drop_shadow` op unchanged (web SHADOW_PRESETS). */\nexport const SHADOW_PRESETS: ReadonlyArray<{\n id: string;\n label: string;\n params: { offsetX: number; offsetY: number; blur: number; color: string; opacity: number };\n}> = [\n { id: 'subtle', label: 'Subtle', params: { offsetX: 3, offsetY: 3, blur: 6, color: '#000000', opacity: 0.3 } },\n { id: 'drop', label: 'Drop', params: { offsetX: 8, offsetY: 8, blur: 10, color: '#000000', opacity: 0.55 } },\n { id: 'strong', label: 'Strong', params: { offsetX: 14, offsetY: 14, blur: 22, color: '#000000', opacity: 0.7 } },\n { id: 'left', label: 'Left tilt', params: { offsetX: -12, offsetY: 10, blur: 16, color: '#000000', opacity: 0.5 } },\n {\n id: 'backdrop',\n label: 'Backdrop',\n params: { offsetX: 0, offsetY: 18, blur: 32, color: '#000000', opacity: 0.45 },\n },\n { id: 'glow', label: 'Glow', params: { offsetX: 0, offsetY: 0, blur: 28, color: '#ffffff', opacity: 0.85 } },\n];\n\nexport function shadowParams(p: (typeof SHADOW_PRESETS)[number]['params']): Record<string, unknown> {\n return { offset_x: p.offsetX, offset_y: p.offsetY, blur: p.blur, color: p.color, opacity: p.opacity };\n}\n\nexport type LogoPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'center'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport const LOGO_POSITIONS: readonly LogoPosition[] = [\n 'top-left',\n 'top-center',\n 'top-right',\n 'center',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right',\n];\n\n/** Top-left corner for a box snapped to a position preset, 4% of the width in from the edge (web positionLogo). */\nexport function positionLogo(\n box: { width: number; height: number },\n natural: NaturalSize,\n position: LogoPosition,\n): { x: number; y: number } {\n const margin = Math.round(natural.width * 0.04);\n const [vertical, horizontal] = position === 'center' ? ['center', 'center'] : position.split('-');\n const x =\n horizontal === 'left'\n ? margin\n : horizontal === 'right'\n ? natural.width - box.width - margin\n : (natural.width - box.width) / 2;\n const y =\n vertical === 'top'\n ? margin\n : vertical === 'bottom'\n ? natural.height - box.height - margin\n : (natural.height - box.height) / 2;\n return { x: Math.round(Math.max(0, x)), y: Math.round(Math.max(0, y)) };\n}\n\n/** A logo `percent` of the picture's width, at a position, as `compose` params. */\nexport function logoComposeParams(opts: {\n logoUrl: string;\n logoAspect: number;\n natural: NaturalSize;\n percent: number;\n position: LogoPosition;\n opacity: number;\n}): Record<string, unknown> {\n const width = Math.max(1, Math.round((opts.natural.width * opts.percent) / 100));\n const height = Math.max(1, Math.round(width / (opts.logoAspect > 0 ? opts.logoAspect : 1)));\n const { x, y } = positionLogo({ width, height }, opts.natural, opts.position);\n return {\n overlay_url: opts.logoUrl,\n x: String(x),\n y: String(y),\n scale: `${width}:${height}`,\n opacity: opts.opacity,\n };\n}\n\nexport const COLORSPACE_TARGETS = ['srgb', 'bt709', 'bt601', 'bt2020', 'display-p3'] as const;\nexport const EXPORT_FORMATS = ['png', 'jpeg', 'webp', 'avif'] as const;\nexport type ExportFormat = (typeof EXPORT_FORMATS)[number];\n\nexport function convertParams(format: ExportFormat, quality: number): Record<string, unknown> {\n return { format, ...(format !== 'png' ? { quality } : {}) };\n}\n"],"names":["dots","k"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeViewerRegistry.js","sources":["../../../src/features/canvas/nativeViewerRegistry.ts"],"sourcesContent":["/**\n * Seam between the app shell and this package for the FEDERATED canvas viewer.\n *\n * The federated loader (`import('canvas_native/Viewer')`) must live in the app\n * (portable-devices/mobile): this package also builds through rollup for lib/,\n * and rollup must never see a bare `canvas_native/...` specifier. The screen,\n * however, lives HERE, where routes register. So the app injects its loader at\n * startup and the screen reads it back - the same inversion the surfaces use\n * for host services, scaled down to one component.\n */\nimport type { ComponentType } from 'react';\nimport type { NativeCanvasViewerProps } from './NativeCanvasViewer';\n\nlet registered: ComponentType<NativeCanvasViewerProps> | null = null;\n\nexport function registerNativeCanvasViewer(component: ComponentType<NativeCanvasViewerProps>): void {\n registered = component;\n}\n\n/** Null when the host app has not injected a loader (e.g. a build without federation). */\nexport function getNativeCanvasViewer(): ComponentType<NativeCanvasViewerProps> | null {\n return registered;\n}\n\n/**\n * The federated canvas EXPERIENCE (boards + viewer), registered by the app the\n * same way the viewer is. Kept as a separate seam so a host that only wants the\n * raw renderer - a preview, a test - is unaffected.\n */\nexport type CanvasExperienceComponent = ComponentType<{\n token?: string | null;\n indexUrl: string;\n channelId?: string;\n sessionError?: string | null;\n onRetrySession?: () => void;\n /** Deep links (CanvasExperienceProps): each runs once on mount. */\n createTile?: string;\n media?: { src: string; kind?: string; name?: string };\n designId?: string;\n designTemplateId?: string;\n artifactId?: string;\n}>;\n\nlet experience: CanvasExperienceComponent | null = null;\nlet experiencePreload: (() => Promise<void>) | null = null;\n\nexport function registerNativeCanvasExperience(component: CanvasExperienceComponent): void {\n experience = component;\n}\n\nexport function getNativeCanvasExperience(): CanvasExperienceComponent | null {\n return experience;\n}\n\n/**\n * Host registers the federated `import('canvas_native/Viewer')` so Home can\n * start the download before the user opens Canvas Native.\n */\nexport function registerCanvasExperiencePreload(fn: () => Promise<void>): void {\n experiencePreload = fn;\n}\n\nexport function preloadNativeCanvasExperience(): Promise<void> {\n return experiencePreload?.() ?? Promise.resolve();\n}\n"],"names":[],"mappings":"AAYA,IAAI,UAA4D,GAAA,IAAA;AACzD,SAAS,2BAA2B,SAAyD,EAAA;AAClG,EAAa,UAAA,GAAA,SAAA;AACf;AAGO,SAAS,qBAAuE,GAAA;AACrF,EAAO,OAAA,UAAA;AACT;
|
|
1
|
+
{"version":3,"file":"nativeViewerRegistry.js","sources":["../../../src/features/canvas/nativeViewerRegistry.ts"],"sourcesContent":["/**\n * Seam between the app shell and this package for the FEDERATED canvas viewer.\n *\n * The federated loader (`import('canvas_native/Viewer')`) must live in the app\n * (portable-devices/mobile): this package also builds through rollup for lib/,\n * and rollup must never see a bare `canvas_native/...` specifier. The screen,\n * however, lives HERE, where routes register. So the app injects its loader at\n * startup and the screen reads it back - the same inversion the surfaces use\n * for host services, scaled down to one component.\n */\nimport type { ComponentType } from 'react';\nimport type { NativeCanvasViewerProps } from './NativeCanvasViewer';\n\nlet registered: ComponentType<NativeCanvasViewerProps> | null = null;\n\nexport function registerNativeCanvasViewer(component: ComponentType<NativeCanvasViewerProps>): void {\n registered = component;\n}\n\n/** Null when the host app has not injected a loader (e.g. a build without federation). */\nexport function getNativeCanvasViewer(): ComponentType<NativeCanvasViewerProps> | null {\n return registered;\n}\n\n/**\n * The federated canvas EXPERIENCE (boards + viewer), registered by the app the\n * same way the viewer is. Kept as a separate seam so a host that only wants the\n * raw renderer - a preview, a test - is unaffected.\n */\nexport type CanvasExperienceComponent = ComponentType<{\n token?: string | null;\n indexUrl: string;\n channelId?: string;\n sessionError?: string | null;\n onRetrySession?: () => void;\n /** Deep links (CanvasExperienceProps): each runs once on mount. */\n createTile?: string;\n media?: { src: string; kind?: string; name?: string };\n designId?: string;\n designTemplateId?: string;\n artifactId?: string;\n /** Open the web canvas in the app on `?<query>` (`design=<id>`, `create=<tile>`). */\n onOpenWebCanvas?: (query: string) => void;\n}>;\n\nlet experience: CanvasExperienceComponent | null = null;\nlet experiencePreload: (() => Promise<void>) | null = null;\n\nexport function registerNativeCanvasExperience(component: CanvasExperienceComponent): void {\n experience = component;\n}\n\nexport function getNativeCanvasExperience(): CanvasExperienceComponent | null {\n return experience;\n}\n\n/**\n * Host registers the federated `import('canvas_native/Viewer')` so Home can\n * start the download before the user opens Canvas Native.\n */\nexport function registerCanvasExperiencePreload(fn: () => Promise<void>): void {\n experiencePreload = fn;\n}\n\nexport function preloadNativeCanvasExperience(): Promise<void> {\n return experiencePreload?.() ?? Promise.resolve();\n}\n"],"names":[],"mappings":"AAYA,IAAI,UAA4D,GAAA,IAAA;AACzD,SAAS,2BAA2B,SAAyD,EAAA;AAClG,EAAa,UAAA,GAAA,SAAA;AACf;AAGO,SAAS,qBAAuE,GAAA;AACrF,EAAO,OAAA,UAAA;AACT;AA0BA,IAAI,UAA+C,GAAA,IAAA;AACnD,IAAI,iBAAkD,GAAA,IAAA;AAC/C,SAAS,+BAA+B,SAA4C,EAAA;AACzF,EAAa,UAAA,GAAA,SAAA;AACf;AACO,SAAS,yBAA8D,GAAA;AAC5E,EAAO,OAAA,UAAA;AACT;AAMO,SAAS,gCAAgC,EAA+B,EAAA;AAC7E,EAAoB,iBAAA,GAAA,EAAA;AACtB;AACO,SAAS,6BAA+C,GAAA;AA9D/D,EAAA,IAAA,EAAA;AA+DE,EAAO,OAAA,CAAA,EAAA,GAAA,iBAAA,IAAA,IAAA,GAAA,MAAA,GAAA,iBAAA,EAAA,KAAA,IAAA,GAAA,EAAA,GAAyB,QAAQ,OAAQ,EAAA;AAClD"}
|