@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":"sizes.js","sources":["../../../../src/features/design/doc/sizes.ts"],"sourcesContent":["/**\n * Design sizes offered by the create screen and the Details size picker -\n * native twin of canvas-surface `editors/carousel-editor/utils/sizes.ts`,\n * copied verbatim so a blank design opens at the web's own pixel size.\n *\n * Pure: runs under jest as-is.\n */\nimport type { DesignKind } from './types';\n\nexport type { DesignKind };\n\nexport type SizeCategory =\n | 'popular'\n | 'social'\n | 'carousel'\n | 'flyer'\n | 'business-card'\n | 'presentation'\n | 'pitch-deck'\n | 'logo'\n | 'banner'\n | 'brochure'\n | 'branding'\n | 'certificate'\n | 'worksheet'\n | 'proposal'\n | 'newsletter'\n | 'menu'\n | 'infographic'\n | 'technology'\n | 'custom';\ntype PrintCategory =\n | 'flyer'\n | 'business-card'\n | 'brochure'\n | 'branding'\n | 'certificate'\n | 'worksheet'\n | 'proposal'\n | 'newsletter'\n | 'menu';\n/** Views over other categories' templates, with no sizes of their own: a kind of deck, and a topic. */\ntype ViewCategory = 'pitch-deck' | 'technology';\nexport type SizeUnit = 'px' | 'in' | 'mm';\n\nexport interface DesignSize {\n id: string;\n label: string;\n category: Exclude<SizeCategory, 'popular' | 'custom' | ViewCategory>;\n width: number;\n height: number;\n /** Artifact kind the design saves as — print sizes are flyers. */\n kind: DesignKind;\n /** Stands in for the wizard's platform answer on a blank design. */\n platform: string;\n /** Extra search terms beyond the label. */\n keywords: string;\n /** Print sizes: the exact finished size, which the rounded px can't carry. */\n trimMm?: { w: number; h: number };\n /** Print sizes: how a person reads the size (\"3.5 × 2 in\"). */\n physical?: string;\n /** One blank page per name; absent = a single page. */\n pageNames?: string[];\n}\n\nconst PRINT_CATEGORIES: readonly SizeCategory[] = [\n 'flyer',\n 'business-card',\n 'brochure',\n 'branding',\n 'certificate',\n 'worksheet',\n 'proposal',\n 'newsletter',\n 'menu',\n];\n\n/** Print sizes save as flyers and carry a bleed. */\nexport function isPrintCategory(category: SizeCategory): category is PrintCategory {\n return PRINT_CATEGORIES.includes(category);\n}\n\n/**\n * The platform a blank print design names, which picks its catalog in the Templates tab\n * (catalogDoc.ts). Flyers and business cards both say Print and are told apart by shape;\n * a brochure, a letterhead, a certificate, a worksheet and a proposal are flyer-shaped, so they\n * name their own.\n */\nexport const PRINT_PLATFORM: Record<PrintCategory, string> = {\n flyer: 'Print',\n 'business-card': 'Print',\n brochure: 'Brochure',\n branding: 'Stationery',\n certificate: 'Certificate',\n worksheet: 'Worksheet',\n proposal: 'Proposal',\n newsletter: 'Newsletter',\n menu: 'Menu',\n};\n\n// ponytail: print at 150 DPI keeps A2 under the 4096 raster cap; add an export scale for 300 DPI\nexport const PRINT_DPI = 150;\n// ponytail: 5000 px per side, below Safari's canvas limits; raise when export tiles\nexport const MIN_PX = 40;\nexport const MAX_PX = 5000;\n\nexport function toPx(value: number, unit: SizeUnit): number {\n if (unit === 'in') return Math.round(value * PRINT_DPI);\n if (unit === 'mm') return Math.round((value / 25.4) * PRINT_DPI);\n return Math.round(value);\n}\n\n/** Inverse of `toPx`, rounded to what a person would type. */\nexport function fromPx(px: number, unit: SizeUnit): string {\n if (unit === 'in') return String(Math.round((px / PRINT_DPI) * 100) / 100);\n if (unit === 'mm') return String(Math.round((px / PRINT_DPI) * 254) / 10);\n return String(px);\n}\n\nexport function inRange(px: number): boolean {\n return Number.isFinite(px) && px >= MIN_PX && px <= MAX_PX;\n}\n\nfunction social(\n id: string,\n label: string,\n width: number,\n height: number,\n platform: string,\n keywords: string,\n): DesignSize {\n return { id, label, category: 'social', width, height, kind: 'deck', platform, keywords };\n}\n\n/** A carousel: swipeable slides at a feed size, one page to start - pages are added as slides. */\nfunction carousel(id: string, label: string, width: number, height: number, keywords: string): DesignSize {\n return { id, label, category: 'carousel', width, height, kind: 'deck', platform: 'Instagram', keywords };\n}\n\nfunction slides(id: string, label: string, width: number, height: number, keywords: string): DesignSize {\n return { id, label, category: 'presentation', width, height, kind: 'deck', platform: 'Presentation', keywords };\n}\n\nfunction logo(id: string, label: string, side: number, keywords: string): DesignSize {\n return { id, label, category: 'logo', width: side, height: side, kind: 'deck', platform: 'Logo', keywords };\n}\n\n/**\n * A banner. The printed ones (vinyl, 6 x 3 ft) are screen designs at the catalog's 2:1, since\n * 72 in at 150 DPI is past MAX_PX; the web and social ones name their own platform, so their\n * Templates tab does not offer 2:1 vinyl banners for a 4:1 header.\n */\nfunction banner(\n id: string,\n label: string,\n width: number,\n height: number,\n keywords: string,\n platform = 'Banner',\n): DesignSize {\n return { id, label, category: 'banner', width, height, kind: 'deck', platform, keywords };\n}\n\nconst MM_PER_UNIT: Record<SizeUnit, number> = { px: 25.4 / PRINT_DPI, in: 25.4, mm: 1 };\n\n/** Physical size in mm, to 0.01 mm. */\nexport function toMm(value: number, unit: SizeUnit): number {\n return Math.round(value * MM_PER_UNIT[unit] * 100) / 100;\n}\n\nfunction print(\n id: string,\n label: string,\n w: number,\n h: number,\n unit: SizeUnit,\n keywords: string,\n category: PrintCategory = 'flyer',\n): DesignSize {\n return {\n id,\n label,\n category,\n width: toPx(w, unit),\n height: toPx(h, unit),\n kind: 'flyer',\n platform: PRINT_PLATFORM[category],\n keywords,\n trimMm: { w: toMm(w, unit), h: toMm(h, unit) },\n physical: `${w} × ${h} ${unit}`,\n };\n}\n\n/** Business cards print both sides, so they open with a Front and a Back. */\nfunction card(id: string, label: string, w: number, h: number, unit: SizeUnit, keywords: string): DesignSize {\n return {\n ...print(id, label, w, h, unit, `card visiting double-sided ${w}x${h} ${keywords}`, 'business-card'),\n pageNames: ['Front', 'Back'],\n };\n}\n\n/** A brochure prints both sides of one sheet, folded: the Outside (cover, back, flap) and the Inside. */\nfunction brochure(id: string, label: string, w: number, h: number, unit: SizeUnit, keywords: string): DesignSize {\n return {\n ...print(id, label, w, h, unit, `leaflet pamphlet trifold tri-fold bifold folded ${keywords}`, 'brochure'),\n pageNames: ['Outside', 'Inside'],\n };\n}\n\nconst stationery = (id: string, label: string, w: number, h: number, unit: SizeUnit, keywords: string): DesignSize =>\n print(id, label, w, h, unit, `branding stationery brand ${keywords}`, 'branding');\n\nexport const DESIGN_SIZES: readonly DesignSize[] = [\n social('ig-post-portrait', 'Instagram Post (4:5)', 1080, 1350, 'Instagram', 'carousel portrait'),\n social('ig-post-square', 'Instagram Post (Square)', 1080, 1080, 'Instagram', 'square'),\n social('ig-story', 'Instagram Story', 1080, 1920, 'Instagram', 'reel whatsapp status tiktok vertical'),\n social('fb-post', 'Facebook Post', 1200, 630, 'Facebook', 'landscape'),\n social('li-post', 'LinkedIn Post', 1200, 627, 'LinkedIn', 'landscape'),\n social('x-post', 'X Post', 1600, 900, 'X', 'twitter landscape'),\n social('yt-thumb', 'YouTube Thumbnail', 1280, 720, 'YouTube', 'video cover'),\n social('pin', 'Pinterest Pin', 1000, 1500, 'Pinterest', 'tall'),\n carousel('carousel-portrait', 'Carousel (4:5)', 1080, 1350, 'instagram linkedin swipe swipeable portrait'),\n carousel('carousel-square', 'Carousel (Square)', 1080, 1080, 'instagram linkedin swipe swipeable'),\n carousel('carousel-3-4', 'Carousel (3:4)', 1080, 1440, 'instagram swipe swipeable portrait'),\n carousel('carousel-tall', 'Carousel (2:3)', 1080, 1620, 'instagram swipe swipeable tall portrait'),\n slides('slides-16-9', 'Presentation (16:9)', 1920, 1080, 'slides deck pitch widescreen'),\n slides('slides-4-3', 'Presentation (4:3)', 1024, 768, 'slides deck pitch'),\n slides('slides-mobile', 'Presentation (Mobile)', 1080, 1920, 'slides deck vertical'),\n print('a4', 'A4 Document', 210, 297, 'mm', 'paper document flyer'),\n print('letter', 'Flyer (US Letter)', 8.5, 11, 'in', 'paper document'),\n print('a3', 'A3 Poster', 297, 420, 'mm', 'paper'),\n print('a2', 'A2 Poster', 420, 594, 'mm', 'paper large'),\n print('poster-18-24', 'Poster', 18, 24, 'in', 'large'),\n print('invitation', 'Invitation', 5, 7, 'in', 'card wedding party'),\n print('postcard', 'Postcard', 6, 4, 'in', 'card landscape'),\n card('business-card', 'Business Card (US)', 3.5, 2, 'in', 'us standard'),\n card('business-card-eu', 'Business Card (EU)', 85, 55, 'mm', 'eu europe standard'),\n card('business-card-90x55', 'Business Card (AU / NZ)', 90, 55, 'mm', 'australia new zealand'),\n card('business-card-90x50', 'Business Card (Wide)', 90, 50, 'mm', 'wide slim'),\n // The catalog's logos are 500 px squares (Canva's Logo), some 2000 px.\n logo('logo', 'Logo', 500, 'brand mark icon emblem square'),\n logo('logo-large', 'Logo (Large)', 2000, 'brand mark icon emblem square high resolution'),\n banner('banner-landscape', 'Banner (Landscape)', 4800, 2400, 'vinyl printed 72x36 6x3 ft event party wedding'),\n banner('banner-portrait', 'Banner (Portrait)', 2400, 4800, 'vinyl printed 36x72 3x6 ft vertical'),\n banner('linkedin-banner', 'LinkedIn Banner', 1584, 396, 'background cover header profile', 'LinkedIn'),\n banner('youtube-banner', 'YouTube Banner', 2560, 1440, 'channel art cover', 'YouTube'),\n banner('x-header', 'X Header', 1500, 500, 'twitter banner cover', 'X'),\n banner('facebook-cover', 'Facebook Cover', 1640, 624, 'banner header', 'Facebook'),\n banner('web-banner', 'Web Banner', 728, 90, 'ad display leaderboard', 'Web'),\n // Canva's brochures: Letter and A4 landscape, a few tabloid, each an Outside and an Inside.\n brochure('brochure-letter', 'Brochure (US Letter)', 11, 8.5, 'in', 'us landscape'),\n brochure('brochure-a4', 'Brochure (A4)', 297, 210, 'mm', 'a4 landscape'),\n brochure('brochure-tabloid', 'Brochure (Tabloid)', 17, 11, 'in', 'tabloid ledger large'),\n stationery('letterhead-a4', 'Letterhead (A4)', 210, 297, 'mm', 'letter paper a4 company'),\n stationery('letterhead-letter', 'Letterhead (US Letter)', 8.5, 11, 'in', 'letter paper us company'),\n stationery('envelope-10', 'Envelope (#10)', 9.5, 4.125, 'in', 'business us mail'),\n stationery('envelope-dl', 'Envelope (DL)', 220, 110, 'mm', 'business eu mail'),\n // Canva's certificates are landscape Letter or A4; a diploma may stand.\n print('certificate-letter', 'Certificate (US Letter)', 11, 8.5, 'in', 'award diploma recognition', 'certificate'),\n print('certificate-a4', 'Certificate (A4)', 297, 210, 'mm', 'award diploma recognition', 'certificate'),\n print('certificate-portrait', 'Certificate (Portrait)', 210, 297, 'mm', 'award diploma a4 portrait', 'certificate'),\n print('worksheet-letter', 'Worksheet (US Letter)', 8.5, 11, 'in', 'classroom lesson activity school', 'worksheet'),\n print('worksheet-a4', 'Worksheet (A4)', 210, 297, 'mm', 'classroom lesson activity school', 'worksheet'),\n print('proposal-letter', 'Proposal (US Letter)', 8.5, 11, 'in', 'business project quote document', 'proposal'),\n print('proposal-a4', 'Proposal (A4)', 210, 297, 'mm', 'business project quote document', 'proposal'),\n print('newsletter-letter', 'Newsletter (US Letter)', 8.5, 11, 'in', 'bulletin school church company', 'newsletter'),\n print('newsletter-a4', 'Newsletter (A4)', 210, 297, 'mm', 'bulletin school church company', 'newsletter'),\n print('menu-letter', 'Menu (US Letter)', 8.5, 11, 'in', 'restaurant cafe bar food drinks', 'menu'),\n print('menu-a4', 'Menu (A4)', 210, 297, 'mm', 'restaurant cafe bar food drinks', 'menu'),\n print('menu-tabloid', 'Menu (Tabloid)', 11, 17, 'in', 'restaurant cafe bar large', 'menu'),\n // Canva's infographic is a tall screen page, 800 x 2000 px.\n {\n id: 'infographic',\n label: 'Infographic',\n category: 'infographic',\n width: 800,\n height: 2000,\n kind: 'deck',\n platform: 'Infographic',\n keywords: 'timeline process statistics chart data how-to',\n },\n];\n\nexport const POPULAR_SIZE_IDS = [\n 'ig-post-portrait',\n 'ig-story',\n 'slides-16-9',\n 'a4',\n 'ig-post-square',\n 'yt-thumb',\n 'a2',\n 'fb-post',\n];\n\nexport const SIZE_CATEGORIES: { id: SizeCategory; label: string }[] = [\n { id: 'popular', label: 'Popular' },\n { id: 'social', label: 'Social media' },\n { id: 'carousel', label: 'Carousels' },\n { id: 'flyer', label: 'Flyers' },\n { id: 'business-card', label: 'Business cards' },\n { id: 'presentation', label: 'Presentations' },\n { id: 'pitch-deck', label: 'Pitch decks' },\n { id: 'logo', label: 'Logos' },\n { id: 'banner', label: 'Banners' },\n { id: 'brochure', label: 'Brochures' },\n { id: 'branding', label: 'Branding' },\n { id: 'certificate', label: 'Certificates' },\n { id: 'worksheet', label: 'Worksheets' },\n { id: 'proposal', label: 'Proposals' },\n { id: 'newsletter', label: 'Newsletters' },\n { id: 'menu', label: 'Menus' },\n { id: 'infographic', label: 'Infographics' },\n { id: 'technology', label: 'Technology' },\n { id: 'custom', label: 'Custom size' },\n];\n\n/** A pitch deck is a presentation: its blanks are the presentation sizes. A topic has none. */\nconst SIZES_OF: Partial<Record<SizeCategory, SizeCategory>> = { 'pitch-deck': 'presentation' };\n\nexport function sizesIn(category: SizeCategory): DesignSize[] {\n if (category === 'popular') return POPULAR_SIZE_IDS.map((id) => DESIGN_SIZES.find((s) => s.id === id)!);\n const own = SIZES_OF[category] ?? category;\n return DESIGN_SIZES.filter((s) => s.category === own);\n}\n\n/** Case-insensitive substring match on label, category and keywords. */\nexport function searchSizes(query: string): DesignSize[] {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n return DESIGN_SIZES.filter((s) => `${s.label} ${s.category} ${s.platform} ${s.keywords}`.toLowerCase().includes(q));\n}\n\n// Aspects the carousel connector's layout and image generation accept.\nconst CONNECTOR_ASPECTS: [string, number][] = [\n ['1:1', 1],\n ['4:5', 4 / 5],\n ['2:3', 2 / 3],\n ['16:9', 16 / 9],\n];\n\n/** Nearest connector aspect, compared in log space so 2:1 and 1:2 are equally far from 1:1. */\nexport function snapAspect(width: number, height: number): string {\n const r = Math.log(width / height);\n let best = CONNECTOR_ASPECTS[0];\n for (const a of CONNECTOR_ASPECTS) if (Math.abs(r - Math.log(a[1])) < Math.abs(r - Math.log(best[1]))) best = a;\n return best[0];\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
const DEFAULT_TEXT_EFFECTS = {
|
|
2
|
+
lift: {
|
|
3
|
+
kind: "lift",
|
|
4
|
+
intensity: 0.5
|
|
5
|
+
},
|
|
6
|
+
hollow: {
|
|
7
|
+
kind: "hollow",
|
|
8
|
+
thicknessEm: 0.035
|
|
9
|
+
},
|
|
10
|
+
splice: {
|
|
11
|
+
kind: "splice",
|
|
12
|
+
thicknessEm: 0.035,
|
|
13
|
+
offsetEm: 0.08,
|
|
14
|
+
angle: 45
|
|
15
|
+
},
|
|
16
|
+
echo: {
|
|
17
|
+
kind: "echo",
|
|
18
|
+
offsetEm: 0.08,
|
|
19
|
+
angle: 45
|
|
20
|
+
},
|
|
21
|
+
glitch: {
|
|
22
|
+
kind: "glitch",
|
|
23
|
+
offsetEm: 0.04,
|
|
24
|
+
angle: 0,
|
|
25
|
+
palette: "cyan-magenta"
|
|
26
|
+
},
|
|
27
|
+
neon: {
|
|
28
|
+
kind: "neon",
|
|
29
|
+
intensity: 0.5
|
|
30
|
+
},
|
|
31
|
+
background: {
|
|
32
|
+
kind: "background",
|
|
33
|
+
color: "#ffde59",
|
|
34
|
+
roundness: 0.5,
|
|
35
|
+
spreadEm: 0.25,
|
|
36
|
+
opacity: 1
|
|
37
|
+
},
|
|
38
|
+
glow: {
|
|
39
|
+
kind: "glow",
|
|
40
|
+
sizeEm: 0.25,
|
|
41
|
+
opacity: 0.8
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const CURVE_MIN = -100;
|
|
45
|
+
const CURVE_MAX = 100;
|
|
46
|
+
const FULL_CURVE_TURN = 0.98 * 2 * Math.PI;
|
|
47
|
+
const GLITCH_COLORS = {
|
|
48
|
+
"cyan-magenta": ["#00ffff", "#ff00ff"],
|
|
49
|
+
"blue-red": ["#1e40ff", "#ff1e1e"]
|
|
50
|
+
};
|
|
51
|
+
function offsetAlong(angle, dist) {
|
|
52
|
+
const t = angle * Math.PI / 180;
|
|
53
|
+
return {
|
|
54
|
+
dx: Math.cos(t) * dist,
|
|
55
|
+
dy: Math.sin(t) * dist
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function channels(color) {
|
|
59
|
+
const m = /^#([0-9a-f]{6}|[0-9a-f]{3})/i.exec(color.trim());
|
|
60
|
+
if (!m) return [0, 0, 0];
|
|
61
|
+
const h = m[1].length === 3 ? m[1].split("").map((c) => c + c).join("") : m[1];
|
|
62
|
+
const n = parseInt(h, 16);
|
|
63
|
+
return [n >> 16 & 255, n >> 8 & 255, n & 255];
|
|
64
|
+
}
|
|
65
|
+
function rgbaOf(color, alpha) {
|
|
66
|
+
const [r, g, b] = channels(color);
|
|
67
|
+
return `rgba(${r}, ${g}, ${b}, ${Math.min(1, Math.max(0, alpha))})`;
|
|
68
|
+
}
|
|
69
|
+
function tintOf(color, t) {
|
|
70
|
+
const [r, g, b] = channels(color).map((c) => Math.round(c + (255 - c) * Math.min(1, Math.max(0, t))));
|
|
71
|
+
return `#${(1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1)}`;
|
|
72
|
+
}
|
|
73
|
+
function luminance(color) {
|
|
74
|
+
const [r, g, b] = channels(color).map((c) => {
|
|
75
|
+
const v = c / 255;
|
|
76
|
+
return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;
|
|
77
|
+
});
|
|
78
|
+
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
79
|
+
}
|
|
80
|
+
function spliceFillOf(color) {
|
|
81
|
+
if (luminance(color) < 0.6) return tintOf(color, 0.55);
|
|
82
|
+
const [r, g, b] = channels(color).map((c) => Math.round(c * 0.55));
|
|
83
|
+
return `#${(1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1)}`;
|
|
84
|
+
}
|
|
85
|
+
function curveAngle(curve) {
|
|
86
|
+
if (!curve) return 0;
|
|
87
|
+
const c = Math.min(CURVE_MAX, Math.max(CURVE_MIN, curve));
|
|
88
|
+
return Math.abs(c) / CURVE_MAX * FULL_CURVE_TURN;
|
|
89
|
+
}
|
|
90
|
+
function liftShadow(intensity, fontSizePx) {
|
|
91
|
+
const i = Math.min(1, Math.max(0, intensity));
|
|
92
|
+
return {
|
|
93
|
+
color: `rgba(0, 0, 0, ${(0.15 + 0.45 * i).toFixed(3)})`,
|
|
94
|
+
blur: fontSizePx * (0.08 + 0.22 * i),
|
|
95
|
+
dy: fontSizePx * (0.03 + 0.07 * i)
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function neonBlur(intensity, fontSizePx) {
|
|
99
|
+
return fontSizePx * (0.08 + 0.32 * Math.min(1, Math.max(0, intensity)));
|
|
100
|
+
}
|
|
101
|
+
const TEXT_EFFECT_TILES = [{
|
|
102
|
+
id: "none",
|
|
103
|
+
label: "None"
|
|
104
|
+
}, {
|
|
105
|
+
id: "drop",
|
|
106
|
+
label: "Drop"
|
|
107
|
+
}, {
|
|
108
|
+
id: "lift",
|
|
109
|
+
label: "Lift"
|
|
110
|
+
}, {
|
|
111
|
+
id: "hollow",
|
|
112
|
+
label: "Hollow"
|
|
113
|
+
}, {
|
|
114
|
+
id: "splice",
|
|
115
|
+
label: "Splice"
|
|
116
|
+
}, {
|
|
117
|
+
id: "outline",
|
|
118
|
+
label: "Outline"
|
|
119
|
+
}, {
|
|
120
|
+
id: "echo",
|
|
121
|
+
label: "Echo"
|
|
122
|
+
}, {
|
|
123
|
+
id: "glitch",
|
|
124
|
+
label: "Glitch"
|
|
125
|
+
}, {
|
|
126
|
+
id: "neon",
|
|
127
|
+
label: "Neon"
|
|
128
|
+
}, {
|
|
129
|
+
id: "background",
|
|
130
|
+
label: "Background"
|
|
131
|
+
}, {
|
|
132
|
+
id: "glow",
|
|
133
|
+
label: "Glow"
|
|
134
|
+
}];export{CURVE_MAX,CURVE_MIN,DEFAULT_TEXT_EFFECTS,GLITCH_COLORS,TEXT_EFFECT_TILES,curveAngle,liftShadow,neonBlur,offsetAlong,rgbaOf,spliceFillOf,tintOf};//# sourceMappingURL=textEffects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textEffects.js","sources":["../../../../src/features/design/doc/textEffects.ts"],"sourcesContent":["/**\n * Canva's text effects - native twin of canvas-surface `editors/shared/textEffects.ts`,\n * copied verbatim (it is pure data and math). Native draws what RN can\n * (background, outline, shadows, lift, glow, neon) and approximates the rest\n * (render/TextLayerView.tsx).\n *\n * Canva offers one style effect at a time (Drop, Lift, Hollow, Splice, Outline,\n * Echo, Glitch, Neon, Background, Glow) plus one shape effect (Curve). Drop and\n * Outline were here first as a layer's `shadow` and `outline`, so they keep\n * those fields; the rest are a `TextEffect`, and the panel clears the others\n * whenever one is picked, which is what keeps them exclusive.\n *\n * Every length is a fraction of the font size (`…Em`), so an effect scales\n * with its text through a resize, a zoom bucket and an export alike.\n */\n\nexport type GlitchPalette = 'cyan-magenta' | 'blue-red';\n\nexport type TextEffect =\n /** A soft shadow straight under the text; `intensity` 0–1. */\n | { kind: 'lift'; intensity: number }\n /** The glyphs' outline only, in the text colour. */\n | { kind: 'hollow'; thicknessEm: number }\n /** A hollow outline over a filled copy set off along `angle`; absent colour = a tint of the text. */\n | { kind: 'splice'; thicknessEm: number; offsetEm: number; angle: number; color?: string }\n /** Two fading copies trailing along `angle`; absent colour = the text colour. */\n | { kind: 'echo'; offsetEm: number; angle: number; color?: string }\n /** Two colour-split copies either side of the text along `angle`. */\n | { kind: 'glitch'; offsetEm: number; angle: number; palette: GlitchPalette }\n /** A pale core with the text colour glowing around it; `intensity` 0–1. */\n | { kind: 'neon'; intensity: number }\n /** A box behind each line. `roundness` 0–1 of the box height, `opacity` 0–1. */\n | { kind: 'background'; color: string; roundness: number; spreadEm: number; opacity: number }\n /** A blurred halo; absent colour = the text colour. */\n | { kind: 'glow'; sizeEm: number; opacity: number; color?: string };\n\nexport type TextEffectKind = TextEffect['kind'];\n\n/** What each effect starts at when picked — Canva's own defaults, by eye. */\nexport const DEFAULT_TEXT_EFFECTS: { [K in TextEffectKind]: Extract<TextEffect, { kind: K }> } = {\n lift: { kind: 'lift', intensity: 0.5 },\n hollow: { kind: 'hollow', thicknessEm: 0.035 },\n splice: { kind: 'splice', thicknessEm: 0.035, offsetEm: 0.08, angle: 45 },\n echo: { kind: 'echo', offsetEm: 0.08, angle: 45 },\n glitch: { kind: 'glitch', offsetEm: 0.04, angle: 0, palette: 'cyan-magenta' },\n neon: { kind: 'neon', intensity: 0.5 },\n background: { kind: 'background', color: '#ffde59', roundness: 0.5, spreadEm: 0.25, opacity: 1 },\n glow: { kind: 'glow', sizeEm: 0.25, opacity: 0.8 },\n};\n\n/** Curve amount: -100 (a smile) … 100 (a rainbow); 0 is straight text. */\nexport const CURVE_MIN = -100;\nexport const CURVE_MAX = 100;\n/** At ±100 the text wraps this much of a full circle — less than all of it, so its ends never touch. */\nconst FULL_CURVE_TURN = 0.98 * 2 * Math.PI;\n\nexport const GLITCH_COLORS: Record<GlitchPalette, [string, string]> = {\n 'cyan-magenta': ['#00ffff', '#ff00ff'],\n 'blue-red': ['#1e40ff', '#ff1e1e'],\n};\n\n/** `angle` in degrees clockwise from pointing right, to an offset of `dist`. */\nexport function offsetAlong(angle: number, dist: number): { dx: number; dy: number } {\n const t = (angle * Math.PI) / 180;\n return { dx: Math.cos(t) * dist, dy: Math.sin(t) * dist };\n}\n\n/** `#rgb` / `#rrggbb` to its channels; anything else (a CSS name, rgba()) reads as black. */\nfunction channels(color: string): [number, number, number] {\n // Six digits first: tried the other way, `#ff0000` reads as `#ff0`.\n const m = /^#([0-9a-f]{6}|[0-9a-f]{3})/i.exec(color.trim());\n if (!m) return [0, 0, 0];\n const h =\n m[1].length === 3\n ? m[1]\n .split('')\n .map((c) => c + c)\n .join('')\n : m[1];\n const n = parseInt(h, 16);\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n}\n\n/** A colour at an alpha, as rgba(). */\nexport function rgbaOf(color: string, alpha: number): string {\n const [r, g, b] = channels(color);\n return `rgba(${r}, ${g}, ${b}, ${Math.min(1, Math.max(0, alpha))})`;\n}\n\n/** A colour mixed `t` (0–1) of the way to white — neon's pale core, splice's default fill. */\nexport function tintOf(color: string, t: number): string {\n const [r, g, b] = channels(color).map((c) => Math.round(c + (255 - c) * Math.min(1, Math.max(0, t))));\n return `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)}`;\n}\n\n/** Relative luminance, 0 (black) – 1 (white). */\nfunction luminance(color: string): number {\n const [r, g, b] = channels(color).map((c) => {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4;\n });\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/** Splice's offset fill when none is picked: the text colour, paler — or darker, when the text is already pale. */\nexport function spliceFillOf(color: string): string {\n if (luminance(color) < 0.6) return tintOf(color, 0.55);\n const [r, g, b] = channels(color).map((c) => Math.round(c * 0.55));\n return `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)}`;\n}\n\n/** Turns the curve amount into the arc the text's own width runs along; 0 = straight. */\nexport function curveAngle(curve: number | undefined): number {\n if (!curve) return 0;\n const c = Math.min(CURVE_MAX, Math.max(CURVE_MIN, curve));\n return (Math.abs(c) / CURVE_MAX) * FULL_CURVE_TURN;\n}\n\n/**\n * How far an effect's ink can spill past the glyphs, in px at `fontSizePx`:\n * offsets to their full reach, blurs to ~1.5× their radius, and the background\n * box's spread. Equal on every side, so the box stays centred in its raster.\n */\nexport function effectSpillPx(effect: TextEffect | undefined, fontSizePx: number): number {\n if (!effect) return 0;\n const em = fontSizePx;\n switch (effect.kind) {\n case 'lift':\n return Math.ceil(liftShadow(effect.intensity, em).dy + liftShadow(effect.intensity, em).blur * 1.5);\n case 'hollow':\n return Math.ceil(effect.thicknessEm * em);\n case 'splice':\n return Math.ceil((effect.offsetEm + effect.thicknessEm) * em);\n case 'echo':\n return Math.ceil(effect.offsetEm * 2 * em);\n case 'glitch':\n return Math.ceil(effect.offsetEm * em);\n case 'neon':\n return Math.ceil(neonBlur(effect.intensity, em) * 1.5);\n case 'background':\n return Math.ceil(effect.spreadEm * em);\n case 'glow':\n return Math.ceil(effect.sizeEm * em * 1.5);\n }\n}\n\n/** Lift is a shadow dropped straight down, deeper and softer as it intensifies. */\nexport function liftShadow(intensity: number, fontSizePx: number): { color: string; blur: number; dy: number } {\n const i = Math.min(1, Math.max(0, intensity));\n return {\n color: `rgba(0, 0, 0, ${(0.15 + 0.45 * i).toFixed(3)})`,\n blur: fontSizePx * (0.08 + 0.22 * i),\n dy: fontSizePx * (0.03 + 0.07 * i),\n };\n}\n\n/** Neon's glow radius at an intensity. */\nexport function neonBlur(intensity: number, fontSizePx: number): number {\n return fontSizePx * (0.08 + 0.32 * Math.min(1, Math.max(0, intensity)));\n}\n\n/** The labels the effects gallery shows, in Canva's order. */\nexport const TEXT_EFFECT_TILES: { id: 'none' | 'drop' | 'outline' | TextEffectKind; label: string }[] = [\n { id: 'none', label: 'None' },\n { id: 'drop', label: 'Drop' },\n { id: 'lift', label: 'Lift' },\n { id: 'hollow', label: 'Hollow' },\n { id: 'splice', label: 'Splice' },\n { id: 'outline', label: 'Outline' },\n { id: 'echo', label: 'Echo' },\n { id: 'glitch', label: 'Glitch' },\n { id: 'neon', label: 'Neon' },\n { id: 'background', label: 'Background' },\n { id: 'glow', label: 'Glow' },\n];\n"],"names":[],"mappings":"AAiEO,MAAM,oBAEN,GAAA;AAAA,EACL,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA,MAAA;AAAA,IACN,SAAW,EAAA;AAAA,GACb;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,QAAA;AAAA,IACN,WAAa,EAAA;AAAA,GACf;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,QAAA;AAAA,IACN,WAAa,EAAA,KAAA;AAAA,IACb,QAAU,EAAA,IAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA,MAAA;AAAA,IACN,QAAU,EAAA,IAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,QAAA;AAAA,IACN,QAAU,EAAA,IAAA;AAAA,IACV,KAAO,EAAA,CAAA;AAAA,IACP,OAAS,EAAA;AAAA,GACX;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA,MAAA;AAAA,IACN,SAAW,EAAA;AAAA,GACb;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAM,EAAA,YAAA;AAAA,IACN,KAAO,EAAA,SAAA;AAAA,IACP,SAAW,EAAA,GAAA;AAAA,IACX,QAAU,EAAA,IAAA;AAAA,IACV,OAAS,EAAA;AAAA,GACX;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,IAAM,EAAA,MAAA;AAAA,IACN,MAAQ,EAAA,IAAA;AAAA,IACR,OAAS,EAAA;AAAA;AAEb;AAGO,MAAM,SAAY,GAAA;AAClB,MAAM,SAAY,GAAA;AAEzB,MAAM,eAAA,GAAkB,IAAO,GAAA,CAAA,GAAI,IAAK,CAAA,EAAA;AACjC,MAAM,aAAyD,GAAA;AAAA,EACpE,cAAA,EAAgB,CAAC,SAAA,EAAW,SAAS,CAAA;AAAA,EACrC,UAAA,EAAY,CAAC,SAAA,EAAW,SAAS;AACnC;AAGgB,SAAA,WAAA,CAAY,OAAe,IAGzC,EAAA;AACA,EAAM,MAAA,CAAA,GAAI,KAAQ,GAAA,IAAA,CAAK,EAAK,GAAA,GAAA;AAC5B,EAAO,OAAA;AAAA,IACL,EAAI,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAI,GAAA,IAAA;AAAA,IAClB,EAAI,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAI,GAAA;AAAA,GACpB;AACF;AAGA,SAAS,SAAS,KAAyC,EAAA;AAEzD,EAAA,MAAM,CAAI,GAAA,8BAAA,CAA+B,IAAK,CAAA,KAAA,CAAM,MAAM,CAAA;AAC1D,EAAA,IAAI,CAAC,CAAG,EAAA,OAAO,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACvB,EAAM,MAAA,CAAA,GAAI,EAAE,CAAC,CAAA,CAAE,WAAW,CAAI,GAAA,CAAA,CAAE,CAAC,CAAE,CAAA,KAAA,CAAM,EAAE,CAAE,CAAA,GAAA,CAAI,OAAK,CAAI,GAAA,CAAC,EAAE,IAAK,CAAA,EAAE,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA;AAC3E,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,CAAA,EAAG,EAAE,CAAA;AACxB,EAAO,OAAA,CAAC,KAAK,EAAK,GAAA,GAAA,EAAK,KAAK,CAAI,GAAA,GAAA,EAAK,IAAI,GAAG,CAAA;AAC9C;AAGgB,SAAA,MAAA,CAAO,OAAe,KAAuB,EAAA;AAC3D,EAAA,MAAM,CAAC,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,KAAK,CAAA;AAChC,EAAA,OAAO,CAAQ,KAAA,EAAA,CAAC,CAAK,EAAA,EAAA,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,IAAK,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,KAAK,CAAC,CAAC,CAAA,CAAA,CAAA;AAClE;AAGgB,SAAA,MAAA,CAAO,OAAe,CAAmB,EAAA;AACvD,EAAM,MAAA,CAAC,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA,GAAI,SAAS,KAAK,CAAA,CAAE,GAAI,CAAA,CAAA,CAAA,KAAK,IAAK,CAAA,KAAA,CAAM,KAAK,GAAM,GAAA,CAAA,IAAK,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,IAAI,CAAG,EAAA,CAAC,CAAC,CAAC,CAAC,CAAA;AAClG,EAAA,OAAO,CAAK,CAAA,EAAA,CAAA,CAAA,IAAK,EAAK,GAAA,CAAA,IAAK,EAAK,GAAA,CAAA,IAAK,CAAI,GAAA,CAAA,EAAG,QAAS,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE;AAGA,SAAS,UAAU,KAAuB,EAAA;AACxC,EAAM,MAAA,CAAC,GAAG,CAAG,EAAA,CAAC,IAAI,QAAS,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA;AACzC,IAAA,MAAM,IAAI,CAAI,GAAA,GAAA;AACd,IAAA,OAAO,KAAK,OAAU,GAAA,CAAA,GAAI,KAAU,GAAA,CAAA,CAAA,CAAA,GAAI,SAAS,KAAU,KAAA,GAAA;AAAA,GAC5D,CAAA;AACD,EAAA,OAAO,MAAS,GAAA,CAAA,GAAI,MAAS,GAAA,CAAA,GAAI,MAAS,GAAA,CAAA;AAC5C;AAGO,SAAS,aAAa,KAAuB,EAAA;AAClD,EAAA,IAAI,UAAU,KAAK,CAAA,GAAI,KAAY,OAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,CAAA,EAAG,CAAG,EAAA,CAAC,IAAI,QAAS,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,IAAA,CAAK,KAAM,CAAA,CAAA,GAAI,IAAI,CAAC,CAAA;AAC/D,EAAA,OAAO,CAAK,CAAA,EAAA,CAAA,CAAA,IAAK,EAAK,GAAA,CAAA,IAAK,EAAK,GAAA,CAAA,IAAK,CAAI,GAAA,CAAA,EAAG,QAAS,CAAA,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE;AAGO,SAAS,WAAW,KAAmC,EAAA;AAC5D,EAAI,IAAA,CAAC,OAAc,OAAA,CAAA;AACnB,EAAM,MAAA,CAAA,GAAI,KAAK,GAAI,CAAA,SAAA,EAAW,KAAK,GAAI,CAAA,SAAA,EAAW,KAAK,CAAC,CAAA;AACxD,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA,GAAI,SAAY,GAAA,eAAA;AACnC;AA+BgB,SAAA,UAAA,CAAW,WAAmB,UAI5C,EAAA;AACA,EAAM,MAAA,CAAA,GAAI,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,CAAA,EAAG,SAAS,CAAC,CAAA;AAC5C,EAAO,OAAA;AAAA,IACL,OAAO,CAAkB,cAAA,EAAA,CAAA,IAAA,GAAO,OAAO,CAAG,EAAA,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IACpD,IAAA,EAAM,UAAc,IAAA,IAAA,GAAO,IAAO,GAAA,CAAA,CAAA;AAAA,IAClC,EAAA,EAAI,UAAc,IAAA,IAAA,GAAO,IAAO,GAAA,CAAA;AAAA,GAClC;AACF;AAGgB,SAAA,QAAA,CAAS,WAAmB,UAA4B,EAAA;AACtE,EAAO,OAAA,UAAA,IAAc,IAAO,GAAA,IAAA,GAAO,IAAK,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,SAAS,CAAC,CAAA,CAAA;AACvE;AAGO,MAAM,oBAGP,CAAC;AAAA,EACL,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,YAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA;AACT,CAAC"}
|
|
@@ -0,0 +1,182 @@
|
|
|
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
|
+
var __objRest = (source, exclude) => {
|
|
21
|
+
var target = {};
|
|
22
|
+
for (var prop in source)
|
|
23
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
24
|
+
target[prop] = source[prop];
|
|
25
|
+
if (source != null && __getOwnPropSymbols)
|
|
26
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
27
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
}
|
|
30
|
+
return target;
|
|
31
|
+
};
|
|
32
|
+
function normalizeRuns(runs, length) {
|
|
33
|
+
if (!(runs == null ? void 0 : runs.length)) return [];
|
|
34
|
+
const sorted = runs.map((r) => __spreadProps(__spreadValues({}, r), {
|
|
35
|
+
start: Math.max(0, Math.min(length, r.start)),
|
|
36
|
+
end: Math.max(0, Math.min(length, r.end))
|
|
37
|
+
})).filter((r) => r.end > r.start).sort((a, b) => a.start - b.start);
|
|
38
|
+
const out = [];
|
|
39
|
+
for (const r of sorted) {
|
|
40
|
+
const prev = out[out.length - 1];
|
|
41
|
+
if (prev && r.start < prev.end) continue;
|
|
42
|
+
out.push(r);
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
function styleOf(run) {
|
|
47
|
+
const _a = run, {
|
|
48
|
+
start: _start,
|
|
49
|
+
end: _end
|
|
50
|
+
} = _a, style = __objRest(_a, [
|
|
51
|
+
"start",
|
|
52
|
+
"end"
|
|
53
|
+
]);
|
|
54
|
+
return style;
|
|
55
|
+
}
|
|
56
|
+
function runSpans(content, runs) {
|
|
57
|
+
const clean = normalizeRuns(runs, content.length);
|
|
58
|
+
const spans = [];
|
|
59
|
+
let at = 0;
|
|
60
|
+
for (const run of clean) {
|
|
61
|
+
if (run.start > at) spans.push({
|
|
62
|
+
text: content.slice(at, run.start),
|
|
63
|
+
style: null
|
|
64
|
+
});
|
|
65
|
+
spans.push({
|
|
66
|
+
text: content.slice(run.start, run.end),
|
|
67
|
+
style: styleOf(run)
|
|
68
|
+
});
|
|
69
|
+
at = run.end;
|
|
70
|
+
}
|
|
71
|
+
if (at < content.length || spans.length === 0) spans.push({
|
|
72
|
+
text: content.slice(at),
|
|
73
|
+
style: null
|
|
74
|
+
});
|
|
75
|
+
return spans;
|
|
76
|
+
}
|
|
77
|
+
function layerSpans(layer) {
|
|
78
|
+
var _a;
|
|
79
|
+
const content = (_a = layer.content) != null ? _a : "";
|
|
80
|
+
let spans = runSpans(content, layer.runs);
|
|
81
|
+
if (layer.listStyle && layer.listStyle !== "none") spans = withListMarkers(spans, layer.listStyle);
|
|
82
|
+
if (layer.uppercase) spans = spans.map((s) => __spreadProps(__spreadValues({}, s), {
|
|
83
|
+
text: s.text.toUpperCase()
|
|
84
|
+
}));
|
|
85
|
+
return mergeAdjacent(spans);
|
|
86
|
+
}
|
|
87
|
+
function withListMarkers(spans, listStyle) {
|
|
88
|
+
const out = [];
|
|
89
|
+
let n = 0;
|
|
90
|
+
let atLineStart = true;
|
|
91
|
+
for (const span of spans) {
|
|
92
|
+
let rest = span.text;
|
|
93
|
+
while (rest.length) {
|
|
94
|
+
if (atLineStart) {
|
|
95
|
+
const lineEnd = rest.indexOf("\n");
|
|
96
|
+
const head = lineEnd === -1 ? rest : rest.slice(0, lineEnd);
|
|
97
|
+
if (head.trim()) {
|
|
98
|
+
n += 1;
|
|
99
|
+
out.push({
|
|
100
|
+
text: listStyle === "bullet" ? "\u2022 " : `${n}. `,
|
|
101
|
+
style: span.style
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
atLineStart = false;
|
|
105
|
+
}
|
|
106
|
+
const nl = rest.indexOf("\n");
|
|
107
|
+
if (nl === -1) {
|
|
108
|
+
out.push({
|
|
109
|
+
text: rest,
|
|
110
|
+
style: span.style
|
|
111
|
+
});
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
out.push({
|
|
115
|
+
text: rest.slice(0, nl + 1),
|
|
116
|
+
style: span.style
|
|
117
|
+
});
|
|
118
|
+
rest = rest.slice(nl + 1);
|
|
119
|
+
atLineStart = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
function sameStyle(a, b) {
|
|
125
|
+
return a === b || JSON.stringify(a) === JSON.stringify(b);
|
|
126
|
+
}
|
|
127
|
+
function mergeAdjacent(spans) {
|
|
128
|
+
const out = [];
|
|
129
|
+
for (const s of spans) {
|
|
130
|
+
if (!s.text) continue;
|
|
131
|
+
const prev = out[out.length - 1];
|
|
132
|
+
if (prev && sameStyle(prev.style, s.style)) prev.text += s.text;
|
|
133
|
+
else out.push(__spreadValues({}, s));
|
|
134
|
+
}
|
|
135
|
+
return out.length ? out : [{
|
|
136
|
+
text: "",
|
|
137
|
+
style: null
|
|
138
|
+
}];
|
|
139
|
+
}
|
|
140
|
+
function rebaseRuns(before, after, runs) {
|
|
141
|
+
if (!(runs == null ? void 0 : runs.length)) return runs ? [] : void 0;
|
|
142
|
+
let prefix = 0;
|
|
143
|
+
while (prefix < before.length && prefix < after.length && before[prefix] === after[prefix]) prefix += 1;
|
|
144
|
+
let suffix = 0;
|
|
145
|
+
while (suffix < before.length - prefix && suffix < after.length - prefix && before[before.length - 1 - suffix] === after[after.length - 1 - suffix]) suffix += 1;
|
|
146
|
+
const removedEnd = before.length - suffix;
|
|
147
|
+
const delta = after.length - before.length;
|
|
148
|
+
const map = (i, isEnd) => {
|
|
149
|
+
if (isEnd ? i < prefix : i <= prefix) return i;
|
|
150
|
+
if (i >= removedEnd) return i + delta;
|
|
151
|
+
return isEnd ? after.length - suffix : prefix;
|
|
152
|
+
};
|
|
153
|
+
return normalizeRuns(runs.map((r) => __spreadProps(__spreadValues({}, r), {
|
|
154
|
+
start: map(r.start, false),
|
|
155
|
+
end: map(r.end, true)
|
|
156
|
+
})), after.length);
|
|
157
|
+
}
|
|
158
|
+
function facesUsed(page, fontPair) {
|
|
159
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
160
|
+
const seen = /* @__PURE__ */ new Map();
|
|
161
|
+
const add = (family, weight, italic) => {
|
|
162
|
+
const key = `${family}|${weight}|${italic ? 1 : 0}`;
|
|
163
|
+
if (family && !seen.has(key)) seen.set(key, {
|
|
164
|
+
family,
|
|
165
|
+
weight,
|
|
166
|
+
italic
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
for (const layer of (_a = page.layers) != null ? _a : []) {
|
|
170
|
+
if (layer.kind !== "text") continue;
|
|
171
|
+
const family = layer.fontFamily || (fontPair != null ? fontPair : {
|
|
172
|
+
display: "Inter",
|
|
173
|
+
body: "Inter"
|
|
174
|
+
})[layer.fontToken] || "Inter";
|
|
175
|
+
add(family, (_b = layer.fontWeight) != null ? _b : 400, Boolean(layer.italic));
|
|
176
|
+
for (const run of (_c = layer.runs) != null ? _c : []) {
|
|
177
|
+
if (run.fontFamily == null && run.fontWeight == null && run.italic == null) continue;
|
|
178
|
+
add((_d = run.fontFamily) != null ? _d : family, (_f = (_e = run.fontWeight) != null ? _e : layer.fontWeight) != null ? _f : 400, (_g = run.italic) != null ? _g : Boolean(layer.italic));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return [...seen.values()];
|
|
182
|
+
}export{facesUsed,layerSpans,normalizeRuns,rebaseRuns,runSpans};//# sourceMappingURL=textLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textLayout.js","sources":["../../../../src/features/design/doc/textLayout.ts"],"sourcesContent":["/**\n * A text layer's words as styled spans - what native's nested `<Text>` draws.\n *\n * The web lays text out as segments of one style each (shared/textRaster.ts);\n * a span here is the same segment: a stretch of `content` in one run's style,\n * or in the layer's own where no run covers it. List markers are prefixed per\n * paragraph the way web `applyListStyle` does, taking the style of the words\n * they lead, and `uppercase` capitalises what is drawn, never `content`.\n *\n * Pure: runs under jest as-is.\n */\nimport type { DesignFontPair, EditorLayer, TextLayer, TextRun } from './types';\n\nexport type RunStyle = Omit<TextRun, 'start' | 'end'>;\n\nexport interface TextSpan {\n text: string;\n /** The run's style; null draws in the layer's own. */\n style: RunStyle | null;\n}\n\n/** Runs clamped to the text, sorted, overlaps dropped (web keeps them that way; a foreign writer might not). */\nexport function normalizeRuns(runs: readonly TextRun[] | undefined, length: number): TextRun[] {\n if (!runs?.length) return [];\n const sorted = runs\n .map((r) => ({\n ...r,\n start: Math.max(0, Math.min(length, r.start)),\n end: Math.max(0, Math.min(length, r.end)),\n }))\n .filter((r) => r.end > r.start)\n .sort((a, b) => a.start - b.start);\n const out: TextRun[] = [];\n for (const r of sorted) {\n const prev = out[out.length - 1];\n if (prev && r.start < prev.end) continue;\n out.push(r);\n }\n return out;\n}\n\nfunction styleOf(run: TextRun): RunStyle {\n const { start: _start, end: _end, ...style } = run;\n return style;\n}\n\n/** Spans over `content` alone: run stretches and the plain stretches between them. */\nexport function runSpans(content: string, runs?: readonly TextRun[]): TextSpan[] {\n const clean = normalizeRuns(runs, content.length);\n const spans: TextSpan[] = [];\n let at = 0;\n for (const run of clean) {\n if (run.start > at) spans.push({ text: content.slice(at, run.start), style: null });\n spans.push({ text: content.slice(run.start, run.end), style: styleOf(run) });\n at = run.end;\n }\n if (at < content.length || spans.length === 0) spans.push({ text: content.slice(at), style: null });\n return spans;\n}\n\n/**\n * The spans a layer draws: its runs, a marker before each non-empty paragraph\n * of a list, everything capitalised when `uppercase` is on.\n */\nexport function layerSpans(layer: Pick<TextLayer, 'content' | 'runs' | 'listStyle' | 'uppercase'>): TextSpan[] {\n const content = layer.content ?? '';\n let spans = runSpans(content, layer.runs);\n if (layer.listStyle && layer.listStyle !== 'none') spans = withListMarkers(spans, layer.listStyle);\n if (layer.uppercase) spans = spans.map((s) => ({ ...s, text: s.text.toUpperCase() }));\n return mergeAdjacent(spans);\n}\n\nfunction withListMarkers(spans: TextSpan[], listStyle: 'bullet' | 'number'): TextSpan[] {\n const out: TextSpan[] = [];\n let n = 0;\n let atLineStart = true;\n for (const span of spans) {\n let rest = span.text;\n while (rest.length) {\n if (atLineStart) {\n const lineEnd = rest.indexOf('\\n');\n const head = lineEnd === -1 ? rest : rest.slice(0, lineEnd);\n if (head.trim()) {\n n += 1;\n out.push({ text: listStyle === 'bullet' ? '• ' : `${n}. `, style: span.style });\n }\n atLineStart = false;\n }\n const nl = rest.indexOf('\\n');\n if (nl === -1) {\n out.push({ text: rest, style: span.style });\n break;\n }\n out.push({ text: rest.slice(0, nl + 1), style: span.style });\n rest = rest.slice(nl + 1);\n atLineStart = true;\n }\n }\n return out;\n}\n\nfunction sameStyle(a: RunStyle | null, b: RunStyle | null): boolean {\n return a === b || JSON.stringify(a) === JSON.stringify(b);\n}\n\nfunction mergeAdjacent(spans: TextSpan[]): TextSpan[] {\n const out: TextSpan[] = [];\n for (const s of spans) {\n if (!s.text) continue;\n const prev = out[out.length - 1];\n if (prev && sameStyle(prev.style, s.style)) prev.text += s.text;\n else out.push({ ...s });\n }\n return out.length ? out : [{ text: '', style: null }];\n}\n\n/**\n * Editing the words of a layer that has runs: a run keeps covering its\n * characters - shifted past an insertion before it, cut by a deletion through\n * it. The edit is the one change between `before` and `after` (a keystroke,\n * a paste), found by their common prefix and suffix.\n */\nexport function rebaseRuns(before: string, after: string, runs: readonly TextRun[] | undefined): TextRun[] | undefined {\n if (!runs?.length) return runs ? [] : undefined;\n let prefix = 0;\n while (prefix < before.length && prefix < after.length && before[prefix] === after[prefix]) prefix += 1;\n let suffix = 0;\n while (\n suffix < before.length - prefix &&\n suffix < after.length - prefix &&\n before[before.length - 1 - suffix] === after[after.length - 1 - suffix]\n )\n suffix += 1;\n const removedEnd = before.length - suffix;\n const delta = after.length - before.length;\n const map = (i: number, isEnd: boolean) => {\n // Typing right after a run's last character continues its style, as in any editor.\n if (isEnd ? i < prefix : i <= prefix) return i;\n if (i >= removedEnd) return i + delta;\n // Inside the replaced stretch: an end keeps the new text, a start moves past it.\n return isEnd ? after.length - suffix : prefix;\n };\n return normalizeRuns(\n runs.map((r) => ({ ...r, start: map(r.start, false), end: map(r.end, true) })),\n after.length,\n );\n}\n\n/** Every face (family, weight, posture) a page's text draws in - what the font registry loads. */\nexport function facesUsed(\n page: { layers?: readonly EditorLayer[] },\n fontPair?: DesignFontPair,\n): Array<{ family: string; weight: number; italic: boolean }> {\n const seen = new Map<string, { family: string; weight: number; italic: boolean }>();\n const add = (family: string, weight: number, italic: boolean) => {\n const key = `${family}|${weight}|${italic ? 1 : 0}`;\n if (family && !seen.has(key)) seen.set(key, { family, weight, italic });\n };\n for (const layer of page.layers ?? []) {\n if (layer.kind !== 'text') continue;\n const family =\n layer.fontFamily || (fontPair ?? { display: 'Inter', body: 'Inter' })[layer.fontToken] || 'Inter';\n add(family, layer.fontWeight ?? 400, Boolean(layer.italic));\n for (const run of layer.runs ?? []) {\n if (run.fontFamily == null && run.fontWeight == null && run.italic == null) continue;\n add(\n run.fontFamily ?? family,\n run.fontWeight ?? layer.fontWeight ?? 400,\n run.italic ?? Boolean(layer.italic),\n );\n }\n }\n return [...seen.values()];\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBgB,SAAA,aAAA,CAAc,MAAsC,MAA2B,EAAA;AAC7F,EAAA,IAAI,EAAC,IAAA,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAM,MAAQ,CAAA,EAAA,OAAO,EAAC;AAC3B,EAAA,MAAM,MAAS,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAA,KAAM,iCACzB,CADyB,CAAA,EAAA;AAAA,IAE5B,KAAA,EAAO,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,MAAA,EAAQ,CAAE,CAAA,KAAK,CAAC,CAAA;AAAA,IAC5C,GAAA,EAAK,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,MAAA,EAAQ,CAAE,CAAA,GAAG,CAAC;AAAA,IACxC,CAAE,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,CAAE,MAAM,CAAE,CAAA,KAAK,CAAE,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,KAAA,GAAQ,EAAE,KAAK,CAAA;AACjE,EAAA,MAAM,MAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,KAAK,MAAQ,EAAA;AACtB,IAAA,MAAM,IAAO,GAAA,GAAA,CAAI,GAAI,CAAA,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,IAAQ,IAAA,CAAA,CAAE,KAAQ,GAAA,IAAA,CAAK,GAAK,EAAA;AAChC,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA;AAEZ,EAAO,OAAA,GAAA;AACT;AACA,SAAS,QAAQ,GAAwB,EAAA;AACvC,EAAA,MAII,EAHF,GAAA,GAAA,EAAA;AAAA,IAAO,KAAA,EAAA,MAAA;AAAA,IACP,GAAK,EAAA;AAAA,GAtCT,GAwCM,EADC,EAAA,KAAA,GAAA,SAAA,CACD,EADC,EAAA;AAAA,IAFH,OAAA;AAAA,IACA;AAAA,GAAA,CAAA;AAGF,EAAO,OAAA,KAAA;AACT;AAGgB,SAAA,QAAA,CAAS,SAAiB,IAAuC,EAAA;AAC/E,EAAA,MAAM,KAAQ,GAAA,aAAA,CAAc,IAAM,EAAA,OAAA,CAAQ,MAAM,CAAA;AAChD,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,IAAI,EAAK,GAAA,CAAA;AACT,EAAA,KAAA,MAAW,OAAO,KAAO,EAAA;AACvB,IAAA,IAAI,GAAI,CAAA,KAAA,GAAQ,EAAI,EAAA,KAAA,CAAM,IAAK,CAAA;AAAA,MAC7B,IAAM,EAAA,OAAA,CAAQ,KAAM,CAAA,EAAA,EAAI,IAAI,KAAK,CAAA;AAAA,MACjC,KAAO,EAAA;AAAA,KACR,CAAA;AACD,IAAA,KAAA,CAAM,IAAK,CAAA;AAAA,MACT,MAAM,OAAQ,CAAA,KAAA,CAAM,GAAI,CAAA,KAAA,EAAO,IAAI,GAAG,CAAA;AAAA,MACtC,KAAA,EAAO,QAAQ,GAAG;AAAA,KACnB,CAAA;AACD,IAAA,EAAA,GAAK,GAAI,CAAA,GAAA;AAAA;AAEX,EAAA,IAAI,KAAK,OAAQ,CAAA,MAAA,IAAU,MAAM,MAAW,KAAA,CAAA,QAAS,IAAK,CAAA;AAAA,IACxD,IAAA,EAAM,OAAQ,CAAA,KAAA,CAAM,EAAE,CAAA;AAAA,IACtB,KAAO,EAAA;AAAA,GACR,CAAA;AACD,EAAO,OAAA,KAAA;AACT;AAMO,SAAS,WAAW,KAAoF,EAAA;AAvE/G,EAAA,IAAA,EAAA;AAwEE,EAAM,MAAA,OAAA,GAAA,CAAU,EAAM,GAAA,KAAA,CAAA,OAAA,KAAN,IAAiB,GAAA,EAAA,GAAA,EAAA;AACjC,EAAA,IAAI,KAAQ,GAAA,QAAA,CAAS,OAAS,EAAA,KAAA,CAAM,IAAI,CAAA;AACxC,EAAI,IAAA,KAAA,CAAM,aAAa,KAAM,CAAA,SAAA,KAAc,QAAgB,KAAA,GAAA,eAAA,CAAgB,KAAO,EAAA,KAAA,CAAM,SAAS,CAAA;AACjG,EAAA,IAAI,MAAM,SAAW,EAAA,KAAA,GAAQ,MAAM,GAAI,CAAA,CAAA,CAAA,KAAM,iCACxC,CADwC,CAAA,EAAA;AAAA,IAE3C,IAAA,EAAM,CAAE,CAAA,IAAA,CAAK,WAAY;AAAA,GACzB,CAAA,CAAA;AACF,EAAA,OAAO,cAAc,KAAK,CAAA;AAC5B;AACA,SAAS,eAAA,CAAgB,OAAmB,SAA4C,EAAA;AACtF,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,IAAI,CAAI,GAAA,CAAA;AACR,EAAA,IAAI,WAAc,GAAA,IAAA;AAClB,EAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,IAAA,IAAI,OAAO,IAAK,CAAA,IAAA;AAChB,IAAA,OAAO,KAAK,MAAQ,EAAA;AAClB,MAAA,IAAI,WAAa,EAAA;AACf,QAAM,MAAA,OAAA,GAAU,IAAK,CAAA,OAAA,CAAQ,IAAI,CAAA;AACjC,QAAA,MAAM,OAAO,OAAY,KAAA,EAAA,GAAK,OAAO,IAAK,CAAA,KAAA,CAAM,GAAG,OAAO,CAAA;AAC1D,QAAI,IAAA,IAAA,CAAK,MAAQ,EAAA;AACf,UAAK,CAAA,IAAA,CAAA;AACL,UAAA,GAAA,CAAI,IAAK,CAAA;AAAA,YACP,IAAM,EAAA,SAAA,KAAc,QAAW,GAAA,UAAA,GAAQ,GAAG,CAAC,CAAA,GAAA,CAAA;AAAA,YAC3C,OAAO,IAAK,CAAA;AAAA,WACb,CAAA;AAAA;AAEH,QAAc,WAAA,GAAA,KAAA;AAAA;AAEhB,MAAM,MAAA,EAAA,GAAK,IAAK,CAAA,OAAA,CAAQ,IAAI,CAAA;AAC5B,MAAA,IAAI,OAAO,EAAI,EAAA;AACb,QAAA,GAAA,CAAI,IAAK,CAAA;AAAA,UACP,IAAM,EAAA,IAAA;AAAA,UACN,OAAO,IAAK,CAAA;AAAA,SACb,CAAA;AACD,QAAA;AAAA;AAEF,MAAA,GAAA,CAAI,IAAK,CAAA;AAAA,QACP,IAAM,EAAA,IAAA,CAAK,KAAM,CAAA,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,QAC1B,OAAO,IAAK,CAAA;AAAA,OACb,CAAA;AACD,MAAO,IAAA,GAAA,IAAA,CAAK,KAAM,CAAA,EAAA,GAAK,CAAC,CAAA;AACxB,MAAc,WAAA,GAAA,IAAA;AAAA;AAChB;AAEF,EAAO,OAAA,GAAA;AACT;AACA,SAAS,SAAA,CAAU,GAAoB,CAA6B,EAAA;AAClE,EAAO,OAAA,CAAA,KAAM,KAAK,IAAK,CAAA,SAAA,CAAU,CAAC,CAAM,KAAA,IAAA,CAAK,UAAU,CAAC,CAAA;AAC1D;AACA,SAAS,cAAc,KAA+B,EAAA;AACpD,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,KAAO,EAAA;AACrB,IAAI,IAAA,CAAC,EAAE,IAAM,EAAA;AACb,IAAA,MAAM,IAAO,GAAA,GAAA,CAAI,GAAI,CAAA,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAI,IAAA,IAAA,IAAQ,UAAU,IAAK,CAAA,KAAA,EAAO,EAAE,KAAK,CAAA,EAAQ,IAAA,CAAA,IAAA,IAAQ,CAAE,CAAA,IAAA;AAAA,SAAU,GAAA,CAAI,IAAK,CAAA,cAAA,CAAA,EAAA,EACzE,CACJ,CAAA,CAAA;AAAA;AAEH,EAAO,OAAA,GAAA,CAAI,MAAS,GAAA,GAAA,GAAM,CAAC;AAAA,IACzB,IAAM,EAAA,EAAA;AAAA,IACN,KAAO,EAAA;AAAA,GACR,CAAA;AACH;AAQgB,SAAA,UAAA,CAAW,MAAgB,EAAA,KAAA,EAAe,IAA6D,EAAA;AACrH,EAAA,IAAI,EAAC,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,MAAA,CAAA,EAAe,OAAA,IAAA,GAAO,EAAK,GAAA,MAAA;AACtC,EAAA,IAAI,MAAS,GAAA,CAAA;AACb,EAAA,OAAO,MAAS,GAAA,MAAA,CAAO,MAAU,IAAA,MAAA,GAAS,KAAM,CAAA,MAAA,IAAU,MAAO,CAAA,MAAM,CAAM,KAAA,KAAA,CAAM,MAAM,CAAA,EAAa,MAAA,IAAA,CAAA;AACtG,EAAA,IAAI,MAAS,GAAA,CAAA;AACb,EAAO,OAAA,MAAA,GAAS,OAAO,MAAS,GAAA,MAAA,IAAU,SAAS,KAAM,CAAA,MAAA,GAAS,UAAU,MAAO,CAAA,MAAA,CAAO,SAAS,CAAI,GAAA,MAAM,MAAM,KAAM,CAAA,KAAA,CAAM,SAAS,CAAI,GAAA,MAAM,GAAa,MAAA,IAAA,CAAA;AAC/J,EAAM,MAAA,UAAA,GAAa,OAAO,MAAS,GAAA,MAAA;AACnC,EAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,MAAA,GAAS,MAAO,CAAA,MAAA;AACpC,EAAM,MAAA,GAAA,GAAM,CAAC,CAAA,EAAW,KAAmB,KAAA;AAEzC,IAAA,IAAI,KAAQ,GAAA,CAAA,GAAI,MAAS,GAAA,CAAA,IAAK,QAAe,OAAA,CAAA;AAC7C,IAAI,IAAA,CAAA,IAAK,UAAY,EAAA,OAAO,CAAI,GAAA,KAAA;AAEhC,IAAO,OAAA,KAAA,GAAQ,KAAM,CAAA,MAAA,GAAS,MAAS,GAAA,MAAA;AAAA,GACzC;AACA,EAAA,OAAO,aAAc,CAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAA,KAAM,iCAC/B,CAD+B,CAAA,EAAA;AAAA,IAElC,KAAO,EAAA,GAAA,CAAI,CAAE,CAAA,KAAA,EAAO,KAAK,CAAA;AAAA,IACzB,GAAK,EAAA,GAAA,CAAI,CAAE,CAAA,GAAA,EAAK,IAAI;AAAA,GACtB,CAAE,CAAG,EAAA,KAAA,CAAM,MAAM,CAAA;AACnB;AAGgB,SAAA,SAAA,CAAU,MAEvB,QAIA,EAAA;AA3KH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA4KE,EAAM,MAAA,IAAA,uBAAW,GAId,EAAA;AACH,EAAA,MAAM,GAAM,GAAA,CAAC,MAAgB,EAAA,MAAA,EAAgB,MAAoB,KAAA;AAC/D,IAAM,MAAA,GAAA,GAAM,GAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAI,CAAA,EAAA,MAAA,GAAS,IAAI,CAAC,CAAA,CAAA;AACjD,IAAI,IAAA,MAAA,IAAU,CAAC,IAAK,CAAA,GAAA,CAAI,GAAG,CAAG,EAAA,IAAA,CAAK,IAAI,GAAK,EAAA;AAAA,MAC1C,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,GACH;AACA,EAAA,KAAA,MAAW,KAAS,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,MAAL,KAAA,IAAA,GAAA,EAAA,GAAe,EAAI,EAAA;AACrC,IAAI,IAAA,KAAA,CAAM,SAAS,MAAQ,EAAA;AAC3B,IAAM,MAAA,MAAA,GAAS,KAAM,CAAA,UAAA,IAAA,CAAe,QAAY,IAAA,IAAA,GAAA,QAAA,GAAA;AAAA,MAC9C,OAAS,EAAA,OAAA;AAAA,MACT,IAAM,EAAA;AAAA,KACR,EAAG,KAAM,CAAA,SAAS,CAAK,IAAA,OAAA;AACvB,IAAI,GAAA,CAAA,MAAA,EAAA,CAAQ,WAAM,UAAN,KAAA,IAAA,GAAA,EAAA,GAAoB,KAAK,OAAQ,CAAA,KAAA,CAAM,MAAM,CAAC,CAAA;AAC1D,IAAA,KAAA,MAAW,GAAO,IAAA,CAAA,EAAA,GAAA,KAAA,CAAM,IAAN,KAAA,IAAA,GAAA,EAAA,GAAc,EAAI,EAAA;AAClC,MAAI,IAAA,GAAA,CAAI,cAAc,IAAQ,IAAA,GAAA,CAAI,cAAc,IAAQ,IAAA,GAAA,CAAI,UAAU,IAAM,EAAA;AAC5E,MAAA,GAAA,CAAA,CAAI,SAAI,UAAJ,KAAA,IAAA,GAAA,EAAA,GAAkB,MAAQ,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,eAAJ,IAAkB,GAAA,EAAA,GAAA,KAAA,CAAM,UAAxB,KAAA,IAAA,GAAA,EAAA,GAAsC,MAAK,EAAI,GAAA,GAAA,CAAA,MAAA,KAAJ,YAAc,OAAQ,CAAA,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA;AAC9G;AAEF,EAAA,OAAO,CAAC,GAAG,IAAK,CAAA,MAAA,EAAQ,CAAA;AAC1B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const DEFAULT_FONT_PAIR = {
|
|
2
|
+
display: "Inter",
|
|
3
|
+
body: "Inter"
|
|
4
|
+
};
|
|
5
|
+
const DEFAULT_TEXT_COLOR = "#0f172a";
|
|
6
|
+
function designTitle(doc) {
|
|
7
|
+
var _a, _b, _c;
|
|
8
|
+
return ((_a = doc.title) == null ? void 0 : _a.trim()) || ((_c = (_b = doc.brief) == null ? void 0 : _b.topic) == null ? void 0 : _c.trim()) || "";
|
|
9
|
+
}
|
|
10
|
+
function artifactTitle(doc) {
|
|
11
|
+
return designTitle(doc).slice(0, 80) || "Untitled design";
|
|
12
|
+
}
|
|
13
|
+
function layerFontFamily(layer, fontPair) {
|
|
14
|
+
return layer.fontFamily || (fontPair != null ? fontPair : DEFAULT_FONT_PAIR)[layer.fontToken] || "Inter";
|
|
15
|
+
}
|
|
16
|
+
let layerIdCounter = 0;
|
|
17
|
+
function newLayerId() {
|
|
18
|
+
layerIdCounter += 1;
|
|
19
|
+
return `layer-${Date.now().toString(36)}-${layerIdCounter}`;
|
|
20
|
+
}
|
|
21
|
+
let pageIdCounter = 0;
|
|
22
|
+
function newPageId() {
|
|
23
|
+
pageIdCounter += 1;
|
|
24
|
+
return `cp-${Date.now()}-${pageIdCounter}`;
|
|
25
|
+
}
|
|
26
|
+
function defaultPageName(role, index) {
|
|
27
|
+
if (role === "cover") return "Hook";
|
|
28
|
+
if (role === "cta") return "CTA";
|
|
29
|
+
return String(index).padStart(2, "0");
|
|
30
|
+
}export{DEFAULT_FONT_PAIR,DEFAULT_TEXT_COLOR,artifactTitle,defaultPageName,designTitle,layerFontFamily,newLayerId,newPageId};//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../../src/features/design/doc/types.ts"],"sourcesContent":["/**\n * The Design Studio document - native twin of canvas-surface\n * `editors/carousel-editor/utils/types.ts` and the layer half of\n * `rpc/carouselRpc.ts`.\n *\n * This IS the wire shape: a design saved here rides the same `canvas` index\n * row the web Design Studio writes (`deck:<uuid>` / `flyer:<uuid>`), so every\n * field keeps its web name and meaning. Web opens what native saves and the\n * reverse; a field native does not edit is carried through untouched.\n *\n * Pure: no RN imports, runs under jest as-is.\n */\nimport type { ShapeKind } from './shapes';\nimport type { TextEffect } from './textEffects';\n\nexport type ChartKind = 'bar' | 'row' | 'line' | 'area' | 'pie' | 'donut';\n\nexport interface DesignPalette {\n background: string;\n surface: string;\n primary: string;\n text: string;\n muted: string;\n}\n\nexport interface DesignFontPair {\n display: string;\n body: string;\n}\n\nexport interface DesignBackground {\n kind: 'color' | 'gradient' | 'image';\n color?: string;\n from?: string;\n to?: string;\n angle?: number;\n imagePrompt?: string;\n}\n\nexport type TextListStyle = 'none' | 'bullet' | 'number';\n\nexport interface DesignBrief {\n platform: string;\n format: string;\n pageCount: number;\n topic: string;\n audience: string;\n tone: string;\n brandGuidelines?: string;\n templateNotes?: string;\n}\n\n/** Characters [start, end) of a text layer's `content` drawn in a style of their own. */\nexport interface TextRun {\n start: number;\n end: number;\n fontFamily?: string;\n fontWeight?: number;\n /** Font size as a fraction of page width, like the layer's own. */\n fontSizeFrac?: number;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n color?: string;\n lineHeight?: number;\n letterSpacingFrac?: number;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface ImageAdjust {\n filter?: { id: string; intensity: number };\n brightness?: number;\n contrast?: number;\n saturation?: number;\n blurFrac?: number;\n}\n\nexport interface LayerShadow {\n color: string;\n /** 0-1. */\n alpha: number;\n /** Blur and distance as fractions of page width. */\n blurFrac: number;\n distFrac: number;\n /** Degrees clockwise from pointing right; 90 drops straight down. */\n angle: number;\n}\n\n/** Fields every layer kind can carry (the editor's bookkeeping on top of the connector layer). */\ninterface LayerCommon {\n id: string;\n /** Normalised 0-1 box on the page. */\n x: number;\n y: number;\n w: number;\n h: number;\n groupId?: string;\n /** Degrees clockwise about the layer's centre. */\n rotation?: number;\n flipX?: boolean;\n flipY?: boolean;\n locked?: boolean;\n opacity?: number;\n shadow?: LayerShadow;\n}\n\nexport interface TextLayer extends LayerCommon {\n kind: 'text';\n content: string;\n fontToken: 'display' | 'body';\n fontWeight: number;\n /** Font size as a fraction of page width. */\n fontSizeFrac: number;\n color: string;\n align: 'left' | 'center' | 'right';\n lineHeight: number;\n fontFamily?: string;\n italic?: boolean;\n underline?: boolean;\n letterSpacingFrac?: number;\n listStyle?: TextListStyle;\n outline?: { color: string; widthEm: number };\n justify?: boolean;\n strike?: boolean;\n uppercase?: boolean;\n effect?: TextEffect;\n curve?: number;\n runs?: TextRun[];\n}\n\nexport interface ShapeLayer extends LayerCommon {\n kind: 'shape';\n shape: ShapeKind;\n fill: string;\n radiusFrac: number;\n opacity: number;\n stroke?: string;\n strokeWidthFrac?: number;\n fillTo?: string;\n fillAngle?: number;\n}\n\nexport type LayerImageStatus = 'empty' | 'generating' | 'ready' | 'error';\n\nexport interface ImageLayer extends LayerCommon {\n kind: 'image';\n /** Text-free visual prompt (AI images); '' on catalog and uploaded pictures. */\n prompt: string;\n src?: string | null;\n imageStatus?: LayerImageStatus;\n uploaded?: boolean;\n uploadError?: string;\n /** A template picture the person is meant to swap. */\n replaceable?: boolean;\n /** The part of the source shown in the box, as fractions of the source. */\n crop?: Rect;\n /** A frame: the outline (SVG path in a 0..1 box) the picture shows through. */\n clipPath?: string;\n adjust?: ImageAdjust;\n}\n\nexport interface ChartLayer extends LayerCommon {\n kind: 'chart';\n chart: ChartKind;\n data: { label: string; value: number }[];\n colors: string[];\n opacity: number;\n title?: string;\n categories?: string[];\n series?: { name: string; values: number[] }[];\n stacked?: boolean;\n holeFrac?: number;\n legend?: boolean;\n gridlines?: boolean;\n valueLabels?: boolean;\n axisLabels?: boolean;\n ink?: string;\n}\n\nexport type EditorLayer = TextLayer | ShapeLayer | ImageLayer | ChartLayer;\nexport type LayerKind = EditorLayer['kind'];\n\nexport interface PageBackground extends DesignBackground {\n src?: string | null;\n imageStatus?: LayerImageStatus;\n}\n\nexport type DesignPageStatus = 'empty' | 'generating' | 'ready' | 'error';\n\nexport interface DesignPage {\n id: string;\n name?: string;\n notes?: string;\n prompt: string;\n /** v1 flat-render path: the full slide image. */\n src: string | null;\n status: DesignPageStatus;\n error?: string;\n dataBase64?: string;\n mimeType?: string;\n role?: 'cover' | 'content' | 'cta';\n background?: PageBackground;\n layers?: EditorLayer[];\n}\n\nexport interface BrandKit {\n colors: string[];\n fonts: DesignFontPair;\n logos: string[];\n}\n\nexport interface UploadedFont {\n family: string;\n url: string;\n weight?: number;\n italic?: boolean;\n}\n\nexport interface PrintSpec {\n bleedMm: number;\n safeAreaMm: number;\n trimMm?: { w: number; h: number };\n}\n\n/** web `CarouselDoc`. */\nexport interface DesignDoc {\n version: 1 | 2;\n title?: string;\n brief: DesignBrief;\n aspectRatio: string;\n /** Page size in world units (target export pixels). */\n pageWidth: number;\n pageHeight: number;\n pages: DesignPage[];\n outlineMarkdown?: string;\n palette?: DesignPalette;\n fontPair?: DesignFontPair;\n brandKit?: BrandKit;\n fonts?: UploadedFont[];\n print?: PrintSpec;\n}\n\n/** The artifact kinds a design saves as: screen designs are decks, printed ones flyers. */\nexport type DesignKind = 'deck' | 'flyer';\n\n/** Every artifact kind native writes on the `canvas` index: designs plus rich-text docs (`doc:<uuid>`). */\nexport type CanvasArtifactKind = DesignKind | 'doc';\n\nexport const DEFAULT_PALETTE: DesignPalette = {\n background: '#0f172a',\n surface: '#1e293b',\n primary: '#38bdf8',\n text: '#f8fafc',\n muted: '#94a3b8',\n};\n\nexport const DEFAULT_FONT_PAIR: DesignFontPair = { display: 'Inter', body: 'Inter' };\n\n/** New text is always ink-black, never the palette's text colour - that reads white on a light page. */\nexport const DEFAULT_TEXT_COLOR = '#0f172a';\n\n/** What a person calls the design: the name they gave it, else the topic it started from; '' when neither. */\nexport function designTitle(doc: Pick<DesignDoc, 'title' | 'brief'>): string {\n return doc.title?.trim() || doc.brief?.topic?.trim() || '';\n}\n\n/** The row title a save writes (web `artifactTitle`). */\nexport function artifactTitle(doc: Pick<DesignDoc, 'title' | 'brief'>): string {\n return designTitle(doc).slice(0, 80) || 'Untitled design';\n}\n\n/** The family a text layer draws in: its own, else its theme token's. */\nexport function layerFontFamily(layer: Pick<TextLayer, 'fontFamily' | 'fontToken'>, fontPair?: DesignFontPair): string {\n return layer.fontFamily || (fontPair ?? DEFAULT_FONT_PAIR)[layer.fontToken] || 'Inter';\n}\n\nlet layerIdCounter = 0;\nexport function newLayerId(): string {\n layerIdCounter += 1;\n return `layer-${Date.now().toString(36)}-${layerIdCounter}`;\n}\n\nlet pageIdCounter = 0;\nexport function newPageId(): string {\n pageIdCounter += 1;\n return `cp-${Date.now()}-${pageIdCounter}`;\n}\n\n/** Default page display name from its role (cover -> Hook, cta -> CTA, content -> 01...). */\nexport function defaultPageName(role: 'cover' | 'content' | 'cta' | undefined, index: number): string {\n if (role === 'cover') return 'Hook';\n if (role === 'cta') return 'CTA';\n return String(index).padStart(2, '0');\n}\n\n/** A layer's box in page px. */\nexport function layerBoxPx(layer: Pick<EditorLayer, 'x' | 'y' | 'w' | 'h'>, pageW: number, pageH: number): Rect {\n return { x: layer.x * pageW, y: layer.y * pageH, w: layer.w * pageW, h: layer.h * pageH };\n}\n"],"names":[],"mappings":"AA8PO,MAAM,iBAAoC,GAAA;AAAA,EAC/C,OAAS,EAAA,OAAA;AAAA,EACT,IAAM,EAAA;AACR;AAGO,MAAM,kBAAqB,GAAA;AAG3B,SAAS,YAAY,GAAiD,EAAA;AAvQ7E,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAwQE,EAAO,OAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAI,UAAJ,IAAW,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,EAAA,MAAA,CAAU,eAAI,KAAJ,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,KAAX,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAkB,IAAU,EAAA,CAAA,IAAA,EAAA;AAC1D;AAGO,SAAS,cAAc,GAAiD,EAAA;AAC7E,EAAA,OAAO,YAAY,GAAG,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAK,IAAA,iBAAA;AAC1C;AAGgB,SAAA,eAAA,CAAgB,OAAoD,QAAmC,EAAA;AACrH,EAAA,OAAO,MAAM,UAAe,IAAA,CAAA,QAAA,IAAA,IAAA,GAAA,QAAA,GAAY,iBAAmB,EAAA,KAAA,CAAM,SAAS,CAAK,IAAA,OAAA;AACjF;AACA,IAAI,cAAiB,GAAA,CAAA;AACd,SAAS,UAAqB,GAAA;AACnC,EAAkB,cAAA,IAAA,CAAA;AAClB,EAAO,OAAA,CAAA,MAAA,EAAS,KAAK,GAAI,EAAA,CAAE,SAAS,EAAE,CAAC,IAAI,cAAc,CAAA,CAAA;AAC3D;AACA,IAAI,aAAgB,GAAA,CAAA;AACb,SAAS,SAAoB,GAAA;AAClC,EAAiB,aAAA,IAAA,CAAA;AACjB,EAAA,OAAO,CAAM,GAAA,EAAA,IAAA,CAAK,GAAI,EAAC,IAAI,aAAa,CAAA,CAAA;AAC1C;AAGgB,SAAA,eAAA,CAAgB,MAA+C,KAAuB,EAAA;AACpG,EAAI,IAAA,IAAA,KAAS,SAAgB,OAAA,MAAA;AAC7B,EAAI,IAAA,IAAA,KAAS,OAAc,OAAA,KAAA;AAC3B,EAAA,OAAO,MAAO,CAAA,KAAK,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AACtC"}
|