@adminide-stack/yantra-mobile 12.0.128 → 12.0.129-alpha.1

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