@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":"CropOverlay.js","sources":["../../../../src/features/design/editor/CropOverlay.tsx"],"sourcesContent":["/**\n * Crop mode (web CropOverlay): the whole picture shows dimmed behind its\n * frame; drag inside to move the picture under the frame, drag a corner or an\n * edge to reshape the frame. Done writes the frame back as the layer's box and\n * the shown part as its `crop` (doc/crop.ts, the web's maths).\n */\nimport React, { useMemo, useRef, useState } from 'react';\nimport { PanResponder, StyleSheet, Text, View } from 'react-native';\nimport { Image } from 'expo-image';\nimport { useCanvasTheme } from '../../canvas/canvasTheme';\nimport { Pressable, RADIUS, SPACE, TYPE } from '../../canvas/canvasUi';\nimport { cropCommit, cropPan, cropResize, cropStart, type CropHandle, type CropState } from '../doc/crop';\nimport type { DesignDoc, ImageLayer, Rect } from '../doc/types';\nimport { CANVAS_MARGIN } from './DesignCanvas';\n\nconst HANDLES: CropHandle[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\nconst HIT = 28;\n\nexport function CropOverlay({\n doc,\n layer,\n onDone,\n onCancel,\n}: {\n doc: DesignDoc;\n layer: ImageLayer;\n onDone: (patch: Rect & { crop: Rect | undefined }) => void;\n onCancel: () => void;\n}) {\n const theme = useCanvasTheme();\n const [area, setArea] = useState({ w: 0, h: 0 });\n const PW = doc.pageWidth;\n const PH = doc.pageHeight;\n const aspect = PW / Math.max(1, PH);\n const W = Math.max(1, Math.min(area.w - CANVAS_MARGIN * 2, (area.h - CANVAS_MARGIN * 2) * aspect));\n const H = W / aspect;\n const ox = (area.w - W) / 2;\n const oy = (area.h - H) / 2;\n const s = W / PW;\n\n const initial = useMemo(\n () =>\n cropStart(\n { x: layer.x * PW, y: layer.y * PH, w: layer.w * PW, h: layer.h * PH },\n layer.crop,\n layer.flipX,\n layer.flipY,\n ),\n [layer, PW, PH],\n );\n const [state, setState] = useState<CropState>(initial);\n const live = useRef({ state, s, ox, oy, start: state as CropState, mode: 'pan' as 'pan' | CropHandle });\n live.current = { ...live.current, state, s, ox, oy };\n\n const responder = useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (e) => {\n const { state: st, s: k, ox: x0, oy: y0 } = live.current;\n const px = e.nativeEvent.locationX;\n const py = e.nativeEvent.locationY;\n const { win } = st;\n const hx = (h: CropHandle) =>\n x0 + (h.includes('w') ? win.x : h.includes('e') ? win.x + win.w : win.x + win.w / 2) * k;\n const hy = (h: CropHandle) =>\n y0 + (h.includes('n') ? win.y : h.includes('s') ? win.y + win.h : win.y + win.h / 2) * k;\n const near = HANDLES.find((h) => Math.abs(px - hx(h)) < HIT && Math.abs(py - hy(h)) < HIT);\n live.current.mode = near ?? 'pan';\n live.current.start = st;\n },\n onPanResponderMove: (_e, g) => {\n const { start, mode, s: k } = live.current;\n const dx = g.dx / k;\n const dy = g.dy / k;\n setState(mode === 'pan' ? cropPan(start, dx, dy) : cropResize(start, mode, dx, dy));\n },\n }),\n [],\n );\n\n const { img, win } = state;\n const accent = theme.edAccent;\n return (\n <View\n style={StyleSheet.absoluteFill}\n onLayout={(e) => setArea({ w: e.nativeEvent.layout.width, h: e.nativeEvent.layout.height })}\n >\n {area.w > 0 && layer.src ? (\n <View style={StyleSheet.absoluteFill} {...responder.panHandlers}>\n <View pointerEvents=\"none\" style={[StyleSheet.absoluteFill, styles.scrim]} />\n <View\n pointerEvents=\"none\"\n style={{\n position: 'absolute',\n left: ox + img.x * s,\n top: oy + img.y * s,\n width: img.w * s,\n height: img.h * s,\n opacity: 0.4,\n transform: [{ scaleX: layer.flipX ? -1 : 1 }, { scaleY: layer.flipY ? -1 : 1 }],\n }}\n >\n <Image source={{ uri: layer.src }} style={StyleSheet.absoluteFill} contentFit=\"fill\" />\n </View>\n <View\n pointerEvents=\"none\"\n style={{\n position: 'absolute',\n left: ox + win.x * s,\n top: oy + win.y * s,\n width: win.w * s,\n height: win.h * s,\n overflow: 'hidden',\n borderWidth: 2,\n borderColor: accent,\n }}\n >\n <View\n style={{\n position: 'absolute',\n left: (img.x - win.x) * s - 2,\n top: (img.y - win.y) * s - 2,\n width: img.w * s,\n height: img.h * s,\n transform: [{ scaleX: layer.flipX ? -1 : 1 }, { scaleY: layer.flipY ? -1 : 1 }],\n }}\n >\n <Image source={{ uri: layer.src }} style={StyleSheet.absoluteFill} contentFit=\"fill\" />\n </View>\n </View>\n {HANDLES.map((h) => {\n const corner = h.length === 2;\n const cx =\n ox + (h.includes('w') ? win.x : h.includes('e') ? win.x + win.w : win.x + win.w / 2) * s;\n const cy =\n oy + (h.includes('n') ? win.y : h.includes('s') ? win.y + win.h : win.y + win.h / 2) * s;\n const size = corner ? 18 : 12;\n return (\n <View\n key={h}\n pointerEvents=\"none\"\n style={[\n styles.handle,\n {\n left: cx - size / 2,\n top: cy - size / 2,\n width: size,\n height: size,\n borderColor: accent,\n },\n ]}\n />\n );\n })}\n </View>\n ) : null}\n <View style={styles.bar} pointerEvents=\"box-none\">\n <Pressable\n onPress={onCancel}\n style={[styles.button, { backgroundColor: 'rgba(15,23,42,0.86)' }]}\n accessibilityRole=\"button\"\n >\n <Text style={styles.buttonLabel}>Cancel</Text>\n </Pressable>\n <Pressable\n onPress={() => onDone(cropCommit(state, PW, PH, layer.flipX, layer.flipY))}\n style={[styles.button, { backgroundColor: accent }]}\n accessibilityRole=\"button\"\n >\n <Text style={[styles.buttonLabel, { color: theme.edOnInk }]}>Done</Text>\n </Pressable>\n </View>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n scrim: { backgroundColor: 'rgba(0,0,0,0.45)' },\n handle: { position: 'absolute', backgroundColor: '#ffffff', borderWidth: 2, borderRadius: 4 },\n bar: {\n position: 'absolute',\n top: SPACE.sm,\n left: 0,\n right: 0,\n flexDirection: 'row',\n justifyContent: 'center',\n gap: SPACE.md,\n },\n button: {\n height: 36,\n paddingHorizontal: SPACE.lg,\n borderRadius: RADIUS.pill,\n alignItems: 'center',\n justifyContent: 'center',\n },\n buttonLabel: { ...TYPE.label, color: '#ffffff' },\n});\n"],"names":["win"],"mappings":"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"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {useState,useRef,useMemo}from'react';import {StyleSheet,PanResponder,View}from'react-native';import {MaterialCommunityIcons}from'@expo/vector-icons';import {useCanvasTheme}from'../../canvas/canvasTheme.js';import {snapToPage,resizeBox,rotateFromDrag,layerBox,handlePoint,hitTest,rotateKnobPoint}from'../doc/geometry.js';import {DesignPageView}from'../render/DesignPageView.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 MARGIN = 20;
|
|
21
|
+
const CANVAS_MARGIN = MARGIN;
|
|
22
|
+
const HANDLE_HIT = 24;
|
|
23
|
+
const KNOB_GAP = 28;
|
|
24
|
+
const TAP_SLOP = 6;
|
|
25
|
+
function handlesFor(layer) {
|
|
26
|
+
if (layer.kind === "text") return ["nw", "ne", "se", "sw", "e", "w"];
|
|
27
|
+
return ["nw", "ne", "se", "sw", "n", "e", "s", "w"];
|
|
28
|
+
}
|
|
29
|
+
function DesignCanvas({
|
|
30
|
+
doc,
|
|
31
|
+
page,
|
|
32
|
+
selectedId,
|
|
33
|
+
editingId,
|
|
34
|
+
onSelect,
|
|
35
|
+
onPatch,
|
|
36
|
+
onEditText
|
|
37
|
+
}) {
|
|
38
|
+
var _a, _b;
|
|
39
|
+
const theme = useCanvasTheme();
|
|
40
|
+
const [area, setArea] = useState({
|
|
41
|
+
w: 0,
|
|
42
|
+
h: 0
|
|
43
|
+
});
|
|
44
|
+
const [guides, setGuides] = useState({
|
|
45
|
+
x: false,
|
|
46
|
+
y: false
|
|
47
|
+
});
|
|
48
|
+
const aspect = doc.pageWidth / Math.max(1, doc.pageHeight);
|
|
49
|
+
const W = Math.max(1, Math.min(area.w - MARGIN * 2, (area.h - MARGIN * 2) * aspect));
|
|
50
|
+
const H = W / aspect;
|
|
51
|
+
const ox = (area.w - W) / 2;
|
|
52
|
+
const oy = (area.h - H) / 2;
|
|
53
|
+
const layers = (_a = page.layers) != null ? _a : [];
|
|
54
|
+
const selected = (_b = layers.find((l) => l.id === selectedId)) != null ? _b : null;
|
|
55
|
+
const live = useRef({
|
|
56
|
+
W,
|
|
57
|
+
H,
|
|
58
|
+
ox,
|
|
59
|
+
oy,
|
|
60
|
+
layers,
|
|
61
|
+
selected,
|
|
62
|
+
onSelect,
|
|
63
|
+
onPatch,
|
|
64
|
+
onEditText,
|
|
65
|
+
gestureId: 0
|
|
66
|
+
});
|
|
67
|
+
live.current = __spreadProps(__spreadValues({}, live.current), {
|
|
68
|
+
W,
|
|
69
|
+
H,
|
|
70
|
+
ox,
|
|
71
|
+
oy,
|
|
72
|
+
layers,
|
|
73
|
+
selected,
|
|
74
|
+
onSelect,
|
|
75
|
+
onPatch,
|
|
76
|
+
onEditText
|
|
77
|
+
});
|
|
78
|
+
const mode = useRef({
|
|
79
|
+
kind: "none"
|
|
80
|
+
});
|
|
81
|
+
const responder = useMemo(() => PanResponder.create({
|
|
82
|
+
onStartShouldSetPanResponder: () => true,
|
|
83
|
+
onMoveShouldSetPanResponder: () => true,
|
|
84
|
+
onPanResponderTerminationRequest: () => false,
|
|
85
|
+
onPanResponderGrant: (e) => {
|
|
86
|
+
var _a2;
|
|
87
|
+
const s = live.current;
|
|
88
|
+
s.gestureId += 1;
|
|
89
|
+
const px = e.nativeEvent.locationX - s.ox;
|
|
90
|
+
const py = e.nativeEvent.locationY - s.oy;
|
|
91
|
+
const sel = s.selected;
|
|
92
|
+
if (sel && !sel.locked) {
|
|
93
|
+
const box = layerBox(sel, s.W, s.H);
|
|
94
|
+
const deg = (_a2 = sel.rotation) != null ? _a2 : 0;
|
|
95
|
+
const [kx, ky] = rotateKnobPoint(box, deg, KNOB_GAP);
|
|
96
|
+
if (Math.hypot(px - kx, py - ky) <= HANDLE_HIT) {
|
|
97
|
+
mode.current = {
|
|
98
|
+
kind: "rotate",
|
|
99
|
+
layer: sel,
|
|
100
|
+
box,
|
|
101
|
+
from: [px, py],
|
|
102
|
+
moved: false
|
|
103
|
+
};
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
for (const handle of handlesFor(sel)) {
|
|
107
|
+
const [hx, hy] = handlePoint(box, deg, handle);
|
|
108
|
+
if (Math.hypot(px - hx, py - hy) <= HANDLE_HIT) {
|
|
109
|
+
mode.current = {
|
|
110
|
+
kind: "resize",
|
|
111
|
+
layer: sel,
|
|
112
|
+
box,
|
|
113
|
+
handle,
|
|
114
|
+
moved: false
|
|
115
|
+
};
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const hit = hitTest(s.layers, px, py, s.W, s.H);
|
|
121
|
+
if (!hit) {
|
|
122
|
+
mode.current = {
|
|
123
|
+
kind: "page",
|
|
124
|
+
moved: false
|
|
125
|
+
};
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const wasSelected = hit.id === (sel == null ? void 0 : sel.id);
|
|
129
|
+
if (!wasSelected) s.onSelect(hit.id);
|
|
130
|
+
mode.current = {
|
|
131
|
+
kind: "move",
|
|
132
|
+
layer: hit,
|
|
133
|
+
box: layerBox(hit, s.W, s.H),
|
|
134
|
+
wasSelected,
|
|
135
|
+
moved: false
|
|
136
|
+
};
|
|
137
|
+
},
|
|
138
|
+
onPanResponderMove: (e, g) => {
|
|
139
|
+
var _a2, _b2;
|
|
140
|
+
const s = live.current;
|
|
141
|
+
const m = mode.current;
|
|
142
|
+
if (m.kind === "none") return;
|
|
143
|
+
if (!m.moved && Math.hypot(g.dx, g.dy) < TAP_SLOP) return;
|
|
144
|
+
m.moved = true;
|
|
145
|
+
if (m.kind === "page") return;
|
|
146
|
+
const key = `${m.kind}:${m.layer.id}:${s.gestureId}`;
|
|
147
|
+
if (m.kind === "move") {
|
|
148
|
+
if (m.layer.locked) return;
|
|
149
|
+
const snapped = snapToPage(__spreadProps(__spreadValues({}, m.box), {
|
|
150
|
+
x: m.box.x + g.dx,
|
|
151
|
+
y: m.box.y + g.dy
|
|
152
|
+
}), s.W, s.H);
|
|
153
|
+
setGuides((prev) => prev.x === snapped.guideX && prev.y === snapped.guideY ? prev : {
|
|
154
|
+
x: snapped.guideX,
|
|
155
|
+
y: snapped.guideY
|
|
156
|
+
});
|
|
157
|
+
s.onPatch(m.layer.id, {
|
|
158
|
+
x: snapped.box.x / s.W,
|
|
159
|
+
y: snapped.box.y / s.H
|
|
160
|
+
}, key);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (m.kind === "resize") {
|
|
164
|
+
const corner = m.handle.length === 2;
|
|
165
|
+
const keepAspect = corner && (m.layer.kind === "image" || m.layer.kind === "text");
|
|
166
|
+
const next = resizeBox(m.box, (_a2 = m.layer.rotation) != null ? _a2 : 0, m.handle, g.dx, g.dy, {
|
|
167
|
+
keepAspect,
|
|
168
|
+
minSize: 12
|
|
169
|
+
});
|
|
170
|
+
const patch = {
|
|
171
|
+
x: next.x / s.W,
|
|
172
|
+
y: next.y / s.H,
|
|
173
|
+
w: next.w / s.W,
|
|
174
|
+
h: next.h / s.H
|
|
175
|
+
};
|
|
176
|
+
if (m.layer.kind === "text" && corner) {
|
|
177
|
+
const scale = next.w / m.box.w;
|
|
178
|
+
patch.fontSizeFrac = m.layer.fontSizeFrac * scale;
|
|
179
|
+
}
|
|
180
|
+
s.onPatch(m.layer.id, patch, key);
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const px = e.nativeEvent.locationX - s.ox;
|
|
184
|
+
const py = e.nativeEvent.locationY - s.oy;
|
|
185
|
+
s.onPatch(m.layer.id, {
|
|
186
|
+
rotation: rotateFromDrag(m.box, (_b2 = m.layer.rotation) != null ? _b2 : 0, m.from, [px, py])
|
|
187
|
+
}, key);
|
|
188
|
+
},
|
|
189
|
+
onPanResponderRelease: () => {
|
|
190
|
+
const s = live.current;
|
|
191
|
+
const m = mode.current;
|
|
192
|
+
mode.current = {
|
|
193
|
+
kind: "none"
|
|
194
|
+
};
|
|
195
|
+
setGuides({
|
|
196
|
+
x: false,
|
|
197
|
+
y: false
|
|
198
|
+
});
|
|
199
|
+
if (m.kind === "page" && !m.moved) s.onSelect(null);
|
|
200
|
+
if (m.kind === "move" && !m.moved && m.wasSelected && m.layer.kind === "text" && !m.layer.locked) {
|
|
201
|
+
s.onEditText(m.layer.id);
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
onPanResponderTerminate: () => {
|
|
205
|
+
mode.current = {
|
|
206
|
+
kind: "none"
|
|
207
|
+
};
|
|
208
|
+
setGuides({
|
|
209
|
+
x: false,
|
|
210
|
+
y: false
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}), []);
|
|
214
|
+
const onLayout = (e) => {
|
|
215
|
+
const {
|
|
216
|
+
width,
|
|
217
|
+
height
|
|
218
|
+
} = e.nativeEvent.layout;
|
|
219
|
+
setArea((prev) => prev.w === width && prev.h === height ? prev : {
|
|
220
|
+
w: width,
|
|
221
|
+
h: height
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
const accent = theme.edAccent;
|
|
225
|
+
return /* @__PURE__ */ jsx(View, { style: styles.fill, onLayout, children: area.w > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
226
|
+
/* @__PURE__ */ jsx(View, { style: [styles.pageShadow, {
|
|
227
|
+
left: ox,
|
|
228
|
+
top: oy,
|
|
229
|
+
width: W,
|
|
230
|
+
height: H
|
|
231
|
+
}], children: /* @__PURE__ */ jsx(DesignPageView, { doc, page, width: W }) }),
|
|
232
|
+
guides.x ? /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: [styles.guideV, {
|
|
233
|
+
left: ox + W / 2,
|
|
234
|
+
top: oy,
|
|
235
|
+
height: H,
|
|
236
|
+
backgroundColor: "#ec4899"
|
|
237
|
+
}] }) : null,
|
|
238
|
+
guides.y ? /* @__PURE__ */ jsx(View, { pointerEvents: "none", style: [styles.guideH, {
|
|
239
|
+
top: oy + H / 2,
|
|
240
|
+
left: ox,
|
|
241
|
+
width: W,
|
|
242
|
+
backgroundColor: "#ec4899"
|
|
243
|
+
}] }) : null,
|
|
244
|
+
selected && selected.id !== editingId ? /* @__PURE__ */ jsx(SelectionFrame, { layer: selected, W, H, ox, oy, accent }) : null,
|
|
245
|
+
/* @__PURE__ */ jsx(View, __spreadValues({ style: StyleSheet.absoluteFill }, responder.panHandlers))
|
|
246
|
+
] }) : null });
|
|
247
|
+
}
|
|
248
|
+
function SelectionFrame({
|
|
249
|
+
layer,
|
|
250
|
+
W,
|
|
251
|
+
H,
|
|
252
|
+
ox,
|
|
253
|
+
oy,
|
|
254
|
+
accent
|
|
255
|
+
}) {
|
|
256
|
+
var _a;
|
|
257
|
+
const box = layerBox(layer, W, H);
|
|
258
|
+
const deg = (_a = layer.rotation) != null ? _a : 0;
|
|
259
|
+
const locked = Boolean(layer.locked);
|
|
260
|
+
return /* @__PURE__ */ jsxs(View, { pointerEvents: "none", style: {
|
|
261
|
+
position: "absolute",
|
|
262
|
+
left: ox + box.x,
|
|
263
|
+
top: oy + box.y,
|
|
264
|
+
width: box.w,
|
|
265
|
+
height: box.h,
|
|
266
|
+
transform: deg ? [{
|
|
267
|
+
rotate: `${deg}deg`
|
|
268
|
+
}] : void 0
|
|
269
|
+
}, children: [
|
|
270
|
+
/* @__PURE__ */ jsx(View, { style: [StyleSheet.absoluteFill, styles.frame, {
|
|
271
|
+
borderColor: accent
|
|
272
|
+
}, locked && styles.frameLocked] }),
|
|
273
|
+
locked ? /* @__PURE__ */ jsx(View, { style: [styles.lockBadge, {
|
|
274
|
+
backgroundColor: accent
|
|
275
|
+
}], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "lock", size: 12, color: "#fff" }) }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
276
|
+
handlesFor(layer).map((handle) => {
|
|
277
|
+
const corner = handle.length === 2;
|
|
278
|
+
const left = handle.includes("w") ? 0 : handle.includes("e") ? box.w : box.w / 2;
|
|
279
|
+
const top = handle.includes("n") ? 0 : handle.includes("s") ? box.h : box.h / 2;
|
|
280
|
+
const vertical = handle === "e" || handle === "w";
|
|
281
|
+
const size = corner ? {
|
|
282
|
+
w: 14,
|
|
283
|
+
h: 14
|
|
284
|
+
} : vertical ? {
|
|
285
|
+
w: 8,
|
|
286
|
+
h: 22
|
|
287
|
+
} : {
|
|
288
|
+
w: 22,
|
|
289
|
+
h: 8
|
|
290
|
+
};
|
|
291
|
+
return /* @__PURE__ */ jsx(View, { style: [styles.handle, {
|
|
292
|
+
left: left - size.w / 2,
|
|
293
|
+
top: top - size.h / 2,
|
|
294
|
+
width: size.w,
|
|
295
|
+
height: size.h,
|
|
296
|
+
borderRadius: corner ? 7 : 4,
|
|
297
|
+
borderColor: accent
|
|
298
|
+
}] }, handle);
|
|
299
|
+
}),
|
|
300
|
+
/* @__PURE__ */ jsx(View, { style: [styles.knob, {
|
|
301
|
+
left: box.w / 2 - 14,
|
|
302
|
+
top: box.h + KNOB_GAP - 14,
|
|
303
|
+
borderColor: accent
|
|
304
|
+
}], children: /* @__PURE__ */ jsx(MaterialCommunityIcons, { name: "rotate-right", size: 16, color: accent }) })
|
|
305
|
+
] })
|
|
306
|
+
] });
|
|
307
|
+
}
|
|
308
|
+
const styles = StyleSheet.create({
|
|
309
|
+
fill: {
|
|
310
|
+
flex: 1
|
|
311
|
+
},
|
|
312
|
+
pageShadow: {
|
|
313
|
+
position: "absolute",
|
|
314
|
+
backgroundColor: "#ffffff",
|
|
315
|
+
shadowColor: "#000",
|
|
316
|
+
shadowOpacity: 0.16,
|
|
317
|
+
shadowRadius: 12,
|
|
318
|
+
shadowOffset: {
|
|
319
|
+
width: 0,
|
|
320
|
+
height: 4
|
|
321
|
+
},
|
|
322
|
+
elevation: 4
|
|
323
|
+
},
|
|
324
|
+
frame: {
|
|
325
|
+
borderWidth: 1.5
|
|
326
|
+
},
|
|
327
|
+
frameLocked: {
|
|
328
|
+
borderStyle: "dashed"
|
|
329
|
+
},
|
|
330
|
+
handle: {
|
|
331
|
+
position: "absolute",
|
|
332
|
+
backgroundColor: "#ffffff",
|
|
333
|
+
borderWidth: 1.5
|
|
334
|
+
},
|
|
335
|
+
knob: {
|
|
336
|
+
position: "absolute",
|
|
337
|
+
width: 28,
|
|
338
|
+
height: 28,
|
|
339
|
+
borderRadius: 14,
|
|
340
|
+
backgroundColor: "#ffffff",
|
|
341
|
+
borderWidth: 1.5,
|
|
342
|
+
alignItems: "center",
|
|
343
|
+
justifyContent: "center"
|
|
344
|
+
},
|
|
345
|
+
lockBadge: {
|
|
346
|
+
position: "absolute",
|
|
347
|
+
right: -10,
|
|
348
|
+
top: -10,
|
|
349
|
+
width: 20,
|
|
350
|
+
height: 20,
|
|
351
|
+
borderRadius: 10,
|
|
352
|
+
alignItems: "center",
|
|
353
|
+
justifyContent: "center"
|
|
354
|
+
},
|
|
355
|
+
guideV: {
|
|
356
|
+
position: "absolute",
|
|
357
|
+
width: 1
|
|
358
|
+
},
|
|
359
|
+
guideH: {
|
|
360
|
+
position: "absolute",
|
|
361
|
+
height: 1
|
|
362
|
+
}
|
|
363
|
+
});export{CANVAS_MARGIN,DesignCanvas};//# sourceMappingURL=DesignCanvas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DesignCanvas.js","sources":["../../../../src/features/design/editor/DesignCanvas.tsx"],"sourcesContent":["/**\n * The page being edited, and every touch on it.\n *\n * One gesture surface lies over the page with nothing touchable inside it,\n * so `locationX/Y` is always in its own frame. A touch starts on the\n * selected layer's handle (resize), its knob (rotate), a layer (select and\n * move) or the bare page (deselect on tap). A tap on text that is already\n * selected opens it for typing, as Canva does.\n *\n * Moves, resizes and turns stream as `patchLayer`s keyed per gesture, which the\n * reducer coalesces into one undo step (doc/docOps.ts).\n */\nimport React, { useMemo, useRef, useState } from 'react';\nimport { PanResponder, StyleSheet, View, type LayoutChangeEvent } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { useCanvasTheme } from '../../canvas/canvasTheme';\nimport {\n handlePoint,\n hitTest,\n layerBox,\n resizeBox,\n rotateFromDrag,\n rotateKnobPoint,\n snapToPage,\n type Box,\n type Handle,\n} from '../doc/geometry';\nimport type { DesignDoc, DesignPage, EditorLayer, TextLayer } from '../doc/types';\nimport { DesignPageView } from '../render/DesignPageView';\n\nconst MARGIN = 20;\n/** The page's inset from the canvas area's edge: overlays over the canvas (crop) frame the page the same way. */\nexport const CANVAS_MARGIN = MARGIN;\nconst HANDLE_HIT = 24;\nconst KNOB_GAP = 28;\n/** Movement under this many px is still a tap. */\nconst TAP_SLOP = 6;\n\ntype Mode =\n | { kind: 'none' }\n | { kind: 'page'; moved: boolean }\n | { kind: 'move'; layer: EditorLayer; box: Box; wasSelected: boolean; moved: boolean }\n | { kind: 'resize'; layer: EditorLayer; box: Box; handle: Handle; moved: boolean }\n | { kind: 'rotate'; layer: EditorLayer; box: Box; from: [number, number]; moved: boolean };\n\n/** The handles a layer offers: text grows sideways (its height follows its words); others every way. */\nfunction handlesFor(layer: EditorLayer): Handle[] {\n if (layer.kind === 'text') return ['nw', 'ne', 'se', 'sw', 'e', 'w'];\n return ['nw', 'ne', 'se', 'sw', 'n', 'e', 's', 'w'];\n}\n\nexport interface DesignCanvasProps {\n doc: DesignDoc;\n page: DesignPage;\n selectedId: string | null;\n /** A layer being typed into: drawn, but not selectable by touch. */\n editingId?: string | null;\n onSelect: (layerId: string | null) => void;\n onPatch: (layerId: string, patch: Partial<EditorLayer>, coalesce: string) => void;\n onEditText: (layerId: string) => void;\n}\n\nexport function DesignCanvas({ doc, page, selectedId, editingId, onSelect, onPatch, onEditText }: DesignCanvasProps) {\n const theme = useCanvasTheme();\n const [area, setArea] = useState({ w: 0, h: 0 });\n const [guides, setGuides] = useState({ x: false, y: false });\n\n const aspect = doc.pageWidth / Math.max(1, doc.pageHeight);\n const W = Math.max(1, Math.min(area.w - MARGIN * 2, (area.h - MARGIN * 2) * aspect));\n const H = W / aspect;\n const ox = (area.w - W) / 2;\n const oy = (area.h - H) / 2;\n\n const layers = page.layers ?? [];\n const selected = layers.find((l) => l.id === selectedId) ?? null;\n\n // The responder is created once; it reads the live frame through this ref.\n const live = useRef({ W, H, ox, oy, layers, selected, onSelect, onPatch, onEditText, gestureId: 0 });\n live.current = { ...live.current, W, H, ox, oy, layers, selected, onSelect, onPatch, onEditText };\n const mode = useRef<Mode>({ kind: 'none' });\n\n const responder = useMemo(\n () =>\n PanResponder.create({\n onStartShouldSetPanResponder: () => true,\n onMoveShouldSetPanResponder: () => true,\n onPanResponderTerminationRequest: () => false,\n onPanResponderGrant: (e) => {\n const s = live.current;\n s.gestureId += 1;\n const px = e.nativeEvent.locationX - s.ox;\n const py = e.nativeEvent.locationY - s.oy;\n const sel = s.selected;\n if (sel && !sel.locked) {\n const box = layerBox(sel, s.W, s.H);\n const deg = sel.rotation ?? 0;\n const [kx, ky] = rotateKnobPoint(box, deg, KNOB_GAP);\n if (Math.hypot(px - kx, py - ky) <= HANDLE_HIT) {\n mode.current = { kind: 'rotate', layer: sel, box, from: [px, py], moved: false };\n return;\n }\n for (const handle of handlesFor(sel)) {\n const [hx, hy] = handlePoint(box, deg, handle);\n if (Math.hypot(px - hx, py - hy) <= HANDLE_HIT) {\n mode.current = { kind: 'resize', layer: sel, box, handle, moved: false };\n return;\n }\n }\n }\n const hit = hitTest(s.layers, px, py, s.W, s.H);\n if (!hit) {\n mode.current = { kind: 'page', moved: false };\n return;\n }\n const wasSelected = hit.id === sel?.id;\n if (!wasSelected) s.onSelect(hit.id);\n mode.current = {\n kind: 'move',\n layer: hit,\n box: layerBox(hit, s.W, s.H),\n wasSelected,\n moved: false,\n };\n },\n onPanResponderMove: (e, g) => {\n const s = live.current;\n const m = mode.current;\n if (m.kind === 'none') return;\n if (!m.moved && Math.hypot(g.dx, g.dy) < TAP_SLOP) return;\n m.moved = true;\n if (m.kind === 'page') return;\n const key = `${m.kind}:${m.layer.id}:${s.gestureId}`;\n if (m.kind === 'move') {\n if (m.layer.locked) return;\n const snapped = snapToPage({ ...m.box, x: m.box.x + g.dx, y: m.box.y + g.dy }, s.W, s.H);\n setGuides((prev) =>\n prev.x === snapped.guideX && prev.y === snapped.guideY\n ? prev\n : { x: snapped.guideX, y: snapped.guideY },\n );\n s.onPatch(m.layer.id, { x: snapped.box.x / s.W, y: snapped.box.y / s.H }, key);\n return;\n }\n if (m.kind === 'resize') {\n const corner = m.handle.length === 2;\n const keepAspect = corner && (m.layer.kind === 'image' || m.layer.kind === 'text');\n const next = resizeBox(m.box, m.layer.rotation ?? 0, m.handle, g.dx, g.dy, {\n keepAspect,\n minSize: 12,\n });\n const patch: Partial<EditorLayer> = {\n x: next.x / s.W,\n y: next.y / s.H,\n w: next.w / s.W,\n h: next.h / s.H,\n };\n // A text corner scales its words with the box, as Canva's does.\n if (m.layer.kind === 'text' && corner) {\n const scale = next.w / m.box.w;\n (patch as Partial<TextLayer>).fontSizeFrac = (m.layer as TextLayer).fontSizeFrac * scale;\n }\n s.onPatch(m.layer.id, patch, key);\n return;\n }\n const px = e.nativeEvent.locationX - s.ox;\n const py = e.nativeEvent.locationY - s.oy;\n s.onPatch(\n m.layer.id,\n { rotation: rotateFromDrag(m.box, m.layer.rotation ?? 0, m.from, [px, py]) },\n key,\n );\n },\n onPanResponderRelease: () => {\n const s = live.current;\n const m = mode.current;\n mode.current = { kind: 'none' };\n setGuides({ x: false, y: false });\n if (m.kind === 'page' && !m.moved) s.onSelect(null);\n if (m.kind === 'move' && !m.moved && m.wasSelected && m.layer.kind === 'text' && !m.layer.locked) {\n s.onEditText(m.layer.id);\n }\n },\n onPanResponderTerminate: () => {\n mode.current = { kind: 'none' };\n setGuides({ x: false, y: false });\n },\n }),\n [],\n );\n\n const onLayout = (e: LayoutChangeEvent) => {\n const { width, height } = e.nativeEvent.layout;\n setArea((prev) => (prev.w === width && prev.h === height ? prev : { w: width, h: height }));\n };\n\n const accent = theme.edAccent;\n return (\n <View style={styles.fill} onLayout={onLayout}>\n {area.w > 0 ? (\n <>\n <View style={[styles.pageShadow, { left: ox, top: oy, width: W, height: H }]}>\n <DesignPageView doc={doc} page={page} width={W} />\n </View>\n {guides.x ? (\n <View\n pointerEvents=\"none\"\n style={[\n styles.guideV,\n { left: ox + W / 2, top: oy, height: H, backgroundColor: '#ec4899' },\n ]}\n />\n ) : null}\n {guides.y ? (\n <View\n pointerEvents=\"none\"\n style={[styles.guideH, { top: oy + H / 2, left: ox, width: W, backgroundColor: '#ec4899' }]}\n />\n ) : null}\n {selected && selected.id !== editingId ? (\n <SelectionFrame layer={selected} W={W} H={H} ox={ox} oy={oy} accent={accent} />\n ) : null}\n <View style={StyleSheet.absoluteFill} {...responder.panHandlers} />\n </>\n ) : null}\n </View>\n );\n}\n\n/** The selected layer's outline, handles and rotate knob, turned with it. Draw-only. */\nfunction SelectionFrame({\n layer,\n W,\n H,\n ox,\n oy,\n accent,\n}: {\n layer: EditorLayer;\n W: number;\n H: number;\n ox: number;\n oy: number;\n accent: string;\n}) {\n const box = layerBox(layer, W, H);\n const deg = layer.rotation ?? 0;\n const locked = Boolean(layer.locked);\n return (\n <View\n pointerEvents=\"none\"\n style={{\n position: 'absolute',\n left: ox + box.x,\n top: oy + box.y,\n width: box.w,\n height: box.h,\n transform: deg ? [{ rotate: `${deg}deg` }] : undefined,\n }}\n >\n <View\n style={[StyleSheet.absoluteFill, styles.frame, { borderColor: accent }, locked && styles.frameLocked]}\n />\n {locked ? (\n <View style={[styles.lockBadge, { backgroundColor: accent }]}>\n <MaterialCommunityIcons name=\"lock\" size={12} color=\"#fff\" />\n </View>\n ) : (\n <>\n {handlesFor(layer).map((handle) => {\n const corner = handle.length === 2;\n const left = handle.includes('w') ? 0 : handle.includes('e') ? box.w : box.w / 2;\n const top = handle.includes('n') ? 0 : handle.includes('s') ? box.h : box.h / 2;\n const vertical = handle === 'e' || handle === 'w';\n const size = corner ? { w: 14, h: 14 } : vertical ? { w: 8, h: 22 } : { w: 22, h: 8 };\n return (\n <View\n key={handle}\n style={[\n styles.handle,\n {\n left: left - size.w / 2,\n top: top - size.h / 2,\n width: size.w,\n height: size.h,\n borderRadius: corner ? 7 : 4,\n borderColor: accent,\n },\n ]}\n />\n );\n })}\n <View\n style={[styles.knob, { left: box.w / 2 - 14, top: box.h + KNOB_GAP - 14, borderColor: accent }]}\n >\n <MaterialCommunityIcons name=\"rotate-right\" size={16} color={accent} />\n </View>\n </>\n )}\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n fill: { flex: 1 },\n pageShadow: {\n position: 'absolute',\n backgroundColor: '#ffffff',\n shadowColor: '#000',\n shadowOpacity: 0.16,\n shadowRadius: 12,\n shadowOffset: { width: 0, height: 4 },\n elevation: 4,\n },\n frame: { borderWidth: 1.5 },\n frameLocked: { borderStyle: 'dashed' },\n handle: { position: 'absolute', backgroundColor: '#ffffff', borderWidth: 1.5 },\n knob: {\n position: 'absolute',\n width: 28,\n height: 28,\n borderRadius: 14,\n backgroundColor: '#ffffff',\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n },\n lockBadge: {\n position: 'absolute',\n right: -10,\n top: -10,\n width: 20,\n height: 20,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n },\n guideV: { position: 'absolute', width: 1 },\n guideH: { position: 'absolute', height: 1 },\n});\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import {jsxs,jsx,Fragment}from'react/jsx-runtime';import {useState,useMemo}from'react';import {View,Text,TextInput,StyleSheet}from'react-native';import {useCanvasTheme,themedStyles}from'../../canvas/canvasTheme.js';import {SPACE,TYPE,RADIUS}from'../../canvas/canvasUi.js';import {parsePageRange}from'../doc/pageRange.js';import {exportPixelWidth}from'../export/exportDesign.js';import {Segmented,PrimaryButton}from'./controls.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
|
+
function ExportSheet({
|
|
21
|
+
doc,
|
|
22
|
+
pageIndex,
|
|
23
|
+
busy,
|
|
24
|
+
onExport
|
|
25
|
+
}) {
|
|
26
|
+
const theme = useCanvasTheme();
|
|
27
|
+
const styles = makeStyles(theme);
|
|
28
|
+
const count = doc.pages.length;
|
|
29
|
+
const [format, setFormat] = useState(count > 1 ? "pdf" : "png");
|
|
30
|
+
const [scale, setScale] = useState(2);
|
|
31
|
+
const [which, setWhich] = useState(count > 1 ? "all" : "current");
|
|
32
|
+
const [range, setRange] = useState("");
|
|
33
|
+
const indices = useMemo(() => {
|
|
34
|
+
if (which === "all") return doc.pages.map((_, i) => i);
|
|
35
|
+
if (which === "current") return [pageIndex];
|
|
36
|
+
return parsePageRange(range, count);
|
|
37
|
+
}, [which, range, count, pageIndex, doc.pages]);
|
|
38
|
+
const px = exportPixelWidth(doc, scale);
|
|
39
|
+
const py = Math.round(px * doc.pageHeight / doc.pageWidth);
|
|
40
|
+
const bad = !indices || indices.length === 0;
|
|
41
|
+
return /* @__PURE__ */ jsxs(View, { style: styles.stack, children: [
|
|
42
|
+
/* @__PURE__ */ jsx(Text, { style: styles.heading, children: "File type" }),
|
|
43
|
+
/* @__PURE__ */ jsx(Segmented, { options: [{
|
|
44
|
+
id: "png",
|
|
45
|
+
label: "PNG"
|
|
46
|
+
}, {
|
|
47
|
+
id: "jpg",
|
|
48
|
+
label: "JPG"
|
|
49
|
+
}, {
|
|
50
|
+
id: "pdf",
|
|
51
|
+
label: "PDF"
|
|
52
|
+
}], value: format, onChange: setFormat }),
|
|
53
|
+
/* @__PURE__ */ jsx(Text, { style: styles.hint, children: format === "png" ? "Sharpest picture, best for text and graphics." : format === "jpg" ? "Smaller picture, best for photos." : "Every page in one document, ready to send or print." }),
|
|
54
|
+
format !== "pdf" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
55
|
+
/* @__PURE__ */ jsx(Text, { style: styles.heading, children: "Size" }),
|
|
56
|
+
/* @__PURE__ */ jsx(Segmented, { options: [{
|
|
57
|
+
id: "1",
|
|
58
|
+
label: "1x"
|
|
59
|
+
}, {
|
|
60
|
+
id: "2",
|
|
61
|
+
label: "2x"
|
|
62
|
+
}, {
|
|
63
|
+
id: "3",
|
|
64
|
+
label: "3x"
|
|
65
|
+
}], value: String(scale), onChange: (v) => setScale(Number(v)) }),
|
|
66
|
+
/* @__PURE__ */ jsxs(Text, { style: styles.hint, children: [
|
|
67
|
+
px,
|
|
68
|
+
" x ",
|
|
69
|
+
py,
|
|
70
|
+
" px"
|
|
71
|
+
] })
|
|
72
|
+
] }) : null,
|
|
73
|
+
count > 1 ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
74
|
+
/* @__PURE__ */ jsx(Text, { style: styles.heading, children: "Pages" }),
|
|
75
|
+
/* @__PURE__ */ jsx(Segmented, { options: [{
|
|
76
|
+
id: "all",
|
|
77
|
+
label: `All ${count}`
|
|
78
|
+
}, {
|
|
79
|
+
id: "current",
|
|
80
|
+
label: `Page ${pageIndex + 1}`
|
|
81
|
+
}, {
|
|
82
|
+
id: "range",
|
|
83
|
+
label: "Choose"
|
|
84
|
+
}], value: which, onChange: setWhich }),
|
|
85
|
+
which === "range" ? /* @__PURE__ */ jsx(TextInput, { value: range, onChangeText: setRange, placeholder: `e.g. 1-${Math.min(3, count)}, ${count}`, placeholderTextColor: theme.edInk3, keyboardType: "numbers-and-punctuation", autoCorrect: false, style: [styles.input, bad && range.trim() ? {
|
|
86
|
+
borderColor: theme.edDanger
|
|
87
|
+
} : null] }) : null,
|
|
88
|
+
which === "range" && bad && range.trim() ? /* @__PURE__ */ jsxs(Text, { style: [styles.hint, {
|
|
89
|
+
color: theme.edDanger
|
|
90
|
+
}], children: [
|
|
91
|
+
"Use page numbers from 1 to ",
|
|
92
|
+
count,
|
|
93
|
+
", like 1-3, 5."
|
|
94
|
+
] }) : null
|
|
95
|
+
] }) : null,
|
|
96
|
+
/* @__PURE__ */ jsx(PrimaryButton, { label: busy != null ? busy : format === "pdf" ? "Download PDF" : `Download ${(indices == null ? void 0 : indices.length) && indices.length > 1 ? `${indices.length} pages` : format.toUpperCase()}`, busy: Boolean(busy), disabled: bad, onPress: () => indices && onExport({
|
|
97
|
+
format,
|
|
98
|
+
scale,
|
|
99
|
+
pageIndices: indices
|
|
100
|
+
}) })
|
|
101
|
+
] });
|
|
102
|
+
}
|
|
103
|
+
const makeStyles = themedStyles((theme) => StyleSheet.create({
|
|
104
|
+
stack: {
|
|
105
|
+
gap: SPACE.sm
|
|
106
|
+
},
|
|
107
|
+
heading: __spreadProps(__spreadValues({}, TYPE.label), {
|
|
108
|
+
color: theme.edInk,
|
|
109
|
+
marginTop: SPACE.xs
|
|
110
|
+
}),
|
|
111
|
+
hint: __spreadProps(__spreadValues({}, TYPE.caption), {
|
|
112
|
+
color: theme.edInk3
|
|
113
|
+
}),
|
|
114
|
+
input: __spreadValues({
|
|
115
|
+
height: 42,
|
|
116
|
+
borderRadius: RADIUS.sm,
|
|
117
|
+
borderWidth: 1,
|
|
118
|
+
borderColor: "transparent",
|
|
119
|
+
paddingHorizontal: SPACE.md,
|
|
120
|
+
backgroundColor: theme.edRaised,
|
|
121
|
+
color: theme.edInk
|
|
122
|
+
}, TYPE.body)
|
|
123
|
+
}));export{ExportSheet};//# sourceMappingURL=ExportSheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportSheet.js","sources":["../../../../src/features/design/editor/ExportSheet.tsx"],"sourcesContent":["/**\n * Download (web CarouselEditor Share > Download): the file type, the size for\n * pictures, and which pages - every page, this one, or a range typed as a\n * print dialog takes it (\"1-3, 5\").\n */\nimport React, { useMemo, useState } from 'react';\nimport { StyleSheet, Text, TextInput, View } from 'react-native';\nimport { themedStyles, useCanvasTheme, type CanvasPalette } from '../../canvas/canvasTheme';\nimport { RADIUS, SPACE, TYPE } from '../../canvas/canvasUi';\nimport { parsePageRange } from '../doc/pageRange';\nimport type { DesignDoc } from '../doc/types';\nimport { exportPixelWidth, type ExportFormat } from '../export/exportDesign';\nimport { PrimaryButton, Segmented } from './controls';\n\nexport interface ExportChoice {\n format: ExportFormat;\n scale: number;\n pageIndices: number[];\n}\n\ntype Which = 'all' | 'current' | 'range';\n\nexport function ExportSheet({\n doc,\n pageIndex,\n busy,\n onExport,\n}: {\n doc: DesignDoc;\n pageIndex: number;\n busy: string | null;\n onExport: (choice: ExportChoice) => void;\n}) {\n const theme = useCanvasTheme();\n const styles = makeStyles(theme);\n const count = doc.pages.length;\n const [format, setFormat] = useState<ExportFormat>(count > 1 ? 'pdf' : 'png');\n const [scale, setScale] = useState(2);\n const [which, setWhich] = useState<Which>(count > 1 ? 'all' : 'current');\n const [range, setRange] = useState('');\n const indices = useMemo(() => {\n if (which === 'all') return doc.pages.map((_, i) => i);\n if (which === 'current') return [pageIndex];\n return parsePageRange(range, count);\n }, [which, range, count, pageIndex, doc.pages]);\n const px = exportPixelWidth(doc, scale);\n const py = Math.round((px * doc.pageHeight) / doc.pageWidth);\n const bad = !indices || indices.length === 0;\n return (\n <View style={styles.stack}>\n <Text style={styles.heading}>File type</Text>\n <Segmented<ExportFormat>\n options={[\n { id: 'png', label: 'PNG' },\n { id: 'jpg', label: 'JPG' },\n { id: 'pdf', label: 'PDF' },\n ]}\n value={format}\n onChange={setFormat}\n />\n <Text style={styles.hint}>\n {format === 'png'\n ? 'Sharpest picture, best for text and graphics.'\n : format === 'jpg'\n ? 'Smaller picture, best for photos.'\n : 'Every page in one document, ready to send or print.'}\n </Text>\n {format !== 'pdf' ? (\n <>\n <Text style={styles.heading}>Size</Text>\n <Segmented<'1' | '2' | '3'>\n options={[\n { id: '1', label: '1x' },\n { id: '2', label: '2x' },\n { id: '3', label: '3x' },\n ]}\n value={String(scale) as '1' | '2' | '3'}\n onChange={(v) => setScale(Number(v))}\n />\n <Text style={styles.hint}>\n {px} x {py} px\n </Text>\n </>\n ) : null}\n {count > 1 ? (\n <>\n <Text style={styles.heading}>Pages</Text>\n <Segmented<Which>\n options={[\n { id: 'all', label: `All ${count}` },\n { id: 'current', label: `Page ${pageIndex + 1}` },\n { id: 'range', label: 'Choose' },\n ]}\n value={which}\n onChange={setWhich}\n />\n {which === 'range' ? (\n <TextInput\n value={range}\n onChangeText={setRange}\n placeholder={`e.g. 1-${Math.min(3, count)}, ${count}`}\n placeholderTextColor={theme.edInk3}\n keyboardType=\"numbers-and-punctuation\"\n autoCorrect={false}\n style={[styles.input, bad && range.trim() ? { borderColor: theme.edDanger } : null]}\n />\n ) : null}\n {which === 'range' && bad && range.trim() ? (\n <Text style={[styles.hint, { color: theme.edDanger }]}>\n Use page numbers from 1 to {count}, like 1-3, 5.\n </Text>\n ) : null}\n </>\n ) : null}\n <PrimaryButton\n label={\n busy ??\n (format === 'pdf'\n ? 'Download PDF'\n : `Download ${indices?.length && indices.length > 1 ? `${indices.length} pages` : format.toUpperCase()}`)\n }\n busy={Boolean(busy)}\n disabled={bad}\n onPress={() => indices && onExport({ format, scale, pageIndices: indices })}\n />\n </View>\n );\n}\n\nconst makeStyles = themedStyles((theme: CanvasPalette) =>\n StyleSheet.create({\n stack: { gap: SPACE.sm },\n heading: { ...TYPE.label, color: theme.edInk, marginTop: SPACE.xs },\n hint: { ...TYPE.caption, color: theme.edInk3 },\n input: {\n height: 42,\n borderRadius: RADIUS.sm,\n borderWidth: 1,\n borderColor: 'transparent',\n paddingHorizontal: SPACE.md,\n backgroundColor: theme.edRaised,\n color: theme.edInk,\n ...TYPE.body,\n },\n }),\n);\n"],"names":[],"mappings":"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"}
|