@adminide-stack/yantra-mobile 12.0.129-alpha.0 → 12.0.129

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,397 @@
1
+ import {isStrokeShape}from'./shapes.js';import {newPageId,newLayerId,DEFAULT_TEXT_COLOR}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
+ const COALESCE_MS = 700;
21
+ function initEditorState(doc) {
22
+ var _a, _b;
23
+ return {
24
+ doc,
25
+ pageId: (_b = (_a = doc.pages[0]) == null ? void 0 : _a.id) != null ? _b : "",
26
+ layerId: null,
27
+ past: [],
28
+ future: [],
29
+ lastEdit: null
30
+ };
31
+ }
32
+ function currentPage(state) {
33
+ var _a;
34
+ return (_a = state.doc.pages.find((p) => p.id === state.pageId)) != null ? _a : state.doc.pages[0];
35
+ }
36
+ function selectedLayer(state) {
37
+ var _a, _b;
38
+ if (!state.layerId) return void 0;
39
+ return (_b = (_a = currentPage(state)) == null ? void 0 : _a.layers) == null ? void 0 : _b.find((l) => l.id === state.layerId);
40
+ }
41
+ function mapPage(doc, pageId, fn) {
42
+ return __spreadProps(__spreadValues({}, doc), {
43
+ pages: doc.pages.map((p) => p.id === pageId ? fn(p) : p)
44
+ });
45
+ }
46
+ function mapLayers(doc, pageId, fn) {
47
+ return mapPage(doc, pageId, (p) => {
48
+ var _a;
49
+ return __spreadProps(__spreadValues({}, p), {
50
+ layers: fn((_a = p.layers) != null ? _a : [])
51
+ });
52
+ });
53
+ }
54
+ function cloneLayer(layer) {
55
+ const copy = JSON.parse(JSON.stringify(layer));
56
+ return __spreadProps(__spreadValues({}, copy), {
57
+ id: newLayerId()
58
+ });
59
+ }
60
+ function commit(state, doc, extra = {}, coalesce, at = Date.now()) {
61
+ var _a;
62
+ if (doc === state.doc) return __spreadValues(__spreadValues({}, state), extra);
63
+ const joins = coalesce !== void 0 && ((_a = state.lastEdit) == null ? void 0 : _a.key) === coalesce && at - state.lastEdit.at <= COALESCE_MS && state.past.length > 0;
64
+ const past = joins ? state.past : [...state.past, state.doc].slice(-60);
65
+ return __spreadProps(__spreadValues(__spreadValues({}, state), extra), {
66
+ doc,
67
+ past,
68
+ future: [],
69
+ lastEdit: coalesce !== void 0 ? {
70
+ key: coalesce,
71
+ at
72
+ } : null
73
+ });
74
+ }
75
+ function editorReducer(state, action) {
76
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o;
77
+ const {
78
+ doc
79
+ } = state;
80
+ switch (action.type) {
81
+ case "select": {
82
+ const pageId = (_a = action.pageId) != null ? _a : state.pageId;
83
+ return __spreadProps(__spreadValues({}, state), {
84
+ pageId,
85
+ layerId: action.layerId,
86
+ lastEdit: null
87
+ });
88
+ }
89
+ case "patchLayer": {
90
+ const next = mapLayers(doc, action.pageId, (layers) => layers.map((l) => l.id === action.layerId ? __spreadValues(__spreadValues({}, l), action.patch) : l));
91
+ if (action.silent) return __spreadProps(__spreadValues({}, state), {
92
+ doc: next
93
+ });
94
+ return commit(state, next, {}, (_b = action.coalesce) != null ? _b : `layer:${action.layerId}`, action.at);
95
+ }
96
+ case "addLayer":
97
+ return commit(state, mapLayers(doc, action.pageId, (layers) => [...layers, action.layer]), {
98
+ pageId: action.pageId,
99
+ layerId: action.layer.id
100
+ });
101
+ case "deleteLayer": {
102
+ const layer = (_d = (_c = doc.pages.find((p) => p.id === action.pageId)) == null ? void 0 : _c.layers) == null ? void 0 : _d.find((l) => l.id === action.layerId);
103
+ if (!layer || layer.locked) return state;
104
+ const next = mapLayers(doc, action.pageId, (layers) => layers.filter((l) => l.id !== action.layerId));
105
+ return commit(state, next, {
106
+ layerId: state.layerId === action.layerId ? null : state.layerId
107
+ });
108
+ }
109
+ case "duplicateLayer": {
110
+ const layers = (_f = (_e = doc.pages.find((p) => p.id === action.pageId)) == null ? void 0 : _e.layers) != null ? _f : [];
111
+ const index = layers.findIndex((l) => l.id === action.layerId);
112
+ if (index < 0) return state;
113
+ const source = layers[index];
114
+ const copy = __spreadProps(__spreadValues({}, cloneLayer(source)), {
115
+ x: Math.min(1 - source.w, source.x + 0.03),
116
+ y: Math.min(1 - source.h, source.y + 0.03),
117
+ locked: void 0
118
+ });
119
+ const next = mapLayers(doc, action.pageId, (all) => [...all.slice(0, index + 1), copy, ...all.slice(index + 1)]);
120
+ return commit(state, next, {
121
+ layerId: copy.id
122
+ });
123
+ }
124
+ case "reorderLayer": {
125
+ const layers = (_h = (_g = doc.pages.find((p) => p.id === action.pageId)) == null ? void 0 : _g.layers) != null ? _h : [];
126
+ const index = layers.findIndex((l) => l.id === action.layerId);
127
+ if (index < 0) return state;
128
+ const target = action.move === "front" ? layers.length - 1 : action.move === "back" ? 0 : action.move === "forward" ? Math.min(layers.length - 1, index + 1) : Math.max(0, index - 1);
129
+ if (target === index) return state;
130
+ const reordered = [...layers];
131
+ const [moved] = reordered.splice(index, 1);
132
+ reordered.splice(target, 0, moved);
133
+ return commit(state, mapLayers(doc, action.pageId, () => reordered));
134
+ }
135
+ case "setBackground":
136
+ return commit(state, mapPage(doc, action.pageId, (p) => __spreadProps(__spreadValues({}, p), {
137
+ background: action.background
138
+ })), {}, action.coalesce, action.at);
139
+ case "addPage": {
140
+ const page = {
141
+ id: newPageId(),
142
+ name: "",
143
+ prompt: "",
144
+ src: null,
145
+ status: "ready",
146
+ role: "content",
147
+ // A blank white sheet, like web's Add page.
148
+ background: {
149
+ kind: "color",
150
+ color: "#ffffff"
151
+ },
152
+ layers: []
153
+ };
154
+ return insertPagesInto(state, [page], action.afterId);
155
+ }
156
+ case "insertPages":
157
+ return action.pages.length ? insertPagesInto(state, action.pages, action.afterId) : state;
158
+ case "duplicatePage": {
159
+ const index = doc.pages.findIndex((p) => p.id === action.pageId);
160
+ if (index < 0) return state;
161
+ const source = doc.pages[index];
162
+ const page = __spreadProps(__spreadValues({}, source), {
163
+ id: newPageId(),
164
+ layers: (_i = source.layers) == null ? void 0 : _i.map(cloneLayer)
165
+ });
166
+ const pages = [...doc.pages];
167
+ pages.splice(index + 1, 0, page);
168
+ return commit(state, __spreadProps(__spreadValues({}, doc), {
169
+ pages
170
+ }), {
171
+ pageId: page.id,
172
+ layerId: null
173
+ });
174
+ }
175
+ case "deletePage": {
176
+ if (doc.pages.length <= 1) return state;
177
+ const index = doc.pages.findIndex((p) => p.id === action.pageId);
178
+ if (index < 0) return state;
179
+ const pages = doc.pages.filter((p) => p.id !== action.pageId);
180
+ const pageId = state.pageId === action.pageId ? pages[Math.min(index, pages.length - 1)].id : state.pageId;
181
+ return commit(state, __spreadProps(__spreadValues({}, doc), {
182
+ pages
183
+ }), {
184
+ pageId,
185
+ layerId: null
186
+ });
187
+ }
188
+ case "movePage": {
189
+ const index = doc.pages.findIndex((p) => p.id === action.pageId);
190
+ const target = index + action.dir;
191
+ if (index < 0 || target < 0 || target >= doc.pages.length) return state;
192
+ const pages = [...doc.pages];
193
+ [pages[index], pages[target]] = [pages[target], pages[index]];
194
+ return commit(state, __spreadProps(__spreadValues({}, doc), {
195
+ pages
196
+ }));
197
+ }
198
+ case "movePageTo": {
199
+ const from = doc.pages.findIndex((p) => p.id === action.pageId);
200
+ const to = Math.max(0, Math.min(doc.pages.length - 1, Math.round(action.index)));
201
+ if (from < 0 || from === to) return state;
202
+ const pages = [...doc.pages];
203
+ const [moved] = pages.splice(from, 1);
204
+ pages.splice(to, 0, moved);
205
+ return commit(state, __spreadProps(__spreadValues({}, doc), {
206
+ pages
207
+ }));
208
+ }
209
+ case "replacePage": {
210
+ if (!doc.pages.some((p) => p.id === action.page.id)) return state;
211
+ const next = mapPage(doc, action.page.id, () => action.page);
212
+ if (action.silent) return __spreadProps(__spreadValues({}, state), {
213
+ doc: next
214
+ });
215
+ return commit(state, next, {
216
+ layerId: null
217
+ });
218
+ }
219
+ case "patchDoc":
220
+ return commit(state, __spreadValues(__spreadValues({}, doc), action.patch), {}, action.coalesce, action.at);
221
+ case "replaceDoc":
222
+ return commit(state, action.doc, {
223
+ pageId: (_k = (_j = action.doc.pages[0]) == null ? void 0 : _j.id) != null ? _k : "",
224
+ layerId: null
225
+ });
226
+ case "undo": {
227
+ const prev = state.past[state.past.length - 1];
228
+ if (!prev) return state;
229
+ return __spreadProps(__spreadValues({}, state), {
230
+ doc: prev,
231
+ past: state.past.slice(0, -1),
232
+ future: [state.doc, ...state.future],
233
+ pageId: prev.pages.some((p) => p.id === state.pageId) ? state.pageId : (_m = (_l = prev.pages[0]) == null ? void 0 : _l.id) != null ? _m : "",
234
+ layerId: null,
235
+ lastEdit: null
236
+ });
237
+ }
238
+ case "redo": {
239
+ const next = state.future[0];
240
+ if (!next) return state;
241
+ return __spreadProps(__spreadValues({}, state), {
242
+ doc: next,
243
+ past: [...state.past, state.doc],
244
+ future: state.future.slice(1),
245
+ pageId: next.pages.some((p) => p.id === state.pageId) ? state.pageId : (_o = (_n = next.pages[0]) == null ? void 0 : _n.id) != null ? _o : "",
246
+ layerId: null,
247
+ lastEdit: null
248
+ });
249
+ }
250
+ default:
251
+ return state;
252
+ }
253
+ }
254
+ function insertPagesInto(state, pages, afterId) {
255
+ const {
256
+ doc
257
+ } = state;
258
+ const index = afterId ? doc.pages.findIndex((p) => p.id === afterId) : -1;
259
+ const at = index >= 0 ? index + 1 : doc.pages.length;
260
+ const next = [...doc.pages];
261
+ next.splice(at, 0, ...pages);
262
+ return commit(state, __spreadProps(__spreadValues({}, doc), {
263
+ pages: next
264
+ }), {
265
+ pageId: pages[0].id,
266
+ layerId: null
267
+ });
268
+ }
269
+ const TEXT_PRESETS = {
270
+ heading: {
271
+ content: "Add a heading",
272
+ fontSizeFrac: 0.09,
273
+ fontWeight: 700,
274
+ fontToken: "display"
275
+ },
276
+ subheading: {
277
+ content: "Add a subheading",
278
+ fontSizeFrac: 0.055,
279
+ fontWeight: 600,
280
+ fontToken: "display"
281
+ },
282
+ body: {
283
+ content: "Add a little bit of body text",
284
+ fontSizeFrac: 0.03,
285
+ fontWeight: 400,
286
+ fontToken: "body"
287
+ }
288
+ };
289
+ function makeTextBox() {
290
+ return __spreadProps(__spreadValues({}, makeTextLayer("body")), {
291
+ content: "Your text here",
292
+ fontSizeFrac: 0.04
293
+ });
294
+ }
295
+ function makeStickerLayer(emoji, pageW, pageH) {
296
+ const w = 0.28;
297
+ const h = w * pageW / pageH;
298
+ return __spreadProps(__spreadValues({}, makeTextLayer("body")), {
299
+ content: emoji,
300
+ x: (1 - w) / 2,
301
+ y: (1 - h) / 2,
302
+ w,
303
+ h,
304
+ fontSizeFrac: w * 0.8,
305
+ align: "center",
306
+ lineHeight: 1.1
307
+ });
308
+ }
309
+ function makeTextLayer(preset) {
310
+ const p = TEXT_PRESETS[preset];
311
+ return {
312
+ id: newLayerId(),
313
+ kind: "text",
314
+ content: p.content,
315
+ x: 0.1,
316
+ y: 0.4,
317
+ w: 0.8,
318
+ h: 0.12,
319
+ fontToken: p.fontToken,
320
+ fontWeight: p.fontWeight,
321
+ fontSizeFrac: p.fontSizeFrac,
322
+ color: DEFAULT_TEXT_COLOR,
323
+ align: "left",
324
+ lineHeight: 1.2
325
+ };
326
+ }
327
+ function makeShapeLayer(shape, palette) {
328
+ var _a;
329
+ const isLine = isStrokeShape(shape);
330
+ return __spreadValues({
331
+ id: newLayerId(),
332
+ kind: "shape",
333
+ shape,
334
+ x: 0.2,
335
+ y: 0.4,
336
+ w: isLine ? 0.5 : 0.3,
337
+ h: isLine ? 0.05 : 0.3,
338
+ fill: (_a = palette == null ? void 0 : palette.primary) != null ? _a : "#38bdf8",
339
+ radiusFrac: shape === "rect" ? 0.08 : 0,
340
+ opacity: 1
341
+ }, isLine ? {
342
+ strokeWidthFrac: 8e-3
343
+ } : {});
344
+ }
345
+ const CHART_SAMPLE = {
346
+ categories: ["Jan", "Feb", "Mar"],
347
+ series: [{
348
+ name: "Desktop",
349
+ values: [4e3, 3200, 2200]
350
+ }, {
351
+ name: "Mobile",
352
+ values: [2500, 1700, 1200]
353
+ }]
354
+ };
355
+ function makeChartLayer(chart, palette) {
356
+ var _a, _b;
357
+ return {
358
+ id: newLayerId(),
359
+ kind: "chart",
360
+ chart,
361
+ x: 0.15,
362
+ y: 0.3,
363
+ w: 0.7,
364
+ h: 0.45,
365
+ categories: [...CHART_SAMPLE.categories],
366
+ series: CHART_SAMPLE.series.map((s) => ({
367
+ name: s.name,
368
+ values: [...s.values]
369
+ })),
370
+ // The legacy single-series mirror a connector without `series` still reads.
371
+ data: CHART_SAMPLE.categories.map((label, i) => ({
372
+ label,
373
+ value: CHART_SAMPLE.series[0].values[i]
374
+ })),
375
+ colors: [(_a = palette == null ? void 0 : palette.primary) != null ? _a : "#38bdf8", (_b = palette == null ? void 0 : palette.muted) != null ? _b : "#818cf8", "#f472b6", "#fbbf24"],
376
+ opacity: 1
377
+ };
378
+ }
379
+ function makeImageLayer(src, pageW, pageH, size) {
380
+ const imgW = size && size.width > 0 ? size.width : 1;
381
+ const imgH = size && size.height > 0 ? size.height : 1;
382
+ const scale = 0.5 * Math.min(pageW / imgW, pageH / imgH);
383
+ const w = imgW * scale / pageW;
384
+ const h = imgH * scale / pageH;
385
+ return {
386
+ id: newLayerId(),
387
+ kind: "image",
388
+ prompt: "",
389
+ src,
390
+ imageStatus: "ready",
391
+ uploaded: true,
392
+ x: (1 - w) / 2,
393
+ y: (1 - h) / 2,
394
+ w,
395
+ h
396
+ };
397
+ }export{COALESCE_MS,TEXT_PRESETS,currentPage,editorReducer,initEditorState,makeChartLayer,makeImageLayer,makeShapeLayer,makeStickerLayer,makeTextBox,makeTextLayer,selectedLayer};//# sourceMappingURL=docOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docOps.js","sources":["../../../../src/features/design/doc/docOps.ts"],"sourcesContent":["/**\n * The editor's document state and every edit it makes - native twin of the\n * reducer in canvas-surface `editors/carousel-editor/state.tsx`.\n *\n * One reducer, so undo is one stack: every action that changes the document\n * pushes the previous one, except a burst of the same edit (a drag, typing,\n * a slider) which coalesces into the step that started it - one undo puts a\n * dragged layer back where the drag began, not one frame earlier.\n *\n * Layer factories carry the web's defaults (TEXT_PRESETS, makeShapeLayer,\n * makeChartLayer), so a heading added on the phone matches one added on web.\n *\n * Pure: runs under jest as-is.\n */\nimport { isStrokeShape, type ShapeKind } from './shapes';\nimport {\n DEFAULT_TEXT_COLOR,\n newLayerId,\n newPageId,\n type ChartKind,\n type ChartLayer,\n type DesignDoc,\n type DesignPage,\n type EditorLayer,\n type ImageLayer,\n type PageBackground,\n type ShapeLayer,\n type TextLayer,\n} from './types';\n\n/** Undo keeps this many steps; a long session must not hold every keystroke's document. */\nexport const HISTORY_LIMIT = 60;\n/** Edits with the same key this close together are one undo step. */\nexport const COALESCE_MS = 700;\n\nexport interface EditorState {\n doc: DesignDoc;\n pageId: string;\n layerId: string | null;\n past: DesignDoc[];\n future: DesignDoc[];\n /** The last coalescing edit: its key and when it landed. */\n lastEdit: { key: string; at: number } | null;\n}\n\nexport type LayerOrderMove = 'forward' | 'backward' | 'front' | 'back';\n\nexport type EditorAction =\n | { type: 'select'; pageId?: string; layerId: string | null }\n | {\n type: 'patchLayer';\n pageId: string;\n layerId: string;\n patch: Partial<EditorLayer>;\n coalesce?: string;\n at?: number;\n /** Not an undo step: an upload swapping its hosted URL in for the local pick. */\n silent?: boolean;\n }\n | { type: 'addLayer'; pageId: string; layer: EditorLayer }\n | { type: 'deleteLayer'; pageId: string; layerId: string }\n | { type: 'duplicateLayer'; pageId: string; layerId: string }\n | { type: 'reorderLayer'; pageId: string; layerId: string; move: LayerOrderMove }\n | { type: 'setBackground'; pageId: string; background: PageBackground; coalesce?: string; at?: number }\n | { type: 'addPage'; afterId?: string }\n | { type: 'insertPages'; afterId?: string; pages: DesignPage[] }\n | { type: 'duplicatePage'; pageId: string }\n | { type: 'deletePage'; pageId: string }\n | { type: 'movePage'; pageId: string; dir: -1 | 1 }\n /** A page dragged to a new place in the rail (web PageRail drag). */\n | { type: 'movePageTo'; pageId: string; index: number }\n /** One page's content swapped whole (an AI edit); `silent` for a picture landing after it. */\n | { type: 'replacePage'; page: DesignPage; silent?: boolean }\n | { type: 'patchDoc'; patch: Partial<DesignDoc>; coalesce?: string; at?: number }\n | { type: 'replaceDoc'; doc: DesignDoc }\n | { type: 'undo' }\n | { type: 'redo' };\n\nexport function initEditorState(doc: DesignDoc): EditorState {\n return { doc, pageId: doc.pages[0]?.id ?? '', layerId: null, past: [], future: [], lastEdit: null };\n}\n\nexport function currentPage(state: Pick<EditorState, 'doc' | 'pageId'>): DesignPage | undefined {\n return state.doc.pages.find((p) => p.id === state.pageId) ?? state.doc.pages[0];\n}\n\nexport function selectedLayer(state: Pick<EditorState, 'doc' | 'pageId' | 'layerId'>): EditorLayer | undefined {\n if (!state.layerId) return undefined;\n return currentPage(state)?.layers?.find((l) => l.id === state.layerId);\n}\n\nfunction mapPage(doc: DesignDoc, pageId: string, fn: (page: DesignPage) => DesignPage): DesignDoc {\n return { ...doc, pages: doc.pages.map((p) => (p.id === pageId ? fn(p) : p)) };\n}\n\nfunction mapLayers(doc: DesignDoc, pageId: string, fn: (layers: EditorLayer[]) => EditorLayer[]): DesignDoc {\n return mapPage(doc, pageId, (p) => ({ ...p, layers: fn(p.layers ?? []) }));\n}\n\n/** A layer copy with fresh ids, nested chart arrays cloned so the two never share one. */\nfunction cloneLayer(layer: EditorLayer): EditorLayer {\n const copy = JSON.parse(JSON.stringify(layer)) as EditorLayer;\n return { ...copy, id: newLayerId() };\n}\n\n/**\n * Commit `doc` as the next document. `coalesce` joins it to the step before\n * when that step had the same key and landed within COALESCE_MS.\n */\nfunction commit(\n state: EditorState,\n doc: DesignDoc,\n extra: Partial<EditorState> = {},\n coalesce?: string,\n at: number = Date.now(),\n): EditorState {\n if (doc === state.doc) return { ...state, ...extra };\n const joins =\n coalesce !== undefined &&\n state.lastEdit?.key === coalesce &&\n at - state.lastEdit.at <= COALESCE_MS &&\n state.past.length > 0;\n const past = joins ? state.past : [...state.past, state.doc].slice(-HISTORY_LIMIT);\n return {\n ...state,\n ...extra,\n doc,\n past,\n future: [],\n lastEdit: coalesce !== undefined ? { key: coalesce, at } : null,\n };\n}\n\nexport function editorReducer(state: EditorState, action: EditorAction): EditorState {\n const { doc } = state;\n switch (action.type) {\n case 'select': {\n const pageId = action.pageId ?? state.pageId;\n return { ...state, pageId, layerId: action.layerId, lastEdit: null };\n }\n case 'patchLayer': {\n const next = mapLayers(doc, action.pageId, (layers) =>\n layers.map((l) => (l.id === action.layerId ? ({ ...l, ...action.patch } as EditorLayer) : l)),\n );\n if (action.silent) return { ...state, doc: next };\n return commit(state, next, {}, action.coalesce ?? `layer:${action.layerId}`, action.at);\n }\n case 'addLayer':\n return commit(\n state,\n mapLayers(doc, action.pageId, (layers) => [...layers, action.layer]),\n {\n pageId: action.pageId,\n layerId: action.layer.id,\n },\n );\n case 'deleteLayer': {\n const layer = doc.pages.find((p) => p.id === action.pageId)?.layers?.find((l) => l.id === action.layerId);\n if (!layer || layer.locked) return state;\n const next = mapLayers(doc, action.pageId, (layers) => layers.filter((l) => l.id !== action.layerId));\n return commit(state, next, { layerId: state.layerId === action.layerId ? null : state.layerId });\n }\n case 'duplicateLayer': {\n const layers = doc.pages.find((p) => p.id === action.pageId)?.layers ?? [];\n const index = layers.findIndex((l) => l.id === action.layerId);\n if (index < 0) return state;\n const source = layers[index];\n // Nudged down-right like web's Duplicate, kept on the page.\n const copy = {\n ...cloneLayer(source),\n x: Math.min(1 - source.w, source.x + 0.03),\n y: Math.min(1 - source.h, source.y + 0.03),\n locked: undefined,\n } as EditorLayer;\n const next = mapLayers(doc, action.pageId, (all) => [\n ...all.slice(0, index + 1),\n copy,\n ...all.slice(index + 1),\n ]);\n return commit(state, next, { layerId: copy.id });\n }\n case 'reorderLayer': {\n const layers = doc.pages.find((p) => p.id === action.pageId)?.layers ?? [];\n const index = layers.findIndex((l) => l.id === action.layerId);\n if (index < 0) return state;\n const target =\n action.move === 'front'\n ? layers.length - 1\n : action.move === 'back'\n ? 0\n : action.move === 'forward'\n ? Math.min(layers.length - 1, index + 1)\n : Math.max(0, index - 1);\n if (target === index) return state;\n const reordered = [...layers];\n const [moved] = reordered.splice(index, 1);\n reordered.splice(target, 0, moved);\n return commit(\n state,\n mapLayers(doc, action.pageId, () => reordered),\n );\n }\n case 'setBackground':\n return commit(\n state,\n mapPage(doc, action.pageId, (p) => ({ ...p, background: action.background })),\n {},\n action.coalesce,\n action.at,\n );\n case 'addPage': {\n const page: DesignPage = {\n id: newPageId(),\n name: '',\n prompt: '',\n src: null,\n status: 'ready',\n role: 'content',\n // A blank white sheet, like web's Add page.\n background: { kind: 'color', color: '#ffffff' },\n layers: [],\n };\n return insertPagesInto(state, [page], action.afterId);\n }\n case 'insertPages':\n return action.pages.length ? insertPagesInto(state, action.pages, action.afterId) : state;\n case 'duplicatePage': {\n const index = doc.pages.findIndex((p) => p.id === action.pageId);\n if (index < 0) return state;\n const source = doc.pages[index];\n const page: DesignPage = { ...source, id: newPageId(), layers: source.layers?.map(cloneLayer) };\n const pages = [...doc.pages];\n pages.splice(index + 1, 0, page);\n return commit(state, { ...doc, pages }, { pageId: page.id, layerId: null });\n }\n case 'deletePage': {\n if (doc.pages.length <= 1) return state;\n const index = doc.pages.findIndex((p) => p.id === action.pageId);\n if (index < 0) return state;\n const pages = doc.pages.filter((p) => p.id !== action.pageId);\n const pageId = state.pageId === action.pageId ? pages[Math.min(index, pages.length - 1)].id : state.pageId;\n return commit(state, { ...doc, pages }, { pageId, layerId: null });\n }\n case 'movePage': {\n const index = doc.pages.findIndex((p) => p.id === action.pageId);\n const target = index + action.dir;\n if (index < 0 || target < 0 || target >= doc.pages.length) return state;\n const pages = [...doc.pages];\n [pages[index], pages[target]] = [pages[target], pages[index]];\n return commit(state, { ...doc, pages });\n }\n case 'movePageTo': {\n const from = doc.pages.findIndex((p) => p.id === action.pageId);\n const to = Math.max(0, Math.min(doc.pages.length - 1, Math.round(action.index)));\n if (from < 0 || from === to) return state;\n const pages = [...doc.pages];\n const [moved] = pages.splice(from, 1);\n pages.splice(to, 0, moved);\n return commit(state, { ...doc, pages });\n }\n case 'replacePage': {\n if (!doc.pages.some((p) => p.id === action.page.id)) return state;\n const next = mapPage(doc, action.page.id, () => action.page);\n if (action.silent) return { ...state, doc: next };\n return commit(state, next, { layerId: null });\n }\n case 'patchDoc':\n return commit(state, { ...doc, ...action.patch }, {}, action.coalesce, action.at);\n case 'replaceDoc':\n return commit(state, action.doc, { pageId: action.doc.pages[0]?.id ?? '', layerId: null });\n case 'undo': {\n const prev = state.past[state.past.length - 1];\n if (!prev) return state;\n return {\n ...state,\n doc: prev,\n past: state.past.slice(0, -1),\n future: [state.doc, ...state.future],\n pageId: prev.pages.some((p) => p.id === state.pageId) ? state.pageId : (prev.pages[0]?.id ?? ''),\n layerId: null,\n lastEdit: null,\n };\n }\n case 'redo': {\n const next = state.future[0];\n if (!next) return state;\n return {\n ...state,\n doc: next,\n past: [...state.past, state.doc],\n future: state.future.slice(1),\n pageId: next.pages.some((p) => p.id === state.pageId) ? state.pageId : (next.pages[0]?.id ?? ''),\n layerId: null,\n lastEdit: null,\n };\n }\n default:\n return state;\n }\n}\n\nfunction insertPagesInto(state: EditorState, pages: DesignPage[], afterId?: string): EditorState {\n const { doc } = state;\n const index = afterId ? doc.pages.findIndex((p) => p.id === afterId) : -1;\n const at = index >= 0 ? index + 1 : doc.pages.length;\n const next = [...doc.pages];\n next.splice(at, 0, ...pages);\n return commit(state, { ...doc, pages: next }, { pageId: pages[0].id, layerId: null });\n}\n\n// ── Layer factories (web state.tsx defaults) ─────────────────────────────\n\nexport type TextPreset = 'heading' | 'subheading' | 'body';\n\n/** Preset text layers offered in the Text tool (Canva-style heading/subheading/body). */\nexport const TEXT_PRESETS: Record<\n TextPreset,\n { content: string; fontSizeFrac: number; fontWeight: number; fontToken: 'display' | 'body' }\n> = {\n heading: { content: 'Add a heading', fontSizeFrac: 0.09, fontWeight: 700, fontToken: 'display' },\n subheading: { content: 'Add a subheading', fontSizeFrac: 0.055, fontWeight: 600, fontToken: 'display' },\n body: { content: 'Add a little bit of body text', fontSizeFrac: 0.03, fontWeight: 400, fontToken: 'body' },\n};\n\n/** Web \"Add a text box\": a plain body-size box ready to type into. */\nexport function makeTextBox(): TextLayer {\n return { ...makeTextLayer('body'), content: 'Your text here', fontSizeFrac: 0.04 };\n}\n\n/** An emoji sticker (web Graphics): a big centred glyph, as text so it draws everywhere without a hosted picture. */\nexport function makeStickerLayer(emoji: string, pageW: number, pageH: number): TextLayer {\n const w = 0.28;\n const h = (w * pageW) / pageH;\n return {\n ...makeTextLayer('body'),\n content: emoji,\n x: (1 - w) / 2,\n y: (1 - h) / 2,\n w,\n h,\n fontSizeFrac: w * 0.8,\n align: 'center',\n lineHeight: 1.1,\n };\n}\n\nexport function makeTextLayer(preset: TextPreset): TextLayer {\n const p = TEXT_PRESETS[preset];\n return {\n id: newLayerId(),\n kind: 'text',\n content: p.content,\n x: 0.1,\n y: 0.4,\n w: 0.8,\n h: 0.12,\n fontToken: p.fontToken,\n fontWeight: p.fontWeight,\n fontSizeFrac: p.fontSizeFrac,\n color: DEFAULT_TEXT_COLOR,\n align: 'left',\n lineHeight: 1.2,\n };\n}\n\nexport function makeShapeLayer(shape: ShapeKind, palette?: DesignDoc['palette']): ShapeLayer {\n const isLine = isStrokeShape(shape);\n return {\n id: newLayerId(),\n kind: 'shape',\n shape,\n x: 0.2,\n y: 0.4,\n w: isLine ? 0.5 : 0.3,\n h: isLine ? 0.05 : 0.3,\n fill: palette?.primary ?? '#38bdf8',\n radiusFrac: shape === 'rect' ? 0.08 : 0,\n opacity: 1,\n ...(isLine ? { strokeWidthFrac: 0.008 } : {}),\n };\n}\n\n/** Two series out of the box, so the legend is self-explanatory on first open (web CHART_SAMPLE). */\nconst CHART_SAMPLE = {\n categories: ['Jan', 'Feb', 'Mar'],\n series: [\n { name: 'Desktop', values: [4000, 3200, 2200] },\n { name: 'Mobile', values: [2500, 1700, 1200] },\n ],\n};\n\nexport function makeChartLayer(chart: ChartKind, palette?: DesignDoc['palette']): ChartLayer {\n return {\n id: newLayerId(),\n kind: 'chart',\n chart,\n x: 0.15,\n y: 0.3,\n w: 0.7,\n h: 0.45,\n categories: [...CHART_SAMPLE.categories],\n series: CHART_SAMPLE.series.map((s) => ({ name: s.name, values: [...s.values] })),\n // The legacy single-series mirror a connector without `series` still reads.\n data: CHART_SAMPLE.categories.map((label, i) => ({ label, value: CHART_SAMPLE.series[0].values[i] })),\n colors: [palette?.primary ?? '#38bdf8', palette?.muted ?? '#818cf8', '#f472b6', '#fbbf24'],\n opacity: 1,\n };\n}\n\n/**\n * A placed picture: its own aspect kept, fitting within half the page each way\n * (web `fitImageBox`), centred. Without a measured size it takes a square.\n */\nexport function makeImageLayer(\n src: string,\n pageW: number,\n pageH: number,\n size?: { width: number; height: number } | null,\n): ImageLayer {\n const imgW = size && size.width > 0 ? size.width : 1;\n const imgH = size && size.height > 0 ? size.height : 1;\n const scale = 0.5 * Math.min(pageW / imgW, pageH / imgH);\n const w = (imgW * scale) / pageW;\n const h = (imgH * scale) / pageH;\n return {\n id: newLayerId(),\n kind: 'image',\n prompt: '',\n src,\n imageStatus: 'ready',\n uploaded: true,\n x: (1 - w) / 2,\n y: (1 - h) / 2,\n w,\n h,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
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
+ function isWordChar(ch) {
21
+ if (!ch) return false;
22
+ if (/[0-9_]/.test(ch)) return true;
23
+ if (ch.toLowerCase() !== ch.toUpperCase()) return true;
24
+ return !/[\s!-/:-@[-`{-~ -¿ - -〿]/.test(ch);
25
+ }
26
+ function findInText(text, query, opts) {
27
+ if (!query) return [];
28
+ const hay = opts.matchCase ? text : text.toLowerCase();
29
+ const needle = opts.matchCase ? query : query.toLowerCase();
30
+ const out = [];
31
+ let at = 0;
32
+ while (at <= hay.length - needle.length) {
33
+ const i = hay.indexOf(needle, at);
34
+ if (i < 0) break;
35
+ const end = i + needle.length;
36
+ if (!opts.wholeWord || !isWordChar(text[i - 1]) && !isWordChar(text[end])) {
37
+ out.push({
38
+ start: i,
39
+ end
40
+ });
41
+ at = end;
42
+ } else {
43
+ at = i + 1;
44
+ }
45
+ }
46
+ return out;
47
+ }
48
+ function findMatches(doc, query, opts) {
49
+ var _a, _b;
50
+ const out = [];
51
+ if (!query) return out;
52
+ for (const page of doc.pages) {
53
+ for (const layer of (_a = page.layers) != null ? _a : []) {
54
+ if (layer.kind !== "text") continue;
55
+ for (const m of findInText((_b = layer.content) != null ? _b : "", query, opts)) {
56
+ out.push({
57
+ pageId: page.id,
58
+ layerId: layer.id,
59
+ start: m.start,
60
+ end: m.end
61
+ });
62
+ }
63
+ }
64
+ }
65
+ return out;
66
+ }
67
+ function replaceMatches(content, matches, replacement) {
68
+ let out = content;
69
+ for (const m of [...matches].sort((a, b) => b.start - a.start)) {
70
+ out = out.slice(0, m.start) + replacement + out.slice(m.end);
71
+ }
72
+ return out;
73
+ }
74
+ function replacementEdits(doc, matches, replacement) {
75
+ var _a, _b, _c;
76
+ const byLayer = /* @__PURE__ */ new Map();
77
+ for (const m of matches) {
78
+ const key = `${m.pageId}\0${m.layerId}`;
79
+ byLayer.set(key, [...(_a = byLayer.get(key)) != null ? _a : [], m]);
80
+ }
81
+ const edits = [];
82
+ for (const [key, ms] of byLayer) {
83
+ const [pageId, layerId] = key.split("\0");
84
+ const layer = (_c = (_b = doc.pages.find((p) => p.id === pageId)) == null ? void 0 : _b.layers) == null ? void 0 : _c.find((l) => l.id === layerId);
85
+ if ((layer == null ? void 0 : layer.kind) !== "text" || layer.locked) continue;
86
+ edits.push({
87
+ pageId,
88
+ layerId,
89
+ content: replaceMatches(layer.content, ms, replacement)
90
+ });
91
+ }
92
+ return edits;
93
+ }
94
+ function applyReplacements(doc, edits) {
95
+ if (!edits.length) return doc;
96
+ return __spreadProps(__spreadValues({}, doc), {
97
+ pages: doc.pages.map((page) => {
98
+ var _a;
99
+ const mine = edits.filter((e) => e.pageId === page.id);
100
+ if (!mine.length) return page;
101
+ return __spreadProps(__spreadValues({}, page), {
102
+ layers: (_a = page.layers) == null ? void 0 : _a.map((l) => {
103
+ const edit = mine.find((e) => e.layerId === l.id);
104
+ return edit && l.kind === "text" ? __spreadProps(__spreadValues({}, l), {
105
+ content: edit.content,
106
+ runs: void 0
107
+ }) : l;
108
+ })
109
+ });
110
+ })
111
+ });
112
+ }export{applyReplacements,findInText,findMatches,replaceMatches,replacementEdits};//# sourceMappingURL=findReplace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findReplace.js","sources":["../../../../src/features/design/doc/findReplace.ts"],"sourcesContent":["/**\n * Find and replace text over every text layer of the design - native twin of\n * canvas-surface `carousel-editor/utils/findReplace.ts`. Matching reads what\n * is stored, not what is drawn, so Uppercase never hides a match.\n *\n * Whole words are checked by hand rather than with a Unicode lookbehind, which\n * not every Hermes build compiles.\n *\n * Pure: runs under jest as-is.\n */\nimport type { DesignDoc, TextLayer } from './types';\n\nexport interface FindOptions {\n matchCase: boolean;\n wholeWord: boolean;\n}\n\nexport interface TextMatch {\n pageId: string;\n layerId: string;\n /** Character offsets into the layer's content. */\n start: number;\n end: number;\n}\n\n/** A letter, digit or underscore in any script: what a word is made of. */\nfunction isWordChar(ch: string | undefined): boolean {\n if (!ch) return false;\n if (/[0-9_]/.test(ch)) return true;\n // A character with case is a letter; scripts without case fall back to \"not punctuation or space\".\n if (ch.toLowerCase() !== ch.toUpperCase()) return true;\n return !/[\\s!-/:-@[-`{-~ -¿ - -〿]/.test(ch);\n}\n\n/** Every occurrence of `query` in `text`, left to right, never overlapping. */\nexport function findInText(text: string, query: string, opts: FindOptions): Array<{ start: number; end: number }> {\n if (!query) return [];\n const hay = opts.matchCase ? text : text.toLowerCase();\n const needle = opts.matchCase ? query : query.toLowerCase();\n const out: Array<{ start: number; end: number }> = [];\n let at = 0;\n while (at <= hay.length - needle.length) {\n const i = hay.indexOf(needle, at);\n if (i < 0) break;\n const end = i + needle.length;\n if (!opts.wholeWord || (!isWordChar(text[i - 1]) && !isWordChar(text[end]))) {\n out.push({ start: i, end });\n at = end;\n } else {\n at = i + 1;\n }\n }\n return out;\n}\n\n/** Every occurrence, in design order: page by page, layer by layer, left to right. */\nexport function findMatches(doc: DesignDoc, query: string, opts: FindOptions): TextMatch[] {\n const out: TextMatch[] = [];\n if (!query) return out;\n for (const page of doc.pages) {\n for (const layer of page.layers ?? []) {\n if (layer.kind !== 'text') continue;\n for (const m of findInText(layer.content ?? '', query, opts)) {\n out.push({ pageId: page.id, layerId: layer.id, start: m.start, end: m.end });\n }\n }\n }\n return out;\n}\n\n/** One layer's content with some of its matches replaced (back to front, so offsets hold). */\nexport function replaceMatches(\n content: string,\n matches: Array<Pick<TextMatch, 'start' | 'end'>>,\n replacement: string,\n): string {\n let out = content;\n for (const m of [...matches].sort((a, b) => b.start - a.start)) {\n out = out.slice(0, m.start) + replacement + out.slice(m.end);\n }\n return out;\n}\n\n/** The new contents for every unlocked layer the matches touch. */\nexport function replacementEdits(\n doc: DesignDoc,\n matches: TextMatch[],\n replacement: string,\n): Array<{ pageId: string; layerId: string; content: string }> {\n const byLayer = new Map<string, TextMatch[]>();\n for (const m of matches) {\n const key = `${m.pageId}\\u0000${m.layerId}`;\n byLayer.set(key, [...(byLayer.get(key) ?? []), m]);\n }\n const edits: Array<{ pageId: string; layerId: string; content: string }> = [];\n for (const [key, ms] of byLayer) {\n const [pageId, layerId] = key.split('\\u0000');\n const layer = doc.pages.find((p) => p.id === pageId)?.layers?.find((l) => l.id === layerId) as\n | TextLayer\n | undefined;\n if (layer?.kind !== 'text' || layer.locked) continue;\n edits.push({ pageId, layerId, content: replaceMatches(layer.content, ms, replacement) });\n }\n return edits;\n}\n\n/** The document with every edit applied (runs are dropped from a layer whose words were replaced). */\nexport function applyReplacements(\n doc: DesignDoc,\n edits: Array<{ pageId: string; layerId: string; content: string }>,\n): DesignDoc {\n if (!edits.length) return doc;\n return {\n ...doc,\n pages: doc.pages.map((page) => {\n const mine = edits.filter((e) => e.pageId === page.id);\n if (!mine.length) return page;\n return {\n ...page,\n layers: page.layers?.map((l) => {\n const edit = mine.find((e) => e.layerId === l.id);\n return edit && l.kind === 'text' ? { ...l, content: edit.content, runs: undefined } : l;\n }),\n };\n }),\n };\n}\n"],"names":[],"mappings":"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"}