@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.
Files changed (360) hide show
  1. package/lib/compute.js +57 -1
  2. package/lib/compute.js.map +1 -1
  3. package/lib/features/agent-chat/NativeAgentChat.js +3 -2
  4. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  5. package/lib/features/apps/AppsCatalog.js +10 -0
  6. package/lib/features/apps/AppsCatalog.js.map +1 -1
  7. package/lib/features/apps/mobileAppCatalog.js +11 -0
  8. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  9. package/lib/features/canvas/AudioEditorExperience.js +448 -105
  10. package/lib/features/canvas/AudioEditorExperience.js.map +1 -1
  11. package/lib/features/canvas/CanvasAgentChatPane.js +33 -14
  12. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
  13. package/lib/features/canvas/CanvasBoardsGrid.js +493 -41
  14. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
  15. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -1
  16. package/lib/features/canvas/CanvasEditToolsPanel.js +37 -1
  17. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
  18. package/lib/features/canvas/CanvasExperience.js +237 -22
  19. package/lib/features/canvas/CanvasExperience.js.map +1 -1
  20. package/lib/features/canvas/CanvasGeneratePanel.js +119 -26
  21. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
  22. package/lib/features/canvas/CanvasLooksPanel.js +17 -6
  23. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -1
  24. package/lib/features/canvas/CanvasTasksPanel.js +18 -1
  25. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
  26. package/lib/features/canvas/DesignCategoryGallery.js +423 -0
  27. package/lib/features/canvas/DesignCategoryGallery.js.map +1 -0
  28. package/lib/features/canvas/ImageEditorExperience.js +763 -187
  29. package/lib/features/canvas/ImageEditorExperience.js.map +1 -1
  30. package/lib/features/canvas/SetStudioExperience.js +199 -11
  31. package/lib/features/canvas/SetStudioExperience.js.map +1 -1
  32. package/lib/features/canvas/VideoEditorExperience.js +59 -40
  33. package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
  34. package/lib/features/canvas/VideoGeneratorExperience.js +134 -34
  35. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
  36. package/lib/features/canvas/aiEdit.js +4 -2
  37. package/lib/features/canvas/aiEdit.js.map +1 -1
  38. package/lib/features/canvas/audioEditor/AudioWaveform.js +96 -0
  39. package/lib/features/canvas/audioEditor/AudioWaveform.js.map +1 -0
  40. package/lib/features/canvas/audioEditor/audioPeaks.js +93 -0
  41. package/lib/features/canvas/audioEditor/audioPeaks.js.map +1 -0
  42. package/lib/features/canvas/canvasTaskSync.js +34 -7
  43. package/lib/features/canvas/canvasTaskSync.js.map +1 -1
  44. package/lib/features/canvas/canvasTasks.js +23 -3
  45. package/lib/features/canvas/canvasTasks.js.map +1 -1
  46. package/lib/features/canvas/canvasTheme.js +10 -24
  47. package/lib/features/canvas/canvasTheme.js.map +1 -1
  48. package/lib/features/canvas/canvasUi.js +1 -1
  49. package/lib/features/canvas/canvasUi.js.map +1 -1
  50. package/lib/features/canvas/createTiles.js +17 -9
  51. package/lib/features/canvas/createTiles.js.map +1 -1
  52. package/lib/features/canvas/deepLinks.js +35 -5
  53. package/lib/features/canvas/deepLinks.js.map +1 -1
  54. package/lib/features/canvas/designCatalog.js +165 -0
  55. package/lib/features/canvas/designCatalog.js.map +1 -0
  56. package/lib/features/canvas/designCategories.js +262 -0
  57. package/lib/features/canvas/designCategories.js.map +1 -0
  58. package/lib/features/canvas/editorControls.js +406 -0
  59. package/lib/features/canvas/editorControls.js.map +1 -0
  60. package/lib/features/canvas/generationModels.js +5 -3
  61. package/lib/features/canvas/generationModels.js.map +1 -1
  62. package/lib/features/canvas/generationTasks.js +162 -0
  63. package/lib/features/canvas/generationTasks.js.map +1 -0
  64. package/lib/features/canvas/generator/BottomSheet.js +167 -0
  65. package/lib/features/canvas/generator/BottomSheet.js.map +1 -0
  66. package/lib/features/canvas/generator/BusinessCardChatCard.js +155 -0
  67. package/lib/features/canvas/generator/BusinessCardChatCard.js.map +1 -0
  68. package/lib/features/canvas/generator/DirectorSheet.js +163 -0
  69. package/lib/features/canvas/generator/DirectorSheet.js.map +1 -0
  70. package/lib/features/canvas/generator/ReframePreview.js +122 -0
  71. package/lib/features/canvas/generator/ReframePreview.js.map +1 -0
  72. package/lib/features/canvas/generator/RunLogCard.js +119 -0
  73. package/lib/features/canvas/generator/RunLogCard.js.map +1 -0
  74. package/lib/features/canvas/generator/ShotPanel.js +261 -0
  75. package/lib/features/canvas/generator/ShotPanel.js.map +1 -0
  76. package/lib/features/canvas/generator/businessCardWidget.js +117 -0
  77. package/lib/features/canvas/generator/businessCardWidget.js.map +1 -0
  78. package/lib/features/canvas/generator/cameraVocabulary.js +142 -0
  79. package/lib/features/canvas/generator/cameraVocabulary.js.map +1 -0
  80. package/lib/features/canvas/generator/cinematicVocabulary.js +416 -0
  81. package/lib/features/canvas/generator/cinematicVocabulary.js.map +1 -0
  82. package/lib/features/canvas/generator/direction.js +41 -0
  83. package/lib/features/canvas/generator/direction.js.map +1 -0
  84. package/lib/features/canvas/generator/reframeGeometry.js +108 -0
  85. package/lib/features/canvas/generator/reframeGeometry.js.map +1 -0
  86. package/lib/features/canvas/generator/runLog.js +71 -0
  87. package/lib/features/canvas/generator/runLog.js.map +1 -0
  88. package/lib/features/canvas/generator/shot.js +133 -0
  89. package/lib/features/canvas/generator/shot.js.map +1 -0
  90. package/lib/features/canvas/generator/useShotSpec.js +87 -0
  91. package/lib/features/canvas/generator/useShotSpec.js.map +1 -0
  92. package/lib/features/canvas/home/HeroComposer.js +214 -0
  93. package/lib/features/canvas/home/HeroComposer.js.map +1 -0
  94. package/lib/features/canvas/home/HeroMonitor.js +225 -0
  95. package/lib/features/canvas/home/HeroMonitor.js.map +1 -0
  96. package/lib/features/canvas/home/LookDetail.js +185 -0
  97. package/lib/features/canvas/home/LookDetail.js.map +1 -0
  98. package/lib/features/canvas/home/LoopingVideo.js +37 -0
  99. package/lib/features/canvas/home/LoopingVideo.js.map +1 -0
  100. package/lib/features/canvas/home/TemplatesGallery.js +253 -0
  101. package/lib/features/canvas/home/TemplatesGallery.js.map +1 -0
  102. package/lib/features/canvas/home/heroShots.js +100 -0
  103. package/lib/features/canvas/home/heroShots.js.map +1 -0
  104. package/lib/features/canvas/homeWork.js +62 -3
  105. package/lib/features/canvas/homeWork.js.map +1 -1
  106. package/lib/features/canvas/imageEditor/ImageMarkup.js +195 -0
  107. package/lib/features/canvas/imageEditor/ImageMarkup.js.map +1 -0
  108. package/lib/features/canvas/imageEditor/imageEditOps.js +367 -0
  109. package/lib/features/canvas/imageEditor/imageEditOps.js.map +1 -0
  110. package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
  111. package/lib/features/canvas/rankedCatalogSearch.js +375 -0
  112. package/lib/features/canvas/rankedCatalogSearch.js.map +1 -0
  113. package/lib/features/canvas/recorder/CameraRecorderExperience.js +68 -20
  114. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -1
  115. package/lib/features/canvas/recorder/RecordingReview.js +272 -0
  116. package/lib/features/canvas/recorder/RecordingReview.js.map +1 -0
  117. package/lib/features/canvas/recorder/RecordingsList.js +179 -0
  118. package/lib/features/canvas/recorder/RecordingsList.js.map +1 -0
  119. package/lib/features/canvas/recorder/recorderOps.js +99 -0
  120. package/lib/features/canvas/recorder/recorderOps.js.map +1 -0
  121. package/lib/features/canvas/seedanceShowcase.js +314 -0
  122. package/lib/features/canvas/seedanceShowcase.js.map +1 -0
  123. package/lib/features/canvas/serverTasks.js +149 -15
  124. package/lib/features/canvas/serverTasks.js.map +1 -1
  125. package/lib/features/canvas/sessionRenewal.js +114 -0
  126. package/lib/features/canvas/sessionRenewal.js.map +1 -0
  127. package/lib/features/canvas/set/SetViewportWebView.js +34 -1
  128. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
  129. package/lib/features/canvas/set/agent/setTurn.js +4 -2
  130. package/lib/features/canvas/set/agent/setTurn.js.map +1 -1
  131. package/lib/features/canvas/set/setPresets.js +85 -0
  132. package/lib/features/canvas/set/setPresets.js.map +1 -0
  133. package/lib/features/canvas/set/setProject.js +4 -1
  134. package/lib/features/canvas/set/setProject.js.map +1 -1
  135. package/lib/features/canvas/studioCatalog.js +59 -4
  136. package/lib/features/canvas/studioCatalog.js.map +1 -1
  137. package/lib/features/canvas/studioLooks.js +31 -4
  138. package/lib/features/canvas/studioLooks.js.map +1 -1
  139. package/lib/features/canvas/surfaceIndex.js +1 -14
  140. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  141. package/lib/features/canvas/templateSearch.js +489 -0
  142. package/lib/features/canvas/templateSearch.js.map +1 -0
  143. package/lib/features/canvas/useCanvasSession.js +28 -6
  144. package/lib/features/canvas/useCanvasSession.js.map +1 -1
  145. package/lib/features/canvas/useStudioCatalogTemplates.js +41 -5
  146. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -1
  147. package/lib/features/canvas/videoEditor/EditorPanels.js +531 -0
  148. package/lib/features/canvas/videoEditor/EditorPanels.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +48 -4
  150. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
  151. package/lib/features/canvas/videoEditor/agent/agentLoop.js +2 -0
  152. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
  153. package/lib/features/canvas/videoEditor/agent/brainClient.js +97 -27
  154. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
  155. package/lib/features/canvas/videoEditor/agent/cutTools.js +707 -3
  156. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
  157. package/lib/features/canvas/videoEditor/audioServices.js +165 -0
  158. package/lib/features/canvas/videoEditor/audioServices.js.map +1 -0
  159. package/lib/features/canvas/videoEditor/captions.js +144 -0
  160. package/lib/features/canvas/videoEditor/captions.js.map +1 -0
  161. package/lib/features/canvas/videoEditor/compileTimeline.js +24 -16
  162. package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -1
  163. package/lib/features/canvas/videoEditor/editorModel.js +12 -2
  164. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
  165. package/lib/features/canvas/videoEditor/exportTask.js +89 -7
  166. package/lib/features/canvas/videoEditor/exportTask.js.map +1 -1
  167. package/lib/features/canvas/videoEditor/layers.js +117 -0
  168. package/lib/features/canvas/videoEditor/layers.js.map +1 -0
  169. package/lib/features/canvas/videoEditor/remoteMediaClient.js +45 -18
  170. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
  171. package/lib/features/canvas/videoEditor/renderTimeline.js +18 -6
  172. package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -1
  173. package/lib/features/canvas/videoEditor/revoice.js +138 -0
  174. package/lib/features/canvas/videoEditor/revoice.js.map +1 -0
  175. package/lib/features/canvas/videoEditor/storageUpload.js +34 -0
  176. package/lib/features/canvas/videoEditor/storageUpload.js.map +1 -0
  177. package/lib/features/canvas/videoEditor/textMotion.js +109 -0
  178. package/lib/features/canvas/videoEditor/textMotion.js.map +1 -0
  179. package/lib/features/canvas/videoEditor/transitions.js +31 -0
  180. package/lib/features/canvas/videoEditor/transitions.js.map +1 -0
  181. package/lib/features/chat/TemplatesChatCards.js +8 -3
  182. package/lib/features/chat/TemplatesChatCards.js.map +1 -1
  183. package/lib/features/design/DesignEditorExperience.js +674 -644
  184. package/lib/features/design/DesignEditorExperience.js.map +1 -1
  185. package/lib/features/design/DesignExperience.js +285 -538
  186. package/lib/features/design/DesignExperience.js.map +1 -1
  187. package/lib/features/design/designCore.js +2 -212
  188. package/lib/features/design/designCore.js.map +1 -1
  189. package/lib/features/design/designIndex.js +1 -50
  190. package/lib/features/design/designIndex.js.map +1 -1
  191. package/lib/features/design/doc/aiDesign.js +247 -0
  192. package/lib/features/design/doc/aiDesign.js.map +1 -0
  193. package/lib/features/design/doc/artifacts.js +280 -0
  194. package/lib/features/design/doc/artifacts.js.map +1 -0
  195. package/lib/features/design/doc/chart.js +98 -0
  196. package/lib/features/design/doc/chart.js.map +1 -0
  197. package/lib/features/design/doc/crop.js +104 -0
  198. package/lib/features/design/doc/crop.js.map +1 -0
  199. package/lib/features/design/doc/curve.js +49 -0
  200. package/lib/features/design/doc/curve.js.map +1 -0
  201. package/lib/features/design/doc/docOps.js +397 -0
  202. package/lib/features/design/doc/docOps.js.map +1 -0
  203. package/lib/features/design/doc/findReplace.js +112 -0
  204. package/lib/features/design/doc/findReplace.js.map +1 -0
  205. package/lib/features/design/doc/fonts.js +79 -0
  206. package/lib/features/design/doc/fonts.js.map +1 -0
  207. package/lib/features/design/doc/frames.js +17 -0
  208. package/lib/features/design/doc/frames.js.map +1 -0
  209. package/lib/features/design/doc/geometry.js +133 -0
  210. package/lib/features/design/doc/geometry.js.map +1 -0
  211. package/lib/features/design/doc/imageAdjust.js +203 -0
  212. package/lib/features/design/doc/imageAdjust.js.map +1 -0
  213. package/lib/features/design/doc/legacyDoc.js +107 -0
  214. package/lib/features/design/doc/legacyDoc.js.map +1 -0
  215. package/lib/features/design/doc/newDoc.js +335 -0
  216. package/lib/features/design/doc/newDoc.js.map +1 -0
  217. package/lib/features/design/doc/pageRange.js +17 -0
  218. package/lib/features/design/doc/pageRange.js.map +1 -0
  219. package/lib/features/design/doc/pathScale.js +68 -0
  220. package/lib/features/design/doc/pathScale.js.map +1 -0
  221. package/lib/features/design/doc/qr.js +62 -0
  222. package/lib/features/design/doc/qr.js.map +1 -0
  223. package/lib/features/design/doc/shapes.js +366 -0
  224. package/lib/features/design/doc/shapes.js.map +1 -0
  225. package/lib/features/design/doc/sizes.js +230 -0
  226. package/lib/features/design/doc/sizes.js.map +1 -0
  227. package/lib/features/design/doc/textEffects.js +134 -0
  228. package/lib/features/design/doc/textEffects.js.map +1 -0
  229. package/lib/features/design/doc/textLayout.js +182 -0
  230. package/lib/features/design/doc/textLayout.js.map +1 -0
  231. package/lib/features/design/doc/types.js +30 -0
  232. package/lib/features/design/doc/types.js.map +1 -0
  233. package/lib/features/design/editor/AiPanel.js +194 -0
  234. package/lib/features/design/editor/AiPanel.js.map +1 -0
  235. package/lib/features/design/editor/ChartDataPanel.js +182 -0
  236. package/lib/features/design/editor/ChartDataPanel.js.map +1 -0
  237. package/lib/features/design/editor/CropOverlay.js +199 -0
  238. package/lib/features/design/editor/CropOverlay.js.map +1 -0
  239. package/lib/features/design/editor/DesignCanvas.js +363 -0
  240. package/lib/features/design/editor/DesignCanvas.js.map +1 -0
  241. package/lib/features/design/editor/ExportSheet.js +123 -0
  242. package/lib/features/design/editor/ExportSheet.js.map +1 -0
  243. package/lib/features/design/editor/FindReplacePanel.js +93 -0
  244. package/lib/features/design/editor/FindReplacePanel.js.map +1 -0
  245. package/lib/features/design/editor/ImageTools.js +188 -0
  246. package/lib/features/design/editor/ImageTools.js.map +1 -0
  247. package/lib/features/design/editor/LayerTools.js +485 -0
  248. package/lib/features/design/editor/LayerTools.js.map +1 -0
  249. package/lib/features/design/editor/PageStrip.js +203 -0
  250. package/lib/features/design/editor/PageStrip.js.map +1 -0
  251. package/lib/features/design/editor/Slideshow.js +97 -0
  252. package/lib/features/design/editor/Slideshow.js.map +1 -0
  253. package/lib/features/design/editor/ToolPanels.js +695 -0
  254. package/lib/features/design/editor/ToolPanels.js.map +1 -0
  255. package/lib/features/design/editor/controls.js +630 -0
  256. package/lib/features/design/editor/controls.js.map +1 -0
  257. package/lib/features/design/editor/useDesignSave.js +91 -0
  258. package/lib/features/design/editor/useDesignSave.js.map +1 -0
  259. package/lib/features/design/export/exportDesign.js +170 -0
  260. package/lib/features/design/export/exportDesign.js.map +1 -0
  261. package/lib/features/design/export/pdf.js +143 -0
  262. package/lib/features/design/export/pdf.js.map +1 -0
  263. package/lib/features/design/home/DesignHome.js +688 -0
  264. package/lib/features/design/home/DesignHome.js.map +1 -0
  265. package/lib/features/design/home/studioHome.js +61 -0
  266. package/lib/features/design/home/studioHome.js.map +1 -0
  267. package/lib/features/design/pickDesignImage.js +60 -0
  268. package/lib/features/design/pickDesignImage.js.map +1 -0
  269. package/lib/features/design/render/DesignPageView.js +69 -0
  270. package/lib/features/design/render/DesignPageView.js.map +1 -0
  271. package/lib/features/design/render/PageCapture.js +288 -0
  272. package/lib/features/design/render/PageCapture.js.map +1 -0
  273. package/lib/features/design/render/TextMeasure.js +115 -0
  274. package/lib/features/design/render/TextMeasure.js.map +1 -0
  275. package/lib/features/design/render/fontRegistry.js +110 -0
  276. package/lib/features/design/render/fontRegistry.js.map +1 -0
  277. package/lib/features/design/render/layers.js +392 -0
  278. package/lib/features/design/render/layers.js.map +1 -0
  279. package/lib/features/design/render/svg.js +35 -0
  280. package/lib/features/design/render/svg.js.map +1 -0
  281. package/lib/features/design/render/svgParts.js +435 -0
  282. package/lib/features/design/render/svgParts.js.map +1 -0
  283. package/lib/features/design/surface/BoardScreen.js +529 -0
  284. package/lib/features/design/surface/BoardScreen.js.map +1 -0
  285. package/lib/features/design/surface/CompareView.js +138 -0
  286. package/lib/features/design/surface/CompareView.js.map +1 -0
  287. package/lib/features/design/surface/CreationScreen.js +294 -0
  288. package/lib/features/design/surface/CreationScreen.js.map +1 -0
  289. package/lib/features/design/surface/DesignAgentChatPane.js +444 -0
  290. package/lib/features/design/surface/DesignAgentChatPane.js.map +1 -0
  291. package/lib/features/design/surface/DesignBoards.js +441 -0
  292. package/lib/features/design/surface/DesignBoards.js.map +1 -0
  293. package/lib/features/design/surface/DesignPreview.js +159 -0
  294. package/lib/features/design/surface/DesignPreview.js.map +1 -0
  295. package/lib/features/design/surface/DesignSurfaceExperience.js +80 -0
  296. package/lib/features/design/surface/DesignSurfaceExperience.js.map +1 -0
  297. package/lib/features/design/surface/FullScreenPreview.js +59 -0
  298. package/lib/features/design/surface/FullScreenPreview.js.map +1 -0
  299. package/lib/features/design/surface/NewSystemDialog.js +122 -0
  300. package/lib/features/design/surface/NewSystemDialog.js.map +1 -0
  301. package/lib/features/design/surface/PickerSheet.js +175 -0
  302. package/lib/features/design/surface/PickerSheet.js.map +1 -0
  303. package/lib/features/design/surface/TemplatesGallery.js +156 -0
  304. package/lib/features/design/surface/TemplatesGallery.js.map +1 -0
  305. package/lib/features/design/surface/WetPaint.js +140 -0
  306. package/lib/features/design/surface/WetPaint.js.map +1 -0
  307. package/lib/features/design/surface/agentTurn.js +229 -0
  308. package/lib/features/design/surface/agentTurn.js.map +1 -0
  309. package/lib/features/design/surface/designBoard.js +218 -0
  310. package/lib/features/design/surface/designBoard.js.map +1 -0
  311. package/lib/features/design/surface/designChannel.js +186 -0
  312. package/lib/features/design/surface/designChannel.js.map +1 -0
  313. package/lib/features/design/surface/designChat.js +141 -0
  314. package/lib/features/design/surface/designChat.js.map +1 -0
  315. package/lib/features/design/surface/designConnector.js +266 -0
  316. package/lib/features/design/surface/designConnector.js.map +1 -0
  317. package/lib/features/design/surface/designDocument.js +40 -0
  318. package/lib/features/design/surface/designDocument.js.map +1 -0
  319. package/lib/features/design/surface/designExport.js +55 -0
  320. package/lib/features/design/surface/designExport.js.map +1 -0
  321. package/lib/features/design/surface/designLinks.js +64 -0
  322. package/lib/features/design/surface/designLinks.js.map +1 -0
  323. package/lib/features/design/surface/designPalette.js +24 -0
  324. package/lib/features/design/surface/designPalette.js.map +1 -0
  325. package/lib/features/design/surface/designRun.js +161 -0
  326. package/lib/features/design/surface/designRun.js.map +1 -0
  327. package/lib/features/design/surface/designTheme.js +119 -0
  328. package/lib/features/design/surface/designTheme.js.map +1 -0
  329. package/lib/features/design/surface/execStream.js +206 -0
  330. package/lib/features/design/surface/execStream.js.map +1 -0
  331. package/lib/features/design/surface/metaball.js +48 -0
  332. package/lib/features/design/surface/metaball.js.map +1 -0
  333. package/lib/features/design/surface/pickReferenceFiles.js +35 -0
  334. package/lib/features/design/surface/pickReferenceFiles.js.map +1 -0
  335. package/lib/features/design/surface/useDesignSurface.js +379 -0
  336. package/lib/features/design/surface/useDesignSurface.js.map +1 -0
  337. package/lib/features/docs/DocBlockRow.js +336 -0
  338. package/lib/features/docs/DocBlockRow.js.map +1 -0
  339. package/lib/features/docs/DocsEditorExperience.js +949 -0
  340. package/lib/features/docs/DocsEditorExperience.js.map +1 -0
  341. package/lib/features/docs/DocsToolbar.js +247 -0
  342. package/lib/features/docs/DocsToolbar.js.map +1 -0
  343. package/lib/features/docs/blocks.js +560 -0
  344. package/lib/features/docs/blocks.js.map +1 -0
  345. package/lib/features/docs/docArtifacts.js +129 -0
  346. package/lib/features/docs/docArtifacts.js.map +1 -0
  347. package/lib/features/docs/docEdits.js +201 -0
  348. package/lib/features/docs/docEdits.js.map +1 -0
  349. package/lib/features/docs/docExport.js +235 -0
  350. package/lib/features/docs/docExport.js.map +1 -0
  351. package/lib/features/docs/docShare.js +62 -0
  352. package/lib/features/docs/docShare.js.map +1 -0
  353. package/lib/features/links/openInApp.js +38 -2
  354. package/lib/features/links/openInApp.js.map +1 -1
  355. package/lib/routes.json +54 -0
  356. package/lib/screens/DesignNative/index.js +35 -0
  357. package/lib/screens/DesignNative/index.js.map +1 -0
  358. package/package.json +3 -3
  359. package/lib/features/design/exportDesign.js +0 -133
  360. 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":"AAwBA,MAAM,cAAiB,GAAA,yDAAA;AAGhB,SAAS,iBAAiB,MAAwB,EAAA;AACvD,EAAO,OAAA,CAAA,wCAAA,EAA2C,kBAAmB,CAAA,MAAA,CAAO,IAAK,EAAC,CAAE,CAAA,OAAA,CAAQ,MAAQ,EAAA,GAAG,CAAC,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AAC5H;AAGO,SAAS,mBAAmB,GAAyB,EAAA;AAhC5D,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiCE,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,SAAS,GAAI,CAAA,KAAA,CAAM,YAAY,CAAE,CAAA,KAAA,CAAM,CAAC,CAAG,EAAA;AACpD,IAAA,MAAM,OAAM,EAAqD,GAAA,CAAA,EAAA,GAAA,oDAAA,CAAA,IAAA,CAAK,KAAK,CAA/D,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAmE,OAAnE,IAAuE,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,EAAA;AACnF,IAAA,IAAI,CAAC,GAAO,IAAA,CAAC,aAAc,CAAA,IAAA,CAAK,GAAG,CAAG,EAAA;AACtC,IAAM,MAAA,MAAA,GAAS,QAAO,EAAuB,GAAA,CAAA,EAAA,GAAA,sBAAA,CAAA,IAAA,CAAK,KAAK,CAAjC,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAqC,CAArC,CAAA,KAAA,IAAA,GAAA,EAAA,GAA2C,GAAG,CAAA;AACpE,IAAM,MAAA,MAAA,GAAS,sBAAuB,CAAA,IAAA,CAAK,KAAK,CAAA;AAChD,IAAA,KAAA,CAAM,IAAK,CAAA;AAAA,MACT,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AAEH,EAAO,OAAA,KAAA;AACT;AAGgB,SAAA,SAAA,CAAU,MAAgB,EAAA,MAAA,EAAgB,MAAyB,EAAA;AACjF,EAAA,OAAO,CAAM,GAAA,EAAA,MAAA,CAAO,IAAK,EAAA,CAAE,OAAQ,CAAA,gBAAA,EAAkB,GAAG,CAAC,CAAI,CAAA,EAAA,MAAM,CAAG,EAAA,MAAA,GAAS,MAAM,EAAE,CAAA,CAAA;AACzF;AAGgB,SAAA,WAAA,CAGb,KAAqB,EAAA,MAAA,EAAgB,MAAgC,EAAA;AACtE,EAAI,IAAA,CAAC,KAAM,CAAA,MAAA,EAAe,OAAA,MAAA;AAC1B,EAAA,MAAM,UAAU,KAAM,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,CAAE,WAAW,MAAM,CAAA;AACrD,EAAM,MAAA,IAAA,GAAO,OAAQ,CAAA,MAAA,GAAS,OAAU,GAAA,KAAA;AACxC,EAAA,OAAO,IAAK,CAAA,MAAA,CAAO,CAAC,IAAA,EAAM,CAAM,KAAA;AAC9B,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,CAAE,SAAS,MAAM,CAAA;AACpC,IAAA,MAAM,EAAK,GAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAExC,IAAI,IAAA,CAAA,GAAI,IAAW,OAAA,CAAA;AACnB,IAAA,IAAI,CAAM,KAAA,EAAA,KAAO,MAAU,IAAA,GAAA,GAAM,CAAE,CAAA,MAAA,GAAS,IAAK,CAAA,MAAA,GAAS,CAAE,CAAA,MAAA,GAAS,IAAK,CAAA,MAAA,CAAA,EAAgB,OAAA,CAAA;AAC1F,IAAO,OAAA,IAAA;AAAA,GACR,CAAA;AACH;AAIA,MAAM,WAA0C,GAAA,CAAC,CAAC,MAAA,EAAQ,wDAAwD,CAAG,EAAA,CAAC,QAAU,EAAA,yLAAyL,CAAG,EAAA,CAAC,MAAQ,EAAA,mHAAmH,GAAG,CAAC,WAAA,EAAa,oKAAoK,CAAA,EAAG,CAAC,QAAA,EAAU,gFAAgF,CAAA,EAAG,CAAC,UAAY,EAAA,oNAAoN,CAAG,EAAA,CAAC,SAAS,0HAA0H,CAAA,EAAG,CAAC,WAAA,EAAa,uSAAuS,CAAC,CAAA;AAGx2C,SAAS,YAAY,MAAuC,EAAA;AACjE,EAAM,MAAA,IAAA,GAAA,CAAQ,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,EAAA,EAAI,IAAK,EAAA;AACjC,EAAI,IAAA,CAAC,MAAa,OAAA,MAAA;AAClB,EAAW,KAAA,MAAA,CAAC,GAAK,EAAA,EAAE,CAAK,IAAA,WAAA,MAAiB,EAAG,CAAA,IAAA,CAAK,IAAI,CAAA,EAAU,OAAA,GAAA;AAC/D,EAAO,OAAA,MAAA;AACT;AAGA,MAAM,YAA4E,GAAA;AAAA,EAChF,GAAK,EAAA;AAAA,IACH,IAAM,EAAA,MAAA;AAAA,IACN,SAAW,EAAA,aAAA;AAAA,IACX,KAAO,EAAA,SAAA;AAAA,IACP,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,aAAA;AAAA,IACV,IAAM,EAAA,OAAA;AAAA,IACN,SAAW,EAAA,uBAAA;AAAA,IACX,MAAQ,EAAA,iBAAA;AAAA,IACR,IAAM,EAAA;AAAA,GACR;AAAA,EACA,OAAS,EAAA;AAAA,IACP,IAAM,EAAA,MAAA;AAAA,IACN,SAAW,EAAA,YAAA;AAAA,IACX,KAAO,EAAA,OAAA;AAAA,IACP,MAAQ,EAAA,OAAA;AAAA,IACR,QAAU,EAAA,OAAA;AAAA,IACV,IAAM,EAAA,WAAA;AAAA,IACN,SAAW,EAAA,sBAAA;AAAA,IACX,MAAQ,EAAA,SAAA;AAAA,IACR,IAAM,EAAA;AAAA;AAEV,CAAA;AAGA,MAAM,OAAqD,GAAA;AAAA,EACzD,GAAK,kBAAA,IAAI,GAAI,CAAA,CAAC,OAAS,EAAA,QAAA,EAAU,aAAe,EAAA,aAAA,EAAe,aAAe,EAAA,OAAA,EAAS,QAAU,EAAA,SAAA,EAAW,WAAa,EAAA,WAAA,EAAa,gBAAkB,EAAA,OAAA,EAAS,QAAU,EAAA,UAAA,EAAY,iBAAmB,EAAA,cAAA,EAAgB,SAAW,EAAA,qBAAA,EAAuB,aAAe,EAAA,iBAAA,EAAmB,YAAc,EAAA,aAAA,EAAe,eAAiB,EAAA,WAAW,CAAC,CAAA;AAAA,EACxV,OAAA,sBAAa,GAAI,CAAA,CAAC,cAAc,OAAS,EAAA,WAAA,EAAa,SAAW,EAAA,QAAQ,CAAC;AAC5E,CAAA;AAGgB,SAAA,aAAA,CAAc,QAA4B,QAA4C,EAAA;AACpG,EAAM,MAAA,IAAA,GAAA,CAAQ,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,EAAA,EAAI,IAAK,EAAA;AACjC,EAAA,IAAI,QAAQ,OAAQ,CAAA,QAAQ,EAAE,GAAI,CAAA,IAAI,GAAU,OAAA,IAAA;AAChD,EAAA,OAAO,YAAa,CAAA,QAAQ,CAAE,CAAA,WAAA,CAAY,IAAI,CAAC,CAAA;AACjD;AAGO,SAAS,SAAS,MAAmG,EAAA;AAC1H,EAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,GAAA,EAAK,KAAK,GAAI,CAAA,GAAA,EAAK,IAAK,CAAA,KAAA,CAAA,CAAO,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,GAAA,IAAO,GAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAC9E,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB"}
@@ -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":"AA2BO,MAAM,gBAIP,CAAC;AAAA,EACL,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,IAAA;AAAA,IACV,QAAU,EAAA,GAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA,SAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,GAAA;AAAA,IACV,GAAK,EAAA,GAAA;AAAA,IACL,UAAY,EAAA;AAAA;AAEhB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,QAAA;AAAA,EACJ,KAAO,EAAA,QAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,IAAA;AAAA,IACP,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,UAAA;AAAA,EACJ,KAAO,EAAA,UAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA;AAAA;AAEd,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,OAAA;AAAA,EACJ,KAAO,EAAA,OAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,IAAA;AAAA,IACP,QAAU,EAAA,GAAA;AAAA,IACV,QAAU,EAAA,IAAA;AAAA,IACV,GAAK,EAAA;AAAA;AAET,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,SAAA;AAAA,EACJ,KAAO,EAAA,SAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,GAAA;AAAA,IACP,QAAU,EAAA,GAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,GAAA;AAAA,IACP,GAAK,EAAA,GAAA;AAAA,IACL,QAAU,EAAA;AAAA;AAEd,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,GAAK,EAAA,EAAA;AAAA,IACL,QAAU,EAAA,GAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA,IAAA;AAAA,IACZ,QAAU,EAAA;AAAA;AAEd,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,SAAW,EAAA,CAAA;AAAA,IACX,QAAU,EAAA,GAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAG,EAAA;AAAA,EACD,EAAI,EAAA,MAAA;AAAA,EACJ,KAAO,EAAA,MAAA;AAAA,EACP,IAAM,EAAA;AAAA,IACJ,SAAW,EAAA;AAAA;AAEf,CAAC;AAGM,MAAM,cAA8B,GAAA;AAAA,EACzC,KAAO,EAAA,SAAA;AAAA,EACP,KAAO,EAAA,IAAA;AAAA,EACP,QAAU,EAAA,IAAA;AAAA,EACV,QAAU,EAAA,KAAA;AAAA,EACV,KAAO,EAAA;AACT;AAUO,SAAS,YAAY,CAAwC,EAAA;AAzIpE,EAAA,IAAA,EAAA;AA0IE,EAAI,IAAA,CAAC,CAAG,EAAA,OAAO,EAAC;AAChB,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,MAAM,IAAO,GAAA,CAAA,CAAE,MAAU,KAAA,CAAA,EAAA,GAAA,aAAA,CAAc,IAAK,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,EAAA,KAAO,CAAE,CAAA,MAAA,CAAQ,EAAE,CAAA,KAA7C,IAAgD,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA;AACzE,EAAI,IAAA,IAAA,IAAQ,EAAE,MAAQ,EAAA;AACpB,IAAM,MAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,IAAI,CAAG,EAAA,CAAA,CAAE,MAAO,CAAA,SAAS,CAAC,CAAA;AACrD,IAAM,MAAA,GAAA,GAAM,CAAC,CAA0B,KAAA,CAAA,IAAK,OAAO,IAAO,GAAA,CAAA,GAAA,CAAK,IAAI,CAAK,IAAA,CAAA;AACxE,IAAA,MAAM,MAAM,CAAC,CAAA,KAA0B,CAAK,IAAA,IAAA,GAAO,OAAO,CAAI,GAAA,CAAA;AAC9D,IAAM,MAAA,GAAA,GAAM,GAAI,CAAA,IAAA,CAAK,KAAK,CAAA;AAC1B,IAAM,MAAA,CAAA,GAAI,GAAI,CAAA,IAAA,CAAK,SAAS,CAAA;AAC5B,IAAM,MAAA,CAAA,GAAI,GAAI,CAAA,IAAA,CAAK,GAAG,CAAA;AACtB,IAAM,MAAA,CAAA,GAAI,GAAI,CAAA,IAAA,CAAK,UAAU,CAAA;AAC7B,IAAM,MAAA,CAAA,GAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,CAAA;AAC3B,IAAM,MAAA,CAAA,GAAI,GAAI,CAAA,IAAA,CAAK,QAAQ,CAAA;AAC3B,IAAI,IAAA,GAAA,MAAS,IAAK,CAAA;AAAA,MAChB,EAAI,EAAA,OAAA;AAAA,MACJ,CAAG,EAAA;AAAA,KACJ,CAAA;AACD,IAAI,IAAA,CAAA,MAAO,IAAK,CAAA;AAAA,MACd,EAAI,EAAA,WAAA;AAAA,MACJ,CAAG,EAAA;AAAA,KACJ,CAAA;AACD,IAAI,IAAA,CAAA,MAAO,IAAK,CAAA;AAAA,MACd,EAAI,EAAA,KAAA;AAAA,MACJ,CAAG,EAAA;AAAA,KACJ,CAAA;AACD,IAAA,IAAI,CAAK,IAAA,IAAA,IAAQ,CAAM,KAAA,CAAA,MAAO,IAAK,CAAA;AAAA,MACjC,EAAI,EAAA,YAAA;AAAA,MACJ,CAAG,EAAA;AAAA,KACJ,CAAA;AACD,IAAA,IAAI,CAAK,IAAA,IAAA,IAAQ,CAAM,KAAA,CAAA,MAAO,IAAK,CAAA;AAAA,MACjC,EAAI,EAAA,UAAA;AAAA,MACJ,CAAG,EAAA;AAAA,KACJ,CAAA;AACD,IAAA,IAAI,CAAK,IAAA,IAAA,IAAQ,CAAM,KAAA,CAAA,MAAO,IAAK,CAAA;AAAA,MACjC,EAAI,EAAA,UAAA;AAAA,MACJ,CAAG,EAAA;AAAA,KACJ,CAAA;AAAA;AAEH,EAAA,IAAI,EAAE,UAAc,IAAA,IAAA,IAAQ,EAAE,UAAe,KAAA,CAAA,MAAO,IAAK,CAAA;AAAA,IACvD,EAAI,EAAA,YAAA;AAAA,IACJ,GAAG,CAAE,CAAA;AAAA,GACN,CAAA;AACD,EAAA,IAAI,EAAE,QAAY,IAAA,IAAA,IAAQ,EAAE,QAAa,KAAA,CAAA,MAAO,IAAK,CAAA;AAAA,IACnD,EAAI,EAAA,UAAA;AAAA,IACJ,GAAG,CAAE,CAAA;AAAA,GACN,CAAA;AACD,EAAA,IAAI,EAAE,UAAc,IAAA,IAAA,IAAQ,EAAE,UAAe,KAAA,CAAA,MAAO,IAAK,CAAA;AAAA,IACvD,EAAI,EAAA,UAAA;AAAA,IACJ,GAAG,CAAE,CAAA;AAAA,GACN,CAAA;AACD,EAAO,OAAA,GAAA;AACT;AAIA,MAAM,WAAmB,CAAC,CAAC,GAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAG,EAAA,CAAC,GAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAG,EAAA,CAAC,GAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAClE,SAAS,SAAS,CAAqB,EAAA;AACrC,EAAA,QAAQ,EAAE,EAAI;AAAA,IACZ,KAAK,OACH,EAAA;AACE,MAAM,MAAA,CAAA,GAAI,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,CAAA,EAAG,CAAE,CAAA,CAAC,CAAC,CAAA;AAC1C,MAAA,OAAO,CAAC,CAAC,KAAA,GAAQ,KAAQ,GAAA,CAAA,EAAG,QAAQ,KAAQ,GAAA,CAAA,EAAG,KAAQ,GAAA,KAAA,GAAQ,GAAG,CAAC,CAAA,EAAG,CAAC,KAAA,GAAQ,QAAQ,CAAG,EAAA,KAAA,GAAQ,KAAQ,GAAA,CAAA,EAAG,QAAQ,KAAQ,GAAA,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,KAAQ,GAAA,KAAA,GAAQ,CAAG,EAAA,KAAA,GAAQ,QAAQ,CAAG,EAAA,KAAA,GAAQ,KAAQ,GAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAClM,IACF,KAAK,WACH,EAAA;AACE,MAAM,MAAA,CAAA,GAAI,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,CAAA,EAAG,CAAE,CAAA,CAAC,CAAC,CAAA;AAC1C,MAAA,OAAO,CAAC,CAAC,MAAA,GAAS,MAAS,GAAA,CAAA,EAAG,SAAS,MAAS,GAAA,CAAA,EAAG,MAAS,GAAA,MAAA,GAAS,GAAG,CAAC,CAAA,EAAG,CAAC,MAAA,GAAS,SAAS,CAAG,EAAA,MAAA,GAAS,MAAS,GAAA,CAAA,EAAG,SAAS,MAAS,GAAA,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,MAAS,GAAA,MAAA,GAAS,CAAG,EAAA,MAAA,GAAS,SAAS,CAAG,EAAA,MAAA,GAAS,MAAS,GAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AACpN,IACF,KAAK,UACH,EAAA;AACE,MAAA,MAAM,CAAI,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAC,CAAA;AACzB,MAAA,OAAO,CAAC,CAAC,KAAA,GAAQ,KAAQ,GAAA,CAAA,EAAG,QAAQ,KAAQ,GAAA,CAAA,EAAG,KAAQ,GAAA,KAAA,GAAQ,GAAG,CAAC,CAAA,EAAG,CAAC,KAAA,GAAQ,QAAQ,CAAG,EAAA,KAAA,GAAQ,KAAQ,GAAA,CAAA,EAAG,QAAQ,KAAQ,GAAA,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,KAAQ,GAAA,KAAA,GAAQ,CAAG,EAAA,KAAA,GAAQ,QAAQ,CAAG,EAAA,KAAA,GAAQ,KAAQ,GAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA;AAClM,IACF,KAAK,KACH,EAAA;AACE,MAAA,MAAM,CAAI,GAAA,CAAA,CAAE,CAAI,GAAA,IAAA,CAAK,EAAK,GAAA,GAAA;AAC1B,MAAM,MAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA;AACpB,MAAM,MAAA,CAAA,GAAI,IAAK,CAAA,GAAA,CAAI,CAAC,CAAA;AACpB,MAAO,OAAA,CAAC,CAAC,KAAA,GAAQ,CAAI,GAAA,KAAA,GAAQ,IAAI,KAAO,EAAA,KAAA,GAAQ,CAAI,GAAA,KAAA,GAAQ,CAAI,GAAA,KAAA,EAAO,QAAQ,CAAI,GAAA,KAAA,GAAQ,CAAI,GAAA,KAAA,EAAO,CAAC,CAAA,EAAG,CAAC,KAAA,GAAQ,CAAI,GAAA,KAAA,GAAQ,CAAI,GAAA,KAAA,EAAO,KAAQ,GAAA,CAAA,GAAI,QAAQ,CAAI,GAAA,IAAA,EAAM,KAAQ,GAAA,CAAA,GAAI,KAAQ,GAAA,CAAA,GAAI,OAAO,CAAC,CAAA,EAAG,CAAC,KAAA,GAAQ,CAAI,GAAA,KAAA,GAAQ,IAAI,KAAO,EAAA,KAAA,GAAQ,CAAI,GAAA,KAAA,GAAQ,CAAI,GAAA,KAAA,EAAO,KAAQ,GAAA,CAAA,GAAI,KAAQ,GAAA,CAAA,GAAI,KAAO,EAAA,CAAC,CAAC,CAAA;AAAA;AAC7S,IACF,KAAK,YAAA;AACH,MAAO,OAAA,CAAC,CAAC,CAAE,CAAA,CAAA,EAAG,GAAG,CAAG,EAAA,CAAC,GAAG,CAAC,CAAA,EAAG,EAAE,CAAG,EAAA,CAAA,EAAG,CAAC,CAAG,EAAA,CAAC,GAAG,CAAG,EAAA,CAAA,CAAE,CAAG,EAAA,CAAC,CAAC,CAAA;AAAA,IACxD,KAAK,UACH,EAAA;AACE,MAAM,MAAA,CAAA,GAAI,GAAM,GAAA,GAAA,GAAM,CAAE,CAAA,CAAA;AACxB,MAAO,OAAA,CAAC,CAAC,CAAE,CAAA,CAAA,EAAG,GAAG,CAAG,EAAA,CAAC,GAAG,CAAC,CAAA,EAAG,EAAE,CAAG,EAAA,CAAA,EAAG,CAAC,CAAG,EAAA,CAAC,GAAG,CAAG,EAAA,CAAA,CAAE,CAAG,EAAA,CAAC,CAAC,CAAA;AAAA;AACxD,IACF;AACE,MAAO,OAAA,QAAA;AAAA;AAEb;AAGA,SAAS,OAAA,CAAQ,GAAW,CAAmB,EAAA;AAC7C,EAAA,OAAO,CAAC,CAAA,EAAG,CAAG,EAAA,CAAC,CAAE,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAC,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,IAAI,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA,EAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAE,CAAA,CAAC,EAAE,CAAC,CAAA,GAAI,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,GAAG,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAE,CAAA,CAAC,CAAI,GAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAC,CAAA;AAClR;AAGO,SAAS,kBAAkB,CAA6C,EAAA;AAC7E,EAAM,MAAA,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,EAAI,IAAA,CAAC,KAAM,CAAA,MAAA,EAAe,OAAA,IAAA;AAC1B,EAAA,MAAM,CAAI,GAAA,KAAA,CAAM,MAAe,CAAA,CAAC,GAAK,EAAA,CAAA,KAAM,OAAQ,CAAA,QAAA,CAAS,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,QAAQ,CAAA;AAC9E,EAAA,MAAM,QAAQ,CAAC,CAAA,KAAc,KAAK,KAAM,CAAA,CAAA,GAAI,GAAK,CAAI,GAAA,GAAA;AACrD,EAAA,OAAO,CAAC,GAAG,CAAE,CAAA,CAAC,CAAE,CAAA,KAAA,CAAM,CAAG,EAAA,CAAC,CAAE,CAAA,GAAA,CAAI,KAAK,CAAA,EAAG,CAAG,EAAA,KAAA,CAAM,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,KAAK,CAAA,EAAG,CAAG,EAAA,KAAA,CAAM,CAAE,CAAA,CAAC,CAAE,CAAA,CAAC,CAAC,CAAA,EAAG,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,KAAM,CAAA,CAAA,EAAG,CAAC,CAAA,CAAE,GAAI,CAAA,KAAK,CAAG,EAAA,CAAA,EAAG,KAAM,CAAA,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AAChL;AAGO,SAAS,UAAU,CAAqC,EAAA;AAC7D,EAAA,OAAO,QAAQ,iBAAkB,CAAA,CAAC,CAAC,CAAK,IAAA,OAAA,CAAQ,uBAAG,QAAQ,CAAA;AAC7D;AAGO,SAAS,YAAY,CAAqD,EAAA;AAC/E,EAAI,IAAA,CAAC,GAAU,OAAA,MAAA;AACf,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAI,IAAA,CAAA,CAAE,UAAU,CAAE,CAAA,MAAA,CAAO,YAAY,CAAG,EAAA,GAAA,CAAI,SAAS,CAAE,CAAA,MAAA;AACvD,EAAI,IAAA,CAAA,CAAE,cAAc,IAAQ,IAAA,CAAA,CAAE,eAAe,CAAG,EAAA,GAAA,CAAI,aAAa,CAAE,CAAA,UAAA;AACnE,EAAI,IAAA,CAAA,CAAE,YAAY,IAAQ,IAAA,CAAA,CAAE,aAAa,CAAG,EAAA,GAAA,CAAI,WAAW,CAAE,CAAA,QAAA;AAC7D,EAAI,IAAA,CAAA,CAAE,cAAc,IAAQ,IAAA,CAAA,CAAE,eAAe,CAAG,EAAA,GAAA,CAAI,aAAa,CAAE,CAAA,UAAA;AACnE,EAAA,IAAI,CAAE,CAAA,QAAA,EAAc,GAAA,CAAA,QAAA,GAAW,CAAE,CAAA,QAAA;AACjC,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,GAAM,GAAA,MAAA;AACzC"}
@@ -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