@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 12.0.129
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/compute.js +57 -1
- package/lib/compute.js.map +1 -1
- package/lib/features/agent-chat/NativeAgentChat.js +3 -2
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/apps/AppsCatalog.js +10 -0
- package/lib/features/apps/AppsCatalog.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +11 -0
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/AudioEditorExperience.js +448 -105
- package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +237 -22
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLooksPanel.js +17 -6
- package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTasksPanel.js +18 -1
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/DesignCategoryGallery.js +423 -0
- package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
- package/lib/features/canvas/ImageEditorExperience.js +763 -187
- package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +199 -11
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +59 -40
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/aiEdit.js +4 -2
- package/lib/features/canvas/aiEdit.js.map +1 -1
- package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
- package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
- package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
- package/lib/features/canvas/canvasTaskSync.js +34 -7
- package/lib/features/canvas/canvasTaskSync.js.map +1 -1
- package/lib/features/canvas/canvasTasks.js +23 -3
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/canvasTheme.js +10 -24
- package/lib/features/canvas/canvasTheme.js.map +1 -1
- package/lib/features/canvas/canvasUi.js +1 -1
- package/lib/features/canvas/canvasUi.js.map +1 -1
- package/lib/features/canvas/createTiles.js +17 -9
- package/lib/features/canvas/createTiles.js.map +1 -1
- package/lib/features/canvas/deepLinks.js +35 -5
- package/lib/features/canvas/deepLinks.js.map +1 -1
- package/lib/features/canvas/designCatalog.js +165 -0
- package/lib/features/canvas/designCatalog.js.map +1 -0
- package/lib/features/canvas/designCategories.js +262 -0
- package/lib/features/canvas/designCategories.js.map +1 -0
- package/lib/features/canvas/editorControls.js +406 -0
- package/lib/features/canvas/editorControls.js.map +1 -0
- package/lib/features/canvas/generationModels.js +5 -3
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generationTasks.js +162 -0
- package/lib/features/canvas/generationTasks.js.map +1 -0
- package/lib/features/canvas/generator/BottomSheet.js +167 -0
- package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
- package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
- package/lib/features/canvas/generator/DirectorSheet.js +163 -0
- package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
- package/lib/features/canvas/generator/ReframePreview.js +122 -0
- package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
- package/lib/features/canvas/generator/RunLogCard.js +119 -0
- package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
- package/lib/features/canvas/generator/ShotPanel.js +261 -0
- package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
- package/lib/features/canvas/generator/businessCardWidget.js +117 -0
- package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
- package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
- package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
- package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
- package/lib/features/canvas/generator/direction.js +41 -0
- package/lib/features/canvas/generator/direction.js.map +1 -0
- package/lib/features/canvas/generator/reframeGeometry.js +108 -0
- package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
- package/lib/features/canvas/generator/runLog.js +71 -0
- package/lib/features/canvas/generator/runLog.js.map +1 -0
- package/lib/features/canvas/generator/shot.js +133 -0
- package/lib/features/canvas/generator/shot.js.map +1 -0
- package/lib/features/canvas/generator/useShotSpec.js +87 -0
- package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
- package/lib/features/canvas/home/HeroComposer.js +214 -0
- package/lib/features/canvas/home/HeroComposer.js.map +1 -0
- package/lib/features/canvas/home/HeroMonitor.js +225 -0
- package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
- package/lib/features/canvas/home/LookDetail.js +185 -0
- package/lib/features/canvas/home/LookDetail.js.map +1 -0
- package/lib/features/canvas/home/LoopingVideo.js +37 -0
- package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
- package/lib/features/canvas/home/TemplatesGallery.js +253 -0
- package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
- package/lib/features/canvas/home/heroShots.js +100 -0
- package/lib/features/canvas/home/heroShots.js.map +1 -0
- package/lib/features/canvas/homeWork.js +62 -3
- package/lib/features/canvas/homeWork.js.map +1 -1
- package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
- package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
- package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/rankedCatalogSearch.js +375 -0
- package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
- package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
- package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
- package/lib/features/canvas/recorder/RecordingReview.js +272 -0
- package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
- package/lib/features/canvas/recorder/RecordingsList.js +179 -0
- package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
- package/lib/features/canvas/recorder/recorderOps.js +99 -0
- package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
- package/lib/features/canvas/seedanceShowcase.js +314 -0
- package/lib/features/canvas/seedanceShowcase.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +149 -15
- package/lib/features/canvas/serverTasks.js.map +1 -1
- package/lib/features/canvas/sessionRenewal.js +114 -0
- package/lib/features/canvas/sessionRenewal.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +34 -1
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/setTurn.js +4 -2
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
- package/lib/features/canvas/set/setPresets.js +85 -0
- package/lib/features/canvas/set/setPresets.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +4 -1
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +59 -4
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +31 -4
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/surfaceIndex.js +1 -14
- package/lib/features/canvas/surfaceIndex.js.map +1 -1
- package/lib/features/canvas/templateSearch.js +489 -0
- package/lib/features/canvas/templateSearch.js.map +1 -0
- package/lib/features/canvas/useCanvasSession.js +28 -6
- package/lib/features/canvas/useCanvasSession.js.map +1 -1
- package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
- package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
- package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
- package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/audioServices.js +165 -0
- package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
- package/lib/features/canvas/videoEditor/captions.js +144 -0
- package/lib/features/canvas/videoEditor/captions.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/editorModel.js +12 -2
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +89 -7
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
- package/lib/features/canvas/videoEditor/layers.js +117 -0
- package/lib/features/canvas/videoEditor/layers.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
- package/lib/features/canvas/videoEditor/revoice.js +138 -0
- package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
- package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
- package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
- package/lib/features/canvas/videoEditor/textMotion.js +109 -0
- package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
- package/lib/features/canvas/videoEditor/transitions.js +31 -0
- package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
- package/lib/features/chat/TemplatesChatCards.js +8 -3
- package/lib/features/chat/TemplatesChatCards.js.map +1 -1
- package/lib/features/design/DesignEditorExperience.js +674 -644
- package/lib/features/design/DesignEditorExperience.js.map +1 -1
- package/lib/features/design/DesignExperience.js +285 -538
- package/lib/features/design/DesignExperience.js.map +1 -1
- package/lib/features/design/designCore.js +2 -212
- package/lib/features/design/designCore.js.map +1 -1
- package/lib/features/design/designIndex.js +1 -50
- package/lib/features/design/designIndex.js.map +1 -1
- package/lib/features/design/doc/aiDesign.js +247 -0
- package/lib/features/design/doc/aiDesign.js.map +1 -0
- package/lib/features/design/doc/artifacts.js +280 -0
- package/lib/features/design/doc/artifacts.js.map +1 -0
- package/lib/features/design/doc/chart.js +98 -0
- package/lib/features/design/doc/chart.js.map +1 -0
- package/lib/features/design/doc/crop.js +104 -0
- package/lib/features/design/doc/crop.js.map +1 -0
- package/lib/features/design/doc/curve.js +49 -0
- package/lib/features/design/doc/curve.js.map +1 -0
- package/lib/features/design/doc/docOps.js +397 -0
- package/lib/features/design/doc/docOps.js.map +1 -0
- package/lib/features/design/doc/findReplace.js +112 -0
- package/lib/features/design/doc/findReplace.js.map +1 -0
- package/lib/features/design/doc/fonts.js +79 -0
- package/lib/features/design/doc/fonts.js.map +1 -0
- package/lib/features/design/doc/frames.js +17 -0
- package/lib/features/design/doc/frames.js.map +1 -0
- package/lib/features/design/doc/geometry.js +133 -0
- package/lib/features/design/doc/geometry.js.map +1 -0
- package/lib/features/design/doc/imageAdjust.js +203 -0
- package/lib/features/design/doc/imageAdjust.js.map +1 -0
- package/lib/features/design/doc/legacyDoc.js +107 -0
- package/lib/features/design/doc/legacyDoc.js.map +1 -0
- package/lib/features/design/doc/newDoc.js +335 -0
- package/lib/features/design/doc/newDoc.js.map +1 -0
- package/lib/features/design/doc/pageRange.js +17 -0
- package/lib/features/design/doc/pageRange.js.map +1 -0
- package/lib/features/design/doc/pathScale.js +68 -0
- package/lib/features/design/doc/pathScale.js.map +1 -0
- package/lib/features/design/doc/qr.js +62 -0
- package/lib/features/design/doc/qr.js.map +1 -0
- package/lib/features/design/doc/shapes.js +366 -0
- package/lib/features/design/doc/shapes.js.map +1 -0
- package/lib/features/design/doc/sizes.js +230 -0
- package/lib/features/design/doc/sizes.js.map +1 -0
- package/lib/features/design/doc/textEffects.js +134 -0
- package/lib/features/design/doc/textEffects.js.map +1 -0
- package/lib/features/design/doc/textLayout.js +182 -0
- package/lib/features/design/doc/textLayout.js.map +1 -0
- package/lib/features/design/doc/types.js +30 -0
- package/lib/features/design/doc/types.js.map +1 -0
- package/lib/features/design/editor/AiPanel.js +194 -0
- package/lib/features/design/editor/AiPanel.js.map +1 -0
- package/lib/features/design/editor/ChartDataPanel.js +182 -0
- package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
- package/lib/features/design/editor/CropOverlay.js +199 -0
- package/lib/features/design/editor/CropOverlay.js.map +1 -0
- package/lib/features/design/editor/DesignCanvas.js +363 -0
- package/lib/features/design/editor/DesignCanvas.js.map +1 -0
- package/lib/features/design/editor/ExportSheet.js +123 -0
- package/lib/features/design/editor/ExportSheet.js.map +1 -0
- package/lib/features/design/editor/FindReplacePanel.js +93 -0
- package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
- package/lib/features/design/editor/ImageTools.js +188 -0
- package/lib/features/design/editor/ImageTools.js.map +1 -0
- package/lib/features/design/editor/LayerTools.js +485 -0
- package/lib/features/design/editor/LayerTools.js.map +1 -0
- package/lib/features/design/editor/PageStrip.js +203 -0
- package/lib/features/design/editor/PageStrip.js.map +1 -0
- package/lib/features/design/editor/Slideshow.js +97 -0
- package/lib/features/design/editor/Slideshow.js.map +1 -0
- package/lib/features/design/editor/ToolPanels.js +695 -0
- package/lib/features/design/editor/ToolPanels.js.map +1 -0
- package/lib/features/design/editor/controls.js +630 -0
- package/lib/features/design/editor/controls.js.map +1 -0
- package/lib/features/design/editor/useDesignSave.js +91 -0
- package/lib/features/design/editor/useDesignSave.js.map +1 -0
- package/lib/features/design/export/exportDesign.js +170 -0
- package/lib/features/design/export/exportDesign.js.map +1 -0
- package/lib/features/design/export/pdf.js +143 -0
- package/lib/features/design/export/pdf.js.map +1 -0
- package/lib/features/design/home/DesignHome.js +688 -0
- package/lib/features/design/home/DesignHome.js.map +1 -0
- package/lib/features/design/home/studioHome.js +61 -0
- package/lib/features/design/home/studioHome.js.map +1 -0
- package/lib/features/design/pickDesignImage.js +60 -0
- package/lib/features/design/pickDesignImage.js.map +1 -0
- package/lib/features/design/render/DesignPageView.js +69 -0
- package/lib/features/design/render/DesignPageView.js.map +1 -0
- package/lib/features/design/render/PageCapture.js +288 -0
- package/lib/features/design/render/PageCapture.js.map +1 -0
- package/lib/features/design/render/TextMeasure.js +115 -0
- package/lib/features/design/render/TextMeasure.js.map +1 -0
- package/lib/features/design/render/fontRegistry.js +110 -0
- package/lib/features/design/render/fontRegistry.js.map +1 -0
- package/lib/features/design/render/layers.js +392 -0
- package/lib/features/design/render/layers.js.map +1 -0
- package/lib/features/design/render/svg.js +35 -0
- package/lib/features/design/render/svg.js.map +1 -0
- package/lib/features/design/render/svgParts.js +435 -0
- package/lib/features/design/render/svgParts.js.map +1 -0
- package/lib/features/design/surface/BoardScreen.js +529 -0
- package/lib/features/design/surface/BoardScreen.js.map +1 -0
- package/lib/features/design/surface/CompareView.js +138 -0
- package/lib/features/design/surface/CompareView.js.map +1 -0
- package/lib/features/design/surface/CreationScreen.js +294 -0
- package/lib/features/design/surface/CreationScreen.js.map +1 -0
- package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
- package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
- package/lib/features/design/surface/DesignBoards.js +441 -0
- package/lib/features/design/surface/DesignBoards.js.map +1 -0
- package/lib/features/design/surface/DesignPreview.js +159 -0
- package/lib/features/design/surface/DesignPreview.js.map +1 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
- package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
- package/lib/features/design/surface/FullScreenPreview.js +59 -0
- package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
- package/lib/features/design/surface/NewSystemDialog.js +122 -0
- package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
- package/lib/features/design/surface/PickerSheet.js +175 -0
- package/lib/features/design/surface/PickerSheet.js.map +1 -0
- package/lib/features/design/surface/TemplatesGallery.js +156 -0
- package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
- package/lib/features/design/surface/WetPaint.js +140 -0
- package/lib/features/design/surface/WetPaint.js.map +1 -0
- package/lib/features/design/surface/agentTurn.js +229 -0
- package/lib/features/design/surface/agentTurn.js.map +1 -0
- package/lib/features/design/surface/designBoard.js +218 -0
- package/lib/features/design/surface/designBoard.js.map +1 -0
- package/lib/features/design/surface/designChannel.js +186 -0
- package/lib/features/design/surface/designChannel.js.map +1 -0
- package/lib/features/design/surface/designChat.js +141 -0
- package/lib/features/design/surface/designChat.js.map +1 -0
- package/lib/features/design/surface/designConnector.js +266 -0
- package/lib/features/design/surface/designConnector.js.map +1 -0
- package/lib/features/design/surface/designDocument.js +40 -0
- package/lib/features/design/surface/designDocument.js.map +1 -0
- package/lib/features/design/surface/designExport.js +55 -0
- package/lib/features/design/surface/designExport.js.map +1 -0
- package/lib/features/design/surface/designLinks.js +64 -0
- package/lib/features/design/surface/designLinks.js.map +1 -0
- package/lib/features/design/surface/designPalette.js +24 -0
- package/lib/features/design/surface/designPalette.js.map +1 -0
- package/lib/features/design/surface/designRun.js +161 -0
- package/lib/features/design/surface/designRun.js.map +1 -0
- package/lib/features/design/surface/designTheme.js +119 -0
- package/lib/features/design/surface/designTheme.js.map +1 -0
- package/lib/features/design/surface/execStream.js +206 -0
- package/lib/features/design/surface/execStream.js.map +1 -0
- package/lib/features/design/surface/metaball.js +48 -0
- package/lib/features/design/surface/metaball.js.map +1 -0
- package/lib/features/design/surface/pickReferenceFiles.js +35 -0
- package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
- package/lib/features/design/surface/useDesignSurface.js +379 -0
- package/lib/features/design/surface/useDesignSurface.js.map +1 -0
- package/lib/features/docs/DocBlockRow.js +336 -0
- package/lib/features/docs/DocBlockRow.js.map +1 -0
- package/lib/features/docs/DocsEditorExperience.js +949 -0
- package/lib/features/docs/DocsEditorExperience.js.map +1 -0
- package/lib/features/docs/DocsToolbar.js +247 -0
- package/lib/features/docs/DocsToolbar.js.map +1 -0
- package/lib/features/docs/blocks.js +560 -0
- package/lib/features/docs/blocks.js.map +1 -0
- package/lib/features/docs/docArtifacts.js +129 -0
- package/lib/features/docs/docArtifacts.js.map +1 -0
- package/lib/features/docs/docEdits.js +201 -0
- package/lib/features/docs/docEdits.js.map +1 -0
- package/lib/features/docs/docExport.js +235 -0
- package/lib/features/docs/docExport.js.map +1 -0
- package/lib/features/docs/docShare.js +62 -0
- package/lib/features/docs/docShare.js.map +1 -0
- package/lib/features/links/openInApp.js +38 -2
- package/lib/features/links/openInApp.js.map +1 -1
- package/lib/routes.json +54 -0
- package/lib/screens/DesignNative/index.js +35 -0
- package/lib/screens/DesignNative/index.js.map +1 -0
- package/package.json +4 -4
- package/lib/features/design/exportDesign.js +0 -133
- package/lib/features/design/exportDesign.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sources":["../../../../src/features/design/doc/artifacts.ts"],"sourcesContent":["/**\n * Saved designs - native twin of canvas-surface `state/artifacts.ts` for the\n * two kinds the Design Studio writes (`deck`, `flyer`).\n *\n * One SurfaceChannel row per design on the `canvas` surface, keyed\n * `<kind>:<uuid>`, the whole `{ artifact }` in `metadata`. That is exactly\n * what the web Design Studio writes and lists, so a design saved on the phone\n * is in the web's \"Recent designs\" and the reverse.\n *\n * `registerSurfaceChannel` is the idempotent upsert and `metadata` is replaced\n * wholesale: a save sends the complete artifact, never a patch. Reads are\n * best-effort (an error string, never a throw) like `canvas/surfaceIndex.ts`.\n *\n * Pure apart from `fetch`: runs under jest as-is.\n */\nimport { artifactTitle, type CanvasArtifactKind, type DesignDoc, type DesignKind } from './types';\n\nexport const DESIGN_KINDS: readonly DesignKind[] = ['deck', 'flyer'];\n\n/** One saved design (web `CanvasArtifact<CarouselDoc>`). */\nexport interface DesignArtifact {\n /** Row id AND artifact id: `<kind>:<uuid>`. */\n id: string;\n kind: DesignKind;\n sessionId?: string;\n title: string;\n updatedAt: number;\n doc: DesignDoc;\n /** First page as an image, for a grid tile - written by web; native keeps it through saves. */\n thumbUrl?: string;\n exportUrl?: string;\n}\n\nexport interface IndexOptions {\n url: string;\n token?: string | null;\n signal?: AbortSignal;\n}\n\nfunction uuid(): string {\n const bytes = new Uint8Array(16);\n let filled = false;\n try {\n (globalThis.crypto as Crypto | undefined)?.getRandomValues?.(bytes);\n filled = bytes.some((b) => b !== 0);\n } catch {\n filled = false;\n }\n if (!filled) for (let i = 0; i < 16; i += 1) bytes[i] = Math.floor(Math.random() * 256);\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/** Mint an artifact id. The kind rides in the id, so a row classifies without decoding its metadata. */\nexport function newArtifactId(kind: CanvasArtifactKind): string {\n return `${kind}:${uuid()}`;\n}\n\n/** Is this a saved-design id (`deck:…` / `flyer:…`), as a link or chat card carries it? */\nexport function isDesignArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^(deck|flyer):[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\n/** Is this a rich-text doc id (`doc:…`, the web docs editor's rows)? Docs are not designs: they open in the docs editor. */\nexport function isDocArtifactId(id: unknown): id is string {\n return typeof id === 'string' && /^doc:[0-9A-Za-z-]{8,}$/.test(id.trim());\n}\n\nconst stripDataUrl = (src: string | null | undefined): string | null => (src && !src.startsWith('data:') ? src : null);\n\n/**\n * The document as a save writes it (web `slimDoc`): no inline data: images,\n * no page rasters - the index body is capped, and a phone's local file URI\n * means nothing on another device.\n */\nexport function slimDoc(doc: DesignDoc): DesignDoc {\n const hosted = (src: string | null | undefined) => {\n const kept = stripDataUrl(src);\n return kept && !/^(file|ph|assets-library|content):/i.test(kept) ? kept : null;\n };\n return {\n ...doc,\n brandKit: doc.brandKit\n ? { ...doc.brandKit, logos: doc.brandKit.logos.filter((l) => !l.startsWith('data:')) }\n : undefined,\n pages: doc.pages.map((p) => ({\n ...p,\n dataBase64: undefined,\n src: hosted(p.src),\n status: p.status === 'generating' ? 'empty' : p.src && p.src.startsWith('data:') ? 'empty' : p.status,\n background: p.background\n ? {\n ...p.background,\n src: hosted(p.background.src),\n imageStatus: hosted(p.background.src) ? p.background.imageStatus : 'empty',\n }\n : undefined,\n layers: p.layers?.map((l) =>\n l.kind === 'image'\n ? {\n ...l,\n src: hosted(l.src),\n imageStatus: hosted(l.src) ? l.imageStatus : 'empty',\n uploadError: undefined,\n }\n : l,\n ),\n })),\n };\n}\n\n/** Does a document still hold a picture only this phone can see (an upload that has not finished)? */\nexport function hasLocalMedia(doc: DesignDoc): boolean {\n const local = (src: string | null | undefined) =>\n Boolean(src && /^(file|ph|assets-library|content|data):/i.test(src));\n return doc.pages.some(\n (p) => local(p.background?.src) || (p.layers ?? []).some((l) => l.kind === 'image' && local(l.src)),\n );\n}\n\n/** `metadata` arrives decoded, or as text from a backend that types it a String. */\nexport function decodeMetadata(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\n/** Validate a decoded row (untrusted JSON from the index); null for anything but a design. */\nexport function coerceDesignArtifact(metadata: unknown): DesignArtifact | null {\n const meta = decodeMetadata(metadata) as { artifact?: DesignArtifact } | null;\n const artifact = meta?.artifact;\n if (!artifact || typeof artifact.id !== 'string' || !artifact.id) return null;\n if (!DESIGN_KINDS.includes(artifact.kind)) return null;\n const doc = artifact.doc as DesignDoc | undefined;\n if (!doc || !Array.isArray(doc.pages) || !(doc.pageWidth > 0) || !(doc.pageHeight > 0)) return null;\n return artifact;\n}\n\n/** Build the row a save writes. */\nexport function buildDesignArtifact(\n id: string,\n kind: DesignKind,\n doc: DesignDoc,\n keep: Pick<DesignArtifact, 'sessionId' | 'thumbUrl' | 'exportUrl'> = {},\n now: number = Date.now(),\n): DesignArtifact {\n const slim = slimDoc(doc);\n return {\n id,\n kind,\n ...(keep.sessionId ? { sessionId: keep.sessionId } : {}),\n title: artifactTitle(slim),\n updatedAt: now,\n doc: slim,\n ...(keep.thumbUrl ? { thumbUrl: keep.thumbUrl } : {}),\n ...(keep.exportUrl ? { exportUrl: keep.exportUrl } : {}),\n };\n}\n\nexport interface GqlResult<T> {\n data: T | null;\n error: string | null;\n}\n\n/** One GraphQL call to the index (shared with `features/docs/docArtifacts`). */\nexport async function gql<T>(\n opts: IndexOptions,\n query: string,\n variables: Record<string, unknown>,\n): Promise<GqlResult<T>> {\n if (!opts.url) return { data: null, error: 'No design index configured for this build.' };\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({ query, variables }),\n signal: opts.signal,\n });\n if (response.status === 401 || response.status === 403) {\n return { data: null, error: 'Your session expired. Sign in again to see your designs.' };\n }\n if (response.status === 413) {\n return { data: null, error: 'This design is too big to save. Remove a few pictures or pages.' };\n }\n if (!response.ok) return { data: null, error: `The design index is unreachable (HTTP ${response.status}).` };\n const payload = (await response.json()) as { data?: T; errors?: Array<{ message?: string }> };\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 data: null,\n error: isAuth ? 'Your session expired. Sign in again to see your designs.' : raw || 'Request rejected.',\n };\n }\n return { data: payload?.data ?? null, error: null };\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') return { data: null, error: null };\n return { data: null, error: 'Could not reach the design index. Check your connection.' };\n }\n}\n\nconst ROW_FIELDS = 'channelId title metadata updatedAt';\n\n/** Write one design (web `saveArtifact`). `ok: false` is lost work: say so. */\nexport async function saveDesignArtifact(\n opts: IndexOptions,\n artifact: DesignArtifact,\n): Promise<{ ok: boolean; error: string | null }> {\n const { data, error } = await gql<{ registerSurfaceChannel?: { channelId?: string } | null }>(\n opts,\n `mutation RegisterSurfaceChannel($input: RegisterSurfaceChannelInput!) {\n registerSurfaceChannel(input: $input) { ${ROW_FIELDS} }\n }`,\n {\n input: {\n surface: 'canvas',\n channelId: artifact.id,\n // Top-level AND inside the payload: the column is what lists filter on\n // server-side, the metadata copy is what the reader validates.\n ...(artifact.sessionId ? { sessionId: artifact.sessionId } : {}),\n ...(artifact.title ? { title: artifact.title } : {}),\n metadata: { artifact },\n },\n },\n );\n if (error) return { ok: false, error };\n return data?.registerSurfaceChannel?.channelId\n ? { ok: true, error: null }\n : { ok: false, error: 'Could not save. Recent edits are not stored yet.' };\n}\n\ninterface ChannelsPage {\n surfaceChannels?: { data?: Array<Record<string, unknown>> | null; totalCount?: number } | null;\n}\n\nexport async function channelsMatching(\n opts: IndexOptions,\n search: string,\n limit: number,\n): Promise<{ rows: Array<Record<string, unknown>>; total: number; error: string | null }> {\n const { data, error } = await gql<ChannelsPage>(\n opts,\n `query SurfaceChannels($filter: SurfaceChannelFilter, $offset: Int, $limit: Int) {\n surfaceChannels(filter: $filter, offset: $offset, limit: $limit) { data { ${ROW_FIELDS} } totalCount }\n }`,\n { filter: { surface: 'canvas', search }, offset: 0, limit },\n );\n const page = data?.surfaceChannels;\n return { rows: page?.data ?? [], total: page?.totalCount ?? 0, error };\n}\n\nexport interface DesignListResult {\n designs: DesignArtifact[];\n /** A kind had rows past `limit`. */\n more: boolean;\n error: string | null;\n}\n\n/**\n * The caller's designs, newest first (web `listArtifactsOfKinds(['deck', 'flyer'])`):\n * `search: '<kind>:'` narrows each kind server-side; the kind is checked again\n * here because the search also matches titles.\n */\nexport async function listDesignArtifacts(opts: IndexOptions, limit = 24): Promise<DesignListResult> {\n const pages = await Promise.all(DESIGN_KINDS.map((kind) => channelsMatching(opts, `${kind}:`, limit)));\n const designs: DesignArtifact[] = [];\n for (const [i, page] of pages.entries()) {\n for (const row of page.rows) {\n const artifact = coerceDesignArtifact(row.metadata);\n if (artifact?.kind === DESIGN_KINDS[i] && artifact.id === row.channelId) designs.push(artifact);\n }\n }\n designs.sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));\n const error = designs.length === 0 ? (pages.find((p) => p.error)?.error ?? null) : null;\n return {\n designs: designs.slice(0, limit),\n more: pages.some((p) => p.total > limit) || designs.length > limit,\n error,\n };\n}\n\n/**\n * One of the CALLER'S OWN designs (web `loadOwnedArtifact`): the list is\n * scoped server-side to the bearer, the single-row read is not - so an id\n * from outside (a link, a chat card) opens only when the list returns it.\n */\nexport async function loadOwnedDesignArtifact(\n opts: IndexOptions,\n id: string,\n): Promise<{ artifact: DesignArtifact | null; error: string | null }> {\n if (!isDesignArtifactId(id)) return { artifact: null, error: null };\n const page = await channelsMatching(opts, id.trim(), 5);\n const row = page.rows.find((r) => r.channelId === id.trim());\n if (!row) return { artifact: null, error: page.error };\n const artifact = coerceDesignArtifact(row.metadata);\n return { artifact: artifact && artifact.id === id.trim() ? artifact : null, error: null };\n}\n\n/** Hard-delete one design row (its exported files in storage are not touched). */\nexport async function deleteDesignArtifact(opts: IndexOptions, id: string): Promise<boolean> {\n const { data } = await gql<{ deleteSurfaceChannel?: boolean | null }>(\n opts,\n `mutation DeleteSurfaceChannel($surface: SurfaceType!, $channelId: String!) {\n deleteSurfaceChannel(surface: $surface, channelId: $channelId)\n }`,\n { surface: 'canvas', channelId: id },\n );\n return Boolean(data?.deleteSurfaceChannel);\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
const num = (v) => {
|
|
2
|
+
const n = typeof v === "number" ? v : Number(v);
|
|
3
|
+
return Number.isFinite(n) ? n : 0;
|
|
4
|
+
};
|
|
5
|
+
function readChartData(layer) {
|
|
6
|
+
var _a, _b, _c;
|
|
7
|
+
const legacy = (_a = layer.data) != null ? _a : [];
|
|
8
|
+
const rawCats = ((_b = layer.categories) == null ? void 0 : _b.length) ? layer.categories : legacy.map((d) => {
|
|
9
|
+
var _a2;
|
|
10
|
+
return String((_a2 = d == null ? void 0 : d.label) != null ? _a2 : "");
|
|
11
|
+
});
|
|
12
|
+
const rawSeries = ((_c = layer.series) == null ? void 0 : _c.length) ? layer.series : [{
|
|
13
|
+
name: "",
|
|
14
|
+
values: legacy.map((d) => num(d == null ? void 0 : d.value))
|
|
15
|
+
}];
|
|
16
|
+
const len = Math.max(rawCats.length, ...rawSeries.map((s) => {
|
|
17
|
+
var _a2, _b2;
|
|
18
|
+
return (_b2 = (_a2 = s.values) == null ? void 0 : _a2.length) != null ? _b2 : 0;
|
|
19
|
+
}), 0);
|
|
20
|
+
return {
|
|
21
|
+
categories: Array.from({
|
|
22
|
+
length: len
|
|
23
|
+
}, (_, i) => {
|
|
24
|
+
var _a2;
|
|
25
|
+
return (_a2 = rawCats[i]) != null ? _a2 : "";
|
|
26
|
+
}),
|
|
27
|
+
series: rawSeries.map((s) => {
|
|
28
|
+
var _a2;
|
|
29
|
+
return {
|
|
30
|
+
name: (_a2 = s.name) != null ? _a2 : "",
|
|
31
|
+
values: Array.from({
|
|
32
|
+
length: len
|
|
33
|
+
}, (_, i) => {
|
|
34
|
+
var _a3;
|
|
35
|
+
return num((_a3 = s.values) == null ? void 0 : _a3[i]);
|
|
36
|
+
})
|
|
37
|
+
};
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function chartMax(data, stacked) {
|
|
42
|
+
var _a;
|
|
43
|
+
let max = 0;
|
|
44
|
+
for (let i = 0; i < data.categories.length; i += 1) {
|
|
45
|
+
if (stacked) max = Math.max(max, data.series.reduce((sum, s) => {
|
|
46
|
+
var _a2;
|
|
47
|
+
return sum + Math.max(0, (_a2 = s.values[i]) != null ? _a2 : 0);
|
|
48
|
+
}, 0));
|
|
49
|
+
else for (const s of data.series) max = Math.max(max, (_a = s.values[i]) != null ? _a : 0);
|
|
50
|
+
}
|
|
51
|
+
return max > 0 ? max : 1;
|
|
52
|
+
}
|
|
53
|
+
function pieSlices(values) {
|
|
54
|
+
const positive = values.map((v) => Math.max(0, v));
|
|
55
|
+
const total = positive.reduce((a, b) => a + b, 0);
|
|
56
|
+
if (total <= 0) return [];
|
|
57
|
+
let at = 0;
|
|
58
|
+
return positive.map((v, index) => {
|
|
59
|
+
const sweep = v / total * Math.PI * 2;
|
|
60
|
+
const slice = {
|
|
61
|
+
start: at,
|
|
62
|
+
sweep,
|
|
63
|
+
index
|
|
64
|
+
};
|
|
65
|
+
at += sweep;
|
|
66
|
+
return slice;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function slicePath(cx, cy, r, start, sweep, inner = 0) {
|
|
70
|
+
const pt = (radius, a) => [cx + radius * Math.sin(a), cy - radius * Math.cos(a)];
|
|
71
|
+
const s = Math.min(sweep, Math.PI * 2 - 1e-4);
|
|
72
|
+
const large = s > Math.PI ? 1 : 0;
|
|
73
|
+
const [x0, y0] = pt(r, start);
|
|
74
|
+
const [x1, y1] = pt(r, start + s);
|
|
75
|
+
if (inner <= 0) return `M${cx} ${cy}L${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}Z`;
|
|
76
|
+
const [x2, y2] = pt(inner, start + s);
|
|
77
|
+
const [x3, y3] = pt(inner, start);
|
|
78
|
+
return `M${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}L${x2} ${y2}A${inner} ${inner} 0 ${large} 0 ${x3} ${y3}Z`;
|
|
79
|
+
}
|
|
80
|
+
function writeChartData(data) {
|
|
81
|
+
var _a, _b;
|
|
82
|
+
const first = (_b = (_a = data.series[0]) == null ? void 0 : _a.values) != null ? _b : [];
|
|
83
|
+
return {
|
|
84
|
+
categories: [...data.categories],
|
|
85
|
+
series: data.series.map((s) => ({
|
|
86
|
+
name: s.name,
|
|
87
|
+
values: [...s.values]
|
|
88
|
+
})),
|
|
89
|
+
data: data.categories.map((label, i) => ({
|
|
90
|
+
label,
|
|
91
|
+
value: num(first[i])
|
|
92
|
+
}))
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function parseCell(text) {
|
|
96
|
+
const n = Number(text.replace(/[\s,]/g, ""));
|
|
97
|
+
return Number.isFinite(n) ? n : 0;
|
|
98
|
+
}export{chartMax,parseCell,pieSlices,readChartData,slicePath,writeChartData};//# sourceMappingURL=chart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart.js","sources":["../../../../src/features/design/doc/chart.ts"],"sourcesContent":["/**\n * Chart data as the renderer reads it - native twin of canvas-surface\n * `utils/chart.ts` `readChartData`: `categories`/`series` when present, else\n * the legacy single-series `data` rows, and `writeChartData` for the chart\n * data sheet (editor/ChartDataPanel.tsx).\n *\n * Pure: runs under jest as-is.\n */\nimport type { ChartLayer } from './types';\n\nexport interface ChartData {\n categories: string[];\n series: { name: string; values: number[] }[];\n}\n\nconst num = (v: unknown): number => {\n const n = typeof v === 'number' ? v : Number(v);\n return Number.isFinite(n) ? n : 0;\n};\n\nexport function readChartData(layer: Pick<ChartLayer, 'data' | 'categories' | 'series'>): ChartData {\n const legacy = layer.data ?? [];\n const rawCats = layer.categories?.length ? layer.categories : legacy.map((d) => String(d?.label ?? ''));\n const rawSeries = layer.series?.length ? layer.series : [{ name: '', values: legacy.map((d) => num(d?.value)) }];\n const len = Math.max(rawCats.length, ...rawSeries.map((s) => s.values?.length ?? 0), 0);\n return {\n categories: Array.from({ length: len }, (_, i) => rawCats[i] ?? ''),\n series: rawSeries.map((s) => ({\n name: s.name ?? '',\n values: Array.from({ length: len }, (_, i) => num(s.values?.[i])),\n })),\n };\n}\n\n/** The largest value an axis has to reach: per bar, or per stacked column. */\nexport function chartMax(data: ChartData, stacked: boolean): number {\n let max = 0;\n for (let i = 0; i < data.categories.length; i += 1) {\n if (stacked)\n max = Math.max(\n max,\n data.series.reduce((sum, s) => sum + Math.max(0, s.values[i] ?? 0), 0),\n );\n else for (const s of data.series) max = Math.max(max, s.values[i] ?? 0);\n }\n return max > 0 ? max : 1;\n}\n\n/** Pie / donut slices of the first series: start and sweep in radians, clockwise from 12 o'clock. */\nexport function pieSlices(values: readonly number[]): Array<{ start: number; sweep: number; index: number }> {\n const positive = values.map((v) => Math.max(0, v));\n const total = positive.reduce((a, b) => a + b, 0);\n if (total <= 0) return [];\n let at = 0;\n return positive.map((v, index) => {\n const sweep = (v / total) * Math.PI * 2;\n const slice = { start: at, sweep, index };\n at += sweep;\n return slice;\n });\n}\n\n/** An SVG arc path for one slice of a circle of radius `r` at (cx, cy); `inner` > 0 makes a donut ring. */\nexport function slicePath(cx: number, cy: number, r: number, start: number, sweep: number, inner = 0): string {\n const pt = (radius: number, a: number) => [cx + radius * Math.sin(a), cy - radius * Math.cos(a)];\n // A full circle cannot be one arc; draw it a hair short.\n const s = Math.min(sweep, Math.PI * 2 - 1e-4);\n const large = s > Math.PI ? 1 : 0;\n const [x0, y0] = pt(r, start);\n const [x1, y1] = pt(r, start + s);\n if (inner <= 0) return `M${cx} ${cy}L${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}Z`;\n const [x2, y2] = pt(inner, start + s);\n const [x3, y3] = pt(inner, start);\n return `M${x0} ${y0}A${r} ${r} 0 ${large} 1 ${x1} ${y1}L${x2} ${y2}A${inner} ${inner} 0 ${large} 0 ${x3} ${y3}Z`;\n}\n\n/** The fields a data edit writes (web `writeChartData`): series 0 mirrored into `data` for older readers. */\nexport function writeChartData(data: ChartData): Pick<ChartLayer, 'categories' | 'series' | 'data'> {\n const first = data.series[0]?.values ?? [];\n return {\n categories: [...data.categories],\n series: data.series.map((s) => ({ name: s.name, values: [...s.values] })),\n data: data.categories.map((label, i) => ({ label, value: num(first[i]) })),\n };\n}\n\n/** A typed cell as a number: commas and spaces dropped; anything unreadable is 0. */\nexport function parseCell(text: string): number {\n const n = Number(text.replace(/[\\s,]/g, ''));\n return Number.isFinite(n) ? n : 0;\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const FULL = {
|
|
21
|
+
x: 0,
|
|
22
|
+
y: 0,
|
|
23
|
+
w: 1,
|
|
24
|
+
h: 1
|
|
25
|
+
};
|
|
26
|
+
const MIN_SIDE = 16;
|
|
27
|
+
const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
|
|
28
|
+
function displayCrop(c, flipX, flipY) {
|
|
29
|
+
return {
|
|
30
|
+
x: flipX ? 1 - c.x - c.w : c.x,
|
|
31
|
+
y: flipY ? 1 - c.y - c.h : c.y,
|
|
32
|
+
w: c.w,
|
|
33
|
+
h: c.h
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function cropStart(box, crop, flipX, flipY) {
|
|
37
|
+
const c = displayCrop(crop != null ? crop : FULL, flipX, flipY);
|
|
38
|
+
const w = box.w / c.w;
|
|
39
|
+
const h = box.h / c.h;
|
|
40
|
+
return {
|
|
41
|
+
img: {
|
|
42
|
+
x: box.x - c.x * w,
|
|
43
|
+
y: box.y - c.y * h,
|
|
44
|
+
w,
|
|
45
|
+
h
|
|
46
|
+
},
|
|
47
|
+
win: __spreadValues({}, box)
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function cropPan({
|
|
51
|
+
img,
|
|
52
|
+
win
|
|
53
|
+
}, dx, dy) {
|
|
54
|
+
const x = clamp(img.x + dx, win.x + win.w - img.w, win.x);
|
|
55
|
+
const y = clamp(img.y + dy, win.y + win.h - img.h, win.y);
|
|
56
|
+
return {
|
|
57
|
+
img: __spreadProps(__spreadValues({}, img), {
|
|
58
|
+
x,
|
|
59
|
+
y
|
|
60
|
+
}),
|
|
61
|
+
win
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function cropResize({
|
|
65
|
+
img,
|
|
66
|
+
win
|
|
67
|
+
}, handle, dx, dy) {
|
|
68
|
+
let l = win.x;
|
|
69
|
+
let t = win.y;
|
|
70
|
+
let r = win.x + win.w;
|
|
71
|
+
let b = win.y + win.h;
|
|
72
|
+
if (handle.includes("w")) l = clamp(l + dx, img.x, r - MIN_SIDE);
|
|
73
|
+
if (handle.includes("e")) r = clamp(r + dx, l + MIN_SIDE, img.x + img.w);
|
|
74
|
+
if (handle.includes("n")) t = clamp(t + dy, img.y, b - MIN_SIDE);
|
|
75
|
+
if (handle.includes("s")) b = clamp(b + dy, t + MIN_SIDE, img.y + img.h);
|
|
76
|
+
return {
|
|
77
|
+
img,
|
|
78
|
+
win: {
|
|
79
|
+
x: l,
|
|
80
|
+
y: t,
|
|
81
|
+
w: r - l,
|
|
82
|
+
h: b - t
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function cropCommit({
|
|
87
|
+
img,
|
|
88
|
+
win
|
|
89
|
+
}, pageW, pageH, flipX, flipY) {
|
|
90
|
+
const d = {
|
|
91
|
+
x: (win.x - img.x) / img.w,
|
|
92
|
+
y: (win.y - img.y) / img.h,
|
|
93
|
+
w: win.w / img.w,
|
|
94
|
+
h: win.h / img.h
|
|
95
|
+
};
|
|
96
|
+
const full = d.x < 1e-3 && d.y < 1e-3 && d.w > 1 - 1e-3 && d.h > 1 - 1e-3;
|
|
97
|
+
return {
|
|
98
|
+
x: win.x / pageW,
|
|
99
|
+
y: win.y / pageH,
|
|
100
|
+
w: win.w / pageW,
|
|
101
|
+
h: win.h / pageH,
|
|
102
|
+
crop: full ? void 0 : displayCrop(d, flipX, flipY)
|
|
103
|
+
};
|
|
104
|
+
}export{cropCommit,cropPan,cropResize,cropStart,displayCrop};//# sourceMappingURL=crop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crop.js","sources":["../../../../src/features/design/doc/crop.ts"],"sourcesContent":["/**\n * Crop mode geometry in page px - native twin of canvas-surface\n * `carousel-editor/utils/crop.ts`: `img` is the whole image, `win` the frame\n * that shows part of it.\n *\n * Pure: runs under jest as-is.\n */\nimport type { Rect } from './types';\n\nexport interface CropState {\n img: Rect;\n win: Rect;\n}\n\nexport type CropHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\nconst FULL: Rect = { x: 0, y: 0, w: 1, h: 1 };\n/** Smallest frame side, in page px. */\nconst MIN_SIDE = 16;\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, v));\n\n/** Source crop <-> what the frame shows; a flipped layer mirrors its source. Self-inverse. */\nexport function displayCrop(c: Rect, flipX?: boolean, flipY?: boolean): Rect {\n return { x: flipX ? 1 - c.x - c.w : c.x, y: flipY ? 1 - c.y - c.h : c.y, w: c.w, h: c.h };\n}\n\nexport function cropStart(box: Rect, crop: Rect | undefined, flipX?: boolean, flipY?: boolean): CropState {\n const c = displayCrop(crop ?? FULL, flipX, flipY);\n const w = box.w / c.w;\n const h = box.h / c.h;\n return { img: { x: box.x - c.x * w, y: box.y - c.y * h, w, h }, win: { ...box } };\n}\n\n/** Pan the image under a fixed frame without uncovering it. */\nexport function cropPan({ img, win }: CropState, dx: number, dy: number): CropState {\n const x = clamp(img.x + dx, win.x + win.w - img.w, win.x);\n const y = clamp(img.y + dy, win.y + win.h - img.h, win.y);\n return { img: { ...img, x, y }, win };\n}\n\n/** Drag a frame edge or corner, staying inside the image. */\nexport function cropResize({ img, win }: CropState, handle: CropHandle, dx: number, dy: number): CropState {\n let l = win.x;\n let t = win.y;\n let r = win.x + win.w;\n let b = win.y + win.h;\n if (handle.includes('w')) l = clamp(l + dx, img.x, r - MIN_SIDE);\n if (handle.includes('e')) r = clamp(r + dx, l + MIN_SIDE, img.x + img.w);\n if (handle.includes('n')) t = clamp(t + dy, img.y, b - MIN_SIDE);\n if (handle.includes('s')) b = clamp(b + dy, t + MIN_SIDE, img.y + img.h);\n return { img, win: { x: l, y: t, w: r - l, h: b - t } };\n}\n\n/** The layer patch: the frame becomes the box; `crop` is undefined when the whole image shows. */\nexport function cropCommit(\n { img, win }: CropState,\n pageW: number,\n pageH: number,\n flipX?: boolean,\n flipY?: boolean,\n): Rect & { crop: Rect | undefined } {\n const d = { x: (win.x - img.x) / img.w, y: (win.y - img.y) / img.h, w: win.w / img.w, h: win.h / img.h };\n const full = d.x < 1e-3 && d.y < 1e-3 && d.w > 1 - 1e-3 && d.h > 1 - 1e-3;\n return {\n x: win.x / pageW,\n y: win.y / pageH,\n w: win.w / pageW,\n h: win.h / pageH,\n crop: full ? undefined : displayCrop(d, flipX, flipY),\n };\n}\n\n/** The centred crop that fills a box with an image of another shape; undefined when the shapes match. */\nexport function coverCrop(imgW: number, imgH: number, boxW: number, boxH: number): Rect | undefined {\n if (!(imgW > 0 && imgH > 0 && boxW > 0 && boxH > 0)) return undefined;\n const imgAspect = imgW / imgH;\n const boxAspect = boxW / boxH;\n if (Math.abs(imgAspect / boxAspect - 1) < 1e-3) return undefined;\n if (imgAspect > boxAspect) {\n const w = boxAspect / imgAspect;\n return { x: (1 - w) / 2, y: 0, w, h: 1 };\n }\n const h = imgAspect / boxAspect;\n return { x: 0, y: (1 - h) / 2, w: 1, h };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import {curveAngle}from'./textEffects.js';function curveArc(total, curve, ascent, descent) {
|
|
2
|
+
const turn = curveAngle(curve);
|
|
3
|
+
if (!turn || !(total > 0)) return null;
|
|
4
|
+
const r = total / turn;
|
|
5
|
+
const half = turn / 2;
|
|
6
|
+
const sign = (curve != null ? curve : 0) > 0 ? 1 : -1;
|
|
7
|
+
const at = (phi) => ({
|
|
8
|
+
x: r * Math.sin(phi),
|
|
9
|
+
y: sign * r * (1 - Math.cos(phi))
|
|
10
|
+
});
|
|
11
|
+
const up = (phi) => sign > 0 ? {
|
|
12
|
+
x: Math.sin(phi),
|
|
13
|
+
y: -Math.cos(phi)
|
|
14
|
+
} : {
|
|
15
|
+
x: -Math.sin(phi),
|
|
16
|
+
y: -Math.cos(phi)
|
|
17
|
+
};
|
|
18
|
+
let minX = Infinity;
|
|
19
|
+
let maxX = -Infinity;
|
|
20
|
+
let minY = Infinity;
|
|
21
|
+
let maxY = -Infinity;
|
|
22
|
+
const steps = 32;
|
|
23
|
+
for (let i = 0; i <= steps; i += 1) {
|
|
24
|
+
const phi = -half + turn * i / steps;
|
|
25
|
+
const p = at(phi);
|
|
26
|
+
const u = up(phi);
|
|
27
|
+
for (const k of [ascent, -descent]) {
|
|
28
|
+
const x = p.x + u.x * k;
|
|
29
|
+
const y = p.y + u.y * k;
|
|
30
|
+
minX = Math.min(minX, x);
|
|
31
|
+
maxX = Math.max(maxX, x);
|
|
32
|
+
minY = Math.min(minY, y);
|
|
33
|
+
maxY = Math.max(maxY, y);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const s = at(-half);
|
|
37
|
+
const e = at(half);
|
|
38
|
+
const large = turn > Math.PI ? 1 : 0;
|
|
39
|
+
const sweep = sign > 0 ? 1 : 0;
|
|
40
|
+
const n = (v) => Number(v.toFixed(3));
|
|
41
|
+
return {
|
|
42
|
+
d: `M${n(s.x)} ${n(s.y)}A${n(r)} ${n(r)} 0 ${large} ${sweep} ${n(e.x)} ${n(e.y)}`,
|
|
43
|
+
radius: r,
|
|
44
|
+
minX,
|
|
45
|
+
minY,
|
|
46
|
+
width: maxX - minX,
|
|
47
|
+
height: maxY - minY
|
|
48
|
+
};
|
|
49
|
+
}export{curveArc};//# sourceMappingURL=curve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curve.js","sources":["../../../../src/features/design/doc/curve.ts"],"sourcesContent":["/**\n * Curved text geometry - the arc web `layoutArc` (shared/textRaster.ts) lays\n * glyphs along, as one SVG path native text can follow (`<TextPath>`).\n *\n * The text's own width spans `curveAngle(curve)` of a circle: a rainbow for a\n * positive curve, a smile for a negative one. The arc's midpoint is the\n * origin; the glyphs stand upright on it with their baseline on the path.\n *\n * Pure: runs under jest as-is.\n */\nimport { curveAngle } from './textEffects';\n\nexport interface CurveArc {\n /** The baseline path, in arc coordinates (midpoint at the origin), drawn left to right. */\n d: string;\n radius: number;\n /** The ink's bounds in arc coordinates. */\n minX: number;\n minY: number;\n width: number;\n height: number;\n}\n\n/** The arc for one line `total` wide at a curve amount; null when the text runs straight. */\nexport function curveArc(total: number, curve: number | undefined, ascent: number, descent: number): CurveArc | null {\n const turn = curveAngle(curve);\n if (!turn || !(total > 0)) return null;\n const r = total / turn;\n const half = turn / 2;\n const sign = (curve ?? 0) > 0 ? 1 : -1;\n const at = (phi: number) => ({ x: r * Math.sin(phi), y: sign * r * (1 - Math.cos(phi)) });\n // The glyph's \"up\" at a point: away from the centre on a rainbow, towards it on a smile.\n const up = (phi: number) =>\n sign > 0 ? { x: Math.sin(phi), y: -Math.cos(phi) } : { x: -Math.sin(phi), y: -Math.cos(phi) };\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n const steps = 32;\n for (let i = 0; i <= steps; i += 1) {\n const phi = -half + (turn * i) / steps;\n const p = at(phi);\n const u = up(phi);\n for (const k of [ascent, -descent]) {\n const x = p.x + u.x * k;\n const y = p.y + u.y * k;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n }\n }\n const s = at(-half);\n const e = at(half);\n const large = turn > Math.PI ? 1 : 0;\n const sweep = sign > 0 ? 1 : 0;\n const n = (v: number) => Number(v.toFixed(3));\n return {\n d: `M${n(s.x)} ${n(s.y)}A${n(r)} ${n(r)} 0 ${large} ${sweep} ${n(e.x)} ${n(e.y)}`,\n radius: r,\n minX,\n minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n}\n"],"names":[],"mappings":"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"}
|