@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":"designIndex.js","sources":["../../../src/features/design/designIndex.ts"],"sourcesContent":["/**\n * Surface-index reader/writer for design documents.\n *\n * Same store and wire shape as the canvas boards (`surfaceIndex.ts`), under\n * the index's `design` surface namespace - `SurfaceType` already enumerates\n * it, so designs and canvases stay separate per-user collections with no\n * backend change. The whole `PersistedDesignDoc` rides the row's `metadata`\n * and is REPLACED wholesale on every write; never send a patch.\n */\nimport { parseDesignDoc, type PersistedDesignDoc } from './designCore';\n\nconst CHANNEL_FIELDS = 'id surface channelId title metadata updatedAt';\n\nexport interface DesignDocSummary {\n channelId: string;\n title?: string;\n savedAt: number;\n doc: PersistedDesignDoc;\n}\n\nexport interface FetchDesignsResult {\n designs: DesignDocSummary[];\n /** Plain sentence for the UI; null when the read succeeded. */\n error: string | null;\n}\n\n/** The caller's designs, newest first. Unparseable rows drop silently. */\nexport async function fetchMyDesigns(opts: {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}): Promise<FetchDesignsResult> {\n if (!opts.url) return { designs: [], error: 'No design index configured for this build.' };\n\n let payload: {\n data?: { mySurfaceChannels?: Array<Record<string, unknown>> | null } | null;\n errors?: Array<{ message?: string }>;\n };\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `query MySurfaceChannels($surface: SurfaceType) {\n mySurfaceChannels(surface: $surface) { ${CHANNEL_FIELDS} }\n }`,\n variables: { surface: 'design' },\n }),\n signal: opts.signal,\n });\n if (response.status === 401 || response.status === 403) {\n return { designs: [], error: 'Your session expired. Sign in again to see your designs.' };\n }\n if (!response.ok) {\n return { designs: [], error: `The design index is unreachable (HTTP ${response.status}).` };\n }\n payload = await response.json();\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return { designs: [], error: null };\n return { designs: [], error: 'Could not reach the design index. Check your connection.' };\n }\n\n if (payload?.errors?.length) {\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n designs: [],\n error: isAuth\n ? 'Your session expired. Sign in again to see your designs.'\n : raw || 'The design index rejected the request.',\n };\n }\n\n const designs: DesignDocSummary[] = [];\n for (const row of payload?.data?.mySurfaceChannels ?? []) {\n const channelId = typeof row?.channelId === 'string' ? row.channelId : '';\n if (!channelId) continue;\n const doc = parseDesignDoc(coerceMetadata(row?.metadata));\n if (!doc) continue;\n const title = typeof row?.title === 'string' ? row.title : undefined;\n designs.push({ channelId, title: doc.title || title, savedAt: doc.savedAt, doc });\n }\n designs.sort((a, b) => b.savedAt - a.savedAt);\n return { designs, error: null };\n}\n\n/** Write one design to the index (idempotent upsert). Never throws. */\nexport async function pushDesignDoc(opts: {\n url: string;\n token?: string | null;\n channelId: string;\n doc: PersistedDesignDoc;\n}): Promise<boolean> {\n const channelId = opts.channelId?.trim();\n if (!channelId || !opts.url) return false;\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n variables: {\n input: {\n surface: 'design',\n channelId,\n sessionId: channelId,\n title: opts.doc.title || defaultTitle(opts.doc),\n metadata: opts.doc,\n },\n },\n }),\n });\n if (!response.ok) return false;\n const payload = (await response.json()) as {\n data?: { registerSurfaceChannel?: { id?: string } | null };\n errors?: Array<{ message?: string }>;\n };\n if (payload?.errors?.length) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushDesignDoc]', payload.errors[0]?.message);\n }\n return false;\n }\n return Boolean(payload?.data?.registerSurfaceChannel?.id);\n } catch (err) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushDesignDoc] failed:', err);\n }\n return false;\n }\n}\n\nexport function defaultTitle(doc: PersistedDesignDoc): string {\n if (doc.kind === 'tshirt') return 'T-shirt design';\n if (doc.kind === 'postcard') return 'Postcard';\n if (doc.kind === 'carousel') return 'Carousel';\n return 'Untitled design';\n}\n\nfunction coerceMetadata(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"designIndex.js","sources":["../../../src/features/design/designIndex.ts"],"sourcesContent":["/**\n * Surface-index reader/writer for design documents.\n *\n * Same store and wire shape as the canvas boards (`surfaceIndex.ts`), under\n * the index's `design` surface namespace - `SurfaceType` already enumerates\n * it, so designs and canvases stay separate per-user collections with no\n * backend change. The whole `PersistedDesignDoc` rides the row's `metadata`\n * and is REPLACED wholesale on every write; never send a patch.\n */\nimport { parseDesignDoc, type PersistedDesignDoc } from './designCore';\n\nconst CHANNEL_FIELDS = 'id surface channelId title metadata updatedAt';\n\nexport interface DesignDocSummary {\n channelId: string;\n title?: string;\n savedAt: number;\n doc: PersistedDesignDoc;\n}\n\nexport interface FetchDesignsResult {\n designs: DesignDocSummary[];\n /** Plain sentence for the UI; null when the read succeeded. */\n error: string | null;\n}\n\n/** The caller's designs, newest first. Unparseable rows drop silently. */\nexport async function fetchMyDesigns(opts: {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}): Promise<FetchDesignsResult> {\n if (!opts.url) return { designs: [], error: 'No design index configured for this build.' };\n\n let payload: {\n data?: { mySurfaceChannels?: Array<Record<string, unknown>> | null } | null;\n errors?: Array<{ message?: string }>;\n };\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `query MySurfaceChannels($surface: SurfaceType) {\n mySurfaceChannels(surface: $surface) { ${CHANNEL_FIELDS} }\n }`,\n variables: { surface: 'design' },\n }),\n signal: opts.signal,\n });\n if (response.status === 401 || response.status === 403) {\n return { designs: [], error: 'Your session expired. Sign in again to see your designs.' };\n }\n if (!response.ok) {\n return { designs: [], error: `The design index is unreachable (HTTP ${response.status}).` };\n }\n payload = await response.json();\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return { designs: [], error: null };\n return { designs: [], error: 'Could not reach the design index. Check your connection.' };\n }\n\n if (payload?.errors?.length) {\n const raw = payload.errors[0]?.message || '';\n const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);\n return {\n designs: [],\n error: isAuth\n ? 'Your session expired. Sign in again to see your designs.'\n : raw || 'The design index rejected the request.',\n };\n }\n\n const designs: DesignDocSummary[] = [];\n for (const row of payload?.data?.mySurfaceChannels ?? []) {\n const channelId = typeof row?.channelId === 'string' ? row.channelId : '';\n if (!channelId) continue;\n const doc = parseDesignDoc(coerceMetadata(row?.metadata));\n if (!doc) continue;\n const title = typeof row?.title === 'string' ? row.title : undefined;\n designs.push({ channelId, title: doc.title || title, savedAt: doc.savedAt, doc });\n }\n designs.sort((a, b) => b.savedAt - a.savedAt);\n return { designs, error: null };\n}\n\n/** Write one design to the index (idempotent upsert). Never throws. */\nexport async function pushDesignDoc(opts: {\n url: string;\n token?: string | null;\n channelId: string;\n doc: PersistedDesignDoc;\n}): Promise<boolean> {\n const channelId = opts.channelId?.trim();\n if (!channelId || !opts.url) return false;\n try {\n const response = await fetch(opts.url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n ...(opts.token ? { authorization: `Bearer ${opts.token}` } : {}),\n },\n body: JSON.stringify({\n query: `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${CHANNEL_FIELDS} }\n }`,\n variables: {\n input: {\n surface: 'design',\n channelId,\n sessionId: channelId,\n title: opts.doc.title || defaultTitle(opts.doc),\n metadata: opts.doc,\n },\n },\n }),\n });\n if (!response.ok) return false;\n const payload = (await response.json()) as {\n data?: { registerSurfaceChannel?: { id?: string } | null };\n errors?: Array<{ message?: string }>;\n };\n if (payload?.errors?.length) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushDesignDoc]', payload.errors[0]?.message);\n }\n return false;\n }\n return Boolean(payload?.data?.registerSurfaceChannel?.id);\n } catch (err) {\n if (__DEV__) {\n // eslint-disable-next-line no-console\n console.warn('[pushDesignDoc] failed:', err);\n }\n return false;\n }\n}\n\nexport function defaultTitle(doc: PersistedDesignDoc): string {\n if (doc.kind === 'tshirt') return 'T-shirt design';\n if (doc.kind === 'postcard') return 'Postcard';\n if (doc.kind === 'carousel') return 'Carousel';\n return 'Untitled design';\n}\n\nfunction coerceMetadata(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import {defaultPageName,newPageId,newLayerId}from'./types.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
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 CAROUSEL_CONNECTOR = "yantra-carousel";
|
|
33
|
+
const CAROUSEL_ACTIONS = {
|
|
34
|
+
BUILD_OUTLINE: "YANTRA_CAROUSEL_BUILD_OUTLINE",
|
|
35
|
+
BUILD_DESIGN: "YANTRA_CAROUSEL_BUILD_DESIGN",
|
|
36
|
+
BUILD_FLYER: "YANTRA_CAROUSEL_BUILD_FLYER",
|
|
37
|
+
EDIT_PAGE: "YANTRA_CAROUSEL_EDIT_PAGE",
|
|
38
|
+
GENERATE_PAGE: "YANTRA_CAROUSEL_GENERATE_PAGE"
|
|
39
|
+
};
|
|
40
|
+
const NO_TEXT_SUFFIX = " Absolutely no text, words, letters, numbers, captions, or typography anywhere in the image.";
|
|
41
|
+
function unwrapConnectorResult(result) {
|
|
42
|
+
var _a;
|
|
43
|
+
if (result.successful === false) throw new Error(result.error || "The design assistant failed");
|
|
44
|
+
const data = (_a = result.data) != null ? _a : result;
|
|
45
|
+
if (data.success === false) throw new Error(data.error || "The design assistant failed");
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
function deckBrief(input, doc) {
|
|
49
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
50
|
+
return __spreadValues({
|
|
51
|
+
platform: ((_a = doc.brief) == null ? void 0 : _a.platform) || "Instagram",
|
|
52
|
+
format: doc.aspectRatio || ((_b = doc.brief) == null ? void 0 : _b.format) || "4:5",
|
|
53
|
+
pageCount: Math.max(1, Math.min(20, Math.round(input.pageCount))),
|
|
54
|
+
topic: input.topic.trim(),
|
|
55
|
+
audience: ((_c = input.audience) == null ? void 0 : _c.trim()) || ((_d = doc.brief) == null ? void 0 : _d.audience) || "a general audience",
|
|
56
|
+
tone: ((_e = input.tone) == null ? void 0 : _e.trim()) || ((_f = doc.brief) == null ? void 0 : _f.tone) || "Professional"
|
|
57
|
+
}, ((_g = doc.brief) == null ? void 0 : _g.brandGuidelines) ? {
|
|
58
|
+
brandGuidelines: doc.brief.brandGuidelines
|
|
59
|
+
} : {});
|
|
60
|
+
}
|
|
61
|
+
function isPrintDoc(doc) {
|
|
62
|
+
var _a, _b;
|
|
63
|
+
return Boolean(doc.print) || /print/i.test((_b = (_a = doc.brief) == null ? void 0 : _a.platform) != null ? _b : "");
|
|
64
|
+
}
|
|
65
|
+
function designToPages(design, startIndex = 0) {
|
|
66
|
+
return design.pages.map((page, i) => {
|
|
67
|
+
var _a, _b;
|
|
68
|
+
return {
|
|
69
|
+
id: newPageId(),
|
|
70
|
+
name: defaultPageName(page.role, startIndex + i),
|
|
71
|
+
prompt: "",
|
|
72
|
+
src: null,
|
|
73
|
+
status: "ready",
|
|
74
|
+
role: page.role,
|
|
75
|
+
background: __spreadValues(__spreadValues({}, page.background), ((_a = page.background) == null ? void 0 : _a.kind) === "image" ? {
|
|
76
|
+
src: null,
|
|
77
|
+
imageStatus: "empty"
|
|
78
|
+
} : {}),
|
|
79
|
+
layers: ((_b = page.layers) != null ? _b : []).map((layer) => {
|
|
80
|
+
const copy = JSON.parse(JSON.stringify(layer));
|
|
81
|
+
return __spreadValues(__spreadProps(__spreadValues({}, copy), {
|
|
82
|
+
id: newLayerId()
|
|
83
|
+
}), copy.kind === "image" ? {
|
|
84
|
+
src: null,
|
|
85
|
+
imageStatus: "empty",
|
|
86
|
+
uploaded: false
|
|
87
|
+
} : {});
|
|
88
|
+
})
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function toConnectorPage(page, index, total) {
|
|
93
|
+
var _a, _b, _d;
|
|
94
|
+
const role = (_a = page.role) != null ? _a : index === 0 ? "cover" : index === total - 1 ? "cta" : "content";
|
|
95
|
+
const _c = (_b = page.background) != null ? _b : {
|
|
96
|
+
kind: "color",
|
|
97
|
+
color: "#ffffff"
|
|
98
|
+
}, {
|
|
99
|
+
src: _src,
|
|
100
|
+
imageStatus: _status
|
|
101
|
+
} = _c, background = __objRest(_c, [
|
|
102
|
+
"src",
|
|
103
|
+
"imageStatus"
|
|
104
|
+
]);
|
|
105
|
+
return {
|
|
106
|
+
role,
|
|
107
|
+
background,
|
|
108
|
+
layers: ((_d = page.layers) != null ? _d : []).map((layer) => {
|
|
109
|
+
const _a2 = layer, {
|
|
110
|
+
id: _id
|
|
111
|
+
} = _a2, rest = __objRest(_a2, [
|
|
112
|
+
"id"
|
|
113
|
+
]);
|
|
114
|
+
const out = __spreadValues({}, rest);
|
|
115
|
+
delete out.src;
|
|
116
|
+
delete out.imageStatus;
|
|
117
|
+
return out;
|
|
118
|
+
})
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function mergeEditedPage(page, edited) {
|
|
122
|
+
var _a, _b, _c, _d, _e;
|
|
123
|
+
const painted = ((_a = page.layers) != null ? _a : []).filter((l) => l.kind === "image" && l.src);
|
|
124
|
+
const layers = ((_b = edited.layers) != null ? _b : []).map((raw) => {
|
|
125
|
+
var _a2;
|
|
126
|
+
const l = JSON.parse(JSON.stringify(raw));
|
|
127
|
+
if (l.kind === "image") {
|
|
128
|
+
const prompt = ((_a2 = l.prompt) != null ? _a2 : "").trim();
|
|
129
|
+
const match = painted.find((p) => {
|
|
130
|
+
var _a3;
|
|
131
|
+
return ((_a3 = p.prompt) != null ? _a3 : "").trim() === prompt && prompt;
|
|
132
|
+
});
|
|
133
|
+
return match ? __spreadProps(__spreadValues({}, l), {
|
|
134
|
+
id: newLayerId(),
|
|
135
|
+
src: match.src,
|
|
136
|
+
imageStatus: "ready"
|
|
137
|
+
}) : __spreadProps(__spreadValues({}, l), {
|
|
138
|
+
id: newLayerId(),
|
|
139
|
+
src: null,
|
|
140
|
+
imageStatus: "empty"
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return __spreadProps(__spreadValues({}, l), {
|
|
144
|
+
id: newLayerId()
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
let background = __spreadValues({}, edited.background);
|
|
148
|
+
if (((_c = edited.background) == null ? void 0 : _c.kind) === "image" && edited.background.imagePrompt) {
|
|
149
|
+
const prev = page.background;
|
|
150
|
+
const same = (prev == null ? void 0 : prev.kind) === "image" && !!prev.src && ((_d = prev.imagePrompt) == null ? void 0 : _d.trim()) === edited.background.imagePrompt.trim();
|
|
151
|
+
background = same ? __spreadProps(__spreadValues({}, edited.background), {
|
|
152
|
+
src: prev.src,
|
|
153
|
+
imageStatus: "ready"
|
|
154
|
+
}) : __spreadProps(__spreadValues({}, edited.background), {
|
|
155
|
+
src: null,
|
|
156
|
+
imageStatus: "empty"
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
return __spreadProps(__spreadValues({}, page), {
|
|
160
|
+
role: (_e = edited.role) != null ? _e : page.role,
|
|
161
|
+
background,
|
|
162
|
+
layers
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
function designOf(data, what) {
|
|
166
|
+
const design = data.design;
|
|
167
|
+
if (!design || !Array.isArray(design.pages) || design.pages.length === 0) throw new Error(`The design assistant returned no ${what}`);
|
|
168
|
+
return design;
|
|
169
|
+
}
|
|
170
|
+
async function buildDeck(run, brief, aspectRatio) {
|
|
171
|
+
let outlineMarkdown;
|
|
172
|
+
try {
|
|
173
|
+
const outline = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_OUTLINE, __spreadValues({}, brief), 6e4));
|
|
174
|
+
outlineMarkdown = outline.outlineMarkdown || void 0;
|
|
175
|
+
} catch (e) {
|
|
176
|
+
outlineMarkdown = void 0;
|
|
177
|
+
}
|
|
178
|
+
const data = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_DESIGN, __spreadProps(__spreadValues({
|
|
179
|
+
brief: __spreadValues({}, brief)
|
|
180
|
+
}, outlineMarkdown ? {
|
|
181
|
+
outlineMarkdown
|
|
182
|
+
} : {}), {
|
|
183
|
+
aspectRatio
|
|
184
|
+
}), 12e4));
|
|
185
|
+
return designOf(data, "pages");
|
|
186
|
+
}
|
|
187
|
+
async function buildFlyer(run, brief, fontPair) {
|
|
188
|
+
const data = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_FLYER, {
|
|
189
|
+
brief: __spreadValues({}, brief)
|
|
190
|
+
}, 24e4));
|
|
191
|
+
const design = designOf(data, "flyer");
|
|
192
|
+
return __spreadValues(__spreadProps(__spreadValues({}, design), {
|
|
193
|
+
pages: design.pages.slice(0, 1)
|
|
194
|
+
}), {});
|
|
195
|
+
}
|
|
196
|
+
async function editPage(run, input) {
|
|
197
|
+
const data = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.EDIT_PAGE, __spreadProps(__spreadValues(__spreadValues({
|
|
198
|
+
instruction: input.instruction,
|
|
199
|
+
page: input.page
|
|
200
|
+
}, input.palette ? {
|
|
201
|
+
palette: input.palette
|
|
202
|
+
} : {}), input.fontPair ? {
|
|
203
|
+
fontPair: input.fontPair
|
|
204
|
+
} : {}), {
|
|
205
|
+
aspectRatio: input.aspectRatio
|
|
206
|
+
}), 12e4));
|
|
207
|
+
const page = data.page;
|
|
208
|
+
if (!page || !Array.isArray(page.layers)) throw new Error("The design assistant returned no edited page");
|
|
209
|
+
return page;
|
|
210
|
+
}
|
|
211
|
+
async function paintPicture(run, input) {
|
|
212
|
+
var _a;
|
|
213
|
+
const data = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.GENERATE_PAGE, {
|
|
214
|
+
prompt: `${input.prompt}${NO_TEXT_SUFFIX}`,
|
|
215
|
+
pageIndex: input.pageIndex,
|
|
216
|
+
totalPages: input.totalPages,
|
|
217
|
+
aspectRatio: input.aspectRatio,
|
|
218
|
+
skipCarouselPrefix: true
|
|
219
|
+
}, 24e4));
|
|
220
|
+
const images = (_a = data.images) != null ? _a : [];
|
|
221
|
+
const inline = images.find((im) => im.dataBase64);
|
|
222
|
+
if (inline == null ? void 0 : inline.dataBase64) return {
|
|
223
|
+
dataBase64: inline.dataBase64,
|
|
224
|
+
mimeType: inline.mimeType || "image/png"
|
|
225
|
+
};
|
|
226
|
+
const remote = images.find((im) => im.url);
|
|
227
|
+
if (remote == null ? void 0 : remote.url) return {
|
|
228
|
+
url: remote.url,
|
|
229
|
+
mimeType: remote.mimeType || "image/png"
|
|
230
|
+
};
|
|
231
|
+
throw new Error("No picture came back");
|
|
232
|
+
}
|
|
233
|
+
function picturesToPaint(page) {
|
|
234
|
+
var _a, _b, _c;
|
|
235
|
+
const out = [];
|
|
236
|
+
if (((_a = page.background) == null ? void 0 : _a.kind) === "image" && page.background.imagePrompt && !page.background.src) out.push({
|
|
237
|
+
target: "background"
|
|
238
|
+
});
|
|
239
|
+
for (const l of (_b = page.layers) != null ? _b : []) {
|
|
240
|
+
if (l.kind === "image" && !l.src && ((_c = l.prompt) == null ? void 0 : _c.trim())) out.push({
|
|
241
|
+
target: "layer",
|
|
242
|
+
layerId: l.id,
|
|
243
|
+
prompt: l.prompt
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
return out;
|
|
247
|
+
}export{CAROUSEL_ACTIONS,CAROUSEL_CONNECTOR,NO_TEXT_SUFFIX,buildDeck,buildFlyer,deckBrief,designToPages,editPage,isPrintDoc,mergeEditedPage,paintPicture,picturesToPaint,toConnectorPage,unwrapConnectorResult};//# sourceMappingURL=aiDesign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiDesign.js","sources":["../../../../src/features/design/doc/aiDesign.ts"],"sourcesContent":["/**\n * Designing with AI - native twin of the web Design Studio's wizard and chat\n * (state.tsx `startFromBrief` / `startFromFlyerBrief` / `editPageWithAI`, and\n * rpc/carouselRpc.ts): the `yantra-carousel` connector's actions, the same\n * params, the same result shapes.\n *\n * brief -> BUILD_OUTLINE -> BUILD_DESIGN (a deck) -> pages inserted\n * brief -> BUILD_FLYER (print) -> one page inserted\n * \"Edit this page\" -> EDIT_PAGE -> the page's layers replaced\n *\n * Image layers come back as text-free prompts; GENERATE_PAGE paints each one\n * afterwards (the caller hosts the bytes).\n *\n * Pure apart from the injected transport: runs under jest as-is.\n */\nimport {\n defaultPageName,\n newLayerId,\n newPageId,\n type DesignBackground,\n type DesignBrief,\n type DesignDoc,\n type DesignFontPair,\n type DesignPage,\n type DesignPalette,\n type EditorLayer,\n type PageBackground,\n} from './types';\n\nexport const CAROUSEL_CONNECTOR = 'yantra-carousel';\n\nexport const CAROUSEL_ACTIONS = {\n BUILD_OUTLINE: 'YANTRA_CAROUSEL_BUILD_OUTLINE',\n BUILD_DESIGN: 'YANTRA_CAROUSEL_BUILD_DESIGN',\n BUILD_FLYER: 'YANTRA_CAROUSEL_BUILD_FLYER',\n EDIT_PAGE: 'YANTRA_CAROUSEL_EDIT_PAGE',\n GENERATE_PAGE: 'YANTRA_CAROUSEL_GENERATE_PAGE',\n} as const;\n\n/** Web state.tsx NO_TEXT_SUFFIX: picture prompts must never paint words. */\nexport const NO_TEXT_SUFFIX =\n ' Absolutely no text, words, letters, numbers, captions, or typography anywhere in the image.';\n\n/** One connector call: action, params, and how long the agent may take. */\nexport type RunCarousel = (\n action: string,\n params: Record<string, unknown>,\n timeoutMs: number,\n) => Promise<Record<string, unknown>>;\n\n/** A connector page: what BUILD_DESIGN / BUILD_FLYER / EDIT_PAGE return per page. */\nexport interface ConnectorPage {\n role: 'cover' | 'content' | 'cta';\n background: DesignBackground;\n layers: Array<Record<string, unknown> & { kind: EditorLayer['kind'] }>;\n}\n\nexport interface ConnectorDesign {\n palette: DesignPalette;\n fontPair: DesignFontPair;\n pages: ConnectorPage[];\n}\n\n/** connector-run wraps results as { successful, data } in some agent versions and bare in others. */\nexport function unwrapConnectorResult(result: Record<string, unknown>): Record<string, unknown> {\n if (result.successful === false) throw new Error((result.error as string) || 'The design assistant failed');\n const data = (result.data ?? result) as Record<string, unknown>;\n if (data.success === false) throw new Error((data.error as string) || 'The design assistant failed');\n return data;\n}\n\n/** A deck brief from what the person typed and the design they are in. */\nexport function deckBrief(\n input: { topic: string; pageCount: number; audience?: string; tone?: string },\n doc: DesignDoc,\n): DesignBrief {\n return {\n platform: doc.brief?.platform || 'Instagram',\n format: doc.aspectRatio || doc.brief?.format || '4:5',\n pageCount: Math.max(1, Math.min(20, Math.round(input.pageCount))),\n topic: input.topic.trim(),\n audience: input.audience?.trim() || doc.brief?.audience || 'a general audience',\n tone: input.tone?.trim() || doc.brief?.tone || 'Professional',\n ...(doc.brief?.brandGuidelines ? { brandGuidelines: doc.brief.brandGuidelines } : {}),\n };\n}\n\n/** Is this a printed piece (one page, the flyer action) rather than a deck? */\nexport function isPrintDoc(doc: Pick<DesignDoc, 'print' | 'brief'>): boolean {\n return Boolean(doc.print) || /print/i.test(doc.brief?.platform ?? '');\n}\n\n/**\n * Connector pages as editor pages (web `designToPages`): fresh ids, chart\n * arrays cloned, image layers empty until painted.\n */\nexport function designToPages(design: Pick<ConnectorDesign, 'pages'>, startIndex = 0): DesignPage[] {\n return design.pages.map((page, i) => ({\n id: newPageId(),\n name: defaultPageName(page.role, startIndex + i),\n prompt: '',\n src: null,\n status: 'ready' as const,\n role: page.role,\n background: {\n ...page.background,\n ...(page.background?.kind === 'image' ? { src: null, imageStatus: 'empty' as const } : {}),\n } as PageBackground,\n layers: (page.layers ?? []).map((layer) => {\n const copy = JSON.parse(JSON.stringify(layer)) as EditorLayer;\n return {\n ...copy,\n id: newLayerId(),\n ...(copy.kind === 'image' ? { src: null, imageStatus: 'empty' as const, uploaded: false } : {}),\n } as EditorLayer;\n }),\n }));\n}\n\n/** The page as the connector reads it: no ids, no hosted pictures (web editPageWithAI). */\nexport function toConnectorPage(page: DesignPage, index: number, total: number): ConnectorPage {\n const role = page.role ?? (index === 0 ? 'cover' : index === total - 1 ? 'cta' : 'content');\n const {\n src: _src,\n imageStatus: _status,\n ...background\n } = page.background ?? { kind: 'color' as const, color: '#ffffff' };\n return {\n role,\n background: background as DesignBackground,\n layers: (page.layers ?? []).map((layer) => {\n const { id: _id, ...rest } = layer as EditorLayer & { src?: unknown; imageStatus?: unknown };\n const out = { ...rest } as Record<string, unknown> & { kind: EditorLayer['kind'] };\n delete out.src;\n delete out.imageStatus;\n return out;\n }),\n };\n}\n\n/**\n * An edited connector page merged onto the old one: a picture whose prompt did\n * not change keeps its painted source, so an edit never pays to repaint it.\n */\nexport function mergeEditedPage(page: DesignPage, edited: ConnectorPage): DesignPage {\n const painted = (page.layers ?? []).filter((l) => l.kind === 'image' && l.src) as Array<\n Extract<EditorLayer, { kind: 'image' }>\n >;\n const layers: EditorLayer[] = (edited.layers ?? []).map((raw) => {\n const l = JSON.parse(JSON.stringify(raw)) as EditorLayer;\n if (l.kind === 'image') {\n const prompt = (l.prompt ?? '').trim();\n const match = painted.find((p) => (p.prompt ?? '').trim() === prompt && prompt);\n return match\n ? { ...l, id: newLayerId(), src: match.src, imageStatus: 'ready' as const }\n : { ...l, id: newLayerId(), src: null, imageStatus: 'empty' as const };\n }\n return { ...l, id: newLayerId() } as EditorLayer;\n });\n let background: PageBackground = { ...edited.background };\n if (edited.background?.kind === 'image' && edited.background.imagePrompt) {\n const prev = page.background;\n const same =\n prev?.kind === 'image' && !!prev.src && prev.imagePrompt?.trim() === edited.background.imagePrompt.trim();\n background = same\n ? { ...edited.background, src: prev!.src, imageStatus: 'ready' }\n : { ...edited.background, src: null, imageStatus: 'empty' };\n }\n return { ...page, role: edited.role ?? page.role, background, layers };\n}\n\nfunction designOf(data: Record<string, unknown>, what: string): ConnectorDesign {\n const design = data.design as ConnectorDesign | undefined;\n if (!design || !Array.isArray(design.pages) || design.pages.length === 0)\n throw new Error(`The design assistant returned no ${what}`);\n return design;\n}\n\n/** Brief -> outline -> layered deck. The outline is best-effort, as on web. */\nexport async function buildDeck(run: RunCarousel, brief: DesignBrief, aspectRatio: string): Promise<ConnectorDesign> {\n let outlineMarkdown: string | undefined;\n try {\n const outline = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_OUTLINE, { ...brief }, 60_000));\n outlineMarkdown = (outline.outlineMarkdown as string) || undefined;\n } catch {\n outlineMarkdown = undefined;\n }\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.BUILD_DESIGN,\n { brief: { ...brief }, ...(outlineMarkdown ? { outlineMarkdown } : {}), aspectRatio },\n 120_000,\n ),\n );\n return designOf(data, 'pages');\n}\n\nexport interface FlyerInput {\n title: string;\n headline?: string;\n tagline?: string;\n body?: string;\n tone?: string;\n format?: string;\n}\n\n/** A print brief -> one designed page (BUILD_FLYER). */\nexport async function buildFlyer(\n run: RunCarousel,\n brief: FlyerInput,\n fontPair?: DesignFontPair,\n): Promise<ConnectorDesign> {\n const data = unwrapConnectorResult(await run(CAROUSEL_ACTIONS.BUILD_FLYER, { brief: { ...brief } }, 240_000));\n const design = designOf(data, 'flyer');\n return { ...design, pages: design.pages.slice(0, 1), ...(fontPair ? { fontPair } : {}) };\n}\n\n/** A natural-language edit of one page (EDIT_PAGE). */\nexport async function editPage(\n run: RunCarousel,\n input: {\n instruction: string;\n page: ConnectorPage;\n palette?: DesignPalette;\n fontPair?: DesignFontPair;\n aspectRatio: string;\n },\n): Promise<ConnectorPage> {\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.EDIT_PAGE,\n {\n instruction: input.instruction,\n page: input.page,\n ...(input.palette ? { palette: input.palette } : {}),\n ...(input.fontPair ? { fontPair: input.fontPair } : {}),\n aspectRatio: input.aspectRatio,\n },\n 120_000,\n ),\n );\n const page = data.page as ConnectorPage | undefined;\n if (!page || !Array.isArray(page.layers)) throw new Error('The design assistant returned no edited page');\n return page;\n}\n\n/** One picture for a prompt: inline base64 or a stored URL, whichever the agent returned. */\nexport async function paintPicture(\n run: RunCarousel,\n input: { prompt: string; pageIndex: number; totalPages: number; aspectRatio: string },\n): Promise<{ dataBase64?: string; url?: string; mimeType: string }> {\n const data = unwrapConnectorResult(\n await run(\n CAROUSEL_ACTIONS.GENERATE_PAGE,\n {\n prompt: `${input.prompt}${NO_TEXT_SUFFIX}`,\n pageIndex: input.pageIndex,\n totalPages: input.totalPages,\n aspectRatio: input.aspectRatio,\n skipCarouselPrefix: true,\n },\n 240_000,\n ),\n );\n const images = (data.images as Array<{ dataBase64?: string; url?: string; mimeType?: string }> | undefined) ?? [];\n const inline = images.find((im) => im.dataBase64);\n if (inline?.dataBase64) return { dataBase64: inline.dataBase64, mimeType: inline.mimeType || 'image/png' };\n const remote = images.find((im) => im.url);\n if (remote?.url) return { url: remote.url, mimeType: remote.mimeType || 'image/png' };\n throw new Error('No picture came back');\n}\n\n/** Every picture a page still needs painted: its image background, then image layers without a source. */\nexport function picturesToPaint(\n page: DesignPage,\n): Array<{ target: 'background' } | { target: 'layer'; layerId: string; prompt: string }> {\n const out: Array<{ target: 'background' } | { target: 'layer'; layerId: string; prompt: string }> = [];\n if (page.background?.kind === 'image' && page.background.imagePrompt && !page.background.src)\n out.push({ target: 'background' });\n for (const l of page.layers ?? []) {\n if (l.kind === 'image' && !l.src && l.prompt?.trim())\n out.push({ target: 'layer', layerId: l.id, prompt: l.prompt });\n }\n return out;\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import {artifactTitle}from'./types.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const DESIGN_KINDS = ["deck", "flyer"];
|
|
21
|
+
function uuid() {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const bytes = new Uint8Array(16);
|
|
24
|
+
let filled = false;
|
|
25
|
+
try {
|
|
26
|
+
(_b = (_a = globalThis.crypto) == null ? void 0 : _a.getRandomValues) == null ? void 0 : _b.call(_a, bytes);
|
|
27
|
+
filled = bytes.some((b) => b !== 0);
|
|
28
|
+
} catch (e) {
|
|
29
|
+
filled = false;
|
|
30
|
+
}
|
|
31
|
+
if (!filled) for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);
|
|
32
|
+
bytes[6] = bytes[6] & 15 | 64;
|
|
33
|
+
bytes[8] = bytes[8] & 63 | 128;
|
|
34
|
+
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
35
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
36
|
+
}
|
|
37
|
+
function newArtifactId(kind) {
|
|
38
|
+
return `${kind}:${uuid()}`;
|
|
39
|
+
}
|
|
40
|
+
function isDesignArtifactId(id) {
|
|
41
|
+
return typeof id === "string" && /^(deck|flyer):[0-9A-Za-z-]{8,}$/.test(id.trim());
|
|
42
|
+
}
|
|
43
|
+
function isDocArtifactId(id) {
|
|
44
|
+
return typeof id === "string" && /^doc:[0-9A-Za-z-]{8,}$/.test(id.trim());
|
|
45
|
+
}
|
|
46
|
+
const stripDataUrl = (src) => src && !src.startsWith("data:") ? src : null;
|
|
47
|
+
function slimDoc(doc) {
|
|
48
|
+
const hosted = (src) => {
|
|
49
|
+
const kept = stripDataUrl(src);
|
|
50
|
+
return kept && !/^(file|ph|assets-library|content):/i.test(kept) ? kept : null;
|
|
51
|
+
};
|
|
52
|
+
return __spreadProps(__spreadValues({}, doc), {
|
|
53
|
+
brandKit: doc.brandKit ? __spreadProps(__spreadValues({}, doc.brandKit), {
|
|
54
|
+
logos: doc.brandKit.logos.filter((l) => !l.startsWith("data:"))
|
|
55
|
+
}) : void 0,
|
|
56
|
+
pages: doc.pages.map((p) => {
|
|
57
|
+
var _a;
|
|
58
|
+
return __spreadProps(__spreadValues({}, p), {
|
|
59
|
+
dataBase64: void 0,
|
|
60
|
+
src: hosted(p.src),
|
|
61
|
+
status: p.status === "generating" ? "empty" : p.src && p.src.startsWith("data:") ? "empty" : p.status,
|
|
62
|
+
background: p.background ? __spreadProps(__spreadValues({}, p.background), {
|
|
63
|
+
src: hosted(p.background.src),
|
|
64
|
+
imageStatus: hosted(p.background.src) ? p.background.imageStatus : "empty"
|
|
65
|
+
}) : void 0,
|
|
66
|
+
layers: (_a = p.layers) == null ? void 0 : _a.map((l) => l.kind === "image" ? __spreadProps(__spreadValues({}, l), {
|
|
67
|
+
src: hosted(l.src),
|
|
68
|
+
imageStatus: hosted(l.src) ? l.imageStatus : "empty",
|
|
69
|
+
uploadError: void 0
|
|
70
|
+
}) : l)
|
|
71
|
+
});
|
|
72
|
+
})
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function hasLocalMedia(doc) {
|
|
76
|
+
const local = (src) => Boolean(src && /^(file|ph|assets-library|content|data):/i.test(src));
|
|
77
|
+
return doc.pages.some((p) => {
|
|
78
|
+
var _a, _b;
|
|
79
|
+
return local((_a = p.background) == null ? void 0 : _a.src) || ((_b = p.layers) != null ? _b : []).some((l) => l.kind === "image" && local(l.src));
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function decodeMetadata(value) {
|
|
83
|
+
if (typeof value !== "string") return value;
|
|
84
|
+
try {
|
|
85
|
+
return JSON.parse(value);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function coerceDesignArtifact(metadata) {
|
|
91
|
+
const meta = decodeMetadata(metadata);
|
|
92
|
+
const artifact = meta == null ? void 0 : meta.artifact;
|
|
93
|
+
if (!artifact || typeof artifact.id !== "string" || !artifact.id) return null;
|
|
94
|
+
if (!DESIGN_KINDS.includes(artifact.kind)) return null;
|
|
95
|
+
const doc = artifact.doc;
|
|
96
|
+
if (!doc || !Array.isArray(doc.pages) || !(doc.pageWidth > 0) || !(doc.pageHeight > 0)) return null;
|
|
97
|
+
return artifact;
|
|
98
|
+
}
|
|
99
|
+
function buildDesignArtifact(id, kind, doc, keep = {}, now = Date.now()) {
|
|
100
|
+
const slim = slimDoc(doc);
|
|
101
|
+
return __spreadValues(__spreadValues(__spreadProps(__spreadValues({
|
|
102
|
+
id,
|
|
103
|
+
kind
|
|
104
|
+
}, keep.sessionId ? {
|
|
105
|
+
sessionId: keep.sessionId
|
|
106
|
+
} : {}), {
|
|
107
|
+
title: artifactTitle(slim),
|
|
108
|
+
updatedAt: now,
|
|
109
|
+
doc: slim
|
|
110
|
+
}), keep.thumbUrl ? {
|
|
111
|
+
thumbUrl: keep.thumbUrl
|
|
112
|
+
} : {}), keep.exportUrl ? {
|
|
113
|
+
exportUrl: keep.exportUrl
|
|
114
|
+
} : {});
|
|
115
|
+
}
|
|
116
|
+
async function gql(opts, query, variables) {
|
|
117
|
+
var _a, _b, _c;
|
|
118
|
+
if (!opts.url) return {
|
|
119
|
+
data: null,
|
|
120
|
+
error: "No design index configured for this build."
|
|
121
|
+
};
|
|
122
|
+
try {
|
|
123
|
+
const response = await fetch(opts.url, {
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: __spreadValues({
|
|
126
|
+
"content-type": "application/json"
|
|
127
|
+
}, opts.token ? {
|
|
128
|
+
authorization: `Bearer ${opts.token}`
|
|
129
|
+
} : {}),
|
|
130
|
+
body: JSON.stringify({
|
|
131
|
+
query,
|
|
132
|
+
variables
|
|
133
|
+
}),
|
|
134
|
+
signal: opts.signal
|
|
135
|
+
});
|
|
136
|
+
if (response.status === 401 || response.status === 403) {
|
|
137
|
+
return {
|
|
138
|
+
data: null,
|
|
139
|
+
error: "Your session expired. Sign in again to see your designs."
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (response.status === 413) {
|
|
143
|
+
return {
|
|
144
|
+
data: null,
|
|
145
|
+
error: "This design is too big to save. Remove a few pictures or pages."
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (!response.ok) return {
|
|
149
|
+
data: null,
|
|
150
|
+
error: `The design index is unreachable (HTTP ${response.status}).`
|
|
151
|
+
};
|
|
152
|
+
const payload = await response.json();
|
|
153
|
+
if ((_a = payload == null ? void 0 : payload.errors) == null ? void 0 : _a.length) {
|
|
154
|
+
const raw = ((_b = payload.errors[0]) == null ? void 0 : _b.message) || "";
|
|
155
|
+
const isAuth = /tenantid|unauthenticated|unauthorized|not authorised|forbidden/i.test(raw);
|
|
156
|
+
return {
|
|
157
|
+
data: null,
|
|
158
|
+
error: isAuth ? "Your session expired. Sign in again to see your designs." : raw || "Request rejected."
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
data: (_c = payload == null ? void 0 : payload.data) != null ? _c : null,
|
|
163
|
+
error: null
|
|
164
|
+
};
|
|
165
|
+
} catch (err) {
|
|
166
|
+
if (err instanceof Error && err.name === "AbortError") return {
|
|
167
|
+
data: null,
|
|
168
|
+
error: null
|
|
169
|
+
};
|
|
170
|
+
return {
|
|
171
|
+
data: null,
|
|
172
|
+
error: "Could not reach the design index. Check your connection."
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const ROW_FIELDS = "channelId title metadata updatedAt";
|
|
177
|
+
async function saveDesignArtifact(opts, artifact) {
|
|
178
|
+
var _a;
|
|
179
|
+
const {
|
|
180
|
+
data,
|
|
181
|
+
error
|
|
182
|
+
} = await gql(opts, `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {
|
|
183
|
+
registerSurfaceChannel(input: $input) { ${ROW_FIELDS} }
|
|
184
|
+
}`, {
|
|
185
|
+
input: __spreadProps(__spreadValues(__spreadValues({
|
|
186
|
+
surface: "canvas",
|
|
187
|
+
channelId: artifact.id
|
|
188
|
+
}, artifact.sessionId ? {
|
|
189
|
+
sessionId: artifact.sessionId
|
|
190
|
+
} : {}), artifact.title ? {
|
|
191
|
+
title: artifact.title
|
|
192
|
+
} : {}), {
|
|
193
|
+
metadata: {
|
|
194
|
+
artifact
|
|
195
|
+
}
|
|
196
|
+
})
|
|
197
|
+
});
|
|
198
|
+
if (error) return {
|
|
199
|
+
ok: false,
|
|
200
|
+
error
|
|
201
|
+
};
|
|
202
|
+
return ((_a = data == null ? void 0 : data.registerSurfaceChannel) == null ? void 0 : _a.channelId) ? {
|
|
203
|
+
ok: true,
|
|
204
|
+
error: null
|
|
205
|
+
} : {
|
|
206
|
+
ok: false,
|
|
207
|
+
error: "Could not save. Recent edits are not stored yet."
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function channelsMatching(opts, search, limit) {
|
|
211
|
+
var _a, _b;
|
|
212
|
+
const {
|
|
213
|
+
data,
|
|
214
|
+
error
|
|
215
|
+
} = await gql(opts, `query SurfaceChannels($filter: SurfaceChannelFilter, $offset: Int, $limit: Int) {
|
|
216
|
+
surfaceChannels(filter: $filter, offset: $offset, limit: $limit) { data { ${ROW_FIELDS} } totalCount }
|
|
217
|
+
}`, {
|
|
218
|
+
filter: {
|
|
219
|
+
surface: "canvas",
|
|
220
|
+
search
|
|
221
|
+
},
|
|
222
|
+
offset: 0,
|
|
223
|
+
limit
|
|
224
|
+
});
|
|
225
|
+
const page = data == null ? void 0 : data.surfaceChannels;
|
|
226
|
+
return {
|
|
227
|
+
rows: (_a = page == null ? void 0 : page.data) != null ? _a : [],
|
|
228
|
+
total: (_b = page == null ? void 0 : page.totalCount) != null ? _b : 0,
|
|
229
|
+
error
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
async function listDesignArtifacts(opts, limit = 24) {
|
|
233
|
+
var _a, _b;
|
|
234
|
+
const pages = await Promise.all(DESIGN_KINDS.map((kind) => channelsMatching(opts, `${kind}:`, limit)));
|
|
235
|
+
const designs = [];
|
|
236
|
+
for (const [i, page] of pages.entries()) {
|
|
237
|
+
for (const row of page.rows) {
|
|
238
|
+
const artifact = coerceDesignArtifact(row.metadata);
|
|
239
|
+
if ((artifact == null ? void 0 : artifact.kind) === DESIGN_KINDS[i] && artifact.id === row.channelId) designs.push(artifact);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
designs.sort((a, b) => {
|
|
243
|
+
var _a2, _b2;
|
|
244
|
+
return ((_a2 = b.updatedAt) != null ? _a2 : 0) - ((_b2 = a.updatedAt) != null ? _b2 : 0);
|
|
245
|
+
});
|
|
246
|
+
const error = designs.length === 0 ? (_b = (_a = pages.find((p) => p.error)) == null ? void 0 : _a.error) != null ? _b : null : null;
|
|
247
|
+
return {
|
|
248
|
+
designs: designs.slice(0, limit),
|
|
249
|
+
more: pages.some((p) => p.total > limit) || designs.length > limit,
|
|
250
|
+
error
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
async function loadOwnedDesignArtifact(opts, id) {
|
|
254
|
+
if (!isDesignArtifactId(id)) return {
|
|
255
|
+
artifact: null,
|
|
256
|
+
error: null
|
|
257
|
+
};
|
|
258
|
+
const page = await channelsMatching(opts, id.trim(), 5);
|
|
259
|
+
const row = page.rows.find((r) => r.channelId === id.trim());
|
|
260
|
+
if (!row) return {
|
|
261
|
+
artifact: null,
|
|
262
|
+
error: page.error
|
|
263
|
+
};
|
|
264
|
+
const artifact = coerceDesignArtifact(row.metadata);
|
|
265
|
+
return {
|
|
266
|
+
artifact: artifact && artifact.id === id.trim() ? artifact : null,
|
|
267
|
+
error: null
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
async function deleteDesignArtifact(opts, id) {
|
|
271
|
+
const {
|
|
272
|
+
data
|
|
273
|
+
} = await gql(opts, `mutation DeleteSurfaceChannel($surface: SurfaceType!, $channelId: String!) {
|
|
274
|
+
deleteSurfaceChannel(surface: $surface, channelId: $channelId)
|
|
275
|
+
}`, {
|
|
276
|
+
surface: "canvas",
|
|
277
|
+
channelId: id
|
|
278
|
+
});
|
|
279
|
+
return Boolean(data == null ? void 0 : data.deleteSurfaceChannel);
|
|
280
|
+
}export{DESIGN_KINDS,buildDesignArtifact,channelsMatching,coerceDesignArtifact,decodeMetadata,deleteDesignArtifact,gql,hasLocalMedia,isDesignArtifactId,isDocArtifactId,listDesignArtifacts,loadOwnedDesignArtifact,newArtifactId,saveDesignArtifact,slimDoc};//# sourceMappingURL=artifacts.js.map
|