@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docExport.js","sources":["../../../src/features/docs/docExport.ts"],"sourcesContent":["/**\n * A doc as Markdown, HTML and a Word-openable file - native twin of the web\n * docs editor's exports (`wordExport.ts` + BlockNote's lossy HTML/Markdown).\n *\n * Word: like web, this is HTML wearing a `.doc` extension (Office namespaces\n * so Word claims it), not OOXML. Word opens it keeping headings, marks,\n * lists and tables; Google Docs and LibreOffice open it silently.\n *\n * Pure: no RN imports, so it runs under jest as-is.\n */\nimport {\n flattenBlocks,\n inlineToRuns,\n isObject,\n tableCellRuns,\n type DocBlock,\n type Run,\n type TableContent,\n} from './blocks';\n\n/** User input landing in markup. */\nexport const escapeHtml = (s: string): string =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\n/** BlockNote's color names as CSS (its light theme). */\nexport const TEXT_COLORS: Readonly<Record<string, string>> = {\n gray: '#9b9a97',\n brown: '#64473a',\n red: '#e03e3e',\n orange: '#d9730d',\n yellow: '#dfab01',\n green: '#4d6461',\n blue: '#0b6e99',\n purple: '#6940a5',\n pink: '#ad1a72',\n};\nexport const BACKGROUND_COLORS: Readonly<Record<string, string>> = {\n gray: '#ebeced',\n brown: '#e9e5e3',\n red: '#fbe4e4',\n orange: '#f6e9d9',\n yellow: '#fbf3db',\n green: '#ddedea',\n blue: '#ddebf1',\n purple: '#eae4f2',\n pink: '#f4dfeb',\n};\n\n/** Only links a reader can follow safely leave the doc. */\nconst safeHref = (href: string): string | null => (/^(https?:|mailto:|tel:)/i.test(href.trim()) ? href.trim() : null);\n\n// ── HTML ───────────────────────────────────────────────────────────────\n\nfunction runsHtml(runs: readonly Run[]): string {\n return runs\n .map((run) => {\n let html = escapeHtml(run.text).replace(/\\n/g, '<br>');\n const s = run.styles;\n if (s.code) html = `<code>${html}</code>`;\n if (s.bold) html = `<strong>${html}</strong>`;\n if (s.italic) html = `<em>${html}</em>`;\n if (s.underline) html = `<u>${html}</u>`;\n if (s.strike) html = `<s>${html}</s>`;\n const css = [\n s.textColor && TEXT_COLORS[s.textColor] ? `color:${TEXT_COLORS[s.textColor]}` : '',\n s.backgroundColor && BACKGROUND_COLORS[s.backgroundColor]\n ? `background-color:${BACKGROUND_COLORS[s.backgroundColor]}`\n : '',\n ].filter(Boolean);\n if (css.length) html = `<span style=\"${css.join(';')}\">${html}</span>`;\n const href = run.href ? safeHref(run.href) : null;\n if (href) html = `<a href=\"${escapeHtml(href)}\">${html}</a>`;\n return html;\n })\n .join('');\n}\n\nfunction alignAttr(block: DocBlock): string {\n const align = block.props?.textAlignment;\n return align === 'center' || align === 'right' || align === 'justify' ? ` style=\"text-align:${align}\"` : '';\n}\n\nfunction tableHtml(content: unknown): string {\n const table = content as TableContent | undefined;\n if (!isObject(table) || !Array.isArray(table.rows)) return '';\n const headerRows = Number(table.headerRows) || 0;\n const rows = table.rows\n .map((row, r) => {\n const tag = r < headerRows ? 'th' : 'td';\n const cells = (Array.isArray(row?.cells) ? row.cells : [])\n .map((cell) => `<${tag}>${runsHtml(tableCellRuns(cell))}</${tag}>`)\n .join('');\n return `<tr>${cells}</tr>`;\n })\n .join('');\n return `<table>${rows}</table>`;\n}\n\nfunction blockHtml(block: DocBlock): string {\n const inner = runsHtml(inlineToRuns(block.content));\n const align = alignAttr(block);\n switch (block.type) {\n case 'heading': {\n const level = [1, 2, 3].includes(Number(block.props?.level)) ? Number(block.props?.level) : 1;\n return `<h${level}${align}>${inner}</h${level}>`;\n }\n case 'quote':\n return `<blockquote${align}>${inner}</blockquote>`;\n case 'codeBlock':\n return `<pre><code>${escapeHtml(\n inlineToRuns(block.content)\n .map((r) => r.text)\n .join(''),\n )}</code></pre>`;\n case 'image': {\n const url = typeof block.props?.url === 'string' ? block.props.url : '';\n if (!/^https?:/i.test(url)) return '';\n const caption = typeof block.props?.caption === 'string' ? block.props.caption : '';\n const width = Number(block.props?.previewWidth);\n const img = `<img src=\"${escapeHtml(url)}\" alt=\"${escapeHtml(caption || String(block.props?.name ?? ''))}\"${\n width > 0 ? ` width=\"${Math.round(width)}\"` : ''\n }>`;\n return caption ? `<figure>${img}<figcaption>${escapeHtml(caption)}</figcaption></figure>` : `<p>${img}</p>`;\n }\n case 'table':\n return tableHtml(block.content);\n case 'checkListItem':\n return `<p${align}>${block.props?.checked ? '☑' : '☐'} ${inner}</p>`;\n default:\n // paragraph, and any type native does not draw: its text, if any.\n return inner || block.type === 'paragraph' ? `<p${align}>${inner}</p>` : '';\n }\n}\n\nconst LIST_TAG: Readonly<Record<string, string>> = { bulletListItem: 'ul', numberedListItem: 'ol' };\n\n/** Blocks to semantic HTML (what BlockNote's `blocksToHTMLLossy` emits, near enough). */\nexport function blocksToHtml(blocks: readonly DocBlock[]): string {\n let html = '';\n let i = 0;\n while (i < blocks.length) {\n const block = blocks[i];\n const tag = LIST_TAG[block.type];\n if (tag) {\n const start = Number(block.props?.start);\n html += tag === 'ol' && start > 1 ? `<ol start=\"${start}\">` : `<${tag}>`;\n while (i < blocks.length && blocks[i].type === block.type) {\n const item = blocks[i];\n html += `<li${alignAttr(item)}>${runsHtml(inlineToRuns(item.content))}${blocksToHtml(item.children ?? [])}</li>`;\n i += 1;\n }\n html += `</${tag}>`;\n continue;\n }\n html += blockHtml(block);\n if (block.children?.length) html += `<div style=\"margin-left:1.5em\">${blocksToHtml(block.children)}</div>`;\n i += 1;\n }\n return html;\n}\n\n/** Page styling for the standalone HTML and print/PDF outputs (web PAGE_CSS). */\nconst PAGE_CSS = `\n@page { size: letter; margin: 1in; }\n:root { color-scheme: light; }\nbody {\n margin: 0 auto; max-width: 6.5in; padding: 1in 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 11pt; line-height: 1.6; color: #18181b;\n}\nh1, h2, h3 { line-height: 1.25; margin: 1.6em 0 0.5em; }\nh1 { font-size: 1.9em } h2 { font-size: 1.45em } h3 { font-size: 1.15em }\np, ul, ol, blockquote, pre, table, figure { margin: 0 0 0.85em }\nul, ol { padding-left: 1.4em }\nblockquote { border-left: 3px solid #d4d4d8; margin-left: 0; padding-left: 1em; color: #52525b }\npre, code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9em }\npre { background: #f4f4f5; padding: 0.8em 1em; border-radius: 6px; white-space: pre-wrap }\nimg { max-width: 100%; height: auto }\nfigcaption { font-size: 0.9em; color: #71717a; text-align: center }\ntable { border-collapse: collapse; width: 100% }\nth, td { border: 1px solid #d4d4d8; padding: 0.4em 0.6em; text-align: left }\nth { background: #f4f4f5; font-weight: 600 }\n@media print { body { padding: 0 } a { color: inherit; text-decoration: none } }\n`;\n\n/** A complete, self-contained HTML document: the `.html` export and the PDF print source. */\nexport function standaloneHtml(title: string, bodyHtml: string): string {\n return `<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>${escapeHtml(\n title,\n )}</title><style>${PAGE_CSS}</style></head><body>${bodyHtml}</body></html>`;\n}\n\n/** HTML Word treats as its own document (web `toWordFile`, as text). */\nexport function toWordHtml(title: string, bodyHtml: string): string {\n return `<!doctype html>\n<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns=\"http://www.w3.org/TR/REC-html40\">\n<head>\n<meta charset=\"utf-8\">\n<title>${escapeHtml(title)}</title>\n</head>\n<body>\n${bodyHtml}\n</body>\n</html>`;\n}\n\n/** Strip characters that break filenames across OSes; never returns an empty name. */\nexport function fileSafe(title: string): string {\n const cleaned = title\n .replace(/[/\\\\?%*:|\"<>]/g, '-')\n .trim()\n .slice(0, 80);\n return cleaned || 'document';\n}\n\n// ── Markdown ───────────────────────────────────────────────────────────\n\nconst mdEscape = (s: string) => s.replace(/([\\\\`*_[\\]])/g, '\\\\$1');\n\nfunction runsMarkdown(runs: readonly Run[]): string {\n return runs\n .map((run) => {\n const s = run.styles;\n if (s.code) {\n const code = `\\`${run.text}\\``;\n return run.href && safeHref(run.href) ? `[${code}](${safeHref(run.href)})` : code;\n }\n // Marks wrap the words, not surrounding spaces (`** bold**` does not render).\n const match = /^(\\s*)([\\s\\S]*?)(\\s*)$/.exec(run.text);\n const [lead, body, trail] = match ? [match[1], match[2], match[3]] : ['', run.text, ''];\n if (!body) return run.text;\n let md = mdEscape(body);\n if (s.bold) md = `**${md}**`;\n if (s.italic) md = `_${md}_`;\n if (s.strike) md = `~~${md}~~`;\n if (s.underline) md = `<u>${md}</u>`;\n const href = run.href ? safeHref(run.href) : null;\n if (href) md = `[${md}](${href})`;\n return `${lead}${md}${trail}`;\n })\n .join('');\n}\n\n/** Blocks to GitHub-flavoured Markdown. */\nexport function blocksToMarkdown(blocks: readonly DocBlock[]): string {\n const lines: string[] = [];\n for (const { block, depth, number } of flattenBlocks(blocks)) {\n const indent = ' '.repeat(depth);\n const text = runsMarkdown(inlineToRuns(block.content));\n switch (block.type) {\n case 'heading': {\n const level = [1, 2, 3].includes(Number(block.props?.level)) ? Number(block.props?.level) : 1;\n lines.push(`${'#'.repeat(level)} ${text}`, '');\n break;\n }\n case 'bulletListItem':\n lines.push(`${indent}- ${text}`);\n break;\n case 'numberedListItem':\n lines.push(`${indent}${number ?? 1}. ${text}`);\n break;\n case 'checkListItem':\n lines.push(`${indent}- [${block.props?.checked ? 'x' : ' '}] ${text}`);\n break;\n case 'quote':\n lines.push(`> ${text}`, '');\n break;\n case 'codeBlock': {\n const lang =\n typeof block.props?.language === 'string' && block.props.language !== 'text'\n ? block.props.language\n : '';\n const code = inlineToRuns(block.content)\n .map((r) => r.text)\n .join('');\n lines.push(`\\`\\`\\`${lang}`, code, '```', '');\n break;\n }\n case 'image': {\n const url = typeof block.props?.url === 'string' ? block.props.url : '';\n if (/^https?:/i.test(url)) {\n const caption = typeof block.props?.caption === 'string' ? block.props.caption : '';\n lines.push(``, '');\n }\n break;\n }\n case 'table': {\n const table = block.content as TableContent | undefined;\n const rows = isObject(table) && Array.isArray(table.rows) ? table.rows : [];\n rows.forEach((row, r) => {\n const cells = (Array.isArray(row?.cells) ? row.cells : []).map((cell) =>\n runsMarkdown(tableCellRuns(cell)).replace(/\\|/g, '\\\\|').replace(/\\n/g, ' '),\n );\n lines.push(`| ${cells.join(' | ')} |`);\n if (r === 0) lines.push(`|${cells.map(() => ' --- ').join('|')}|`);\n });\n lines.push('');\n break;\n }\n default:\n lines.push(text, '');\n }\n }\n return `${lines\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()}\\n`;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import {Share,Platform}from'react-native';import {fileSafe}from'./docExport.js';async function shareText(text, title) {
|
|
2
|
+
const result = await Share.share({
|
|
3
|
+
message: text,
|
|
4
|
+
title
|
|
5
|
+
});
|
|
6
|
+
return result.action === Share.dismissedAction ? "cancelled" : "shared";
|
|
7
|
+
}
|
|
8
|
+
async function shareFile(title, ext, content, mime) {
|
|
9
|
+
var _a;
|
|
10
|
+
const FileSystem = require("expo-file-system");
|
|
11
|
+
const stem = fileSafe(title);
|
|
12
|
+
if (Platform.OS === "android") {
|
|
13
|
+
const saf = FileSystem.StorageAccessFramework;
|
|
14
|
+
const permission = await saf.requestDirectoryPermissionsAsync();
|
|
15
|
+
if (!permission.granted) return "cancelled";
|
|
16
|
+
const target = await saf.createFileAsync(permission.directoryUri, stem, mime);
|
|
17
|
+
await FileSystem.writeAsStringAsync(target, content, {
|
|
18
|
+
encoding: FileSystem.EncodingType.UTF8
|
|
19
|
+
});
|
|
20
|
+
return "saved";
|
|
21
|
+
}
|
|
22
|
+
const dir = `${(_a = FileSystem.cacheDirectory) != null ? _a : ""}doc-exports/`;
|
|
23
|
+
await FileSystem.makeDirectoryAsync(dir, {
|
|
24
|
+
intermediates: true
|
|
25
|
+
}).catch(() => void 0);
|
|
26
|
+
const uri = `${dir}${Date.now()}-${stem}.${ext}`;
|
|
27
|
+
await FileSystem.writeAsStringAsync(uri, content, {
|
|
28
|
+
encoding: FileSystem.EncodingType.UTF8
|
|
29
|
+
});
|
|
30
|
+
const result = await Share.share({
|
|
31
|
+
url: uri,
|
|
32
|
+
title
|
|
33
|
+
});
|
|
34
|
+
return result.action === Share.dismissedAction ? "cancelled" : "shared";
|
|
35
|
+
}
|
|
36
|
+
async function sharePdf(title, html) {
|
|
37
|
+
let Print = null;
|
|
38
|
+
try {
|
|
39
|
+
Print = require("expo-print");
|
|
40
|
+
} catch (e) {
|
|
41
|
+
Print = null;
|
|
42
|
+
}
|
|
43
|
+
if (Print && Platform.OS === "ios" && typeof Print.printToFileAsync === "function") {
|
|
44
|
+
const {
|
|
45
|
+
uri
|
|
46
|
+
} = await Print.printToFileAsync({
|
|
47
|
+
html
|
|
48
|
+
});
|
|
49
|
+
const result = await Share.share({
|
|
50
|
+
url: uri,
|
|
51
|
+
title
|
|
52
|
+
});
|
|
53
|
+
return result.action === Share.dismissedAction ? "cancelled" : "shared";
|
|
54
|
+
}
|
|
55
|
+
if (Print && typeof Print.printAsync === "function") {
|
|
56
|
+
await Print.printAsync({
|
|
57
|
+
html
|
|
58
|
+
});
|
|
59
|
+
return "printed";
|
|
60
|
+
}
|
|
61
|
+
return shareFile(title, "html", html, "text/html");
|
|
62
|
+
}export{shareFile,sharePdf,shareText};//# sourceMappingURL=docShare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docShare.js","sources":["../../../src/features/docs/docShare.ts"],"sourcesContent":["/**\n * Handing a doc export to the phone (the web editor's downloads).\n *\n * Text (Markdown) goes straight to the share sheet. A file (HTML, Word) is\n * written to the cache and shared on iOS; Android cannot share a bare file\n * URI, so it saves into a folder the person picks (as `study/shareExport`).\n * PDF prints through expo-print when the binary has it: iOS shares the\n * rendered file, Android opens the system print dialog (its \"Save as PDF\").\n * Without expo-print, the HTML is shared so it can be printed elsewhere.\n */\nimport { Platform, Share } from 'react-native';\nimport { fileSafe } from './docExport';\n\ntype FileSystemModule = typeof import('expo-file-system');\n\nexport type ShareOutcome = 'shared' | 'saved' | 'printed' | 'cancelled';\n\nexport async function shareText(text: string, title: string): Promise<ShareOutcome> {\n const result = await Share.share({ message: text, title });\n return result.action === Share.dismissedAction ? 'cancelled' : 'shared';\n}\n\nexport async function shareFile(title: string, ext: string, content: string, mime: string): Promise<ShareOutcome> {\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n const FileSystem = require('expo-file-system') as FileSystemModule;\n const stem = fileSafe(title);\n if (Platform.OS === 'android') {\n const saf = FileSystem.StorageAccessFramework;\n const permission = await saf.requestDirectoryPermissionsAsync();\n if (!permission.granted) return 'cancelled';\n const target = await saf.createFileAsync(permission.directoryUri, stem, mime);\n await FileSystem.writeAsStringAsync(target, content, { encoding: FileSystem.EncodingType.UTF8 });\n return 'saved';\n }\n const dir = `${FileSystem.cacheDirectory ?? ''}doc-exports/`;\n await FileSystem.makeDirectoryAsync(dir, { intermediates: true }).catch(() => undefined);\n const uri = `${dir}${Date.now()}-${stem}.${ext}`;\n await FileSystem.writeAsStringAsync(uri, content, { encoding: FileSystem.EncodingType.UTF8 });\n const result = await Share.share({ url: uri, title });\n return result.action === Share.dismissedAction ? 'cancelled' : 'shared';\n}\n\ninterface PrintModule {\n printAsync?: (opts: { html: string }) => Promise<void>;\n printToFileAsync?: (opts: { html: string }) => Promise<{ uri: string }>;\n}\n\n/** Is expo-print in this binary? (Print is offered either way: without it, the HTML is shared.) */\nexport function hasPrint(): boolean {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n const Print = require('expo-print') as PrintModule;\n return typeof Print?.printAsync === 'function';\n } catch {\n return false;\n }\n}\n\nexport async function sharePdf(title: string, html: string): Promise<ShareOutcome> {\n let Print: PrintModule | null = null;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports, global-require\n Print = require('expo-print') as PrintModule;\n } catch {\n Print = null;\n }\n if (Print && Platform.OS === 'ios' && typeof Print.printToFileAsync === 'function') {\n const { uri } = await Print.printToFileAsync({ html });\n const result = await Share.share({ url: uri, title });\n return result.action === Share.dismissedAction ? 'cancelled' : 'shared';\n }\n if (Print && typeof Print.printAsync === 'function') {\n await Print.printAsync({ html });\n return 'printed';\n }\n return shareFile(title, 'html', html, 'text/html');\n}\n"],"names":[],"mappings":"gFAcsB,eAAA,SAAA,CAAU,MAAc,KAAsC,EAAA;AAClF,EAAM,MAAA,MAAA,GAAS,MAAM,KAAA,CAAM,KAAM,CAAA;AAAA,IAC/B,OAAS,EAAA,IAAA;AAAA,IACT;AAAA,GACD,CAAA;AACD,EAAA,OAAO,MAAO,CAAA,MAAA,KAAW,KAAM,CAAA,eAAA,GAAkB,WAAc,GAAA,QAAA;AACjE;AACA,eAAsB,SAAU,CAAA,KAAA,EAAe,GAAa,EAAA,OAAA,EAAiB,IAAqC,EAAA;AArBlH,EAAA,IAAA,EAAA;AAuBE,EAAM,MAAA,UAAA,GAAa,QAAQ,kBAAkB,CAAA;AAC7C,EAAM,MAAA,IAAA,GAAO,SAAS,KAAK,CAAA;AAC3B,EAAI,IAAA,QAAA,CAAS,OAAO,SAAW,EAAA;AAC7B,IAAA,MAAM,MAAM,UAAW,CAAA,sBAAA;AACvB,IAAM,MAAA,UAAA,GAAa,MAAM,GAAA,CAAI,gCAAiC,EAAA;AAC9D,IAAI,IAAA,CAAC,UAAW,CAAA,OAAA,EAAgB,OAAA,WAAA;AAChC,IAAA,MAAM,SAAS,MAAM,GAAA,CAAI,gBAAgB,UAAW,CAAA,YAAA,EAAc,MAAM,IAAI,CAAA;AAC5E,IAAM,MAAA,UAAA,CAAW,kBAAmB,CAAA,MAAA,EAAQ,OAAS,EAAA;AAAA,MACnD,QAAA,EAAU,WAAW,YAAa,CAAA;AAAA,KACnC,CAAA;AACD,IAAO,OAAA,OAAA;AAAA;AAET,EAAA,MAAM,GAAM,GAAA,CAAA,EAAA,CAAG,EAAW,GAAA,UAAA,CAAA,cAAA,KAAX,YAA6B,EAAE,CAAA,YAAA,CAAA;AAC9C,EAAM,MAAA,UAAA,CAAW,mBAAmB,GAAK,EAAA;AAAA,IACvC,aAAe,EAAA;AAAA,GAChB,CAAA,CAAE,KAAM,CAAA,MAAM,MAAS,CAAA;AACxB,EAAM,MAAA,GAAA,GAAM,CAAG,EAAA,GAAG,CAAG,EAAA,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC9C,EAAM,MAAA,UAAA,CAAW,kBAAmB,CAAA,GAAA,EAAK,OAAS,EAAA;AAAA,IAChD,QAAA,EAAU,WAAW,YAAa,CAAA;AAAA,GACnC,CAAA;AACD,EAAM,MAAA,MAAA,GAAS,MAAM,KAAA,CAAM,KAAM,CAAA;AAAA,IAC/B,GAAK,EAAA,GAAA;AAAA,IACL;AAAA,GACD,CAAA;AACD,EAAA,OAAO,MAAO,CAAA,MAAA,KAAW,KAAM,CAAA,eAAA,GAAkB,WAAc,GAAA,QAAA;AACjE;AAsBsB,eAAA,QAAA,CAAS,OAAe,IAAqC,EAAA;AACjF,EAAA,IAAI,KAA4B,GAAA,IAAA;AAChC,EAAI,IAAA;AAEF,IAAA,KAAA,GAAQ,QAAQ,YAAY,CAAA;AAAA,GACtB,CAAA,OAAA,CAAA,EAAA;AACN,IAAQ,KAAA,GAAA,IAAA;AAAA;AAEV,EAAA,IAAI,SAAS,QAAS,CAAA,EAAA,KAAO,SAAS,OAAO,KAAA,CAAM,qBAAqB,UAAY,EAAA;AAClF,IAAM,MAAA;AAAA,MACJ;AAAA,KACF,GAAI,MAAM,KAAA,CAAM,gBAAiB,CAAA;AAAA,MAC/B;AAAA,KACD,CAAA;AACD,IAAM,MAAA,MAAA,GAAS,MAAM,KAAA,CAAM,KAAM,CAAA;AAAA,MAC/B,GAAK,EAAA,GAAA;AAAA,MACL;AAAA,KACD,CAAA;AACD,IAAA,OAAO,MAAO,CAAA,MAAA,KAAW,KAAM,CAAA,eAAA,GAAkB,WAAc,GAAA,QAAA;AAAA;AAEjE,EAAA,IAAI,KAAS,IAAA,OAAO,KAAM,CAAA,UAAA,KAAe,UAAY,EAAA;AACnD,IAAA,MAAM,MAAM,UAAW,CAAA;AAAA,MACrB;AAAA,KACD,CAAA;AACD,IAAO,OAAA,SAAA;AAAA;AAET,EAAA,OAAO,SAAU,CAAA,KAAA,EAAO,MAAQ,EAAA,IAAA,EAAM,WAAW,CAAA;AACnD"}
|
|
@@ -1,7 +1,31 @@
|
|
|
1
|
-
import {CommonActions}from'@react-navigation/native';import*as WebBrowser from'expo-web-browser';import {Linking}from'react-native';
|
|
1
|
+
import {CommonActions}from'@react-navigation/native';import*as WebBrowser from'expo-web-browser';import {Linking}from'react-native';import {designOpeningFromUrl}from'../design/surface/designLinks.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
17
|
+
function surfaceTitle(slug) {
|
|
2
18
|
return slug.split(/[-_]+/).filter(Boolean).map((word) => word[0].toUpperCase() + word.slice(1)).join(" ");
|
|
3
19
|
}
|
|
4
20
|
function openSurfaceInApp(navigation, target) {
|
|
21
|
+
var _a;
|
|
22
|
+
const design = target.surface === "design" || target.surface === "design-native" ? (_a = designOpeningFromUrl(target.url)) != null ? _a : {
|
|
23
|
+
templates: false
|
|
24
|
+
} : designOpeningFromUrl(target.url);
|
|
25
|
+
if (design) {
|
|
26
|
+
openDesignNative(navigation, design);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
5
29
|
navigation.dispatch(CommonActions.navigate({
|
|
6
30
|
name: "MainStack.WebBuilder",
|
|
7
31
|
params: {
|
|
@@ -10,6 +34,18 @@ function openSurfaceInApp(navigation, target) {
|
|
|
10
34
|
}
|
|
11
35
|
}));
|
|
12
36
|
}
|
|
37
|
+
function openDesignNative(navigation, opening) {
|
|
38
|
+
var _a;
|
|
39
|
+
navigation.dispatch(CommonActions.navigate({
|
|
40
|
+
name: "MainStack.DesignNative",
|
|
41
|
+
params: __spreadValues({
|
|
42
|
+
appTitle: "Design"
|
|
43
|
+
}, opening.templates ? {
|
|
44
|
+
templates: Date.now(),
|
|
45
|
+
templatesQuery: (_a = opening.templatesQuery) != null ? _a : ""
|
|
46
|
+
} : {})
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
13
49
|
async function openWebPageInApp(url) {
|
|
14
50
|
try {
|
|
15
51
|
if (/^https?:\/\//i.test(url)) {
|
|
@@ -22,4 +58,4 @@ async function openWebPageInApp(url) {
|
|
|
22
58
|
await Linking.openURL(url);
|
|
23
59
|
} catch (e) {
|
|
24
60
|
}
|
|
25
|
-
}export{openSurfaceInApp,openWebPageInApp,surfaceTitle};//# sourceMappingURL=openInApp.js.map
|
|
61
|
+
}export{openDesignNative,openSurfaceInApp,openWebPageInApp,surfaceTitle};//# sourceMappingURL=openInApp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openInApp.js","sources":["../../../src/features/links/openInApp.ts"],"sourcesContent":["/**\n * Where a tapped link opens on the phone.\n *\n * A Yantra surface page opens in the app's own surface screen (WebBuilder),\n * which hands the page this device's sign-in - so a bounty link opens the\n * bounty in Freelance, signed in, ready to apply. Any other web page opens in\n * an in-app browser sheet, so reading a link never drops the person out of\n * Yantra. WHICH links are surface pages is the messenger gateway's call\n * (`Query.gatewayLinkPreview` -> `open`), not decided here.\n *\n * Shared by the messenger's host seam (portable-devices `useChatLinkSeam`) and\n * the assistant chat, so a link behaves the same wherever it was tapped.\n */\nimport { CommonActions, type NavigationProp, type ParamListBase } from '@react-navigation/native';\nimport * as WebBrowser from 'expo-web-browser';\nimport { Linking } from 'react-native';\n\nexport interface InAppSurfaceTarget {\n surface: string;\n url: string;\n}\n\n/** `freelance` -> `Freelance`, `job-search` -> `Job Search`: the surface screen's header. */\nexport function surfaceTitle(slug: string): string {\n return slug\n .split(/[-_]+/)\n .filter(Boolean)\n .map((word) => word[0].toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Open a surface page in the app's surface screen - the same navigation the\n * Apps catalog uses to open a surface tile, with the link's page as its URL.\n */\nexport function openSurfaceInApp(\n navigation: Pick<NavigationProp<ParamListBase>, 'dispatch'>,\n target: InAppSurfaceTarget,\n): void {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params: { url: target.url, appTitle: surfaceTitle(target.surface) },\n }),\n );\n}\n\n/** Open a web page in an in-app browser sheet; anything that is not a web page goes to the OS. */\nexport async function openWebPageInApp(url: string): Promise<void> {\n try {\n if (/^https?:\\/\\//i.test(url)) {\n await WebBrowser.openBrowserAsync(url, {\n presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,\n dismissButtonStyle: 'close',\n });\n return;\n }\n await Linking.openURL(url);\n } catch {\n // A link that cannot be opened must not take the screen down with it.\n }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openInApp.js","sources":["../../../src/features/links/openInApp.ts"],"sourcesContent":["/**\n * Where a tapped link opens on the phone.\n *\n * A Yantra surface page opens in the app's own surface screen (WebBuilder),\n * which hands the page this device's sign-in - so a bounty link opens the\n * bounty in Freelance, signed in, ready to apply. Any other web page opens in\n * an in-app browser sheet, so reading a link never drops the person out of\n * Yantra. WHICH links are surface pages is the messenger gateway's call\n * (`Query.gatewayLinkPreview` -> `open`), not decided here.\n *\n * Shared by the messenger's host seam (portable-devices `useChatLinkSeam`) and\n * the assistant chat, so a link behaves the same wherever it was tapped.\n */\nimport { CommonActions, type NavigationProp, type ParamListBase } from '@react-navigation/native';\nimport * as WebBrowser from 'expo-web-browser';\nimport { Linking } from 'react-native';\nimport { designOpeningFromUrl } from '../design/surface/designLinks';\n\nexport interface InAppSurfaceTarget {\n surface: string;\n url: string;\n}\n\n/** `freelance` -> `Freelance`, `job-search` -> `Job Search`: the surface screen's header. */\nexport function surfaceTitle(slug: string): string {\n return slug\n .split(/[-_]+/)\n .filter(Boolean)\n .map((word) => word[0].toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Open a surface page in the app's surface screen - the same navigation the\n * Apps catalog uses to open a surface tile, with the link's page as its URL.\n */\nexport function openSurfaceInApp(\n navigation: Pick<NavigationProp<ParamListBase>, 'dispatch'>,\n target: InAppSurfaceTarget,\n): void {\n // The Design surface has a native screen: its links open there (on the template\n // gallery when they ask for design templates), never the web surface in a WebView.\n const design =\n target.surface === 'design' || target.surface === 'design-native'\n ? (designOpeningFromUrl(target.url) ?? { templates: false })\n : designOpeningFromUrl(target.url);\n if (design) {\n openDesignNative(navigation, design);\n return;\n }\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.WebBuilder',\n params: { url: target.url, appTitle: surfaceTitle(target.surface) },\n }),\n );\n}\n\n/** Native Design, optionally on its template gallery with a search. */\nexport function openDesignNative(\n navigation: Pick<NavigationProp<ParamListBase>, 'dispatch'>,\n opening: { templates: boolean; templatesQuery?: string },\n): void {\n navigation.dispatch(\n CommonActions.navigate({\n name: 'MainStack.DesignNative',\n params: {\n appTitle: 'Design',\n // A fresh value each time, so a second card re-opens the gallery on the reused screen.\n ...(opening.templates ? { templates: Date.now(), templatesQuery: opening.templatesQuery ?? '' } : {}),\n },\n }),\n );\n}\n\n/** Open a web page in an in-app browser sheet; anything that is not a web page goes to the OS. */\nexport async function openWebPageInApp(url: string): Promise<void> {\n try {\n if (/^https?:\\/\\//i.test(url)) {\n await WebBrowser.openBrowserAsync(url, {\n presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,\n dismissButtonStyle: 'close',\n });\n return;\n }\n await Linking.openURL(url);\n } catch {\n // A link that cannot be opened must not take the screen down with it.\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAuBO,SAAS,aAAa,IAAsB,EAAA;AACjD,EAAO,OAAA,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,IAAI,CAAQ,IAAA,KAAA,IAAA,CAAK,CAAC,CAAE,CAAA,WAAA,KAAgB,IAAK,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACxG;AAMgB,SAAA,gBAAA,CAAiB,YAA6D,MAAkC,EAAA;AA/BhI,EAAA,IAAA,EAAA;AAkCE,EAAM,MAAA,MAAA,GAAS,MAAO,CAAA,OAAA,KAAY,QAAY,IAAA,MAAA,CAAO,OAAY,KAAA,eAAA,GAAA,CAAkB,EAAqB,GAAA,oBAAA,CAAA,MAAA,CAAO,GAAG,CAAA,KAA/B,IAAoC,GAAA,EAAA,GAAA;AAAA,IACrH,SAAW,EAAA;AAAA,GACb,GAAI,oBAAqB,CAAA,MAAA,CAAO,GAAG,CAAA;AACnC,EAAA,IAAI,MAAQ,EAAA;AACV,IAAA,gBAAA,CAAiB,YAAY,MAAM,CAAA;AACnC,IAAA;AAAA;AAEF,EAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,IACzC,IAAM,EAAA,sBAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,KAAK,MAAO,CAAA,GAAA;AAAA,MACZ,QAAA,EAAU,YAAa,CAAA,MAAA,CAAO,OAAO;AAAA;AACvC,GACD,CAAC,CAAA;AACJ;AAGgB,SAAA,gBAAA,CAAiB,YAA6D,OAGrF,EAAA;AAtDT,EAAA,IAAA,EAAA;AAuDE,EAAW,UAAA,CAAA,QAAA,CAAS,cAAc,QAAS,CAAA;AAAA,IACzC,IAAM,EAAA,wBAAA;AAAA,IACN,MAAQ,EAAA,cAAA,CAAA;AAAA,MACN,QAAU,EAAA;AAAA,KAAA,EAEN,QAAQ,SAAY,GAAA;AAAA,MACtB,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,MACpB,cAAA,EAAA,CAAgB,EAAQ,GAAA,OAAA,CAAA,cAAA,KAAR,IAA0B,GAAA,EAAA,GAAA;AAAA,QACxC,EAAC;AAAA,GAER,CAAC,CAAA;AACJ;AAGA,eAAsB,iBAAiB,GAA4B,EAAA;AACjE,EAAI,IAAA;AACF,IAAI,IAAA,eAAA,CAAgB,IAAK,CAAA,GAAG,CAAG,EAAA;AAC7B,MAAM,MAAA,UAAA,CAAW,iBAAiB,GAAK,EAAA;AAAA,QACrC,iBAAA,EAAmB,WAAW,2BAA4B,CAAA,UAAA;AAAA,QAC1D,kBAAoB,EAAA;AAAA,OACrB,CAAA;AACD,MAAA;AAAA;AAEF,IAAM,MAAA,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,GACnB,CAAA,OAAA,CAAA,EAAA;AAAA;AAGV"}
|
package/lib/routes.json
CHANGED
|
@@ -1177,6 +1177,60 @@
|
|
|
1177
1177
|
"hasComponent": true
|
|
1178
1178
|
}
|
|
1179
1179
|
},
|
|
1180
|
+
{
|
|
1181
|
+
"/:orgName/c/design-native": {
|
|
1182
|
+
"key": "design-native",
|
|
1183
|
+
"path": "/:orgName/c/design-native",
|
|
1184
|
+
"name": "DesignNative",
|
|
1185
|
+
"exact": true,
|
|
1186
|
+
"priority": 4,
|
|
1187
|
+
"hideInMenu": true,
|
|
1188
|
+
"auth": true,
|
|
1189
|
+
"menu_position": "side",
|
|
1190
|
+
"importPaths": {
|
|
1191
|
+
"navigationHeader": "@adminide-stack/yantra-mobile/lib/components/NavigationHeader/NavigationHeader.js"
|
|
1192
|
+
},
|
|
1193
|
+
"customHeader": {
|
|
1194
|
+
"name": "NavigationHeader",
|
|
1195
|
+
"component": "$.importPaths.navigationHeader",
|
|
1196
|
+
"props": {
|
|
1197
|
+
"showTitle": true,
|
|
1198
|
+
"showToggle": false,
|
|
1199
|
+
"showFilter": false,
|
|
1200
|
+
"isSearchBack": false,
|
|
1201
|
+
"showBack": true,
|
|
1202
|
+
"showGateway": false,
|
|
1203
|
+
"showHistory": false,
|
|
1204
|
+
"showNewChat": false
|
|
1205
|
+
}
|
|
1206
|
+
},
|
|
1207
|
+
"props": {
|
|
1208
|
+
"initialParams": {
|
|
1209
|
+
"orgName": null,
|
|
1210
|
+
"hideNavigationHeader": true
|
|
1211
|
+
},
|
|
1212
|
+
"options": {
|
|
1213
|
+
"title": "Design",
|
|
1214
|
+
"headerTintColor": "black",
|
|
1215
|
+
"headerTitleStyle": {
|
|
1216
|
+
"fontWeight": "bold"
|
|
1217
|
+
},
|
|
1218
|
+
"drawerItemStyle": {
|
|
1219
|
+
"display": "none"
|
|
1220
|
+
},
|
|
1221
|
+
"headerTitleAlign": "left",
|
|
1222
|
+
"gestureEnabled": false,
|
|
1223
|
+
"swipeEnabled": false,
|
|
1224
|
+
"animation": "fade",
|
|
1225
|
+
"animationTypeForReplace": "pop",
|
|
1226
|
+
"keyboardHandlingEnabled": false,
|
|
1227
|
+
"freezeOnBlur": true
|
|
1228
|
+
}
|
|
1229
|
+
},
|
|
1230
|
+
"componentPath": "@adminide-stack/yantra-mobile/lib/screens/DesignNative/index.js",
|
|
1231
|
+
"hasComponent": true
|
|
1232
|
+
}
|
|
1233
|
+
},
|
|
1180
1234
|
{
|
|
1181
1235
|
"/:orgName/c/travel-native": {
|
|
1182
1236
|
"key": "travel-native",
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import {jsx}from'react/jsx-runtime';import {useMemo,useCallback}from'react';import {View,StyleSheet}from'react-native';import {useNavigation,useRoute}from'@react-navigation/native';import {DesignSurfaceExperience}from'../../features/design/surface/DesignSurfaceExperience.js';import {PendingConnectorConnectCard}from'../../features/chat/ConnectorConnectPrompt.js';import {CanvasThemeProvider}from'../../features/canvas/canvasTheme.js';import {useCanvasSession}from'../../features/canvas/useCanvasSession.js';import {useAppTheme}from'../../theme/AppThemeProvider.js';function DesignNativeScreen() {
|
|
2
|
+
var _a, _b;
|
|
3
|
+
const navigation = useNavigation();
|
|
4
|
+
const route = useRoute();
|
|
5
|
+
const templates = (_a = route.params) == null ? void 0 : _a.templates;
|
|
6
|
+
const templatesQuery = (_b = route.params) == null ? void 0 : _b.templatesQuery;
|
|
7
|
+
const openTemplates = useMemo(() => templates ? {
|
|
8
|
+
query: typeof templatesQuery === "string" ? templatesQuery : void 0
|
|
9
|
+
} : null, [templates, templatesQuery]);
|
|
10
|
+
const {
|
|
11
|
+
isDark
|
|
12
|
+
} = useAppTheme();
|
|
13
|
+
const {
|
|
14
|
+
token,
|
|
15
|
+
indexUrl,
|
|
16
|
+
error,
|
|
17
|
+
ready
|
|
18
|
+
} = useCanvasSession();
|
|
19
|
+
const onClose = useCallback(() => {
|
|
20
|
+
var _a2;
|
|
21
|
+
if ((_a2 = navigation.canGoBack) == null ? void 0 : _a2.call(navigation)) navigation.goBack();
|
|
22
|
+
}, [navigation]);
|
|
23
|
+
return /* @__PURE__ */ jsx(CanvasThemeProvider, { mode: isDark ? "dark" : "light", children: /* @__PURE__ */ jsx(View, { style: [styles.fill, {
|
|
24
|
+
backgroundColor: isDark ? "#0a0a0a" : "#ffffff"
|
|
25
|
+
}], children: /* @__PURE__ */ jsx(DesignSurfaceExperience, { token, indexUrl, sessionError: ready ? error : null, openTemplates, renderConnectorCard, onClose }) }) });
|
|
26
|
+
}
|
|
27
|
+
const renderConnectorCard = (thread, send, isDark) => /* @__PURE__ */ jsx(PendingConnectorConnectCard, { messages: thread, send, isDark, style: styles.card });
|
|
28
|
+
const styles = StyleSheet.create({
|
|
29
|
+
card: {
|
|
30
|
+
marginBottom: 8
|
|
31
|
+
},
|
|
32
|
+
fill: {
|
|
33
|
+
flex: 1
|
|
34
|
+
}
|
|
35
|
+
});export{DesignNativeScreen as default};//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/screens/DesignNative/index.tsx"],"sourcesContent":["/**\n * Native Design screen - host route for the native port of the web Design\n * surface (features/design/surface): AI web design on the same boards, the\n * same connector and the same prompts as the web.\n *\n * Replaces the Design tile's WebView lane (the web surface at\n * DESIGN_SURFACE_URL). The screen only hands over what needs the app's data\n * stack - a token the surface index and agent accept, the index URL - and the theme.\n */\nimport React, { useCallback, useMemo } from 'react';\nimport { StyleSheet, View } from 'react-native';\nimport { useNavigation, useRoute } from '@react-navigation/native';\nimport { DesignSurfaceExperience } from '../../features/design/surface/DesignSurfaceExperience';\nimport type { RenderDesignConnectorCard } from '../../features/design/surface/DesignAgentChatPane';\nimport { PendingConnectorConnectCard } from '../../features/chat/ConnectorConnectPrompt';\nimport { CanvasThemeProvider } from '../../features/canvas/canvasTheme';\nimport { useCanvasSession } from '../../features/canvas/useCanvasSession';\nimport { useAppTheme } from '../../theme/AppThemeProvider';\n\nexport default function DesignNativeScreen() {\n const navigation = useNavigation<any>();\n const route = useRoute<any>();\n // A chat card or a Design surface link that asked for design templates (designLinks.ts).\n const templates = route.params?.templates;\n const templatesQuery = route.params?.templatesQuery;\n const openTemplates = useMemo(\n () => (templates ? { query: typeof templatesQuery === 'string' ? templatesQuery : undefined } : null),\n [templates, templatesQuery],\n );\n const { isDark } = useAppTheme();\n const { token, indexUrl, error, ready } = useCanvasSession();\n\n const onClose = useCallback(() => {\n if (navigation.canGoBack?.()) navigation.goBack();\n }, [navigation]);\n\n return (\n <CanvasThemeProvider mode={isDark ? 'dark' : 'light'}>\n <View style={[styles.fill, { backgroundColor: isDark ? '#0a0a0a' : '#ffffff' }]}>\n <DesignSurfaceExperience\n token={token}\n indexUrl={indexUrl}\n sessionError={ready ? error : null}\n openTemplates={openTemplates}\n renderConnectorCard={renderConnectorCard}\n onClose={onClose}\n />\n </View>\n </CanvasThemeProvider>\n );\n}\n\n/** The board chat's connect card: the host's own, as the other native apps get it (useHostConnectorCard). */\nconst renderConnectorCard: RenderDesignConnectorCard = (thread, send, isDark) => (\n <PendingConnectorConnectCard messages={thread} send={send} isDark={isDark} style={styles.card} />\n);\n\nconst styles = StyleSheet.create({\n card: { marginBottom: 8 },\n fill: { flex: 1 },\n});\n"],"names":["_a"],"mappings":"sjBAkBA,SAAwB,kBAAqB,GAAA;AAlB7C,EAAA,IAAA,EAAA,EAAA,EAAA;AAmBE,EAAA,MAAM,aAAa,aAAmB,EAAA;AACtC,EAAA,MAAM,QAAQ,QAAc,EAAA;AAE5B,EAAM,MAAA,SAAA,GAAA,CAAY,EAAM,GAAA,KAAA,CAAA,MAAA,KAAN,IAAc,GAAA,MAAA,GAAA,EAAA,CAAA,SAAA;AAChC,EAAM,MAAA,cAAA,GAAA,CAAiB,EAAM,GAAA,KAAA,CAAA,MAAA,KAAN,IAAc,GAAA,MAAA,GAAA,EAAA,CAAA,cAAA;AACrC,EAAM,MAAA,aAAA,GAAgB,OAAQ,CAAA,MAAM,SAAY,GAAA;AAAA,IAC9C,KAAO,EAAA,OAAO,cAAmB,KAAA,QAAA,GAAW,cAAiB,GAAA;AAAA,GAC3D,GAAA,IAAA,EAAM,CAAC,SAAA,EAAW,cAAc,CAAC,CAAA;AACrC,EAAM,MAAA;AAAA,IACJ;AAAA,MACE,WAAY,EAAA;AAChB,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,MACE,gBAAiB,EAAA;AACrB,EAAM,MAAA,OAAA,GAAU,YAAY,MAAM;AApCpC,IAAAA,IAAAA,GAAAA;AAqCI,IAAA,IAAA,CAAIA,MAAA,UAAW,CAAA,SAAA,KAAX,gBAAAA,GAAA,CAAA,IAAA,CAAA,UAAA,CAAA,aAAqC,MAAO,EAAA;AAAA,GAClD,EAAG,CAAC,UAAU,CAAC,CAAA;AACf,EAAO,uBAAA,GAAA,CAAC,mBAAoB,EAAA,EAAA,IAAA,EAAM,MAAS,GAAA,MAAA,GAAS,OAC1C,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,IACjC,eAAA,EAAiB,SAAS,SAAY,GAAA;AAAA,GACvC,CAAA,EACW,QAAC,kBAAA,GAAA,CAAA,uBAAA,EAAA,EAAwB,OAAc,QAAoB,EAAA,YAAA,EAAc,KAAQ,GAAA,KAAA,GAAQ,IAAM,EAAA,aAAA,EAA8B,mBAA0C,EAAA,OAAA,EAAkB,GAC7L,CACJ,EAAA,CAAA;AACR;AAGA,MAAM,mBAAiD,GAAA,CAAC,MAAQ,EAAA,IAAA,EAAM,MAAW,qBAAA,GAAA,CAAC,2BAA4B,EAAA,EAAA,QAAA,EAAU,MAAQ,EAAA,IAAA,EAAY,MAAgB,EAAA,KAAA,EAAO,OAAO,IAAM,EAAA,CAAA;AAChL,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA;AAAA;AAEV,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.129-alpha.
|
|
3
|
+
"version": "12.0.129-alpha.1",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@messenger-box/platform-mobile": "*",
|
|
46
46
|
"@react-native-async-storage/async-storage": "*",
|
|
47
47
|
"@react-navigation/native": "*",
|
|
48
|
-
"common": "12.0.
|
|
48
|
+
"common": "12.0.129-alpha.0",
|
|
49
49
|
"expo-background-task": "*",
|
|
50
50
|
"expo-constants": "*",
|
|
51
51
|
"expo-secure-store": "*",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"typescript": {
|
|
68
68
|
"definition": "lib/index.d.ts"
|
|
69
69
|
},
|
|
70
|
-
"gitHead": "
|
|
70
|
+
"gitHead": "b79572f23995bfd6a64aef94030b6290a3a16bba"
|
|
71
71
|
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import {resultUrl}from'../canvas/videoEditor/mediaActions.js';import {layerPaintOrder}from'./designCore.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 IMAGE = "yantra-image-editing";
|
|
21
|
-
function deriveBlankPixelUrl(indexUrl) {
|
|
22
|
-
var _a;
|
|
23
|
-
const host = (_a = (indexUrl || "").replace(/^https?:\/\//, "").split("/")[0]) != null ? _a : "";
|
|
24
|
-
if (!host.startsWith("surface-index-backend.")) return null;
|
|
25
|
-
return `https://canvas-native-surface.${host.slice("surface-index-backend.".length)}/assets/blank.png`;
|
|
26
|
-
}
|
|
27
|
-
function isLocalUri(url) {
|
|
28
|
-
return /^(file|ph|assets-library|content):/.test(url);
|
|
29
|
-
}
|
|
30
|
-
async function renderDesignPage(page, opts) {
|
|
31
|
-
var _a;
|
|
32
|
-
const {
|
|
33
|
-
runAction,
|
|
34
|
-
blankUrl,
|
|
35
|
-
uploadMedia,
|
|
36
|
-
onProgress
|
|
37
|
-
} = opts;
|
|
38
|
-
const label = (_a = opts.pageLabel) != null ? _a : page.name;
|
|
39
|
-
const run = async (action, params, opLabel) => resultUrl(await runAction(IMAGE, action, params), opLabel);
|
|
40
|
-
onProgress == null ? void 0 : onProgress({
|
|
41
|
-
stage: `Preparing ${label}`
|
|
42
|
-
});
|
|
43
|
-
let base = await run("YANTRA_IMAGE_EDIT_PAD", {
|
|
44
|
-
input_url: blankUrl,
|
|
45
|
-
width: String(Math.round(page.width)),
|
|
46
|
-
height: String(Math.round(page.height)),
|
|
47
|
-
color: page.background
|
|
48
|
-
}, "PAD");
|
|
49
|
-
const ordered = layerPaintOrder(page.layers);
|
|
50
|
-
const texts = [];
|
|
51
|
-
let n = 0;
|
|
52
|
-
for (const layer of ordered) {
|
|
53
|
-
n += 1;
|
|
54
|
-
if (layer.type === "text") {
|
|
55
|
-
texts.push(layer);
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
let overlay;
|
|
59
|
-
if (layer.type === "shape") {
|
|
60
|
-
onProgress == null ? void 0 : onProgress({
|
|
61
|
-
stage: `${label}: shape ${n}/${ordered.length}`
|
|
62
|
-
});
|
|
63
|
-
overlay = await run("YANTRA_IMAGE_EDIT_PAD", {
|
|
64
|
-
input_url: blankUrl,
|
|
65
|
-
width: String(Math.round(layer.width)),
|
|
66
|
-
height: String(Math.round(layer.height)),
|
|
67
|
-
color: layer.fill
|
|
68
|
-
}, "PAD");
|
|
69
|
-
} else {
|
|
70
|
-
onProgress == null ? void 0 : onProgress({
|
|
71
|
-
stage: `${label}: image ${n}/${ordered.length}`
|
|
72
|
-
});
|
|
73
|
-
let src = layer.src;
|
|
74
|
-
if (isLocalUri(src)) {
|
|
75
|
-
if (!uploadMedia) throw new Error(`An image is on this phone and no uploader is available`);
|
|
76
|
-
src = await uploadMedia(src);
|
|
77
|
-
}
|
|
78
|
-
overlay = await run("YANTRA_IMAGE_EDIT_RESIZE", {
|
|
79
|
-
input_url: src,
|
|
80
|
-
width: Math.round(layer.width),
|
|
81
|
-
height: Math.round(layer.height)
|
|
82
|
-
}, "RESIZE");
|
|
83
|
-
}
|
|
84
|
-
if (texts.length) {
|
|
85
|
-
base = await annotateTexts(run, base, texts.splice(0), label, onProgress);
|
|
86
|
-
}
|
|
87
|
-
base = await run("YANTRA_IMAGE_EDIT_COMPOSE", {
|
|
88
|
-
input_url: base,
|
|
89
|
-
overlay_url: overlay,
|
|
90
|
-
x: String(Math.round(layer.x)),
|
|
91
|
-
y: String(Math.round(layer.y)),
|
|
92
|
-
opacity: layer.opacity
|
|
93
|
-
}, "COMPOSE");
|
|
94
|
-
}
|
|
95
|
-
if (texts.length) {
|
|
96
|
-
base = await annotateTexts(run, base, texts.splice(0), label, onProgress);
|
|
97
|
-
}
|
|
98
|
-
return base;
|
|
99
|
-
}
|
|
100
|
-
async function annotateTexts(run, base, texts, label, onProgress) {
|
|
101
|
-
onProgress == null ? void 0 : onProgress({
|
|
102
|
-
stage: `${label}: text`
|
|
103
|
-
});
|
|
104
|
-
return run("YANTRA_IMAGE_EDIT_ANNOTATE", {
|
|
105
|
-
input_url: base,
|
|
106
|
-
// Text-op contract (yantra-video dispatch): x/y are drawtext
|
|
107
|
-
// EXPRESSION STRINGS (numbers silently fall back to "10") and the
|
|
108
|
-
// colour key is font_color. text_w makes alignment exact.
|
|
109
|
-
ops: texts.map((t) => ({
|
|
110
|
-
type: "text",
|
|
111
|
-
text: t.text,
|
|
112
|
-
x: textAnchorX(t),
|
|
113
|
-
y: String(Math.round(t.y)),
|
|
114
|
-
font_size: Math.round(t.fontSize),
|
|
115
|
-
font_color: t.color
|
|
116
|
-
}))
|
|
117
|
-
}, "ANNOTATE");
|
|
118
|
-
}
|
|
119
|
-
function textAnchorX(t) {
|
|
120
|
-
if (t.align === "center") return `${Math.round(t.x + t.width / 2)}-text_w/2`;
|
|
121
|
-
if (t.align === "right") return `${Math.round(t.x + t.width)}-text_w`;
|
|
122
|
-
return String(Math.round(t.x));
|
|
123
|
-
}
|
|
124
|
-
async function renderDesignDoc(pages, opts) {
|
|
125
|
-
if (pages.length === 0) throw new Error("Nothing to render");
|
|
126
|
-
const urls = [];
|
|
127
|
-
for (const page of pages) {
|
|
128
|
-
urls.push(await renderDesignPage(page, __spreadProps(__spreadValues({}, opts), {
|
|
129
|
-
pageLabel: page.name
|
|
130
|
-
})));
|
|
131
|
-
}
|
|
132
|
-
return urls;
|
|
133
|
-
}export{deriveBlankPixelUrl,renderDesignDoc,renderDesignPage};//# sourceMappingURL=exportDesign.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exportDesign.js","sources":["../../../src/features/design/exportDesign.ts"],"sourcesContent":["/**\n * Connector-side design export - flattens a design page into one PNG through\n * the yantra-image-editing ops, the same transport-agnostic shape as the\n * video lane's exportRenderer: a RunMediaAction renders, whoever provides it.\n *\n * Composition strategy (every op proven in the canvas-check suite):\n * base = PAD(blank 1px, page w x h, color: background) - solid page\n * shape = PAD(blank 1px, w x h, color: fill) -> COMPOSE at (x, y)\n * image = RESIZE(src, w x h) -> COMPOSE at (x, y)\n * text = ANNOTATE(ops: [{type:'text', ...}]) - after the layer stack,\n * in paint order among themselves\n * Layers compose bottom-up in zIndex order, so stacking on the phone matches\n * the export. Rotation deliberately does not exist in the model - COMPOSE\n * cannot rotate an overlay, and the editor must not show what the export\n * cannot produce.\n *\n * The blank 1px seed is a real hosted asset: image ops all start from an\n * input_url, so a transparent pixel served beside the native artifacts is\n * the \"create canvas\" primitive (PAD grows it to any solid rect).\n */\nimport type { RunMediaAction } from '../canvas/videoEditor/mediaActions';\nimport { resultUrl } from '../canvas/videoEditor/mediaActions';\nimport { layerPaintOrder, type DesignPage, type TextLayer } from './designCore';\n\nconst IMAGE = 'yantra-image-editing';\n\n/**\n * The transparent 1x1 seed pixel, served from the canvas-native artifacts\n * slug of whichever environment the index lives in - the same slug the\n * phone already fetched its remote from, so it is reachable wherever the\n * app runs (`surface-index-backend.X` -> `canvas-native-surface.X`).\n */\nexport function deriveBlankPixelUrl(indexUrl: string): string | null {\n const host = (indexUrl || '').replace(/^https?:\\/\\//, '').split('/')[0] ?? '';\n if (!host.startsWith('surface-index-backend.')) return null;\n return `https://canvas-native-surface.${host.slice('surface-index-backend.'.length)}/assets/blank.png`;\n}\n\nexport interface DesignRenderProgress {\n stage: string;\n}\n\n/** Phone-local URIs the agent cannot fetch - uploaded before any op runs. */\nfunction isLocalUri(url: string): boolean {\n return /^(file|ph|assets-library|content):/.test(url);\n}\n\n/**\n * Flatten one page to a rendered PNG URL.\n * Ops run sequentially - each COMPOSE consumes the previous output.\n */\nexport async function renderDesignPage(\n page: DesignPage,\n opts: {\n runAction: RunMediaAction;\n blankUrl: string;\n uploadMedia?: (localUri: string) => Promise<string>;\n onProgress?: (p: DesignRenderProgress) => void;\n /** Progress label, e.g. \"Front\". */\n pageLabel?: string;\n },\n): Promise<string> {\n const { runAction, blankUrl, uploadMedia, onProgress } = opts;\n const label = opts.pageLabel ?? page.name;\n const run = async (action: string, params: Record<string, unknown>, opLabel: string) =>\n resultUrl(await runAction(IMAGE, action, params), opLabel);\n\n onProgress?.({ stage: `Preparing ${label}` });\n // PAD's schema takes ffmpeg pad EXPRESSIONS - width/height are strings\n // (numbers are rejected by the connector's input validation).\n let base = await run(\n 'YANTRA_IMAGE_EDIT_PAD',\n {\n input_url: blankUrl,\n width: String(Math.round(page.width)),\n height: String(Math.round(page.height)),\n color: page.background,\n },\n 'PAD',\n );\n\n const ordered = layerPaintOrder(page.layers);\n const texts: TextLayer[] = [];\n let n = 0;\n for (const layer of ordered) {\n n += 1;\n if (layer.type === 'text') {\n // Text layers annotate on the flattened stack below them; batching\n // them per contiguous run keeps z-order while saving round-trips.\n texts.push(layer);\n continue;\n }\n\n let overlay: string;\n if (layer.type === 'shape') {\n onProgress?.({ stage: `${label}: shape ${n}/${ordered.length}` });\n overlay = await run(\n 'YANTRA_IMAGE_EDIT_PAD',\n {\n input_url: blankUrl,\n width: String(Math.round(layer.width)),\n height: String(Math.round(layer.height)),\n color: layer.fill,\n },\n 'PAD',\n );\n } else {\n onProgress?.({ stage: `${label}: image ${n}/${ordered.length}` });\n let src = layer.src;\n if (isLocalUri(src)) {\n if (!uploadMedia) throw new Error(`An image is on this phone and no uploader is available`);\n src = await uploadMedia(src);\n }\n overlay = await run(\n 'YANTRA_IMAGE_EDIT_RESIZE',\n { input_url: src, width: Math.round(layer.width), height: Math.round(layer.height) },\n 'RESIZE',\n );\n }\n\n // A text run below this layer flattens first so it stays underneath.\n if (texts.length) {\n base = await annotateTexts(run, base, texts.splice(0), label, onProgress);\n }\n base = await run(\n 'YANTRA_IMAGE_EDIT_COMPOSE',\n {\n input_url: base,\n overlay_url: overlay,\n x: String(Math.round(layer.x)),\n y: String(Math.round(layer.y)),\n opacity: layer.opacity,\n },\n 'COMPOSE',\n );\n }\n\n if (texts.length) {\n base = await annotateTexts(run, base, texts.splice(0), label, onProgress);\n }\n return base;\n}\n\nasync function annotateTexts(\n run: (action: string, params: Record<string, unknown>, label: string) => Promise<string>,\n base: string,\n texts: TextLayer[],\n label: string,\n onProgress?: (p: DesignRenderProgress) => void,\n): Promise<string> {\n onProgress?.({ stage: `${label}: text` });\n return run(\n 'YANTRA_IMAGE_EDIT_ANNOTATE',\n {\n input_url: base,\n // Text-op contract (yantra-video dispatch): x/y are drawtext\n // EXPRESSION STRINGS (numbers silently fall back to \"10\") and the\n // colour key is font_color. text_w makes alignment exact.\n ops: texts.map((t) => ({\n type: 'text',\n text: t.text,\n x: textAnchorX(t),\n y: String(Math.round(t.y)),\n font_size: Math.round(t.fontSize),\n font_color: t.color,\n })),\n },\n 'ANNOTATE',\n );\n}\n\nfunction textAnchorX(t: TextLayer): string {\n if (t.align === 'center') return `${Math.round(t.x + t.width / 2)}-text_w/2`;\n if (t.align === 'right') return `${Math.round(t.x + t.width)}-text_w`;\n return String(Math.round(t.x));\n}\n\n/** Render every page; returns URLs in page order. */\nexport async function renderDesignDoc(\n pages: DesignPage[],\n opts: {\n runAction: RunMediaAction;\n blankUrl: string;\n uploadMedia?: (localUri: string) => Promise<string>;\n onProgress?: (p: DesignRenderProgress) => void;\n },\n): Promise<string[]> {\n if (pages.length === 0) throw new Error('Nothing to render');\n const urls: string[] = [];\n for (const page of pages) {\n urls.push(await renderDesignPage(page, { ...opts, pageLabel: page.name }));\n }\n return urls;\n}\n"],"names":[],"mappings":"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"}
|