@adminide-stack/yantra-mobile 12.0.128 → 12.0.129-alpha.1
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,397 @@
|
|
|
1
|
+
import {isStrokeShape}from'./shapes.js';import {newPageId,newLayerId,DEFAULT_TEXT_COLOR}from'./types.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
|
+
const COALESCE_MS = 700;
|
|
21
|
+
function initEditorState(doc) {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
return {
|
|
24
|
+
doc,
|
|
25
|
+
pageId: (_b = (_a = doc.pages[0]) == null ? void 0 : _a.id) != null ? _b : "",
|
|
26
|
+
layerId: null,
|
|
27
|
+
past: [],
|
|
28
|
+
future: [],
|
|
29
|
+
lastEdit: null
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function currentPage(state) {
|
|
33
|
+
var _a;
|
|
34
|
+
return (_a = state.doc.pages.find((p) => p.id === state.pageId)) != null ? _a : state.doc.pages[0];
|
|
35
|
+
}
|
|
36
|
+
function selectedLayer(state) {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
if (!state.layerId) return void 0;
|
|
39
|
+
return (_b = (_a = currentPage(state)) == null ? void 0 : _a.layers) == null ? void 0 : _b.find((l) => l.id === state.layerId);
|
|
40
|
+
}
|
|
41
|
+
function mapPage(doc, pageId, fn) {
|
|
42
|
+
return __spreadProps(__spreadValues({}, doc), {
|
|
43
|
+
pages: doc.pages.map((p) => p.id === pageId ? fn(p) : p)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function mapLayers(doc, pageId, fn) {
|
|
47
|
+
return mapPage(doc, pageId, (p) => {
|
|
48
|
+
var _a;
|
|
49
|
+
return __spreadProps(__spreadValues({}, p), {
|
|
50
|
+
layers: fn((_a = p.layers) != null ? _a : [])
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function cloneLayer(layer) {
|
|
55
|
+
const copy = JSON.parse(JSON.stringify(layer));
|
|
56
|
+
return __spreadProps(__spreadValues({}, copy), {
|
|
57
|
+
id: newLayerId()
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function commit(state, doc, extra = {}, coalesce, at = Date.now()) {
|
|
61
|
+
var _a;
|
|
62
|
+
if (doc === state.doc) return __spreadValues(__spreadValues({}, state), extra);
|
|
63
|
+
const joins = coalesce !== void 0 && ((_a = state.lastEdit) == null ? void 0 : _a.key) === coalesce && at - state.lastEdit.at <= COALESCE_MS && state.past.length > 0;
|
|
64
|
+
const past = joins ? state.past : [...state.past, state.doc].slice(-60);
|
|
65
|
+
return __spreadProps(__spreadValues(__spreadValues({}, state), extra), {
|
|
66
|
+
doc,
|
|
67
|
+
past,
|
|
68
|
+
future: [],
|
|
69
|
+
lastEdit: coalesce !== void 0 ? {
|
|
70
|
+
key: coalesce,
|
|
71
|
+
at
|
|
72
|
+
} : null
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function editorReducer(state, action) {
|
|
76
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
|
|
77
|
+
const {
|
|
78
|
+
doc
|
|
79
|
+
} = state;
|
|
80
|
+
switch (action.type) {
|
|
81
|
+
case "select": {
|
|
82
|
+
const pageId = (_a = action.pageId) != null ? _a : state.pageId;
|
|
83
|
+
return __spreadProps(__spreadValues({}, state), {
|
|
84
|
+
pageId,
|
|
85
|
+
layerId: action.layerId,
|
|
86
|
+
lastEdit: null
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
case "patchLayer": {
|
|
90
|
+
const next = mapLayers(doc, action.pageId, (layers) => layers.map((l) => l.id === action.layerId ? __spreadValues(__spreadValues({}, l), action.patch) : l));
|
|
91
|
+
if (action.silent) return __spreadProps(__spreadValues({}, state), {
|
|
92
|
+
doc: next
|
|
93
|
+
});
|
|
94
|
+
return commit(state, next, {}, (_b = action.coalesce) != null ? _b : `layer:${action.layerId}`, action.at);
|
|
95
|
+
}
|
|
96
|
+
case "addLayer":
|
|
97
|
+
return commit(state, mapLayers(doc, action.pageId, (layers) => [...layers, action.layer]), {
|
|
98
|
+
pageId: action.pageId,
|
|
99
|
+
layerId: action.layer.id
|
|
100
|
+
});
|
|
101
|
+
case "deleteLayer": {
|
|
102
|
+
const layer = (_d = (_c = doc.pages.find((p) => p.id === action.pageId)) == null ? void 0 : _c.layers) == null ? void 0 : _d.find((l) => l.id === action.layerId);
|
|
103
|
+
if (!layer || layer.locked) return state;
|
|
104
|
+
const next = mapLayers(doc, action.pageId, (layers) => layers.filter((l) => l.id !== action.layerId));
|
|
105
|
+
return commit(state, next, {
|
|
106
|
+
layerId: state.layerId === action.layerId ? null : state.layerId
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
case "duplicateLayer": {
|
|
110
|
+
const layers = (_f = (_e = doc.pages.find((p) => p.id === action.pageId)) == null ? void 0 : _e.layers) != null ? _f : [];
|
|
111
|
+
const index = layers.findIndex((l) => l.id === action.layerId);
|
|
112
|
+
if (index < 0) return state;
|
|
113
|
+
const source = layers[index];
|
|
114
|
+
const copy = __spreadProps(__spreadValues({}, cloneLayer(source)), {
|
|
115
|
+
x: Math.min(1 - source.w, source.x + 0.03),
|
|
116
|
+
y: Math.min(1 - source.h, source.y + 0.03),
|
|
117
|
+
locked: void 0
|
|
118
|
+
});
|
|
119
|
+
const next = mapLayers(doc, action.pageId, (all) => [...all.slice(0, index + 1), copy, ...all.slice(index + 1)]);
|
|
120
|
+
return commit(state, next, {
|
|
121
|
+
layerId: copy.id
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
case "reorderLayer": {
|
|
125
|
+
const layers = (_h = (_g = doc.pages.find((p) => p.id === action.pageId)) == null ? void 0 : _g.layers) != null ? _h : [];
|
|
126
|
+
const index = layers.findIndex((l) => l.id === action.layerId);
|
|
127
|
+
if (index < 0) return state;
|
|
128
|
+
const target = action.move === "front" ? layers.length - 1 : action.move === "back" ? 0 : action.move === "forward" ? Math.min(layers.length - 1, index + 1) : Math.max(0, index - 1);
|
|
129
|
+
if (target === index) return state;
|
|
130
|
+
const reordered = [...layers];
|
|
131
|
+
const [moved] = reordered.splice(index, 1);
|
|
132
|
+
reordered.splice(target, 0, moved);
|
|
133
|
+
return commit(state, mapLayers(doc, action.pageId, () => reordered));
|
|
134
|
+
}
|
|
135
|
+
case "setBackground":
|
|
136
|
+
return commit(state, mapPage(doc, action.pageId, (p) => __spreadProps(__spreadValues({}, p), {
|
|
137
|
+
background: action.background
|
|
138
|
+
})), {}, action.coalesce, action.at);
|
|
139
|
+
case "addPage": {
|
|
140
|
+
const page = {
|
|
141
|
+
id: newPageId(),
|
|
142
|
+
name: "",
|
|
143
|
+
prompt: "",
|
|
144
|
+
src: null,
|
|
145
|
+
status: "ready",
|
|
146
|
+
role: "content",
|
|
147
|
+
// A blank white sheet, like web's Add page.
|
|
148
|
+
background: {
|
|
149
|
+
kind: "color",
|
|
150
|
+
color: "#ffffff"
|
|
151
|
+
},
|
|
152
|
+
layers: []
|
|
153
|
+
};
|
|
154
|
+
return insertPagesInto(state, [page], action.afterId);
|
|
155
|
+
}
|
|
156
|
+
case "insertPages":
|
|
157
|
+
return action.pages.length ? insertPagesInto(state, action.pages, action.afterId) : state;
|
|
158
|
+
case "duplicatePage": {
|
|
159
|
+
const index = doc.pages.findIndex((p) => p.id === action.pageId);
|
|
160
|
+
if (index < 0) return state;
|
|
161
|
+
const source = doc.pages[index];
|
|
162
|
+
const page = __spreadProps(__spreadValues({}, source), {
|
|
163
|
+
id: newPageId(),
|
|
164
|
+
layers: (_i = source.layers) == null ? void 0 : _i.map(cloneLayer)
|
|
165
|
+
});
|
|
166
|
+
const pages = [...doc.pages];
|
|
167
|
+
pages.splice(index + 1, 0, page);
|
|
168
|
+
return commit(state, __spreadProps(__spreadValues({}, doc), {
|
|
169
|
+
pages
|
|
170
|
+
}), {
|
|
171
|
+
pageId: page.id,
|
|
172
|
+
layerId: null
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
case "deletePage": {
|
|
176
|
+
if (doc.pages.length <= 1) return state;
|
|
177
|
+
const index = doc.pages.findIndex((p) => p.id === action.pageId);
|
|
178
|
+
if (index < 0) return state;
|
|
179
|
+
const pages = doc.pages.filter((p) => p.id !== action.pageId);
|
|
180
|
+
const pageId = state.pageId === action.pageId ? pages[Math.min(index, pages.length - 1)].id : state.pageId;
|
|
181
|
+
return commit(state, __spreadProps(__spreadValues({}, doc), {
|
|
182
|
+
pages
|
|
183
|
+
}), {
|
|
184
|
+
pageId,
|
|
185
|
+
layerId: null
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
case "movePage": {
|
|
189
|
+
const index = doc.pages.findIndex((p) => p.id === action.pageId);
|
|
190
|
+
const target = index + action.dir;
|
|
191
|
+
if (index < 0 || target < 0 || target >= doc.pages.length) return state;
|
|
192
|
+
const pages = [...doc.pages];
|
|
193
|
+
[pages[index], pages[target]] = [pages[target], pages[index]];
|
|
194
|
+
return commit(state, __spreadProps(__spreadValues({}, doc), {
|
|
195
|
+
pages
|
|
196
|
+
}));
|
|
197
|
+
}
|
|
198
|
+
case "movePageTo": {
|
|
199
|
+
const from = doc.pages.findIndex((p) => p.id === action.pageId);
|
|
200
|
+
const to = Math.max(0, Math.min(doc.pages.length - 1, Math.round(action.index)));
|
|
201
|
+
if (from < 0 || from === to) return state;
|
|
202
|
+
const pages = [...doc.pages];
|
|
203
|
+
const [moved] = pages.splice(from, 1);
|
|
204
|
+
pages.splice(to, 0, moved);
|
|
205
|
+
return commit(state, __spreadProps(__spreadValues({}, doc), {
|
|
206
|
+
pages
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
case "replacePage": {
|
|
210
|
+
if (!doc.pages.some((p) => p.id === action.page.id)) return state;
|
|
211
|
+
const next = mapPage(doc, action.page.id, () => action.page);
|
|
212
|
+
if (action.silent) return __spreadProps(__spreadValues({}, state), {
|
|
213
|
+
doc: next
|
|
214
|
+
});
|
|
215
|
+
return commit(state, next, {
|
|
216
|
+
layerId: null
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
case "patchDoc":
|
|
220
|
+
return commit(state, __spreadValues(__spreadValues({}, doc), action.patch), {}, action.coalesce, action.at);
|
|
221
|
+
case "replaceDoc":
|
|
222
|
+
return commit(state, action.doc, {
|
|
223
|
+
pageId: (_k = (_j = action.doc.pages[0]) == null ? void 0 : _j.id) != null ? _k : "",
|
|
224
|
+
layerId: null
|
|
225
|
+
});
|
|
226
|
+
case "undo": {
|
|
227
|
+
const prev = state.past[state.past.length - 1];
|
|
228
|
+
if (!prev) return state;
|
|
229
|
+
return __spreadProps(__spreadValues({}, state), {
|
|
230
|
+
doc: prev,
|
|
231
|
+
past: state.past.slice(0, -1),
|
|
232
|
+
future: [state.doc, ...state.future],
|
|
233
|
+
pageId: prev.pages.some((p) => p.id === state.pageId) ? state.pageId : (_m = (_l = prev.pages[0]) == null ? void 0 : _l.id) != null ? _m : "",
|
|
234
|
+
layerId: null,
|
|
235
|
+
lastEdit: null
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
case "redo": {
|
|
239
|
+
const next = state.future[0];
|
|
240
|
+
if (!next) return state;
|
|
241
|
+
return __spreadProps(__spreadValues({}, state), {
|
|
242
|
+
doc: next,
|
|
243
|
+
past: [...state.past, state.doc],
|
|
244
|
+
future: state.future.slice(1),
|
|
245
|
+
pageId: next.pages.some((p) => p.id === state.pageId) ? state.pageId : (_o = (_n = next.pages[0]) == null ? void 0 : _n.id) != null ? _o : "",
|
|
246
|
+
layerId: null,
|
|
247
|
+
lastEdit: null
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
default:
|
|
251
|
+
return state;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
function insertPagesInto(state, pages, afterId) {
|
|
255
|
+
const {
|
|
256
|
+
doc
|
|
257
|
+
} = state;
|
|
258
|
+
const index = afterId ? doc.pages.findIndex((p) => p.id === afterId) : -1;
|
|
259
|
+
const at = index >= 0 ? index + 1 : doc.pages.length;
|
|
260
|
+
const next = [...doc.pages];
|
|
261
|
+
next.splice(at, 0, ...pages);
|
|
262
|
+
return commit(state, __spreadProps(__spreadValues({}, doc), {
|
|
263
|
+
pages: next
|
|
264
|
+
}), {
|
|
265
|
+
pageId: pages[0].id,
|
|
266
|
+
layerId: null
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
const TEXT_PRESETS = {
|
|
270
|
+
heading: {
|
|
271
|
+
content: "Add a heading",
|
|
272
|
+
fontSizeFrac: 0.09,
|
|
273
|
+
fontWeight: 700,
|
|
274
|
+
fontToken: "display"
|
|
275
|
+
},
|
|
276
|
+
subheading: {
|
|
277
|
+
content: "Add a subheading",
|
|
278
|
+
fontSizeFrac: 0.055,
|
|
279
|
+
fontWeight: 600,
|
|
280
|
+
fontToken: "display"
|
|
281
|
+
},
|
|
282
|
+
body: {
|
|
283
|
+
content: "Add a little bit of body text",
|
|
284
|
+
fontSizeFrac: 0.03,
|
|
285
|
+
fontWeight: 400,
|
|
286
|
+
fontToken: "body"
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
function makeTextBox() {
|
|
290
|
+
return __spreadProps(__spreadValues({}, makeTextLayer("body")), {
|
|
291
|
+
content: "Your text here",
|
|
292
|
+
fontSizeFrac: 0.04
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
function makeStickerLayer(emoji, pageW, pageH) {
|
|
296
|
+
const w = 0.28;
|
|
297
|
+
const h = w * pageW / pageH;
|
|
298
|
+
return __spreadProps(__spreadValues({}, makeTextLayer("body")), {
|
|
299
|
+
content: emoji,
|
|
300
|
+
x: (1 - w) / 2,
|
|
301
|
+
y: (1 - h) / 2,
|
|
302
|
+
w,
|
|
303
|
+
h,
|
|
304
|
+
fontSizeFrac: w * 0.8,
|
|
305
|
+
align: "center",
|
|
306
|
+
lineHeight: 1.1
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
function makeTextLayer(preset) {
|
|
310
|
+
const p = TEXT_PRESETS[preset];
|
|
311
|
+
return {
|
|
312
|
+
id: newLayerId(),
|
|
313
|
+
kind: "text",
|
|
314
|
+
content: p.content,
|
|
315
|
+
x: 0.1,
|
|
316
|
+
y: 0.4,
|
|
317
|
+
w: 0.8,
|
|
318
|
+
h: 0.12,
|
|
319
|
+
fontToken: p.fontToken,
|
|
320
|
+
fontWeight: p.fontWeight,
|
|
321
|
+
fontSizeFrac: p.fontSizeFrac,
|
|
322
|
+
color: DEFAULT_TEXT_COLOR,
|
|
323
|
+
align: "left",
|
|
324
|
+
lineHeight: 1.2
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
function makeShapeLayer(shape, palette) {
|
|
328
|
+
var _a;
|
|
329
|
+
const isLine = isStrokeShape(shape);
|
|
330
|
+
return __spreadValues({
|
|
331
|
+
id: newLayerId(),
|
|
332
|
+
kind: "shape",
|
|
333
|
+
shape,
|
|
334
|
+
x: 0.2,
|
|
335
|
+
y: 0.4,
|
|
336
|
+
w: isLine ? 0.5 : 0.3,
|
|
337
|
+
h: isLine ? 0.05 : 0.3,
|
|
338
|
+
fill: (_a = palette == null ? void 0 : palette.primary) != null ? _a : "#38bdf8",
|
|
339
|
+
radiusFrac: shape === "rect" ? 0.08 : 0,
|
|
340
|
+
opacity: 1
|
|
341
|
+
}, isLine ? {
|
|
342
|
+
strokeWidthFrac: 8e-3
|
|
343
|
+
} : {});
|
|
344
|
+
}
|
|
345
|
+
const CHART_SAMPLE = {
|
|
346
|
+
categories: ["Jan", "Feb", "Mar"],
|
|
347
|
+
series: [{
|
|
348
|
+
name: "Desktop",
|
|
349
|
+
values: [4e3, 3200, 2200]
|
|
350
|
+
}, {
|
|
351
|
+
name: "Mobile",
|
|
352
|
+
values: [2500, 1700, 1200]
|
|
353
|
+
}]
|
|
354
|
+
};
|
|
355
|
+
function makeChartLayer(chart, palette) {
|
|
356
|
+
var _a, _b;
|
|
357
|
+
return {
|
|
358
|
+
id: newLayerId(),
|
|
359
|
+
kind: "chart",
|
|
360
|
+
chart,
|
|
361
|
+
x: 0.15,
|
|
362
|
+
y: 0.3,
|
|
363
|
+
w: 0.7,
|
|
364
|
+
h: 0.45,
|
|
365
|
+
categories: [...CHART_SAMPLE.categories],
|
|
366
|
+
series: CHART_SAMPLE.series.map((s) => ({
|
|
367
|
+
name: s.name,
|
|
368
|
+
values: [...s.values]
|
|
369
|
+
})),
|
|
370
|
+
// The legacy single-series mirror a connector without `series` still reads.
|
|
371
|
+
data: CHART_SAMPLE.categories.map((label, i) => ({
|
|
372
|
+
label,
|
|
373
|
+
value: CHART_SAMPLE.series[0].values[i]
|
|
374
|
+
})),
|
|
375
|
+
colors: [(_a = palette == null ? void 0 : palette.primary) != null ? _a : "#38bdf8", (_b = palette == null ? void 0 : palette.muted) != null ? _b : "#818cf8", "#f472b6", "#fbbf24"],
|
|
376
|
+
opacity: 1
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
function makeImageLayer(src, pageW, pageH, size) {
|
|
380
|
+
const imgW = size && size.width > 0 ? size.width : 1;
|
|
381
|
+
const imgH = size && size.height > 0 ? size.height : 1;
|
|
382
|
+
const scale = 0.5 * Math.min(pageW / imgW, pageH / imgH);
|
|
383
|
+
const w = imgW * scale / pageW;
|
|
384
|
+
const h = imgH * scale / pageH;
|
|
385
|
+
return {
|
|
386
|
+
id: newLayerId(),
|
|
387
|
+
kind: "image",
|
|
388
|
+
prompt: "",
|
|
389
|
+
src,
|
|
390
|
+
imageStatus: "ready",
|
|
391
|
+
uploaded: true,
|
|
392
|
+
x: (1 - w) / 2,
|
|
393
|
+
y: (1 - h) / 2,
|
|
394
|
+
w,
|
|
395
|
+
h
|
|
396
|
+
};
|
|
397
|
+
}export{COALESCE_MS,TEXT_PRESETS,currentPage,editorReducer,initEditorState,makeChartLayer,makeImageLayer,makeShapeLayer,makeStickerLayer,makeTextBox,makeTextLayer,selectedLayer};//# sourceMappingURL=docOps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docOps.js","sources":["../../../../src/features/design/doc/docOps.ts"],"sourcesContent":["/**\n * The editor's document state and every edit it makes - native twin of the\n * reducer in canvas-surface `editors/carousel-editor/state.tsx`.\n *\n * One reducer, so undo is one stack: every action that changes the document\n * pushes the previous one, except a burst of the same edit (a drag, typing,\n * a slider) which coalesces into the step that started it - one undo puts a\n * dragged layer back where the drag began, not one frame earlier.\n *\n * Layer factories carry the web's defaults (TEXT_PRESETS, makeShapeLayer,\n * makeChartLayer), so a heading added on the phone matches one added on web.\n *\n * Pure: runs under jest as-is.\n */\nimport { isStrokeShape, type ShapeKind } from './shapes';\nimport {\n DEFAULT_TEXT_COLOR,\n newLayerId,\n newPageId,\n type ChartKind,\n type ChartLayer,\n type DesignDoc,\n type DesignPage,\n type EditorLayer,\n type ImageLayer,\n type PageBackground,\n type ShapeLayer,\n type TextLayer,\n} from './types';\n\n/** Undo keeps this many steps; a long session must not hold every keystroke's document. */\nexport const HISTORY_LIMIT = 60;\n/** Edits with the same key this close together are one undo step. */\nexport const COALESCE_MS = 700;\n\nexport interface EditorState {\n doc: DesignDoc;\n pageId: string;\n layerId: string | null;\n past: DesignDoc[];\n future: DesignDoc[];\n /** The last coalescing edit: its key and when it landed. */\n lastEdit: { key: string; at: number } | null;\n}\n\nexport type LayerOrderMove = 'forward' | 'backward' | 'front' | 'back';\n\nexport type EditorAction =\n | { type: 'select'; pageId?: string; layerId: string | null }\n | {\n type: 'patchLayer';\n pageId: string;\n layerId: string;\n patch: Partial<EditorLayer>;\n coalesce?: string;\n at?: number;\n /** Not an undo step: an upload swapping its hosted URL in for the local pick. */\n silent?: boolean;\n }\n | { type: 'addLayer'; pageId: string; layer: EditorLayer }\n | { type: 'deleteLayer'; pageId: string; layerId: string }\n | { type: 'duplicateLayer'; pageId: string; layerId: string }\n | { type: 'reorderLayer'; pageId: string; layerId: string; move: LayerOrderMove }\n | { type: 'setBackground'; pageId: string; background: PageBackground; coalesce?: string; at?: number }\n | { type: 'addPage'; afterId?: string }\n | { type: 'insertPages'; afterId?: string; pages: DesignPage[] }\n | { type: 'duplicatePage'; pageId: string }\n | { type: 'deletePage'; pageId: string }\n | { type: 'movePage'; pageId: string; dir: -1 | 1 }\n /** A page dragged to a new place in the rail (web PageRail drag). */\n | { type: 'movePageTo'; pageId: string; index: number }\n /** One page's content swapped whole (an AI edit); `silent` for a picture landing after it. */\n | { type: 'replacePage'; page: DesignPage; silent?: boolean }\n | { type: 'patchDoc'; patch: Partial<DesignDoc>; coalesce?: string; at?: number }\n | { type: 'replaceDoc'; doc: DesignDoc }\n | { type: 'undo' }\n | { type: 'redo' };\n\nexport function initEditorState(doc: DesignDoc): EditorState {\n return { doc, pageId: doc.pages[0]?.id ?? '', layerId: null, past: [], future: [], lastEdit: null };\n}\n\nexport function currentPage(state: Pick<EditorState, 'doc' | 'pageId'>): DesignPage | undefined {\n return state.doc.pages.find((p) => p.id === state.pageId) ?? state.doc.pages[0];\n}\n\nexport function selectedLayer(state: Pick<EditorState, 'doc' | 'pageId' | 'layerId'>): EditorLayer | undefined {\n if (!state.layerId) return undefined;\n return currentPage(state)?.layers?.find((l) => l.id === state.layerId);\n}\n\nfunction mapPage(doc: DesignDoc, pageId: string, fn: (page: DesignPage) => DesignPage): DesignDoc {\n return { ...doc, pages: doc.pages.map((p) => (p.id === pageId ? fn(p) : p)) };\n}\n\nfunction mapLayers(doc: DesignDoc, pageId: string, fn: (layers: EditorLayer[]) => EditorLayer[]): DesignDoc {\n return mapPage(doc, pageId, (p) => ({ ...p, layers: fn(p.layers ?? []) }));\n}\n\n/** A layer copy with fresh ids, nested chart arrays cloned so the two never share one. */\nfunction cloneLayer(layer: EditorLayer): EditorLayer {\n const copy = JSON.parse(JSON.stringify(layer)) as EditorLayer;\n return { ...copy, id: newLayerId() };\n}\n\n/**\n * Commit `doc` as the next document. `coalesce` joins it to the step before\n * when that step had the same key and landed within COALESCE_MS.\n */\nfunction commit(\n state: EditorState,\n doc: DesignDoc,\n extra: Partial<EditorState> = {},\n coalesce?: string,\n at: number = Date.now(),\n): EditorState {\n if (doc === state.doc) return { ...state, ...extra };\n const joins =\n coalesce !== undefined &&\n state.lastEdit?.key === coalesce &&\n at - state.lastEdit.at <= COALESCE_MS &&\n state.past.length > 0;\n const past = joins ? state.past : [...state.past, state.doc].slice(-HISTORY_LIMIT);\n return {\n ...state,\n ...extra,\n doc,\n past,\n future: [],\n lastEdit: coalesce !== undefined ? { key: coalesce, at } : null,\n };\n}\n\nexport function editorReducer(state: EditorState, action: EditorAction): EditorState {\n const { doc } = state;\n switch (action.type) {\n case 'select': {\n const pageId = action.pageId ?? state.pageId;\n return { ...state, pageId, layerId: action.layerId, lastEdit: null };\n }\n case 'patchLayer': {\n const next = mapLayers(doc, action.pageId, (layers) =>\n layers.map((l) => (l.id === action.layerId ? ({ ...l, ...action.patch } as EditorLayer) : l)),\n );\n if (action.silent) return { ...state, doc: next };\n return commit(state, next, {}, action.coalesce ?? `layer:${action.layerId}`, action.at);\n }\n case 'addLayer':\n return commit(\n state,\n mapLayers(doc, action.pageId, (layers) => [...layers, action.layer]),\n {\n pageId: action.pageId,\n layerId: action.layer.id,\n },\n );\n case 'deleteLayer': {\n const layer = doc.pages.find((p) => p.id === action.pageId)?.layers?.find((l) => l.id === action.layerId);\n if (!layer || layer.locked) return state;\n const next = mapLayers(doc, action.pageId, (layers) => layers.filter((l) => l.id !== action.layerId));\n return commit(state, next, { layerId: state.layerId === action.layerId ? null : state.layerId });\n }\n case 'duplicateLayer': {\n const layers = doc.pages.find((p) => p.id === action.pageId)?.layers ?? [];\n const index = layers.findIndex((l) => l.id === action.layerId);\n if (index < 0) return state;\n const source = layers[index];\n // Nudged down-right like web's Duplicate, kept on the page.\n const copy = {\n ...cloneLayer(source),\n x: Math.min(1 - source.w, source.x + 0.03),\n y: Math.min(1 - source.h, source.y + 0.03),\n locked: undefined,\n } as EditorLayer;\n const next = mapLayers(doc, action.pageId, (all) => [\n ...all.slice(0, index + 1),\n copy,\n ...all.slice(index + 1),\n ]);\n return commit(state, next, { layerId: copy.id });\n }\n case 'reorderLayer': {\n const layers = doc.pages.find((p) => p.id === action.pageId)?.layers ?? [];\n const index = layers.findIndex((l) => l.id === action.layerId);\n if (index < 0) return state;\n const target =\n action.move === 'front'\n ? layers.length - 1\n : action.move === 'back'\n ? 0\n : action.move === 'forward'\n ? Math.min(layers.length - 1, index + 1)\n : Math.max(0, index - 1);\n if (target === index) return state;\n const reordered = [...layers];\n const [moved] = reordered.splice(index, 1);\n reordered.splice(target, 0, moved);\n return commit(\n state,\n mapLayers(doc, action.pageId, () => reordered),\n );\n }\n case 'setBackground':\n return commit(\n state,\n mapPage(doc, action.pageId, (p) => ({ ...p, background: action.background })),\n {},\n action.coalesce,\n action.at,\n );\n case 'addPage': {\n const page: DesignPage = {\n id: newPageId(),\n name: '',\n prompt: '',\n src: null,\n status: 'ready',\n role: 'content',\n // A blank white sheet, like web's Add page.\n background: { kind: 'color', color: '#ffffff' },\n layers: [],\n };\n return insertPagesInto(state, [page], action.afterId);\n }\n case 'insertPages':\n return action.pages.length ? insertPagesInto(state, action.pages, action.afterId) : state;\n case 'duplicatePage': {\n const index = doc.pages.findIndex((p) => p.id === action.pageId);\n if (index < 0) return state;\n const source = doc.pages[index];\n const page: DesignPage = { ...source, id: newPageId(), layers: source.layers?.map(cloneLayer) };\n const pages = [...doc.pages];\n pages.splice(index + 1, 0, page);\n return commit(state, { ...doc, pages }, { pageId: page.id, layerId: null });\n }\n case 'deletePage': {\n if (doc.pages.length <= 1) return state;\n const index = doc.pages.findIndex((p) => p.id === action.pageId);\n if (index < 0) return state;\n const pages = doc.pages.filter((p) => p.id !== action.pageId);\n const pageId = state.pageId === action.pageId ? pages[Math.min(index, pages.length - 1)].id : state.pageId;\n return commit(state, { ...doc, pages }, { pageId, layerId: null });\n }\n case 'movePage': {\n const index = doc.pages.findIndex((p) => p.id === action.pageId);\n const target = index + action.dir;\n if (index < 0 || target < 0 || target >= doc.pages.length) return state;\n const pages = [...doc.pages];\n [pages[index], pages[target]] = [pages[target], pages[index]];\n return commit(state, { ...doc, pages });\n }\n case 'movePageTo': {\n const from = doc.pages.findIndex((p) => p.id === action.pageId);\n const to = Math.max(0, Math.min(doc.pages.length - 1, Math.round(action.index)));\n if (from < 0 || from === to) return state;\n const pages = [...doc.pages];\n const [moved] = pages.splice(from, 1);\n pages.splice(to, 0, moved);\n return commit(state, { ...doc, pages });\n }\n case 'replacePage': {\n if (!doc.pages.some((p) => p.id === action.page.id)) return state;\n const next = mapPage(doc, action.page.id, () => action.page);\n if (action.silent) return { ...state, doc: next };\n return commit(state, next, { layerId: null });\n }\n case 'patchDoc':\n return commit(state, { ...doc, ...action.patch }, {}, action.coalesce, action.at);\n case 'replaceDoc':\n return commit(state, action.doc, { pageId: action.doc.pages[0]?.id ?? '', layerId: null });\n case 'undo': {\n const prev = state.past[state.past.length - 1];\n if (!prev) return state;\n return {\n ...state,\n doc: prev,\n past: state.past.slice(0, -1),\n future: [state.doc, ...state.future],\n pageId: prev.pages.some((p) => p.id === state.pageId) ? state.pageId : (prev.pages[0]?.id ?? ''),\n layerId: null,\n lastEdit: null,\n };\n }\n case 'redo': {\n const next = state.future[0];\n if (!next) return state;\n return {\n ...state,\n doc: next,\n past: [...state.past, state.doc],\n future: state.future.slice(1),\n pageId: next.pages.some((p) => p.id === state.pageId) ? state.pageId : (next.pages[0]?.id ?? ''),\n layerId: null,\n lastEdit: null,\n };\n }\n default:\n return state;\n }\n}\n\nfunction insertPagesInto(state: EditorState, pages: DesignPage[], afterId?: string): EditorState {\n const { doc } = state;\n const index = afterId ? doc.pages.findIndex((p) => p.id === afterId) : -1;\n const at = index >= 0 ? index + 1 : doc.pages.length;\n const next = [...doc.pages];\n next.splice(at, 0, ...pages);\n return commit(state, { ...doc, pages: next }, { pageId: pages[0].id, layerId: null });\n}\n\n// ── Layer factories (web state.tsx defaults) ─────────────────────────────\n\nexport type TextPreset = 'heading' | 'subheading' | 'body';\n\n/** Preset text layers offered in the Text tool (Canva-style heading/subheading/body). */\nexport const TEXT_PRESETS: Record<\n TextPreset,\n { content: string; fontSizeFrac: number; fontWeight: number; fontToken: 'display' | 'body' }\n> = {\n heading: { content: 'Add a heading', fontSizeFrac: 0.09, fontWeight: 700, fontToken: 'display' },\n subheading: { content: 'Add a subheading', fontSizeFrac: 0.055, fontWeight: 600, fontToken: 'display' },\n body: { content: 'Add a little bit of body text', fontSizeFrac: 0.03, fontWeight: 400, fontToken: 'body' },\n};\n\n/** Web \"Add a text box\": a plain body-size box ready to type into. */\nexport function makeTextBox(): TextLayer {\n return { ...makeTextLayer('body'), content: 'Your text here', fontSizeFrac: 0.04 };\n}\n\n/** An emoji sticker (web Graphics): a big centred glyph, as text so it draws everywhere without a hosted picture. */\nexport function makeStickerLayer(emoji: string, pageW: number, pageH: number): TextLayer {\n const w = 0.28;\n const h = (w * pageW) / pageH;\n return {\n ...makeTextLayer('body'),\n content: emoji,\n x: (1 - w) / 2,\n y: (1 - h) / 2,\n w,\n h,\n fontSizeFrac: w * 0.8,\n align: 'center',\n lineHeight: 1.1,\n };\n}\n\nexport function makeTextLayer(preset: TextPreset): TextLayer {\n const p = TEXT_PRESETS[preset];\n return {\n id: newLayerId(),\n kind: 'text',\n content: p.content,\n x: 0.1,\n y: 0.4,\n w: 0.8,\n h: 0.12,\n fontToken: p.fontToken,\n fontWeight: p.fontWeight,\n fontSizeFrac: p.fontSizeFrac,\n color: DEFAULT_TEXT_COLOR,\n align: 'left',\n lineHeight: 1.2,\n };\n}\n\nexport function makeShapeLayer(shape: ShapeKind, palette?: DesignDoc['palette']): ShapeLayer {\n const isLine = isStrokeShape(shape);\n return {\n id: newLayerId(),\n kind: 'shape',\n shape,\n x: 0.2,\n y: 0.4,\n w: isLine ? 0.5 : 0.3,\n h: isLine ? 0.05 : 0.3,\n fill: palette?.primary ?? '#38bdf8',\n radiusFrac: shape === 'rect' ? 0.08 : 0,\n opacity: 1,\n ...(isLine ? { strokeWidthFrac: 0.008 } : {}),\n };\n}\n\n/** Two series out of the box, so the legend is self-explanatory on first open (web CHART_SAMPLE). */\nconst CHART_SAMPLE = {\n categories: ['Jan', 'Feb', 'Mar'],\n series: [\n { name: 'Desktop', values: [4000, 3200, 2200] },\n { name: 'Mobile', values: [2500, 1700, 1200] },\n ],\n};\n\nexport function makeChartLayer(chart: ChartKind, palette?: DesignDoc['palette']): ChartLayer {\n return {\n id: newLayerId(),\n kind: 'chart',\n chart,\n x: 0.15,\n y: 0.3,\n w: 0.7,\n h: 0.45,\n categories: [...CHART_SAMPLE.categories],\n series: CHART_SAMPLE.series.map((s) => ({ name: s.name, values: [...s.values] })),\n // The legacy single-series mirror a connector without `series` still reads.\n data: CHART_SAMPLE.categories.map((label, i) => ({ label, value: CHART_SAMPLE.series[0].values[i] })),\n colors: [palette?.primary ?? '#38bdf8', palette?.muted ?? '#818cf8', '#f472b6', '#fbbf24'],\n opacity: 1,\n };\n}\n\n/**\n * A placed picture: its own aspect kept, fitting within half the page each way\n * (web `fitImageBox`), centred. Without a measured size it takes a square.\n */\nexport function makeImageLayer(\n src: string,\n pageW: number,\n pageH: number,\n size?: { width: number; height: number } | null,\n): ImageLayer {\n const imgW = size && size.width > 0 ? size.width : 1;\n const imgH = size && size.height > 0 ? size.height : 1;\n const scale = 0.5 * Math.min(pageW / imgW, pageH / imgH);\n const w = (imgW * scale) / pageW;\n const h = (imgH * scale) / pageH;\n return {\n id: newLayerId(),\n kind: 'image',\n prompt: '',\n src,\n imageStatus: 'ready',\n uploaded: true,\n x: (1 - w) / 2,\n y: (1 - h) / 2,\n w,\n h,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
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
|
+
function isWordChar(ch) {
|
|
21
|
+
if (!ch) return false;
|
|
22
|
+
if (/[0-9_]/.test(ch)) return true;
|
|
23
|
+
if (ch.toLowerCase() !== ch.toUpperCase()) return true;
|
|
24
|
+
return !/[\s!-/:-@[-`{-~ -¿ - -〿]/.test(ch);
|
|
25
|
+
}
|
|
26
|
+
function findInText(text, query, opts) {
|
|
27
|
+
if (!query) return [];
|
|
28
|
+
const hay = opts.matchCase ? text : text.toLowerCase();
|
|
29
|
+
const needle = opts.matchCase ? query : query.toLowerCase();
|
|
30
|
+
const out = [];
|
|
31
|
+
let at = 0;
|
|
32
|
+
while (at <= hay.length - needle.length) {
|
|
33
|
+
const i = hay.indexOf(needle, at);
|
|
34
|
+
if (i < 0) break;
|
|
35
|
+
const end = i + needle.length;
|
|
36
|
+
if (!opts.wholeWord || !isWordChar(text[i - 1]) && !isWordChar(text[end])) {
|
|
37
|
+
out.push({
|
|
38
|
+
start: i,
|
|
39
|
+
end
|
|
40
|
+
});
|
|
41
|
+
at = end;
|
|
42
|
+
} else {
|
|
43
|
+
at = i + 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function findMatches(doc, query, opts) {
|
|
49
|
+
var _a, _b;
|
|
50
|
+
const out = [];
|
|
51
|
+
if (!query) return out;
|
|
52
|
+
for (const page of doc.pages) {
|
|
53
|
+
for (const layer of (_a = page.layers) != null ? _a : []) {
|
|
54
|
+
if (layer.kind !== "text") continue;
|
|
55
|
+
for (const m of findInText((_b = layer.content) != null ? _b : "", query, opts)) {
|
|
56
|
+
out.push({
|
|
57
|
+
pageId: page.id,
|
|
58
|
+
layerId: layer.id,
|
|
59
|
+
start: m.start,
|
|
60
|
+
end: m.end
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
function replaceMatches(content, matches, replacement) {
|
|
68
|
+
let out = content;
|
|
69
|
+
for (const m of [...matches].sort((a, b) => b.start - a.start)) {
|
|
70
|
+
out = out.slice(0, m.start) + replacement + out.slice(m.end);
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function replacementEdits(doc, matches, replacement) {
|
|
75
|
+
var _a, _b, _c;
|
|
76
|
+
const byLayer = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const m of matches) {
|
|
78
|
+
const key = `${m.pageId}\0${m.layerId}`;
|
|
79
|
+
byLayer.set(key, [...(_a = byLayer.get(key)) != null ? _a : [], m]);
|
|
80
|
+
}
|
|
81
|
+
const edits = [];
|
|
82
|
+
for (const [key, ms] of byLayer) {
|
|
83
|
+
const [pageId, layerId] = key.split("\0");
|
|
84
|
+
const layer = (_c = (_b = doc.pages.find((p) => p.id === pageId)) == null ? void 0 : _b.layers) == null ? void 0 : _c.find((l) => l.id === layerId);
|
|
85
|
+
if ((layer == null ? void 0 : layer.kind) !== "text" || layer.locked) continue;
|
|
86
|
+
edits.push({
|
|
87
|
+
pageId,
|
|
88
|
+
layerId,
|
|
89
|
+
content: replaceMatches(layer.content, ms, replacement)
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return edits;
|
|
93
|
+
}
|
|
94
|
+
function applyReplacements(doc, edits) {
|
|
95
|
+
if (!edits.length) return doc;
|
|
96
|
+
return __spreadProps(__spreadValues({}, doc), {
|
|
97
|
+
pages: doc.pages.map((page) => {
|
|
98
|
+
var _a;
|
|
99
|
+
const mine = edits.filter((e) => e.pageId === page.id);
|
|
100
|
+
if (!mine.length) return page;
|
|
101
|
+
return __spreadProps(__spreadValues({}, page), {
|
|
102
|
+
layers: (_a = page.layers) == null ? void 0 : _a.map((l) => {
|
|
103
|
+
const edit = mine.find((e) => e.layerId === l.id);
|
|
104
|
+
return edit && l.kind === "text" ? __spreadProps(__spreadValues({}, l), {
|
|
105
|
+
content: edit.content,
|
|
106
|
+
runs: void 0
|
|
107
|
+
}) : l;
|
|
108
|
+
})
|
|
109
|
+
});
|
|
110
|
+
})
|
|
111
|
+
});
|
|
112
|
+
}export{applyReplacements,findInText,findMatches,replaceMatches,replacementEdits};//# sourceMappingURL=findReplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findReplace.js","sources":["../../../../src/features/design/doc/findReplace.ts"],"sourcesContent":["/**\n * Find and replace text over every text layer of the design - native twin of\n * canvas-surface `carousel-editor/utils/findReplace.ts`. Matching reads what\n * is stored, not what is drawn, so Uppercase never hides a match.\n *\n * Whole words are checked by hand rather than with a Unicode lookbehind, which\n * not every Hermes build compiles.\n *\n * Pure: runs under jest as-is.\n */\nimport type { DesignDoc, TextLayer } from './types';\n\nexport interface FindOptions {\n matchCase: boolean;\n wholeWord: boolean;\n}\n\nexport interface TextMatch {\n pageId: string;\n layerId: string;\n /** Character offsets into the layer's content. */\n start: number;\n end: number;\n}\n\n/** A letter, digit or underscore in any script: what a word is made of. */\nfunction isWordChar(ch: string | undefined): boolean {\n if (!ch) return false;\n if (/[0-9_]/.test(ch)) return true;\n // A character with case is a letter; scripts without case fall back to \"not punctuation or space\".\n if (ch.toLowerCase() !== ch.toUpperCase()) return true;\n return !/[\\s!-/:-@[-`{-~ -¿ - -〿]/.test(ch);\n}\n\n/** Every occurrence of `query` in `text`, left to right, never overlapping. */\nexport function findInText(text: string, query: string, opts: FindOptions): Array<{ start: number; end: number }> {\n if (!query) return [];\n const hay = opts.matchCase ? text : text.toLowerCase();\n const needle = opts.matchCase ? query : query.toLowerCase();\n const out: Array<{ start: number; end: number }> = [];\n let at = 0;\n while (at <= hay.length - needle.length) {\n const i = hay.indexOf(needle, at);\n if (i < 0) break;\n const end = i + needle.length;\n if (!opts.wholeWord || (!isWordChar(text[i - 1]) && !isWordChar(text[end]))) {\n out.push({ start: i, end });\n at = end;\n } else {\n at = i + 1;\n }\n }\n return out;\n}\n\n/** Every occurrence, in design order: page by page, layer by layer, left to right. */\nexport function findMatches(doc: DesignDoc, query: string, opts: FindOptions): TextMatch[] {\n const out: TextMatch[] = [];\n if (!query) return out;\n for (const page of doc.pages) {\n for (const layer of page.layers ?? []) {\n if (layer.kind !== 'text') continue;\n for (const m of findInText(layer.content ?? '', query, opts)) {\n out.push({ pageId: page.id, layerId: layer.id, start: m.start, end: m.end });\n }\n }\n }\n return out;\n}\n\n/** One layer's content with some of its matches replaced (back to front, so offsets hold). */\nexport function replaceMatches(\n content: string,\n matches: Array<Pick<TextMatch, 'start' | 'end'>>,\n replacement: string,\n): string {\n let out = content;\n for (const m of [...matches].sort((a, b) => b.start - a.start)) {\n out = out.slice(0, m.start) + replacement + out.slice(m.end);\n }\n return out;\n}\n\n/** The new contents for every unlocked layer the matches touch. */\nexport function replacementEdits(\n doc: DesignDoc,\n matches: TextMatch[],\n replacement: string,\n): Array<{ pageId: string; layerId: string; content: string }> {\n const byLayer = new Map<string, TextMatch[]>();\n for (const m of matches) {\n const key = `${m.pageId}\\u0000${m.layerId}`;\n byLayer.set(key, [...(byLayer.get(key) ?? []), m]);\n }\n const edits: Array<{ pageId: string; layerId: string; content: string }> = [];\n for (const [key, ms] of byLayer) {\n const [pageId, layerId] = key.split('\\u0000');\n const layer = doc.pages.find((p) => p.id === pageId)?.layers?.find((l) => l.id === layerId) as\n | TextLayer\n | undefined;\n if (layer?.kind !== 'text' || layer.locked) continue;\n edits.push({ pageId, layerId, content: replaceMatches(layer.content, ms, replacement) });\n }\n return edits;\n}\n\n/** The document with every edit applied (runs are dropped from a layer whose words were replaced). */\nexport function applyReplacements(\n doc: DesignDoc,\n edits: Array<{ pageId: string; layerId: string; content: string }>,\n): DesignDoc {\n if (!edits.length) return doc;\n return {\n ...doc,\n pages: doc.pages.map((page) => {\n const mine = edits.filter((e) => e.pageId === page.id);\n if (!mine.length) return page;\n return {\n ...page,\n layers: page.layers?.map((l) => {\n const edit = mine.find((e) => e.layerId === l.id);\n return edit && l.kind === 'text' ? { ...l, content: edit.content, runs: undefined } : l;\n }),\n };\n }),\n };\n}\n"],"names":[],"mappings":"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"}
|