@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 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 +3 -3
- package/lib/features/design/exportDesign.js +0 -133
- package/lib/features/design/exportDesign.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesignExperience.js","sources":["../../../src/features/design/DesignExperience.tsx"],"sourcesContent":["/**\n * The design studio - templates, saved designs, the editor, and export.\n *\n * Delivery-first architecture, same rules as CanvasExperience: everything\n * here ships OTA inside a federated surface, host seams win when present and\n * the remote builds its own connector/upload seams when they are not\n * (binaries that predate them still get the full studio). Designs persist to\n * the surface index under `surface: design`; export flattens pages through\n * the image connector and can land the results on a canvas board.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, Linking, ScrollView, Share, StyleSheet, Text, View } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Image } from 'expo-image';\nimport { friendlyMediaError } from '../canvas/videoEditor/mediaActions';\nimport type { RunMediaAction } from '../canvas/videoEditor/mediaActions';\nimport { createRemoteRunAction, createRemoteUploadMedia } from '../canvas/videoEditor/remoteMediaClient';\nimport { buildBoardState, frameForUpload, newBoardId, type CanvasItem } from '../canvas/canvasCore';\nimport { fetchMyCanvasBoards, newBoardChannelId, pushCanvasBoard } from '../canvas/surfaceIndex';\nimport { themedStyles, useCanvasTheme, type CanvasPalette } from '../canvas/canvasTheme';\nimport { HIT, Pressable, RADIUS, SectionHeader, Skeleton, SPACE, TYPE, pressedStyle } from '../canvas/canvasUi';\nimport {\n buildDesignState,\n designSignature,\n newDesignChannelId,\n newDesignDoc,\n parseDesignDoc,\n type DesignKind,\n type PersistedDesignDoc,\n} from './designCore';\nimport { defaultTitle, fetchMyDesigns, pushDesignDoc, type DesignDocSummary } from './designIndex';\nimport { deriveBlankPixelUrl, renderDesignDoc } from './exportDesign';\nimport { DesignEditorExperience } from './DesignEditorExperience';\n\nconst SAVE_DEBOUNCE_MS = 2200;\n\nexport interface DesignExperienceProps {\n token?: string | null;\n indexUrl: string;\n /** Open straight into the editor (from the canvas grid); omit for home. */\n entry?: { kind: DesignKind } | { channelId: string };\n /** Back to whoever embedded the studio (canvas grid, host tab). */\n onClose?: () => void;\n onPickLocalMedia?: () => Promise<CanvasItem[]>;\n uploadMedia?: (localUri: string) => Promise<string>;\n runMediaAction?: RunMediaAction;\n testID?: string;\n}\n\ninterface OpenDoc {\n channelId: string;\n doc: PersistedDesignDoc;\n}\n\nexport function DesignExperience({\n token,\n indexUrl,\n entry,\n onClose,\n onPickLocalMedia,\n uploadMedia,\n runMediaAction,\n testID,\n}: DesignExperienceProps) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n // Host seams win (they can refresh auth); otherwise the remote builds its\n // own from what it already holds - same fallback rule as the canvas.\n const effectiveRunAction = useMemo<RunMediaAction | undefined>(\n () => runMediaAction ?? (token && indexUrl ? createRemoteRunAction(token, indexUrl) : undefined),\n [runMediaAction, token, indexUrl],\n );\n const effectiveUploadMedia = useMemo(\n () => uploadMedia ?? (token && indexUrl ? createRemoteUploadMedia(token, indexUrl) : undefined),\n [uploadMedia, token, indexUrl],\n );\n\n const [designs, setDesigns] = useState<DesignDocSummary[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [open, setOpen] = useState<OpenDoc | null>(() =>\n entry && 'kind' in entry ? { channelId: newDesignChannelId(), doc: newDesignDoc(entry.kind) } : null,\n );\n const [canvasImages, setCanvasImages] = useState<string[]>([]);\n const [exporting, setExporting] = useState<{ stage: string; error?: string } | null>(null);\n const [results, setResults] = useState<{\n pages: Array<{ name: string; url: string }>;\n savedToCanvas: boolean;\n } | null>(null);\n const lastSavedRef = useRef<Record<string, string>>({});\n\n // Load the caller's designs (home grid; also resolves an entry channelId).\n useEffect(() => {\n if (!token || !indexUrl) {\n setLoading(false);\n return undefined;\n }\n const controller = new AbortController();\n let cancelled = false;\n setLoading(true);\n void fetchMyDesigns({ url: indexUrl, token, signal: controller.signal }).then((result) => {\n if (cancelled) return;\n setDesigns(result.designs);\n setError(result.error);\n setLoading(false);\n if (entry && 'channelId' in entry) {\n const match = result.designs.find((d) => d.channelId === entry.channelId);\n if (match) setOpen({ channelId: match.channelId, doc: match.doc });\n }\n });\n return () => {\n cancelled = true;\n controller.abort();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [token, indexUrl]);\n\n // Image source for the editor's OTA-safe picker: the user's canvas media.\n useEffect(() => {\n if (!token || !indexUrl || !open) return undefined;\n const controller = new AbortController();\n void fetchMyCanvasBoards({ url: indexUrl, token, signal: controller.signal }).then((result) => {\n const urls: string[] = [];\n for (const board of result.boards) {\n for (const item of board.board.items) {\n if (item.type === 'image' && /^https?:/i.test(item.src)) urls.push(item.src);\n }\n }\n setCanvasImages([...new Set(urls)].slice(0, 24));\n });\n return () => controller.abort();\n }, [token, indexUrl, open?.channelId]);\n\n // Debounced persistence - signature-gated, wholesale metadata replace.\n useEffect(() => {\n if (!open || !token || !indexUrl) return undefined;\n const sig = designSignature(open.doc);\n if (lastSavedRef.current[open.channelId] === sig) return undefined;\n const timer = setTimeout(() => {\n const state = buildDesignState(open.doc);\n void pushDesignDoc({ url: indexUrl, token, channelId: open.channelId, doc: state }).then((ok) => {\n if (ok) lastSavedRef.current[open.channelId] = sig;\n });\n }, SAVE_DEBOUNCE_MS);\n return () => clearTimeout(timer);\n }, [open, token, indexUrl]);\n\n const closeEditor = useCallback(() => {\n setOpen(null);\n setResults(null);\n // Straight-to-editor embeds (canvas grid) return to their owner.\n if (entry) onClose?.();\n else if (token && indexUrl) {\n void fetchMyDesigns({ url: indexUrl, token }).then((r) => setDesigns(r.designs));\n }\n }, [entry, onClose, token, indexUrl]);\n\n const exportBusyRef = useRef(false);\n const handleExport = useCallback(\n (doc: PersistedDesignDoc) => {\n const runAction = effectiveRunAction;\n const blankUrl = deriveBlankPixelUrl(indexUrl);\n if (!runAction || !blankUrl) {\n setExporting({ stage: '', error: 'Export needs a signed-in session.' });\n return;\n }\n if (exportBusyRef.current) return;\n exportBusyRef.current = true;\n setExporting({ stage: 'Starting render' });\n void renderDesignDoc(doc.pages, {\n runAction,\n blankUrl,\n uploadMedia: effectiveUploadMedia,\n onProgress: (p) => setExporting(p),\n })\n .then((urls) => {\n setExporting(null);\n setResults({\n pages: urls.map((url, i) => ({ name: doc.pages[i]?.name ?? `Page ${i + 1}`, url })),\n savedToCanvas: false,\n });\n })\n .catch((err: unknown) => {\n setExporting({ stage: '', error: friendlyMediaError(err, 'design export') });\n })\n .finally(() => {\n exportBusyRef.current = false;\n });\n },\n [effectiveRunAction, effectiveUploadMedia, indexUrl],\n );\n\n // Land the rendered pages on a canvas board so they show up beside the\n // user's other media (and on the web canvas).\n const saveResultsToCanvas = useCallback(async () => {\n if (!results || !token || !indexUrl || !open) return;\n const items: CanvasItem[] = results.pages.map((p, i) => ({\n id: newBoardId(),\n type: 'image',\n src: p.url,\n generatedAssetName: `${open.doc.title || defaultTitle(open.doc)} - ${p.name}`,\n zIndex: i + 1,\n ...frameForUpload('image'),\n x: 100 + i * 560,\n }));\n const state = buildBoardState(items, 1, open.doc.title || defaultTitle(open.doc));\n const ok = await pushCanvasBoard({ url: indexUrl, token, channelId: newBoardChannelId(), state });\n setResults((prev) => (prev ? { ...prev, savedToCanvas: ok } : prev));\n }, [results, token, indexUrl, open]);\n\n if (open) {\n return (\n <View style={styles.fill} testID={testID}>\n <DesignEditorExperience\n doc={open.doc}\n onChange={(doc) => setOpen({ channelId: open.channelId, doc })}\n onClose={closeEditor}\n onExport={handleExport}\n onPickLocalMedia={onPickLocalMedia}\n canvasImages={canvasImages}\n />\n {exporting ? (\n <View style={styles.overlay}>\n <View style={styles.overlayCard}>\n {exporting.error ? (\n <>\n <Text style={styles.overlayError}>Export failed</Text>\n <Text style={styles.overlayStage} numberOfLines={4}>\n {exporting.error}\n </Text>\n <Pressable onPress={() => setExporting(null)} style={styles.overlayDismiss}>\n <Text style={styles.overlayDismissLabel}>Dismiss</Text>\n </Pressable>\n </>\n ) : (\n <>\n <ActivityIndicator color={theme.foreground} />\n <Text style={styles.overlayStage}>{exporting.stage}</Text>\n </>\n )}\n </View>\n </View>\n ) : null}\n {results ? (\n <View style={styles.overlay}>\n <View style={styles.overlayCard}>\n <Text style={styles.overlayTitle}>Design exported</Text>\n {results.pages.map((p) => (\n <View key={p.url} style={styles.resultRow}>\n <Image source={{ uri: p.url }} style={styles.resultThumb} contentFit=\"cover\" />\n <Text style={styles.resultName}>{p.name}</Text>\n <Pressable onPress={() => void Linking.openURL(p.url)} hitSlop={8}>\n <Text style={styles.resultAction}>Open</Text>\n </Pressable>\n <Pressable\n onPress={() => void Share.share({ url: p.url, message: p.url })}\n hitSlop={8}\n >\n <Text style={styles.resultAction}>Share</Text>\n </Pressable>\n </View>\n ))}\n <Pressable\n onPress={() => void saveResultsToCanvas()}\n style={[styles.overlayCta, results.savedToCanvas && styles.overlayCtaDone]}\n disabled={results.savedToCanvas}\n >\n <MaterialCommunityIcons\n name={results.savedToCanvas ? 'check' : 'view-dashboard-outline'}\n size={18}\n color={results.savedToCanvas ? theme.foreground : theme.primaryForeground}\n />\n <Text\n style={[\n styles.overlayCtaLabel,\n results.savedToCanvas && styles.overlayCtaLabelDone,\n ]}\n >\n {results.savedToCanvas ? 'Saved to canvas' : 'Save to canvas'}\n </Text>\n </Pressable>\n <Pressable onPress={() => setResults(null)} style={styles.overlayDismiss}>\n <Text style={styles.overlayDismissLabel}>Done</Text>\n </Pressable>\n </View>\n </View>\n ) : null}\n </View>\n );\n }\n\n // Home: template cards + saved designs.\n return (\n <ScrollView style={styles.home} contentContainerStyle={styles.homeContent} testID={testID}>\n <Text style={styles.homeTitle} accessibilityRole=\"header\">\n Design studio\n </Text>\n <SectionHeader title=\"Start a design\" />\n <View style={styles.templateRow}>\n <TemplateCard\n icon=\"shape-square-plus\"\n label=\"Design\"\n hint=\"1080 × 1080\"\n shape=\"design\"\n onPress={() => setOpen({ channelId: newDesignChannelId(), doc: newDesignDoc('design') })}\n />\n <TemplateCard\n icon=\"tshirt-crew-outline\"\n label=\"T-shirt\"\n hint=\"Front & back\"\n shape=\"tshirt\"\n onPress={() => setOpen({ channelId: newDesignChannelId(), doc: newDesignDoc('tshirt') })}\n />\n <TemplateCard\n icon=\"email-outline\"\n label=\"Postcard\"\n hint=\"Front & back\"\n shape=\"postcard\"\n onPress={() => setOpen({ channelId: newDesignChannelId(), doc: newDesignDoc('postcard') })}\n />\n <TemplateCard\n icon=\"view-carousel-outline\"\n label=\"Carousel\"\n hint=\"3 slides\"\n shape=\"carousel\"\n onPress={() => setOpen({ channelId: newDesignChannelId(), doc: newDesignDoc('carousel') })}\n />\n </View>\n {loading ? (\n <View style={styles.designGrid}>\n {[0, 1].map((i) => (\n <View key={i} style={styles.designTile}>\n <View style={styles.designCover}>\n <Skeleton radius={RADIUS.lg} />\n </View>\n <Skeleton style={styles.skeletonLine} radius={4} />\n </View>\n ))}\n </View>\n ) : error ? (\n <Text style={styles.homeError}>{error}</Text>\n ) : designs.length ? (\n <>\n <SectionHeader title=\"Your designs\" detail={String(designs.length)} style={styles.sectionGap} />\n <View style={styles.designGrid}>\n {designs.map((d) => (\n <Pressable\n key={d.channelId}\n style={({ pressed }) => [styles.designTile, pressedStyle(pressed)]}\n onPress={() => {\n const doc = parseDesignDoc(d.doc) ?? d.doc;\n setOpen({ channelId: d.channelId, doc });\n }}\n >\n <View style={styles.designCover}>\n <DesignPreview doc={d.doc} />\n </View>\n <Text style={styles.designTitle} numberOfLines={1}>\n {d.title || defaultTitle(d.doc)}\n </Text>\n <Text style={styles.designSub} numberOfLines={1}>\n {d.doc.pages.length} page{d.doc.pages.length === 1 ? '' : 's'} ·{' '}\n {d.doc.pages.reduce((n, p) => n + p.layers.length, 0)} layers\n </Text>\n </Pressable>\n ))}\n </View>\n </>\n ) : (\n <Text style={styles.homeHint}>Pick a template to start. Designs save automatically.</Text>\n )}\n </ScrollView>\n );\n}\n\ntype TemplateShape = 'design' | 'tshirt' | 'postcard' | 'carousel';\n\nfunction TemplateCard({\n icon,\n label,\n hint,\n shape,\n onPress,\n}: {\n icon: string;\n label: string;\n hint: string;\n shape: TemplateShape;\n onPress: () => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n return (\n <Pressable\n onPress={onPress}\n style={({ pressed }) => [styles.templateCard, pressedStyle(pressed)]}\n accessibilityRole=\"button\"\n >\n <View style={styles.templateCover}>\n {shape === 'design' ? (\n // The everyday start: the one lime action on the home.\n <View style={styles.newPlus}>\n <MaterialCommunityIcons name=\"plus\" size={24} color={theme.primaryForeground} />\n </View>\n ) : shape === 'tshirt' ? (\n <MaterialCommunityIcons name={icon as 'plus'} size={56} color={theme.mutedForeground} />\n ) : shape === 'postcard' ? (\n <View style={[styles.sketchPage, { width: '72%', aspectRatio: 1.5 }]}>\n <SketchBars />\n </View>\n ) : (\n <View style={styles.carouselStack}>\n <View style={[styles.sketchPage, styles.carouselBack]} />\n <View style={[styles.sketchPage, styles.carouselFront]}>\n <SketchBars />\n </View>\n </View>\n )}\n </View>\n <Text style={styles.templateLabel}>{label}</Text>\n <Text style={styles.templateHint}>{hint}</Text>\n </Pressable>\n );\n}\n\n/** A faint layout sketch (title, lines, picture) for a page with nothing on it. */\nfunction SketchBars({ label }: { label?: string }) {\n const styles = makeStyles(useCanvasTheme());\n return (\n <View style={styles.sketch}>\n <View style={[styles.sketchBar, { width: '62%', height: '9%' }]} />\n <View style={[styles.sketchBar, { width: '86%', height: '5%' }]} />\n <View style={[styles.sketchBar, { width: '70%', height: '5%' }]} />\n <View style={[styles.sketchBar, styles.sketchBlock]}>\n <MaterialCommunityIcons name=\"image-outline\" size={14} color=\"#b4b4bb\" />\n </View>\n {label ? <Text style={styles.sketchLabel}>{label}</Text> : null}\n </View>\n );\n}\n\nconst PREVIEW_BOX = 120;\n\n/** A saved design's first page, scaled into its tile as laid out. */\nfunction DesignPreview({ doc }: { doc: PersistedDesignDoc }) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const page = doc.pages[0];\n if (!page || !(page.width > 0) || !(page.height > 0)) {\n return <MaterialCommunityIcons name=\"shape-outline\" size={28} color={theme.mutedForeground} />;\n }\n const scale = Math.min(PREVIEW_BOX / page.width, PREVIEW_BOX / page.height);\n const layers = [...page.layers].sort((a, b) => a.zIndex - b.zIndex);\n return (\n <View\n pointerEvents=\"none\"\n style={[\n styles.previewPage,\n {\n width: page.width * scale,\n height: page.height * scale,\n backgroundColor: page.background || '#ffffff',\n },\n ]}\n >\n {layers.length === 0 ? (\n <SketchBars label={defaultTitle(doc)} />\n ) : (\n layers.map((layer) => {\n const box = {\n position: 'absolute' as const,\n left: layer.x * scale,\n top: layer.y * scale,\n width: layer.width * scale,\n height: layer.height * scale,\n opacity: layer.opacity,\n };\n if (layer.type === 'image') {\n return <Image key={layer.id} source={{ uri: layer.src }} style={box} contentFit=\"cover\" />;\n }\n if (layer.type === 'shape') {\n return (\n <View\n key={layer.id}\n style={[box, { backgroundColor: layer.fill, borderRadius: layer.cornerRadius * scale }]}\n />\n );\n }\n return (\n <Text\n key={layer.id}\n numberOfLines={3}\n style={[\n box,\n {\n color: layer.color,\n fontSize: Math.max(4, layer.fontSize * scale),\n lineHeight: Math.max(5, layer.fontSize * scale * 1.15),\n fontWeight: layer.bold ? '700' : '400',\n textAlign: layer.align,\n },\n ]}\n >\n {layer.text}\n </Text>\n );\n })\n )}\n </View>\n );\n}\n\nconst GUTTER = SPACE.lg + 4;\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n fill: { flex: 1 },\n overlay: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0,0,0,0.55)',\n alignItems: 'center',\n justifyContent: 'center',\n padding: SPACE.xl,\n },\n overlayCard: {\n width: '100%',\n maxWidth: 360,\n alignItems: 'center',\n gap: SPACE.md,\n backgroundColor: theme.surface,\n borderRadius: RADIUS.xl,\n paddingVertical: SPACE.xl,\n paddingHorizontal: SPACE.xl - 4,\n },\n overlayTitle: { ...TYPE.title, color: theme.foreground },\n overlayStage: { ...TYPE.label, fontWeight: '500', color: theme.mutedForeground, textAlign: 'center' },\n overlayError: { ...TYPE.title, color: theme.destructiveText },\n overlayDismiss: {\n minHeight: HIT,\n paddingHorizontal: SPACE.lg,\n alignItems: 'center',\n justifyContent: 'center',\n },\n overlayDismissLabel: { ...TYPE.label, fontSize: 15, color: theme.foreground },\n overlayCta: {\n marginTop: SPACE.xs,\n alignSelf: 'stretch',\n minHeight: HIT,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n gap: SPACE.sm,\n backgroundColor: theme.primary,\n borderRadius: RADIUS.pill,\n paddingHorizontal: SPACE.lg,\n },\n overlayCtaDone: { backgroundColor: theme.card },\n overlayCtaLabel: { ...TYPE.label, fontSize: 15, color: theme.primaryForeground },\n overlayCtaLabelDone: { color: theme.foreground },\n resultRow: { flexDirection: 'row', alignItems: 'center', gap: SPACE.md, alignSelf: 'stretch' },\n resultThumb: { width: 48, height: 48, borderRadius: RADIUS.sm, backgroundColor: theme.card },\n resultName: { ...TYPE.label, flex: 1, color: theme.foreground },\n resultAction: { ...TYPE.label, color: theme.mutedForeground, paddingHorizontal: SPACE.xs + 2 },\n home: { flex: 1, backgroundColor: theme.background },\n homeContent: { paddingHorizontal: GUTTER, paddingTop: SPACE.lg, paddingBottom: SPACE.xxl },\n homeTitle: { ...TYPE.heading, color: theme.foreground, marginBottom: SPACE.xl - 4 },\n sectionGap: { marginTop: SPACE.xl },\n templateRow: { flexDirection: 'row', flexWrap: 'wrap', columnGap: SPACE.md, rowGap: SPACE.lg },\n templateCard: { flexBasis: '46%', flexGrow: 1 },\n templateCover: {\n aspectRatio: 1.25,\n borderRadius: RADIUS.lg,\n overflow: 'hidden',\n backgroundColor: theme.card,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: SPACE.sm,\n },\n newPlus: {\n width: 48,\n height: 48,\n borderRadius: 24,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.primary,\n },\n // Sketch pages are paper, not chrome: fixed white with a soft lift.\n sketchPage: {\n backgroundColor: '#ffffff',\n borderRadius: 3,\n overflow: 'hidden',\n shadowColor: '#000',\n shadowOpacity: theme.isDark ? 0 : 0.1,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n carouselStack: { width: '52%', aspectRatio: 1 },\n carouselBack: {\n position: 'absolute',\n top: -6,\n left: 10,\n right: -10,\n bottom: 6,\n opacity: theme.isDark ? 0.35 : 0.7,\n },\n carouselFront: { ...StyleSheet.absoluteFillObject },\n sketch: { ...StyleSheet.absoluteFillObject, padding: '10%', gap: 5 },\n sketchBar: { borderRadius: 3, backgroundColor: '#ececef' },\n sketchBlock: { flex: 1, width: '100%', marginTop: 3, alignItems: 'center', justifyContent: 'center' },\n sketchLabel: { fontSize: 10, fontWeight: '600', color: '#a1a1aa', textAlign: 'center' },\n templateLabel: { ...TYPE.label, fontSize: 14, color: theme.foreground },\n templateHint: { ...TYPE.caption, marginTop: 1, color: theme.mutedForeground },\n homeError: { ...TYPE.label, fontWeight: '500', marginTop: SPACE.xl, color: theme.destructiveText },\n homeHint: { ...TYPE.label, fontWeight: '500', marginTop: SPACE.xl, color: theme.mutedForeground },\n designGrid: { flexDirection: 'row', flexWrap: 'wrap', columnGap: SPACE.md, rowGap: SPACE.lg },\n designTile: { flexBasis: '46%', flexGrow: 1, maxWidth: '50%' },\n designCover: {\n aspectRatio: 1,\n borderRadius: RADIUS.lg,\n overflow: 'hidden',\n backgroundColor: theme.card,\n alignItems: 'center',\n justifyContent: 'center',\n marginBottom: SPACE.sm,\n },\n previewPage: {\n overflow: 'hidden',\n borderRadius: 3,\n shadowColor: '#000',\n shadowOpacity: theme.isDark ? 0 : 0.1,\n shadowRadius: 6,\n shadowOffset: { width: 0, height: 2 },\n elevation: 2,\n },\n skeletonLine: { height: 12, width: '60%' },\n designTitle: { ...TYPE.label, fontSize: 14, color: theme.foreground },\n designSub: { ...TYPE.caption, marginTop: 1, color: theme.mutedForeground },\n }),\n);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DesignExperience.js","sources":["../../../src/features/design/DesignExperience.tsx"],"sourcesContent":["/**\n * The design studio - the phone's twin of the web Design Studio (canvas\n * surface `editors/carousel-editor`): start from a size or a catalog\n * template, edit pages of text, shapes, pictures and charts, and keep every\n * design in the same store the web lists, so either side opens the other's.\n *\n * Everything is drawn natively - no WebView, no web surface. It ships OTA:\n * the canvas remote renders it in place of the web canvas hand-off, and the\n * `design_native` remote exposes it as its own surface. Designs made in the\n * first native editor (`design` surface rows) still open, converted\n * (doc/legacyDoc.ts), and save on as studio designs. Host seams win when\n * present (they can refresh auth); otherwise the remote builds its own from\n * the token and index URL it already holds, so older binaries get the whole\n * studio too.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { ActivityIndicator, Alert, StyleSheet, Text, View } from 'react-native';\nimport { gql } from '@apollo/client';\nimport { themedStyles, useCanvasTheme, type CanvasPalette } from '../canvas/canvasTheme';\nimport { ActionButton, SPACE, TYPE } from '../canvas/canvasUi';\nimport {\n DESIGN_CATALOG_QUERY,\n fetchDesignCatalog,\n fetchDesignCatalogViaClient,\n type DesignCatalogCard,\n} from '../canvas/designCatalog';\nimport { designCategoryFor, type BlankSize, type DesignCategory } from '../canvas/designCategories';\nimport { DesignCategoryGallery, type LoadDesignCatalog } from '../canvas/DesignCategoryGallery';\nimport type { StudioCatalogClient } from '../canvas/useStudioCatalogTemplates';\nimport {\n createRemoteConnectorExec,\n createRemoteUploadMedia,\n deriveBackendGraphqlUrl,\n} from '../canvas/videoEditor/remoteMediaClient';\nimport { CAROUSEL_CONNECTOR, type RunCarousel } from './doc/aiDesign';\nimport {\n buildDesignArtifact,\n deleteDesignArtifact,\n listDesignArtifacts,\n isDesignArtifactId,\n loadOwnedDesignArtifact,\n newArtifactId,\n saveDesignArtifact,\n type DesignArtifact,\n type IndexOptions,\n} from './doc/artifacts';\nimport {\n backendCatalogRows,\n blankDocCustom,\n blankDocForSize,\n catalogKind,\n catalogToDoc,\n findDesignTemplate,\n type DesignTemplate,\n type ReadCatalogRows,\n} from './doc/newDoc';\nimport { DESIGN_SIZES, type DesignSize } from './doc/sizes';\nimport type { DesignDoc, DesignKind } from './doc/types';\nimport { legacyKind, legacyToDoc } from './doc/legacyDoc';\nimport { newDesignDoc, type DesignKind as LegacyDesignKind } from './designCore';\nimport { fetchMyDesigns } from './designIndex';\nimport { DesignEditorExperience } from './DesignEditorExperience';\nimport { DesignHome } from './home/DesignHome';\nimport { createDesignImagePicker, type PickLocalMedia, type UploadMedia } from './pickDesignImage';\n\n/**\n * Where the studio opens. Absent: its home. `kind` and `channelId` are the\n * first editor's entries (a canvas tile, a saved design id), still honoured.\n */\nexport type DesignEntry =\n | { templateId: string }\n | { artifactId: string }\n | { sizeId: string }\n | { categoryId: string }\n | { blank: { width: number; height: number } }\n | { kind: LegacyDesignKind }\n | { channelId: string };\n\n/** One connector action, as a host or the remote transport runs it. */\nexport type RunConnectorAction = (\n connector: string,\n action: string,\n params: Record<string, unknown>,\n) => Promise<Record<string, unknown>>;\n\nexport interface DesignExperienceProps {\n token?: string | null;\n /** The surface index (saved designs live there, on the `canvas` surface). */\n indexUrl: string;\n /** The backend GraphQL (the template catalog); derived from `indexUrl` when absent. */\n graphqlUrl?: string | null;\n /** A dev host whose backend URL cannot be derived reads the catalog through Apollo. */\n apolloClient?: StudioCatalogClient | null;\n entry?: DesignEntry | null;\n /** Leave the studio (back from its home, or from an editor it was opened straight into). */\n onClose?: () => void;\n onPickLocalMedia?: PickLocalMedia;\n uploadMedia?: UploadMedia;\n /** The chat session designs made here belong to. */\n sessionId?: string;\n /** A session the host could not mint: shown instead of an empty home. */\n sessionError?: string | null;\n /**\n * Runs a connector action (the AI tool's `yantra-carousel` calls). A host seam wins; a\n * RunMediaAction-shaped `runMediaAction` is used next; otherwise the remote builds its own\n * from the token and index URL.\n */\n runAction?: RunConnectorAction;\n /** A host's media runner; any connector it is handed goes through, so the AI tool can use it. */\n runMediaAction?: unknown;\n testID?: string;\n}\n\ntype Screen =\n | { kind: 'home' }\n | { kind: 'category'; category: DesignCategory; query?: string }\n | { kind: 'loading'; label: string }\n | { kind: 'editor'; doc: DesignDoc; docKind: DesignKind; opened?: DesignArtifact | null; key: string }\n | { kind: 'error'; message: string };\n\nconst TEMPLATE_DOC = gql(DESIGN_CATALOG_QUERY);\n\n/** A category's blank size as the studio's full size (kind, platform, trim, sides). */\nfunction fullSize(blank: BlankSize): DesignSize | null {\n return DESIGN_SIZES.find((s) => s.id === blank.id) ?? null;\n}\n\nlet editorKeyCounter = 0;\nconst editorKey = () => `ed-${Date.now().toString(36)}-${(editorKeyCounter += 1)}`;\n\nexport function DesignExperience({\n token,\n indexUrl,\n graphqlUrl: graphqlUrlProp,\n apolloClient,\n entry,\n onClose,\n onPickLocalMedia,\n uploadMedia,\n sessionId,\n sessionError,\n runAction,\n runMediaAction,\n testID,\n}: DesignExperienceProps) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n\n const index = useMemo<IndexOptions | null>(() => (indexUrl ? { url: indexUrl, token } : null), [indexUrl, token]);\n const graphqlUrl = useMemo(\n () => graphqlUrlProp || (indexUrl ? deriveBackendGraphqlUrl(indexUrl) : null),\n [graphqlUrlProp, indexUrl],\n );\n\n const loadCatalog = useMemo<LoadDesignCatalog | undefined>(() => {\n if (graphqlUrl) return (group, opts) => fetchDesignCatalog(graphqlUrl, token, group, opts);\n if (apolloClient) return (group, opts) => fetchDesignCatalogViaClient(apolloClient, group, opts);\n return undefined;\n }, [graphqlUrl, token, apolloClient]);\n\n const readRows = useMemo<ReadCatalogRows | null>(() => {\n if (graphqlUrl) return backendCatalogRows(graphqlUrl, token);\n if (apolloClient) {\n return async (filter) => {\n const { data } = await apolloClient.query({\n query: TEMPLATE_DOC,\n variables: { filter },\n fetchPolicy: 'no-cache',\n });\n const nodes = (\n data as { formTemplateSubmissions?: { nodes?: Array<Record<string, any>> | null } } | null\n )?.formTemplateSubmissions?.nodes;\n return Array.isArray(nodes) ? nodes : [];\n };\n }\n return null;\n }, [graphqlUrl, token, apolloClient]);\n\n const readTemplate = useCallback(\n (id: string): Promise<DesignTemplate | null> =>\n readRows ? findDesignTemplate(id, readRows) : Promise.resolve(null),\n [readRows],\n );\n\n const effectiveUpload = useMemo<UploadMedia | undefined>(\n () => uploadMedia ?? (token && indexUrl ? createRemoteUploadMedia(token, indexUrl) : undefined),\n [uploadMedia, token, indexUrl],\n );\n const pickImage = useMemo(\n () => createDesignImagePicker(onPickLocalMedia, effectiveUpload),\n [onPickLocalMedia, effectiveUpload],\n );\n\n /** The AI tool's transport: the host's, else the remote's own from what it holds. */\n const runCarousel = useMemo<RunCarousel | undefined>(() => {\n const seam =\n runAction ?? (typeof runMediaAction === 'function' ? (runMediaAction as RunConnectorAction) : undefined);\n if (seam) return (action, params) => seam(CAROUSEL_CONNECTOR, action, params);\n if (token && indexUrl) {\n const exec = createRemoteConnectorExec(token, indexUrl);\n return (action, params, timeoutMs) => exec(CAROUSEL_CONNECTOR, action, params, { timeoutMs });\n }\n return undefined;\n }, [runAction, runMediaAction, token, indexUrl]);\n\n // ── Saved designs ─────────────────────────────────────────────────────\n const [designs, setDesigns] = useState<DesignArtifact[]>([]);\n const [loading, setLoading] = useState(Boolean(index));\n const [listError, setListError] = useState<string | null>(null);\n const [listRead, setListRead] = useState(0);\n const refresh = useCallback(() => setListRead((n) => n + 1), []);\n\n const [screen, setScreen] = useState<Screen>(() =>\n entry ? { kind: 'loading', label: 'Opening…' } : { kind: 'home' },\n );\n /** Opened straight into an editor (a canvas tile, a link): back leaves the studio. */\n const directEntry = useRef(Boolean(entry));\n const onHome = screen.kind === 'home';\n\n useEffect(() => {\n if (!index || !onHome) return undefined;\n const controller = new AbortController();\n setLoading(true);\n void listDesignArtifacts({ ...index, signal: controller.signal }).then((result) => {\n if (controller.signal.aborted) return;\n setDesigns(result.designs);\n setListError(result.error);\n setLoading(false);\n });\n return () => controller.abort();\n }, [index, onHome, listRead]);\n\n // ── Opening ───────────────────────────────────────────────────────────\n const openDoc = useCallback((doc: DesignDoc, docKind: DesignKind, opened?: DesignArtifact | null) => {\n setScreen({ kind: 'editor', doc, docKind, opened: opened ?? null, key: editorKey() });\n }, []);\n\n const openSize = useCallback((size: DesignSize) => openDoc(blankDocForSize(size), size.kind), [openDoc]);\n\n const openTemplate = useCallback(\n async (id: string) => {\n setScreen({ kind: 'loading', label: 'Opening template…' });\n try {\n const template = await readTemplate(id);\n if (!template) {\n setScreen({ kind: 'error', message: 'That template is no longer in the catalog.' });\n return;\n }\n openDoc(catalogToDoc(template), catalogKind(template));\n } catch (err) {\n setScreen({\n kind: 'error',\n message: err instanceof Error ? err.message : 'The template could not be opened.',\n });\n }\n },\n [readTemplate, openDoc],\n );\n\n const openSaved = useCallback(\n async (id: string) => {\n if (!index) {\n setScreen({ kind: 'error', message: 'Sign in to open your designs.' });\n return;\n }\n setScreen({ kind: 'loading', label: 'Opening design…' });\n const { artifact, error } = await loadOwnedDesignArtifact(index, id);\n if (artifact) openDoc(artifact.doc, artifact.kind, artifact);\n else setScreen({ kind: 'error', message: error ?? 'That design is not one of yours, or it was deleted.' });\n },\n [index, openDoc],\n );\n\n /** A first-editor design (`design` surface): converted, then saved on as a new studio design. */\n const openLegacy = useCallback(\n async (channelId: string) => {\n if (!index) {\n setScreen({ kind: 'error', message: 'Sign in to open your designs.' });\n return;\n }\n setScreen({ kind: 'loading', label: 'Opening design…' });\n const result = await fetchMyDesigns({ url: index.url, token: index.token });\n const match = result.designs.find((d) => d.channelId === channelId);\n if (match)\n openDoc(legacyToDoc({ ...match.doc, title: match.doc.title ?? match.title }), legacyKind(match.doc));\n else\n setScreen({\n kind: 'error',\n message: result.error ?? 'That design is not one of yours, or it was deleted.',\n });\n },\n [index, openDoc],\n );\n\n // An entry runs once, when the studio mounts.\n const entryRan = useRef(false);\n useEffect(() => {\n if (entryRan.current || !entry) return;\n entryRan.current = true;\n if ('templateId' in entry) void openTemplate(entry.templateId);\n else if ('artifactId' in entry) void openSaved(entry.artifactId);\n else if ('sizeId' in entry) {\n const size = DESIGN_SIZES.find((s) => s.id === entry.sizeId);\n if (size) openSize(size);\n else setScreen({ kind: 'home' });\n } else if ('kind' in entry) {\n // The first editor's kinds: a T-shirt keeps its own starter; the rest are studio formats.\n if (entry.kind === 'tshirt') openDoc(legacyToDoc(newDesignDoc('tshirt')), 'flyer');\n else if (entry.kind === 'postcard') openSize(DESIGN_SIZES.find((s) => s.id === 'postcard')!);\n else if (entry.kind === 'carousel') {\n directEntry.current = false;\n setScreen({ kind: 'category', category: designCategoryFor('carousel')! });\n } else {\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }\n } else if ('channelId' in entry) {\n if (isDesignArtifactId(entry.channelId)) void openSaved(entry.channelId);\n else void openLegacy(entry.channelId);\n } else if ('categoryId' in entry) {\n const category = designCategoryFor(entry.categoryId);\n directEntry.current = false;\n setScreen(category ? { kind: 'category', category } : { kind: 'home' });\n } else {\n openDoc(blankDocCustom(entry.blank.width, entry.blank.height), 'deck');\n }\n }, [entry, openTemplate, openSaved, openLegacy, openSize, openDoc]);\n\n const leaveEditor = useCallback(() => {\n if (directEntry.current && onClose) {\n onClose();\n return;\n }\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }, [onClose]);\n\n const designAction = useCallback(\n async (design: DesignArtifact, action: 'duplicate' | 'delete') => {\n if (!index) return;\n if (action === 'delete') {\n Alert.alert('Delete this design?', `\"${design.title}\" will be gone from the phone and the web.`, [\n { text: 'Cancel', style: 'cancel' },\n {\n text: 'Delete',\n style: 'destructive',\n onPress: async () => {\n setDesigns((prev) => prev.filter((d) => d.id !== design.id));\n const ok = await deleteDesignArtifact(index, design.id);\n if (!ok) {\n Alert.alert('Could not delete', 'Check your connection and try again.');\n refresh();\n }\n },\n },\n ]);\n return;\n }\n const doc = { ...design.doc, title: `${design.title} (copy)` };\n // Same pages, so the original's renders are the copy's too: keep its cover in the grid.\n const copy = buildDesignArtifact(newArtifactId(design.kind), design.kind, doc, {\n sessionId: design.sessionId,\n thumbUrl: design.thumbUrl,\n exportUrl: design.exportUrl,\n });\n const result = await saveDesignArtifact(index, copy);\n if (result.ok) setDesigns((prev) => [copy, ...prev]);\n else Alert.alert('Could not copy', result.error ?? 'Try again.');\n },\n [index, refresh],\n );\n\n /** Web RecentDesigns rename: the row's doc takes the new title (empty clears it) and saves. */\n const renameDesign = useCallback(\n async (design: DesignArtifact, title: string) => {\n if (!index) return;\n const doc = { ...design.doc, title: title.trim() || undefined };\n const renamed = buildDesignArtifact(design.id, design.kind, doc, {\n sessionId: design.sessionId,\n thumbUrl: design.thumbUrl,\n exportUrl: design.exportUrl,\n });\n setDesigns((prev) => prev.map((d) => (d.id === design.id ? renamed : d)));\n const result = await saveDesignArtifact(index, renamed);\n if (!result.ok) {\n Alert.alert('Could not rename that design', result.error ?? 'Try again.');\n refresh();\n }\n },\n [index, refresh],\n );\n\n // ── Screens ───────────────────────────────────────────────────────────\n if (screen.kind === 'editor') {\n return (\n <View style={styles.fill} testID={testID}>\n <DesignEditorExperience\n key={screen.key}\n doc={screen.doc}\n kind={screen.docKind}\n opened={screen.opened}\n index={index}\n sessionId={sessionId}\n loadCatalog={loadCatalog}\n readTemplate={readRows ? readTemplate : undefined}\n pickImage={pickImage}\n uploadFile={effectiveUpload}\n runCarousel={runCarousel}\n onClose={leaveEditor}\n />\n </View>\n );\n }\n\n if (screen.kind === 'category') {\n return (\n <View style={styles.fill} testID={testID}>\n <DesignCategoryGallery\n category={screen.category}\n initialQuery={screen.query}\n load={loadCatalog}\n onClose={() => setScreen({ kind: 'home' })}\n onBlank={(blank) => {\n const size = fullSize(blank);\n if (size) openSize(size);\n else openDoc(blankDocCustom(blank.width, blank.height), 'deck');\n }}\n onOpenTemplate={readRows ? (card: DesignCatalogCard) => void openTemplate(card.id) : undefined}\n />\n </View>\n );\n }\n\n if (screen.kind === 'loading' || screen.kind === 'error') {\n return (\n <View style={[styles.fill, styles.center]} testID={testID}>\n {screen.kind === 'loading' ? (\n <>\n <ActivityIndicator color={theme.mutedForeground} />\n <Text style={styles.message}>{screen.label}</Text>\n </>\n ) : (\n <>\n <Text style={styles.message}>{screen.message}</Text>\n <ActionButton\n label=\"Go to Design\"\n onPress={() => {\n directEntry.current = false;\n setScreen({ kind: 'home' });\n }}\n />\n </>\n )}\n </View>\n );\n }\n\n return (\n <View style={styles.fill} testID={testID}>\n <DesignHome\n designs={designs}\n loading={loading}\n error={sessionError || listError}\n onRefresh={refresh}\n onClose={onClose}\n onOpenDesign={(design) => openDoc(design.doc, design.kind, design)}\n onDesignAction={(design, action) => void designAction(design, action)}\n onRenameDesign={(design, title) => void renameDesign(design, title)}\n onCreate={openSize}\n onCustom={(w, h) => openDoc(blankDocCustom(w, h), 'deck')}\n onOpenCategory={(category, query) => setScreen({ kind: 'category', category, query })}\n onOpenTemplate={(card) => {\n if (readRows) void openTemplate(card.id);\n }}\n loadCatalog={loadCatalog}\n />\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n fill: { flex: 1, backgroundColor: theme.background },\n center: { alignItems: 'center', justifyContent: 'center', gap: SPACE.lg, padding: SPACE.xl },\n message: { ...TYPE.body, color: theme.mutedForeground, textAlign: 'center' },\n }),\n);\n\nexport default DesignExperience;\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defProps = Object.defineProperties;
|
|
3
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
2
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
3
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
4
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
@@ -16,27 +14,6 @@ var __spreadValues = (a, b) => {
|
|
|
16
14
|
}
|
|
17
15
|
return a;
|
|
18
16
|
};
|
|
19
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
-
var __objRest = (source, exclude) => {
|
|
21
|
-
var target = {};
|
|
22
|
-
for (var prop in source)
|
|
23
|
-
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
24
|
-
target[prop] = source[prop];
|
|
25
|
-
if (source != null && __getOwnPropSymbols)
|
|
26
|
-
for (var prop of __getOwnPropSymbols(source)) {
|
|
27
|
-
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
28
|
-
target[prop] = source[prop];
|
|
29
|
-
}
|
|
30
|
-
return target;
|
|
31
|
-
};
|
|
32
|
-
const TSHIRT_COLORS = ["#ffffff", "#0f172a", "#dc2626", "#2563eb", "#16a34a", "#f59e0b"];
|
|
33
|
-
const DESIGN_SWATCHES = ["#0f172a", "#ffffff", "#ef4444", "#f97316", "#facc15", "#22c55e", "#3b82f6", "#8b5cf6", "#ec4899"];
|
|
34
|
-
const TSHIRT_PRINT_AREA = {
|
|
35
|
-
x: 0.28,
|
|
36
|
-
y: 0.22,
|
|
37
|
-
width: 0.44,
|
|
38
|
-
height: 0.5
|
|
39
|
-
};
|
|
40
17
|
let counter = 0;
|
|
41
18
|
function newId(prefix) {
|
|
42
19
|
counter += 1;
|
|
@@ -44,21 +21,8 @@ function newId(prefix) {
|
|
|
44
21
|
if (c == null ? void 0 : c.randomUUID) return `${prefix}-${c.randomUUID().slice(0, 8)}`;
|
|
45
22
|
return `${prefix}-${counter}-${Math.random().toString(36).slice(2, 8)}`;
|
|
46
23
|
}
|
|
47
|
-
function newDesignChannelId() {
|
|
48
|
-
var _a, _b;
|
|
49
|
-
const rand = () => Math.random().toString(36).slice(2, 10);
|
|
50
|
-
try {
|
|
51
|
-
const bytes = new Uint8Array(8);
|
|
52
|
-
(_b = (_a = globalThis.crypto) == null ? void 0 : _a.getRandomValues) == null ? void 0 : _b.call(_a, bytes);
|
|
53
|
-
if (bytes.some((b) => b !== 0)) {
|
|
54
|
-
return `design-${Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
55
|
-
}
|
|
56
|
-
} catch (e) {
|
|
57
|
-
}
|
|
58
|
-
return `design-${rand()}${rand()}`;
|
|
59
|
-
}
|
|
60
24
|
function newDesignDoc(kind) {
|
|
61
|
-
|
|
25
|
+
{
|
|
62
26
|
return {
|
|
63
27
|
version: 1,
|
|
64
28
|
kind,
|
|
@@ -80,110 +44,6 @@ function newDesignDoc(kind) {
|
|
|
80
44
|
}]
|
|
81
45
|
};
|
|
82
46
|
}
|
|
83
|
-
if (kind === "postcard") {
|
|
84
|
-
return {
|
|
85
|
-
version: 1,
|
|
86
|
-
kind,
|
|
87
|
-
savedAt: 0,
|
|
88
|
-
pages: [{
|
|
89
|
-
id: newId("page"),
|
|
90
|
-
name: "Front",
|
|
91
|
-
width: 1500,
|
|
92
|
-
height: 1060,
|
|
93
|
-
background: "#f8fafc",
|
|
94
|
-
layers: [__spreadProps(__spreadValues({}, newTextLayer("Greetings!", 1)), {
|
|
95
|
-
x: 90,
|
|
96
|
-
y: 90,
|
|
97
|
-
width: 900,
|
|
98
|
-
height: 160,
|
|
99
|
-
fontSize: 120,
|
|
100
|
-
bold: true
|
|
101
|
-
})]
|
|
102
|
-
}, {
|
|
103
|
-
id: newId("page"),
|
|
104
|
-
name: "Back",
|
|
105
|
-
width: 1500,
|
|
106
|
-
height: 1060,
|
|
107
|
-
background: "#ffffff",
|
|
108
|
-
layers: []
|
|
109
|
-
}]
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
if (kind === "carousel") {
|
|
113
|
-
const slide = (n) => ({
|
|
114
|
-
id: newId("page"),
|
|
115
|
-
name: `Slide ${n}`,
|
|
116
|
-
width: 1080,
|
|
117
|
-
height: 1080,
|
|
118
|
-
background: "#ffffff",
|
|
119
|
-
layers: []
|
|
120
|
-
});
|
|
121
|
-
return {
|
|
122
|
-
version: 1,
|
|
123
|
-
kind,
|
|
124
|
-
savedAt: 0,
|
|
125
|
-
title: "Carousel",
|
|
126
|
-
pages: [slide(1), slide(2), slide(3)]
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
version: 1,
|
|
131
|
-
kind: "design",
|
|
132
|
-
savedAt: 0,
|
|
133
|
-
pages: [{
|
|
134
|
-
id: newId("page"),
|
|
135
|
-
name: "Page 1",
|
|
136
|
-
width: 1080,
|
|
137
|
-
height: 1080,
|
|
138
|
-
background: "#ffffff",
|
|
139
|
-
layers: []
|
|
140
|
-
}]
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
function newTextLayer(text, zIndex) {
|
|
144
|
-
return {
|
|
145
|
-
id: newId("text"),
|
|
146
|
-
type: "text",
|
|
147
|
-
text,
|
|
148
|
-
x: 120,
|
|
149
|
-
y: 120,
|
|
150
|
-
width: 640,
|
|
151
|
-
height: 120,
|
|
152
|
-
fontSize: 72,
|
|
153
|
-
color: "#0f172a",
|
|
154
|
-
bold: false,
|
|
155
|
-
align: "left",
|
|
156
|
-
opacity: 1,
|
|
157
|
-
zIndex
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
function newShapeLayer(shape, zIndex) {
|
|
161
|
-
return {
|
|
162
|
-
id: newId("shape"),
|
|
163
|
-
type: "shape",
|
|
164
|
-
shape,
|
|
165
|
-
x: 140,
|
|
166
|
-
y: 200,
|
|
167
|
-
width: shape === "line" ? 600 : 420,
|
|
168
|
-
height: shape === "line" ? 12 : 300,
|
|
169
|
-
fill: "#3b82f6",
|
|
170
|
-
cornerRadius: shape === "line" ? 6 : 16,
|
|
171
|
-
opacity: 1,
|
|
172
|
-
zIndex
|
|
173
|
-
};
|
|
174
|
-
}
|
|
175
|
-
function newImageLayer(src, zIndex) {
|
|
176
|
-
return {
|
|
177
|
-
id: newId("image"),
|
|
178
|
-
type: "image",
|
|
179
|
-
src,
|
|
180
|
-
x: 160,
|
|
181
|
-
y: 160,
|
|
182
|
-
width: 640,
|
|
183
|
-
height: 480,
|
|
184
|
-
opacity: 1,
|
|
185
|
-
zIndex
|
|
186
|
-
};
|
|
187
47
|
}
|
|
188
48
|
function parseDesignDoc(raw) {
|
|
189
49
|
if (!raw || typeof raw !== "object") return null;
|
|
@@ -225,74 +85,4 @@ function isRenderableLayer(raw) {
|
|
|
225
85
|
if (layer.type === "shape") return layer.shape === "rect" || layer.shape === "line";
|
|
226
86
|
if (layer.type === "image") return typeof layer.src === "string" && layer.src.length > 0 && !layer.src.startsWith("blob:");
|
|
227
87
|
return false;
|
|
228
|
-
}
|
|
229
|
-
function buildDesignState(doc, currentTitle) {
|
|
230
|
-
return __spreadValues(__spreadProps(__spreadValues({}, doc), {
|
|
231
|
-
savedAt: Date.now()
|
|
232
|
-
}), doc.title ? {
|
|
233
|
-
title: doc.title
|
|
234
|
-
} : {});
|
|
235
|
-
}
|
|
236
|
-
function designSignature(doc) {
|
|
237
|
-
var _a;
|
|
238
|
-
return JSON.stringify({
|
|
239
|
-
kind: doc.kind,
|
|
240
|
-
title: (_a = doc.title) != null ? _a : "",
|
|
241
|
-
pages: doc.pages.map((page) => [page.background, page.layers.map((layer) => {
|
|
242
|
-
const _a2 = layer, {
|
|
243
|
-
zIndex
|
|
244
|
-
} = _a2, rest = __objRest(_a2, [
|
|
245
|
-
"zIndex"
|
|
246
|
-
]);
|
|
247
|
-
return [zIndex, rest];
|
|
248
|
-
})])
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
function layerPaintOrder(layers) {
|
|
252
|
-
return [...layers].sort((a, b) => a.zIndex - b.zIndex || a.id.localeCompare(b.id));
|
|
253
|
-
}
|
|
254
|
-
function replaceLayer(page, layer) {
|
|
255
|
-
return __spreadProps(__spreadValues({}, page), {
|
|
256
|
-
layers: page.layers.map((l) => l.id === layer.id ? layer : l)
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
function removeLayer(page, id) {
|
|
260
|
-
return __spreadProps(__spreadValues({}, page), {
|
|
261
|
-
layers: page.layers.filter((l) => l.id !== id)
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
function addLayer(page, layer) {
|
|
265
|
-
return __spreadProps(__spreadValues({}, page), {
|
|
266
|
-
layers: [...page.layers, layer]
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
function nextZ(page) {
|
|
270
|
-
return Math.max(0, ...page.layers.map((l) => l.zIndex)) + 1;
|
|
271
|
-
}
|
|
272
|
-
function bringLayerToFront(page, id) {
|
|
273
|
-
const top = Math.max(...page.layers.map((l) => l.zIndex), 0);
|
|
274
|
-
return __spreadProps(__spreadValues({}, page), {
|
|
275
|
-
layers: page.layers.map((l) => l.id === id ? __spreadProps(__spreadValues({}, l), {
|
|
276
|
-
zIndex: top + 1
|
|
277
|
-
}) : l)
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
function sendLayerToBack(page, id) {
|
|
281
|
-
const bottom = Math.min(...page.layers.map((l) => l.zIndex), 0);
|
|
282
|
-
return __spreadProps(__spreadValues({}, page), {
|
|
283
|
-
layers: page.layers.map((l) => l.id === id ? __spreadProps(__spreadValues({}, l), {
|
|
284
|
-
zIndex: bottom - 1
|
|
285
|
-
}) : l)
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
function duplicateLayer(page, id) {
|
|
289
|
-
const source = page.layers.find((l) => l.id === id);
|
|
290
|
-
if (!source) return page;
|
|
291
|
-
const copy = __spreadProps(__spreadValues({}, source), {
|
|
292
|
-
id: newId(source.type),
|
|
293
|
-
x: source.x + 40,
|
|
294
|
-
y: source.y + 40,
|
|
295
|
-
zIndex: nextZ(page)
|
|
296
|
-
});
|
|
297
|
-
return addLayer(page, copy);
|
|
298
|
-
}export{DESIGN_SWATCHES,TSHIRT_COLORS,TSHIRT_PRINT_AREA,addLayer,bringLayerToFront,buildDesignState,designSignature,duplicateLayer,isRenderableLayer,layerPaintOrder,newDesignChannelId,newDesignDoc,newImageLayer,newShapeLayer,newTextLayer,nextZ,parseDesignDoc,removeLayer,replaceLayer,sendLayerToBack};//# sourceMappingURL=designCore.js.map
|
|
88
|
+
}export{isRenderableLayer,newDesignDoc,parseDesignDoc};//# sourceMappingURL=designCore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"designCore.js","sources":["../../../src/features/design/designCore.ts"],"sourcesContent":["/**\n * Design document model - the native design studio's persisted contract.\n *\n * Modeled on the IMG.LY CE.SDK starter kits (design editor, t-shirt designer,\n * postcard editor) but implemented as pure data + math so the whole editor\n * ships OTA inside a federated surface: no native design SDK in the binary.\n * The doc rides a surface-index row (`surface: design`) exactly like a canvas\n * board rides `surface: canvas` - `PersistedDesignDoc` version 1 IS the wire\n * shape, and the tests pin fixtures of that JSON so drift fails a test rather\n * than corrupting a saved design.\n *\n * Layer types are deliberately the set the connector-side export can render\n * faithfully (exportDesign.ts): solid shapes (PAD), images (RESIZE+COMPOSE)\n * and text (ANNOTATE). No rotation in v1 - the compose ops cannot rotate an\n * overlay, and an editor that shows what export cannot produce lies.\n */\n\nexport type DesignKind = 'design' | 'tshirt' | 'postcard' | 'carousel';\n\ninterface LayerBase {\n id: string;\n /** Page-space rect (page units, origin top-left). */\n x: number;\n y: number;\n width: number;\n height: number;\n /** 0..1 */\n opacity: number;\n zIndex: number;\n}\n\nexport interface TextLayer extends LayerBase {\n type: 'text';\n text: string;\n fontSize: number;\n color: string;\n bold: boolean;\n align: 'left' | 'center' | 'right';\n}\n\nexport interface ShapeLayer extends LayerBase {\n type: 'shape';\n shape: 'rect' | 'line';\n fill: string;\n cornerRadius: number;\n}\n\nexport interface ImageLayer extends LayerBase {\n type: 'image';\n src: string;\n}\n\nexport type DesignLayer = TextLayer | ShapeLayer | ImageLayer;\n\nexport interface DesignPage {\n id: string;\n name: string;\n width: number;\n height: number;\n /** Page fill; for a t-shirt this is the shirt colour. */\n background: string;\n layers: DesignLayer[];\n}\n\nexport interface PersistedDesignDoc {\n version: 1;\n kind: DesignKind;\n savedAt: number;\n title?: string;\n pages: DesignPage[];\n}\n\n/** Shirt colours the t-shirt designer offers (page.background). */\nexport const TSHIRT_COLORS = ['#ffffff', '#0f172a', '#dc2626', '#2563eb', '#16a34a', '#f59e0b'] as const;\n\n/** Fill / text swatches shared by the style panels. */\nexport const DESIGN_SWATCHES = [\n '#0f172a',\n '#ffffff',\n '#ef4444',\n '#f97316',\n '#facc15',\n '#22c55e',\n '#3b82f6',\n '#8b5cf6',\n '#ec4899',\n] as const;\n\n/**\n * Printable region of a t-shirt page, as fractions of the page rect - the\n * dashed outline the starter kit draws so designers know the safe print zone.\n * Chrome only: guides are never exported.\n */\nexport const TSHIRT_PRINT_AREA = { x: 0.28, y: 0.22, width: 0.44, height: 0.5 } as const;\n\nlet counter = 0;\n/** Test seam: deterministic ids. */\nexport function resetDesignIds(): void {\n counter = 0;\n}\n\nfunction newId(prefix: string): string {\n counter += 1;\n const c = globalThis.crypto as Crypto | undefined;\n if (c?.randomUUID) return `${prefix}-${c.randomUUID().slice(0, 8)}`;\n return `${prefix}-${counter}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Mint a doc id - the row IS its channel, like a canvas board. */\nexport function newDesignChannelId(): string {\n const rand = () => Math.random().toString(36).slice(2, 10);\n try {\n const bytes = new Uint8Array(8);\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n if (bytes.some((b) => b !== 0)) {\n return `design-${Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')}`;\n }\n } catch {\n // fall through to Math.random\n }\n return `design-${rand()}${rand()}`;\n}\n\n/**\n * Template starting points - the three starter kits.\n * Page sizes are pixel canvases at export resolution: square social design,\n * portrait apparel print, 6x4.25\" postcard at ~250dpi.\n */\nexport function newDesignDoc(kind: DesignKind): PersistedDesignDoc {\n if (kind === 'tshirt') {\n return {\n version: 1,\n kind,\n savedAt: 0,\n pages: [\n { id: newId('page'), name: 'Front', width: 1200, height: 1500, background: '#ffffff', layers: [] },\n { id: newId('page'), name: 'Back', width: 1200, height: 1500, background: '#ffffff', layers: [] },\n ],\n };\n }\n if (kind === 'postcard') {\n return {\n version: 1,\n kind,\n savedAt: 0,\n pages: [\n {\n id: newId('page'),\n name: 'Front',\n width: 1500,\n height: 1060,\n background: '#f8fafc',\n layers: [\n {\n ...newTextLayer('Greetings!', 1),\n x: 90,\n y: 90,\n width: 900,\n height: 160,\n fontSize: 120,\n bold: true,\n },\n ],\n },\n { id: newId('page'), name: 'Back', width: 1500, height: 1060, background: '#ffffff', layers: [] },\n ],\n };\n }\n if (kind === 'carousel') {\n // Web carousel studio: three square social slides (not a single design page).\n const slide = (n: number) => ({\n id: newId('page'),\n name: `Slide ${n}`,\n width: 1080,\n height: 1080,\n background: '#ffffff',\n layers: [] as DesignPage['layers'],\n });\n return {\n version: 1,\n kind,\n savedAt: 0,\n title: 'Carousel',\n pages: [slide(1), slide(2), slide(3)],\n };\n }\n return {\n version: 1,\n kind: 'design',\n savedAt: 0,\n pages: [{ id: newId('page'), name: 'Page 1', width: 1080, height: 1080, background: '#ffffff', layers: [] }],\n };\n}\n\nexport function newTextLayer(text: string, zIndex: number): TextLayer {\n return {\n id: newId('text'),\n type: 'text',\n text,\n x: 120,\n y: 120,\n width: 640,\n height: 120,\n fontSize: 72,\n color: '#0f172a',\n bold: false,\n align: 'left',\n opacity: 1,\n zIndex,\n };\n}\n\nexport function newShapeLayer(shape: ShapeLayer['shape'], zIndex: number): ShapeLayer {\n return {\n id: newId('shape'),\n type: 'shape',\n shape,\n x: 140,\n y: 200,\n width: shape === 'line' ? 600 : 420,\n height: shape === 'line' ? 12 : 300,\n fill: '#3b82f6',\n cornerRadius: shape === 'line' ? 6 : 16,\n opacity: 1,\n zIndex,\n };\n}\n\nexport function newImageLayer(src: string, zIndex: number): ImageLayer {\n return { id: newId('image'), type: 'image', src, x: 160, y: 160, width: 640, height: 480, opacity: 1, zIndex };\n}\n\n/** Parse a persisted doc, tolerating the unknown: bad rows drop, not throw. */\nexport function parseDesignDoc(raw: unknown): PersistedDesignDoc | null {\n if (!raw || typeof raw !== 'object') return null;\n const doc = raw as Partial<PersistedDesignDoc>;\n if (doc.version !== 1 || !Array.isArray(doc.pages) || doc.pages.length === 0) return null;\n const kind: DesignKind =\n doc.kind === 'tshirt' || doc.kind === 'postcard' || doc.kind === 'carousel' ? doc.kind : 'design';\n const pages = doc.pages.map((page) => parsePage(page)).filter((page): page is DesignPage => page !== null);\n if (pages.length === 0) return null;\n return {\n version: 1,\n kind,\n savedAt: typeof doc.savedAt === 'number' ? doc.savedAt : 0,\n pages,\n ...(typeof doc.title === 'string' && doc.title ? { title: doc.title } : {}),\n };\n}\n\nfunction parsePage(raw: unknown): DesignPage | null {\n if (!raw || typeof raw !== 'object') return null;\n const page = raw as Partial<DesignPage>;\n if (\n typeof page.id !== 'string' ||\n typeof page.width !== 'number' ||\n typeof page.height !== 'number' ||\n page.width <= 0 ||\n page.height <= 0\n ) {\n return null;\n }\n return {\n id: page.id,\n name: typeof page.name === 'string' && page.name ? page.name : 'Page',\n width: page.width,\n height: page.height,\n background: typeof page.background === 'string' && page.background ? page.background : '#ffffff',\n layers: Array.isArray(page.layers) ? page.layers.filter(isRenderableLayer) : [],\n };\n}\n\n/** A layer the editor and export can both draw. */\nexport function isRenderableLayer(raw: unknown): raw is DesignLayer {\n if (!raw || typeof raw !== 'object') return false;\n const layer = raw as Partial<DesignLayer> & { [key: string]: unknown };\n const baseOk =\n typeof layer.id === 'string' &&\n [layer.x, layer.y, layer.width, layer.height].every((n) => typeof n === 'number' && Number.isFinite(n)) &&\n (layer.width as number) > 0 &&\n (layer.height as number) > 0 &&\n typeof layer.zIndex === 'number';\n if (!baseOk) return false;\n if (layer.type === 'text') return typeof layer.text === 'string' && typeof layer.fontSize === 'number';\n if (layer.type === 'shape') return layer.shape === 'rect' || layer.shape === 'line';\n if (layer.type === 'image')\n return typeof layer.src === 'string' && layer.src.length > 0 && !layer.src.startsWith('blob:');\n return false;\n}\n\n/** State to write to the index - savedAt bumps, title is sticky once set. */\nexport function buildDesignState(doc: PersistedDesignDoc, currentTitle?: string): PersistedDesignDoc {\n return {\n ...doc,\n savedAt: Date.now(),\n ...(currentTitle || doc.title ? { title: currentTitle || doc.title } : {}),\n };\n}\n\n/** Comparable fingerprint of what is worth a write (geometry included - a\n * design IS its layout, unlike a canvas board where geometry is secondary). */\nexport function designSignature(doc: PersistedDesignDoc): string {\n return JSON.stringify({\n kind: doc.kind,\n title: doc.title ?? '',\n pages: doc.pages.map((page) => [\n page.background,\n page.layers.map((layer) => {\n const { zIndex, ...rest } = layer;\n return [zIndex, rest];\n }),\n ]),\n });\n}\n\n/** Painter's order: stable sort by zIndex. */\nexport function layerPaintOrder(layers: readonly DesignLayer[]): DesignLayer[] {\n return [...layers].sort((a, b) => a.zIndex - b.zIndex || a.id.localeCompare(b.id));\n}\n\nexport function replaceLayer(page: DesignPage, layer: DesignLayer): DesignPage {\n return { ...page, layers: page.layers.map((l) => (l.id === layer.id ? layer : l)) };\n}\n\nexport function removeLayer(page: DesignPage, id: string): DesignPage {\n return { ...page, layers: page.layers.filter((l) => l.id !== id) };\n}\n\nexport function addLayer(page: DesignPage, layer: DesignLayer): DesignPage {\n return { ...page, layers: [...page.layers, layer] };\n}\n\nexport function nextZ(page: DesignPage): number {\n return Math.max(0, ...page.layers.map((l) => l.zIndex)) + 1;\n}\n\nexport function bringLayerToFront(page: DesignPage, id: string): DesignPage {\n const top = Math.max(...page.layers.map((l) => l.zIndex), 0);\n return { ...page, layers: page.layers.map((l) => (l.id === id ? { ...l, zIndex: top + 1 } : l)) };\n}\n\nexport function sendLayerToBack(page: DesignPage, id: string): DesignPage {\n const bottom = Math.min(...page.layers.map((l) => l.zIndex), 0);\n return { ...page, layers: page.layers.map((l) => (l.id === id ? { ...l, zIndex: bottom - 1 } : l)) };\n}\n\nexport function duplicateLayer(page: DesignPage, id: string): DesignPage {\n const source = page.layers.find((l) => l.id === id);\n if (!source) return page;\n const copy: DesignLayer = {\n ...source,\n id: newId(source.type),\n x: source.x + 40,\n y: source.y + 40,\n zIndex: nextZ(page),\n };\n return addLayer(page, copy);\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"designCore.js","sources":["../../../src/features/design/designCore.ts"],"sourcesContent":["/**\n * Design document model - the native design studio's persisted contract.\n *\n * Modeled on the IMG.LY CE.SDK starter kits (design editor, t-shirt designer,\n * postcard editor) but implemented as pure data + math so the whole editor\n * ships OTA inside a federated surface: no native design SDK in the binary.\n * The doc rides a surface-index row (`surface: design`) exactly like a canvas\n * board rides `surface: canvas` - `PersistedDesignDoc` version 1 IS the wire\n * shape, and the tests pin fixtures of that JSON so drift fails a test rather\n * than corrupting a saved design.\n *\n * Layer types are deliberately the set the connector-side export can render\n * faithfully (exportDesign.ts): solid shapes (PAD), images (RESIZE+COMPOSE)\n * and text (ANNOTATE). No rotation in v1 - the compose ops cannot rotate an\n * overlay, and an editor that shows what export cannot produce lies.\n */\n\nexport type DesignKind = 'design' | 'tshirt' | 'postcard' | 'carousel';\n\ninterface LayerBase {\n id: string;\n /** Page-space rect (page units, origin top-left). */\n x: number;\n y: number;\n width: number;\n height: number;\n /** 0..1 */\n opacity: number;\n zIndex: number;\n}\n\nexport interface TextLayer extends LayerBase {\n type: 'text';\n text: string;\n fontSize: number;\n color: string;\n bold: boolean;\n align: 'left' | 'center' | 'right';\n}\n\nexport interface ShapeLayer extends LayerBase {\n type: 'shape';\n shape: 'rect' | 'line';\n fill: string;\n cornerRadius: number;\n}\n\nexport interface ImageLayer extends LayerBase {\n type: 'image';\n src: string;\n}\n\nexport type DesignLayer = TextLayer | ShapeLayer | ImageLayer;\n\nexport interface DesignPage {\n id: string;\n name: string;\n width: number;\n height: number;\n /** Page fill; for a t-shirt this is the shirt colour. */\n background: string;\n layers: DesignLayer[];\n}\n\nexport interface PersistedDesignDoc {\n version: 1;\n kind: DesignKind;\n savedAt: number;\n title?: string;\n pages: DesignPage[];\n}\n\n/** Shirt colours the t-shirt designer offers (page.background). */\nexport const TSHIRT_COLORS = ['#ffffff', '#0f172a', '#dc2626', '#2563eb', '#16a34a', '#f59e0b'] as const;\n\n/** Fill / text swatches shared by the style panels. */\nexport const DESIGN_SWATCHES = [\n '#0f172a',\n '#ffffff',\n '#ef4444',\n '#f97316',\n '#facc15',\n '#22c55e',\n '#3b82f6',\n '#8b5cf6',\n '#ec4899',\n] as const;\n\n/**\n * Printable region of a t-shirt page, as fractions of the page rect - the\n * dashed outline the starter kit draws so designers know the safe print zone.\n * Chrome only: guides are never exported.\n */\nexport const TSHIRT_PRINT_AREA = { x: 0.28, y: 0.22, width: 0.44, height: 0.5 } as const;\n\nlet counter = 0;\n/** Test seam: deterministic ids. */\nexport function resetDesignIds(): void {\n counter = 0;\n}\n\nfunction newId(prefix: string): string {\n counter += 1;\n const c = globalThis.crypto as Crypto | undefined;\n if (c?.randomUUID) return `${prefix}-${c.randomUUID().slice(0, 8)}`;\n return `${prefix}-${counter}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Mint a doc id - the row IS its channel, like a canvas board. */\nexport function newDesignChannelId(): string {\n const rand = () => Math.random().toString(36).slice(2, 10);\n try {\n const bytes = new Uint8Array(8);\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n if (bytes.some((b) => b !== 0)) {\n return `design-${Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')}`;\n }\n } catch {\n // fall through to Math.random\n }\n return `design-${rand()}${rand()}`;\n}\n\n/**\n * Template starting points - the three starter kits.\n * Page sizes are pixel canvases at export resolution: square social design,\n * portrait apparel print, 6x4.25\" postcard at ~250dpi.\n */\nexport function newDesignDoc(kind: DesignKind): PersistedDesignDoc {\n if (kind === 'tshirt') {\n return {\n version: 1,\n kind,\n savedAt: 0,\n pages: [\n { id: newId('page'), name: 'Front', width: 1200, height: 1500, background: '#ffffff', layers: [] },\n { id: newId('page'), name: 'Back', width: 1200, height: 1500, background: '#ffffff', layers: [] },\n ],\n };\n }\n if (kind === 'postcard') {\n return {\n version: 1,\n kind,\n savedAt: 0,\n pages: [\n {\n id: newId('page'),\n name: 'Front',\n width: 1500,\n height: 1060,\n background: '#f8fafc',\n layers: [\n {\n ...newTextLayer('Greetings!', 1),\n x: 90,\n y: 90,\n width: 900,\n height: 160,\n fontSize: 120,\n bold: true,\n },\n ],\n },\n { id: newId('page'), name: 'Back', width: 1500, height: 1060, background: '#ffffff', layers: [] },\n ],\n };\n }\n if (kind === 'carousel') {\n // Web carousel studio: three square social slides (not a single design page).\n const slide = (n: number) => ({\n id: newId('page'),\n name: `Slide ${n}`,\n width: 1080,\n height: 1080,\n background: '#ffffff',\n layers: [] as DesignPage['layers'],\n });\n return {\n version: 1,\n kind,\n savedAt: 0,\n title: 'Carousel',\n pages: [slide(1), slide(2), slide(3)],\n };\n }\n return {\n version: 1,\n kind: 'design',\n savedAt: 0,\n pages: [{ id: newId('page'), name: 'Page 1', width: 1080, height: 1080, background: '#ffffff', layers: [] }],\n };\n}\n\nexport function newTextLayer(text: string, zIndex: number): TextLayer {\n return {\n id: newId('text'),\n type: 'text',\n text,\n x: 120,\n y: 120,\n width: 640,\n height: 120,\n fontSize: 72,\n color: '#0f172a',\n bold: false,\n align: 'left',\n opacity: 1,\n zIndex,\n };\n}\n\nexport function newShapeLayer(shape: ShapeLayer['shape'], zIndex: number): ShapeLayer {\n return {\n id: newId('shape'),\n type: 'shape',\n shape,\n x: 140,\n y: 200,\n width: shape === 'line' ? 600 : 420,\n height: shape === 'line' ? 12 : 300,\n fill: '#3b82f6',\n cornerRadius: shape === 'line' ? 6 : 16,\n opacity: 1,\n zIndex,\n };\n}\n\nexport function newImageLayer(src: string, zIndex: number): ImageLayer {\n return { id: newId('image'), type: 'image', src, x: 160, y: 160, width: 640, height: 480, opacity: 1, zIndex };\n}\n\n/** Parse a persisted doc, tolerating the unknown: bad rows drop, not throw. */\nexport function parseDesignDoc(raw: unknown): PersistedDesignDoc | null {\n if (!raw || typeof raw !== 'object') return null;\n const doc = raw as Partial<PersistedDesignDoc>;\n if (doc.version !== 1 || !Array.isArray(doc.pages) || doc.pages.length === 0) return null;\n const kind: DesignKind =\n doc.kind === 'tshirt' || doc.kind === 'postcard' || doc.kind === 'carousel' ? doc.kind : 'design';\n const pages = doc.pages.map((page) => parsePage(page)).filter((page): page is DesignPage => page !== null);\n if (pages.length === 0) return null;\n return {\n version: 1,\n kind,\n savedAt: typeof doc.savedAt === 'number' ? doc.savedAt : 0,\n pages,\n ...(typeof doc.title === 'string' && doc.title ? { title: doc.title } : {}),\n };\n}\n\nfunction parsePage(raw: unknown): DesignPage | null {\n if (!raw || typeof raw !== 'object') return null;\n const page = raw as Partial<DesignPage>;\n if (\n typeof page.id !== 'string' ||\n typeof page.width !== 'number' ||\n typeof page.height !== 'number' ||\n page.width <= 0 ||\n page.height <= 0\n ) {\n return null;\n }\n return {\n id: page.id,\n name: typeof page.name === 'string' && page.name ? page.name : 'Page',\n width: page.width,\n height: page.height,\n background: typeof page.background === 'string' && page.background ? page.background : '#ffffff',\n layers: Array.isArray(page.layers) ? page.layers.filter(isRenderableLayer) : [],\n };\n}\n\n/** A layer the editor and export can both draw. */\nexport function isRenderableLayer(raw: unknown): raw is DesignLayer {\n if (!raw || typeof raw !== 'object') return false;\n const layer = raw as Partial<DesignLayer> & { [key: string]: unknown };\n const baseOk =\n typeof layer.id === 'string' &&\n [layer.x, layer.y, layer.width, layer.height].every((n) => typeof n === 'number' && Number.isFinite(n)) &&\n (layer.width as number) > 0 &&\n (layer.height as number) > 0 &&\n typeof layer.zIndex === 'number';\n if (!baseOk) return false;\n if (layer.type === 'text') return typeof layer.text === 'string' && typeof layer.fontSize === 'number';\n if (layer.type === 'shape') return layer.shape === 'rect' || layer.shape === 'line';\n if (layer.type === 'image')\n return typeof layer.src === 'string' && layer.src.length > 0 && !layer.src.startsWith('blob:');\n return false;\n}\n\n/** State to write to the index - savedAt bumps, title is sticky once set. */\nexport function buildDesignState(doc: PersistedDesignDoc, currentTitle?: string): PersistedDesignDoc {\n return {\n ...doc,\n savedAt: Date.now(),\n ...(currentTitle || doc.title ? { title: currentTitle || doc.title } : {}),\n };\n}\n\n/** Comparable fingerprint of what is worth a write (geometry included - a\n * design IS its layout, unlike a canvas board where geometry is secondary). */\nexport function designSignature(doc: PersistedDesignDoc): string {\n return JSON.stringify({\n kind: doc.kind,\n title: doc.title ?? '',\n pages: doc.pages.map((page) => [\n page.background,\n page.layers.map((layer) => {\n const { zIndex, ...rest } = layer;\n return [zIndex, rest];\n }),\n ]),\n });\n}\n\n/** Painter's order: stable sort by zIndex. */\nexport function layerPaintOrder(layers: readonly DesignLayer[]): DesignLayer[] {\n return [...layers].sort((a, b) => a.zIndex - b.zIndex || a.id.localeCompare(b.id));\n}\n\nexport function replaceLayer(page: DesignPage, layer: DesignLayer): DesignPage {\n return { ...page, layers: page.layers.map((l) => (l.id === layer.id ? layer : l)) };\n}\n\nexport function removeLayer(page: DesignPage, id: string): DesignPage {\n return { ...page, layers: page.layers.filter((l) => l.id !== id) };\n}\n\nexport function addLayer(page: DesignPage, layer: DesignLayer): DesignPage {\n return { ...page, layers: [...page.layers, layer] };\n}\n\nexport function nextZ(page: DesignPage): number {\n return Math.max(0, ...page.layers.map((l) => l.zIndex)) + 1;\n}\n\nexport function bringLayerToFront(page: DesignPage, id: string): DesignPage {\n const top = Math.max(...page.layers.map((l) => l.zIndex), 0);\n return { ...page, layers: page.layers.map((l) => (l.id === id ? { ...l, zIndex: top + 1 } : l)) };\n}\n\nexport function sendLayerToBack(page: DesignPage, id: string): DesignPage {\n const bottom = Math.min(...page.layers.map((l) => l.zIndex), 0);\n return { ...page, layers: page.layers.map((l) => (l.id === id ? { ...l, zIndex: bottom - 1 } : l)) };\n}\n\nexport function duplicateLayer(page: DesignPage, id: string): DesignPage {\n const source = page.layers.find((l) => l.id === id);\n if (!source) return page;\n const copy: DesignLayer = {\n ...source,\n id: newId(source.type),\n x: source.x + 40,\n y: source.y + 40,\n zIndex: nextZ(page),\n };\n return addLayer(page, copy);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -91,55 +91,6 @@ async function fetchMyDesigns(opts) {
|
|
|
91
91
|
error: null
|
|
92
92
|
};
|
|
93
93
|
}
|
|
94
|
-
async function pushDesignDoc(opts) {
|
|
95
|
-
var _a, _b, _c, _d, _e;
|
|
96
|
-
const channelId = (_a = opts.channelId) == null ? void 0 : _a.trim();
|
|
97
|
-
if (!channelId || !opts.url) return false;
|
|
98
|
-
try {
|
|
99
|
-
const response = await fetch(opts.url, {
|
|
100
|
-
method: "POST",
|
|
101
|
-
headers: __spreadValues({
|
|
102
|
-
"content-type": "application/json"
|
|
103
|
-
}, opts.token ? {
|
|
104
|
-
authorization: `Bearer ${opts.token}`
|
|
105
|
-
} : {}),
|
|
106
|
-
body: JSON.stringify({
|
|
107
|
-
query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {
|
|
108
|
-
registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }
|
|
109
|
-
}`,
|
|
110
|
-
variables: {
|
|
111
|
-
input: {
|
|
112
|
-
surface: "design",
|
|
113
|
-
channelId,
|
|
114
|
-
sessionId: channelId,
|
|
115
|
-
title: opts.doc.title || defaultTitle(opts.doc),
|
|
116
|
-
metadata: opts.doc
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
})
|
|
120
|
-
});
|
|
121
|
-
if (!response.ok) return false;
|
|
122
|
-
const payload = await response.json();
|
|
123
|
-
if ((_b = payload == null ? void 0 : payload.errors) == null ? void 0 : _b.length) {
|
|
124
|
-
if (__DEV__) {
|
|
125
|
-
console.warn("[pushDesignDoc]", (_c = payload.errors[0]) == null ? void 0 : _c.message);
|
|
126
|
-
}
|
|
127
|
-
return false;
|
|
128
|
-
}
|
|
129
|
-
return Boolean((_e = (_d = payload == null ? void 0 : payload.data) == null ? void 0 : _d.registerSurfaceChannel) == null ? void 0 : _e.id);
|
|
130
|
-
} catch (err) {
|
|
131
|
-
if (__DEV__) {
|
|
132
|
-
console.warn("[pushDesignDoc] failed:", err);
|
|
133
|
-
}
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
function defaultTitle(doc) {
|
|
138
|
-
if (doc.kind === "tshirt") return "T-shirt design";
|
|
139
|
-
if (doc.kind === "postcard") return "Postcard";
|
|
140
|
-
if (doc.kind === "carousel") return "Carousel";
|
|
141
|
-
return "Untitled design";
|
|
142
|
-
}
|
|
143
94
|
function coerceMetadata(value) {
|
|
144
95
|
if (typeof value !== "string") return value;
|
|
145
96
|
try {
|
|
@@ -147,4 +98,4 @@ function coerceMetadata(value) {
|
|
|
147
98
|
} catch (e) {
|
|
148
99
|
return null;
|
|
149
100
|
}
|
|
150
|
-
}export{
|
|
101
|
+
}export{fetchMyDesigns};//# sourceMappingURL=designIndex.js.map
|