@adminide-stack/yantra-mobile 12.0.128 → 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 +4 -4
- package/lib/features/design/exportDesign.js +0 -133
- package/lib/features/design/exportDesign.js.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
const GOOGLE_WEIGHTS = "100,200,300,400,500,600,700,800,900,400italic,700italic";
|
|
2
|
+
function googleFontCssUrl(family) {
|
|
3
|
+
return `https://fonts.googleapis.com/css?family=${encodeURIComponent(family.trim()).replace(/%20/g, "+")}:${GOOGLE_WEIGHTS}`;
|
|
4
|
+
}
|
|
5
|
+
function parseGoogleFontCss(css) {
|
|
6
|
+
var _a, _b, _c, _d;
|
|
7
|
+
const faces = [];
|
|
8
|
+
for (const block of css.split("@font-face").slice(1)) {
|
|
9
|
+
const url = (_b = (_a = /src:\s*url\(([^)]+)\)\s*format\(['"]truetype['"]\)/.exec(block)) == null ? void 0 : _a[1]) == null ? void 0 : _b.trim();
|
|
10
|
+
if (!url || !/^https:\/\//.test(url)) continue;
|
|
11
|
+
const weight = Number((_d = (_c = /font-weight:\s*(\d+)/.exec(block)) == null ? void 0 : _c[1]) != null ? _d : 400);
|
|
12
|
+
const italic = /font-style:\s*italic/.test(block);
|
|
13
|
+
faces.push({
|
|
14
|
+
weight,
|
|
15
|
+
italic,
|
|
16
|
+
url
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return faces;
|
|
20
|
+
}
|
|
21
|
+
function faceAlias(family, weight, italic) {
|
|
22
|
+
return `yd-${family.trim().replace(/[^A-Za-z0-9]+/g, "-")}-${weight}${italic ? "i" : ""}`;
|
|
23
|
+
}
|
|
24
|
+
function nearestFace(faces, weight, italic) {
|
|
25
|
+
if (!faces.length) return void 0;
|
|
26
|
+
const posture = faces.filter((f) => f.italic === italic);
|
|
27
|
+
const pool = posture.length ? posture : faces;
|
|
28
|
+
return pool.reduce((best, f) => {
|
|
29
|
+
const d = Math.abs(f.weight - weight);
|
|
30
|
+
const bd = Math.abs(best.weight - weight);
|
|
31
|
+
if (d < bd) return f;
|
|
32
|
+
if (d === bd && (weight >= 400 ? f.weight > best.weight : f.weight < best.weight)) return f;
|
|
33
|
+
return best;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const CLASS_RULES = [["mono", /mono|courier|code|consol|menlo|typewriter|inconsolata/i], ["script", /script|pacifico|vibes|allura|satisfy|signature|brush|parisienne|sacramento|calligraph|cursive|tangerine|yellowtail|alex brush|amsterdam|monoline|lobster|cookie|kaushan|playball|great/i], ["hand", /hand|caveat|indie|amatic|marker|chalk|comic|kalam|patrick|shadows|gloria|architects|permanent|sketch|crayon|kids/i], ["condensed", /condensed|compressed|narrow|bebas|anton|oswald|impact|league gothic|six caps|big shoulders|fjalla|teko|barlow condensed|archivo narrow|antonio|squada|staatliches/i], ["didone", /didot|bodoni|playfair|abril|dm serif|prata|vidaloka|yeseva|rozha|chonburi|gfs/i], ["oldstyle", /garamond|cormorant|baskerville|caslon|cardo|lora|crimson|libre baskerville|libre caslon|sabon|minion|spectral|alegreya|old standard|palatino|book|times|merriweather|georgia|pt serif|noto serif|source serif|eb /i], ["serif", /serif|slab|roboto slab|arvo|rockwell|zilla|bitter|domine|cinzel|trajan|cooper|recoleta|fraunces|shrikhand|serif display/i], ["geometric", /gotham|montserrat|poppins|futura|avenir|century gothic|josefin|raleway|nunito|quicksand|comfortaa|questrial|didact|jost|outfit|urbanist|lexend|league spartan|spartan|sora|manrope|brandon|glacial|tt norms|sofia|museo|proxima|circular|gilroy|kumbh|red hat|righteous|fredoka|varela|archivo black/i]];
|
|
37
|
+
function fontClassOf(family) {
|
|
38
|
+
const name = (family != null ? family : "").trim();
|
|
39
|
+
if (!name) return "sans";
|
|
40
|
+
for (const [cls, re] of CLASS_RULES) if (re.test(name)) return cls;
|
|
41
|
+
return "sans";
|
|
42
|
+
}
|
|
43
|
+
const SYSTEM_FACES = {
|
|
44
|
+
ios: {
|
|
45
|
+
sans: void 0,
|
|
46
|
+
geometric: "Avenir Next",
|
|
47
|
+
serif: "Georgia",
|
|
48
|
+
didone: "Didot",
|
|
49
|
+
oldstyle: "Baskerville",
|
|
50
|
+
mono: "Menlo",
|
|
51
|
+
condensed: "Avenir Next Condensed",
|
|
52
|
+
script: "Snell Roundhand",
|
|
53
|
+
hand: "Noteworthy"
|
|
54
|
+
},
|
|
55
|
+
android: {
|
|
56
|
+
sans: void 0,
|
|
57
|
+
geometric: "sans-serif",
|
|
58
|
+
serif: "serif",
|
|
59
|
+
didone: "serif",
|
|
60
|
+
oldstyle: "serif",
|
|
61
|
+
mono: "monospace",
|
|
62
|
+
condensed: "sans-serif-condensed",
|
|
63
|
+
script: "cursive",
|
|
64
|
+
hand: "casual"
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
const SHIPPED = {
|
|
68
|
+
ios: /* @__PURE__ */ new Set(["Arial", "Avenir", "Avenir Next", "Baskerville", "Courier New", "Didot", "Futura", "Georgia", "Gill Sans", "Helvetica", "Helvetica Neue", "Menlo", "Optima", "Palatino", "Times New Roman", "Trebuchet MS", "Verdana", "American Typewriter", "Copperplate", "Snell Roundhand", "Noteworthy", "Marker Felt", "Chalkboard SE", "Bodoni 72"]),
|
|
69
|
+
android: /* @__PURE__ */ new Set(["sans-serif", "serif", "monospace", "cursive", "casual"])
|
|
70
|
+
};
|
|
71
|
+
function systemFontFor(family, platform) {
|
|
72
|
+
const name = (family != null ? family : "").trim();
|
|
73
|
+
if (name && SHIPPED[platform].has(name)) return name;
|
|
74
|
+
return SYSTEM_FACES[platform][fontClassOf(name)];
|
|
75
|
+
}
|
|
76
|
+
function rnWeight(weight) {
|
|
77
|
+
const w = Math.min(900, Math.max(100, Math.round((weight != null ? weight : 400) / 100) * 100));
|
|
78
|
+
return String(w);
|
|
79
|
+
}export{faceAlias,fontClassOf,googleFontCssUrl,nearestFace,parseGoogleFontCss,rnWeight,systemFontFor};//# sourceMappingURL=fonts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fonts.js","sources":["../../../../src/features/design/doc/fonts.ts"],"sourcesContent":["/**\n * Which face a text layer draws in on a phone.\n *\n * The web loads a template's own faces (re-hosted woff2) and Google faces at\n * runtime. iOS cannot load woff2, and the template CDN has no TrueType, so\n * native takes two steps instead:\n *\n * 1. Google Fonts serves TrueType to a non-browser client, so any family\n * Google hosts (Montserrat, Poppins, Playfair Display, ...) loads for real\n * through expo-font (render/fontRegistry.ts). The v1 CSS API tolerates\n * weights a family lacks and answers 400 for a family it does not host -\n * one request says both.\n * 2. Anything else (Canva's licensed faces: Gotham, Brandon, ...) draws in the\n * closest family the device ships, chosen by what its name says it is.\n *\n * Pure: runs under jest as-is.\n */\n\nexport type FontPlatform = 'ios' | 'android';\n\nexport interface FontFace {\n weight: number;\n italic: boolean;\n url: string;\n}\n\nconst GOOGLE_WEIGHTS = '100,200,300,400,500,600,700,800,900,400italic,700italic';\n\n/** The Google Fonts v1 stylesheet for a family, every weight it might have. */\nexport function googleFontCssUrl(family: string): string {\n return `https://fonts.googleapis.com/css?family=${encodeURIComponent(family.trim()).replace(/%20/g, '+')}:${GOOGLE_WEIGHTS}`;\n}\n\n/** The TrueType faces a Google stylesheet declares (the API answers a non-browser client with .ttf). */\nexport function parseGoogleFontCss(css: string): FontFace[] {\n const faces: FontFace[] = [];\n for (const block of css.split('@font-face').slice(1)) {\n const url = /src:\\s*url\\(([^)]+)\\)\\s*format\\(['\"]truetype['\"]\\)/.exec(block)?.[1]?.trim();\n if (!url || !/^https:\\/\\//.test(url)) continue;\n const weight = Number(/font-weight:\\s*(\\d+)/.exec(block)?.[1] ?? 400);\n const italic = /font-style:\\s*italic/.test(block);\n faces.push({ weight, italic, url });\n }\n return faces;\n}\n\n/** The name a loaded face registers under: one name per face, so no platform has to pick a weight. */\nexport function faceAlias(family: string, weight: number, italic: boolean): string {\n return `yd-${family.trim().replace(/[^A-Za-z0-9]+/g, '-')}-${weight}${italic ? 'i' : ''}`;\n}\n\n/** The loaded face closest to a wanted weight and posture (CSS's matching, roughly). */\nexport function nearestFace<T extends { weight: number; italic: boolean }>(\n faces: readonly T[],\n weight: number,\n italic: boolean,\n): T | undefined {\n if (!faces.length) return undefined;\n const posture = faces.filter((f) => f.italic === italic);\n const pool = posture.length ? posture : faces;\n return pool.reduce((best, f) => {\n const d = Math.abs(f.weight - weight);\n const bd = Math.abs(best.weight - weight);\n // Ties go to the heavier face when bolder was asked, else the lighter (CSS's rule).\n if (d < bd) return f;\n if (d === bd && (weight >= 400 ? f.weight > best.weight : f.weight < best.weight)) return f;\n return best;\n });\n}\n\n/** What a family's name says it is. */\nexport type FontClass =\n | 'sans'\n | 'geometric'\n | 'serif'\n | 'didone'\n | 'oldstyle'\n | 'mono'\n | 'condensed'\n | 'script'\n | 'hand';\n\nconst CLASS_RULES: Array<[FontClass, RegExp]> = [\n ['mono', /mono|courier|code|consol|menlo|typewriter|inconsolata/i],\n [\n 'script',\n /script|pacifico|vibes|allura|satisfy|signature|brush|parisienne|sacramento|calligraph|cursive|tangerine|yellowtail|alex brush|amsterdam|monoline|lobster|cookie|kaushan|playball|great/i,\n ],\n [\n 'hand',\n /hand|caveat|indie|amatic|marker|chalk|comic|kalam|patrick|shadows|gloria|architects|permanent|sketch|crayon|kids/i,\n ],\n [\n 'condensed',\n /condensed|compressed|narrow|bebas|anton|oswald|impact|league gothic|six caps|big shoulders|fjalla|teko|barlow condensed|archivo narrow|antonio|squada|staatliches/i,\n ],\n ['didone', /didot|bodoni|playfair|abril|dm serif|prata|vidaloka|yeseva|rozha|chonburi|gfs/i],\n [\n 'oldstyle',\n /garamond|cormorant|baskerville|caslon|cardo|lora|crimson|libre baskerville|libre caslon|sabon|minion|spectral|alegreya|old standard|palatino|book|times|merriweather|georgia|pt serif|noto serif|source serif|eb /i,\n ],\n [\n 'serif',\n /serif|slab|roboto slab|arvo|rockwell|zilla|bitter|domine|cinzel|trajan|cooper|recoleta|fraunces|shrikhand|serif display/i,\n ],\n [\n 'geometric',\n /gotham|montserrat|poppins|futura|avenir|century gothic|josefin|raleway|nunito|quicksand|comfortaa|questrial|didact|jost|outfit|urbanist|lexend|league spartan|spartan|sora|manrope|brandon|glacial|tt norms|sofia|museo|proxima|circular|gilroy|kumbh|red hat|righteous|fredoka|varela|archivo black/i,\n ],\n];\n\n/** Classify a family by its name; anything unrecognised is a plain sans. */\nexport function fontClassOf(family: string | undefined): FontClass {\n const name = (family ?? '').trim();\n if (!name) return 'sans';\n for (const [cls, re] of CLASS_RULES) if (re.test(name)) return cls;\n return 'sans';\n}\n\n/** The device family closest to each class. `undefined` is the platform's own UI face. */\nconst SYSTEM_FACES: Record<FontPlatform, Record<FontClass, string | undefined>> = {\n ios: {\n sans: undefined,\n geometric: 'Avenir Next',\n serif: 'Georgia',\n didone: 'Didot',\n oldstyle: 'Baskerville',\n mono: 'Menlo',\n condensed: 'Avenir Next Condensed',\n script: 'Snell Roundhand',\n hand: 'Noteworthy',\n },\n android: {\n sans: undefined,\n geometric: 'sans-serif',\n serif: 'serif',\n didone: 'serif',\n oldstyle: 'serif',\n mono: 'monospace',\n condensed: 'sans-serif-condensed',\n script: 'cursive',\n hand: 'casual',\n },\n};\n\n/** Families some devices ship under their own name: draw them as themselves. */\nconst SHIPPED: Record<FontPlatform, ReadonlySet<string>> = {\n ios: new Set([\n 'Arial',\n 'Avenir',\n 'Avenir Next',\n 'Baskerville',\n 'Courier New',\n 'Didot',\n 'Futura',\n 'Georgia',\n 'Gill Sans',\n 'Helvetica',\n 'Helvetica Neue',\n 'Menlo',\n 'Optima',\n 'Palatino',\n 'Times New Roman',\n 'Trebuchet MS',\n 'Verdana',\n 'American Typewriter',\n 'Copperplate',\n 'Snell Roundhand',\n 'Noteworthy',\n 'Marker Felt',\n 'Chalkboard SE',\n 'Bodoni 72',\n ]),\n android: new Set(['sans-serif', 'serif', 'monospace', 'cursive', 'casual']),\n};\n\n/** The device family a layer's family draws in when its own face is not loaded. */\nexport function systemFontFor(family: string | undefined, platform: FontPlatform): string | undefined {\n const name = (family ?? '').trim();\n if (name && SHIPPED[platform].has(name)) return name;\n return SYSTEM_FACES[platform][fontClassOf(name)];\n}\n\n/** The RN weight string for a numeric weight (RN accepts '100'...'900'). */\nexport function rnWeight(\n weight: number | undefined,\n): '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' {\n const w = Math.min(900, Math.max(100, Math.round((weight ?? 400) / 100) * 100));\n return String(w) as ReturnType<typeof rnWeight>;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {SHAPES}from'./shapes.js';const fromShape = (kind) => ({
|
|
2
|
+
id: kind,
|
|
3
|
+
label: SHAPES[kind].label,
|
|
4
|
+
d: SHAPES[kind].d
|
|
5
|
+
});
|
|
6
|
+
const FRAME_SHAPES = [fromShape("ellipse"), {
|
|
7
|
+
id: "rounded",
|
|
8
|
+
label: "Rounded square",
|
|
9
|
+
d: "M.15 0H.85A.15 .15 0 0 1 1 .15V.85A.15 .15 0 0 1 .85 1H.15A.15 .15 0 0 1 0 .85V.15A.15 .15 0 0 1 .15 0Z"
|
|
10
|
+
}, fromShape("arch"), fromShape("pill"), {
|
|
11
|
+
id: "heart",
|
|
12
|
+
label: "Heart",
|
|
13
|
+
d: "M.5 .92C.15 .67 0 .47 0 .29C0 .13 .13 0 .28 0C.38 0 .46 .06 .5 .14C.54 .06 .62 0 .72 0C.87 0 1 .13 1 .29C1 .47 .85 .67 .5 .92Z"
|
|
14
|
+
}, fromShape("triangle"), fromShape("diamond"), fromShape("pentagon"), fromShape("hexagon"), fromShape("star"), fromShape("sparkle"), fromShape("burst"), fromShape("semicircle"), fromShape("parallelogram")];
|
|
15
|
+
function frameOf(clipPath) {
|
|
16
|
+
return clipPath ? FRAME_SHAPES.find((f) => f.d === clipPath) : void 0;
|
|
17
|
+
}export{FRAME_SHAPES,frameOf};//# sourceMappingURL=frames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.js","sources":["../../../../src/features/design/doc/frames.ts"],"sourcesContent":["/**\n * Canva's Frames - native twin of canvas-surface `carousel-editor/utils/frames.ts`:\n * a picture shown through a shape. A frame is an outline in a 0..1 box (the\n * shape catalog's form), stored on the image layer as `clipPath`, which the\n * native renderer already clips by - so the phone, the web and every export\n * clip the same way.\n *\n * Pure: runs under jest as-is.\n */\nimport { SHAPES, type ShapeKind } from './shapes';\n\nexport interface FrameShape {\n id: string;\n label: string;\n d: string;\n}\n\nconst fromShape = (kind: ShapeKind): FrameShape => ({ id: kind, label: SHAPES[kind].label, d: SHAPES[kind].d });\n\n/** Canva's basic frames, in the order its panel shows them (web FRAME_SHAPES, outlines verbatim). */\nexport const FRAME_SHAPES: FrameShape[] = [\n fromShape('ellipse'),\n {\n id: 'rounded',\n label: 'Rounded square',\n d: 'M.15 0H.85A.15 .15 0 0 1 1 .15V.85A.15 .15 0 0 1 .85 1H.15A.15 .15 0 0 1 0 .85V.15A.15 .15 0 0 1 .15 0Z',\n },\n fromShape('arch'),\n fromShape('pill'),\n {\n id: 'heart',\n label: 'Heart',\n d: 'M.5 .92C.15 .67 0 .47 0 .29C0 .13 .13 0 .28 0C.38 0 .46 .06 .5 .14C.54 .06 .62 0 .72 0C.87 0 1 .13 1 .29C1 .47 .85 .67 .5 .92Z',\n },\n fromShape('triangle'),\n fromShape('diamond'),\n fromShape('pentagon'),\n fromShape('hexagon'),\n fromShape('star'),\n fromShape('sparkle'),\n fromShape('burst'),\n fromShape('semicircle'),\n fromShape('parallelogram'),\n];\n\n/** The frame a stored outline came from; undefined for a custom outline. */\nexport function frameOf(clipPath: string | undefined): FrameShape | undefined {\n return clipPath ? FRAME_SHAPES.find((f) => f.d === clipPath) : undefined;\n}\n"],"names":[],"mappings":"iCAeA,MAAM,SAAA,GAAY,CAAC,IAAiC,MAAA;AAAA,EAClD,EAAI,EAAA,IAAA;AAAA,EACJ,KAAA,EAAO,MAAO,CAAA,IAAI,CAAE,CAAA,KAAA;AAAA,EACpB,CAAA,EAAG,MAAO,CAAA,IAAI,CAAE,CAAA;AAClB,CAAA,CAAA;AAGO,MAAM,YAA6B,GAAA,CAAC,SAAU,CAAA,SAAS,CAAG,EAAA;AAAA,EAC/D,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA,gBAAA;AAAA,EACP,CAAG,EAAA;AACL,CAAA,EAAG,SAAU,CAAA,MAAM,CAAG,EAAA,SAAA,CAAU,MAAM,CAAG,EAAA;AAAA,EACvC,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,CAAG,EAAA;AACL,CAAG,EAAA,SAAA,CAAU,UAAU,CAAA,EAAG,SAAU,CAAA,SAAS,CAAG,EAAA,SAAA,CAAU,UAAU,CAAA,EAAG,SAAU,CAAA,SAAS,CAAG,EAAA,SAAA,CAAU,MAAM,CAAG,EAAA,SAAA,CAAU,SAAS,CAAA,EAAG,SAAU,CAAA,OAAO,CAAG,EAAA,SAAA,CAAU,YAAY,CAAA,EAAG,SAAU,CAAA,eAAe,CAAC;AAGtM,SAAS,QAAQ,QAAsD,EAAA;AAC5E,EAAA,OAAO,WAAW,YAAa,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,CAAA,KAAM,QAAQ,CAAI,GAAA,MAAA;AAC/D"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
const rad = (deg) => deg * Math.PI / 180;
|
|
21
|
+
function rotate(x, y, deg) {
|
|
22
|
+
const t = rad(deg);
|
|
23
|
+
const c = Math.cos(t);
|
|
24
|
+
const s = Math.sin(t);
|
|
25
|
+
return [x * c - y * s, x * s + y * c];
|
|
26
|
+
}
|
|
27
|
+
function layerBox(layer, W, H) {
|
|
28
|
+
return {
|
|
29
|
+
x: layer.x * W,
|
|
30
|
+
y: layer.y * H,
|
|
31
|
+
w: layer.w * W,
|
|
32
|
+
h: layer.h * H
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function pointInBox(px, py, box, deg = 0, slop = 0) {
|
|
36
|
+
const cx = box.x + box.w / 2;
|
|
37
|
+
const cy = box.y + box.h / 2;
|
|
38
|
+
const [lx, ly] = rotate(px - cx, py - cy, -deg);
|
|
39
|
+
return Math.abs(lx) <= box.w / 2 + slop && Math.abs(ly) <= box.h / 2 + slop;
|
|
40
|
+
}
|
|
41
|
+
function hitTest(layers, px, py, W, H) {
|
|
42
|
+
var _a;
|
|
43
|
+
for (let i = layers.length - 1; i >= 0; i -= 1) {
|
|
44
|
+
const layer = layers[i];
|
|
45
|
+
const box = layerBox(layer, W, H);
|
|
46
|
+
const slop = Math.min(box.w, box.h) < 24 ? 10 : 0;
|
|
47
|
+
if (pointInBox(px, py, box, (_a = layer.rotation) != null ? _a : 0, slop)) return layer;
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const SIGN = {
|
|
52
|
+
nw: [-1, -1],
|
|
53
|
+
n: [0, -1],
|
|
54
|
+
ne: [1, -1],
|
|
55
|
+
e: [1, 0],
|
|
56
|
+
se: [1, 1],
|
|
57
|
+
s: [0, 1],
|
|
58
|
+
sw: [-1, 1],
|
|
59
|
+
w: [-1, 0]
|
|
60
|
+
};
|
|
61
|
+
function handlePoint(box, deg, handle) {
|
|
62
|
+
const [sx, sy] = SIGN[handle];
|
|
63
|
+
const [ox, oy] = rotate(sx * box.w / 2, sy * box.h / 2, deg);
|
|
64
|
+
return [box.x + box.w / 2 + ox, box.y + box.h / 2 + oy];
|
|
65
|
+
}
|
|
66
|
+
function rotateKnobPoint(box, deg, gap) {
|
|
67
|
+
const [ox, oy] = rotate(0, box.h / 2 + gap, deg);
|
|
68
|
+
return [box.x + box.w / 2 + ox, box.y + box.h / 2 + oy];
|
|
69
|
+
}
|
|
70
|
+
function resizeBox(box, deg, handle, dx, dy, opts = {}) {
|
|
71
|
+
var _a;
|
|
72
|
+
const min = (_a = opts.minSize) != null ? _a : 8;
|
|
73
|
+
const [sx, sy] = SIGN[handle];
|
|
74
|
+
const [ldx, ldy] = rotate(dx, dy, -deg);
|
|
75
|
+
let w = sx ? Math.max(min, box.w + sx * ldx) : box.w;
|
|
76
|
+
let h = sy ? Math.max(min, box.h + sy * ldy) : box.h;
|
|
77
|
+
if (opts.keepAspect && sx && sy) {
|
|
78
|
+
const scale = Math.max(w / box.w, h / box.h);
|
|
79
|
+
const floor = min / Math.min(box.w, box.h);
|
|
80
|
+
const s = Math.max(scale, floor);
|
|
81
|
+
w = box.w * s;
|
|
82
|
+
h = box.h * s;
|
|
83
|
+
}
|
|
84
|
+
const cx = box.x + box.w / 2;
|
|
85
|
+
const cy = box.y + box.h / 2;
|
|
86
|
+
const [ax, ay] = rotate(-sx * box.w / 2, -sy * box.h / 2, deg);
|
|
87
|
+
const anchorX = cx + ax;
|
|
88
|
+
const anchorY = cy + ay;
|
|
89
|
+
const [nx, ny] = rotate(-sx * w / 2, -sy * h / 2, deg);
|
|
90
|
+
const ncx = anchorX - nx;
|
|
91
|
+
const ncy = anchorY - ny;
|
|
92
|
+
return {
|
|
93
|
+
x: ncx - w / 2,
|
|
94
|
+
y: ncy - h / 2,
|
|
95
|
+
w,
|
|
96
|
+
h
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function rotateFromDrag(box, startDeg, from, to, snap = 4) {
|
|
100
|
+
const cx = box.x + box.w / 2;
|
|
101
|
+
const cy = box.y + box.h / 2;
|
|
102
|
+
const a0 = Math.atan2(from[1] - cy, from[0] - cx);
|
|
103
|
+
const a1 = Math.atan2(to[1] - cy, to[0] - cx);
|
|
104
|
+
let deg = startDeg + (a1 - a0) * 180 / Math.PI;
|
|
105
|
+
deg = ((deg + 180) % 360 + 360) % 360 - 180;
|
|
106
|
+
const nearest = Math.round(deg / 45) * 45;
|
|
107
|
+
if (Math.abs(deg - nearest) <= snap) deg = nearest === -180 ? 180 : nearest;
|
|
108
|
+
return Math.round(deg * 10) / 10;
|
|
109
|
+
}
|
|
110
|
+
function snapToPage(box, W, H, tol = 6) {
|
|
111
|
+
let {
|
|
112
|
+
x,
|
|
113
|
+
y
|
|
114
|
+
} = box;
|
|
115
|
+
let guideX = false;
|
|
116
|
+
let guideY = false;
|
|
117
|
+
if (Math.abs(x + box.w / 2 - W / 2) <= tol) {
|
|
118
|
+
x = W / 2 - box.w / 2;
|
|
119
|
+
guideX = true;
|
|
120
|
+
}
|
|
121
|
+
if (Math.abs(y + box.h / 2 - H / 2) <= tol) {
|
|
122
|
+
y = H / 2 - box.h / 2;
|
|
123
|
+
guideY = true;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
box: __spreadProps(__spreadValues({}, box), {
|
|
127
|
+
x,
|
|
128
|
+
y
|
|
129
|
+
}),
|
|
130
|
+
guideX,
|
|
131
|
+
guideY
|
|
132
|
+
};
|
|
133
|
+
}export{handlePoint,hitTest,layerBox,pointInBox,resizeBox,rotateFromDrag,rotateKnobPoint,snapToPage};//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","sources":["../../../../src/features/design/doc/geometry.ts"],"sourcesContent":["/**\n * Touch geometry for the editor: which layer a tap lands on, where a rotated\n * layer's handles are, and how a handle drag resizes or turns it.\n *\n * Everything works in the canvas's own px (page fractions times the drawn\n * page size). A layer turns about its centre, as on web, so a point is tested\n * against the box by turning it back first; a resize keeps the handle's\n * opposite corner (or side) where it was on screen, turned or not.\n *\n * Pure: runs under jest as-is.\n */\nimport type { EditorLayer } from './types';\n\nexport interface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport type Handle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\nconst rad = (deg: number) => (deg * Math.PI) / 180;\n\nfunction rotate(x: number, y: number, deg: number): [number, number] {\n const t = rad(deg);\n const c = Math.cos(t);\n const s = Math.sin(t);\n return [x * c - y * s, x * s + y * c];\n}\n\nexport function layerBox(layer: Pick<EditorLayer, 'x' | 'y' | 'w' | 'h'>, W: number, H: number): Box {\n return { x: layer.x * W, y: layer.y * H, w: layer.w * W, h: layer.h * H };\n}\n\n/** Is a point inside a box turned `deg` about its centre? `slop` widens it for a thumb. */\nexport function pointInBox(px: number, py: number, box: Box, deg = 0, slop = 0): boolean {\n const cx = box.x + box.w / 2;\n const cy = box.y + box.h / 2;\n const [lx, ly] = rotate(px - cx, py - cy, -deg);\n return Math.abs(lx) <= box.w / 2 + slop && Math.abs(ly) <= box.h / 2 + slop;\n}\n\n/**\n * The topmost layer under a point, or null. A thin layer (a rule, a line of\n * small text) takes a few px of slop so it can still be tapped.\n */\nexport function hitTest(\n layers: readonly EditorLayer[],\n px: number,\n py: number,\n W: number,\n H: number,\n): EditorLayer | null {\n for (let i = layers.length - 1; i >= 0; i -= 1) {\n const layer = layers[i];\n const box = layerBox(layer, W, H);\n const slop = Math.min(box.w, box.h) < 24 ? 10 : 0;\n if (pointInBox(px, py, box, layer.rotation ?? 0, slop)) return layer;\n }\n return null;\n}\n\nconst SIGN: Record<Handle, [number, number]> = {\n nw: [-1, -1],\n n: [0, -1],\n ne: [1, -1],\n e: [1, 0],\n se: [1, 1],\n s: [0, 1],\n sw: [-1, 1],\n w: [-1, 0],\n};\n\n/** Where a handle sits on screen, the box turned `deg`. */\nexport function handlePoint(box: Box, deg: number, handle: Handle): [number, number] {\n const [sx, sy] = SIGN[handle];\n const [ox, oy] = rotate((sx * box.w) / 2, (sy * box.h) / 2, deg);\n return [box.x + box.w / 2 + ox, box.y + box.h / 2 + oy];\n}\n\n/** The rotate knob: below the box, `gap` px past its bottom edge, turning with it. */\nexport function rotateKnobPoint(box: Box, deg: number, gap: number): [number, number] {\n const [ox, oy] = rotate(0, box.h / 2 + gap, deg);\n return [box.x + box.w / 2 + ox, box.y + box.h / 2 + oy];\n}\n\n/**\n * Drag a handle by (dx, dy) screen px. Corners keep the box's aspect when\n * `keepAspect` (pictures, and text, whose corners scale its words); sides move\n * one edge. The opposite corner or side stays put on screen.\n */\nexport function resizeBox(\n box: Box,\n deg: number,\n handle: Handle,\n dx: number,\n dy: number,\n opts: { keepAspect?: boolean; minSize?: number } = {},\n): Box {\n const min = opts.minSize ?? 8;\n const [sx, sy] = SIGN[handle];\n const [ldx, ldy] = rotate(dx, dy, -deg);\n let w = sx ? Math.max(min, box.w + sx * ldx) : box.w;\n let h = sy ? Math.max(min, box.h + sy * ldy) : box.h;\n if (opts.keepAspect && sx && sy) {\n // The larger pull wins, so a diagonal drag tracks the thumb.\n const scale = Math.max(w / box.w, h / box.h);\n const floor = min / Math.min(box.w, box.h);\n const s = Math.max(scale, floor);\n w = box.w * s;\n h = box.h * s;\n }\n // The anchor: the opposite corner (or side midpoint), fixed on screen.\n const cx = box.x + box.w / 2;\n const cy = box.y + box.h / 2;\n const [ax, ay] = rotate((-sx * box.w) / 2, (-sy * box.h) / 2, deg);\n const anchorX = cx + ax;\n const anchorY = cy + ay;\n const [nx, ny] = rotate((-sx * w) / 2, (-sy * h) / 2, deg);\n const ncx = anchorX - nx;\n const ncy = anchorY - ny;\n return { x: ncx - w / 2, y: ncy - h / 2, w, h };\n}\n\n/** Rotation after dragging the knob from `from` to `to` (screen px), snapped to 45° steps within `snap` degrees. */\nexport function rotateFromDrag(\n box: Box,\n startDeg: number,\n from: [number, number],\n to: [number, number],\n snap = 4,\n): number {\n const cx = box.x + box.w / 2;\n const cy = box.y + box.h / 2;\n const a0 = Math.atan2(from[1] - cy, from[0] - cx);\n const a1 = Math.atan2(to[1] - cy, to[0] - cx);\n let deg = startDeg + ((a1 - a0) * 180) / Math.PI;\n deg = ((((deg + 180) % 360) + 360) % 360) - 180;\n const nearest = Math.round(deg / 45) * 45;\n if (Math.abs(deg - nearest) <= snap) deg = nearest === -180 ? 180 : nearest;\n return Math.round(deg * 10) / 10;\n}\n\n/** Snap a moved box's centre and edges to the page's centre lines within `tol` px; returns the snapped box and the guides hit. */\nexport function snapToPage(box: Box, W: number, H: number, tol = 6): { box: Box; guideX: boolean; guideY: boolean } {\n let { x, y } = box;\n let guideX = false;\n let guideY = false;\n if (Math.abs(x + box.w / 2 - W / 2) <= tol) {\n x = W / 2 - box.w / 2;\n guideX = true;\n }\n if (Math.abs(y + box.h / 2 - H / 2) <= tol) {\n y = H / 2 - box.h / 2;\n guideY = true;\n }\n return { box: { ...box, x, y }, guideX, guideY };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
const IMAGE_FILTERS = [{
|
|
2
|
+
id: "epic",
|
|
3
|
+
label: "Epic",
|
|
4
|
+
look: {
|
|
5
|
+
contrast: 1.25,
|
|
6
|
+
saturate: 1.3,
|
|
7
|
+
brightness: 0.95
|
|
8
|
+
}
|
|
9
|
+
}, {
|
|
10
|
+
id: "festive",
|
|
11
|
+
label: "Festive",
|
|
12
|
+
look: {
|
|
13
|
+
saturate: 1.5,
|
|
14
|
+
hue: -10,
|
|
15
|
+
brightness: 1.05
|
|
16
|
+
}
|
|
17
|
+
}, {
|
|
18
|
+
id: "summer",
|
|
19
|
+
label: "Summer",
|
|
20
|
+
look: {
|
|
21
|
+
sepia: 0.25,
|
|
22
|
+
saturate: 1.35,
|
|
23
|
+
brightness: 1.08
|
|
24
|
+
}
|
|
25
|
+
}, {
|
|
26
|
+
id: "dramatic",
|
|
27
|
+
label: "Dramatic",
|
|
28
|
+
look: {
|
|
29
|
+
contrast: 1.45,
|
|
30
|
+
brightness: 0.88,
|
|
31
|
+
saturate: 0.85
|
|
32
|
+
}
|
|
33
|
+
}, {
|
|
34
|
+
id: "retro",
|
|
35
|
+
label: "Retro",
|
|
36
|
+
look: {
|
|
37
|
+
sepia: 0.45,
|
|
38
|
+
contrast: 1.1,
|
|
39
|
+
saturate: 0.85,
|
|
40
|
+
hue: -8
|
|
41
|
+
}
|
|
42
|
+
}, {
|
|
43
|
+
id: "vintage",
|
|
44
|
+
label: "Vintage",
|
|
45
|
+
look: {
|
|
46
|
+
sepia: 0.6,
|
|
47
|
+
contrast: 0.9,
|
|
48
|
+
brightness: 1.05
|
|
49
|
+
}
|
|
50
|
+
}, {
|
|
51
|
+
id: "warm",
|
|
52
|
+
label: "Warm",
|
|
53
|
+
look: {
|
|
54
|
+
sepia: 0.3,
|
|
55
|
+
hue: -12,
|
|
56
|
+
saturate: 1.15
|
|
57
|
+
}
|
|
58
|
+
}, {
|
|
59
|
+
id: "cool",
|
|
60
|
+
label: "Cool",
|
|
61
|
+
look: {
|
|
62
|
+
hue: 12,
|
|
63
|
+
saturate: 1.1,
|
|
64
|
+
brightness: 1.02
|
|
65
|
+
}
|
|
66
|
+
}, {
|
|
67
|
+
id: "fade",
|
|
68
|
+
label: "Fade",
|
|
69
|
+
look: {
|
|
70
|
+
contrast: 0.82,
|
|
71
|
+
brightness: 1.08,
|
|
72
|
+
saturate: 0.8
|
|
73
|
+
}
|
|
74
|
+
}, {
|
|
75
|
+
id: "noir",
|
|
76
|
+
label: "Noir",
|
|
77
|
+
look: {
|
|
78
|
+
grayscale: 1,
|
|
79
|
+
contrast: 1.4,
|
|
80
|
+
brightness: 0.92
|
|
81
|
+
}
|
|
82
|
+
}, {
|
|
83
|
+
id: "mono",
|
|
84
|
+
label: "Mono",
|
|
85
|
+
look: {
|
|
86
|
+
grayscale: 1
|
|
87
|
+
}
|
|
88
|
+
}];
|
|
89
|
+
const DEFAULT_SHADOW = {
|
|
90
|
+
color: "#000000",
|
|
91
|
+
alpha: 0.35,
|
|
92
|
+
blurFrac: 0.02,
|
|
93
|
+
distFrac: 0.012,
|
|
94
|
+
angle: 90
|
|
95
|
+
};
|
|
96
|
+
function filterChain(a) {
|
|
97
|
+
var _a;
|
|
98
|
+
if (!a) return [];
|
|
99
|
+
const out = [];
|
|
100
|
+
const look = a.filter && ((_a = IMAGE_FILTERS.find((f) => f.id === a.filter.id)) == null ? void 0 : _a.look);
|
|
101
|
+
if (look && a.filter) {
|
|
102
|
+
const t = Math.min(1, Math.max(0, a.filter.intensity));
|
|
103
|
+
const mul = (v) => v == null ? null : 1 + (v - 1) * t;
|
|
104
|
+
const add = (v) => v == null ? null : v * t;
|
|
105
|
+
const sep = add(look.sepia);
|
|
106
|
+
const g = add(look.grayscale);
|
|
107
|
+
const h = add(look.hue);
|
|
108
|
+
const b = mul(look.brightness);
|
|
109
|
+
const c = mul(look.contrast);
|
|
110
|
+
const s = mul(look.saturate);
|
|
111
|
+
if (sep) out.push({
|
|
112
|
+
fn: "sepia",
|
|
113
|
+
v: sep
|
|
114
|
+
});
|
|
115
|
+
if (g) out.push({
|
|
116
|
+
fn: "grayscale",
|
|
117
|
+
v: g
|
|
118
|
+
});
|
|
119
|
+
if (h) out.push({
|
|
120
|
+
fn: "hue",
|
|
121
|
+
v: h
|
|
122
|
+
});
|
|
123
|
+
if (b != null && b !== 1) out.push({
|
|
124
|
+
fn: "brightness",
|
|
125
|
+
v: b
|
|
126
|
+
});
|
|
127
|
+
if (c != null && c !== 1) out.push({
|
|
128
|
+
fn: "contrast",
|
|
129
|
+
v: c
|
|
130
|
+
});
|
|
131
|
+
if (s != null && s !== 1) out.push({
|
|
132
|
+
fn: "saturate",
|
|
133
|
+
v: s
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (a.brightness != null && a.brightness !== 1) out.push({
|
|
137
|
+
fn: "brightness",
|
|
138
|
+
v: a.brightness
|
|
139
|
+
});
|
|
140
|
+
if (a.contrast != null && a.contrast !== 1) out.push({
|
|
141
|
+
fn: "contrast",
|
|
142
|
+
v: a.contrast
|
|
143
|
+
});
|
|
144
|
+
if (a.saturation != null && a.saturation !== 1) out.push({
|
|
145
|
+
fn: "saturate",
|
|
146
|
+
v: a.saturation
|
|
147
|
+
});
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
const IDENTITY = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]];
|
|
151
|
+
function fnMatrix(f) {
|
|
152
|
+
switch (f.fn) {
|
|
153
|
+
case "sepia": {
|
|
154
|
+
const k = 1 - Math.min(1, Math.max(0, f.v));
|
|
155
|
+
return [[0.393 + 0.607 * k, 0.769 - 0.769 * k, 0.189 - 0.189 * k, 0], [0.349 - 0.349 * k, 0.686 + 0.314 * k, 0.168 - 0.168 * k, 0], [0.272 - 0.272 * k, 0.534 - 0.534 * k, 0.131 + 0.869 * k, 0]];
|
|
156
|
+
}
|
|
157
|
+
case "grayscale": {
|
|
158
|
+
const k = 1 - Math.min(1, Math.max(0, f.v));
|
|
159
|
+
return [[0.2126 + 0.7874 * k, 0.7152 - 0.7152 * k, 0.0722 - 0.0722 * k, 0], [0.2126 - 0.2126 * k, 0.7152 + 0.2848 * k, 0.0722 - 0.0722 * k, 0], [0.2126 - 0.2126 * k, 0.7152 - 0.7152 * k, 0.0722 + 0.9278 * k, 0]];
|
|
160
|
+
}
|
|
161
|
+
case "saturate": {
|
|
162
|
+
const s = Math.max(0, f.v);
|
|
163
|
+
return [[0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0], [0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0], [0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0]];
|
|
164
|
+
}
|
|
165
|
+
case "hue": {
|
|
166
|
+
const a = f.v * Math.PI / 180;
|
|
167
|
+
const c = Math.cos(a);
|
|
168
|
+
const s = Math.sin(a);
|
|
169
|
+
return [[0.213 + c * 0.787 - s * 0.213, 0.715 - c * 0.715 - s * 0.715, 0.072 - c * 0.072 + s * 0.928, 0], [0.213 - c * 0.213 + s * 0.143, 0.715 + c * 0.285 + s * 0.14, 0.072 - c * 0.072 - s * 0.283, 0], [0.213 - c * 0.213 - s * 0.787, 0.715 - c * 0.715 + s * 0.715, 0.072 + c * 0.928 + s * 0.072, 0]];
|
|
170
|
+
}
|
|
171
|
+
case "brightness":
|
|
172
|
+
return [[f.v, 0, 0, 0], [0, f.v, 0, 0], [0, 0, f.v, 0]];
|
|
173
|
+
case "contrast": {
|
|
174
|
+
const o = 0.5 - 0.5 * f.v;
|
|
175
|
+
return [[f.v, 0, 0, o], [0, f.v, 0, o], [0, 0, f.v, o]];
|
|
176
|
+
}
|
|
177
|
+
default:
|
|
178
|
+
return IDENTITY;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
function compose(b, a) {
|
|
182
|
+
return [0, 1, 2].map((r) => [b[r][0] * a[0][0] + b[r][1] * a[1][0] + b[r][2] * a[2][0], b[r][0] * a[0][1] + b[r][1] * a[1][1] + b[r][2] * a[2][1], b[r][0] * a[0][2] + b[r][1] * a[1][2] + b[r][2] * a[2][2], b[r][0] * a[0][3] + b[r][1] * a[1][3] + b[r][2] * a[2][3] + b[r][3]]);
|
|
183
|
+
}
|
|
184
|
+
function adjustColorMatrix(a) {
|
|
185
|
+
const chain = filterChain(a);
|
|
186
|
+
if (!chain.length) return null;
|
|
187
|
+
const m = chain.reduce((acc, f) => compose(fnMatrix(f), acc), IDENTITY);
|
|
188
|
+
const round = (v) => Math.round(v * 1e4) / 1e4;
|
|
189
|
+
return [...m[0].slice(0, 3).map(round), 0, round(m[0][3]), ...m[1].slice(0, 3).map(round), 0, round(m[1][3]), ...m[2].slice(0, 3).map(round), 0, round(m[2][3]), 0, 0, 0, 1, 0];
|
|
190
|
+
}
|
|
191
|
+
function hasAdjust(a) {
|
|
192
|
+
return Boolean(adjustColorMatrix(a)) || Boolean(a == null ? void 0 : a.blurFrac);
|
|
193
|
+
}
|
|
194
|
+
function cleanAdjust(a) {
|
|
195
|
+
if (!a) return void 0;
|
|
196
|
+
const out = {};
|
|
197
|
+
if (a.filter && a.filter.intensity > 0) out.filter = a.filter;
|
|
198
|
+
if (a.brightness != null && a.brightness !== 1) out.brightness = a.brightness;
|
|
199
|
+
if (a.contrast != null && a.contrast !== 1) out.contrast = a.contrast;
|
|
200
|
+
if (a.saturation != null && a.saturation !== 1) out.saturation = a.saturation;
|
|
201
|
+
if (a.blurFrac) out.blurFrac = a.blurFrac;
|
|
202
|
+
return Object.keys(out).length ? out : void 0;
|
|
203
|
+
}export{DEFAULT_SHADOW,IMAGE_FILTERS,adjustColorMatrix,cleanAdjust,filterChain,hasAdjust};//# sourceMappingURL=imageAdjust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageAdjust.js","sources":["../../../../src/features/design/doc/imageAdjust.ts"],"sourcesContent":["/**\n * Image layer looks and adjustments - native twin of canvas-surface\n * `carousel-editor/utils/imageEffects.ts`.\n *\n * The web hands its adjustments to the 2D canvas as a CSS filter chain. Native\n * draws pictures through react-native-svg, whose `feColorMatrix` is the same\n * maths: each CSS function (sepia, grayscale, hue-rotate, brightness, contrast,\n * saturate) is a colour matrix in the Filter Effects spec, so the chain folds\n * into one matrix and a picture looks the same on both sides. Blur is the one\n * function that is not a matrix; it rides `feGaussianBlur` beside it.\n *\n * Pure: runs under jest as-is.\n */\nimport type { ImageAdjust, LayerShadow } from './types';\n\n/** A filter as CSS filter functions: multipliers are 1 when neutral, the rest 0. */\ninterface FilterLook {\n brightness?: number;\n contrast?: number;\n saturate?: number;\n sepia?: number;\n grayscale?: number;\n /** Degrees. */\n hue?: number;\n}\n\n/** Canva's photo filters, by eye (web IMAGE_FILTERS, verbatim). */\nexport const IMAGE_FILTERS: { id: string; label: string; look: FilterLook }[] = [\n { id: 'epic', label: 'Epic', look: { contrast: 1.25, saturate: 1.3, brightness: 0.95 } },\n { id: 'festive', label: 'Festive', look: { saturate: 1.5, hue: -10, brightness: 1.05 } },\n { id: 'summer', label: 'Summer', look: { sepia: 0.25, saturate: 1.35, brightness: 1.08 } },\n { id: 'dramatic', label: 'Dramatic', look: { contrast: 1.45, brightness: 0.88, saturate: 0.85 } },\n { id: 'retro', label: 'Retro', look: { sepia: 0.45, contrast: 1.1, saturate: 0.85, hue: -8 } },\n { id: 'vintage', label: 'Vintage', look: { sepia: 0.6, contrast: 0.9, brightness: 1.05 } },\n { id: 'warm', label: 'Warm', look: { sepia: 0.3, hue: -12, saturate: 1.15 } },\n { id: 'cool', label: 'Cool', look: { hue: 12, saturate: 1.1, brightness: 1.02 } },\n { id: 'fade', label: 'Fade', look: { contrast: 0.82, brightness: 1.08, saturate: 0.8 } },\n { id: 'noir', label: 'Noir', look: { grayscale: 1, contrast: 1.4, brightness: 0.92 } },\n { id: 'mono', label: 'Mono', look: { grayscale: 1 } },\n];\n\n/** Web DEFAULT_SHADOW. */\nexport const DEFAULT_SHADOW: LayerShadow = {\n color: '#000000',\n alpha: 0.35,\n blurFrac: 0.02,\n distFrac: 0.012,\n angle: 90,\n};\n\nexport type FilterFn =\n | { fn: 'sepia' | 'grayscale' | 'brightness' | 'contrast' | 'saturate'; v: number }\n | { fn: 'hue'; v: number };\n\n/** The CSS chain an adjustment stands for, in the web's order (look first, then the sliders). */\nexport function filterChain(a: ImageAdjust | undefined): FilterFn[] {\n if (!a) return [];\n const out: FilterFn[] = [];\n const look = a.filter && IMAGE_FILTERS.find((f) => f.id === a.filter!.id)?.look;\n if (look && a.filter) {\n const t = Math.min(1, Math.max(0, a.filter.intensity));\n const mul = (v: number | undefined) => (v == null ? null : 1 + (v - 1) * t);\n const add = (v: number | undefined) => (v == null ? null : v * t);\n const sep = add(look.sepia);\n const g = add(look.grayscale);\n const h = add(look.hue);\n const b = mul(look.brightness);\n const c = mul(look.contrast);\n const s = mul(look.saturate);\n if (sep) out.push({ fn: 'sepia', v: sep });\n if (g) out.push({ fn: 'grayscale', v: g });\n if (h) out.push({ fn: 'hue', v: h });\n if (b != null && b !== 1) out.push({ fn: 'brightness', v: b });\n if (c != null && c !== 1) out.push({ fn: 'contrast', v: c });\n if (s != null && s !== 1) out.push({ fn: 'saturate', v: s });\n }\n if (a.brightness != null && a.brightness !== 1) out.push({ fn: 'brightness', v: a.brightness });\n if (a.contrast != null && a.contrast !== 1) out.push({ fn: 'contrast', v: a.contrast });\n if (a.saturation != null && a.saturation !== 1) out.push({ fn: 'saturate', v: a.saturation });\n return out;\n}\n\n/** 3 rows of [r, g, b, offset]. */\ntype Affine = number[][];\n\nconst IDENTITY: Affine = [\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [0, 0, 1, 0],\n];\n\nfunction fnMatrix(f: FilterFn): Affine {\n switch (f.fn) {\n case 'sepia': {\n const k = 1 - Math.min(1, Math.max(0, f.v));\n return [\n [0.393 + 0.607 * k, 0.769 - 0.769 * k, 0.189 - 0.189 * k, 0],\n [0.349 - 0.349 * k, 0.686 + 0.314 * k, 0.168 - 0.168 * k, 0],\n [0.272 - 0.272 * k, 0.534 - 0.534 * k, 0.131 + 0.869 * k, 0],\n ];\n }\n case 'grayscale': {\n const k = 1 - Math.min(1, Math.max(0, f.v));\n return [\n [0.2126 + 0.7874 * k, 0.7152 - 0.7152 * k, 0.0722 - 0.0722 * k, 0],\n [0.2126 - 0.2126 * k, 0.7152 + 0.2848 * k, 0.0722 - 0.0722 * k, 0],\n [0.2126 - 0.2126 * k, 0.7152 - 0.7152 * k, 0.0722 + 0.9278 * k, 0],\n ];\n }\n case 'saturate': {\n const s = Math.max(0, f.v);\n return [\n [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0],\n [0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0],\n [0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0],\n ];\n }\n case 'hue': {\n const a = (f.v * Math.PI) / 180;\n const c = Math.cos(a);\n const s = Math.sin(a);\n return [\n [0.213 + c * 0.787 - s * 0.213, 0.715 - c * 0.715 - s * 0.715, 0.072 - c * 0.072 + s * 0.928, 0],\n [0.213 - c * 0.213 + s * 0.143, 0.715 + c * 0.285 + s * 0.14, 0.072 - c * 0.072 - s * 0.283, 0],\n [0.213 - c * 0.213 - s * 0.787, 0.715 - c * 0.715 + s * 0.715, 0.072 + c * 0.928 + s * 0.072, 0],\n ];\n }\n case 'brightness':\n return [\n [f.v, 0, 0, 0],\n [0, f.v, 0, 0],\n [0, 0, f.v, 0],\n ];\n case 'contrast': {\n const o = 0.5 - 0.5 * f.v;\n return [\n [f.v, 0, 0, o],\n [0, f.v, 0, o],\n [0, 0, f.v, o],\n ];\n }\n default:\n return IDENTITY;\n }\n}\n\n/** `b` after `a`: the affine that applies `a` first. */\nfunction compose(b: Affine, a: Affine): Affine {\n return [0, 1, 2].map((r) => [\n b[r][0] * a[0][0] + b[r][1] * a[1][0] + b[r][2] * a[2][0],\n b[r][0] * a[0][1] + b[r][1] * a[1][1] + b[r][2] * a[2][1],\n b[r][0] * a[0][2] + b[r][1] * a[1][2] + b[r][2] * a[2][2],\n b[r][0] * a[0][3] + b[r][1] * a[1][3] + b[r][2] * a[2][3] + b[r][3],\n ]);\n}\n\n/** The whole chain as one feColorMatrix (20 values, alpha untouched); null when neutral. */\nexport function adjustColorMatrix(a: ImageAdjust | undefined): number[] | null {\n const chain = filterChain(a);\n if (!chain.length) return null;\n const m = chain.reduce<Affine>((acc, f) => compose(fnMatrix(f), acc), IDENTITY);\n const round = (v: number) => Math.round(v * 10000) / 10000;\n return [\n ...m[0].slice(0, 3).map(round),\n 0,\n round(m[0][3]),\n ...m[1].slice(0, 3).map(round),\n 0,\n round(m[1][3]),\n ...m[2].slice(0, 3).map(round),\n 0,\n round(m[2][3]),\n 0,\n 0,\n 0,\n 1,\n 0,\n ];\n}\n\n/** True when a picture needs the filtered (svg) drawing path. */\nexport function hasAdjust(a: ImageAdjust | undefined): boolean {\n return Boolean(adjustColorMatrix(a)) || Boolean(a?.blurFrac);\n}\n\n/** An adjustment with neutral values dropped; undefined when nothing is left. */\nexport function cleanAdjust(a: ImageAdjust | undefined): ImageAdjust | undefined {\n if (!a) return undefined;\n const out: ImageAdjust = {};\n if (a.filter && a.filter.intensity > 0) out.filter = a.filter;\n if (a.brightness != null && a.brightness !== 1) out.brightness = a.brightness;\n if (a.contrast != null && a.contrast !== 1) out.contrast = a.contrast;\n if (a.saturation != null && a.saturation !== 1) out.saturation = a.saturation;\n if (a.blurFrac) out.blurFrac = a.blurFrac;\n return Object.keys(out).length ? out : undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import {blankDoc}from'./newDoc.js';import {newLayerId}from'./types.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
function legacyKind(doc) {
|
|
21
|
+
return doc.kind === "tshirt" || doc.kind === "postcard" ? "flyer" : "deck";
|
|
22
|
+
}
|
|
23
|
+
function legacyToDoc(legacy) {
|
|
24
|
+
const first = legacy.pages[0];
|
|
25
|
+
const width = (first == null ? void 0 : first.width) || 1080;
|
|
26
|
+
const height = (first == null ? void 0 : first.height) || 1080;
|
|
27
|
+
const kind = legacyKind(legacy);
|
|
28
|
+
const base = blankDoc({
|
|
29
|
+
width,
|
|
30
|
+
height,
|
|
31
|
+
platform: legacy.kind === "carousel" ? "Instagram" : kind === "flyer" ? "Print" : "Custom",
|
|
32
|
+
kind,
|
|
33
|
+
pageNames: legacy.pages.map((p, i) => p.name || `Page ${i + 1}`)
|
|
34
|
+
});
|
|
35
|
+
delete base.print;
|
|
36
|
+
return __spreadProps(__spreadValues(__spreadValues({}, base), legacy.title ? {
|
|
37
|
+
title: legacy.title
|
|
38
|
+
} : {}), {
|
|
39
|
+
pages: base.pages.map((page, i) => {
|
|
40
|
+
var _a;
|
|
41
|
+
const source = legacy.pages[i];
|
|
42
|
+
const pw = (source == null ? void 0 : source.width) || width;
|
|
43
|
+
const ph = (source == null ? void 0 : source.height) || height;
|
|
44
|
+
const layers = [...(_a = source == null ? void 0 : source.layers) != null ? _a : []].sort((a, b) => a.zIndex - b.zIndex).map((l) => {
|
|
45
|
+
var _a2;
|
|
46
|
+
const box = {
|
|
47
|
+
id: newLayerId(),
|
|
48
|
+
x: l.x / pw,
|
|
49
|
+
y: l.y / ph,
|
|
50
|
+
w: l.width / pw,
|
|
51
|
+
h: l.height / ph
|
|
52
|
+
};
|
|
53
|
+
const opacity = (_a2 = l.opacity) != null ? _a2 : 1;
|
|
54
|
+
if (l.type === "text") {
|
|
55
|
+
return __spreadValues(__spreadProps(__spreadValues({}, box), {
|
|
56
|
+
kind: "text",
|
|
57
|
+
content: l.text,
|
|
58
|
+
fontToken: "body",
|
|
59
|
+
fontWeight: l.bold ? 700 : 400,
|
|
60
|
+
fontSizeFrac: l.fontSize / pw,
|
|
61
|
+
color: l.color,
|
|
62
|
+
align: l.align,
|
|
63
|
+
lineHeight: 1.2
|
|
64
|
+
}), opacity !== 1 ? {
|
|
65
|
+
opacity
|
|
66
|
+
} : {});
|
|
67
|
+
}
|
|
68
|
+
if (l.type === "image") {
|
|
69
|
+
return __spreadValues(__spreadProps(__spreadValues({}, box), {
|
|
70
|
+
kind: "image",
|
|
71
|
+
prompt: "",
|
|
72
|
+
src: l.src,
|
|
73
|
+
imageStatus: "ready",
|
|
74
|
+
uploaded: true
|
|
75
|
+
}), opacity !== 1 ? {
|
|
76
|
+
opacity
|
|
77
|
+
} : {});
|
|
78
|
+
}
|
|
79
|
+
if (l.shape === "line") {
|
|
80
|
+
return __spreadProps(__spreadValues({}, box), {
|
|
81
|
+
kind: "shape",
|
|
82
|
+
shape: "line",
|
|
83
|
+
fill: l.fill,
|
|
84
|
+
radiusFrac: 0,
|
|
85
|
+
opacity,
|
|
86
|
+
strokeWidthFrac: l.height / pw
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const short = Math.min(l.width, l.height) || 1;
|
|
90
|
+
return __spreadProps(__spreadValues({}, box), {
|
|
91
|
+
kind: "shape",
|
|
92
|
+
shape: "rect",
|
|
93
|
+
fill: l.fill,
|
|
94
|
+
radiusFrac: Math.min(0.5, (l.cornerRadius || 0) / short),
|
|
95
|
+
opacity
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
return __spreadProps(__spreadValues({}, page), {
|
|
99
|
+
background: {
|
|
100
|
+
kind: "color",
|
|
101
|
+
color: (source == null ? void 0 : source.background) || "#ffffff"
|
|
102
|
+
},
|
|
103
|
+
layers
|
|
104
|
+
});
|
|
105
|
+
})
|
|
106
|
+
});
|
|
107
|
+
}export{legacyKind,legacyToDoc};//# sourceMappingURL=legacyDoc.js.map
|